@mesh-sync/meshpack 1.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/dist/extensions.d.ts +36 -0
- package/dist/extensions.d.ts.map +1 -0
- package/dist/extensions.js +97 -0
- package/dist/extensions.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/meshpack.d.ts +118 -0
- package/dist/meshpack.d.ts.map +1 -0
- package/dist/meshpack.js +335 -0
- package/dist/meshpack.js.map +1 -0
- package/dist/types.d.ts +265 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +32 -0
- package/dist/types.js.map +1 -0
- package/package.json +25 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension accessor utilities for MeshPack extensions object.
|
|
3
|
+
*
|
|
4
|
+
* Extensions follow a versioned envelope pattern:
|
|
5
|
+
* ```json
|
|
6
|
+
* { "meshsync_geometry": { "v1": { ... } } }
|
|
7
|
+
* ```
|
|
8
|
+
*/
|
|
9
|
+
import type { GeometryV1, DependenciesV1, PrintabilityV1, ContentV1 } from './types';
|
|
10
|
+
/**
|
|
11
|
+
* Get a specific version of an extension from the extensions object.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getExtensionVersion<T = Record<string, unknown>>(extensions: Record<string, unknown> | undefined, extName: string, version: string): T | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Get the latest (highest numbered) version of an extension.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getLatestExtension<T = Record<string, unknown>>(extensions: Record<string, unknown> | undefined, extName: string): {
|
|
18
|
+
version: string;
|
|
19
|
+
data: T;
|
|
20
|
+
} | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Get the best matching version of an extension (<= `maxVersion`).
|
|
23
|
+
*/
|
|
24
|
+
export declare function getBestExtension<T = Record<string, unknown>>(extensions: Record<string, unknown> | undefined, extName: string, maxVersion?: string): {
|
|
25
|
+
version: string;
|
|
26
|
+
data: T;
|
|
27
|
+
} | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Set an extension version in the extensions object (mutates in place).
|
|
30
|
+
*/
|
|
31
|
+
export declare function setExtension(extensions: Record<string, unknown>, extName: string, version: string, data: Record<string, unknown>): Record<string, unknown>;
|
|
32
|
+
export declare function getGeometry(ext: Record<string, unknown> | undefined): GeometryV1 | undefined;
|
|
33
|
+
export declare function getDependencies(ext: Record<string, unknown> | undefined): DependenciesV1 | undefined;
|
|
34
|
+
export declare function getPrintability(ext: Record<string, unknown> | undefined): PrintabilityV1 | undefined;
|
|
35
|
+
export declare function getContent(ext: Record<string, unknown> | undefined): ContentV1 | undefined;
|
|
36
|
+
//# sourceMappingURL=extensions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,SAAS,EACV,MAAM,SAAS,CAAC;AAOjB;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC/C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,CAAC,GAAG,SAAS,CAKf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC/C,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG,SAAS,CAY1C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC/C,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG,SAAS,CAgB1C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB;AAMD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAE5F;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAEpG;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAEpG;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAE1F"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Extension accessor utilities for MeshPack extensions object.
|
|
4
|
+
*
|
|
5
|
+
* Extensions follow a versioned envelope pattern:
|
|
6
|
+
* ```json
|
|
7
|
+
* { "meshsync_geometry": { "v1": { ... } } }
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.getExtensionVersion = getExtensionVersion;
|
|
12
|
+
exports.getLatestExtension = getLatestExtension;
|
|
13
|
+
exports.getBestExtension = getBestExtension;
|
|
14
|
+
exports.setExtension = setExtension;
|
|
15
|
+
exports.getGeometry = getGeometry;
|
|
16
|
+
exports.getDependencies = getDependencies;
|
|
17
|
+
exports.getPrintability = getPrintability;
|
|
18
|
+
exports.getContent = getContent;
|
|
19
|
+
const types_1 = require("./types");
|
|
20
|
+
// ────────────────────────────────────────────────────────────────
|
|
21
|
+
// Generic accessors
|
|
22
|
+
// ────────────────────────────────────────────────────────────────
|
|
23
|
+
/**
|
|
24
|
+
* Get a specific version of an extension from the extensions object.
|
|
25
|
+
*/
|
|
26
|
+
function getExtensionVersion(extensions, extName, version) {
|
|
27
|
+
if (!extensions)
|
|
28
|
+
return undefined;
|
|
29
|
+
const ext = extensions[extName];
|
|
30
|
+
if (!ext || typeof ext !== 'object')
|
|
31
|
+
return undefined;
|
|
32
|
+
return ext[version];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the latest (highest numbered) version of an extension.
|
|
36
|
+
*/
|
|
37
|
+
function getLatestExtension(extensions, extName) {
|
|
38
|
+
if (!extensions)
|
|
39
|
+
return undefined;
|
|
40
|
+
const ext = extensions[extName];
|
|
41
|
+
if (!ext || typeof ext !== 'object')
|
|
42
|
+
return undefined;
|
|
43
|
+
const versions = Object.keys(ext)
|
|
44
|
+
.filter((k) => k.startsWith('v') && !isNaN(parseInt(k.slice(1), 10)))
|
|
45
|
+
.sort((a, b) => parseInt(b.slice(1), 10) - parseInt(a.slice(1), 10));
|
|
46
|
+
if (versions.length === 0)
|
|
47
|
+
return undefined;
|
|
48
|
+
const latest = versions[0];
|
|
49
|
+
return { version: latest, data: ext[latest] };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get the best matching version of an extension (<= `maxVersion`).
|
|
53
|
+
*/
|
|
54
|
+
function getBestExtension(extensions, extName, maxVersion) {
|
|
55
|
+
if (!maxVersion)
|
|
56
|
+
return getLatestExtension(extensions, extName);
|
|
57
|
+
if (!extensions)
|
|
58
|
+
return undefined;
|
|
59
|
+
const ext = extensions[extName];
|
|
60
|
+
if (!ext || typeof ext !== 'object')
|
|
61
|
+
return undefined;
|
|
62
|
+
const maxNum = parseInt(maxVersion.replace('v', ''), 10);
|
|
63
|
+
const versions = Object.keys(ext)
|
|
64
|
+
.filter((k) => k.startsWith('v') && !isNaN(parseInt(k.slice(1), 10)))
|
|
65
|
+
.filter((k) => parseInt(k.slice(1), 10) <= maxNum)
|
|
66
|
+
.sort((a, b) => parseInt(b.slice(1), 10) - parseInt(a.slice(1), 10));
|
|
67
|
+
if (versions.length === 0)
|
|
68
|
+
return undefined;
|
|
69
|
+
const best = versions[0];
|
|
70
|
+
return { version: best, data: ext[best] };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Set an extension version in the extensions object (mutates in place).
|
|
74
|
+
*/
|
|
75
|
+
function setExtension(extensions, extName, version, data) {
|
|
76
|
+
if (!extensions[extName]) {
|
|
77
|
+
extensions[extName] = {};
|
|
78
|
+
}
|
|
79
|
+
extensions[extName][version] = data;
|
|
80
|
+
return extensions;
|
|
81
|
+
}
|
|
82
|
+
// ────────────────────────────────────────────────────────────────
|
|
83
|
+
// Convenience typed accessors
|
|
84
|
+
// ────────────────────────────────────────────────────────────────
|
|
85
|
+
function getGeometry(ext) {
|
|
86
|
+
return getBestExtension(ext, types_1.ExtensionNames.MESHSYNC_GEOMETRY, 'v1')?.data;
|
|
87
|
+
}
|
|
88
|
+
function getDependencies(ext) {
|
|
89
|
+
return getBestExtension(ext, types_1.ExtensionNames.MESHSYNC_DEPENDENCIES, 'v1')?.data;
|
|
90
|
+
}
|
|
91
|
+
function getPrintability(ext) {
|
|
92
|
+
return getBestExtension(ext, types_1.ExtensionNames.MESHSYNC_PRINTABILITY, 'v1')?.data;
|
|
93
|
+
}
|
|
94
|
+
function getContent(ext) {
|
|
95
|
+
return getBestExtension(ext, types_1.ExtensionNames.MESHSYNC_CONTENT, 'v1')?.data;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mesh-sync/meshpack — TypeScript SDK for MeshPack v1.0.0
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { readMeshPack, listModelEntries, getGeometry } from '@mesh-sync/meshpack';
|
|
7
|
+
*
|
|
8
|
+
* const pack = await readMeshPack(buffer);
|
|
9
|
+
* const models = listModelEntries(pack.entries);
|
|
10
|
+
* for (const m of models) {
|
|
11
|
+
* console.log(m.path, getGeometry(m.extensions));
|
|
12
|
+
* }
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @packageDocumentation
|
|
16
|
+
*/
|
|
17
|
+
export type { HashAlgorithm, HashValue, OSType, MeasurementUnit, UpAxis, MetamodelRole, AssemblyRole, DeltaOperation, IdConflictPolicy, MetamodelMergePolicy, SignatureAlgorithm, MetamodelFilterMode, NamespacedId, CreatorInfo, PlatformInfo, IndexSummary, ShardListEntry, SignatureEntry, Generation, MetamodelFilter, ImportPolicy, Encryption, Manifest, BoundingBox, FileAttributes, Transform, Assembly, MetamodelMembership, FileEntry, Shard, Sidecar, GeometryV1, DependenciesV1, PrintabilityV1, ContentV1, } from './types';
|
|
18
|
+
export { ExtensionNames, ExtensionVersions } from './types';
|
|
19
|
+
export { getExtensionVersion, getLatestExtension, getBestExtension, setExtension, getGeometry, getDependencies, getPrintability, getContent, } from './extensions';
|
|
20
|
+
export type { MeshPackContents, WriteMeshPackOptions, Severity, ValidationFinding, ValidationResult, } from './meshpack';
|
|
21
|
+
export { readMeshPack, writeMeshPack, computeEntriesHash, validateMeshPack, readResource, listModelEntries, findByHash, listByMetamodel, } from './meshpack';
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,YAAY,EACV,aAAa,EACb,SAAS,EACT,MAAM,EACN,eAAe,EACf,MAAM,EACN,aAAa,EACb,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,UAAU,EACV,eAAe,EACf,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,EACX,cAAc,EACd,SAAS,EACT,QAAQ,EACR,mBAAmB,EACnB,SAAS,EACT,KAAK,EACL,OAAO,EACP,UAAU,EACV,cAAc,EACd,cAAc,EACd,SAAS,GACV,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAG5D,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,eAAe,EACf,UAAU,GACX,MAAM,cAAc,CAAC;AAGtB,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @mesh-sync/meshpack — TypeScript SDK for MeshPack v1.0.0
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { readMeshPack, listModelEntries, getGeometry } from '@mesh-sync/meshpack';
|
|
8
|
+
*
|
|
9
|
+
* const pack = await readMeshPack(buffer);
|
|
10
|
+
* const models = listModelEntries(pack.entries);
|
|
11
|
+
* for (const m of models) {
|
|
12
|
+
* console.log(m.path, getGeometry(m.extensions));
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @packageDocumentation
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.listByMetamodel = exports.findByHash = exports.listModelEntries = exports.readResource = exports.validateMeshPack = exports.computeEntriesHash = exports.writeMeshPack = exports.readMeshPack = exports.getContent = exports.getPrintability = exports.getDependencies = exports.getGeometry = exports.setExtension = exports.getBestExtension = exports.getLatestExtension = exports.getExtensionVersion = exports.ExtensionVersions = exports.ExtensionNames = void 0;
|
|
20
|
+
var types_1 = require("./types");
|
|
21
|
+
Object.defineProperty(exports, "ExtensionNames", { enumerable: true, get: function () { return types_1.ExtensionNames; } });
|
|
22
|
+
Object.defineProperty(exports, "ExtensionVersions", { enumerable: true, get: function () { return types_1.ExtensionVersions; } });
|
|
23
|
+
// Extension helpers
|
|
24
|
+
var extensions_1 = require("./extensions");
|
|
25
|
+
Object.defineProperty(exports, "getExtensionVersion", { enumerable: true, get: function () { return extensions_1.getExtensionVersion; } });
|
|
26
|
+
Object.defineProperty(exports, "getLatestExtension", { enumerable: true, get: function () { return extensions_1.getLatestExtension; } });
|
|
27
|
+
Object.defineProperty(exports, "getBestExtension", { enumerable: true, get: function () { return extensions_1.getBestExtension; } });
|
|
28
|
+
Object.defineProperty(exports, "setExtension", { enumerable: true, get: function () { return extensions_1.setExtension; } });
|
|
29
|
+
Object.defineProperty(exports, "getGeometry", { enumerable: true, get: function () { return extensions_1.getGeometry; } });
|
|
30
|
+
Object.defineProperty(exports, "getDependencies", { enumerable: true, get: function () { return extensions_1.getDependencies; } });
|
|
31
|
+
Object.defineProperty(exports, "getPrintability", { enumerable: true, get: function () { return extensions_1.getPrintability; } });
|
|
32
|
+
Object.defineProperty(exports, "getContent", { enumerable: true, get: function () { return extensions_1.getContent; } });
|
|
33
|
+
var meshpack_1 = require("./meshpack");
|
|
34
|
+
Object.defineProperty(exports, "readMeshPack", { enumerable: true, get: function () { return meshpack_1.readMeshPack; } });
|
|
35
|
+
Object.defineProperty(exports, "writeMeshPack", { enumerable: true, get: function () { return meshpack_1.writeMeshPack; } });
|
|
36
|
+
Object.defineProperty(exports, "computeEntriesHash", { enumerable: true, get: function () { return meshpack_1.computeEntriesHash; } });
|
|
37
|
+
Object.defineProperty(exports, "validateMeshPack", { enumerable: true, get: function () { return meshpack_1.validateMeshPack; } });
|
|
38
|
+
Object.defineProperty(exports, "readResource", { enumerable: true, get: function () { return meshpack_1.readResource; } });
|
|
39
|
+
Object.defineProperty(exports, "listModelEntries", { enumerable: true, get: function () { return meshpack_1.listModelEntries; } });
|
|
40
|
+
Object.defineProperty(exports, "findByHash", { enumerable: true, get: function () { return meshpack_1.findByHash; } });
|
|
41
|
+
Object.defineProperty(exports, "listByMetamodel", { enumerable: true, get: function () { return meshpack_1.listByMetamodel; } });
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAyCH,iCAA4D;AAAnD,uGAAA,cAAc,OAAA;AAAE,0GAAA,iBAAiB,OAAA;AAE1C,oBAAoB;AACpB,2CASsB;AARpB,iHAAA,mBAAmB,OAAA;AACnB,gHAAA,kBAAkB,OAAA;AAClB,8GAAA,gBAAgB,OAAA;AAChB,0GAAA,YAAY,OAAA;AACZ,yGAAA,WAAW,OAAA;AACX,6GAAA,eAAe,OAAA;AACf,6GAAA,eAAe,OAAA;AACf,wGAAA,UAAU,OAAA;AAYZ,uCASoB;AARlB,wGAAA,YAAY,OAAA;AACZ,yGAAA,aAAa,OAAA;AACb,8GAAA,kBAAkB,OAAA;AAClB,4GAAA,gBAAgB,OAAA;AAChB,wGAAA,YAAY,OAAA;AACZ,4GAAA,gBAAgB,OAAA;AAChB,sGAAA,UAAU,OAAA;AACV,2GAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MeshPack read / write / validate API.
|
|
3
|
+
*
|
|
4
|
+
* Uses JSZip under the hood. This module provides three main functions:
|
|
5
|
+
* - `readMeshPack()` — parse a .meshpack buffer into typed objects
|
|
6
|
+
* - `writeMeshPack()` — build a .meshpack buffer from typed objects
|
|
7
|
+
* - `validateMeshPack()` — structural validation returning findings
|
|
8
|
+
*
|
|
9
|
+
* For the full validator, use **tools/meshpack_validate.py** (Python).
|
|
10
|
+
* This TS validator covers the most common structural checks sufficient
|
|
11
|
+
* for L1–L2 conformance.
|
|
12
|
+
*/
|
|
13
|
+
import JSZip from 'jszip';
|
|
14
|
+
import type { Manifest, Shard, FileEntry, HashAlgorithm, HashValue } from './types';
|
|
15
|
+
/** Result of reading a .meshpack archive. */
|
|
16
|
+
export interface MeshPackContents {
|
|
17
|
+
manifest: Manifest;
|
|
18
|
+
shards: Shard[];
|
|
19
|
+
/** All file entries across all shards, keyed by `path`. */
|
|
20
|
+
entries: Map<string, FileEntry>;
|
|
21
|
+
/** The raw JSZip instance for resource access. */
|
|
22
|
+
zip: JSZip;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parse a .meshpack ZIP buffer into typed objects.
|
|
26
|
+
*
|
|
27
|
+
* @param data ZIP archive as `ArrayBuffer`, `Uint8Array`, or `Buffer`.
|
|
28
|
+
* @throws Error if `manifest.json` is missing or malformed.
|
|
29
|
+
*/
|
|
30
|
+
export declare function readMeshPack(data: ArrayBuffer | Uint8Array | Buffer): Promise<MeshPackContents>;
|
|
31
|
+
/** Options for building a .meshpack archive. */
|
|
32
|
+
export interface WriteMeshPackOptions {
|
|
33
|
+
manifest: Manifest;
|
|
34
|
+
shards: Shard[];
|
|
35
|
+
/** Optional resource blobs: key = filename in `resources/` (e.g. `abc123.stl`). */
|
|
36
|
+
resources?: Map<string, Uint8Array | Buffer>;
|
|
37
|
+
/** Optional extra files (e.g. `_README.md`). */
|
|
38
|
+
extraFiles?: Map<string, string | Uint8Array>;
|
|
39
|
+
/** Compression method for ZIP entries. Default: `DEFLATE`. */
|
|
40
|
+
compression?: 'STORE' | 'DEFLATE';
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build a .meshpack ZIP archive from typed objects.
|
|
44
|
+
*
|
|
45
|
+
* The ZIP is built with `manifest.json` as the **first entry** (REQ-L2-000).
|
|
46
|
+
* Returns the archive as a Uint8Array.
|
|
47
|
+
*/
|
|
48
|
+
export declare function writeMeshPack(opts: WriteMeshPackOptions): Promise<Uint8Array>;
|
|
49
|
+
/**
|
|
50
|
+
* Compute the canonical entries_hash for a list of file entries.
|
|
51
|
+
*
|
|
52
|
+
* Uses RFC 8785 (JCS) canonicalization approximation via
|
|
53
|
+
* `JSON.stringify` with `sort_keys=true` (Object.keys sorted) and
|
|
54
|
+
* compact separators. Then hashes with the provided algorithm.
|
|
55
|
+
*
|
|
56
|
+
* **Note**: For SHA-256 this uses the Web Crypto API (or Node crypto).
|
|
57
|
+
* Only `sha256` is supported in this TS implementation.
|
|
58
|
+
*
|
|
59
|
+
* @param entries Array of FileEntry objects (must be sorted by path).
|
|
60
|
+
* @param algo Hash algorithm (only `sha256` currently supported).
|
|
61
|
+
* @returns HashValue like `sha256:abc123...`
|
|
62
|
+
*/
|
|
63
|
+
export declare function computeEntriesHash(entries: FileEntry[], algo?: HashAlgorithm): Promise<HashValue>;
|
|
64
|
+
/** Severity of a validation finding. */
|
|
65
|
+
export type Severity = 'ERROR' | 'WARNING' | 'INFO';
|
|
66
|
+
/** A single validation finding. */
|
|
67
|
+
export interface ValidationFinding {
|
|
68
|
+
code: string;
|
|
69
|
+
severity: Severity;
|
|
70
|
+
message: string;
|
|
71
|
+
}
|
|
72
|
+
/** Result of `validateMeshPack()`. */
|
|
73
|
+
export interface ValidationResult {
|
|
74
|
+
valid: boolean;
|
|
75
|
+
findings: ValidationFinding[];
|
|
76
|
+
errors: number;
|
|
77
|
+
warnings: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Structural validation of a MeshPack archive (L1–L2 subset).
|
|
81
|
+
*
|
|
82
|
+
* Checks performed:
|
|
83
|
+
* - manifest.json exists and is valid JSON
|
|
84
|
+
* - Required manifest fields present
|
|
85
|
+
* - hash_algo is a supported value
|
|
86
|
+
* - shard_list is non-empty with correct ID format
|
|
87
|
+
* - All shards referenced in shard_list exist in the ZIP
|
|
88
|
+
* - Shard entries are sorted by path
|
|
89
|
+
* - entries_count matches actual length
|
|
90
|
+
* - manifest.json is the first ZIP entry (L2)
|
|
91
|
+
* - Path constraints (no `..`, no absolute, ≤ 1024 chars)
|
|
92
|
+
*
|
|
93
|
+
* For exhaustive validation use the Python `meshpack_validate.py` tool.
|
|
94
|
+
*/
|
|
95
|
+
export declare function validateMeshPack(data: ArrayBuffer | Uint8Array | Buffer): Promise<ValidationResult>;
|
|
96
|
+
/**
|
|
97
|
+
* Read the binary content of a resource referenced by a FileEntry.
|
|
98
|
+
*
|
|
99
|
+
* @param zip – The JSZip instance from `readMeshPack().zip`.
|
|
100
|
+
* @param entry – The FileEntry whose `resource_ref` to read.
|
|
101
|
+
* @param type – Output type (`'uint8array'`, `'arraybuffer'`, `'blob'`, `'string'`).
|
|
102
|
+
*/
|
|
103
|
+
export declare function readResource(zip: JSZip, entry: FileEntry, type: 'uint8array'): Promise<Uint8Array | null>;
|
|
104
|
+
export declare function readResource(zip: JSZip, entry: FileEntry, type: 'arraybuffer'): Promise<ArrayBuffer | null>;
|
|
105
|
+
export declare function readResource(zip: JSZip, entry: FileEntry, type: 'string'): Promise<string | null>;
|
|
106
|
+
/**
|
|
107
|
+
* List all model file entries (common 3D file extensions).
|
|
108
|
+
*/
|
|
109
|
+
export declare function listModelEntries(entries: Map<string, FileEntry> | FileEntry[]): FileEntry[];
|
|
110
|
+
/**
|
|
111
|
+
* Find entries by content hash.
|
|
112
|
+
*/
|
|
113
|
+
export declare function findByHash(entries: Map<string, FileEntry> | FileEntry[], hash: string): FileEntry[];
|
|
114
|
+
/**
|
|
115
|
+
* List entries belonging to a specific metamodel ID.
|
|
116
|
+
*/
|
|
117
|
+
export declare function listByMetamodel(entries: Map<string, FileEntry> | FileEntry[], metamodelId: string): FileEntry[];
|
|
118
|
+
//# sourceMappingURL=meshpack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meshpack.d.ts","sourceRoot":"","sources":["../src/meshpack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EACV,QAAQ,EACR,KAAK,EACL,SAAS,EACT,aAAa,EACb,SAAS,EAEV,MAAM,SAAS,CAAC;AAMjB,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,2DAA2D;IAC3D,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChC,kDAAkD;IAClD,GAAG,EAAE,KAAK,CAAC;CACZ;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2BrG;AAMD,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,mFAAmF;IACnF,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC;IAC7C,gDAAgD;IAChD,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC;IAC9C,8DAA8D;IAC9D,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CA6BnF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,SAAS,EAAE,EACpB,IAAI,GAAE,aAAwB,GAC7B,OAAO,CAAC,SAAS,CAAC,CAuBpB;AAMD,wCAAwC;AACxC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpD,mCAAmC;AACnC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwIzG;AAMD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,KAAK,EACV,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;AAC9B,wBAAsB,YAAY,CAChC,GAAG,EAAE,KAAK,EACV,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AAC/B,wBAAsB,YAAY,CAChC,GAAG,EAAE,KAAK,EACV,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAY1B;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,EAAE,CAO3F;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAGnG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,CAO/G"}
|
package/dist/meshpack.js
ADDED
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MeshPack read / write / validate API.
|
|
4
|
+
*
|
|
5
|
+
* Uses JSZip under the hood. This module provides three main functions:
|
|
6
|
+
* - `readMeshPack()` — parse a .meshpack buffer into typed objects
|
|
7
|
+
* - `writeMeshPack()` — build a .meshpack buffer from typed objects
|
|
8
|
+
* - `validateMeshPack()` — structural validation returning findings
|
|
9
|
+
*
|
|
10
|
+
* For the full validator, use **tools/meshpack_validate.py** (Python).
|
|
11
|
+
* This TS validator covers the most common structural checks sufficient
|
|
12
|
+
* for L1–L2 conformance.
|
|
13
|
+
*/
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.readMeshPack = readMeshPack;
|
|
19
|
+
exports.writeMeshPack = writeMeshPack;
|
|
20
|
+
exports.computeEntriesHash = computeEntriesHash;
|
|
21
|
+
exports.validateMeshPack = validateMeshPack;
|
|
22
|
+
exports.readResource = readResource;
|
|
23
|
+
exports.listModelEntries = listModelEntries;
|
|
24
|
+
exports.findByHash = findByHash;
|
|
25
|
+
exports.listByMetamodel = listByMetamodel;
|
|
26
|
+
const jszip_1 = __importDefault(require("jszip"));
|
|
27
|
+
/**
|
|
28
|
+
* Parse a .meshpack ZIP buffer into typed objects.
|
|
29
|
+
*
|
|
30
|
+
* @param data ZIP archive as `ArrayBuffer`, `Uint8Array`, or `Buffer`.
|
|
31
|
+
* @throws Error if `manifest.json` is missing or malformed.
|
|
32
|
+
*/
|
|
33
|
+
async function readMeshPack(data) {
|
|
34
|
+
const zip = await jszip_1.default.loadAsync(data);
|
|
35
|
+
// ── Manifest ────────────────────────────────────────────────
|
|
36
|
+
const manifestFile = zip.file('manifest.json');
|
|
37
|
+
if (!manifestFile) {
|
|
38
|
+
throw new Error('MeshPack missing manifest.json at archive root');
|
|
39
|
+
}
|
|
40
|
+
const manifest = JSON.parse(await manifestFile.async('string'));
|
|
41
|
+
// ── Shards ──────────────────────────────────────────────────
|
|
42
|
+
const shardFiles = zip.file(/^index\/part-\d{5}\.json$/);
|
|
43
|
+
const shards = [];
|
|
44
|
+
const entries = new Map();
|
|
45
|
+
for (const sf of shardFiles) {
|
|
46
|
+
const shard = JSON.parse(await sf.async('string'));
|
|
47
|
+
shards.push(shard);
|
|
48
|
+
for (const entry of shard.entries) {
|
|
49
|
+
entries.set(entry.path, entry);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Sort shards by shard_id to ensure deterministic ordering
|
|
53
|
+
shards.sort((a, b) => a.shard_id.localeCompare(b.shard_id));
|
|
54
|
+
return { manifest, shards, entries, zip };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build a .meshpack ZIP archive from typed objects.
|
|
58
|
+
*
|
|
59
|
+
* The ZIP is built with `manifest.json` as the **first entry** (REQ-L2-000).
|
|
60
|
+
* Returns the archive as a Uint8Array.
|
|
61
|
+
*/
|
|
62
|
+
async function writeMeshPack(opts) {
|
|
63
|
+
const { manifest, shards, resources, extraFiles, compression = 'DEFLATE' } = opts;
|
|
64
|
+
const zip = new jszip_1.default();
|
|
65
|
+
const compressOpt = compression === 'STORE' ? { compression: 'STORE' } : {};
|
|
66
|
+
// 1. Manifest MUST be first entry
|
|
67
|
+
zip.file('manifest.json', JSON.stringify(manifest, null, 2), compressOpt);
|
|
68
|
+
// 2. Extra files (e.g. _README.md)
|
|
69
|
+
if (extraFiles) {
|
|
70
|
+
for (const [path, content] of extraFiles) {
|
|
71
|
+
zip.file(path, content, compressOpt);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// 3. Shards
|
|
75
|
+
for (const shard of shards) {
|
|
76
|
+
const filename = `index/${shard.shard_id}.json`;
|
|
77
|
+
zip.file(filename, JSON.stringify(shard, null, 2), compressOpt);
|
|
78
|
+
}
|
|
79
|
+
// 4. Resources
|
|
80
|
+
if (resources) {
|
|
81
|
+
for (const [name, data] of resources) {
|
|
82
|
+
zip.file(`resources/${name}`, data, compressOpt);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return zip.generateAsync({ type: 'uint8array' });
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Compute the canonical entries_hash for a list of file entries.
|
|
89
|
+
*
|
|
90
|
+
* Uses RFC 8785 (JCS) canonicalization approximation via
|
|
91
|
+
* `JSON.stringify` with `sort_keys=true` (Object.keys sorted) and
|
|
92
|
+
* compact separators. Then hashes with the provided algorithm.
|
|
93
|
+
*
|
|
94
|
+
* **Note**: For SHA-256 this uses the Web Crypto API (or Node crypto).
|
|
95
|
+
* Only `sha256` is supported in this TS implementation.
|
|
96
|
+
*
|
|
97
|
+
* @param entries Array of FileEntry objects (must be sorted by path).
|
|
98
|
+
* @param algo Hash algorithm (only `sha256` currently supported).
|
|
99
|
+
* @returns HashValue like `sha256:abc123...`
|
|
100
|
+
*/
|
|
101
|
+
async function computeEntriesHash(entries, algo = 'sha256') {
|
|
102
|
+
if (algo !== 'sha256') {
|
|
103
|
+
throw new Error(`computeEntriesHash: only sha256 is supported in TS SDK, got '${algo}'`);
|
|
104
|
+
}
|
|
105
|
+
// RFC 8785 canonical JSON: keys sorted, compact separators
|
|
106
|
+
const canonical = canonicalJsonStringify(entries);
|
|
107
|
+
const encoded = new TextEncoder().encode(canonical);
|
|
108
|
+
let hexHash;
|
|
109
|
+
// Use Web Crypto if available (browser), else Node crypto
|
|
110
|
+
if (typeof globalThis.crypto?.subtle?.digest === 'function') {
|
|
111
|
+
const buf = await globalThis.crypto.subtle.digest('SHA-256', encoded);
|
|
112
|
+
hexHash = bufferToHex(new Uint8Array(buf));
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// Node.js fallback
|
|
116
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
117
|
+
const crypto = require('crypto');
|
|
118
|
+
hexHash = crypto.createHash('sha256').update(encoded).digest('hex');
|
|
119
|
+
}
|
|
120
|
+
return `sha256:${hexHash}`;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Structural validation of a MeshPack archive (L1–L2 subset).
|
|
124
|
+
*
|
|
125
|
+
* Checks performed:
|
|
126
|
+
* - manifest.json exists and is valid JSON
|
|
127
|
+
* - Required manifest fields present
|
|
128
|
+
* - hash_algo is a supported value
|
|
129
|
+
* - shard_list is non-empty with correct ID format
|
|
130
|
+
* - All shards referenced in shard_list exist in the ZIP
|
|
131
|
+
* - Shard entries are sorted by path
|
|
132
|
+
* - entries_count matches actual length
|
|
133
|
+
* - manifest.json is the first ZIP entry (L2)
|
|
134
|
+
* - Path constraints (no `..`, no absolute, ≤ 1024 chars)
|
|
135
|
+
*
|
|
136
|
+
* For exhaustive validation use the Python `meshpack_validate.py` tool.
|
|
137
|
+
*/
|
|
138
|
+
async function validateMeshPack(data) {
|
|
139
|
+
const findings = [];
|
|
140
|
+
const push = (code, severity, message) => {
|
|
141
|
+
findings.push({ code, severity, message });
|
|
142
|
+
};
|
|
143
|
+
// ── 1. ZIP structure ─────────────────────────────────────────
|
|
144
|
+
let zip;
|
|
145
|
+
try {
|
|
146
|
+
zip = await jszip_1.default.loadAsync(data);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
push('ARC-001', 'ERROR', 'Not a valid ZIP archive');
|
|
150
|
+
return buildResult(findings);
|
|
151
|
+
}
|
|
152
|
+
// ── 2. manifest.json existence ───────────────────────────────
|
|
153
|
+
const manifestFile = zip.file('manifest.json');
|
|
154
|
+
if (!manifestFile) {
|
|
155
|
+
push('MAN-001', 'ERROR', 'manifest.json not found at archive root');
|
|
156
|
+
return buildResult(findings);
|
|
157
|
+
}
|
|
158
|
+
// ── 3. manifest.json is first ZIP entry (L2) ────────────────
|
|
159
|
+
const zipNames = Object.keys(zip.files);
|
|
160
|
+
if (zipNames[0] !== 'manifest.json') {
|
|
161
|
+
push('ZIP-001', 'WARNING', `manifest.json should be first ZIP entry (found: ${zipNames[0]})`);
|
|
162
|
+
}
|
|
163
|
+
// ── 4. Parse manifest ────────────────────────────────────────
|
|
164
|
+
let manifest;
|
|
165
|
+
try {
|
|
166
|
+
manifest = JSON.parse(await manifestFile.async('string'));
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
push('MAN-002', 'ERROR', 'manifest.json is not valid JSON');
|
|
170
|
+
return buildResult(findings);
|
|
171
|
+
}
|
|
172
|
+
// ── 5. Required manifest fields ──────────────────────────────
|
|
173
|
+
const requiredManifestFields = [
|
|
174
|
+
'format_version', 'created_at', 'creator_info', 'platform_info',
|
|
175
|
+
'index_summary', 'hash_algo', 'shard_list',
|
|
176
|
+
];
|
|
177
|
+
for (const field of requiredManifestFields) {
|
|
178
|
+
if (!(field in manifest)) {
|
|
179
|
+
push('MAN-010', 'ERROR', `Missing required manifest field: ${field}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// format_version semver
|
|
183
|
+
if (manifest.format_version && !/^\d+\.\d+\.\d+$/.test(manifest.format_version)) {
|
|
184
|
+
push('MAN-011', 'ERROR', `format_version is not valid semver: ${manifest.format_version}`);
|
|
185
|
+
}
|
|
186
|
+
// hash_algo enum
|
|
187
|
+
const validAlgos = ['sha256', 'sha512', 'blake3'];
|
|
188
|
+
if (manifest.hash_algo && !validAlgos.includes(manifest.hash_algo)) {
|
|
189
|
+
push('MAN-012', 'ERROR', `Unsupported hash_algo: ${manifest.hash_algo}`);
|
|
190
|
+
}
|
|
191
|
+
// creator_info.name
|
|
192
|
+
if (manifest.creator_info && !manifest.creator_info.name) {
|
|
193
|
+
push('MAN-015', 'ERROR', 'creator_info.name is required');
|
|
194
|
+
}
|
|
195
|
+
// ── 6. shard_list ────────────────────────────────────────────
|
|
196
|
+
if (!Array.isArray(manifest.shard_list) || manifest.shard_list.length === 0) {
|
|
197
|
+
push('MAN-013', 'ERROR', 'shard_list must be a non-empty array');
|
|
198
|
+
return buildResult(findings);
|
|
199
|
+
}
|
|
200
|
+
const shardIdPattern = /^part-\d{5}$/;
|
|
201
|
+
for (const ref of manifest.shard_list) {
|
|
202
|
+
if (!shardIdPattern.test(ref.id)) {
|
|
203
|
+
push('MAN-014', 'ERROR', `Invalid shard ID format: ${ref.id} (expected part-NNNNN)`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// ── 7. Shard files ──────────────────────────────────────────
|
|
207
|
+
for (const ref of manifest.shard_list) {
|
|
208
|
+
const shardPath = `index/${ref.id}.json`;
|
|
209
|
+
const shardFile = zip.file(shardPath);
|
|
210
|
+
if (!shardFile) {
|
|
211
|
+
push('SHD-000', 'ERROR', `Shard file missing: ${shardPath}`);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
let shard;
|
|
215
|
+
try {
|
|
216
|
+
shard = JSON.parse(await shardFile.async('string'));
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
push('SHD-002', 'ERROR', `Shard ${ref.id} is not valid JSON`);
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
// shard_id matches filename
|
|
223
|
+
if (shard.shard_id !== ref.id) {
|
|
224
|
+
push('SHD-001', 'ERROR', `Shard ID mismatch: file=${ref.id}, shard_id=${shard.shard_id}`);
|
|
225
|
+
}
|
|
226
|
+
// entries_count
|
|
227
|
+
if (shard.entries_count !== shard.entries.length) {
|
|
228
|
+
push('SHD-005', 'ERROR', `entries_count=${shard.entries_count} but entries.length=${shard.entries.length}`);
|
|
229
|
+
}
|
|
230
|
+
// Entries sorted by path
|
|
231
|
+
for (let i = 1; i < shard.entries.length; i++) {
|
|
232
|
+
if (shard.entries[i].path < shard.entries[i - 1].path) {
|
|
233
|
+
push('SHD-004', 'WARNING', `Entries not sorted by path in shard ${ref.id} at index ${i}`);
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Entry-level checks
|
|
238
|
+
for (const entry of shard.entries) {
|
|
239
|
+
// Required fields
|
|
240
|
+
if (!entry.path || !entry.original_name || entry.size_bytes === undefined || !entry.hash || !entry.modified_at) {
|
|
241
|
+
push('ENT-000', 'ERROR', `Entry missing required fields: ${entry.path || '(no path)'}`);
|
|
242
|
+
}
|
|
243
|
+
// Path constraints
|
|
244
|
+
if (entry.path) {
|
|
245
|
+
if (entry.path.length > 1024) {
|
|
246
|
+
push('ENT-001', 'ERROR', `Path exceeds 1024 chars: ${entry.path.slice(0, 80)}...`);
|
|
247
|
+
}
|
|
248
|
+
if (entry.path.includes('..')) {
|
|
249
|
+
push('ENT-002', 'ERROR', `Path contains traversal (..): ${entry.path}`);
|
|
250
|
+
}
|
|
251
|
+
if (entry.path.startsWith('/') || /^[A-Za-z]:/.test(entry.path)) {
|
|
252
|
+
push('ENT-003', 'ERROR', `Absolute path detected: ${entry.path}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return buildResult(findings);
|
|
258
|
+
}
|
|
259
|
+
async function readResource(zip, entry, type = 'uint8array') {
|
|
260
|
+
if (!entry.resource_ref)
|
|
261
|
+
return null;
|
|
262
|
+
const file = zip.file(`resources/${entry.resource_ref}`);
|
|
263
|
+
if (!file)
|
|
264
|
+
return null;
|
|
265
|
+
return file.async(type);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* List all model file entries (common 3D file extensions).
|
|
269
|
+
*/
|
|
270
|
+
function listModelEntries(entries) {
|
|
271
|
+
const modelExts = ['.stl', '.obj', '.3mf', '.step', '.stp', '.ply', '.off', '.gltf', '.glb'];
|
|
272
|
+
const iter = entries instanceof Map ? entries.values() : entries;
|
|
273
|
+
return Array.from(iter).filter((e) => {
|
|
274
|
+
const lower = e.path.toLowerCase();
|
|
275
|
+
return modelExts.some((ext) => lower.endsWith(ext));
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Find entries by content hash.
|
|
280
|
+
*/
|
|
281
|
+
function findByHash(entries, hash) {
|
|
282
|
+
const iter = entries instanceof Map ? entries.values() : entries;
|
|
283
|
+
return Array.from(iter).filter((e) => e.hash === hash);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* List entries belonging to a specific metamodel ID.
|
|
287
|
+
*/
|
|
288
|
+
function listByMetamodel(entries, metamodelId) {
|
|
289
|
+
const iter = entries instanceof Map ? entries.values() : entries;
|
|
290
|
+
return Array.from(iter).filter((e) => {
|
|
291
|
+
if (e.metamodels?.some((m) => m.id === metamodelId))
|
|
292
|
+
return true;
|
|
293
|
+
if (e.metamodel_id === metamodelId)
|
|
294
|
+
return true;
|
|
295
|
+
return false;
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
// ────────────────────────────────────────────────────────────────
|
|
299
|
+
// Internal utilities
|
|
300
|
+
// ────────────────────────────────────────────────────────────────
|
|
301
|
+
function buildResult(findings) {
|
|
302
|
+
const errors = findings.filter((f) => f.severity === 'ERROR').length;
|
|
303
|
+
const warnings = findings.filter((f) => f.severity === 'WARNING').length;
|
|
304
|
+
return { valid: errors === 0, findings, errors, warnings };
|
|
305
|
+
}
|
|
306
|
+
function bufferToHex(buf) {
|
|
307
|
+
return Array.from(buf)
|
|
308
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
309
|
+
.join('');
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* RFC 8785 (JCS) canonical JSON approximation.
|
|
313
|
+
*
|
|
314
|
+
* - Object keys sorted lexicographically (recursive)
|
|
315
|
+
* - Compact separators (no whitespace)
|
|
316
|
+
* - Numbers serialized without trailing zeros
|
|
317
|
+
*
|
|
318
|
+
* True JCS also prescribes specific float formatting; this approximation
|
|
319
|
+
* relies on V8/SpiderMonkey `JSON.stringify` number serialization which
|
|
320
|
+
* is compliant for common cases.
|
|
321
|
+
*/
|
|
322
|
+
function canonicalJsonStringify(value) {
|
|
323
|
+
return JSON.stringify(value, (_key, val) => {
|
|
324
|
+
if (val !== null && typeof val === 'object' && !Array.isArray(val)) {
|
|
325
|
+
// Sort object keys
|
|
326
|
+
const sorted = {};
|
|
327
|
+
for (const k of Object.keys(val).sort()) {
|
|
328
|
+
sorted[k] = val[k];
|
|
329
|
+
}
|
|
330
|
+
return sorted;
|
|
331
|
+
}
|
|
332
|
+
return val;
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=meshpack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meshpack.js","sourceRoot":"","sources":["../src/meshpack.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mesh-sync/meshpack — TypeScript SDK
|
|
3
|
+
*
|
|
4
|
+
* Type definitions derived from the MeshPack v1.0.0 JSON Schemas:
|
|
5
|
+
* schema/manifest.schema.json
|
|
6
|
+
* schema/shard.schema.json
|
|
7
|
+
* schema/common.schema.json
|
|
8
|
+
* schema/sidecar.schema.json
|
|
9
|
+
*
|
|
10
|
+
* Generated types — edit schemas, not this file.
|
|
11
|
+
*/
|
|
12
|
+
/** Supported hash algorithms. sha256 is RECOMMENDED for maximum compatibility. */
|
|
13
|
+
export type HashAlgorithm = 'sha256' | 'sha512' | 'blake3';
|
|
14
|
+
/** Prefixed hash value: `{algorithm}:{lowercase_hex}` */
|
|
15
|
+
export type HashValue = `sha256:${string}` | `sha512:${string}` | `blake3:${string}`;
|
|
16
|
+
/** Operating system on which the pack was created. */
|
|
17
|
+
export type OSType = 'linux' | 'windows' | 'darwin' | 'unknown';
|
|
18
|
+
/** Measurement units for 3D geometry. `unitless` if format does not specify. */
|
|
19
|
+
export type MeasurementUnit = 'mm' | 'cm' | 'm' | 'in' | 'ft' | 'unitless';
|
|
20
|
+
/** Up-axis orientation of the original model file. */
|
|
21
|
+
export type UpAxis = '+Z' | '-Z' | '+Y' | '-Y';
|
|
22
|
+
/** Metamodel role within an assembly or pack. */
|
|
23
|
+
export type MetamodelRole = 'canonical' | 'variant' | 'accessory' | 'doc';
|
|
24
|
+
/** Assembly part role. */
|
|
25
|
+
export type AssemblyRole = 'body' | 'support' | 'accessory' | 'texture' | 'doc';
|
|
26
|
+
/** Delta-pack operation type. */
|
|
27
|
+
export type DeltaOperation = 'add' | 'modify' | 'delete';
|
|
28
|
+
/** Behaviour when an incoming ID already exists. */
|
|
29
|
+
export type IdConflictPolicy = 'fail' | 'skip' | 'overwrite';
|
|
30
|
+
/** How metamodel structures are merged on import. */
|
|
31
|
+
export type MetamodelMergePolicy = 'strict' | 'merge' | 'replace';
|
|
32
|
+
/** Signature algorithms. */
|
|
33
|
+
export type SignatureAlgorithm = 'ed25519' | 'rsa-pss-sha256';
|
|
34
|
+
/** Metamodel filter mode for selective export. */
|
|
35
|
+
export type MetamodelFilterMode = 'all' | 'include' | 'exclude' | 'single';
|
|
36
|
+
/** Namespaced identifier for cross-system reconciliation. */
|
|
37
|
+
export interface NamespacedId {
|
|
38
|
+
/** Namespace prefix (e.g. `meshsync:model`, `thingiverse:thing`). */
|
|
39
|
+
ns: string;
|
|
40
|
+
/** Identifier value within the namespace. */
|
|
41
|
+
id: string;
|
|
42
|
+
}
|
|
43
|
+
/** Entity that generated the pack. */
|
|
44
|
+
export interface CreatorInfo {
|
|
45
|
+
/** Display name of the creator tool or person. */
|
|
46
|
+
name: string;
|
|
47
|
+
/** Optional email (PII — consider redacting for public distribution). */
|
|
48
|
+
email?: string;
|
|
49
|
+
}
|
|
50
|
+
/** Source platform metadata for cross-platform path handling. */
|
|
51
|
+
export interface PlatformInfo {
|
|
52
|
+
os: OSType;
|
|
53
|
+
path_separator: string;
|
|
54
|
+
is_case_sensitive: boolean;
|
|
55
|
+
}
|
|
56
|
+
/** Summary counts for the archive index. */
|
|
57
|
+
export interface IndexSummary {
|
|
58
|
+
total_files: number;
|
|
59
|
+
total_shards: number;
|
|
60
|
+
total_size_bytes?: number;
|
|
61
|
+
}
|
|
62
|
+
/** Reference to a shard in `manifest.shard_list`. */
|
|
63
|
+
export interface ShardListEntry {
|
|
64
|
+
/** Shard ID matching filename (e.g. `part-00001`). */
|
|
65
|
+
id: string;
|
|
66
|
+
entries_count: number;
|
|
67
|
+
entries_hash: HashValue;
|
|
68
|
+
}
|
|
69
|
+
/** Cryptographic signature over `pack_hash`. */
|
|
70
|
+
export interface SignatureEntry {
|
|
71
|
+
alg: SignatureAlgorithm;
|
|
72
|
+
public_key: string;
|
|
73
|
+
signature: string;
|
|
74
|
+
signer_id?: string;
|
|
75
|
+
signed_at?: string;
|
|
76
|
+
}
|
|
77
|
+
/** Provenance and configuration used to generate the pack. */
|
|
78
|
+
export interface Generation {
|
|
79
|
+
/** Tool name and version (e.g. `plugin-storage-localfilesystem@1.4.0`). */
|
|
80
|
+
generator?: string;
|
|
81
|
+
config?: Record<string, unknown>;
|
|
82
|
+
resume_token?: string;
|
|
83
|
+
/** If true, this is a delta pack referencing a base via `base_pack_hash`. */
|
|
84
|
+
partial?: boolean;
|
|
85
|
+
base_pack_hash?: HashValue;
|
|
86
|
+
metamodel_filter?: MetamodelFilter;
|
|
87
|
+
}
|
|
88
|
+
/** Filter applied during export for metamodel context. */
|
|
89
|
+
export interface MetamodelFilter {
|
|
90
|
+
mode: MetamodelFilterMode;
|
|
91
|
+
metamodel_ids?: string[];
|
|
92
|
+
collapse_roles?: boolean;
|
|
93
|
+
}
|
|
94
|
+
/** Guidance for conflict handling when importing into another system. */
|
|
95
|
+
export interface ImportPolicy {
|
|
96
|
+
id_conflict?: IdConflictPolicy;
|
|
97
|
+
metamodel_merge?: MetamodelMergePolicy;
|
|
98
|
+
strip_creator_info?: boolean;
|
|
99
|
+
}
|
|
100
|
+
/** Encryption metadata (reserved for v1.1+). */
|
|
101
|
+
export interface Encryption {
|
|
102
|
+
alg?: string;
|
|
103
|
+
recipients?: string[];
|
|
104
|
+
encrypted?: boolean;
|
|
105
|
+
}
|
|
106
|
+
/** Root metadata for a MeshPack archive. */
|
|
107
|
+
export interface Manifest {
|
|
108
|
+
format_version: string;
|
|
109
|
+
created_at: string;
|
|
110
|
+
workspace_id?: string | null;
|
|
111
|
+
creator_info: CreatorInfo;
|
|
112
|
+
license?: string | null;
|
|
113
|
+
platform_info: PlatformInfo;
|
|
114
|
+
hash_algo: HashAlgorithm;
|
|
115
|
+
pack_hash?: HashValue;
|
|
116
|
+
signatures?: SignatureEntry[];
|
|
117
|
+
index_summary: IndexSummary;
|
|
118
|
+
shard_list: ShardListEntry[];
|
|
119
|
+
ids?: NamespacedId[];
|
|
120
|
+
generation?: Generation;
|
|
121
|
+
import_policy?: ImportPolicy;
|
|
122
|
+
encryption?: Encryption;
|
|
123
|
+
extensions?: Record<string, unknown>;
|
|
124
|
+
}
|
|
125
|
+
/** Axis-aligned bounding box in the source file's coordinate system. */
|
|
126
|
+
export interface BoundingBox {
|
|
127
|
+
/** [x, y, z] minimum corner. */
|
|
128
|
+
min: [number, number, number];
|
|
129
|
+
/** [x, y, z] maximum corner. */
|
|
130
|
+
max: [number, number, number];
|
|
131
|
+
}
|
|
132
|
+
/** File attribute flags. */
|
|
133
|
+
export interface FileAttributes {
|
|
134
|
+
is_symlink?: boolean;
|
|
135
|
+
is_hidden?: boolean;
|
|
136
|
+
}
|
|
137
|
+
/** 4×4 homogeneous transform (column-major, glTF convention). */
|
|
138
|
+
export interface Transform {
|
|
139
|
+
/**
|
|
140
|
+
* Column-major 4×4 matrix:
|
|
141
|
+
* `[m00,m10,m20,m30, m01,m11,m21,m31, m02,m12,m22,m32, m03,m13,m23,m33]`
|
|
142
|
+
*/
|
|
143
|
+
matrix: [
|
|
144
|
+
number,
|
|
145
|
+
number,
|
|
146
|
+
number,
|
|
147
|
+
number,
|
|
148
|
+
number,
|
|
149
|
+
number,
|
|
150
|
+
number,
|
|
151
|
+
number,
|
|
152
|
+
number,
|
|
153
|
+
number,
|
|
154
|
+
number,
|
|
155
|
+
number,
|
|
156
|
+
number,
|
|
157
|
+
number,
|
|
158
|
+
number,
|
|
159
|
+
number
|
|
160
|
+
];
|
|
161
|
+
}
|
|
162
|
+
/** Assembly graph node. */
|
|
163
|
+
export interface Assembly {
|
|
164
|
+
assembly_id?: string;
|
|
165
|
+
parent_assembly_id?: string | null;
|
|
166
|
+
role?: AssemblyRole;
|
|
167
|
+
transform?: Transform;
|
|
168
|
+
}
|
|
169
|
+
/** Metamodel membership for a file entry. */
|
|
170
|
+
export interface MetamodelMembership {
|
|
171
|
+
id: string;
|
|
172
|
+
role: MetamodelRole;
|
|
173
|
+
}
|
|
174
|
+
/** An individual file indexed in a shard. */
|
|
175
|
+
export interface FileEntry {
|
|
176
|
+
/** Relative path from root (POSIX separators). */
|
|
177
|
+
path: string;
|
|
178
|
+
ids?: NamespacedId[];
|
|
179
|
+
original_name: string;
|
|
180
|
+
size_bytes: number;
|
|
181
|
+
/** Content hash of the original file on the source filesystem. */
|
|
182
|
+
hash: HashValue;
|
|
183
|
+
modified_at: string;
|
|
184
|
+
created_at?: string;
|
|
185
|
+
mime_type?: string;
|
|
186
|
+
units?: MeasurementUnit;
|
|
187
|
+
up_axis?: UpAxis;
|
|
188
|
+
bounding_box?: BoundingBox;
|
|
189
|
+
/** Reference to a file in `resources/` named `{hex_hash}.{ext}`. */
|
|
190
|
+
resource_ref?: string | null;
|
|
191
|
+
resource_hash?: HashValue;
|
|
192
|
+
resource_size_bytes?: number;
|
|
193
|
+
attributes?: FileAttributes;
|
|
194
|
+
/** @deprecated Use `metamodels` array. */
|
|
195
|
+
metamodel_id?: string;
|
|
196
|
+
/** @deprecated Use `metamodels` array. */
|
|
197
|
+
metamodel_role?: MetamodelRole;
|
|
198
|
+
/** 1:N metamodel memberships. Supersedes `metamodel_id`/`metamodel_role`. */
|
|
199
|
+
metamodels?: MetamodelMembership[];
|
|
200
|
+
assembly?: Assembly;
|
|
201
|
+
preview_ref?: string;
|
|
202
|
+
/** Delta-pack operation. Only present when `manifest.generation.partial=true`. */
|
|
203
|
+
operation?: DeltaOperation;
|
|
204
|
+
extensions?: Record<string, unknown>;
|
|
205
|
+
}
|
|
206
|
+
/** Sharded file index containing a subset of file entries. */
|
|
207
|
+
export interface Shard {
|
|
208
|
+
/** Shard identifier matching filename (e.g. `part-00001`). */
|
|
209
|
+
shard_id: string;
|
|
210
|
+
format_version: string;
|
|
211
|
+
entries_hash: HashValue;
|
|
212
|
+
entries_count: number;
|
|
213
|
+
/** @deprecated Use `manifest.creator_info`. Removed in v2.0. */
|
|
214
|
+
creator_info?: CreatorInfo;
|
|
215
|
+
/** Entries sorted by `path` (UTF-8 byte order). */
|
|
216
|
+
entries: FileEntry[];
|
|
217
|
+
}
|
|
218
|
+
/** Detached integrity file (`.meshpack.integrity`). */
|
|
219
|
+
export interface Sidecar {
|
|
220
|
+
format_version: string;
|
|
221
|
+
pack_hash: HashValue;
|
|
222
|
+
hash_algo: HashAlgorithm;
|
|
223
|
+
generated_at: string;
|
|
224
|
+
signatures?: SignatureEntry[];
|
|
225
|
+
}
|
|
226
|
+
/** Well-known extension names. */
|
|
227
|
+
export declare const ExtensionNames: {
|
|
228
|
+
readonly MESHSYNC_GEOMETRY: "meshsync_geometry";
|
|
229
|
+
readonly MESHSYNC_DEPENDENCIES: "meshsync_dependencies";
|
|
230
|
+
readonly MESHSYNC_PRINTABILITY: "meshsync_printability";
|
|
231
|
+
readonly MESHSYNC_CONTENT: "meshsync_content";
|
|
232
|
+
};
|
|
233
|
+
/** Supported versions per extension. */
|
|
234
|
+
export declare const ExtensionVersions: Readonly<Record<string, readonly string[]>>;
|
|
235
|
+
/** MeshSync geometry extension v1 payload. */
|
|
236
|
+
export interface GeometryV1 {
|
|
237
|
+
vertices?: number;
|
|
238
|
+
faces?: number;
|
|
239
|
+
edges?: number;
|
|
240
|
+
volume_cubic_mm?: number;
|
|
241
|
+
surface_area_mm2?: number;
|
|
242
|
+
is_manifold?: boolean;
|
|
243
|
+
is_watertight?: boolean;
|
|
244
|
+
genus?: number;
|
|
245
|
+
quality_score?: number;
|
|
246
|
+
[key: string]: unknown;
|
|
247
|
+
}
|
|
248
|
+
/** MeshSync dependencies extension v1 payload. */
|
|
249
|
+
export interface DependenciesV1 {
|
|
250
|
+
depends_on?: string[];
|
|
251
|
+
[key: string]: unknown;
|
|
252
|
+
}
|
|
253
|
+
/** MeshSync printability extension v1 payload. */
|
|
254
|
+
export interface PrintabilityV1 {
|
|
255
|
+
printability_score?: number;
|
|
256
|
+
issues?: string[];
|
|
257
|
+
[key: string]: unknown;
|
|
258
|
+
}
|
|
259
|
+
/** MeshSync content extension v1 payload (language and description). */
|
|
260
|
+
export interface ContentV1 {
|
|
261
|
+
language?: string;
|
|
262
|
+
description?: string;
|
|
263
|
+
[key: string]: unknown;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @mesh-sync/meshpack — TypeScript SDK
|
|
4
|
+
*
|
|
5
|
+
* Type definitions derived from the MeshPack v1.0.0 JSON Schemas:
|
|
6
|
+
* schema/manifest.schema.json
|
|
7
|
+
* schema/shard.schema.json
|
|
8
|
+
* schema/common.schema.json
|
|
9
|
+
* schema/sidecar.schema.json
|
|
10
|
+
*
|
|
11
|
+
* Generated types — edit schemas, not this file.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.ExtensionVersions = exports.ExtensionNames = void 0;
|
|
15
|
+
// ────────────────────────────────────────────────────────────────
|
|
16
|
+
// Extension system
|
|
17
|
+
// ────────────────────────────────────────────────────────────────
|
|
18
|
+
/** Well-known extension names. */
|
|
19
|
+
exports.ExtensionNames = {
|
|
20
|
+
MESHSYNC_GEOMETRY: 'meshsync_geometry',
|
|
21
|
+
MESHSYNC_DEPENDENCIES: 'meshsync_dependencies',
|
|
22
|
+
MESHSYNC_PRINTABILITY: 'meshsync_printability',
|
|
23
|
+
MESHSYNC_CONTENT: 'meshsync_content',
|
|
24
|
+
};
|
|
25
|
+
/** Supported versions per extension. */
|
|
26
|
+
exports.ExtensionVersions = {
|
|
27
|
+
meshsync_geometry: ['v1'],
|
|
28
|
+
meshsync_dependencies: ['v1'],
|
|
29
|
+
meshsync_printability: ['v1'],
|
|
30
|
+
meshsync_content: ['v1'],
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AA+PH,mEAAmE;AACnE,mBAAmB;AACnB,mEAAmE;AAEnE,kCAAkC;AACrB,QAAA,cAAc,GAAG;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,qBAAqB,EAAE,uBAAuB;IAC9C,qBAAqB,EAAE,uBAAuB;IAC9C,gBAAgB,EAAE,kBAAkB;CAC5B,CAAC;AAEX,wCAAwC;AAC3B,QAAA,iBAAiB,GAAgD;IAC5E,iBAAiB,EAAE,CAAC,IAAI,CAAC;IACzB,qBAAqB,EAAE,CAAC,IAAI,CAAC;IAC7B,qBAAqB,EAAE,CAAC,IAAI,CAAC;IAC7B,gBAAgB,EAAE,CAAC,IAAI,CAAC;CACzB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mesh-sync/meshpack",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "TypeScript SDK for the MeshPack v1.0.0 container format — read, write, and validate .meshpack archives",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": ["dist"],
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"clean": "rm -rf dist",
|
|
12
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"jszip": "^3.10.1"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"typescript": "^5.0.0",
|
|
19
|
+
"@types/node": "^20.0.0"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18"
|
|
23
|
+
},
|
|
24
|
+
"keywords": ["meshpack", "meshsync", "3d", "packaging", "zip"]
|
|
25
|
+
}
|