@file-viewer/vite-plugin 3.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +195 -19
  2. package/package.json +5 -4
package/dist/index.js CHANGED
@@ -203,6 +203,14 @@ const rendererModules = [
203
203
  rendererIds: ['archive'],
204
204
  chunkName: 'file-viewer-archive'
205
205
  },
206
+ {
207
+ id: 'chm',
208
+ packageName: '@file-viewer/renderer-chm',
209
+ exportName: 'chmRenderer',
210
+ formats: ['chm'],
211
+ rendererIds: ['chm'],
212
+ chunkName: 'file-viewer-chm'
213
+ },
206
214
  {
207
215
  id: 'email',
208
216
  packageName: '@file-viewer/renderer-email',
@@ -390,6 +398,51 @@ const rendererModules = [
390
398
  rendererIds: ['geo'],
391
399
  chunkName: 'file-viewer-geo'
392
400
  },
401
+ {
402
+ id: 'design',
403
+ packageName: '@file-viewer/renderer-design',
404
+ exportName: 'designRenderer',
405
+ includeInPresetAll: false,
406
+ formats: [
407
+ 'design',
408
+ 'photoshop-design',
409
+ 'illustrator-pdf-design',
410
+ 'postscript-design',
411
+ 'adobe-palette-design',
412
+ 'photoshop-resource-design',
413
+ 'indesign-idml-design',
414
+ 'indesign-exchange-design',
415
+ 'adobe-animate-xfl-design',
416
+ 'adobe-xd-design',
417
+ 'indesign-native-design',
418
+ 'psd',
419
+ 'psb',
420
+ 'pdd',
421
+ 'psdt',
422
+ 'ai',
423
+ 'ait',
424
+ 'eps',
425
+ 'ps',
426
+ 'ase',
427
+ 'aco',
428
+ 'abr',
429
+ 'csh',
430
+ 'pat',
431
+ 'grd',
432
+ 'asl',
433
+ 'idml',
434
+ 'icml',
435
+ 'idms',
436
+ 'inx',
437
+ 'fla',
438
+ 'xfl',
439
+ 'xd',
440
+ 'indd',
441
+ 'indt'
442
+ ],
443
+ rendererIds: ['photoshop-design', 'illustrator-pdf-design', 'postscript-design', 'adobe-palette-design', 'photoshop-resource-design', 'indesign-idml-design', 'indesign-exchange-design', 'adobe-animate-xfl-design', 'adobe-xd-design', 'indesign-native-design'],
444
+ chunkName: 'file-viewer-design'
445
+ },
393
446
  {
394
447
  id: 'data',
395
448
  packageName: '@file-viewer/renderer-data',
@@ -402,9 +455,6 @@ const rendererModules = [
402
455
  'sqlite3',
403
456
  'parquet',
404
457
  'avro',
405
- 'psd',
406
- 'ai',
407
- 'eps',
408
458
  'webarchive',
409
459
  'wasm',
410
460
  'ttf',
@@ -523,6 +573,7 @@ const fileViewerOptimizationExcludedPackages = [
523
573
  const cjsInteropPackages = [
524
574
  '@file-viewer/docx',
525
575
  '@xmldom/xmldom',
576
+ 'diff2html',
526
577
  'keynote-archives',
527
578
  'occt-import-js',
528
579
  'jszip',
@@ -1012,6 +1063,9 @@ function createManualChunks(selection, autoPresetIds = []) {
1012
1063
  });
1013
1064
  return (id) => {
1014
1065
  const normalized = id.replace(/\\/g, '/');
1066
+ if (normalized.endsWith('/dist/vendor/pdfjs/legacy/build/pdf.worker.mjs')) {
1067
+ return undefined;
1068
+ }
1015
1069
  for (const [packageName, chunkName] of packageToChunk) {
1016
1070
  if (normalized.includes(`/node_modules/${packageName}/`) ||
1017
1071
  normalized.includes(`/node_modules/.pnpm/${packageName.replace('/', '+')}@`)) {
@@ -1432,7 +1486,7 @@ async function copyPdfCjkFontAssets(from, to) {
1432
1486
  async function copyKnownRendererAssets(targetRoot, rendererIds) {
1433
1487
  const selected = new Set(rendererIds);
1434
1488
  const results = [];
1435
- const push = async (rendererId, id, to, copyAction, reason, source) => {
1489
+ const push = async (rendererId, id, to, copyAction, reason, source, required) => {
1436
1490
  if (!selected.has(rendererId)) {
1437
1491
  return;
1438
1492
  }
@@ -1443,11 +1497,42 @@ async function copyKnownRendererAssets(targetRoot, rendererIds) {
1443
1497
  to,
1444
1498
  copied,
1445
1499
  reason: copied ? undefined : reason || 'source asset not found',
1500
+ required,
1446
1501
  ...source,
1447
1502
  });
1448
1503
  };
1449
- const pdfRoot = resolvePackageRoot('pdfjs-dist', ['@file-viewer/renderer-pdf']);
1450
- const pdfVersion = assertOwnedPackageVersion('pdfjs-dist', pdfRoot, '@file-viewer/renderer-pdf');
1504
+ const rendererPdfRoot = resolvePackageRoot('@file-viewer/renderer-pdf');
1505
+ const stagedPdfRoot = rendererPdfRoot
1506
+ ? join(rendererPdfRoot, 'dist/vendor/pdfjs')
1507
+ : null;
1508
+ const stagedPdfProvenancePath = stagedPdfRoot
1509
+ ? join(stagedPdfRoot, 'provenance.json')
1510
+ : null;
1511
+ let stagedPdfVersion = null;
1512
+ if (stagedPdfProvenancePath && existsSync(stagedPdfProvenancePath)) {
1513
+ try {
1514
+ const provenance = JSON.parse(readFileSync(stagedPdfProvenancePath, 'utf8'));
1515
+ if (provenance.packageName === 'pdfjs-dist' && provenance.version) {
1516
+ stagedPdfVersion = provenance.version;
1517
+ }
1518
+ }
1519
+ catch {
1520
+ stagedPdfVersion = null;
1521
+ }
1522
+ }
1523
+ const hasStagedPdfAssets = Boolean(stagedPdfRoot &&
1524
+ stagedPdfVersion &&
1525
+ existsSync(join(stagedPdfRoot, 'legacy/build/pdf.worker.mjs')) &&
1526
+ existsSync(join(stagedPdfRoot, 'cmaps')) &&
1527
+ existsSync(join(stagedPdfRoot, 'wasm')) &&
1528
+ existsSync(join(stagedPdfRoot, 'standard_fonts')));
1529
+ const dependencyPdfRoot = hasStagedPdfAssets
1530
+ ? null
1531
+ : resolvePackageRoot('pdfjs-dist', ['@file-viewer/renderer-pdf']);
1532
+ const pdfRoot = hasStagedPdfAssets ? stagedPdfRoot : dependencyPdfRoot;
1533
+ const pdfVersion = hasStagedPdfAssets
1534
+ ? stagedPdfVersion
1535
+ : assertOwnedPackageVersion('pdfjs-dist', dependencyPdfRoot, '@file-viewer/renderer-pdf');
1451
1536
  const pdfSource = pdfRoot
1452
1537
  ? { sourcePackage: 'pdfjs-dist', sourceVersion: pdfVersion || undefined }
1453
1538
  : undefined;
@@ -1455,10 +1540,36 @@ async function copyKnownRendererAssets(targetRoot, rendererIds) {
1455
1540
  await push('pdf', 'pdf-cmaps', join(targetRoot, 'vendor/pdf/cmaps'), () => copyDirectoryIfPresent(pdfRoot ? join(pdfRoot, 'cmaps') : null, join(targetRoot, 'vendor/pdf/cmaps')), undefined, pdfSource);
1456
1541
  await push('pdf', 'pdf-wasm', join(targetRoot, 'vendor/pdf/wasm'), () => copyDirectoryIfPresent(pdfRoot ? join(pdfRoot, 'wasm') : null, join(targetRoot, 'vendor/pdf/wasm')), undefined, pdfSource);
1457
1542
  await push('pdf', 'pdf-standard-fonts', join(targetRoot, 'vendor/pdf/standard_fonts'), () => copyDirectoryIfPresent(pdfRoot ? join(pdfRoot, 'standard_fonts') : null, join(targetRoot, 'vendor/pdf/standard_fonts')), undefined, pdfSource);
1458
- const pdfCjkFontRoot = resolvePackageRoot('@fontsource-variable/noto-sans-sc', [
1543
+ const stagedPdfCjkFontRoot = rendererPdfRoot
1544
+ ? join(rendererPdfRoot, 'dist/vendor/noto-sans-sc')
1545
+ : null;
1546
+ const standardAssetsRoot = resolvePackageRoot('@file-viewer/assets-standard');
1547
+ const standardPdfCjkFontRoot = standardAssetsRoot
1548
+ ? join(standardAssetsRoot, 'viewer/vendor/pdf/fonts')
1549
+ : null;
1550
+ const dependencyPdfCjkFontRoot = resolvePackageRoot('@fontsource-variable/noto-sans-sc', [
1459
1551
  '@file-viewer/renderer-pdf'
1460
1552
  ]);
1461
- await push('pdf', 'pdf-cjk-font-fallback', join(targetRoot, 'vendor/pdf/fonts'), () => copyPdfCjkFontAssets(pdfCjkFontRoot, join(targetRoot, 'vendor/pdf/fonts')));
1553
+ const pdfCjkFontTarget = join(targetRoot, 'vendor/pdf/fonts');
1554
+ // The standard profile pack owns the CJK fallback font; presets that activate the pdf
1555
+ // renderer without that pack declare the font package directly. renderer-pdf must not
1556
+ // vendor a second copy, so when no source is installed the build warns instead of
1557
+ // failing and PDF rendering keeps using embedded fonts.
1558
+ const pdfCjkFontSourceAvailable = Boolean(standardPdfCjkFontRoot && existsSync(join(standardPdfCjkFontRoot, 'noto-sans-sc.css'))) ||
1559
+ Boolean(stagedPdfCjkFontRoot && existsSync(join(stagedPdfCjkFontRoot, 'wght.css'))) ||
1560
+ Boolean(dependencyPdfCjkFontRoot);
1561
+ await push('pdf', 'pdf-cjk-font-fallback', pdfCjkFontTarget, async () => {
1562
+ if (standardPdfCjkFontRoot &&
1563
+ existsSync(join(standardPdfCjkFontRoot, 'noto-sans-sc.css'))) {
1564
+ return copyDirectoryIfPresent(standardPdfCjkFontRoot, pdfCjkFontTarget);
1565
+ }
1566
+ if (stagedPdfCjkFontRoot && existsSync(join(stagedPdfCjkFontRoot, 'wght.css'))) {
1567
+ return copyPdfCjkFontAssets(stagedPdfCjkFontRoot, pdfCjkFontTarget);
1568
+ }
1569
+ return copyPdfCjkFontAssets(dependencyPdfCjkFontRoot, pdfCjkFontTarget);
1570
+ }, pdfCjkFontSourceAvailable
1571
+ ? undefined
1572
+ : `install ${independentlyOwnedAssetRendererIds.get('pdf')} or @fontsource-variable/noto-sans-sc`, undefined, pdfCjkFontSourceAvailable ? undefined : false);
1462
1573
  const pptxRoot = resolvePackageRoot('@file-viewer/pptx', [
1463
1574
  '@file-viewer/renderer-pptx',
1464
1575
  '@file-viewer/renderer-presentation'
@@ -1548,7 +1659,59 @@ async function copyKnownRendererAssets(targetRoot, rendererIds) {
1548
1659
  const archiveRoot = resolvePackageRoot('libarchive.js', ['@file-viewer/renderer-archive']);
1549
1660
  await push('archive', 'libarchive-worker', join(targetRoot, 'vendor/libarchive/worker-bundle.js'), () => copyFileIfPresent(archiveRoot ? join(archiveRoot, 'dist/worker-bundle.js') : null, join(targetRoot, 'vendor/libarchive/worker-bundle.js')));
1550
1661
  await push('archive', 'libarchive-wasm', join(targetRoot, 'vendor/libarchive/libarchive.wasm'), () => copyFileIfPresent(archiveRoot ? join(archiveRoot, 'dist/libarchive.wasm') : null, join(targetRoot, 'vendor/libarchive/libarchive.wasm')));
1662
+ const chmRoot = resolvePackageRoot('@file-viewer/renderer-chm', ['@file-viewer/renderer-chm']);
1663
+ const chmSource = chmRoot
1664
+ ? { sourcePackage: '@file-viewer/renderer-chm', sourceVersion: readPackageVersion(chmRoot) || undefined }
1665
+ : undefined;
1666
+ for (const [id, sourceName, targetName] of [
1667
+ ['chm-worker', 'dist/chm.worker.js', 'chm.worker.js'],
1668
+ ['chm-wasm-module', 'dist/chm_wasm.js', 'chm_wasm.js'],
1669
+ ['chm-wasm', 'dist/chm_wasm_bg.wasm', 'chm_wasm_bg.wasm'],
1670
+ ['chm-license', 'LICENSE', 'LICENSE'],
1671
+ ['chm-third-party-notices', 'THIRD_PARTY_NOTICES.md', 'THIRD_PARTY_NOTICES.md'],
1672
+ ['chm-rust-notice', 'rust/NOTICE.md', 'RUST_NOTICE.md'],
1673
+ ['chm-rust-third-party-licenses', 'rust/THIRD_PARTY_LICENSES.md', 'RUST_THIRD_PARTY_LICENSES.md']
1674
+ ]) {
1675
+ await push('chm', id, join(targetRoot, `vendor/chm/${targetName}`), () => copyFileIfPresent(chmRoot ? join(chmRoot, sourceName) : null, join(targetRoot, `vendor/chm/${targetName}`)), undefined, chmSource);
1676
+ }
1551
1677
  const sqlJsRoot = resolvePackageRoot('sql.js', ['@file-viewer/renderer-data']);
1678
+ const designRendererRoot = resolvePackageRoot('@file-viewer/renderer-design');
1679
+ const introspectWasmRoot = resolvePackageRoot('@paged-media/introspect-wasm', [
1680
+ '@file-viewer/renderer-design'
1681
+ ]);
1682
+ const introspectWasmVersion = assertOwnedPackageVersion('@paged-media/introspect-wasm', introspectWasmRoot, '@file-viewer/renderer-design');
1683
+ const introspectWasmSource = introspectWasmRoot
1684
+ ? {
1685
+ sourcePackage: '@paged-media/introspect-wasm',
1686
+ sourceVersion: introspectWasmVersion || undefined
1687
+ }
1688
+ : undefined;
1689
+ await push('illustrator-pdf-design', 'illustrator-pgf-worker', join(targetRoot, 'vendor/design/illustrator-pgf.worker.js'), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'dist/illustrator-pgf.worker.js') : null, join(targetRoot, 'vendor/design/illustrator-pgf.worker.js')));
1690
+ await push('photoshop-design', 'photoshop-design-worker', join(targetRoot, 'vendor/design/photoshop.worker.js'), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'dist/photoshop.worker.js') : null, join(targetRoot, 'vendor/design/photoshop.worker.js')));
1691
+ await push('photoshop-resource-design', 'photoshop-resource-worker', join(targetRoot, 'vendor/design/adobe-resource.worker.js'), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'dist/adobe-resource.worker.js') : null, join(targetRoot, 'vendor/design/adobe-resource.worker.js')));
1692
+ await push('adobe-palette-design', 'adobe-palette-container-worker', join(targetRoot, 'vendor/design/adobe-container.worker.js'), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'dist/adobe-container.worker.js') : null, join(targetRoot, 'vendor/design/adobe-container.worker.js')));
1693
+ await push('indesign-exchange-design', 'indesign-exchange-container-worker', join(targetRoot, 'vendor/design/adobe-container.worker.js'), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'dist/adobe-container.worker.js') : null, join(targetRoot, 'vendor/design/adobe-container.worker.js')));
1694
+ await push('adobe-animate-xfl-design', 'adobe-animate-xfl-container-worker', join(targetRoot, 'vendor/design/adobe-container.worker.js'), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'dist/adobe-container.worker.js') : null, join(targetRoot, 'vendor/design/adobe-container.worker.js')));
1695
+ await push('adobe-xd-design', 'adobe-xd-container-worker', join(targetRoot, 'vendor/design/adobe-container.worker.js'), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'dist/adobe-container.worker.js') : null, join(targetRoot, 'vendor/design/adobe-container.worker.js')));
1696
+ await push('indesign-native-design', 'indesign-native-container-worker', join(targetRoot, 'vendor/design/adobe-container.worker.js'), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'dist/adobe-container.worker.js') : null, join(targetRoot, 'vendor/design/adobe-container.worker.js')));
1697
+ await push('postscript-design', 'postscript-design-worker', join(targetRoot, 'vendor/design/postscript.worker.js'), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'dist/postscript.worker.js') : null, join(targetRoot, 'vendor/design/postscript.worker.js')));
1698
+ await push('postscript-design', 'postscript-design-wasm', join(targetRoot, 'vendor/design/stet_wasm_bg.wasm'), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'runtime/postscript/stet_wasm_bg.wasm') : null, join(targetRoot, 'vendor/design/stet_wasm_bg.wasm')));
1699
+ const postscriptLicenses = [
1700
+ ['postscript-design-license-stet-apache', 'Stet-Apache-2.0.txt', 'LICENSE.stet-Apache-2.0.txt'],
1701
+ ['postscript-design-license-stet-mit', 'Stet-MIT.txt', 'LICENSE.stet-MIT.txt'],
1702
+ ['postscript-design-license-carlito-ofl', 'Carlito-OFL-1.1.txt', 'LICENSE.Carlito-OFL-1.1.txt'],
1703
+ ['postscript-design-license-tinos-ofl', 'Tinos-OFL-1.1.txt', 'LICENSE.Tinos-OFL-1.1.txt'],
1704
+ ['postscript-design-license-cousine-ofl', 'Cousine-OFL-1.1.txt', 'LICENSE.Cousine-OFL-1.1.txt'],
1705
+ ['postscript-design-license-noto-symbols-ofl', 'NotoSansSymbols2-OFL-1.1.txt', 'LICENSE.NotoSansSymbols2-OFL-1.1.txt']
1706
+ ];
1707
+ for (const [assetId, sourceName, targetName] of postscriptLicenses) {
1708
+ await push('postscript-design', assetId, join(targetRoot, 'vendor/design', targetName), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'LICENSES', sourceName) : null, join(targetRoot, 'vendor/design', targetName)));
1709
+ }
1710
+ await push('indesign-idml-design', 'indesign-idml-worker', join(targetRoot, 'vendor/design/idml.worker.js'), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'dist/idml.worker.js') : null, join(targetRoot, 'vendor/design/idml.worker.js')));
1711
+ await push('indesign-idml-design', 'indesign-idml-wasm', join(targetRoot, 'vendor/design/paged_introspect_wasm_bg.wasm'), () => copyFileIfPresent(introspectWasmRoot
1712
+ ? join(introspectWasmRoot, 'paged_introspect_wasm_bg.wasm')
1713
+ : null, join(targetRoot, 'vendor/design/paged_introspect_wasm_bg.wasm')), undefined, introspectWasmSource);
1714
+ await push('indesign-idml-design', 'indesign-idml-license', join(targetRoot, 'vendor/design/LICENSE.introspect-wasm-MPL-2.0.txt'), () => copyFileIfPresent(designRendererRoot ? join(designRendererRoot, 'LICENSES/MPL-2.0.txt') : null, join(targetRoot, 'vendor/design/LICENSE.introspect-wasm-MPL-2.0.txt')));
1552
1715
  await push('data-asset', 'data-sql-wasm', join(targetRoot, 'wasm/data/sql-wasm.wasm'), () => copyFileIfPresent(sqlJsRoot ? join(sqlJsRoot, 'dist/sql-wasm.wasm') : null, join(targetRoot, 'wasm/data/sql-wasm.wasm')));
