@file-viewer/core 3.1.2 → 3.2.0

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 (103) hide show
  1. package/README.en.md +3 -121
  2. package/README.md +3 -126
  3. package/dist/assets.d.ts +2 -2
  4. package/dist/assets.js +1 -5
  5. package/dist/browser/controller.d.ts +1 -2
  6. package/dist/browser/controller.js +2 -34
  7. package/dist/browser.d.ts +2 -2
  8. package/dist/browser.js +2 -2
  9. package/dist/config/options.d.ts +1 -1
  10. package/dist/contracts/types.d.ts +26 -423
  11. package/dist/contracts/xml.d.ts +0 -11
  12. package/dist/export.d.ts +3 -10
  13. package/dist/export.js +2 -9
  14. package/dist/exportDocument.d.ts +1 -12
  15. package/dist/exportDocument.js +7 -31
  16. package/dist/features/document/dom/anchors.d.ts +1 -1
  17. package/dist/features/document/dom/index.d.ts +5 -5
  18. package/dist/features/document/dom/index.js +3 -3
  19. package/dist/features/document/dom/providers.d.ts +1 -1
  20. package/dist/features/document/events.d.ts +2 -2
  21. package/dist/features/document/events.js +3 -3
  22. package/dist/features/document/fit.d.ts +1 -1
  23. package/dist/features/document/fit.js +1 -1
  24. package/dist/features/document/model.d.ts +1 -1
  25. package/dist/features/document/search.d.ts +1 -1
  26. package/dist/features/document/search.js +2 -2
  27. package/dist/features/document/viewState.d.ts +1 -1
  28. package/dist/features/document/viewState.js +2 -2
  29. package/dist/features/document/zoom.d.ts +3 -2
  30. package/dist/features/document/zoom.js +19 -3
  31. package/dist/features/document/zoomGestures.d.ts +11 -0
  32. package/dist/features/document/zoomGestures.js +111 -0
  33. package/dist/features/printMask.d.ts +1 -1
  34. package/dist/features/printMaskDesigner.d.ts +2 -6
  35. package/dist/features/printMaskDesigner.js +2 -11
  36. package/dist/features/printMaskLoader.d.ts +1 -7
  37. package/dist/features/printMaskLoader.js +1 -7
  38. package/dist/features/watermark.d.ts +1 -1
  39. package/dist/headless.d.ts +29 -29
  40. package/dist/headless.js +16 -21
  41. package/dist/i18n/messages.d.ts +1 -1
  42. package/dist/i18n/messages.de.d.ts +1 -5
  43. package/dist/i18n/messages.de.js +0 -4
  44. package/dist/i18n/messages.ja.d.ts +1 -6
  45. package/dist/i18n/messages.ja.js +0 -5
  46. package/dist/i18n/messages.js +2 -2
  47. package/dist/index.d.ts +74 -74
  48. package/dist/index.js +37 -37
  49. package/dist/lifecycle/facade.d.ts +4 -4
  50. package/dist/lifecycle/facade.js +2 -2
  51. package/dist/lifecycle/operations.d.ts +4 -4
  52. package/dist/lifecycle/operations.js +4 -9
  53. package/dist/output/canvasImage.d.ts +1 -2
  54. package/dist/output/canvasImage.js +1 -4
  55. package/dist/output/export.d.ts +2 -4
  56. package/dist/output/export.js +133 -81
  57. package/dist/output/printLayout.d.ts +2 -5
  58. package/dist/output/printLayout.js +37 -9
  59. package/dist/output/snapshotDownload.d.ts +1 -2
  60. package/dist/output/snapshotDownload.js +2 -3
  61. package/dist/platform/assets.d.ts +9 -16
  62. package/dist/platform/assets.js +60 -17
  63. package/dist/platform/copiedAssets.d.ts +0 -1
  64. package/dist/platform/copiedAssets.js +1 -2
  65. package/dist/presentation/state.d.ts +1 -1
  66. package/dist/presentation/state.js +3 -3
  67. package/dist/print-mask.d.ts +2 -2
  68. package/dist/print-mask.js +1 -1
  69. package/dist/registry/capabilities.d.ts +3 -16
  70. package/dist/registry/capabilities.js +2 -15
  71. package/dist/registry/formats.d.ts +5 -5
  72. package/dist/registry/formats.generated.d.ts +7 -8
  73. package/dist/registry/formats.generated.js +7 -4
  74. package/dist/registry/formats.js +2 -2
  75. package/dist/registry/registry.d.ts +6 -15
  76. package/dist/registry/registry.js +24 -10
  77. package/dist/renderers/image.d.ts +1 -1
  78. package/dist/renderers/image.js +26 -5
  79. package/dist/renderers/index.d.ts +11 -11
  80. package/dist/renderers/index.js +5 -11
  81. package/dist/rendering/dispatcher.d.ts +1 -6
  82. package/dist/rendering/dispatcher.js +3 -3
  83. package/dist/rendering/handler.d.ts +10 -15
  84. package/dist/rendering/handler.js +20 -27
  85. package/dist/security/svgResources.d.ts +0 -10
  86. package/dist/security/svgResources.js +2 -11
  87. package/dist/source/index.d.ts +3 -3
  88. package/dist/source/index.js +1 -1
  89. package/dist/source/loading.d.ts +56 -15
  90. package/dist/source/loading.js +177 -87
  91. package/dist/source/precheck.d.ts +1 -13
  92. package/dist/source/precheck.js +2 -9
  93. package/dist/source/textEncoding.d.ts +6 -3
  94. package/dist/source/textEncoding.js +58 -8
  95. package/dist/viewer/createViewer.d.ts +1 -1
  96. package/dist/viewer/createViewer.js +103 -33
  97. package/dist/viewer/loading.d.ts +2 -6
  98. package/dist/viewer/loading.js +1 -9
  99. package/dist/viewer/operations.d.ts +3 -3
  100. package/dist/viewer/operations.js +6 -14
  101. package/dist/viewer/state.d.ts +2 -6
  102. package/dist/viewer/state.js +3 -8
  103. package/package.json +127 -19
