@absolutejs/manifest
Advanced tools
+20
-4
@@ -437,9 +437,17 @@ #!/usr/bin/env bun | ||
| } | ||
| const { artifactImports, buildExternals, optional, range, tested } = value; | ||
| const { | ||
| artifactImports, | ||
| artifactReferences, | ||
| buildExternals, | ||
| optional, | ||
| range, | ||
| tested | ||
| } = value; | ||
| const artifactImportList = parseStringList(artifactImports); | ||
| const artifactReferenceList = parseStringList(artifactReferences, true); | ||
| const externalList = parseStringList(buildExternals, true); | ||
| if (runtime.length === 0 || typeof range !== "string" || range.length === 0 || typeof tested !== "string" || !EXACT_VERSION.test(tested) || optional !== undefined && typeof optional !== "boolean" || artifactImportList === undefined || externalList === undefined || new Set(artifactImportList).size !== artifactImportList.length || new Set(externalList).size !== externalList.length) { | ||
| if (runtime.length === 0 || typeof range !== "string" || range.length === 0 || typeof tested !== "string" || !EXACT_VERSION.test(tested) || optional !== undefined && typeof optional !== "boolean" || artifactImportList === undefined || artifactReferenceList === undefined || externalList === undefined || new Set(artifactImportList).size !== artifactImportList.length || new Set(artifactReferenceList).size !== artifactReferenceList.length || new Set(externalList).size !== externalList.length) { | ||
| issues.push({ | ||
| code: "invalid_policy", | ||
| message: `absolutejs.runtimePeers["${runtime}"] requires a non-empty range, exact tested version, optional boolean, explicit unique artifactImports, and unique buildExternals`, | ||
| message: `absolutejs.runtimePeers["${runtime}"] requires a non-empty range, exact tested version, optional boolean, explicit unique artifactImports, unique artifactReferences, and unique buildExternals`, | ||
| runtime | ||
@@ -451,2 +459,3 @@ }); | ||
| artifactImports: artifactImportList, | ||
| artifactReferences: artifactReferenceList, | ||
| buildExternals: externalList, | ||
@@ -540,2 +549,9 @@ optional: optional === true, | ||
| }); | ||
| for (const reference of policy.artifactReferences ?? []) | ||
| if (!Object.values(artifacts).some((contents) => contents.includes(reference))) | ||
| issues.push({ | ||
| code: "artifact_reference_missing", | ||
| message: `built JavaScript must retain the dynamic reference ${JSON.stringify(reference)} for host-owned runtime ${runtime}`, | ||
| runtime | ||
| }); | ||
| } | ||
@@ -746,3 +762,3 @@ return issues.length === 0 ? { issues: [], ok: true } : { issues, ok: false }; | ||
| //# debugId=CDAAD994FD5C054C64756E2164756E21 | ||
| //# debugId=158590DDEB43CAE864756E2164756E21 | ||
| //# sourceMappingURL=cli.js.map |
+20
-4
@@ -647,9 +647,17 @@ // @bun | ||
| } | ||
| const { artifactImports, buildExternals, optional, range, tested } = value; | ||
| const { | ||
| artifactImports, | ||
| artifactReferences, | ||
| buildExternals, | ||
| optional, | ||
| range, | ||
| tested | ||
| } = value; | ||
| const artifactImportList = parseStringList(artifactImports); | ||
| const artifactReferenceList = parseStringList(artifactReferences, true); | ||
| const externalList = parseStringList(buildExternals, true); | ||
| if (runtime.length === 0 || typeof range !== "string" || range.length === 0 || typeof tested !== "string" || !EXACT_VERSION.test(tested) || optional !== undefined && typeof optional !== "boolean" || artifactImportList === undefined || externalList === undefined || new Set(artifactImportList).size !== artifactImportList.length || new Set(externalList).size !== externalList.length) { | ||
| if (runtime.length === 0 || typeof range !== "string" || range.length === 0 || typeof tested !== "string" || !EXACT_VERSION.test(tested) || optional !== undefined && typeof optional !== "boolean" || artifactImportList === undefined || artifactReferenceList === undefined || externalList === undefined || new Set(artifactImportList).size !== artifactImportList.length || new Set(artifactReferenceList).size !== artifactReferenceList.length || new Set(externalList).size !== externalList.length) { | ||
| issues.push({ | ||
| code: "invalid_policy", | ||
| message: `absolutejs.runtimePeers["${runtime}"] requires a non-empty range, exact tested version, optional boolean, explicit unique artifactImports, and unique buildExternals`, | ||
| message: `absolutejs.runtimePeers["${runtime}"] requires a non-empty range, exact tested version, optional boolean, explicit unique artifactImports, unique artifactReferences, and unique buildExternals`, | ||
| runtime | ||
@@ -661,2 +669,3 @@ }); | ||
| artifactImports: artifactImportList, | ||
| artifactReferences: artifactReferenceList, | ||
| buildExternals: externalList, | ||
@@ -750,2 +759,9 @@ optional: optional === true, | ||
| }); | ||
| for (const reference of policy.artifactReferences ?? []) | ||
| if (!Object.values(artifacts).some((contents) => contents.includes(reference))) | ||
| issues.push({ | ||
| code: "artifact_reference_missing", | ||
| message: `built JavaScript must retain the dynamic reference ${JSON.stringify(reference)} for host-owned runtime ${runtime}`, | ||
| runtime | ||
| }); | ||
| } | ||
@@ -776,3 +792,3 @@ return issues.length === 0 ? { issues: [], ok: true } : { issues, ok: false }; | ||
| //# debugId=8009D22535851E1064756E2164756E21 | ||
| //# debugId=D1FD94F105058A1964756E2164756E21 | ||
| //# sourceMappingURL=index.js.map |
| export type RuntimePeerPolicy = { | ||
| artifactImports: readonly string[]; | ||
| artifactReferences?: readonly string[]; | ||
| buildExternals?: readonly string[]; | ||
@@ -9,3 +10,3 @@ optional?: boolean; | ||
| export type PackageRuntimePolicyIssue = { | ||
| code: "artifact_import_missing" | "dependency_conflict" | "dev_dependency_mismatch" | "external_missing" | "invalid_policy" | "optional_mismatch" | "peer_range_mismatch" | "unclassified_peer"; | ||
| code: "artifact_import_missing" | "artifact_reference_missing" | "dependency_conflict" | "dev_dependency_mismatch" | "external_missing" | "invalid_policy" | "optional_mismatch" | "peer_range_mismatch" | "unclassified_peer"; | ||
| message: string; | ||
@@ -12,0 +13,0 @@ runtime?: string; |
+1
-1
| { | ||
| "name": "@absolutejs/manifest", | ||
| "version": "0.7.1", | ||
| "version": "0.7.2", | ||
| "description": "The AbsoluteJS package manifest contract. Every @absolutejs/* package exports a typed manifest (settings schema, env requirements, adapter slots, wiring recipes, AI tools) from its ./manifest subpath; this package is the contract those manifests are written against, plus bridges that turn any manifest into an AI tool map or a remote MCP tool registry.", | ||
@@ -5,0 +5,0 @@ "repository": { |
+5
-1
@@ -159,2 +159,3 @@ # @absolutejs/manifest | ||
| "artifactImports": ["@absolutejs/agency"], | ||
| "artifactReferences": [], | ||
| "range": ">=0.7.1 <0.8.0", | ||
@@ -192,3 +193,6 @@ "tested": "0.7.1", | ||
| JavaScript because it was bundled. An empty `artifactImports` array is the | ||
| explicit declaration that a peer is type-only; omission is never that | ||
| explicit declaration that no static import survives. A dynamically resolved | ||
| peer must instead declare stable `artifactReferences` strings that survive in | ||
| the built JavaScript (for example, a host `node_modules/sharp` lookup); only a | ||
| peer with both evidence arrays empty is type-only. Omission is never a | ||
| declaration. Keep compatibility windows conservative; supporting a new pre-1.0 | ||
@@ -195,0 +199,0 @@ minor requires a deliberate package release. |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
306369
1.37%2375
1.41%247
1.65%