check-publish-flow.mjs 1.6 KB

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