@ankhorage/contracts 22.1.1 → 22.1.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @ankhorage/contracts
2
2
 
3
+ ## 22.1.2
4
+
5
+ ### Patch Changes
6
+
7
+ - bc6d757: Make the structure runtime subpath loadable directly under Node ESM by emitting explicit JavaScript module specifiers.
8
+
3
9
  ## 22.1.1
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # @ankhorage/contracts
5
5
 
6
- ![license: MIT](././paradox/badges/license.svg) ![npm: v22.1.1](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
6
+ ![license: MIT](././paradox/badges/license.svg) ![npm: v22.1.2](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
7
7
 
8
8
  Serializable app, action, theme, auth, and secret-store contracts for Ankhorage.
9
9
 
@@ -1,5 +1,5 @@
1
1
  export type { EntityRegistry, SerializableSet, ValueMap } from '../collections';
2
- export { isStructureDescriptor } from './isStructureDescriptor';
3
- export { isStructureDescriptorDocument } from './isStructureDescriptorDocument';
4
- export type { StructureDescriptor, StructureDescriptorDefinition, StructureDescriptorDocument, StructureDescriptorId, StructureDescriptorRegistry, StructureEntityRegistryDescriptor, StructureEnumDescriptor, StructureLiteralValue, StructureObjectDescriptor, StructureObjectField, StructureOrderedListDescriptor, StructureReferenceDescriptor, StructureScalarDescriptor, StructureScalarType, StructureSetDescriptor, StructureUnionDescriptor, StructureValueMapDescriptor, } from './types';
2
+ export { isStructureDescriptor } from './isStructureDescriptor.js';
3
+ export { isStructureDescriptorDocument } from './isStructureDescriptorDocument.js';
4
+ export type { StructureDescriptor, StructureDescriptorDefinition, StructureDescriptorDocument, StructureDescriptorId, StructureDescriptorRegistry, StructureEntityRegistryDescriptor, StructureEnumDescriptor, StructureLiteralValue, StructureObjectDescriptor, StructureObjectField, StructureOrderedListDescriptor, StructureReferenceDescriptor, StructureScalarDescriptor, StructureScalarType, StructureSetDescriptor, StructureUnionDescriptor, StructureValueMapDescriptor, } from './types.js';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/structure/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,YAAY,EACV,mBAAmB,EACnB,6BAA6B,EAC7B,2BAA2B,EAC3B,qBAAqB,EACrB,2BAA2B,EAC3B,iCAAiC,EACjC,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,8BAA8B,EAC9B,4BAA4B,EAC5B,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/structure/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,YAAY,EACV,mBAAmB,EACnB,6BAA6B,EAC7B,2BAA2B,EAC3B,qBAAqB,EACrB,2BAA2B,EAC3B,iCAAiC,EACjC,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,8BAA8B,EAC9B,4BAA4B,EAC5B,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,YAAY,CAAC"}
@@ -1,3 +1,3 @@
1
- export { isStructureDescriptor } from './isStructureDescriptor';
2
- export { isStructureDescriptorDocument } from './isStructureDescriptorDocument';
1
+ export { isStructureDescriptor } from './isStructureDescriptor.js';
2
+ export { isStructureDescriptorDocument } from './isStructureDescriptorDocument.js';
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/structure/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC","sourcesContent":["export type { EntityRegistry, SerializableSet, ValueMap } from '../collections';\nexport { isStructureDescriptor } from './isStructureDescriptor';\nexport { isStructureDescriptorDocument } from './isStructureDescriptorDocument';\nexport type {\n StructureDescriptor,\n StructureDescriptorDefinition,\n StructureDescriptorDocument,\n StructureDescriptorId,\n StructureDescriptorRegistry,\n StructureEntityRegistryDescriptor,\n StructureEnumDescriptor,\n StructureLiteralValue,\n StructureObjectDescriptor,\n StructureObjectField,\n StructureOrderedListDescriptor,\n StructureReferenceDescriptor,\n StructureScalarDescriptor,\n StructureScalarType,\n StructureSetDescriptor,\n StructureUnionDescriptor,\n StructureValueMapDescriptor,\n} from './types';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/structure/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC","sourcesContent":["export type { EntityRegistry, SerializableSet, ValueMap } from '../collections';\nexport { isStructureDescriptor } from './isStructureDescriptor.js';\nexport { isStructureDescriptorDocument } from './isStructureDescriptorDocument.js';\nexport type {\n StructureDescriptor,\n StructureDescriptorDefinition,\n StructureDescriptorDocument,\n StructureDescriptorId,\n StructureDescriptorRegistry,\n StructureEntityRegistryDescriptor,\n StructureEnumDescriptor,\n StructureLiteralValue,\n StructureObjectDescriptor,\n StructureObjectField,\n StructureOrderedListDescriptor,\n StructureReferenceDescriptor,\n StructureScalarDescriptor,\n StructureScalarType,\n StructureSetDescriptor,\n StructureUnionDescriptor,\n StructureValueMapDescriptor,\n} from './types.js';\n"]}
@@ -1,4 +1,4 @@
1
- import type { StructureDescriptorDocument } from './types';
1
+ import type { StructureDescriptorDocument } from './types.js';
2
2
  /*** Validate a complete package structural-descriptor document and all resolvable references. */
3
3
  export declare function isStructureDescriptorDocument(value: unknown): value is StructureDescriptorDocument;
4
4
  //# sourceMappingURL=isStructureDescriptorDocument.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isStructureDescriptorDocument.d.ts","sourceRoot":"","sources":["../../src/structure/isStructureDescriptorDocument.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAGV,2BAA2B,EAG5B,MAAM,SAAS,CAAC;AAEjB,iGAAiG;AACjG,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,2BAA2B,CA2BtC"}
1
+ {"version":3,"file":"isStructureDescriptorDocument.d.ts","sourceRoot":"","sources":["../../src/structure/isStructureDescriptorDocument.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAGV,2BAA2B,EAG5B,MAAM,YAAY,CAAC;AAEpB,iGAAiG;AACjG,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,2BAA2B,CA2BtC"}
@@ -1,6 +1,6 @@
1
1
  import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';
2
2
  import { isNonEmptyString } from '@ankhorage/utility/string';
3
- import { isStructureDescriptor } from './isStructureDescriptor';
3
+ import { isStructureDescriptor } from './isStructureDescriptor.js';
4
4
  /*** Validate a complete package structural-descriptor document and all resolvable references. */
5
5
  export function isStructureDescriptorDocument(value) {
6
6
  if (!isRecord(value) ||
@@ -1 +1 @@
1
- {"version":3,"file":"isStructureDescriptorDocument.js","sourceRoot":"","sources":["../../src/structure/isStructureDescriptorDocument.ts"],"names":[],"mappings":"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","sourcesContent":["import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';\nimport { isNonEmptyString } from '@ankhorage/utility/string';\n\nimport { isStructureDescriptor } from './isStructureDescriptor';\nimport type {\n StructureDescriptor,\n StructureDescriptorDefinition,\n StructureDescriptorDocument,\n StructureDescriptorId,\n StructureDescriptorRegistry,\n} from './types';\n\n/*** Validate a complete package structural-descriptor document and all resolvable references. */\nexport function isStructureDescriptorDocument(\n value: unknown,\n): value is StructureDescriptorDocument {\n if (\n !isRecord(value) ||\n !hasOnlyKeys(value, [\n 'protocolVersion',\n 'packageName',\n 'packageVersion',\n 'roots',\n 'descriptors',\n ]) ||\n value.protocolVersion !== 1 ||\n !isNonEmptyString(value.packageName) ||\n !isNonEmptyString(value.packageVersion) ||\n !isRootMap(value.roots) ||\n !isDescriptorRegistry(value.descriptors)\n ) {\n return false;\n }\n\n const document: StructureDescriptorDocument = {\n protocolVersion: 1,\n packageName: value.packageName,\n packageVersion: value.packageVersion,\n roots: value.roots,\n descriptors: value.descriptors,\n };\n return hasResolvableRoots(document) && isDescriptorGraphValid(document);\n}\n\n/*** Validate the root-name to local-descriptor-ID map. */\nfunction isRootMap(value: unknown): value is Readonly<Record<string, StructureDescriptorId>> {\n return (\n isRecord(value) &&\n Object.keys(value).length > 0 &&\n Object.entries(value).every(\n ([name, descriptorId]) => isNonEmptyString(name) && isNonEmptyString(descriptorId),\n )\n );\n}\n\n/*** Validate descriptor definitions and enforce record-key to definition-ID identity. */\nfunction isDescriptorRegistry(value: unknown): value is StructureDescriptorRegistry {\n return (\n isRecord(value) &&\n Object.keys(value).length > 0 &&\n Object.entries(value).every(([descriptorId, definition]) =>\n isDefinition(definition, descriptorId),\n )\n );\n}\n\n/*** Validate one descriptor definition against its stable registry key. */\nfunction isDefinition(\n value: unknown,\n descriptorId: string,\n): value is StructureDescriptorDefinition {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['id', 'descriptor']) &&\n value.id === descriptorId &&\n isNonEmptyString(value.id) &&\n isStructureDescriptor(value.descriptor)\n );\n}\n\n/*** Require every document root to resolve to one local descriptor definition. */\nfunction hasResolvableRoots(document: StructureDescriptorDocument): boolean {\n const descriptors = new Map(Object.entries(document.descriptors));\n return Object.values(document.roots).every((descriptorId) => descriptors.has(descriptorId));\n}\n\n/*** Validate local references, recursive graphs, and string-only collection key/member descriptors. */\nfunction isDescriptorGraphValid(document: StructureDescriptorDocument): boolean {\n const definitions = new Map(Object.entries(document.descriptors));\n return Array.from(definitions.values()).every((definition) =>\n validateGraphNode(definition.descriptor, document, new Set()),\n );\n}\n\n/*** Validate one graph node while treating revisited local refs as a valid recursive cycle. */\nfunction validateGraphNode(\n descriptor: StructureDescriptor,\n document: StructureDescriptorDocument,\n visitedRefs: Set<string>,\n): boolean {\n switch (descriptor.kind) {\n case 'object':\n return Object.values(descriptor.fields).every((field) =>\n validateGraphNode(field.value, document, new Set(visitedRefs)),\n );\n case 'entity-registry':\n case 'value-map':\n return (\n isStringCompatible(descriptor.key, document, new Set()) &&\n validateGraphNode(descriptor.value, document, new Set(visitedRefs))\n );\n case 'set':\n return isStringCompatible(descriptor.member, document, new Set());\n case 'ordered-list':\n return validateGraphNode(descriptor.item, document, new Set(visitedRefs));\n case 'union':\n return descriptor.variants.every((variant) =>\n validateGraphNode(variant, document, new Set(visitedRefs)),\n );\n case 'ref':\n return validateReference(descriptor, document, visitedRefs);\n default:\n return true;\n }\n}\n\n/*** Resolve and validate one local reference while deferring package-qualified refs to composition. */\nfunction validateReference(\n descriptor: Extract<StructureDescriptor, { readonly kind: 'ref' }>,\n document: StructureDescriptorDocument,\n visitedRefs: Set<string>,\n): boolean {\n if (descriptor.packageName && descriptor.packageName !== document.packageName) return true;\n if (visitedRefs.has(descriptor.id)) return true;\n\n const definition = new Map(Object.entries(document.descriptors)).get(descriptor.id);\n if (!definition) return false;\n\n const nextRefs = new Set(visitedRefs);\n nextRefs.add(descriptor.id);\n return validateGraphNode(definition.descriptor, document, nextRefs);\n}\n\n/*** Prove that a collection key/member descriptor is string-valued when locally resolvable. */\nfunction isStringCompatible(\n descriptor: StructureDescriptor,\n document: StructureDescriptorDocument,\n visitedRefs: Set<string>,\n): boolean {\n if (descriptor.kind === 'scalar') return descriptor.type === 'string';\n if (descriptor.kind === 'enum') {\n return descriptor.values.every((value) => typeof value === 'string');\n }\n if (descriptor.kind !== 'ref') return false;\n if (descriptor.packageName && descriptor.packageName !== document.packageName) return true;\n if (visitedRefs.has(descriptor.id)) return false;\n\n const definition = new Map(Object.entries(document.descriptors)).get(descriptor.id);\n if (!definition) return false;\n\n const nextRefs = new Set(visitedRefs);\n nextRefs.add(descriptor.id);\n return isStringCompatible(definition.descriptor, document, nextRefs);\n}\n"]}
1
+ {"version":3,"file":"isStructureDescriptorDocument.js","sourceRoot":"","sources":["../../src/structure/isStructureDescriptorDocument.ts"],"names":[],"mappings":"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","sourcesContent":["import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';\nimport { isNonEmptyString } from '@ankhorage/utility/string';\n\nimport { isStructureDescriptor } from './isStructureDescriptor.js';\nimport type {\n StructureDescriptor,\n StructureDescriptorDefinition,\n StructureDescriptorDocument,\n StructureDescriptorId,\n StructureDescriptorRegistry,\n} from './types.js';\n\n/*** Validate a complete package structural-descriptor document and all resolvable references. */\nexport function isStructureDescriptorDocument(\n value: unknown,\n): value is StructureDescriptorDocument {\n if (\n !isRecord(value) ||\n !hasOnlyKeys(value, [\n 'protocolVersion',\n 'packageName',\n 'packageVersion',\n 'roots',\n 'descriptors',\n ]) ||\n value.protocolVersion !== 1 ||\n !isNonEmptyString(value.packageName) ||\n !isNonEmptyString(value.packageVersion) ||\n !isRootMap(value.roots) ||\n !isDescriptorRegistry(value.descriptors)\n ) {\n return false;\n }\n\n const document: StructureDescriptorDocument = {\n protocolVersion: 1,\n packageName: value.packageName,\n packageVersion: value.packageVersion,\n roots: value.roots,\n descriptors: value.descriptors,\n };\n return hasResolvableRoots(document) && isDescriptorGraphValid(document);\n}\n\n/*** Validate the root-name to local-descriptor-ID map. */\nfunction isRootMap(value: unknown): value is Readonly<Record<string, StructureDescriptorId>> {\n return (\n isRecord(value) &&\n Object.keys(value).length > 0 &&\n Object.entries(value).every(\n ([name, descriptorId]) => isNonEmptyString(name) && isNonEmptyString(descriptorId),\n )\n );\n}\n\n/*** Validate descriptor definitions and enforce record-key to definition-ID identity. */\nfunction isDescriptorRegistry(value: unknown): value is StructureDescriptorRegistry {\n return (\n isRecord(value) &&\n Object.keys(value).length > 0 &&\n Object.entries(value).every(([descriptorId, definition]) =>\n isDefinition(definition, descriptorId),\n )\n );\n}\n\n/*** Validate one descriptor definition against its stable registry key. */\nfunction isDefinition(\n value: unknown,\n descriptorId: string,\n): value is StructureDescriptorDefinition {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ['id', 'descriptor']) &&\n value.id === descriptorId &&\n isNonEmptyString(value.id) &&\n isStructureDescriptor(value.descriptor)\n );\n}\n\n/*** Require every document root to resolve to one local descriptor definition. */\nfunction hasResolvableRoots(document: StructureDescriptorDocument): boolean {\n const descriptors = new Map(Object.entries(document.descriptors));\n return Object.values(document.roots).every((descriptorId) => descriptors.has(descriptorId));\n}\n\n/*** Validate local references, recursive graphs, and string-only collection key/member descriptors. */\nfunction isDescriptorGraphValid(document: StructureDescriptorDocument): boolean {\n const definitions = new Map(Object.entries(document.descriptors));\n return Array.from(definitions.values()).every((definition) =>\n validateGraphNode(definition.descriptor, document, new Set()),\n );\n}\n\n/*** Validate one graph node while treating revisited local refs as a valid recursive cycle. */\nfunction validateGraphNode(\n descriptor: StructureDescriptor,\n document: StructureDescriptorDocument,\n visitedRefs: Set<string>,\n): boolean {\n switch (descriptor.kind) {\n case 'object':\n return Object.values(descriptor.fields).every((field) =>\n validateGraphNode(field.value, document, new Set(visitedRefs)),\n );\n case 'entity-registry':\n case 'value-map':\n return (\n isStringCompatible(descriptor.key, document, new Set()) &&\n validateGraphNode(descriptor.value, document, new Set(visitedRefs))\n );\n case 'set':\n return isStringCompatible(descriptor.member, document, new Set());\n case 'ordered-list':\n return validateGraphNode(descriptor.item, document, new Set(visitedRefs));\n case 'union':\n return descriptor.variants.every((variant) =>\n validateGraphNode(variant, document, new Set(visitedRefs)),\n );\n case 'ref':\n return validateReference(descriptor, document, visitedRefs);\n default:\n return true;\n }\n}\n\n/*** Resolve and validate one local reference while deferring package-qualified refs to composition. */\nfunction validateReference(\n descriptor: Extract<StructureDescriptor, { readonly kind: 'ref' }>,\n document: StructureDescriptorDocument,\n visitedRefs: Set<string>,\n): boolean {\n if (descriptor.packageName && descriptor.packageName !== document.packageName) return true;\n if (visitedRefs.has(descriptor.id)) return true;\n\n const definition = new Map(Object.entries(document.descriptors)).get(descriptor.id);\n if (!definition) return false;\n\n const nextRefs = new Set(visitedRefs);\n nextRefs.add(descriptor.id);\n return validateGraphNode(definition.descriptor, document, nextRefs);\n}\n\n/*** Prove that a collection key/member descriptor is string-valued when locally resolvable. */\nfunction isStringCompatible(\n descriptor: StructureDescriptor,\n document: StructureDescriptorDocument,\n visitedRefs: Set<string>,\n): boolean {\n if (descriptor.kind === 'scalar') return descriptor.type === 'string';\n if (descriptor.kind === 'enum') {\n return descriptor.values.every((value) => typeof value === 'string');\n }\n if (descriptor.kind !== 'ref') return false;\n if (descriptor.packageName && descriptor.packageName !== document.packageName) return true;\n if (visitedRefs.has(descriptor.id)) return false;\n\n const definition = new Map(Object.entries(document.descriptors)).get(descriptor.id);\n if (!definition) return false;\n\n const nextRefs = new Set(visitedRefs);\n nextRefs.add(descriptor.id);\n return isStringCompatible(definition.descriptor, document, nextRefs);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ankhorage/contracts",
3
- "version": "22.1.1",
3
+ "version": "22.1.2",
4
4
  "main": "./dist/index.js",
5
5
  "ankh": {
6
6
  "category": "contracts",
@@ -14,7 +14,7 @@
14
14
  "@ankhorage/utility": "^1.4.0"
15
15
  },
16
16
  "devDependencies": {
17
- "@ankhorage/devtools": "^1.17.2",
17
+ "@ankhorage/devtools": "^1.18.0",
18
18
  "@ankhorage/paradox": "^0.1.26",
19
19
  "@types/bun": "^1.4.1",
20
20
  "@types/node": "^25.2.3",
@@ -1,6 +1,6 @@
1
1
  export type { EntityRegistry, SerializableSet, ValueMap } from '../collections';
2
- export { isStructureDescriptor } from './isStructureDescriptor';
3
- export { isStructureDescriptorDocument } from './isStructureDescriptorDocument';
2
+ export { isStructureDescriptor } from './isStructureDescriptor.js';
3
+ export { isStructureDescriptorDocument } from './isStructureDescriptorDocument.js';
4
4
  export type {
5
5
  StructureDescriptor,
6
6
  StructureDescriptorDefinition,
@@ -19,4 +19,4 @@ export type {
19
19
  StructureSetDescriptor,
20
20
  StructureUnionDescriptor,
21
21
  StructureValueMapDescriptor,
22
- } from './types';
22
+ } from './types.js';
@@ -1,14 +1,14 @@
1
1
  import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';
2
2
  import { isNonEmptyString } from '@ankhorage/utility/string';
3
3
 
4
- import { isStructureDescriptor } from './isStructureDescriptor';
4
+ import { isStructureDescriptor } from './isStructureDescriptor.js';
5
5
  import type {
6
6
  StructureDescriptor,
7
7
  StructureDescriptorDefinition,
8
8
  StructureDescriptorDocument,
9
9
  StructureDescriptorId,
10
10
  StructureDescriptorRegistry,
11
- } from './types';
11
+ } from './types.js';
12
12
 
13
13
  /*** Validate a complete package structural-descriptor document and all resolvable references. */
14
14
  export function isStructureDescriptorDocument(