check-publish-flow.mjs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import fs from 'node:fs';
  2. const platformFiles = [
  3. 'server/src/automation/platforms/xiaohongshu.ts',
  4. 'server/src/automation/platforms/weixin.ts',
  5. 'server/src/automation/platforms/baijiahao.ts',
  6. 'server/src/automation/platforms/douyin.ts',
  7. ];
  8. const lifecycleOffenders = [];
  9. for (const file of platformFiles) {
  10. const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/);
  11. for (let index = 0; index < lines.length; index += 1) {
  12. if (!lines[index].includes('await this.closeBrowser()')) continue;
  13. const followingLines = lines.slice(index + 1, index + 5).join('\n');
  14. if (followingLines.includes('this.page.url()')) {
  15. lifecycleOffenders.push(`${file}:${index + 1}`);
  16. }
  17. }
  18. }
  19. if (lifecycleOffenders.length > 0) {
  20. throw new Error(
  21. `publish success reads this.page.url() after closeBrowser():\n${lifecycleOffenders.join('\n')}`,
  22. );
  23. }
  24. const publishService = fs.readFileSync('server/src/services/PublishService.ts', 'utf8');
  25. if (publishService.includes('private adapters: Map<PlatformType, BasePlatformAdapter> = new Map();')) {
  26. throw new Error('PublishService stores shared adapter instances; publish adapters must be created per run.');
  27. }
  28. const baijiahaoAdapter = fs.readFileSync('server/src/automation/platforms/baijiahao.ts', 'utf8');
  29. if (/const publishBtn = this\.page\.locator[\s\S]{0,300}await publishBtn\.click\(\);/.test(baijiahaoAdapter)) {
  30. throw new Error('Baijiahao publish button uses a plain click without overlay fallback.');
  31. }
  32. console.log('publish flow checks passed');