1553
1716
  await mkdir(targetRoot, { recursive: true });
1554
1717
  await writeFile(join(targetRoot, 'flyfish-viewer-assets.json'), `${JSON.stringify({
@@ -1562,6 +1725,7 @@ async function copyKnownRendererAssets(targetRoot, rendererIds) {
1562
1725
  }
1563
1726
  const independentlyOwnedAssetRendererIds = new Map([
1564
1727
  ['archive', '@file-viewer/assets-standard'],
1728
+ ['chm', '@file-viewer/assets-chm'],
1565
1729
  ['pdf', '@file-viewer/assets-standard'],
1566
1730
  ['office-word-openxml', '@file-viewer/assets-standard'],
1567
1731
  ['office-presentation', '@file-viewer/assets-standard'],
@@ -1863,7 +2027,8 @@ async function copyRendererAssets(target, rendererIds) {
1863
2027
  id: 'missing-independent-asset-owner',
1864
2028
  to: target.targetRoot,
1865
2029
  copied: false,
1866
- required: true,
2030
+ // Specialist offline payloads stay opt-in; warn instead of failing the build.
2031
+ required: false,
1867
2032
  reason: `install ${requiredOwner} for this capability`
1868
2033
  });
1869
2034
  }
@@ -2089,22 +2254,33 @@ function collectAssetRendererIds(selection, autoPresetIds = [], includeFullPrese
2089
2254
  ...selection.descriptors.flatMap((descriptor) => descriptor.rendererIds)
2090
2255
  ]);
2091
2256
  }
2257
+ const defaultRequiredAssetRendererIds = [
2258
+ 'pdf',
2259
+ 'office-word-openxml',
2260
+ 'office-presentation-binary',
2261
+ 'office-presentation',
2262
+ 'archive',
2263
+ 'cad',
2264
+ 'typst'
2265
+ ];
2266
+ function isRequiredAssetResult(result) {
2267
+ return result.required ?? defaultRequiredAssetRendererIds.includes(result.rendererId);
2268
+ }
2092
2269
  function reportAssetCopy(results, targetRoot, mode) {
2093
- const failedRequired = results.filter((result) => !result.copied && (result.required ?? [
2094
- 'pdf',
2095
- 'office-word-openxml',
2096
- 'office-presentation-binary',
2097
- 'office-presentation',
2098
- 'archive',
2099
- 'cad',
2100
- 'typst'
2101
- ].includes(result.rendererId)));
2270
+ const failedRequired = results.filter((result) => !result.copied && isRequiredAssetResult(result));
2271
+ const missingOptional = results.filter((result) => !result.copied && !isRequiredAssetResult(result));
2102
2272
  if (!results.length) {
2103
2273
  return;
2104
2274
  }
2105
2275
  const summary = `[file-viewer:vite-plugin] Copied ${results.filter((result) => result.copied).length}/${results.length} renderer assets to ${targetRoot}`;
2276
+ console.log(summary);
2277
+ if (missingOptional.length) {
2278
+ const optionalDetails = missingOptional
2279
+ .map((result) => ` - ${result.rendererId}:${result.id} -> ${result.to} (${result.reason || 'source asset not found'})`)
2280
+ .join('\n');
2281
+ console.warn(`[file-viewer:vite-plugin] Skipped optional offline assets; install the owning package to self-host them:\n${optionalDetails}`);
2282
+ }
2106
2283
  if (!failedRequired.length || mode === 'ignore') {
2107
- console.log(summary);
2108
2284
  return;
2109
2285
  }
2110
2286
  const details = failedRequired
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/vite-plugin",
3
- "version": "3.0.0",
3
+ "version": "3.0.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Vite plugin for File Viewer on-demand renderer assembly, chunk planning, and offline asset deployment.",
@@ -63,13 +63,14 @@
63
63
  }
64
64
  },
65
65
  "devDependencies": {
66
- "@types/node": "^25.9.2",
66
+ "@types/node": "^26.4.0",
67
67
  "typescript": "^6.0.3",
68
- "vite": "^8.0.16"
68
+ "vite": "^8.2.2"
69
69
  },
70
70
  "license": "Apache-2.0",
71
71
  "scripts": {
72
72
  "build": "tsc -b tsconfig.json",
73
- "type-check": "tsc -b tsconfig.json"
73
+ "type-check": "tsc -b tsconfig.json",
74
+ "verify:github-242": "node scripts/verify-github-242.mjs"
74
75
  }
75
76
  }