@file-viewer/web 2.0.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.
- package/LICENSE +160 -0
- package/README.en.md +164 -0
- package/README.md +164 -0
- package/dist/controller.d.ts +121 -0
- package/dist/controller.js +417 -0
- package/dist/flyfish-file-viewer-web.iife.js +12120 -0
- package/dist/global.d.ts +13 -0
- package/dist/global.js +10 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +14 -0
- package/dist/node.d.ts +71 -0
- package/dist/node.js +122 -0
- package/package.json +75 -0
- package/scripts/copy-assets.mjs +94 -0
- package/viewer/flyfish-viewer-assets.json +215 -0
- package/viewer/flyfish-viewer-manifest.json +6 -0
- package/viewer/vendor/docx/docx.worker.js +16879 -0
- package/viewer/vendor/libarchive/libarchive.wasm +0 -0
- package/viewer/vendor/libarchive/worker-bundle.js +6 -0
- package/viewer/vendor/xlsx/sheet.worker.js +20317 -0
- package/viewer/wasm/cad/dwfv-render.wasm +0 -0
- package/viewer/wasm/cad/dwg-worker.js +24 -0
- package/viewer/wasm/cad/libredwg-web.js +15 -0
- package/viewer/wasm/cad/libredwg-web.wasm +0 -0
package/dist/global.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createViewerControllerHandle, mountViewer } from './index';
|
|
2
|
+
declare const FlyfishFileViewerWeb: {
|
|
3
|
+
createViewerControllerHandle: (getController: import("./controller").ViewerControllerAccessor, dispose: () => void) => import("./controller").ViewerControllerHandle;
|
|
4
|
+
mountViewer: (container: HTMLElement, initialOptions?: import("./controller").ViewerMountOptions, coreOptions?: import("./controller").ViewerCoreOptions) => import("./controller").ViewerController;
|
|
5
|
+
};
|
|
6
|
+
type FlyfishFileViewerWebGlobal = typeof FlyfishFileViewerWeb;
|
|
7
|
+
declare global {
|
|
8
|
+
interface Window {
|
|
9
|
+
FlyfishFileViewerWeb?: FlyfishFileViewerWebGlobal;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export { createViewerControllerHandle, mountViewer };
|
|
13
|
+
export default FlyfishFileViewerWeb;
|
package/dist/global.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createViewerControllerHandle, mountViewer } from './index';
|
|
2
|
+
const FlyfishFileViewerWeb = {
|
|
3
|
+
createViewerControllerHandle,
|
|
4
|
+
mountViewer
|
|
5
|
+
};
|
|
6
|
+
if (typeof window !== 'undefined') {
|
|
7
|
+
window.FlyfishFileViewerWeb = FlyfishFileViewerWeb;
|
|
8
|
+
}
|
|
9
|
+
export { createViewerControllerHandle, mountViewer };
|
|
10
|
+
export default FlyfishFileViewerWeb;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createViewerControllerHandle, type ViewerController, type ViewerMountOptions, type ViewerCoreOptions } from './controller.js';
|
|
2
|
+
export declare const mountViewer: (container: HTMLElement, initialOptions?: ViewerMountOptions, coreOptions?: ViewerCoreOptions) => ViewerController;
|
|
3
|
+
declare const FlyfishFileViewerWeb: {
|
|
4
|
+
createViewerControllerHandle: (getController: import("./controller.js").ViewerControllerAccessor, dispose: () => void) => import("./controller.js").ViewerControllerHandle;
|
|
5
|
+
mountViewer: (container: HTMLElement, initialOptions?: ViewerMountOptions, coreOptions?: ViewerCoreOptions) => ViewerController;
|
|
6
|
+
};
|
|
7
|
+
export { createViewerControllerHandle };
|
|
8
|
+
export type { FileRef, ViewerAiOptions, ViewerArchiveOptions, ViewerCadOptions, ViewerController, ViewerControllerAccessor, ViewerControllerHandle, ViewerDocxOptions, ViewerEvent, ViewerEventHandler, ViewerEventType, ViewerFetchFile, ViewerFetchInput, ViewerMountOptions, ViewerOptions, ViewerPdfOptions, ViewerSpreadsheetOptions, ViewerCoreOptions, ViewerSearchOptions, ViewerSourceInput, ViewerThemeMode, ViewerToolbarOptions, ViewerToolbarPosition, ViewerTypstOptions, ViewerWatermarkOptions, ViewerLifecycleContext, ViewerOperationContext, ViewerState, ViewerStateListener, } from './controller.js';
|
|
9
|
+
export default FlyfishFileViewerWeb;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createViewerControllerHandle, mountViewer as mountCoreViewer, } from './controller.js';
|
|
2
|
+
import { fileViewerCoreRendererRegistry } from '@file-viewer/core';
|
|
3
|
+
export const mountViewer = (container, initialOptions = {}, coreOptions = {}) => {
|
|
4
|
+
return mountCoreViewer(container, initialOptions, {
|
|
5
|
+
registry: fileViewerCoreRendererRegistry,
|
|
6
|
+
...coreOptions,
|
|
7
|
+
});
|
|
8
|
+
};
|
|
9
|
+
const FlyfishFileViewerWeb = {
|
|
10
|
+
createViewerControllerHandle,
|
|
11
|
+
mountViewer,
|
|
12
|
+
};
|
|
13
|
+
export { createViewerControllerHandle };
|
|
14
|
+
export default FlyfishFileViewerWeb;
|
package/dist/node.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { type FileViewerRendererAssetDefinition, type FileViewerRendererAssetManifest } from '@file-viewer/core/assets';
|
|
2
|
+
export interface CopyViewerAssetsOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Target static directory. Defaults to the host project's `public/file-viewer`.
|
|
5
|
+
*/
|
|
6
|
+
targetDir?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Override the bundled viewer source directory, mainly for tests and release tooling.
|
|
9
|
+
*/
|
|
10
|
+
sourceDir?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Whether to clear the target directory before copying. Defaults to true.
|
|
13
|
+
*/
|
|
14
|
+
clean?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface ValidateViewerAssetsOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Viewer static directory. Defaults to this package's bundled `viewer/`.
|
|
19
|
+
*/
|
|
20
|
+
sourceDir?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ViewerAssetValidationItem {
|
|
23
|
+
id: string;
|
|
24
|
+
rendererId: string;
|
|
25
|
+
kind: FileViewerRendererAssetDefinition['kind'];
|
|
26
|
+
target: FileViewerRendererAssetDefinition['target'];
|
|
27
|
+
required: boolean;
|
|
28
|
+
relativePath: string;
|
|
29
|
+
absolutePath: string;
|
|
30
|
+
exists: boolean;
|
|
31
|
+
description: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ViewerAssetValidationResult {
|
|
34
|
+
sourceDir: string;
|
|
35
|
+
valid: boolean;
|
|
36
|
+
checkedAt: string;
|
|
37
|
+
assets: ViewerAssetValidationItem[];
|
|
38
|
+
missingRequired: ViewerAssetValidationItem[];
|
|
39
|
+
missingOptional: ViewerAssetValidationItem[];
|
|
40
|
+
}
|
|
41
|
+
export type ViewerAssetManifestValidationItem = Omit<ViewerAssetValidationItem, 'absolutePath'>;
|
|
42
|
+
export interface ViewerAssetManifestValidationResult {
|
|
43
|
+
valid: boolean;
|
|
44
|
+
checkedAt: string;
|
|
45
|
+
assets: ViewerAssetManifestValidationItem[];
|
|
46
|
+
missingRequired: ViewerAssetManifestValidationItem[];
|
|
47
|
+
missingOptional: ViewerAssetManifestValidationItem[];
|
|
48
|
+
}
|
|
49
|
+
export interface ViewerAssetManifestFile {
|
|
50
|
+
schemaVersion: 1;
|
|
51
|
+
generatedAt: string;
|
|
52
|
+
rendererAssetManifests: FileViewerRendererAssetManifest[];
|
|
53
|
+
validation: ViewerAssetManifestValidationResult;
|
|
54
|
+
}
|
|
55
|
+
export interface CopyViewerAssetsResult {
|
|
56
|
+
sourceDir: string;
|
|
57
|
+
targetDir: string;
|
|
58
|
+
assetBaseUrl: string;
|
|
59
|
+
assetManifestPath: string;
|
|
60
|
+
validation: ViewerAssetValidationResult;
|
|
61
|
+
}
|
|
62
|
+
export declare const DEFAULT_VIEWER_PUBLIC_DIR = "public/file-viewer";
|
|
63
|
+
export declare const DEFAULT_VIEWER_ASSET_BASE_URL = "/file-viewer/";
|
|
64
|
+
export declare const VIEWER_ASSET_MANIFEST_FILENAME = "flyfish-viewer-assets.json";
|
|
65
|
+
export declare const getViewerAssetDir: () => string;
|
|
66
|
+
export declare const getDefaultViewerTargetDir: () => string;
|
|
67
|
+
export declare const validateViewerAssets: (options?: ValidateViewerAssetsOptions) => Promise<ViewerAssetValidationResult>;
|
|
68
|
+
export declare const toViewerAssetManifestValidation: (validation: ViewerAssetValidationResult) => ViewerAssetManifestValidationResult;
|
|
69
|
+
export declare const buildViewerAssetManifest: (validation: ViewerAssetValidationResult) => ViewerAssetManifestFile;
|
|
70
|
+
export declare const writeViewerAssetManifest: (targetDir: string, manifest: ViewerAssetManifestFile) => Promise<string>;
|
|
71
|
+
export declare const copyViewerAssets: (options?: CopyViewerAssetsOptions) => Promise<CopyViewerAssetsResult>;
|
package/dist/node.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { cp, mkdir, readdir, rm, stat, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { dirname, resolve } from 'node:path';
|
|
5
|
+
import { listFileViewerRendererAssetManifests } from '@file-viewer/core/assets';
|
|
6
|
+
const distDir = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const packageDir = resolve(distDir, '..');
|
|
8
|
+
export const DEFAULT_VIEWER_PUBLIC_DIR = 'public/file-viewer';
|
|
9
|
+
export const DEFAULT_VIEWER_ASSET_BASE_URL = '/file-viewer/';
|
|
10
|
+
export const VIEWER_ASSET_MANIFEST_FILENAME = 'flyfish-viewer-assets.json';
|
|
11
|
+
export const getViewerAssetDir = () => resolve(packageDir, 'viewer');
|
|
12
|
+
export const getDefaultViewerTargetDir = () => {
|
|
13
|
+
return resolve(process.env.INIT_CWD || process.cwd(), DEFAULT_VIEWER_PUBLIC_DIR);
|
|
14
|
+
};
|
|
15
|
+
const removeMacMetadata = async (dir) => {
|
|
16
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
17
|
+
await Promise.all(entries.map(entry => {
|
|
18
|
+
const path = resolve(dir, entry.name);
|
|
19
|
+
if (entry.name === '.DS_Store') {
|
|
20
|
+
return rm(path, { force: true });
|
|
21
|
+
}
|
|
22
|
+
if (entry.isDirectory()) {
|
|
23
|
+
return removeMacMetadata(path);
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}));
|
|
27
|
+
};
|
|
28
|
+
const isExpectedAssetKind = (asset, pathStat) => {
|
|
29
|
+
return asset.kind === 'wasm-directory' ? pathStat.isDirectory() : pathStat.isFile();
|
|
30
|
+
};
|
|
31
|
+
export const validateViewerAssets = async (options = {}) => {
|
|
32
|
+
const sourceDir = resolve(options.sourceDir || getViewerAssetDir());
|
|
33
|
+
const assets = await Promise.all(listFileViewerRendererAssetManifests()
|
|
34
|
+
.flatMap(manifest => manifest.assets)
|
|
35
|
+
.filter(asset => asset.target === 'public' && asset.defaultPath)
|
|
36
|
+
.map(async (asset) => {
|
|
37
|
+
const relativePath = asset.defaultPath || '';
|
|
38
|
+
const absolutePath = resolve(sourceDir, relativePath);
|
|
39
|
+
let exists = false;
|
|
40
|
+
try {
|
|
41
|
+
exists = isExpectedAssetKind(asset, await stat(absolutePath));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
exists = false;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
id: asset.id,
|
|
48
|
+
rendererId: asset.rendererId,
|
|
49
|
+
kind: asset.kind,
|
|
50
|
+
target: asset.target,
|
|
51
|
+
required: asset.required,
|
|
52
|
+
relativePath,
|
|
53
|
+
absolutePath,
|
|
54
|
+
exists,
|
|
55
|
+
description: asset.description
|
|
56
|
+
};
|
|
57
|
+
}));
|
|
58
|
+
const missingRequired = assets.filter(asset => asset.required && !asset.exists);
|
|
59
|
+
const missingOptional = assets.filter(asset => !asset.required && !asset.exists);
|
|
60
|
+
return {
|
|
61
|
+
sourceDir,
|
|
62
|
+
valid: missingRequired.length === 0,
|
|
63
|
+
checkedAt: new Date().toISOString(),
|
|
64
|
+
assets,
|
|
65
|
+
missingRequired,
|
|
66
|
+
missingOptional
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
const toViewerAssetManifestValidationItem = (item) => {
|
|
70
|
+
const { absolutePath: _absolutePath, ...manifestItem } = item;
|
|
71
|
+
return manifestItem;
|
|
72
|
+
};
|
|
73
|
+
export const toViewerAssetManifestValidation = (validation) => {
|
|
74
|
+
return {
|
|
75
|
+
valid: validation.valid,
|
|
76
|
+
checkedAt: validation.checkedAt,
|
|
77
|
+
assets: validation.assets.map(toViewerAssetManifestValidationItem),
|
|
78
|
+
missingRequired: validation.missingRequired.map(toViewerAssetManifestValidationItem),
|
|
79
|
+
missingOptional: validation.missingOptional.map(toViewerAssetManifestValidationItem)
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
export const buildViewerAssetManifest = (validation) => {
|
|
83
|
+
return {
|
|
84
|
+
schemaVersion: 1,
|
|
85
|
+
generatedAt: new Date().toISOString(),
|
|
86
|
+
rendererAssetManifests: listFileViewerRendererAssetManifests(),
|
|
87
|
+
validation: toViewerAssetManifestValidation(validation)
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
export const writeViewerAssetManifest = async (targetDir, manifest) => {
|
|
91
|
+
const assetManifestPath = resolve(targetDir, VIEWER_ASSET_MANIFEST_FILENAME);
|
|
92
|
+
await writeFile(assetManifestPath, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
|
|
93
|
+
return assetManifestPath;
|
|
94
|
+
};
|
|
95
|
+
export const copyViewerAssets = async (options = {}) => {
|
|
96
|
+
const sourceDir = resolve(options.sourceDir || getViewerAssetDir());
|
|
97
|
+
const targetDir = resolve(options.targetDir || getDefaultViewerTargetDir());
|
|
98
|
+
if (!existsSync(sourceDir)) {
|
|
99
|
+
throw new Error(`Missing viewer asset output: ${sourceDir}`);
|
|
100
|
+
}
|
|
101
|
+
if (options.clean !== false) {
|
|
102
|
+
await rm(targetDir, { force: true, recursive: true });
|
|
103
|
+
}
|
|
104
|
+
await mkdir(targetDir, { recursive: true });
|
|
105
|
+
await cp(sourceDir, targetDir, { recursive: true });
|
|
106
|
+
await removeMacMetadata(targetDir);
|
|
107
|
+
const validation = await validateViewerAssets({ sourceDir: targetDir });
|
|
108
|
+
const assetManifestPath = await writeViewerAssetManifest(targetDir, buildViewerAssetManifest(validation));
|
|
109
|
+
if (!validation.valid) {
|
|
110
|
+
const missing = validation.missingRequired
|
|
111
|
+
.map(asset => `${asset.rendererId}:${asset.relativePath}`)
|
|
112
|
+
.join(', ');
|
|
113
|
+
throw new Error(`Viewer static assets are missing required resources: ${missing}`);
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
sourceDir,
|
|
117
|
+
targetDir,
|
|
118
|
+
assetBaseUrl: DEFAULT_VIEWER_ASSET_BASE_URL,
|
|
119
|
+
assetManifestPath,
|
|
120
|
+
validation
|
|
121
|
+
};
|
|
122
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@file-viewer/web",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "Standard pure web component package for Flyfish File Viewer",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"file-viewer",
|
|
9
|
+
"document-preview",
|
|
10
|
+
"native-viewer",
|
|
11
|
+
"vanilla-js",
|
|
12
|
+
"web"
|
|
13
|
+
],
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public",
|
|
16
|
+
"registry": "https://registry.npmjs.org/"
|
|
17
|
+
},
|
|
18
|
+
"author": {
|
|
19
|
+
"name": "Wangyu",
|
|
20
|
+
"email": "wybaby168@gmail.com"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/flyfish-dev/file-viewer-web.git",
|
|
25
|
+
"directory": "packages/components/web"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://doc.flyfish-viewer.app/",
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/flyfish-dev/file-viewer-web/issues"
|
|
30
|
+
},
|
|
31
|
+
"main": "./dist/index.js",
|
|
32
|
+
"module": "./dist/index.js",
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"unpkg": "./dist/flyfish-file-viewer-web.iife.js",
|
|
35
|
+
"jsdelivr": "./dist/flyfish-file-viewer-web.iife.js",
|
|
36
|
+
"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"types": "./dist/index.d.ts",
|
|
39
|
+
"import": "./dist/index.js",
|
|
40
|
+
"default": "./dist/index.js"
|
|
41
|
+
},
|
|
42
|
+
"./node": {
|
|
43
|
+
"types": "./dist/node.d.ts",
|
|
44
|
+
"import": "./dist/node.js",
|
|
45
|
+
"default": "./dist/node.js"
|
|
46
|
+
},
|
|
47
|
+
"./viewer/*": "./viewer/*",
|
|
48
|
+
"./package.json": "./package.json"
|
|
49
|
+
},
|
|
50
|
+
"bin": {
|
|
51
|
+
"file-viewer-copy-assets": "./scripts/copy-assets.mjs"
|
|
52
|
+
},
|
|
53
|
+
"files": [
|
|
54
|
+
"dist",
|
|
55
|
+
"scripts/copy-assets.mjs",
|
|
56
|
+
"viewer",
|
|
57
|
+
"README.md",
|
|
58
|
+
"README.en.md"
|
|
59
|
+
],
|
|
60
|
+
"dependencies": {
|
|
61
|
+
"@file-viewer/core": "^2.0.0"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@types/node": "^25.8.0",
|
|
65
|
+
"esbuild": "^0.27.2",
|
|
66
|
+
"typescript": "^6.0.3",
|
|
67
|
+
"vite": "^8.0.16"
|
|
68
|
+
},
|
|
69
|
+
"license": "Apache-2.0",
|
|
70
|
+
"scripts": {
|
|
71
|
+
"build": "tsc -b tsconfig.json && node scripts/build-iife.mjs",
|
|
72
|
+
"postinstall": "node ./scripts/copy-assets.mjs --postinstall",
|
|
73
|
+
"type-check": "tsc -b tsconfig.json"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { cp, mkdir, readdir, rm } from 'node:fs/promises'
|
|
3
|
+
import { existsSync } from 'node:fs'
|
|
4
|
+
import { dirname, resolve } from 'node:path'
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
6
|
+
|
|
7
|
+
const scriptFile = fileURLToPath(import.meta.url)
|
|
8
|
+
const packageDir = resolve(dirname(scriptFile), '..')
|
|
9
|
+
const sourceDir = resolve(packageDir, 'viewer')
|
|
10
|
+
const isPostinstall = process.argv.includes('--postinstall')
|
|
11
|
+
const explicitTarget = process.argv.slice(2).find(arg => !arg.startsWith('--'))
|
|
12
|
+
const targetDir = resolve(
|
|
13
|
+
process.env.FILE_VIEWER_PUBLIC_DIR ||
|
|
14
|
+
explicitTarget ||
|
|
15
|
+
resolve(process.env.INIT_CWD || process.cwd(), 'public/file-viewer')
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
const skip = process.env.FILE_VIEWER_SKIP_ASSET_COPY === '1' ||
|
|
19
|
+
process.env.FILE_VIEWER_SKIP_ASSET_COPY === 'true'
|
|
20
|
+
|
|
21
|
+
if (skip) {
|
|
22
|
+
process.exit(0)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Workspace installs should not mutate the repository automatically.
|
|
26
|
+
if (isPostinstall && !packageDir.includes('node_modules')) {
|
|
27
|
+
process.exit(0)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (!existsSync(sourceDir)) {
|
|
31
|
+
const message = `[file-viewer-web] Missing viewer asset output: ${sourceDir}`
|
|
32
|
+
if (isPostinstall) {
|
|
33
|
+
console.warn(message)
|
|
34
|
+
process.exit(0)
|
|
35
|
+
}
|
|
36
|
+
console.error(message)
|
|
37
|
+
process.exit(1)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const removeMacMetadata = async dir => {
|
|
41
|
+
const entries = await readdir(dir, { withFileTypes: true })
|
|
42
|
+
await Promise.all(entries.map(entry => {
|
|
43
|
+
const path = resolve(dir, entry.name)
|
|
44
|
+
if (entry.name === '.DS_Store') {
|
|
45
|
+
return rm(path, { force: true })
|
|
46
|
+
}
|
|
47
|
+
if (entry.isDirectory()) {
|
|
48
|
+
return removeMacMetadata(path)
|
|
49
|
+
}
|
|
50
|
+
return undefined
|
|
51
|
+
}))
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const copyWithBuiltHelper = async () => {
|
|
55
|
+
const helperPath = resolve(packageDir, 'dist/node.js')
|
|
56
|
+
if (!existsSync(helperPath)) {
|
|
57
|
+
return false
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const { copyViewerAssets } = await import(pathToFileURL(helperPath).href)
|
|
61
|
+
const result = await copyViewerAssets({ sourceDir, targetDir })
|
|
62
|
+
if (result.validation?.missingOptional?.length) {
|
|
63
|
+
console.warn(
|
|
64
|
+
`[file-viewer-web] optional viewer assets missing: ${
|
|
65
|
+
result.validation.missingOptional.map(asset => asset.relativePath).join(', ')
|
|
66
|
+
}`
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
console.log(`[file-viewer-web] viewer assets copied to ${result.targetDir}`)
|
|
70
|
+
console.log(`[file-viewer-web] viewer asset manifest written to ${result.assetManifestPath}`)
|
|
71
|
+
return true
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const copyWithFallback = async () => {
|
|
75
|
+
await rm(targetDir, { force: true, recursive: true })
|
|
76
|
+
await mkdir(targetDir, { recursive: true })
|
|
77
|
+
await cp(sourceDir, targetDir, { recursive: true })
|
|
78
|
+
await removeMacMetadata(targetDir)
|
|
79
|
+
console.log(`[file-viewer-web] viewer assets copied to ${targetDir}`)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
if (!await copyWithBuiltHelper()) {
|
|
84
|
+
await copyWithFallback()
|
|
85
|
+
}
|
|
86
|
+
} catch (reason) {
|
|
87
|
+
const message = reason instanceof Error ? reason.message : String(reason)
|
|
88
|
+
if (isPostinstall) {
|
|
89
|
+
console.warn(`[file-viewer-web] viewer asset copy skipped: ${message}`)
|
|
90
|
+
process.exit(0)
|
|
91
|
+
}
|
|
92
|
+
console.error(`[file-viewer-web] viewer asset copy failed: ${message}`)
|
|
93
|
+
process.exit(1)
|
|
94
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"generatedAt": "2026-06-19T08:28:09.627Z",
|
|
4
|
+
"rendererAssetManifests": [
|
|
5
|
+
{
|
|
6
|
+
"rendererId": "archive",
|
|
7
|
+
"assets": [
|
|
8
|
+
{
|
|
9
|
+
"id": "libarchive-worker",
|
|
10
|
+
"rendererId": "archive",
|
|
11
|
+
"kind": "worker",
|
|
12
|
+
"target": "public",
|
|
13
|
+
"required": false,
|
|
14
|
+
"defaultPath": "vendor/libarchive/worker-bundle.js",
|
|
15
|
+
"optionPath": "archive.workerUrl",
|
|
16
|
+
"description": "libarchive.js module worker used for broad archive format parsing."
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "libarchive-wasm",
|
|
20
|
+
"rendererId": "archive",
|
|
21
|
+
"kind": "wasm",
|
|
22
|
+
"target": "public",
|
|
23
|
+
"required": false,
|
|
24
|
+
"defaultPath": "vendor/libarchive/libarchive.wasm",
|
|
25
|
+
"optionPath": "archive.wasmUrl",
|
|
26
|
+
"description": "libarchive.js WebAssembly module expected next to the public worker."
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"rendererId": "cad",
|
|
32
|
+
"assets": [
|
|
33
|
+
{
|
|
34
|
+
"id": "cad-wasm-directory",
|
|
35
|
+
"rendererId": "cad",
|
|
36
|
+
"kind": "wasm-directory",
|
|
37
|
+
"target": "public",
|
|
38
|
+
"required": true,
|
|
39
|
+
"defaultPath": "wasm/cad/",
|
|
40
|
+
"optionPath": "cad.wasmPath",
|
|
41
|
+
"description": "@flyfish-dev/cad-viewer WebAssembly directory for DWG/DXF helpers."
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "cad-dwg-worker",
|
|
45
|
+
"rendererId": "cad",
|
|
46
|
+
"kind": "worker",
|
|
47
|
+
"target": "public",
|
|
48
|
+
"required": true,
|
|
49
|
+
"defaultPath": "wasm/cad/dwg-worker.js",
|
|
50
|
+
"optionPath": "cad.workerUrl",
|
|
51
|
+
"description": "DWG worker entry used by @flyfish-dev/cad-viewer."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "cad-dwf-wasm",
|
|
55
|
+
"rendererId": "cad",
|
|
56
|
+
"kind": "wasm",
|
|
57
|
+
"target": "public",
|
|
58
|
+
"required": true,
|
|
59
|
+
"defaultPath": "wasm/cad/dwfv-render.wasm",
|
|
60
|
+
"optionPath": "cad.dwfWasmUrl",
|
|
61
|
+
"description": "DWF/DWFx/XPS raster WebAssembly module used by @flyfish-dev/cad-viewer."
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"rendererId": "office-word-openxml",
|
|
67
|
+
"assets": [
|
|
68
|
+
{
|
|
69
|
+
"id": "docx-worker",
|
|
70
|
+
"rendererId": "office-word-openxml",
|
|
71
|
+
"kind": "worker",
|
|
72
|
+
"target": "public",
|
|
73
|
+
"required": false,
|
|
74
|
+
"defaultPath": "vendor/docx/docx.worker.js",
|
|
75
|
+
"optionPath": "docx.workerUrl",
|
|
76
|
+
"description": "Optional DOCX worker for off-main-thread docx-preview parsing and HTML assembly."
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"rendererId": "spreadsheet-openxml",
|
|
82
|
+
"assets": [
|
|
83
|
+
{
|
|
84
|
+
"id": "spreadsheet-worker",
|
|
85
|
+
"rendererId": "spreadsheet-openxml",
|
|
86
|
+
"kind": "worker",
|
|
87
|
+
"target": "public",
|
|
88
|
+
"required": false,
|
|
89
|
+
"defaultPath": "vendor/xlsx/sheet.worker.js",
|
|
90
|
+
"optionPath": "spreadsheet.workerUrl",
|
|
91
|
+
"description": "Optional Spreadsheet worker for off-main-thread styled-exceljs workbook parsing."
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"rendererId": "typst",
|
|
97
|
+
"assets": [
|
|
98
|
+
{
|
|
99
|
+
"id": "typst-compiler-wasm",
|
|
100
|
+
"rendererId": "typst",
|
|
101
|
+
"kind": "wasm",
|
|
102
|
+
"target": "external",
|
|
103
|
+
"required": true,
|
|
104
|
+
"defaultUrl": "https://cdn.jsdelivr.net/npm/@myriaddreamin/typst-ts-web-compiler@0.7.0/pkg/typst_ts_web_compiler_bg.wasm",
|
|
105
|
+
"optionPath": "typst.compilerWasmUrl",
|
|
106
|
+
"description": "Typst compiler WebAssembly module; configurable for private CDN deployment."
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"id": "typst-renderer-wasm",
|
|
110
|
+
"rendererId": "typst",
|
|
111
|
+
"kind": "bundled-wasm",
|
|
112
|
+
"target": "bundled",
|
|
113
|
+
"required": true,
|
|
114
|
+
"defaultUrl": "https://cdn.jsdelivr.net/npm/@myriaddreamin/typst-ts-renderer@0.7.0/pkg/typst_ts_renderer_bg.wasm",
|
|
115
|
+
"packagePath": "@myriaddreamin/typst-ts-renderer/pkg/typst_ts_renderer_bg.wasm",
|
|
116
|
+
"optionPath": "typst.rendererWasmUrl",
|
|
117
|
+
"description": "Typst SVG renderer WebAssembly module bundled by the active frontend build tool."
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"rendererId": "data-asset",
|
|
123
|
+
"assets": [
|
|
124
|
+
{
|
|
125
|
+
"id": "data-sql-wasm",
|
|
126
|
+
"rendererId": "data-asset",
|
|
127
|
+
"kind": "wasm",
|
|
128
|
+
"target": "external",
|
|
129
|
+
"required": false,
|
|
130
|
+
"defaultUrl": "https://cdn.jsdelivr.net/npm/sql.js@1.14.1/dist/sql-wasm.wasm",
|
|
131
|
+
"optionPath": "data.sqlWasmUrl",
|
|
132
|
+
"description": "sql.js WebAssembly module used when previewing SQLite files."
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
],
|
|
137
|
+
"validation": {
|
|
138
|
+
"valid": true,
|
|
139
|
+
"checkedAt": "2026-06-19T08:28:09.627Z",
|
|
140
|
+
"assets": [
|
|
141
|
+
{
|
|
142
|
+
"id": "libarchive-worker",
|
|
143
|
+
"rendererId": "archive",
|
|
144
|
+
"kind": "worker",
|
|
145
|
+
"target": "public",
|
|
146
|
+
"required": false,
|
|
147
|
+
"relativePath": "vendor/libarchive/worker-bundle.js",
|
|
148
|
+
"exists": true,
|
|
149
|
+
"description": "libarchive.js module worker used for broad archive format parsing."
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"id": "libarchive-wasm",
|
|
153
|
+
"rendererId": "archive",
|
|
154
|
+
"kind": "wasm",
|
|
155
|
+
"target": "public",
|
|
156
|
+
"required": false,
|
|
157
|
+
"relativePath": "vendor/libarchive/libarchive.wasm",
|
|
158
|
+
"exists": true,
|
|
159
|
+
"description": "libarchive.js WebAssembly module expected next to the public worker."
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"id": "cad-wasm-directory",
|
|
163
|
+
"rendererId": "cad",
|
|
164
|
+
"kind": "wasm-directory",
|
|
165
|
+
"target": "public",
|
|
166
|
+
"required": true,
|
|
167
|
+
"relativePath": "wasm/cad/",
|
|
168
|
+
"exists": true,
|
|
169
|
+
"description": "@flyfish-dev/cad-viewer WebAssembly directory for DWG/DXF helpers."
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": "cad-dwg-worker",
|
|
173
|
+
"rendererId": "cad",
|
|
174
|
+
"kind": "worker",
|
|
175
|
+
"target": "public",
|
|
176
|
+
"required": true,
|
|
177
|
+
"relativePath": "wasm/cad/dwg-worker.js",
|
|
178
|
+
"exists": true,
|
|
179
|
+
"description": "DWG worker entry used by @flyfish-dev/cad-viewer."
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"id": "cad-dwf-wasm",
|
|
183
|
+
"rendererId": "cad",
|
|
184
|
+
"kind": "wasm",
|
|
185
|
+
"target": "public",
|
|
186
|
+
"required": true,
|
|
187
|
+
"relativePath": "wasm/cad/dwfv-render.wasm",
|
|
188
|
+
"exists": true,
|
|
189
|
+
"description": "DWF/DWFx/XPS raster WebAssembly module used by @flyfish-dev/cad-viewer."
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"id": "docx-worker",
|
|
193
|
+
"rendererId": "office-word-openxml",
|
|
194
|
+
"kind": "worker",
|
|
195
|
+
"target": "public",
|
|
196
|
+
"required": false,
|
|
197
|
+
"relativePath": "vendor/docx/docx.worker.js",
|
|
198
|
+
"exists": true,
|
|
199
|
+
"description": "Optional DOCX worker for off-main-thread docx-preview parsing and HTML assembly."
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"id": "spreadsheet-worker",
|
|
203
|
+
"rendererId": "spreadsheet-openxml",
|
|
204
|
+
"kind": "worker",
|
|
205
|
+
"target": "public",
|
|
206
|
+
"required": false,
|
|
207
|
+
"relativePath": "vendor/xlsx/sheet.worker.js",
|
|
208
|
+
"exists": true,
|
|
209
|
+
"description": "Optional Spreadsheet worker for off-main-thread styled-exceljs workbook parsing."
|
|
210
|
+
}
|
|
211
|
+
],
|
|
212
|
+
"missingRequired": [],
|
|
213
|
+
"missingOptional": []
|
|
214
|
+
}
|
|
215
|
+
}
|