@file-viewer/vite-plugin 2.1.30 → 2.2.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.
package/README.en.md CHANGED
@@ -98,7 +98,7 @@ const options = {
98
98
 
99
99
  When host apps split `node_modules` by package name, circular dependencies between `@codemirror/*`, `@lezer/*`, and Sandpack can show up in production as `codemirror-view.* Cannot access ... before initialization`. The plugin wraps existing `manualChunks` functions by default, stabilizes only those known interop chunks, and preserves the rest of the app's custom grouping. Set `stabilizeInteropChunks:false` only when the host build needs total control.
100
100
 
101
- `copyAssets.baseDir` overrides automatic placement. It must be relative and cannot contain `..`; an empty string explicitly selects the root. The plugin also updates the full package runtime asset base. A manual `setDefaultFullAssetBaseUrl()` call is only needed when a custom `baseDir` is combined with `inject:false`. With Vite `base:'/app/'`, full-package dev URLs start with `/app/file-viewer/...`, while production files remain under `outDir/file-viewer/`.
101
+ `copyAssets.baseDir` overrides automatic placement. It must be relative and cannot contain `..`; an empty string explicitly selects the root. The plugin now aligns the shared runtime asset base for standard packages, presets, and full packages; full packages also keep `setDefaultFullAssetBaseUrl()` synchronized. Only integrations that set `inject:false` and do not import the virtual module must call `setDefaultFileViewerAssetBaseUrl()` themselves (plus `setDefaultFullAssetBaseUrl()` for a full package). With Vite `base:'/app/'`, full-package dev URLs start with `/app/file-viewer/...`, while production files remain under `outDir/file-viewer/`.
102
102
 
103
103
  For strict registry control, disable injection and pass the virtual module explicitly:
104
104
 
package/README.md CHANGED
@@ -98,7 +98,7 @@ const options = {
98
98
 
99
99
  如果宿主项目按包名拆分 `node_modules`,`@codemirror/*`、`@lezer/*` 和 Sandpack 之间的循环依赖可能在生产构建中表现为 `codemirror-view.* Cannot access ... before initialization`。插件默认会包裹已有的 `manualChunks` 函数,只稳定这些已知互操作 chunk,保留其它自定义分组;确实需要完全接管时可设置 `stabilizeInteropChunks:false`。
100
100
 
101
- `copyAssets.baseDir` 可以覆盖自动目录:必须是相对路径,不能包含 `..`;传空字符串表示显式复制到根目录。插件会同步 full 包的运行时资源根,无需再手动调用 `setDefaultFullAssetBaseUrl()`;同时自定义 `baseDir` 并设置 `inject:false` 时,才需由业务自行设置。Vite 配置了 `base:'/app/'` 时,full 包开发 URL 为 `/app/file-viewer/...`,构建文件仍位于 `outDir/file-viewer/`。
101
+ `copyAssets.baseDir` 可以覆盖自动目录:必须是相对路径,不能包含 `..`;传空字符串表示显式复制到根目录。插件会为标准包、preset 和 full 包同步统一运行时资源根;full 包仍同时同步 `setDefaultFullAssetBaseUrl()`。只有设置 `inject:false` 且不手动导入虚拟模块时,业务才需要调用 `setDefaultFileViewerAssetBaseUrl()`(full 包同时调用 `setDefaultFullAssetBaseUrl()`)。Vite 配置了 `base:'/app/'` 时,full 包开发 URL 为 `/app/file-viewer/...`,构建文件仍位于 `outDir/file-viewer/`。
102
102
 
103
103
  如果你需要严格控制 registry,可以关闭注入并手动传入:
104
104
 
package/dist/index.d.ts CHANGED
@@ -35,8 +35,8 @@ export interface FileViewerCopyAssetsOptions {
35
35
  * Directory below publicDir/outDir where assets are published. When omitted,
36
36
  * projects with an installed @file-viewer/*-full package use `file-viewer`;
37
37
  * other projects keep the existing output-root layout. Use an empty string
38
- * to explicitly publish at the output root. For full packages, the injected
39
- * runtime module keeps the default asset base aligned with this directory.
38
+ * to explicitly publish at the output root. The injected runtime module
39
+ * keeps every renderer's default asset base aligned with this directory.
40
40
  */
41
41
  baseDir?: string;
42
42
  /**
package/dist/index.js CHANGED
@@ -4,6 +4,16 @@ import { createRequire } from 'node:module';
4
4
  import { dirname, extname, isAbsolute, join, relative, resolve, sep } from 'node:path';
5
5
  const virtualModuleId = 'virtual:file-viewer-renderers';
6
6
  const resolvedVirtualModuleId = `\0${virtualModuleId}`;
7
+ const packagedPptFallbackModuleId = 'virtual:file-viewer-packaged-ppt-fallback';
8
+ const resolvedPackagedPptFallbackModuleId = `\0${packagedPptFallbackModuleId}`;
9
+ const isPresentationRendererImporter = (importer) => {
10
+ if (!importer)
11
+ return false;
12
+ const normalized = importer.replace(/\\/g, '/');
13
+ return (normalized.includes('/@file-viewer/renderer-presentation/') ||
14
+ normalized.includes('/@file-viewer+renderer-presentation@') ||
15
+ normalized.includes('/packages/renderers/presentation/'));
16
+ };
7
17
  const pluginRequire = createRequire(import.meta.url);
8
18
  let workspacePackageJsonCache = null;
9
19
  const rendererModules = [
@@ -43,8 +53,17 @@ const rendererModules = [
43
53
  id: 'presentation',
44
54
  packageName: '@file-viewer/renderer-presentation',
45
55
  exportName: 'presentationRenderer',
46
- formats: ['presentation', 'pptx', 'pptm', 'potx', 'potm', 'ppsx', 'ppsm'],
47
- rendererIds: ['office-presentation'],
56
+ formats: [
57
+ 'presentation',
58
+ 'ppt',
59
+ 'pptx',
60
+ 'pptm',
61
+ 'potx',
62
+ 'potm',
63
+ 'ppsx',
64
+ 'ppsm'
65
+ ],
66
+ rendererIds: ['office-presentation-binary', 'office-presentation'],
48
67
  chunkName: 'file-viewer-presentation'
49
68
  },
50
69
  {
@@ -400,6 +419,7 @@ const fileViewerFullPackages = [
400
419
  // CommonJS/UMD helper dependencies below.
401
420
  const fileViewerOptimizationExcludedPackages = [
402
421
  '@file-viewer/core',
422
+ '@file-viewer/ppt',
403
423
  '@file-viewer/pptx',
404
424
  ...rendererModules.map((descriptor) => descriptor.packageName),
405
425
  ...Object.values(presetModules).map((preset) => preset.packageName),
@@ -408,6 +428,7 @@ const fileViewerOptimizationExcludedPackages = [
408
428
  const cjsInteropPackages = [
409
429
  '@file-viewer/docx',
410
430
  '@xmldom/xmldom',
431
+ 'occt-import-js',
411
432
  'jszip'
412
433
  ];
413
434
  const defaultScanRoots = ['src', 'app', 'pages', 'components'];
@@ -456,6 +477,7 @@ const mimeFormatHints = {
456
477
  'application/vnd.rar': ['rar'],
457
478
  'text/markdown': ['md'],
458
479
  'text/csv': ['csv'],
480
+ 'text/tab-separated-values': ['tsv'],
459
481
  'text/html': ['html'],
460
482
  'text/css': ['css'],
461
483
  'text/plain': ['txt'],
@@ -635,7 +657,7 @@ function expandDescriptorRendererIds(ids) {
635
657
  return descriptor ? [...descriptor.rendererIds] : [id];
636
658
  }));
637
659
  }
638
- function renderVirtualModule(selection, formats, autoPresetIds = [], fullAssetBase = null) {
660
+ function renderVirtualModule(selection, formats, autoPresetIds = [], runtimeAssetBase = null, configureFullAssetBase = false) {
639
661
  const presetModule = selection.preset ? presetModules[selection.preset] : null;
640
662
  const autoPresetModules = autoPresetIds
641
663
  .filter((id) => id !== selection.preset)
@@ -675,33 +697,47 @@ function renderVirtualModule(selection, formats, autoPresetIds = [], fullAssetBa
675
697
  : !selection.preset && autoPresetModules.length === 1
676
698
  ? autoPresetModules[0].id
677
699
  : '@file-viewer/vite-plugin:configured';
678
- const fullAssetBaseImport = fullAssetBase
679
- ? fullAssetBase.kind === 'deployment'
680
- ? `import { DEFAULT_FULL_ASSET_BASE_PATH, resolveDefaultFullAssetBaseUrl, setDefaultFullAssetBaseUrl } from '@file-viewer/preset-all';`
681
- : `import { setDefaultFullAssetBaseUrl } from '@file-viewer/preset-all';`
700
+ const runtimeAssetBaseImport = runtimeAssetBase
701
+ ? runtimeAssetBase.kind === 'deployment'
702
+ ? `import { resolveFileViewerRuntimeAssetBaseUrl, setDefaultFileViewerAssetBaseUrl } from '@file-viewer/core/assets';`
703
+ : `import { setDefaultFileViewerAssetBaseUrl } from '@file-viewer/core/assets';`
704
+ : null;
705
+ const fullAssetBaseImport = runtimeAssetBase && configureFullAssetBase
706
+ ? `import { setDefaultFullAssetBaseUrl } from '@file-viewer/preset-all';`
682
707
  : null;
683
708
  const autoRegistrationImport = rendererNames.length
684
709
  ? `import { registerFileViewerAutoRendererPreset } from '@file-viewer/core';`
685
710
  : null;
686
- const fullAssetBaseSetup = !fullAssetBase
711
+ const runtimeAssetBaseSetup = !runtimeAssetBase
687
712
  ? []
688
- : fullAssetBase.kind === 'literal'
689
- ? [`setDefaultFullAssetBaseUrl(${JSON.stringify(fullAssetBase.url)});`, '']
713
+ : runtimeAssetBase.kind === 'literal'
714
+ ? [
715
+ `setDefaultFileViewerAssetBaseUrl(${JSON.stringify(runtimeAssetBase.url)});`,
716
+ ...(configureFullAssetBase
717
+ ? [`setDefaultFullAssetBaseUrl(${JSON.stringify(runtimeAssetBase.url)});`]
718
+ : []),
719
+ ''
720
+ ]
690
721
  : [
691
- 'const fileViewerDefaultFullAssetBaseUrl = resolveDefaultFullAssetBaseUrl();',
692
- 'const fileViewerDeploymentBaseUrl = fileViewerDefaultFullAssetBaseUrl.endsWith(DEFAULT_FULL_ASSET_BASE_PATH)',
693
- ' ? fileViewerDefaultFullAssetBaseUrl.slice(0, -DEFAULT_FULL_ASSET_BASE_PATH.length)',
694
- ' : fileViewerDefaultFullAssetBaseUrl;',
695
- `setDefaultFullAssetBaseUrl(fileViewerDeploymentBaseUrl + ${JSON.stringify(fullAssetBase.encodedBaseDir)});`,
722
+ "const fileViewerDeploymentBaseUrl = typeof document === 'undefined'",
723
+ " ? '/'",
724
+ ' : resolveFileViewerRuntimeAssetBaseUrl(document);',
725
+ "const fileViewerRuntimeAssetBaseUrl = typeof document === 'undefined'",
726
+ ` ? '/' + ${JSON.stringify(runtimeAssetBase.encodedBaseDir)}`,
727
+ ` : new URL(${JSON.stringify(runtimeAssetBase.encodedBaseDir)}, fileViewerDeploymentBaseUrl.endsWith('/') ? fileViewerDeploymentBaseUrl : fileViewerDeploymentBaseUrl + '/').href;`,
728
+ 'setDefaultFileViewerAssetBaseUrl(fileViewerRuntimeAssetBaseUrl);',
729
+ ...(configureFullAssetBase
730
+ ? ['setDefaultFullAssetBaseUrl(fileViewerRuntimeAssetBaseUrl);']
731
+ : []),
696
732
  ''
697
733
  ];
698
734
  return [
699
- ...[autoRegistrationImport, fullAssetBaseImport].filter(Boolean),
735
+ ...[autoRegistrationImport, runtimeAssetBaseImport, fullAssetBaseImport].filter(Boolean),
700
736
  ...[presetImport].filter(Boolean),
701
737
  ...autoPresetImports,
702
738
  ...rendererImports,
703
739
  '',
704
- ...fullAssetBaseSetup,
740
+ ...runtimeAssetBaseSetup,
705
741
  `export const configuredFileViewerRenderers = [${rendererNames.join(', ')}];`,
706
742
  `export const fileViewerRendererPlan = ${JSON.stringify(plan, null, 2)};`,
707
743
  ...(rendererNames.length
@@ -980,11 +1016,11 @@ function readPackageVersion(packageRoot) {
980
1016
  return null;
981
1017
  }
982
1018
  }
983
- function assertOwnedPackageVersion(packageName, packageRoot, ownerPackageName) {
1019
+ function assertOwnedPackageVersion(packageName, packageRoot, ownerPackageName, anchorPackages = []) {
984
1020
  if (!packageRoot) {
985
1021
  return null;
986
1022
  }
987
- const ownerPackageJsonPath = resolvePackageJson(ownerPackageName);
1023
+ const ownerPackageJsonPath = resolvePackageJson(ownerPackageName, anchorPackages);
988
1024
  if (!ownerPackageJsonPath) {
989
1025
  return readPackageVersion(packageRoot);
990
1026
  }
@@ -1196,11 +1232,65 @@ async function copyKnownRendererAssets(targetRoot, rendererIds) {
1196
1232
  await push('pdf', 'pdf-cjk-font-fallback', join(targetRoot, 'vendor/pdf/fonts'), () => copyPdfCjkFontAssets(pdfCjkFontRoot, join(targetRoot, 'vendor/pdf/fonts')));
1197
1233
  const pptxRoot = resolvePackageRoot('@file-viewer/pptx', ['@file-viewer/renderer-presentation']);
1198
1234
  await push('office-presentation', 'pptx-worker', join(targetRoot, 'vendor/pptx/pptx.worker.js'), () => copyFileIfPresent(pptxRoot ? join(pptxRoot, 'dist/worker/pptx.worker.js') : null, join(targetRoot, 'vendor/pptx/pptx.worker.js')));
1235
+ const pptRoot = resolvePackageRoot('@file-viewer/ppt', ['@file-viewer/renderer-presentation']);
1236
+ const pptVersion = readPackageVersion(pptRoot);
1237
+ const pptSource = pptRoot
1238
+ ? { sourcePackage: '@file-viewer/ppt', sourceVersion: pptVersion || undefined }
1239
+ : undefined;
1240
+ for (const [id, filename] of [
1241
+ ['ppt-module', 'index.mjs'],
1242
+ ['ppt-worker', 'worker.mjs'],
1243
+ ['ppt-frame-cache', 'frame-cache.mjs'],
1244
+ ['ppt-wasm', 'ppt-native.wasm'],
1245
+ ['ppt-cjk-font', 'ppt-font-cjk.otf'],
1246
+ ['ppt-manifest', 'manifest.json'],
1247
+ ['ppt-package', 'package.json'],
1248
+ ['ppt-license', 'LICENSE'],
1249
+ ['ppt-notice', 'NOTICE']
1250
+ ]) {
1251
+ await push('office-presentation-binary', id, join(targetRoot, `vendor/ppt/${filename}`), () => copyFileIfPresent(pptRoot ? join(pptRoot, filename) : null, join(targetRoot, `vendor/ppt/${filename}`)), undefined, pptSource);
1252
+ }
1199
1253
  const docxRoot = resolvePackageRoot('@file-viewer/docx', ['@file-viewer/renderer-word']);
1200
1254
  await push('office-word-openxml', 'docx-worker', join(targetRoot, 'vendor/docx/docx.worker.js'), () => copyFileIfPresent(docxRoot ? join(docxRoot, 'dist/docx-preview.worker.js') : null, join(targetRoot, 'vendor/docx/docx.worker.js')));
1201
1255
  await push('office-word-openxml', 'docx-worker-jszip', join(targetRoot, 'vendor/docx/jszip.min.js'), () => copyFileIfPresent(docxRoot ? join(docxRoot, 'dist/jszip.min.js') : null, join(targetRoot, 'vendor/docx/jszip.min.js')));
1256
+ const spreadsheetRoot = resolvePackageRoot('@file-viewer/renderer-spreadsheet', [
1257
+ '@file-viewer/renderer-spreadsheet',
1258
+ '@file-viewer/preset-office',
1259
+ '@file-viewer/preset-all'
1260
+ ]);
1261
+ const spreadsheetVersion = readPackageVersion(spreadsheetRoot);
1262
+ await push('spreadsheet-openxml', 'spreadsheet-worker', join(targetRoot, 'vendor/xlsx/sheet.worker.js'), () => copyFileIfPresent(spreadsheetRoot ? join(spreadsheetRoot, 'dist/worker/sheet.worker.js') : null, join(targetRoot, 'vendor/xlsx/sheet.worker.js')), undefined, spreadsheetRoot
1263
+ ? {
1264
+ sourcePackage: '@file-viewer/renderer-spreadsheet',
1265
+ sourceVersion: spreadsheetVersion || undefined
1266
+ }
1267
+ : undefined);
1202
1268
  const cadRoot = resolvePackageRoot('@flyfish-dev/cad-viewer', ['@file-viewer/renderer-cad']);
1203
1269
  await push('cad', 'cad-wasm-directory', join(targetRoot, 'wasm/cad'), () => copyDirectoryIfPresent(cadRoot ? join(cadRoot, 'dist/wasm') : null, join(targetRoot, 'wasm/cad')));
1270
+ const modelDependencyAnchors = [
1271
+ '@file-viewer/renderer-3d',
1272
+ '@file-viewer/geometry-engine'
1273
+ ];
1274
+ const occtRoot = resolvePackageRoot('occt-import-js', modelDependencyAnchors);
1275
+ const geometryEngineRoot = resolvePackageRoot('@file-viewer/geometry-engine', [
1276
+ '@file-viewer/renderer-3d'
1277
+ ]);
1278
+ const occtVersion = assertOwnedPackageVersion('occt-import-js', occtRoot, '@file-viewer/geometry-engine', modelDependencyAnchors);
1279
+ const occtSource = occtRoot
1280
+ ? { sourcePackage: 'occt-import-js', sourceVersion: occtVersion || undefined }
1281
+ : undefined;
1282
+ await push('model', 'model-occt-worker', join(targetRoot, 'wasm/model/occt-worker.js'), () => copyFileIfPresent(geometryEngineRoot ? join(geometryEngineRoot, 'assets/occt-worker.js') : null, join(targetRoot, 'wasm/model/occt-worker.js')));
1283
+ for (const [id, filename] of [
1284
+ ['model-occt-runtime', 'occt-import-js.js'],
1285
+ ['model-occt-wasm', 'occt-import-js.wasm'],
1286
+ ['model-occt-license', 'license.occt.txt'],
1287
+ ['model-occt-import-license', 'license.occt-import-js.txt']
1288
+ ]) {
1289
+ const targetFilename = filename.startsWith('license.')
1290
+ ? filename.replace(/^license\./, 'LICENSE.')
1291
+ : filename;
1292
+ await push('model', id, join(targetRoot, `wasm/model/${targetFilename}`), () => copyFileIfPresent(occtRoot ? join(occtRoot, `dist/${filename}`) : null, join(targetRoot, `wasm/model/${targetFilename}`)), undefined, occtSource);
1293
+ }
1204
1294
  const typstCompilerRoot = resolvePackageRoot('@myriaddreamin/typst-ts-web-compiler', [
1205
1295
  '@file-viewer/renderer-typst'
1206
1296
  ]);
@@ -1528,12 +1618,16 @@ function resolveViteFullAssetBase(base, baseDir) {
1528
1618
  return { kind: 'literal', url: `${normalizedBase}${encodedBaseDirWithSlash}` };
1529
1619
  }
1530
1620
  function resolveDevAssetRequestPath(targetRoot, baseDir, requestPathname, viteBasePath) {
1531
- if (!requestPathname.startsWith(viteBasePath)) {
1532
- return null;
1533
- }
1534
1621
  let requestRelativePath;
1535
1622
  try {
1536
- requestRelativePath = decodeURIComponent(requestPathname.slice(viteBasePath.length));
1623
+ // Depending on the Vite major and middleware ordering, configureServer can
1624
+ // observe either the original base-prefixed URL or the pathname after
1625
+ // Vite's base middleware has stripped it. Accept both shapes, then keep the
1626
+ // strict viewer-asset allowlist and target-root boundary checks below.
1627
+ const encodedRelativePath = viteBasePath === '/' || requestPathname.startsWith(viteBasePath)
1628
+ ? requestPathname.slice(viteBasePath === '/' ? 1 : viteBasePath.length)
1629
+ : requestPathname.replace(/^\/+/, '');
1630
+ requestRelativePath = decodeURIComponent(encodedRelativePath);
1537
1631
  }
1538
1632
  catch {
1539
1633
  return null;
@@ -1574,6 +1668,7 @@ function reportAssetCopy(results, targetRoot, mode) {
1574
1668
  const failedRequired = results.filter((result) => !result.copied && (result.required ?? [
1575
1669
  'pdf',
1576
1670
  'office-word-openxml',
1671
+ 'office-presentation-binary',
1577
1672
  'office-presentation',
1578
1673
  'archive',
1579
1674
  'cad',
@@ -1613,7 +1708,7 @@ export function fileViewerRenderers(options = {}) {
1613
1708
  let autoPresetIds = resolveAutoPresetIds(options);
1614
1709
  let resolvedConfig = null;
1615
1710
  let installedFullPackages = [];
1616
- let fullAssetBase = null;
1711
+ let runtimeAssetBase = null;
1617
1712
  const refreshSelection = (projectRoot) => {
1618
1713
  if (projectRoot) {
1619
1714
  scanFormats = collectFileViewerRendererScanTokens(projectRoot, options.scan);
@@ -1628,16 +1723,14 @@ export function fileViewerRenderers(options = {}) {
1628
1723
  const refreshFullAssetRuntime = (projectRoot, viteBase) => {
1629
1724
  if (!options.copyAssets) {
1630
1725
  installedFullPackages = [];
1631
- fullAssetBase = null;
1726
+ runtimeAssetBase = null;
1632
1727
  return;
1633
1728
  }
1634
1729
  const target = resolveFileViewerCopyAssetsTarget('dev', options.copyAssets, {
1635
1730
  projectRoot
1636
1731
  });
1637
1732
  installedFullPackages = target.installedFullPackages;
1638
- fullAssetBase = installedFullPackages.length
1639
- ? resolveViteFullAssetBase(viteBase, target.baseDir)
1640
- : null;
1733
+ runtimeAssetBase = resolveViteFullAssetBase(viteBase, target.baseDir);
1641
1734
  };
1642
1735
  const hasConfiguredRenderers = () => Boolean(selection.preset || selection.descriptors.length || autoPresetIds.length);
1643
1736
  return {
@@ -1647,13 +1740,13 @@ export function fileViewerRenderers(options = {}) {
1647
1740
  const projectRoot = resolve(process.cwd(), userConfig.root || '.');
1648
1741
  refreshSelection(projectRoot);
1649
1742
  refreshFullAssetRuntime(projectRoot, userConfig.base);
1650
- const selectedPackages = collectSelectedPackages(selection, autoPresetIds);
1651
1743
  const dependencyAnchorPackages = collectDependencyAnchorPackages(selection, autoPresetIds);
1652
- const resolvedDependencyAnchorPackages = fullAssetBase
1744
+ const resolvedDependencyAnchorPackages = runtimeAssetBase
1653
1745
  ? unique([
1654
1746
  ...dependencyAnchorPackages,
1747
+ '@file-viewer/core',
1655
1748
  ...installedFullPackages,
1656
- '@file-viewer/preset-all'
1749
+ ...(installedFullPackages.length ? ['@file-viewer/preset-all'] : [])
1657
1750
  ])
1658
1751
  : dependencyAnchorPackages;
1659
1752
  const optimizeDepsExclude = createOptimizeDepsExclude(userConfig);
@@ -1730,7 +1823,7 @@ export function fileViewerRenderers(options = {}) {
1730
1823
  const viteBasePath = normalizeViteDevBasePath(resolvedConfig?.base || '/');
1731
1824
  if (server?.middlewares?.use) {
1732
1825
  const realTargetRoot = await realpath(targetRoot).catch(() => targetRoot);
1733
- server.middlewares.use(async (request, response, next) => {
1826
+ server.middlewares.use(async function fileViewerAssetMiddleware(request, response, next) {
1734
1827
  const requestUrl = request.url || '';
1735
1828
  const queryIndex = requestUrl.indexOf('?');
1736
1829
  const pathname = queryIndex >= 0 ? requestUrl.slice(0, queryIndex) : requestUrl;
@@ -1789,7 +1882,7 @@ export function fileViewerRenderers(options = {}) {
1789
1882
  transformIndexHtml: {
1790
1883
  order: 'pre',
1791
1884
  handler() {
1792
- if (options.inject === false || (!hasConfiguredRenderers() && !fullAssetBase)) {
1885
+ if (options.inject === false || (!hasConfiguredRenderers() && !runtimeAssetBase)) {
1793
1886
  return undefined;
1794
1887
  }
1795
1888
  return [
@@ -1837,15 +1930,28 @@ export function fileViewerRenderers(options = {}) {
1837
1930
  const results = await copyRendererAssets(copyTarget, collectAssetRendererIds(selection, autoPresetIds, copyTarget.installedFullPackages.length > 0));
1838
1931
  reportAssetCopy(results, targetRoot, missingMode);
1839
1932
  },
1840
- resolveId(id) {
1933
+ resolveId(id, importer) {
1934
+ if (id === '@file-viewer/ppt' &&
1935
+ options.copyAssets &&
1936
+ installedFullPackages.length > 0 &&
1937
+ isPresentationRendererImporter(importer)) {
1938
+ return resolvedPackagedPptFallbackModuleId;
1939
+ }
1841
1940
  if (id === moduleId || id === virtualModuleId || id === injectedModulePath) {
1842
1941
  return id === virtualModuleId ? resolvedVirtualModuleId : resolvedModuleId;
1843
1942
  }
1844
1943
  return undefined;
1845
1944
  },
1846
1945
  load(id) {
1946
+ if (id === resolvedPackagedPptFallbackModuleId) {
1947
+ return `
1948
+ export async function createPptViewer() {
1949
+ throw new Error('Packaged PPT runtime URL was not initialized.')
1950
+ }
1951
+ `;
1952
+ }
1847
1953
  if (id === resolvedModuleId || id === resolvedVirtualModuleId) {
1848
- return renderVirtualModule(selection, requestedFormats, autoPresetIds, fullAssetBase);
1954
+ return renderVirtualModule(selection, requestedFormats, autoPresetIds, runtimeAssetBase, installedFullPackages.length > 0);
1849
1955
  }
1850
1956
  return undefined;
1851
1957
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/vite-plugin",
3
- "version": "2.1.30",
3
+ "version": "2.2.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Vite plugin for Flyfish File Viewer on-demand renderer assembly, chunk planning, and offline asset deployment.",