verify-wrapper-demo-output.mjs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { existsSync, readFileSync, statSync } from 'node:fs'
  2. import { join, resolve } from 'node:path'
  3. const outputDir = resolve(process.env.WRAPPER_DEMO_OUTPUT_DIR || 'apps/component-demo/dist')
  4. const requiredFiles = [
  5. 'index.html',
  6. 'custom-element.html',
  7. 'jquery.html',
  8. 'manual-js.html',
  9. 'manual-iife.html',
  10. 'svelte-action.html',
  11. 'vue3.html',
  12. 'example/preview.md',
  13. 'example/word.docx',
  14. 'file-viewer/flyfish-viewer-assets.json',
  15. 'vendor/docx/docx.worker.js',
  16. 'vendor/xlsx/sheet.worker.js',
  17. 'vendor/file-viewer/flyfish-viewer-assets.json',
  18. 'vendor/file-viewer-web/flyfish-file-viewer-web.iife.js',
  19. 'wasm/cad/dwg-worker.js'
  20. ]
  21. const fail = message => {
  22. console.error(`[component-demo-output] ${message}`)
  23. process.exit(1)
  24. }
  25. const assertFile = relativePath => {
  26. const filePath = join(outputDir, relativePath)
  27. if (!existsSync(filePath) || !statSync(filePath).isFile()) {
  28. fail(`Missing required file: ${filePath}`)
  29. }
  30. return filePath
  31. }
  32. const assertNotHtmlFallback = relativePath => {
  33. const filePath = assertFile(relativePath)
  34. const head = readFileSync(filePath, 'utf8').slice(0, 120).trimStart().toLowerCase()
  35. if (head.startsWith('<!doctype html') || head.startsWith('<html')) {
  36. fail(`${relativePath} resolved to HTML; static asset serving would fail in browsers.`)
  37. }
  38. }
  39. for (const requiredFile of requiredFiles) {
  40. assertFile(requiredFile)
  41. }
  42. const manualIifeHtml = readFileSync(join(outputDir, 'manual-iife.html'), 'utf8')
  43. if (!manualIifeHtml.includes('/vendor/file-viewer-web/flyfish-file-viewer-web.iife.js')) {
  44. fail('manual-iife.html does not reference the browser global helper bundle.')
  45. }
  46. if (!manualIifeHtml.includes('window.FlyfishFileViewerWeb')) {
  47. fail('manual-iife.html does not use the browser global API.')
  48. }
  49. if (!manualIifeHtml.includes('<flyfish-file-viewer')) {
  50. fail('manual-iife.html does not exercise the script-tag custom element.')
  51. }
  52. if (!manualIifeHtml.includes('/example/preview.md')) {
  53. fail('manual-iife.html does not use the lightweight markdown smoke sample.')
  54. }
  55. const iifeBundle = readFileSync(join(outputDir, 'vendor/file-viewer-web/flyfish-file-viewer-web.iife.js'), 'utf8')
  56. for (const requiredExport of [
  57. 'FlyfishFileViewerWeb',
  58. 'mountViewer',
  59. 'createViewerControllerHandle',
  60. 'defineFileViewerElement',
  61. 'FileViewerElement',
  62. 'FILE_VIEWER_ELEMENT_TAG'
  63. ]) {
  64. if (!iifeBundle.includes(requiredExport)) {
  65. fail(`IIFE helper bundle is missing ${requiredExport}.`)
  66. }
  67. }
  68. for (const legacyExport of ['mountViewerFrame', 'postFileToViewer', 'viewerUrl', 'targetOrigin']) {
  69. if (iifeBundle.includes(legacyExport)) {
  70. fail(`IIFE helper bundle must not expose legacy standalone-page API ${legacyExport}.`)
  71. }
  72. }
  73. assertNotHtmlFallback('vendor/file-viewer-web/flyfish-file-viewer-web.iife.js')
  74. assertNotHtmlFallback('vendor/docx/docx.worker.js')
  75. assertNotHtmlFallback('vendor/xlsx/sheet.worker.js')
  76. assertNotHtmlFallback('wasm/cad/dwg-worker.js')
  77. console.log(`[component-demo-output] Verified wrapper demo output in ${outputDir}`)