@quillmark/registry 0.8.0 → 0.10.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/dist/bundle.d.ts +7 -9
- package/dist/bundle.d.ts.map +1 -1
- package/dist/bundle.js +25 -64
- package/dist/bundle.js.map +1 -1
- package/dist/sources/file-system-source.d.ts +3 -3
- package/dist/sources/file-system-source.d.ts.map +1 -1
- package/dist/sources/file-system-source.js +5 -9
- package/dist/sources/file-system-source.js.map +1 -1
- package/dist/sources/http-source.d.ts +1 -1
- package/dist/sources/http-source.d.ts.map +1 -1
- package/dist/sources/http-source.js +5 -7
- package/dist/sources/http-source.js.map +1 -1
- package/package.json +3 -4
package/dist/bundle.d.ts
CHANGED
|
@@ -1,23 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Zip archive packing/unpacking for bundling quill files.
|
|
3
3
|
*
|
|
4
|
-
* Uses
|
|
5
|
-
* Packing is deterministic: paths are sorted lexicographically
|
|
6
|
-
* and all metadata (uid, gid, mtime) is fixed.
|
|
4
|
+
* Uses fflate for lightweight, cross-platform zip support.
|
|
5
|
+
* Packing is deterministic: paths are sorted lexicographically.
|
|
7
6
|
*/
|
|
8
7
|
/**
|
|
9
|
-
* Creates a
|
|
10
|
-
* Entries are sorted lexicographically
|
|
8
|
+
* Creates a zip archive directly from a directory on disk.
|
|
9
|
+
* Entries are sorted lexicographically for deterministic output.
|
|
11
10
|
*/
|
|
12
11
|
export declare function packDirectory(dirPath: string, fileList: string[]): Promise<Uint8Array>;
|
|
13
12
|
/**
|
|
14
|
-
* Packs a flat file map into a
|
|
15
|
-
* Files are written to a temporary directory, then archived.
|
|
13
|
+
* Packs a flat file map into a zip archive.
|
|
16
14
|
* Paths are sorted lexicographically for deterministic output.
|
|
17
15
|
*/
|
|
18
16
|
export declare function packFiles(files: Record<string, Uint8Array>): Promise<Uint8Array>;
|
|
19
17
|
/**
|
|
20
|
-
* Unpacks a
|
|
18
|
+
* Unpacks a zip archive into a flat file map.
|
|
21
19
|
*/
|
|
22
20
|
export declare function unpackFiles(data: Uint8Array): Promise<Record<string, Uint8Array>>;
|
|
23
21
|
//# sourceMappingURL=bundle.d.ts.map
|
package/dist/bundle.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ5F;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAOtF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAEvF"}
|
package/dist/bundle.js
CHANGED
|
@@ -1,86 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Zip archive packing/unpacking for bundling quill files.
|
|
3
3
|
*
|
|
4
|
-
* Uses
|
|
5
|
-
* Packing is deterministic: paths are sorted lexicographically
|
|
6
|
-
* and all metadata (uid, gid, mtime) is fixed.
|
|
4
|
+
* Uses fflate for lightweight, cross-platform zip support.
|
|
5
|
+
* Packing is deterministic: paths are sorted lexicographically.
|
|
7
6
|
*/
|
|
8
|
-
import {
|
|
7
|
+
import { zipSync, unzipSync } from 'fflate';
|
|
9
8
|
import * as fs from 'node:fs/promises';
|
|
10
|
-
import * as os from 'node:os';
|
|
11
9
|
import * as path from 'node:path';
|
|
12
|
-
/** Collects all chunks from an async iterable into a single Uint8Array. */
|
|
13
|
-
async function collectStream(stream) {
|
|
14
|
-
const chunks = [];
|
|
15
|
-
for await (const chunk of stream) {
|
|
16
|
-
chunks.push(Buffer.from(chunk));
|
|
17
|
-
}
|
|
18
|
-
return new Uint8Array(Buffer.concat(chunks));
|
|
19
|
-
}
|
|
20
10
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
11
|
+
* Fixed date for deterministic zip output (DOS date minimum: 1980-01-01).
|
|
12
|
+
* Constructed via local-time components so that fflate's getFullYear() etc.
|
|
13
|
+
* always return 1980-01-01 00:00:00 regardless of the host timezone.
|
|
14
|
+
*/
|
|
15
|
+
const ZIP_EPOCH = new Date(1980, 0, 1);
|
|
16
|
+
/**
|
|
17
|
+
* Creates a zip archive directly from a directory on disk.
|
|
18
|
+
* Entries are sorted lexicographically for deterministic output.
|
|
23
19
|
*/
|
|
24
20
|
export async function packDirectory(dirPath, fileList) {
|
|
25
21
|
const sorted = [...fileList].sort();
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
const entries = {};
|
|
23
|
+
for (const filePath of sorted) {
|
|
24
|
+
const fullPath = path.join(dirPath, filePath);
|
|
25
|
+
entries[filePath] = new Uint8Array(await fs.readFile(fullPath));
|
|
29
26
|
}
|
|
30
|
-
|
|
31
|
-
cwd: dirPath,
|
|
32
|
-
portable: true,
|
|
33
|
-
mtime: new Date(0),
|
|
34
|
-
}, sorted);
|
|
35
|
-
return collectStream(stream);
|
|
27
|
+
return zipSync(entries, { level: 0, mtime: ZIP_EPOCH });
|
|
36
28
|
}
|
|
37
29
|
/**
|
|
38
|
-
* Packs a flat file map into a
|
|
39
|
-
* Files are written to a temporary directory, then archived.
|
|
30
|
+
* Packs a flat file map into a zip archive.
|
|
40
31
|
* Paths are sorted lexicographically for deterministic output.
|
|
41
32
|
*/
|
|
42
33
|
export async function packFiles(files) {
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const fullPath = path.resolve(tmpDir, ...filePath.split('/'));
|
|
48
|
-
if (!fullPath.startsWith(tmpDir + path.sep) && fullPath !== tmpDir) {
|
|
49
|
-
throw new Error(`Path traversal detected: "${filePath}"`);
|
|
50
|
-
}
|
|
51
|
-
await fs.mkdir(path.dirname(fullPath), { recursive: true });
|
|
52
|
-
await fs.writeFile(fullPath, files[filePath]);
|
|
53
|
-
}
|
|
54
|
-
return packDirectory(tmpDir, sortedPaths);
|
|
55
|
-
}
|
|
56
|
-
finally {
|
|
57
|
-
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
34
|
+
const sorted = Object.keys(files).sort();
|
|
35
|
+
const entries = {};
|
|
36
|
+
for (const filePath of sorted) {
|
|
37
|
+
entries[filePath] = files[filePath];
|
|
58
38
|
}
|
|
39
|
+
return zipSync(entries, { level: 0, mtime: ZIP_EPOCH });
|
|
59
40
|
}
|
|
60
41
|
/**
|
|
61
|
-
* Unpacks a
|
|
42
|
+
* Unpacks a zip archive into a flat file map.
|
|
62
43
|
*/
|
|
63
44
|
export async function unpackFiles(data) {
|
|
64
|
-
|
|
65
|
-
return new Promise((resolve, reject) => {
|
|
66
|
-
const parser = new TarParser({
|
|
67
|
-
onReadEntry: (entry) => {
|
|
68
|
-
if (entry.type === 'File') {
|
|
69
|
-
const chunks = [];
|
|
70
|
-
entry.on('data', (d) => chunks.push(d));
|
|
71
|
-
entry.on('end', () => {
|
|
72
|
-
files[entry.path] = new Uint8Array(Buffer.concat(chunks));
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
entry.resume();
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
parser.on('end', () => resolve(files));
|
|
81
|
-
parser.on('error', reject);
|
|
82
|
-
parser.write(Buffer.from(data));
|
|
83
|
-
parser.end();
|
|
84
|
-
});
|
|
45
|
+
return unzipSync(data);
|
|
85
46
|
}
|
|
86
47
|
//# sourceMappingURL=bundle.js.map
|
package/dist/bundle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;;GAIG;AACH,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,QAAkB;IACtE,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,OAAO,GAA+B,EAAE,CAAC;IAC/C,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAiC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,MAAM,OAAO,GAA+B,EAAE,CAAC;IAC/C,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAgB;IACjD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -23,7 +23,7 @@ import type { QuillBundle, QuillManifest, QuillSource } from '../types.js';
|
|
|
23
23
|
* derived from the directory structure; Quill.yaml content is validated by the
|
|
24
24
|
* @quillmark/wasm engine at registration time.
|
|
25
25
|
*
|
|
26
|
-
* Also exposes `packageForHttp(outputDir)` to create
|
|
26
|
+
* Also exposes `packageForHttp(outputDir)` to create zip bundles and write a manifest
|
|
27
27
|
* for static hosting.
|
|
28
28
|
*/
|
|
29
29
|
export declare class FileSystemSource implements QuillSource {
|
|
@@ -33,8 +33,8 @@ export declare class FileSystemSource implements QuillSource {
|
|
|
33
33
|
loadQuill(name: string, version?: string): Promise<QuillBundle>;
|
|
34
34
|
/**
|
|
35
35
|
* Packages all quills for HTTP static hosting.
|
|
36
|
-
* Creates a
|
|
37
|
-
* `.
|
|
36
|
+
* Creates a zip archive of each quill version and writes
|
|
37
|
+
* `.zip` bundles plus a `manifest.json` to `outputDir`.
|
|
38
38
|
*/
|
|
39
39
|
packageForHttp(outputDir: string): Promise<void>;
|
|
40
40
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-system-source.d.ts","sourceRoot":"","sources":["../../src/sources/file-system-source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-system-source.d.ts","sourceRoot":"","sources":["../../src/sources/file-system-source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAiB,WAAW,EAAE,MAAM,aAAa,CAAC;AA+F1F;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IACnD,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAIvB,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC;IAuCrC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAoDrE;;;;OAIG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBtD;;;OAGG;YACW,oBAAoB;CA+BlC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as fs from 'node:fs/promises';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
-
import { brotliCompressSync, constants } from 'node:zlib';
|
|
4
3
|
import { RegistryError } from '../errors.js';
|
|
5
4
|
import { toEngineFileTree } from '../format.js';
|
|
6
5
|
import { packDirectory } from '../bundle.js';
|
|
@@ -102,7 +101,7 @@ function compareSemver(a, b) {
|
|
|
102
101
|
* derived from the directory structure; Quill.yaml content is validated by the
|
|
103
102
|
* @quillmark/wasm engine at registration time.
|
|
104
103
|
*
|
|
105
|
-
* Also exposes `packageForHttp(outputDir)` to create
|
|
104
|
+
* Also exposes `packageForHttp(outputDir)` to create zip bundles and write a manifest
|
|
106
105
|
* for static hosting.
|
|
107
106
|
*/
|
|
108
107
|
export class FileSystemSource {
|
|
@@ -193,8 +192,8 @@ export class FileSystemSource {
|
|
|
193
192
|
}
|
|
194
193
|
/**
|
|
195
194
|
* Packages all quills for HTTP static hosting.
|
|
196
|
-
* Creates a
|
|
197
|
-
* `.
|
|
195
|
+
* Creates a zip archive of each quill version and writes
|
|
196
|
+
* `.zip` bundles plus a `manifest.json` to `outputDir`.
|
|
198
197
|
*/
|
|
199
198
|
async packageForHttp(outputDir) {
|
|
200
199
|
await fs.mkdir(outputDir, { recursive: true });
|
|
@@ -203,11 +202,8 @@ export class FileSystemSource {
|
|
|
203
202
|
const quillDir = path.join(this.quillsDir, entry.name, entry.version);
|
|
204
203
|
const fileList = await listFilesRecursive(quillDir);
|
|
205
204
|
const packed = await packDirectory(quillDir, fileList);
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
});
|
|
209
|
-
const bundleFileName = `${entry.name}@${entry.version}.tar.br`;
|
|
210
|
-
await fs.writeFile(path.join(outputDir, bundleFileName), compressed);
|
|
205
|
+
const bundleFileName = `${entry.name}@${entry.version}.zip`;
|
|
206
|
+
await fs.writeFile(path.join(outputDir, bundleFileName), packed);
|
|
211
207
|
}
|
|
212
208
|
await fs.writeFile(path.join(outputDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
|
|
213
209
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-system-source.js","sourceRoot":"","sources":["../../src/sources/file-system-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"file-system-source.js","sourceRoot":"","sources":["../../src/sources/file-system-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ export interface HttpSourceOptions {
|
|
|
8
8
|
fetch?: typeof globalThis.fetch;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
* QuillSource that fetches
|
|
11
|
+
* QuillSource that fetches quill zip bundles and manifest from any HTTP endpoint.
|
|
12
12
|
*
|
|
13
13
|
* Supports local static serving, CDN hosting, and remote quill registries
|
|
14
14
|
* with the same interface. Appends `?v={version}` to bundle URLs for cache-busting.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-source.d.ts","sourceRoot":"","sources":["../../src/sources/http-source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-source.d.ts","sourceRoot":"","sources":["../../src/sources/http-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK3E,MAAM,WAAW,iBAAiB;IACjC,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,gFAAgF;IAChF,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CAChC;AAED;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,WAAW;IAC7C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAC,CAAgB;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,OAAO,CAAC,OAAO,CAA0B;gBAE7B,OAAO,EAAE,iBAAiB;IAOhC,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC;IAuCrC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CA8DrE"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { brotliDecompressSync } from 'node:zlib';
|
|
2
1
|
import { RegistryError } from '../errors.js';
|
|
3
2
|
import { toEngineFileTree } from '../format.js';
|
|
4
3
|
import { unpackFiles } from '../bundle.js';
|
|
5
4
|
/**
|
|
6
|
-
* QuillSource that fetches
|
|
5
|
+
* QuillSource that fetches quill zip bundles and manifest from any HTTP endpoint.
|
|
7
6
|
*
|
|
8
7
|
* Supports local static serving, CDN hosting, and remote quill registries
|
|
9
8
|
* with the same interface. Appends `?v={version}` to bundle URLs for cache-busting.
|
|
@@ -64,7 +63,7 @@ export class HttpSource {
|
|
|
64
63
|
});
|
|
65
64
|
}
|
|
66
65
|
const resolvedVersion = entry.version;
|
|
67
|
-
const bundleFileName = `${name}@${resolvedVersion}.
|
|
66
|
+
const bundleFileName = `${name}@${resolvedVersion}.zip`;
|
|
68
67
|
const bundleUrl = `${this.baseUrl}${bundleFileName}?v=${resolvedVersion}`;
|
|
69
68
|
let response;
|
|
70
69
|
try {
|
|
@@ -82,12 +81,11 @@ export class HttpSource {
|
|
|
82
81
|
}
|
|
83
82
|
let files;
|
|
84
83
|
try {
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
files = await unpackFiles(new Uint8Array(decompressed));
|
|
84
|
+
const zipData = new Uint8Array(await response.arrayBuffer());
|
|
85
|
+
files = await unpackFiles(zipData);
|
|
88
86
|
}
|
|
89
87
|
catch (err) {
|
|
90
|
-
throw new RegistryError('load_error', `Failed to
|
|
88
|
+
throw new RegistryError('load_error', `Failed to unpack quill "${name}"`, {
|
|
91
89
|
quillName: name,
|
|
92
90
|
version: resolvedVersion,
|
|
93
91
|
cause: err,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-source.js","sourceRoot":"","sources":["../../src/sources/http-source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-source.js","sourceRoot":"","sources":["../../src/sources/http-source.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quillmark/registry",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Unified API for discovering, loading, packaging, and registering Quills with the WASM engine",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"publishConfig": {
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
"scripts": {
|
|
11
11
|
"build": "tsc",
|
|
12
12
|
"test": "vitest run",
|
|
13
|
-
"test:watch": "vitest",
|
|
14
13
|
"lint": "tsc --noEmit",
|
|
15
14
|
"preversion": "npm test",
|
|
16
15
|
"postversion": "git push --follow-tags",
|
|
@@ -53,7 +52,7 @@
|
|
|
53
52
|
"dist"
|
|
54
53
|
],
|
|
55
54
|
"peerDependencies": {
|
|
56
|
-
"@quillmark/wasm": ">=0.
|
|
55
|
+
"@quillmark/wasm": ">=0.46.0"
|
|
57
56
|
},
|
|
58
57
|
"peerDependenciesMeta": {
|
|
59
58
|
"@quillmark/wasm": {
|
|
@@ -61,6 +60,6 @@
|
|
|
61
60
|
}
|
|
62
61
|
},
|
|
63
62
|
"dependencies": {
|
|
64
|
-
"
|
|
63
|
+
"fflate": "^0.8.2"
|
|
65
64
|
}
|
|
66
65
|
}
|