@@ -1,26 +1,20 @@
1
- // Imperative viewer composition root.
2
- //
3
- // `createViewer` wires source normalization, lifecycle hooks, renderer
4
- // sessions, document features, watermarking, and public operations into a
5
- // framework-neutral controller. Framework packages should wrap this API instead
6
- // of reimplementing the orchestration.
7
- import { createEmptyFileViewerSearchState, } from '../features/document/model.js';
8
- import { createFileViewerDocumentFeatureControllerActionHandlers, } from '../features/document/events.js';
9
- import { createFileViewerZoomController } from '../features/document/zoom.js';
10
- import { createFileViewerViewStateController } from '../features/document/viewState.js';
11
- import { createFileViewerFitController, hasFileViewerExplicitInitialViewState, } from '../features/document/fit.js';
12
- import { DEFAULT_FILE_VIEWER_DOWNLOAD_FILENAME, DEFAULT_FILE_VIEWER_EXPORT_FILENAME, DEFAULT_FILE_VIEWER_PREVIEW_TITLE, createFileViewerOriginalSourceStateFromNormalizedSource, executeFileViewerDownloadOperation, executeFileViewerExportHtmlOperation, executeFileViewerPrintOperation, resolveFileViewerDisplayFilename, resolveFileViewerOperationFilename, } from './operations.js';
13
- import { openFileViewerPrintMaskDesignerAsync } from '../features/printMaskLoader.js';
14
- import { applyFileViewerZoomAvailability, createUnsupportedAvailability, getRendererAvailability, } from '../registry/capabilities.js';
15
- import { buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, runFileViewerBeforeOperation, runFileViewerLifecycleHook, } from '../lifecycle/operations.js';
16
- import { collectFileViewerRendererPlugins, createRendererRegistry, getFileViewerAutoRendererPresetVersion, hasFileViewerRendererPresetName, installFileViewerRendererPlugins, listFileViewerAutoRendererPresets, resolveFileViewerRendererPresetInputs, } from '../registry/registry.js';
17
- import { createFileRenderHandlerLoader, applyFileViewerRenderSurfaceState, createFileViewerRenderSurfaceState, createFileViewerRenderSurface, removeFileViewerRenderTarget, syncFileViewerRenderSurfaceBackground, } from '../rendering/handler.js';
18
- import { createFileViewerCoreRendererRegistry } from '../renderers/index.js';
19
- import { createFileViewerRequestScope } from '../source/loading.js';
20
- import { normalizeSource } from '../source/index.js';
21
- import { buildFileViewerWatermarkInlineStyle } from '../features/watermark.js';
22
- import { createFileViewerSnapshotDownload } from '../output/snapshotDownload.js';
23
- import { createFileViewerErrorState, createFileViewerUnsupportedState } from './state.js';
1
+ import { createEmptyFileViewerSearchState, } from "../features/document/model.js";
2
+ import { createFileViewerDocumentFeatureControllerActionHandlers, } from "../features/document/events.js";
3
+ import { createFileViewerZoomController } from "../features/document/zoom.js";
4
+ import { createFileViewerViewStateController } from "../features/document/viewState.js";
5
+ import { createFileViewerFitController, hasFileViewerExplicitInitialViewState, } from "../features/document/fit.js";
6
+ import { DEFAULT_FILE_VIEWER_DOWNLOAD_FILENAME, DEFAULT_FILE_VIEWER_EXPORT_FILENAME, DEFAULT_FILE_VIEWER_PREVIEW_TITLE, createFileViewerOriginalSourceStateFromNormalizedSource, executeFileViewerDownloadOperation, executeFileViewerExportHtmlOperation, executeFileViewerPrintOperation, resolveFileViewerDisplayFilename, resolveFileViewerOperationFilename, } from "./operations.js";
7
+ import { openFileViewerPrintMaskDesignerAsync } from "../features/printMaskLoader.js";
8
+ import { applyFileViewerZoomAvailability, createUnsupportedAvailability, getRendererAvailability, } from "../registry/capabilities.js";
9
+ import { buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, runFileViewerBeforeOperation, runFileViewerLifecycleHook, } from "../lifecycle/operations.js";
10
+ import { collectFileViewerRendererPlugins, createRendererRegistry, getFileViewerAutoRendererPresetVersion, hasFileViewerRendererPresetName, installFileViewerRendererPlugins, listFileViewerAutoRendererPresets, resolveFileViewerRendererPresetInputs, resolveFileViewerRendererDefinition, } from "../registry/registry.js";
11
+ import { createFileRenderHandlerLoader, applyFileViewerRenderSurfaceState, createFileViewerRenderSurfaceState, createFileViewerRenderSurface, removeFileViewerRenderTarget, syncFileViewerRenderSurfaceBackground, } from "../rendering/handler.js";
12
+ import { createFileViewerCoreRendererRegistry } from "../renderers/index.js";
13
+ import { createFileViewerRequestScope } from "../source/loading.js";
14
+ import { normalizeSource } from "../source/index.js";
15
+ import { buildFileViewerWatermarkInlineStyle } from "../features/watermark.js";
16
+ import { createFileViewerSnapshotDownload } from "../output/snapshotDownload.js";
17
+ import { createFileViewerErrorState, createFileViewerUnsupportedState } from "./state.js";
24
18
  const emitLifecycle = async (options, onEvent, phase, source, version, startedAt, reason) => {
25
19
  const now = Date.now();
26
20
  const context = buildFileViewerLifecycleContextFromNormalizedSource({
@@ -157,6 +151,7 @@ export const createViewer = (container, createOptions = {}) => {
157
151
  let installedAutoRenderersEnabled = resolveAutoRenderersEnabled(options);
158
152
  let installedAutoRendererVersion = -1;
159
153
  let currentSource = null;
154
+ let currentRendererId = null;
160
155
  let currentRenderTarget = null;
161
156
  let currentDocumentRoot = null;
162
157
  const renderSurfaceState = createFileViewerRenderSurfaceState();
@@ -350,6 +345,7 @@ export const createViewer = (container, createOptions = {}) => {
350
345
  load: createFileRenderHandlerLoader({
351
346
  handler: registration.handler,
352
347
  rendererId: definition.id,
348
+ allowUrlSource: definition.sourceAccess === 'stream-preferred',
353
349
  getTarget: context => context.surface.container,
354
350
  }),
355
351
  });
@@ -360,6 +356,26 @@ export const createViewer = (container, createOptions = {}) => {
360
356
  registerHandler,
361
357
  });
362
358
  };
359
+ const resolveDetectedSourceType = async (source, signal) => {
360
+ var _a;
361
+ for (const definition of registry.list()) {
362
+ if (!definition.resolveSourceType)
363
+ continue;
364
+ const detected = await definition.resolveSourceType({
365
+ filename: source.filename,
366
+ extension: source.extension,
367
+ url: source.url,
368
+ file: source.file,
369
+ buffer: source.buffer,
370
+ mimeType: (_a = source.file) === null || _a === void 0 ? void 0 : _a.type,
371
+ signal,
372
+ });
373
+ if (typeof detected === 'string' && detected.trim()) {
374
+ return detected.trim();
375
+ }
376
+ }
377
+ return source.extension;
378
+ };
363
379
  const renderNestedBuffer = async (buffer, type, target, context) => {
364
380
  var _a;
365
381
  const inheritedOptions = (context === null || context === void 0 ? void 0 : context.options) || options;
@@ -367,9 +383,6 @@ export const createViewer = (container, createOptions = {}) => {
367
383
  registry,
368
384
  options: {
369
385
  ...inheritedOptions,
370
- // The parent already resolved its renderer assembly into `registry`.
371
- // Reuse that exact registry without reinstalling presets or mutating a
372
- // shared registry while an attachment is open.
373
386
  autoRenderers: false,
374
387
  rendererMode: 'extend',
375
388
  renderers: undefined,
@@ -436,7 +449,16 @@ export const createViewer = (container, createOptions = {}) => {
436
449
  };
437
450
  const getCapabilitiesForExtension = (extension) => {
438
451
  const targetExtension = extension || (currentSource === null || currentSource === void 0 ? void 0 : currentSource.extension) || '';
439
- const renderer = registry.getByExtension(targetExtension);
452
+ const renderer = extension
453
+ ? resolveFileViewerRendererDefinition(registry, {
454
+ extension,
455
+ })
456
+ : currentRendererId
457
+ ? registry.getById(currentRendererId)
458
+ : resolveFileViewerRendererDefinition(registry, {
459
+ filename: currentSource === null || currentSource === void 0 ? void 0 : currentSource.filename,
460
+ extension: targetExtension,
461
+ });
440
462
  const zoomState = zoomController.getState();
441
463
  if (!renderer) {
442
464
  return applyFileViewerZoomAvailability(createUnsupportedAvailability(targetExtension), zoomState);
@@ -470,6 +492,7 @@ export const createViewer = (container, createOptions = {}) => {
470
492
  };
471
493
  const zoomController = createFileViewerZoomController({
472
494
  root: () => currentDocumentRoot || container,
495
+ gestures: () => options.zoomGestures,
473
496
  beforeZoom: runBeforeViewerOperation,
474
497
  onChange: state => emitZoomAndOperationAvailabilityChange(state),
475
498
  });
@@ -527,6 +550,7 @@ export const createViewer = (container, createOptions = {}) => {
527
550
  await ((_a = session === null || session === void 0 ? void 0 : session.destroy) === null || _a === void 0 ? void 0 : _a.call(session));
528
551
  removeRenderTarget(target || undefined);
529
552
  currentSource = null;
553
+ currentRendererId = null;
530
554
  currentDocumentRoot = null;
531
555
  applyFileViewerRenderSurfaceState(renderSurfaceState, {
532
556
  session: null,
@@ -561,8 +585,30 @@ export const createViewer = (container, createOptions = {}) => {
561
585
  return null;
562
586
  }
563
587
  const normalized = normalizeSource(source);
588
+ let resolvedExtension;
589
+ try {
590
+ resolvedExtension = await resolveDetectedSourceType(normalized, loadSignal);
591
+ }
592
+ catch (error) {
593
+ requestScope.requestController.clearAbortController(requestAbortController);
594
+ if (!requestScope.isCurrentRequest(version) || (loadSignal === null || loadSignal === void 0 ? void 0 : loadSignal.aborted) || isAbortError(error)) {
595
+ return null;
596
+ }
597
+ throw error;
598
+ }
599
+ if (!requestScope.isCurrentRequest(version) || (loadSignal === null || loadSignal === void 0 ? void 0 : loadSignal.aborted)) {
600
+ requestScope.requestController.clearAbortController(requestAbortController);
601
+ return null;
602
+ }
603
+ const renderer = resolveFileViewerRendererDefinition(registry, {
604
+ filename: normalized.filename,
605
+ extension: resolvedExtension,
606
+ });
607
+ const routedSource = resolvedExtension === normalized.extension
608
+ ? normalized
609
+ : { ...normalized, extension: resolvedExtension };
564
610
  currentSource = normalized;
565
- const renderer = registry.getByExtension(normalized.extension);
611
+ currentRendererId = (renderer === null || renderer === void 0 ? void 0 : renderer.id) || null;
566
612
  const startedAt = Date.now();
567
613
  await emitLifecycle(options, createOptions.onEvent, 'load-start', normalized, version, startedAt);
568
614
  const surface = createRenderTarget((renderer === null || renderer === void 0 ? void 0 : renderer.id) !== 'office-presentation' && (renderer === null || renderer === void 0 ? void 0 : renderer.id) !== 'office-presentation-binary');
@@ -570,7 +616,7 @@ export const createViewer = (container, createOptions = {}) => {
570
616
  const targetHost = surface.host || target;
571
617
  currentDocumentRoot = target;
572
618
  if (!(renderer === null || renderer === void 0 ? void 0 : renderer.load)) {
573
- renderMissingRendererState(target, normalized.extension, options);
619
+ renderMissingRendererState(target, resolvedExtension, options);
574
620
  applyFileViewerRenderSurfaceState(renderSurfaceState, { session: null });
575
621
  syncWatermarkOverlay();
576
622
  emitZoomAndOperationAvailabilityChange();
@@ -580,7 +626,7 @@ export const createViewer = (container, createOptions = {}) => {
580
626
  let session;
581
627
  try {
582
628
  session = await renderer.load({
583
- source: normalized,
629
+ source: routedSource,
584
630
  surface,
585
631
  options,
586
632
  signal: loadSignal,
@@ -616,22 +662,40 @@ export const createViewer = (container, createOptions = {}) => {
616
662
  thumbnailAdapter: null,
617
663
  });
618
664
  removeWatermarkOverlay();
619
- renderFileViewerErrorState(target, normalized.extension, error, options);
665
+ renderFileViewerErrorState(target, resolvedExtension, error, options);
620
666
  emitZoomAndOperationAvailabilityChange();
621
667
  throw error;
622
668
  }
623
- if (!requestScope.isCurrentRequest(version)) {
669
+ if (!requestScope.isCurrentRequest(version) || (loadSignal === null || loadSignal === void 0 ? void 0 : loadSignal.aborted)) {
624
670
  await disposeStaleSession(session, targetHost);
671
+ requestScope.requestController.clearAbortController(requestAbortController);
625
672
  return null;
626
673
  }
627
674
  applyFileViewerRenderSurfaceState(renderSurfaceState, { session });
628
675
  syncWatermarkOverlay();
629
676
  zoomController.refreshProvider();
630
677
  viewStateController.refreshProvider();
678
+ const finishStaleLoad = async () => {
679
+ if (renderSurfaceState.session === session && currentRenderTarget === targetHost) {
680
+ await destroyCurrent('replace');
681
+ }
682
+ else {
683
+ removeRenderTarget(targetHost);
684
+ }
685
+ requestScope.requestController.clearAbortController(requestAbortController);
686
+ };
631
687
  await documentActions.refreshDocumentIndex({ notify: false });
688
+ if (!requestScope.isCurrentRequest(version) || (loadSignal === null || loadSignal === void 0 ? void 0 : loadSignal.aborted)) {
689
+ await finishStaleLoad();
690
+ return null;
691
+ }
632
692
  await fitController.applyInitialFit({
633
693
  skip: hasFileViewerExplicitInitialViewState(options.initialViewState),
634
694
  });
695
+ if (!requestScope.isCurrentRequest(version) || (loadSignal === null || loadSignal === void 0 ? void 0 : loadSignal.aborted)) {
696
+ await finishStaleLoad();
697
+ return null;
698
+ }
635
699
  zoomController.refreshProvider();
636
700
  viewStateController.refreshProvider();
637
701
  emitZoomAndOperationAvailabilityChange();
@@ -668,7 +732,13 @@ export const createViewer = (container, createOptions = {}) => {
668
732
  return getCapabilitiesForExtension(extension);
669
733
  },
670
734
  getRenderer(extension) {
671
- return registry.getByExtension(extension || (currentSource === null || currentSource === void 0 ? void 0 : currentSource.extension) || '');
735
+ if (!extension && currentRendererId) {
736
+ return registry.getById(currentRendererId);
737
+ }
738
+ return resolveFileViewerRendererDefinition(registry, {
739
+ filename: extension ? undefined : currentSource === null || currentSource === void 0 ? void 0 : currentSource.filename,
740
+ extension: extension || (currentSource === null || currentSource === void 0 ? void 0 : currentSource.extension) || '',
741
+ });
672
742
  },
673
743
  getSource() {
674
744
  return currentSource;
@@ -1,5 +1,5 @@
1
- import { type FileViewerI18nInput } from '../i18n/messages';
2
- import type { FileViewerStateTheme } from '../contracts/types';
1
+ import { type FileViewerI18nInput } from "../i18n/messages.js";
2
+ import type { FileViewerStateTheme } from "../contracts/types.js";
3
3
  export type FileViewerLoadingTheme = FileViewerStateTheme;
4
4
  export interface FileViewerLoadingState {
5
5
  loading: boolean;
@@ -51,8 +51,4 @@ export declare const syncFileViewerLoadingControllerState: <Target extends Mutab
51
51
  export declare const runFileViewerLoadingControllerAction: <Target extends MutableFileViewerLoadingState>(target: Target, action: () => FileViewerLoadingState) => Target;
52
52
  export declare const runFileViewerLoadingExtensionSync: <Target extends MutableFileViewerLoadingState>({ target, controller, extension, }: RunFileViewerLoadingExtensionSyncInput<Target>) => Target;
53
53
  export declare const createFileViewerLoadingControllerActionHandlers: <Target extends MutableFileViewerLoadingState>(target: Target, controller: FileViewerLoadingController) => FileViewerLoadingControllerActionHandlers;
54
- /**
55
- * 统一管理加载、错误、文案和主题色。
56
- * wrapper 只负责把这个加载状态映射到各自框架的响应式系统。
57
- */
58
54
  export declare const createFileViewerLoadingController: (extend?: string, initialI18n?: FileViewerI18nInput) => FileViewerLoadingController;
@@ -1,4 +1,4 @@
1
- import { translateFileViewerMessage, } from '../i18n/messages.js';
1
+ import { translateFileViewerMessage, } from "../i18n/messages.js";
2
2
  export const FALLBACK_FILE_VIEWER_LOADING_THEME = {
3
3
  accent: '#5f6f82',
4
4
  soft: 'rgba(95, 111, 130, 0.12)',
@@ -418,10 +418,6 @@ const FILE_VIEWER_LOADING_COPY_KEYS = {
418
418
  flac: { label: 'loading.audio.label', hint: 'loading.audio.hint' },
419
419
  weba: { label: 'loading.audio.label', hint: 'loading.audio.hint' },
420
420
  };
421
- /**
422
- * 根据扩展名返回统一的加载主题。
423
- * 这样不同预览器可以复用同一套视觉语义,避免颜色、图标和文案各写一份。
424
- */
425
421
  const localizeFileViewerLoadingTheme = (theme, extend = '', i18n) => {
426
422
  const normalized = extend.trim().toLowerCase();
427
423
  const keys = FILE_VIEWER_LOADING_COPY_KEYS[normalized] || {
@@ -511,10 +507,6 @@ export const createFileViewerLoadingControllerActionHandlers = (target, controll
511
507
  },
512
508
  };
513
509
  };
514
- /**
515
- * 统一管理加载、错误、文案和主题色。
516
- * wrapper 只负责把这个加载状态映射到各自框架的响应式系统。
517
- */
518
510
  export const createFileViewerLoadingController = (extend = '', initialI18n) => {
519
511
  let currentExtend = extend;
520
512
  let currentI18n = initialI18n;
@@ -1,6 +1,6 @@
1
- import type { FileViewerErrorMessageFormatter } from './state';
2
- import { type FileViewerI18nInput } from '../i18n/messages';
3
- import type { FileRenderExportAdapter, FileViewerDownloadOptions, FileViewerExportHtmlOptions, FileViewerOperationType, FileViewerPrintOptions, NormalizedFileViewerSource } from '../contracts/types';
1
+ import type { FileViewerErrorMessageFormatter } from "./state.js";
2
+ import { type FileViewerI18nInput } from "../i18n/messages.js";
3
+ import type { FileRenderExportAdapter, FileViewerDownloadOptions, FileViewerExportHtmlOptions, FileViewerOperationType, FileViewerPrintOptions, NormalizedFileViewerSource } from "../contracts/types.js";
4
4
  export interface FileViewerOriginalSourceState {
5
5
  buffer?: ArrayBuffer | null;
6
6
  file?: File | Blob | null;
@@ -1,6 +1,6 @@
1
- import { triggerFileViewerBlobDownload, triggerFileViewerUrlDownload, waitForFileViewerPrintWindowReady, } from '../output/export.js';
2
- import { DEFAULT_FILE_VIEWER_SOURCE_FILENAME } from '../source/index.js';
3
- import { translateFileViewerMessage, } from '../i18n/messages.js';
1
+ import { triggerFileViewerBlobDownload, triggerFileViewerUrlDownload, waitForFileViewerPrintWindowReady, } from "../output/export.js";
2
+ import { DEFAULT_FILE_VIEWER_SOURCE_FILENAME } from "../source/index.js";
3
+ import { translateFileViewerMessage, } from "../i18n/messages.js";
4
4
  export const DEFAULT_FILE_VIEWER_PREVIEW_TITLE = 'file-viewer-preview';
5
5
  export const DEFAULT_FILE_VIEWER_EXPORT_FILENAME = 'preview';
6
6
  export const DEFAULT_FILE_VIEWER_DOWNLOAD_FILENAME = DEFAULT_FILE_VIEWER_SOURCE_FILENAME;
@@ -65,7 +65,7 @@ const buildRenderedHtmlDocumentFromOperation = async (mode, { source, title, fil
65
65
  if (!source) {
66
66
  throw new Error(translateFileViewerMessage(i18n, 'error.noExportContent'));
67
67
  }
68
- const { buildFileViewerRenderedHtmlDocument } = await import('../export.js');
68
+ const { buildFileViewerRenderedHtmlDocument } = await import("../export.js");
69
69
  return buildFileViewerRenderedHtmlDocument({
70
70
  source,
71
71
  mode,
@@ -82,7 +82,7 @@ const buildRenderedDomDocumentFromOperation = async ({ source, title, filename,
82
82
  if (!source) {
83
83
  throw new Error(translateFileViewerMessage(i18n, 'error.noExportContent'));
84
84
  }
85
- const { buildFileViewerRenderedDomDocument } = await import('../export.js');
85
+ const { buildFileViewerRenderedDomDocument } = await import("../export.js");
86
86
  return buildFileViewerRenderedDomDocument({
87
87
  source,
88
88
  mode: 'print',
@@ -157,11 +157,6 @@ export const executeFileViewerDownloadOperation = async ({ source, filename, bef
157
157
  source,
158
158
  fallback: DEFAULT_FILE_VIEWER_DOWNLOAD_FILENAME,
159
159
  });
160
- // PDF.js transfers ArrayBuffer-backed data to its worker. After a successful
161
- // render the original buffer can therefore be detached (byteLength === 0),
162
- // while the File or URL retained by the viewer is still the complete source.
163
- // Preserve the existing buffer-first contract for non-empty buffers, but do
164
- // not turn a detached buffer into a zero-byte download.
165
160
  if (source.buffer &&
166
161
  (source.buffer.byteLength > 0 || (!source.file && !source.url))) {
167
162
  triggerFileViewerBlobDownload(new Blob([source.buffer], { type: source.mimeType || ((_a = source.file) === null || _a === void 0 ? void 0 : _a.type) || 'application/octet-stream' }), resolvedFilename);
@@ -175,8 +170,6 @@ export const executeFileViewerDownloadOperation = async ({ source, filename, bef
175
170
  triggerFileViewerUrlDownload(source.url, resolvedFilename);
176
171
  return true;
177
172
  }
178
- // Empty local files are valid sources. These final fallbacks preserve their
179
- // intentional zero-byte downloads when no complete File or URL is available.
180
173
  if (source.file) {
181
174
  triggerFileViewerBlobDownload(source.file, resolvedFilename);
182
175
  return true;
@@ -210,7 +203,6 @@ export const executeFileViewerPrintOperation = async ({ autoPrint = true, before
210
203
  if (beforeResult === false) {
211
204
  return false;
212
205
  }
213
- // Preserve the browser's transient user activation while the snapshot is built.
214
206
  const ownsPrintWindow = !printWindow;
215
207
  const targetWindow = printWindow ||
216
208
  (openWindow === null || openWindow === void 0 ? void 0 : openWindow()) ||
@@ -348,7 +340,7 @@ export const createFileViewerOperationActionHandlers = ({ getBuffer, getFile, ge
348
340
  if (!source) {
349
341
  throw new Error(translateFileViewerMessage(resolveI18n(), 'error.noExportContent'));
350
342
  }
351
- const { openFileViewerPrintMaskDesignerAsync } = await import('../features/printMaskLoader.js');
343
+ const { openFileViewerPrintMaskDesignerAsync } = await import("../features/printMaskLoader.js");
352
344
  const adapter = (_a = getAdapter === null || getAdapter === void 0 ? void 0 : getAdapter()) !== null && _a !== void 0 ? _a : null;
353
345
  const result = await openFileViewerPrintMaskDesignerAsync({
354
346
  root: source,
@@ -1,10 +1,6 @@
1
- import { type FileViewerI18nInput } from '../i18n/messages';
2
- import type { FileViewerRendererCategory, FileViewerStateDescriptor, FileViewerStateTheme } from '../contracts/types';
1
+ import { type FileViewerI18nInput } from "../i18n/messages.js";
2
+ import type { FileViewerRendererCategory, FileViewerStateDescriptor, FileViewerStateTheme } from "../contracts/types.js";
3
3
  export type FileViewerErrorMessageFormatter = (prefix: string, error: unknown, i18n?: FileViewerI18nInput) => string;
4
- /**
5
- * Renderers can attach a localized, user-safe explanation without replacing
6
- * the original error object that hosts use for diagnostics and recovery.
7
- */
8
4
  export declare const FILE_VIEWER_ERROR_MESSAGE: "fileViewerErrorMessage";
9
5
  export interface FileViewerErrorMessageCarrier {
10
6
  [FILE_VIEWER_ERROR_MESSAGE]?: string;
@@ -1,10 +1,6 @@
1
- import { normalizeFileExtension } from '../source/index.js';
2
- import { DEFAULT_RENDERER_DEFINITIONS } from '../registry/formats.js';
3
- import { resolveFileViewerLocale, translateFileViewerMessage, } from '../i18n/messages.js';
4
- /**
5
- * Renderers can attach a localized, user-safe explanation without replacing
6
- * the original error object that hosts use for diagnostics and recovery.
7
- */
1
+ import { normalizeFileExtension } from "../source/index.js";
2
+ import { DEFAULT_RENDERER_DEFINITIONS } from "../registry/formats.js";
3
+ import { resolveFileViewerLocale, translateFileViewerMessage, } from "../i18n/messages.js";
8
4
  export const FILE_VIEWER_ERROR_MESSAGE = 'fileViewerErrorMessage';
9
5
  export const attachFileViewerErrorMessage = (error, message) => {
10
6
  const normalizedMessage = message.trim();
@@ -20,7 +16,6 @@ export const attachFileViewerErrorMessage = (error, message) => {
20
16
  return error;
21
17
  }
22
18
  catch {
23
- // Frozen cross-realm errors retain their original value as the cause below.
24
19
  }
25
20
  }
26
21
  const presented = new Error(normalizedMessage);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/core",
3
- "version": "3.1.2",
3
+ "version": "3.2.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Framework-neutral modular TypeScript core for File Viewer renderer orchestration, lifecycle APIs, search, zoom, print, and export",
@@ -27,8 +27,7 @@
27
27
  },
28
28
  "repository": {
29
29
  "type": "git",
30
- "url": "git+https://github.com/flyfish-dev/file-viewer.git",
31
- "directory": "packages/core"
30
+ "url": "git+https://github.com/flyfish-dev/file-viewer.git"
32
31
  },
33
32
  "bugs": {
34
33
  "url": "https://github.com/flyfish-dev/file-viewer/issues"
@@ -75,29 +74,138 @@
75
74
  "./package.json": "./package.json"
76
75
  },
77
76
  "files": [
78
- "assets.js",
79
77
  "assets.d.ts",
80
- "browser.js",
78
+ "assets.js",
81
79
  "browser.d.ts",
82
- "dist",
83
- "headless.js",
80
+ "browser.js",
81
+ "dist/assets.d.ts",
82
+ "dist/assets.js",
83
+ "dist/browser.d.ts",
84
+ "dist/browser.js",
85
+ "dist/browser/controller.d.ts",
86
+ "dist/browser/controller.js",
87
+ "dist/config/options.d.ts",
88
+ "dist/config/options.js",
89
+ "dist/contracts/types.d.ts",
90
+ "dist/contracts/types.js",
91
+ "dist/contracts/xml.d.ts",
92
+ "dist/contracts/xml.js",
93
+ "dist/export.d.ts",
94
+ "dist/export.js",
95
+ "dist/exportDocument.d.ts",
96
+ "dist/exportDocument.js",
97
+ "dist/features/document/dom/anchors.d.ts",
98
+ "dist/features/document/dom/anchors.js",
99
+ "dist/features/document/dom/index.d.ts",
100
+ "dist/features/document/dom/index.js",
101
+ "dist/features/document/dom/providers.d.ts",
102
+ "dist/features/document/dom/providers.js",
103
+ "dist/features/document/dom/scroll.d.ts",
104
+ "dist/features/document/dom/scroll.js",
105
+ "dist/features/document/events.d.ts",
106
+ "dist/features/document/events.js",
107
+ "dist/features/document/fit.d.ts",
108
+ "dist/features/document/fit.js",
109
+ "dist/features/document/model.d.ts",
110
+ "dist/features/document/model.js",
111
+ "dist/features/document/search.d.ts",
112
+ "dist/features/document/search.js",
113
+ "dist/features/document/viewState.d.ts",
114
+ "dist/features/document/viewState.js",
115
+ "dist/features/document/zoom.d.ts",
116
+ "dist/features/document/zoom.js",
117
+ "dist/features/document/zoomGestures.d.ts",
118
+ "dist/features/document/zoomGestures.js",
119
+ "dist/features/printMask.d.ts",
120
+ "dist/features/printMask.js",
121
+ "dist/features/printMaskDesigner.d.ts",
122
+ "dist/features/printMaskDesigner.js",
123
+ "dist/features/printMaskLoader.d.ts",
124
+ "dist/features/printMaskLoader.js",
125
+ "dist/features/watermark.d.ts",
126
+ "dist/features/watermark.js",
127
+ "dist/headless.d.ts",
128
+ "dist/headless.js",
129
+ "dist/i18n/messages.d.ts",
130
+ "dist/i18n/messages.de.d.ts",
131
+ "dist/i18n/messages.de.js",
132
+ "dist/i18n/messages.ja.d.ts",
133
+ "dist/i18n/messages.ja.js",
134
+ "dist/i18n/messages.js",
135
+ "dist/index.d.ts",
136
+ "dist/index.js",
137
+ "dist/lifecycle/facade.d.ts",
138
+ "dist/lifecycle/facade.js",
139
+ "dist/lifecycle/operations.d.ts",
140
+ "dist/lifecycle/operations.js",
141
+ "dist/output/canvasImage.d.ts",
142
+ "dist/output/canvasImage.js",
143
+ "dist/output/export.d.ts",
144
+ "dist/output/export.js",
145
+ "dist/output/printLayout.d.ts",
146
+ "dist/output/printLayout.js",
147
+ "dist/output/snapshotDownload.d.ts",
148
+ "dist/output/snapshotDownload.js",
149
+ "dist/platform/assets.d.ts",
150
+ "dist/platform/assets.js",
151
+ "dist/platform/copiedAssets.d.ts",
152
+ "dist/platform/copiedAssets.js",
153
+ "dist/platform/worker.d.ts",
154
+ "dist/platform/worker.js",
155
+ "dist/presentation/state.d.ts",
156
+ "dist/presentation/state.js",
157
+ "dist/print-mask.d.ts",
158
+ "dist/print-mask.js",
159
+ "dist/registry/capabilities.d.ts",
160
+ "dist/registry/capabilities.js",
161
+ "dist/registry/formats.d.ts",
162
+ "dist/registry/formats.generated.d.ts",
163
+ "dist/registry/formats.generated.js",
164
+ "dist/registry/formats.js",
165
+ "dist/registry/registry.d.ts",
166
+ "dist/registry/registry.js",
167
+ "dist/renderers/image.d.ts",
168
+ "dist/renderers/image.js",
169
+ "dist/renderers/index.d.ts",
170
+ "dist/renderers/index.js",
171
+ "dist/rendering/dispatcher.d.ts",
172
+ "dist/rendering/dispatcher.js",
173
+ "dist/rendering/handler.d.ts",
174
+ "dist/rendering/handler.js",
175
+ "dist/security/svgResources.d.ts",
176
+ "dist/security/svgResources.js",
177
+ "dist/source/index.d.ts",
178
+ "dist/source/index.js",
179
+ "dist/source/loading.d.ts",
180
+ "dist/source/loading.js",
181
+ "dist/source/precheck.d.ts",
182
+ "dist/source/precheck.js",
183
+ "dist/source/textEncoding.d.ts",
184
+ "dist/source/textEncoding.js",
185
+ "dist/viewer/createViewer.d.ts",
186
+ "dist/viewer/createViewer.js",
187
+ "dist/viewer/loading.d.ts",
188
+ "dist/viewer/loading.js",
189
+ "dist/viewer/operations.d.ts",
190
+ "dist/viewer/operations.js",
191
+ "dist/viewer/state.d.ts",
192
+ "dist/viewer/state.js",
84
193
  "headless.d.ts",
85
- "print-mask.js",
194
+ "headless.js",
195
+ "LICENSE",
86
196
  "print-mask.d.ts",
87
- "vendor",
88
- "README.md",
197
+ "print-mask.js",
89
198
  "README.en.md",
90
- "LICENSE"
199
+ "README.md"
91
200
  ],
92
201
  "dependencies": {
93
- "dompurify": "3.4.15"
94
- },
95
- "devDependencies": {
96
- "typescript": "^6.0.3"
202
+ "dompurify": "3.4.16"
97
203
  },
98
204
  "license": "Apache-2.0",
99
- "scripts": {
100
- "build": "node scripts/clean-dist.mjs && tsc -b tsconfig.json --force && node scripts/fix-core-esm-extensions.mjs",
101
- "type-check": "tsc -b tsconfig.json"
205
+ "fileViewer": {
206
+ "distribution": {
207
+ "schemaVersion": 1,
208
+ "mode": "runtime-only"
209
+ }
102
210
  }
103
- }
211
+ }