pray-cli 1.9.1 → 1.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/CHANGELOG.md +25 -0
- package/dist/archive/path-safety.d.ts +2 -0
- package/dist/archive/path-safety.d.ts.map +1 -0
- package/dist/archive/path-safety.js +18 -0
- package/dist/archive/path-safety.js.map +1 -0
- package/dist/archive/praypkg.d.ts.map +1 -1
- package/dist/archive/praypkg.js +35 -9
- package/dist/archive/praypkg.js.map +1 -1
- package/dist/archive/tar.d.ts +3 -0
- package/dist/archive/tar.d.ts.map +1 -0
- package/dist/archive/tar.js +157 -0
- package/dist/archive/tar.js.map +1 -0
- package/dist/auth/session.d.ts +1 -1
- package/dist/auth/session.d.ts.map +1 -1
- package/dist/auth/session.js +29 -4
- package/dist/auth/session.js.map +1 -1
- package/dist/cli/commands/init.js +1 -1
- package/dist/cli/commands/inspect.d.ts.map +1 -1
- package/dist/cli/commands/inspect.js +1 -0
- package/dist/cli/commands/inspect.js.map +1 -1
- package/dist/cli/commands/packages.d.ts.map +1 -1
- package/dist/cli/commands/packages.js +7 -2
- package/dist/cli/commands/packages.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +3 -0
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +9 -0
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/update-core.d.ts.map +1 -1
- package/dist/cli/commands/update-core.js +4 -1
- package/dist/cli/commands/update-core.js.map +1 -1
- package/dist/cli/materialize.d.ts.map +1 -1
- package/dist/cli/materialize.js +5 -1
- package/dist/cli/materialize.js.map +1 -1
- package/dist/domain/types.d.ts +0 -1
- package/dist/domain/types.d.ts.map +1 -1
- package/dist/http/body.d.ts +2 -0
- package/dist/http/body.d.ts.map +1 -0
- package/dist/http/body.js +32 -0
- package/dist/http/body.js.map +1 -0
- package/dist/http/client.d.ts.map +1 -1
- package/dist/http/client.js +3 -2
- package/dist/http/client.js.map +1 -1
- package/dist/lockfile/index.d.ts +2 -1
- package/dist/lockfile/index.d.ts.map +1 -1
- package/dist/lockfile/index.js +7 -1
- package/dist/lockfile/index.js.map +1 -1
- package/dist/lockfile/parse.d.ts.map +1 -1
- package/dist/lockfile/parse.js +20 -0
- package/dist/lockfile/parse.js.map +1 -1
- package/dist/lockfile/serialize.d.ts.map +1 -1
- package/dist/lockfile/serialize.js +23 -0
- package/dist/lockfile/serialize.js.map +1 -1
- package/dist/lockfile/types.d.ts +9 -2
- package/dist/lockfile/types.d.ts.map +1 -1
- package/dist/lockfile/types.js +3 -1
- package/dist/lockfile/types.js.map +1 -1
- package/dist/manifest/deprecation.d.ts +17 -0
- package/dist/manifest/deprecation.d.ts.map +1 -1
- package/dist/manifest/deprecation.js +32 -0
- package/dist/manifest/deprecation.js.map +1 -1
- package/dist/manifest/destination.d.ts +2 -0
- package/dist/manifest/destination.d.ts.map +1 -1
- package/dist/manifest/destination.js +20 -0
- package/dist/manifest/destination.js.map +1 -1
- package/dist/manifest/format-serialize.d.ts.map +1 -1
- package/dist/manifest/format-serialize.js +7 -4
- package/dist/manifest/format-serialize.js.map +1 -1
- package/dist/manifest/index.d.ts.map +1 -1
- package/dist/manifest/index.js +4 -1
- package/dist/manifest/index.js.map +1 -1
- package/dist/manifest/parse-render-policy.d.ts.map +1 -1
- package/dist/manifest/parse-render-policy.js +20 -12
- package/dist/manifest/parse-render-policy.js.map +1 -1
- package/dist/manifest/parse-statements.d.ts +2 -2
- package/dist/manifest/parse-statements.d.ts.map +1 -1
- package/dist/manifest/parse-statements.js +6 -1
- package/dist/manifest/parse-statements.js.map +1 -1
- package/dist/manifest/parser.d.ts.map +1 -1
- package/dist/manifest/parser.js +14 -25
- package/dist/manifest/parser.js.map +1 -1
- package/dist/manifest/types.d.ts +3 -4
- package/dist/manifest/types.d.ts.map +1 -1
- package/dist/manifest/types.js +1 -4
- package/dist/manifest/types.js.map +1 -1
- package/dist/manifest/validate.d.ts +5 -0
- package/dist/manifest/validate.d.ts.map +1 -0
- package/dist/manifest/validate.js +43 -0
- package/dist/manifest/validate.js.map +1 -0
- package/dist/registry/cache.d.ts +2 -0
- package/dist/registry/cache.d.ts.map +1 -0
- package/dist/registry/cache.js +16 -0
- package/dist/registry/cache.js.map +1 -0
- package/dist/registry/index.d.ts +2 -2
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +18 -65
- package/dist/registry/index.js.map +1 -1
- package/dist/registry/install.d.ts +5 -0
- package/dist/registry/install.d.ts.map +1 -0
- package/dist/registry/install.js +55 -0
- package/dist/registry/install.js.map +1 -0
- package/dist/registry/signature.d.ts +4 -0
- package/dist/registry/signature.d.ts.map +1 -0
- package/dist/registry/signature.js +25 -0
- package/dist/registry/signature.js.map +1 -0
- package/dist/render/compose-dest.d.ts +5 -0
- package/dist/render/compose-dest.d.ts.map +1 -0
- package/dist/render/compose-dest.js +57 -0
- package/dist/render/compose-dest.js.map +1 -0
- package/dist/render/dest.d.ts +8 -0
- package/dist/render/dest.d.ts.map +1 -0
- package/dist/render/dest.js +120 -0
- package/dist/render/dest.js.map +1 -0
- package/dist/render/destination-io.d.ts +7 -0
- package/dist/render/destination-io.d.ts.map +1 -0
- package/dist/render/destination-io.js +67 -0
- package/dist/render/destination-io.js.map +1 -0
- package/dist/render/header.d.ts +2 -1
- package/dist/render/header.d.ts.map +1 -1
- package/dist/render/header.js +5 -10
- package/dist/render/header.js.map +1 -1
- package/dist/render/legacy.js +1 -1
- package/dist/render/legacy.js.map +1 -1
- package/dist/render/managed-export.d.ts.map +1 -1
- package/dist/render/managed-export.js +8 -2
- package/dist/render/managed-export.js.map +1 -1
- package/dist/render/patch.d.ts +4 -0
- package/dist/render/patch.d.ts.map +1 -0
- package/dist/render/patch.js +101 -0
- package/dist/render/patch.js.map +1 -0
- package/dist/render/path-guard.d.ts +2 -0
- package/dist/render/path-guard.d.ts.map +1 -0
- package/dist/render/path-guard.js +34 -0
- package/dist/render/path-guard.js.map +1 -0
- package/dist/render/project.d.ts +3 -1
- package/dist/render/project.d.ts.map +1 -1
- package/dist/render/project.js +26 -5
- package/dist/render/project.js.map +1 -1
- package/dist/render/provisioned.d.ts +2 -1
- package/dist/render/provisioned.d.ts.map +1 -1
- package/dist/render/provisioned.js +14 -15
- package/dist/render/provisioned.js.map +1 -1
- package/dist/render/rendered-dest.d.ts +3 -0
- package/dist/render/rendered-dest.d.ts.map +1 -0
- package/dist/render/rendered-dest.js +48 -0
- package/dist/render/rendered-dest.js.map +1 -0
- package/dist/render/scoped.js +1 -1
- package/dist/render/scoped.js.map +1 -1
- package/dist/resolve/exports.d.ts +5 -0
- package/dist/resolve/exports.d.ts.map +1 -0
- package/dist/resolve/exports.js +92 -0
- package/dist/resolve/exports.js.map +1 -0
- package/dist/resolve/project.d.ts.map +1 -1
- package/dist/resolve/project.js +4 -59
- package/dist/resolve/project.js.map +1 -1
- package/dist/resource-limits.d.ts +10 -0
- package/dist/resource-limits.d.ts.map +1 -0
- package/dist/resource-limits.js +10 -0
- package/dist/resource-limits.js.map +1 -0
- package/dist/serve/index.d.ts +2 -0
- package/dist/serve/index.d.ts.map +1 -1
- package/dist/serve/index.js +79 -29
- package/dist/serve/index.js.map +1 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +27 -14
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/path-safety.d.ts +5 -0
- package/dist/sync/path-safety.d.ts.map +1 -0
- package/dist/sync/path-safety.js +48 -0
- package/dist/sync/path-safety.js.map +1 -0
- package/dist/verify/project.d.ts.map +1 -1
- package/dist/verify/project.js +3 -39
- package/dist/verify/project.js.map +1 -1
- package/dist/verify/provisioned.d.ts +10 -0
- package/dist/verify/provisioned.d.ts.map +1 -0
- package/dist/verify/provisioned.js +69 -0
- package/dist/verify/provisioned.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { isAbsolute, win32 } from "node:path";
|
|
2
|
+
import { PrayError } from "../errors.js";
|
|
3
|
+
export function validateManifestPaths(manifest) {
|
|
4
|
+
for (const target of manifest.targets) {
|
|
5
|
+
for (const path of [
|
|
6
|
+
...target.outputs,
|
|
7
|
+
...target.skills,
|
|
8
|
+
...target.commands,
|
|
9
|
+
...target.rules,
|
|
10
|
+
]) {
|
|
11
|
+
validateDestinationPath(path);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
for (const packageEntry of manifest.packages) {
|
|
15
|
+
if (packageEntry.path)
|
|
16
|
+
validateProjectRelativePath(packageEntry.path);
|
|
17
|
+
if (packageEntry.file)
|
|
18
|
+
validateDestinationPath(packageEntry.file);
|
|
19
|
+
}
|
|
20
|
+
for (const local of manifest.local)
|
|
21
|
+
validateProjectRelativePath(local.path);
|
|
22
|
+
}
|
|
23
|
+
export function validateProjectRelativePath(value) {
|
|
24
|
+
const path = value.trim();
|
|
25
|
+
if (path.length === 0 || isAbsolute(path) || win32.isAbsolute(path)) {
|
|
26
|
+
throw PrayError.manifest(`project path must be repository-relative: ${value}`);
|
|
27
|
+
}
|
|
28
|
+
const parts = path.replaceAll("\\", "/").split("/");
|
|
29
|
+
if (parts.includes("..") || path.includes("\0")) {
|
|
30
|
+
throw PrayError.manifest(`project path escapes repository root: ${value}`);
|
|
31
|
+
}
|
|
32
|
+
if (parts.every((part) => part.length === 0 || part === ".")) {
|
|
33
|
+
throw PrayError.manifest(`project path must be repository-relative: ${value}`);
|
|
34
|
+
}
|
|
35
|
+
return path;
|
|
36
|
+
}
|
|
37
|
+
export function validateDestinationPath(value) {
|
|
38
|
+
if (value.trim().startsWith("~")) {
|
|
39
|
+
throw PrayError.manifest(`project path must be repository-relative: ${value}`);
|
|
40
|
+
}
|
|
41
|
+
return validateProjectRelativePath(value);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/manifest/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,MAAM,UAAU,qBAAqB,CAAC,QAAkB;IACtD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI;YACjB,GAAG,MAAM,CAAC,OAAO;YACjB,GAAG,MAAM,CAAC,MAAM;YAChB,GAAG,MAAM,CAAC,QAAQ;YAClB,GAAG,MAAM,CAAC,KAAK;SAChB,EAAE,CAAC;YACF,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,YAAY,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC7C,IAAI,YAAY,CAAC,IAAI;YAAE,2BAA2B,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACtE,IAAI,YAAY,CAAC,IAAI;YAAE,uBAAuB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK;QAAE,2BAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,MAAM,SAAS,CAAC,QAAQ,CACtB,6CAA6C,KAAK,EAAE,CACrD,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,SAAS,CAAC,QAAQ,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC7D,MAAM,SAAS,CAAC,QAAQ,CACtB,6CAA6C,KAAK,EAAE,CACrD,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,SAAS,CAAC,QAAQ,CACtB,6CAA6C,KAAK,EAAE,CACrD,CAAC;IACJ,CAAC;IACD,OAAO,2BAA2B,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/registry/cache.ts"],"names":[],"mappings":"AAQA,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAqBR"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { sha256Hex } from "../hashing.js";
|
|
3
|
+
import { resolveDistributionPath, validatePackageName, validatePathSegment, } from "../sync/path-safety.js";
|
|
4
|
+
export function registryCacheDirectory(projectRoot, sourceKey, packageName, version, artifactHash) {
|
|
5
|
+
validatePackageName(packageName);
|
|
6
|
+
validatePathSegment(version, "package version");
|
|
7
|
+
const identifier = [
|
|
8
|
+
sourceKey,
|
|
9
|
+
packageName,
|
|
10
|
+
version,
|
|
11
|
+
artifactHash ?? "no-artifact-hash",
|
|
12
|
+
].join(":");
|
|
13
|
+
const digest = sha256Hex(identifier).slice(0, 16);
|
|
14
|
+
return resolveDistributionPath(projectRoot, join(".pray", "cache", "registry", packageName.replaceAll("/", "-"), version, digest));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/registry/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,UAAU,sBAAsB,CACpC,WAAmB,EACnB,SAAiB,EACjB,WAAmB,EACnB,OAAe,EACf,YAAqB;IAErB,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACjC,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG;QACjB,SAAS;QACT,WAAW;QACX,OAAO;QACP,YAAY,IAAI,kBAAkB;KACnC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,uBAAuB,CAC5B,WAAW,EACX,IAAI,CACF,OAAO,EACP,OAAO,EACP,UAAU,EACV,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAChC,OAAO,EACP,MAAM,CACP,CACF,CAAC;AACJ,CAAC"}
|
package/dist/registry/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { ManifestPackage } from "../manifest/types.js";
|
|
2
|
+
export { registryCacheDirectory } from "./cache.js";
|
|
3
|
+
export { registryArtifactSignature } from "./signature.js";
|
|
2
4
|
import type { RegistryPackageMetadata, RegistryPackageResolution, RegistryPackageVersion } from "./types.js";
|
|
3
5
|
export declare function resolveRegistryPackageRoot(projectRoot: string, sourceUrl: string, declaration: ManifestPackage, options?: RegistryResolveOptions): Promise<RegistryPackageResolution>;
|
|
4
6
|
export declare function resolveLocalRegistryPackageRoot(projectRoot: string, sourceKey: string, sourceRoot: string, declaration: ManifestPackage, options?: RegistryResolveOptions): Promise<RegistryPackageResolution>;
|
|
@@ -11,7 +13,5 @@ export declare function parseMetadata(text: string): RegistryPackageMetadata;
|
|
|
11
13
|
export declare function versionFromHash(entry: Record<string, unknown>): RegistryPackageVersion;
|
|
12
14
|
export declare function selectPackageVersion(metadata: RegistryPackageMetadata, constraint: string, preferredVersion?: string): RegistryPackageVersion;
|
|
13
15
|
export declare function registryLatestVersionLabel(metadata: RegistryPackageMetadata): string | undefined;
|
|
14
|
-
export declare function registryCacheDirectory(projectRoot: string, sourceKey: string, packageName: string, version: string, artifactHash?: string): string;
|
|
15
|
-
export declare function registryArtifactSignature(artifactBytes: Buffer, treeHash: string, signer: string): string;
|
|
16
16
|
export { joinUrl } from "../http/client.js";
|
|
17
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAc5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,KAAK,EACV,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,eAAe,EAC5B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,yBAAyB,CAAC,CAuCpC;AAED,wBAAsB,+BAA+B,CACnD,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,eAAe,EAC5B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,yBAAyB,CAAC,CAqDpC;AAED,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,CAAC,CAclC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CASnE;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,sBAAsB,CAoBxB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,uBAAuB,EACjC,UAAU,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE,MAAM,GACxB,sBAAsB,CA8BxB;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,uBAAuB,GAChC,MAAM,GAAG,SAAS,CAWpB;AAmDD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/registry/index.js
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import { existsSync,
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import semver from "semver";
|
|
4
|
-
import { unpackPraypkg } from "../archive/praypkg.js";
|
|
5
4
|
import { versionSatisfies } from "../constraint.js";
|
|
6
5
|
import { PrayError } from "../errors.js";
|
|
7
|
-
import { sha256Hex, sha256Prefixed } from "../hashing.js";
|
|
8
6
|
import { httpGet, httpGetText, isLocalSourceUrl, joinUrl, } from "../http/client.js";
|
|
9
7
|
import { findPrayspecFile, parsePackageSpec, treeHashForRoot, } from "../package-spec/index.js";
|
|
8
|
+
import { rejectAbsoluteArtifactPath, resolveDistributionPath, validatePackageName, } from "../sync/path-safety.js";
|
|
9
|
+
import { registryCacheDirectory } from "./cache.js";
|
|
10
|
+
import { installArtifactToCache, requireIntegrityFields } from "./install.js";
|
|
11
|
+
export { registryCacheDirectory } from "./cache.js";
|
|
12
|
+
export { registryArtifactSignature } from "./signature.js";
|
|
10
13
|
export async function resolveRegistryPackageRoot(projectRoot, sourceUrl, declaration, options = {}) {
|
|
11
14
|
const metadata = await fetchPackageMetadata(sourceUrl, declaration.name);
|
|
12
15
|
const registryLatestVersion = registryLatestVersionLabel(metadata);
|
|
13
16
|
const selected = selectPackageVersion(metadata, declaration.constraint, options.preferredVersion);
|
|
17
|
+
requireIntegrityFields(declaration.name, selected);
|
|
14
18
|
const cacheDirectory = registryCacheDirectory(projectRoot, sourceUrl, declaration.name, selected.version, selected.artifactHash);
|
|
15
19
|
if (cacheReady(cacheDirectory, selected)) {
|
|
16
20
|
return {
|
|
@@ -22,12 +26,8 @@ export async function resolveRegistryPackageRoot(projectRoot, sourceUrl, declara
|
|
|
22
26
|
if (options.offline) {
|
|
23
27
|
throw PrayError.resolution(offlinePackageError(declaration.name, selected.version));
|
|
24
28
|
}
|
|
25
|
-
if (existsSync(cacheDirectory)) {
|
|
26
|
-
rmSync(cacheDirectory, { recursive: true, force: true });
|
|
27
|
-
}
|
|
28
|
-
mkdirSync(cacheDirectory, { recursive: true });
|
|
29
29
|
const artifactBytes = await readArtifactBytes(sourceUrl, selected.artifact);
|
|
30
|
-
|
|
30
|
+
installArtifactToCache(cacheDirectory, declaration, selected, artifactBytes);
|
|
31
31
|
return {
|
|
32
32
|
root: cacheDirectory,
|
|
33
33
|
signerFingerprint: selected.signerFingerprint,
|
|
@@ -44,6 +44,7 @@ export async function resolveLocalRegistryPackageRoot(projectRoot, sourceKey, so
|
|
|
44
44
|
const metadata = parseMetadata(readFileSync(metadataPath, "utf8"));
|
|
45
45
|
const registryLatestVersion = registryLatestVersionLabel(metadata);
|
|
46
46
|
const selected = selectPackageVersion(metadata, declaration.constraint, options.preferredVersion);
|
|
47
|
+
requireIntegrityFields(declaration.name, selected);
|
|
47
48
|
const cacheDirectory = registryCacheDirectory(projectRoot, sourceKey, declaration.name, selected.version, selected.artifactHash);
|
|
48
49
|
if (cacheReady(cacheDirectory, selected)) {
|
|
49
50
|
return {
|
|
@@ -55,12 +56,8 @@ export async function resolveLocalRegistryPackageRoot(projectRoot, sourceKey, so
|
|
|
55
56
|
if (options.offline) {
|
|
56
57
|
throw PrayError.resolution(offlinePackageError(declaration.name, selected.version));
|
|
57
58
|
}
|
|
58
|
-
if (existsSync(cacheDirectory)) {
|
|
59
|
-
rmSync(cacheDirectory, { recursive: true, force: true });
|
|
60
|
-
}
|
|
61
|
-
mkdirSync(cacheDirectory, { recursive: true });
|
|
62
59
|
const artifactBytes = readLocalArtifactBytes(sourceRoot, selected.artifact);
|
|
63
|
-
|
|
60
|
+
installArtifactToCache(cacheDirectory, declaration, selected, artifactBytes);
|
|
64
61
|
return {
|
|
65
62
|
root: cacheDirectory,
|
|
66
63
|
signerFingerprint: selected.signerFingerprint,
|
|
@@ -68,6 +65,7 @@ export async function resolveLocalRegistryPackageRoot(projectRoot, sourceKey, so
|
|
|
68
65
|
};
|
|
69
66
|
}
|
|
70
67
|
export async function fetchPackageMetadata(sourceUrl, packageName) {
|
|
68
|
+
validatePackageName(packageName);
|
|
71
69
|
if (isLocalSourceUrl(sourceUrl)) {
|
|
72
70
|
const metadataPath = join(sourceUrl, "v1", "packages", `${packageName}.json`);
|
|
73
71
|
return parseMetadata(readFileSync(metadataPath, "utf8"));
|
|
@@ -138,49 +136,6 @@ export function registryLatestVersionLabel(metadata) {
|
|
|
138
136
|
}
|
|
139
137
|
return highest?.version;
|
|
140
138
|
}
|
|
141
|
-
export function registryCacheDirectory(projectRoot, sourceKey, packageName, version, artifactHash) {
|
|
142
|
-
const identifier = [
|
|
143
|
-
sourceKey,
|
|
144
|
-
packageName,
|
|
145
|
-
version,
|
|
146
|
-
artifactHash ?? "no-artifact-hash",
|
|
147
|
-
].join(":");
|
|
148
|
-
const digest = sha256Hex(identifier).slice(0, 16);
|
|
149
|
-
return join(projectRoot, ".pray", "cache", "registry", packageName.replaceAll("/", "-"), version, digest);
|
|
150
|
-
}
|
|
151
|
-
export function registryArtifactSignature(artifactBytes, treeHash, signer) {
|
|
152
|
-
const payload = Buffer.concat([
|
|
153
|
-
artifactBytes,
|
|
154
|
-
Buffer.from("\0"),
|
|
155
|
-
Buffer.from(treeHash, "utf8"),
|
|
156
|
-
Buffer.from("\0"),
|
|
157
|
-
Buffer.from(signer, "utf8"),
|
|
158
|
-
]);
|
|
159
|
-
return sha256Prefixed(payload);
|
|
160
|
-
}
|
|
161
|
-
function validateAndUnpack(cacheDirectory, declaration, selected, artifactBytes) {
|
|
162
|
-
if (selected.artifactHash) {
|
|
163
|
-
const artifactHash = sha256Prefixed(artifactBytes);
|
|
164
|
-
if (artifactHash !== selected.artifactHash) {
|
|
165
|
-
throw PrayError.integrity(`package artifact hash mismatch for ${declaration.name} ${selected.version}`);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
unpackPraypkg(artifactBytes, cacheDirectory);
|
|
169
|
-
const specPath = findPrayspecFile(cacheDirectory);
|
|
170
|
-
const spec = parsePackageSpec(readFileSync(specPath, "utf8"));
|
|
171
|
-
if (spec.name !== declaration.name) {
|
|
172
|
-
throw PrayError.resolution(`package path ${cacheDirectory} declares ${spec.name}, expected ${declaration.name}`);
|
|
173
|
-
}
|
|
174
|
-
if (spec.version !== selected.version) {
|
|
175
|
-
throw PrayError.resolution(`package ${declaration.name} version ${spec.version} does not match registry version ${selected.version}`);
|
|
176
|
-
}
|
|
177
|
-
if (selected.treeHash) {
|
|
178
|
-
const treeHash = treeHashForRoot(cacheDirectory, spec);
|
|
179
|
-
if (treeHash !== selected.treeHash) {
|
|
180
|
-
throw PrayError.integrity(`package tree hash mismatch for ${declaration.name} ${selected.version}`);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
139
|
function cacheReady(cacheDirectory, selected) {
|
|
185
140
|
if (!existsSync(cacheDirectory)) {
|
|
186
141
|
return false;
|
|
@@ -188,7 +143,9 @@ function cacheReady(cacheDirectory, selected) {
|
|
|
188
143
|
try {
|
|
189
144
|
const specPath = findPrayspecFile(cacheDirectory);
|
|
190
145
|
const spec = parsePackageSpec(readFileSync(specPath, "utf8"));
|
|
191
|
-
return spec.version === selected.version
|
|
146
|
+
return (spec.version === selected.version &&
|
|
147
|
+
selected.treeHash !== undefined &&
|
|
148
|
+
treeHashForRoot(cacheDirectory, spec) === selected.treeHash);
|
|
192
149
|
}
|
|
193
150
|
catch {
|
|
194
151
|
return false;
|
|
@@ -198,19 +155,15 @@ async function readArtifactBytes(sourceUrl, artifact) {
|
|
|
198
155
|
if (isLocalSourceUrl(sourceUrl)) {
|
|
199
156
|
return readLocalArtifactBytes(sourceUrl, artifact);
|
|
200
157
|
}
|
|
201
|
-
|
|
202
|
-
return httpGet(artifact);
|
|
203
|
-
}
|
|
158
|
+
rejectAbsoluteArtifactPath(artifact);
|
|
204
159
|
return httpGet(joinUrl(sourceUrl, artifact));
|
|
205
160
|
}
|
|
206
161
|
function readLocalArtifactBytes(sourceRoot, artifact) {
|
|
207
|
-
if (artifact.startsWith("http://") || artifact.startsWith("https://")) {
|
|
208
|
-
throw PrayError.unsupported("remote artifact URLs in local distribution require async fetch");
|
|
209
|
-
}
|
|
210
162
|
if (artifact.startsWith("file://")) {
|
|
211
|
-
return readFileSync(artifact.slice("file://".length));
|
|
163
|
+
return readFileSync(resolveDistributionPath(sourceRoot, artifact.slice("file://".length)));
|
|
212
164
|
}
|
|
213
|
-
|
|
165
|
+
rejectAbsoluteArtifactPath(artifact);
|
|
166
|
+
const path = resolveDistributionPath(sourceRoot, artifact);
|
|
214
167
|
if (!existsSync(path)) {
|
|
215
168
|
throw PrayError.resolution(`package artifact missing at ${path}`);
|
|
216
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EACL,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,OAAO,GACR,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAQ3D,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAAmB,EACnB,SAAiB,EACjB,WAA4B,EAC5B,UAAkC,EAAE;IAEpC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IACzE,MAAM,qBAAqB,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,oBAAoB,CACnC,QAAQ,EACR,WAAW,CAAC,UAAU,EACtB,OAAO,CAAC,gBAAgB,CACzB,CAAC;IACF,sBAAsB,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,sBAAsB,CAC3C,WAAW,EACX,SAAS,EACT,WAAW,CAAC,IAAI,EAChB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,YAAY,CACtB,CAAC;IAEF,IAAI,UAAU,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC;QACzC,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;YAC7C,qBAAqB;SACtB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,SAAS,CAAC,UAAU,CACxB,mBAAmB,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CACxD,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5E,sBAAsB,CAAC,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAE7E,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;QAC7C,qBAAqB;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,WAAmB,EACnB,SAAiB,EACjB,UAAkB,EAClB,WAA4B,EAC5B,UAAkC,EAAE;IAEpC,MAAM,YAAY,GAAG,IAAI,CACvB,UAAU,EACV,IAAI,EACJ,UAAU,EACV,GAAG,WAAW,CAAC,IAAI,OAAO,CAC3B,CAAC;IACF,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,SAAS,CAAC,UAAU,CACxB,WAAW,WAAW,CAAC,IAAI,8BAA8B,UAAU,IAAI;YACrE,WAAW,YAAY,kDAAkD,WAAW,CAAC,UAAU,MAAM;YACrG,kDAAkD,CACrD,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IACnE,MAAM,qBAAqB,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,oBAAoB,CACnC,QAAQ,EACR,WAAW,CAAC,UAAU,EACtB,OAAO,CAAC,gBAAgB,CACzB,CAAC;IACF,sBAAsB,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,sBAAsB,CAC3C,WAAW,EACX,SAAS,EACT,WAAW,CAAC,IAAI,EAChB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,YAAY,CACtB,CAAC;IAEF,IAAI,UAAU,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC;QACzC,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;YAC7C,qBAAqB;SACtB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,SAAS,CAAC,UAAU,CACxB,mBAAmB,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CACxD,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5E,sBAAsB,CAAC,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAE7E,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;QAC7C,qBAAqB;KACtB,CAAC;AACJ,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAiB,EACjB,WAAmB;IAEnB,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACjC,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,IAAI,CACvB,SAAS,EACT,IAAI,EACJ,UAAU,EACV,GAAG,WAAW,OAAO,CACtB,CAAC;QACF,OAAO,aAAa,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,aAAa,CAClB,MAAM,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,WAAW,OAAO,CAAC,CAAC,CACzE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAG3B,CAAC;IACF,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAA8B;IAE9B,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QAC9B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QAChC,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3E,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QAC/D,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QAC7B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;YACnC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC,CAAC,EAAE;QACN,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;YACnC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC,CAAC,EAAE;QACN,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QACvD,iBAAiB,EAAE,KAAK,CAAC,kBAAkB;YACzC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC;YAClC,CAAC,CAAC,SAAS;QACb,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;QACxE,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;KACjE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAiC,EACjC,UAAkB,EAClB,gBAAyB;IAEzB,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CACtC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,gBAAgB,IAAI,CAAC,KAAK,CAAC,MAAM,CAC/D,CAAC;QACF,IAAI,SAAS,IAAI,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;YACjE,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,QAA4C,CAAC;IACjD,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;YACnD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,QAAQ,GAAG,OAAO,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,SAAS,CAAC,UAAU,CACxB,2BAA2B,QAAQ,CAAC,IAAI,cAAc,UAAU,EAAE,CACnE,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,QAAiC;IAEjC,IAAI,OAA2C,CAAC;IAChD,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,OAAO,GAAG,OAAO,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,EAAE,OAAO,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CACjB,cAAsB,EACtB,QAAgC;IAEhC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,gBAAgB,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,OAAO,CACL,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;YACjC,QAAQ,CAAC,QAAQ,KAAK,SAAS;YAC/B,eAAe,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAC5D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,SAAiB,EACjB,QAAgB;IAEhB,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,sBAAsB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IACD,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAkB,EAAE,QAAgB;IAClE,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,OAAO,YAAY,CACjB,uBAAuB,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CACtE,CAAC;IACJ,CAAC;IACD,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,uBAAuB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,SAAS,CAAC,UAAU,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,mBAAmB,CAAC,WAAmB,EAAE,OAAe;IAC/D,OAAO,WAAW,WAAW,IAAI,OAAO,4CAA4C,CAAC;AACvF,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ManifestPackage } from "../manifest/types.js";
|
|
2
|
+
import type { RegistryPackageVersion } from "./types.js";
|
|
3
|
+
export declare function installArtifactToCache(cacheDirectory: string, declaration: ManifestPackage, selected: RegistryPackageVersion, artifactBytes: Buffer): void;
|
|
4
|
+
export declare function requireIntegrityFields(packageName: string, selected: RegistryPackageVersion): void;
|
|
5
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/registry/install.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAO5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,eAAe,EAC5B,QAAQ,EAAE,sBAAsB,EAChC,aAAa,EAAE,MAAM,GACpB,IAAI,CAmBN;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,sBAAsB,GAC/B,IAAI,CAWN"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, } from "node:fs";
|
|
2
|
+
import { unpackPraypkg } from "../archive/praypkg.js";
|
|
3
|
+
import { PrayError } from "../errors.js";
|
|
4
|
+
import { sha256Prefixed } from "../hashing.js";
|
|
5
|
+
import { findPrayspecFile, parsePackageSpec, treeHashForRoot, } from "../package-spec/index.js";
|
|
6
|
+
import { verifyRegistrySignature } from "./signature.js";
|
|
7
|
+
export function installArtifactToCache(cacheDirectory, declaration, selected, artifactBytes) {
|
|
8
|
+
requireIntegrityFields(declaration.name, selected);
|
|
9
|
+
const stagingDirectory = `${cacheDirectory}.staging`;
|
|
10
|
+
rmSync(stagingDirectory, { recursive: true, force: true });
|
|
11
|
+
mkdirSync(stagingDirectory, { recursive: true });
|
|
12
|
+
const unpackedDirectory = `${stagingDirectory}/unpacked`;
|
|
13
|
+
mkdirSync(unpackedDirectory, { recursive: true });
|
|
14
|
+
try {
|
|
15
|
+
validateAndUnpack(unpackedDirectory, declaration, selected, artifactBytes);
|
|
16
|
+
if (existsSync(cacheDirectory)) {
|
|
17
|
+
rmSync(cacheDirectory, { recursive: true, force: true });
|
|
18
|
+
}
|
|
19
|
+
renameSync(unpackedDirectory, cacheDirectory);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
rmSync(stagingDirectory, { recursive: true, force: true });
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
rmSync(stagingDirectory, { recursive: true, force: true });
|
|
26
|
+
}
|
|
27
|
+
export function requireIntegrityFields(packageName, selected) {
|
|
28
|
+
if (!selected.artifactHash) {
|
|
29
|
+
throw PrayError.integrity(`package ${packageName} ${selected.version} is missing artifact_hash`);
|
|
30
|
+
}
|
|
31
|
+
if (!selected.treeHash) {
|
|
32
|
+
throw PrayError.integrity(`package ${packageName} ${selected.version} is missing tree_hash`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function validateAndUnpack(cacheDirectory, declaration, selected, artifactBytes) {
|
|
36
|
+
const artifactHash = sha256Prefixed(artifactBytes);
|
|
37
|
+
if (artifactHash !== selected.artifactHash) {
|
|
38
|
+
throw PrayError.integrity(`package artifact hash mismatch for ${declaration.name} ${selected.version}`);
|
|
39
|
+
}
|
|
40
|
+
verifyRegistrySignature(declaration.name, selected, artifactBytes);
|
|
41
|
+
unpackPraypkg(artifactBytes, cacheDirectory);
|
|
42
|
+
const specPath = findPrayspecFile(cacheDirectory);
|
|
43
|
+
const spec = parsePackageSpec(readFileSync(specPath, "utf8"));
|
|
44
|
+
if (spec.name !== declaration.name) {
|
|
45
|
+
throw PrayError.resolution(`package path ${cacheDirectory} declares ${spec.name}, expected ${declaration.name}`);
|
|
46
|
+
}
|
|
47
|
+
if (spec.version !== selected.version) {
|
|
48
|
+
throw PrayError.resolution(`package ${declaration.name} version ${spec.version} does not match registry version ${selected.version}`);
|
|
49
|
+
}
|
|
50
|
+
const treeHash = treeHashForRoot(cacheDirectory, spec);
|
|
51
|
+
if (treeHash !== selected.treeHash) {
|
|
52
|
+
throw PrayError.integrity(`package tree hash mismatch for ${declaration.name} ${selected.version}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/registry/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { RegistryPackageVersion } from "./types.js";
|
|
2
|
+
export declare function registryArtifactSignature(artifactBytes: Buffer, treeHash: string, signer: string): string;
|
|
3
|
+
export declare function verifyRegistrySignature(packageName: string, selected: RegistryPackageVersion, artifactBytes: Buffer): void;
|
|
4
|
+
//# sourceMappingURL=signature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../src/registry/signature.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,CASR;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,sBAAsB,EAChC,aAAa,EAAE,MAAM,GACpB,IAAI,CAmBN"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { PrayError } from "../errors.js";
|
|
2
|
+
import { sha256Prefixed } from "../hashing.js";
|
|
3
|
+
export function registryArtifactSignature(artifactBytes, treeHash, signer) {
|
|
4
|
+
const payload = Buffer.concat([
|
|
5
|
+
artifactBytes,
|
|
6
|
+
Buffer.from("\0"),
|
|
7
|
+
Buffer.from(treeHash, "utf8"),
|
|
8
|
+
Buffer.from("\0"),
|
|
9
|
+
Buffer.from(signer, "utf8"),
|
|
10
|
+
]);
|
|
11
|
+
return sha256Prefixed(payload);
|
|
12
|
+
}
|
|
13
|
+
export function verifyRegistrySignature(packageName, selected, artifactBytes) {
|
|
14
|
+
if (!selected.signature) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (!selected.signer || !selected.treeHash) {
|
|
18
|
+
throw PrayError.integrity(`package signature metadata incomplete for ${packageName} ${selected.version}`);
|
|
19
|
+
}
|
|
20
|
+
const expected = registryArtifactSignature(artifactBytes, selected.treeHash, selected.signer);
|
|
21
|
+
if (expected !== selected.signature) {
|
|
22
|
+
throw PrayError.integrity(`package signature mismatch for ${packageName} ${selected.version}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature.js","sourceRoot":"","sources":["../../src/registry/signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,UAAU,yBAAyB,CACvC,aAAqB,EACrB,QAAgB,EAChB,MAAc;IAEd,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,aAAa;QACb,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;KAC5B,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,WAAmB,EACnB,QAAgC,EAChC,aAAqB;IAErB,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC3C,MAAM,SAAS,CAAC,SAAS,CACvB,6CAA6C,WAAW,IAAI,QAAQ,CAAC,OAAO,EAAE,CAC/E,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,yBAAyB,CACxC,aAAa,EACb,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,MAAM,CAChB,CAAC;IACF,IAAI,QAAQ,KAAK,QAAQ,CAAC,SAAS,EAAE,CAAC;QACpC,MAAM,SAAS,CAAC,SAAS,CACvB,kCAAkC,WAAW,IAAI,QAAQ,CAAC,OAAO,EAAE,CACpE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ManifestTarget } from "../manifest/types.js";
|
|
2
|
+
export declare function composeWritesHeader(target: ManifestTarget, output: string, projectHeader: boolean): boolean;
|
|
3
|
+
export declare function composeHeaderText(target: ManifestTarget, output: string, projectHeader: boolean): string | undefined;
|
|
4
|
+
export declare function ensureHtmlCommentComposeDest(output: string): void;
|
|
5
|
+
//# sourceMappingURL=compose-dest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-dest.d.ts","sourceRoot":"","sources":["../../src/render/compose-dest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAwB3D,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,OAAO,GACrB,OAAO,CAKT;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,OAAO,GACrB,MAAM,GAAG,SAAS,CASpB;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAmBjE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { basename, extname } from "node:path";
|
|
2
|
+
import { PrayError } from "../errors.js";
|
|
3
|
+
const HTML_COMMENT_EXTENSIONS = new Set([".md", ".markdown", ".html", ".htm"]);
|
|
4
|
+
const BINARY_EXTENSIONS = new Set([
|
|
5
|
+
".png",
|
|
6
|
+
".jpg",
|
|
7
|
+
".jpeg",
|
|
8
|
+
".gif",
|
|
9
|
+
".webp",
|
|
10
|
+
".ico",
|
|
11
|
+
".pdf",
|
|
12
|
+
".zip",
|
|
13
|
+
".gz",
|
|
14
|
+
".tgz",
|
|
15
|
+
".tar",
|
|
16
|
+
".wasm",
|
|
17
|
+
".bin",
|
|
18
|
+
".woff",
|
|
19
|
+
".woff2",
|
|
20
|
+
".exe",
|
|
21
|
+
".dylib",
|
|
22
|
+
".so",
|
|
23
|
+
]);
|
|
24
|
+
export function composeWritesHeader(target, output, projectHeader) {
|
|
25
|
+
if (target.header !== undefined) {
|
|
26
|
+
return target.header;
|
|
27
|
+
}
|
|
28
|
+
return projectHeader && isAgentsMarkdown(output);
|
|
29
|
+
}
|
|
30
|
+
export function composeHeaderText(target, output, projectHeader) {
|
|
31
|
+
if (!composeWritesHeader(target, output, projectHeader)) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const name = basename(output);
|
|
35
|
+
const guidance = isAgentsMarkdown(output)
|
|
36
|
+
? `Do not edit managed blocks in \`${name}\` or provisioned files under \`.agents/\`.`
|
|
37
|
+
: `Do not edit managed blocks in \`${name}\`.`;
|
|
38
|
+
return `<!-- pray:0 ignore-comments -->\n\n# Agent context\n\n${guidance}\nTo change shared guidance, update \`Prayfile\` and run \`pray install\`.`;
|
|
39
|
+
}
|
|
40
|
+
export function ensureHtmlCommentComposeDest(output) {
|
|
41
|
+
const dest = output.replaceAll("\\", "/");
|
|
42
|
+
const extension = extname(output).toLowerCase();
|
|
43
|
+
if (HTML_COMMENT_EXTENSIONS.has(extension)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (extension === ".json") {
|
|
47
|
+
throw PrayError.render(`compose cannot write JSON; use file: "${dest}" for unmarked bytes`);
|
|
48
|
+
}
|
|
49
|
+
if (BINARY_EXTENSIONS.has(extension)) {
|
|
50
|
+
throw PrayError.render(`compose cannot write a binary file; use file: "${dest}" for unmarked bytes`);
|
|
51
|
+
}
|
|
52
|
+
throw PrayError.render(`compose cannot write this file type; use file: "${dest}" for unmarked bytes`);
|
|
53
|
+
}
|
|
54
|
+
function isAgentsMarkdown(output) {
|
|
55
|
+
return basename(output) === "AGENTS.md";
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=compose-dest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-dest.js","sourceRoot":"","sources":["../../src/render/compose-dest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,KAAK;CACN,CAAC,CAAC;AAEH,MAAM,UAAU,mBAAmB,CACjC,MAAsB,EACtB,MAAc,EACd,aAAsB;IAEtB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,OAAO,aAAa,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAsB,EACtB,MAAc,EACd,aAAsB;IAEtB,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;QACxD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC;QACvC,CAAC,CAAC,mCAAmC,IAAI,6CAA6C;QACtF,CAAC,CAAC,mCAAmC,IAAI,KAAK,CAAC;IACjD,OAAO,yDAAyD,QAAQ,4EAA4E,CAAC;AACvJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,MAAc;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,SAAS,CAAC,MAAM,CACpB,yCAAyC,IAAI,sBAAsB,CACpE,CAAC;IACJ,CAAC;IACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,MAAM,SAAS,CAAC,MAAM,CACpB,kDAAkD,IAAI,sBAAsB,CAC7E,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,CAAC,MAAM,CACpB,mDAAmD,IAAI,sBAAsB,CAC9E,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,WAAW,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Lockfile, ProvisionedFileRecord } from "../lockfile/types.js";
|
|
2
|
+
import type { ResolvedProject } from "../resolve/types.js";
|
|
3
|
+
import { type PlannedProvisionedFile } from "./provisioned.js";
|
|
4
|
+
export declare function provisionedLockRecords(project: ResolvedProject): ProvisionedFileRecord[];
|
|
5
|
+
export declare function materializeProvisionedExports(project: ResolvedProject, previousLockfile?: Lockfile): void;
|
|
6
|
+
export type ProvisionedDestinationStatus = "write" | "unchanged" | "update";
|
|
7
|
+
export declare function provisionedDestinationStatus(project: ResolvedProject, file: PlannedProvisionedFile, previousLockfile?: Lockfile): ProvisionedDestinationStatus;
|
|
8
|
+
//# sourceMappingURL=dest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dest.d.ts","sourceRoot":"","sources":["../../src/render/dest.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAS3D,OAAO,EAEL,KAAK,sBAAsB,EAE5B,MAAM,kBAAkB,CAAC;AAE1B,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,GACvB,qBAAqB,EAAE,CAazB;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,eAAe,EACxB,gBAAgB,CAAC,EAAE,QAAQ,GAC1B,IAAI,CAYN;AAED,MAAM,MAAM,4BAA4B,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE5E,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,sBAAsB,EAC5B,gBAAgB,CAAC,EAAE,QAAQ,GAC1B,4BAA4B,CAa9B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { closeSync, constants, ftruncateSync, mkdirSync, readFileSync, unlinkSync, } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { PrayError } from "../errors.js";
|
|
4
|
+
import { sha256Prefixed } from "../hashing.js";
|
|
5
|
+
import { validateDestinationPath } from "../manifest/validate.js";
|
|
6
|
+
import { createBytes, destinationKind, openRegular, readRegularBytes, writeAll, } from "./destination-io.js";
|
|
7
|
+
import { ensureSafeDestinationAncestors } from "./path-guard.js";
|
|
8
|
+
import { expectedProvisionedBytes, plannedProvisionedFiles, } from "./provisioned.js";
|
|
9
|
+
export function provisionedLockRecords(project) {
|
|
10
|
+
return plannedProvisionedFiles(project).map((file) => {
|
|
11
|
+
const expected = expectedProvisionedBytes(file.source, project.manifest.symbols ?? {});
|
|
12
|
+
return {
|
|
13
|
+
path: file.path.replaceAll("\\", "/"),
|
|
14
|
+
content_hash: sha256Prefixed(expected),
|
|
15
|
+
package: file.package,
|
|
16
|
+
export: file.export,
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function materializeProvisionedExports(project, previousLockfile) {
|
|
21
|
+
const planned = plannedProvisionedFiles(project);
|
|
22
|
+
const previous = previousMap(previousLockfile);
|
|
23
|
+
const plannedPaths = new Set(planned.map((file) => file.path.replaceAll("\\", "/")));
|
|
24
|
+
for (const file of planned) {
|
|
25
|
+
writeLeaf(project, file, previous);
|
|
26
|
+
}
|
|
27
|
+
if (previousLockfile) {
|
|
28
|
+
pruneDropped(project, previousLockfile, plannedPaths);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function provisionedDestinationStatus(project, file, previousLockfile) {
|
|
32
|
+
validateDestinationPath(file.path);
|
|
33
|
+
ensureSafeDestinationAncestors(project.projectRoot, file.path, file.path);
|
|
34
|
+
const expected = expectedProvisionedBytes(file.source, project.manifest.symbols ?? {});
|
|
35
|
+
return classifyDestination(resolve(project.projectRoot, file.path), file.path, expected, previousMap(previousLockfile).get(file.path.replaceAll("\\", "/")));
|
|
36
|
+
}
|
|
37
|
+
function previousMap(lockfile) {
|
|
38
|
+
const records = new Map();
|
|
39
|
+
for (const record of lockfile?.provisioned ?? []) {
|
|
40
|
+
records.set(record.path, record);
|
|
41
|
+
}
|
|
42
|
+
return records;
|
|
43
|
+
}
|
|
44
|
+
function writeLeaf(project, file, previous) {
|
|
45
|
+
validateDestinationPath(file.path);
|
|
46
|
+
ensureSafeDestinationAncestors(project.projectRoot, file.path, file.path);
|
|
47
|
+
const destination = resolve(project.projectRoot, file.path);
|
|
48
|
+
const expected = expectedProvisionedBytes(file.source, project.manifest.symbols ?? {});
|
|
49
|
+
const record = previous.get(file.path.replaceAll("\\", "/"));
|
|
50
|
+
const status = classifyDestination(destination, file.path, expected, record);
|
|
51
|
+
if (status === "write") {
|
|
52
|
+
mkdirSync(dirname(destination), { recursive: true });
|
|
53
|
+
ensureSafeDestinationAncestors(project.projectRoot, file.path, file.path);
|
|
54
|
+
createBytes(destination, file.path, expected);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (status === "unchanged") {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (!record) {
|
|
61
|
+
throw PrayError.render(`missing lock ownership for \`${file.path}\``);
|
|
62
|
+
}
|
|
63
|
+
ensureSafeDestinationAncestors(project.projectRoot, file.path, file.path);
|
|
64
|
+
updateBytes(destination, file.path, expected, record.content_hash);
|
|
65
|
+
}
|
|
66
|
+
function classifyDestination(destination, display, expected, record) {
|
|
67
|
+
const kind = destinationKind(destination);
|
|
68
|
+
if (kind === "missing")
|
|
69
|
+
return "write";
|
|
70
|
+
if (kind === "symlink") {
|
|
71
|
+
throw PrayError.render(`refusing to write \`${display}\` because it is a symbolic link`);
|
|
72
|
+
}
|
|
73
|
+
if (kind !== "regular") {
|
|
74
|
+
throw PrayError.render(`refusing to write \`${display}\`; destination is not a regular file`);
|
|
75
|
+
}
|
|
76
|
+
const onDisk = readRegularBytes(destination, display);
|
|
77
|
+
if (onDisk.equals(expected))
|
|
78
|
+
return "unchanged";
|
|
79
|
+
if (record && sha256Prefixed(onDisk) === record.content_hash)
|
|
80
|
+
return "update";
|
|
81
|
+
if (record) {
|
|
82
|
+
throw PrayError.render(`refusing to overwrite \`${display}\`; it was provisioned and then edited`);
|
|
83
|
+
}
|
|
84
|
+
throw PrayError.render(`refusing to overwrite \`${display}\`; it already exists and is not the expected provisioned file`);
|
|
85
|
+
}
|
|
86
|
+
function pruneDropped(project, previous, plannedPaths) {
|
|
87
|
+
for (const record of previous.provisioned ?? []) {
|
|
88
|
+
validateDestinationPath(record.path);
|
|
89
|
+
if (plannedPaths.has(record.path)) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const destination = resolve(project.projectRoot, record.path);
|
|
93
|
+
ensureSafeDestinationAncestors(project.projectRoot, record.path, record.path);
|
|
94
|
+
if (destinationKind(destination) !== "regular") {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const onDisk = readRegularBytes(destination, record.path);
|
|
98
|
+
if (sha256Prefixed(onDisk) === record.content_hash) {
|
|
99
|
+
ensureSafeDestinationAncestors(project.projectRoot, record.path, record.path);
|
|
100
|
+
unlinkSync(destination);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function updateBytes(path, display, bytes, authorizedHash) {
|
|
105
|
+
const descriptor = openRegular(path, display, constants.O_RDWR);
|
|
106
|
+
try {
|
|
107
|
+
const onDisk = readFileSync(descriptor);
|
|
108
|
+
if (onDisk.equals(bytes))
|
|
109
|
+
return;
|
|
110
|
+
if (sha256Prefixed(onDisk) !== authorizedHash) {
|
|
111
|
+
throw PrayError.render(`refusing to overwrite \`${display}\`; it was provisioned and then edited`);
|
|
112
|
+
}
|
|
113
|
+
ftruncateSync(descriptor, 0);
|
|
114
|
+
writeAll(descriptor, bytes);
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
closeSync(descriptor);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=dest.js.map
|