@mannyc1/ts-release 0.0.1 → 0.0.3
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/ARCHITECTURE.md +93 -0
- package/README.md +282 -49
- package/SPEC.md +46 -9
- package/dist/config/schema.d.ts +4 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +13 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/domain/evidence.d.ts +4 -0
- package/dist/domain/evidence.d.ts.map +1 -1
- package/dist/domain/evidence.js +4 -0
- package/dist/domain/evidence.js.map +1 -1
- package/dist/domain/operation.d.ts +1 -0
- package/dist/domain/operation.d.ts.map +1 -1
- package/dist/domain/operation.js +147 -1
- package/dist/domain/operation.js.map +1 -1
- package/dist/domain/release.d.ts +1 -0
- package/dist/domain/release.d.ts.map +1 -1
- package/dist/domain/release.js +1 -0
- package/dist/domain/release.js.map +1 -1
- package/dist/domain/remote-state.d.ts +90 -0
- package/dist/domain/remote-state.d.ts.map +1 -0
- package/dist/domain/remote-state.js +85 -0
- package/dist/domain/remote-state.js.map +1 -0
- package/dist/domain/status.d.ts +43 -0
- package/dist/domain/status.d.ts.map +1 -0
- package/dist/domain/status.js +50 -0
- package/dist/domain/status.js.map +1 -0
- package/dist/domain/target.d.ts +32 -2
- package/dist/domain/target.d.ts.map +1 -1
- package/dist/domain/target.js +35 -2
- package/dist/domain/target.js.map +1 -1
- package/dist/host/host.d.ts +7 -23
- package/dist/host/host.d.ts.map +1 -1
- package/dist/host/host.js +3 -22
- package/dist/host/host.js.map +1 -1
- package/dist/host/http-live.d.ts +1 -2
- package/dist/host/http-live.d.ts.map +1 -1
- package/dist/host/http-live.js +18 -9
- package/dist/host/http-live.js.map +1 -1
- package/dist/host/http.d.ts +3 -1
- package/dist/host/http.d.ts.map +1 -1
- package/dist/host/http.js +3 -1
- package/dist/host/http.js.map +1 -1
- package/dist/host/platform.d.ts +10 -0
- package/dist/host/platform.d.ts.map +1 -0
- package/dist/host/platform.js +121 -0
- package/dist/host/platform.js.map +1 -0
- package/dist/host/test.d.ts +7 -3
- package/dist/host/test.d.ts.map +1 -1
- package/dist/host/test.js +128 -25
- package/dist/host/test.js.map +1 -1
- package/dist/internal/workspace-path.d.ts +16 -0
- package/dist/internal/workspace-path.d.ts.map +1 -0
- package/dist/internal/workspace-path.js +33 -0
- package/dist/internal/workspace-path.js.map +1 -0
- package/dist/planner/artifact-inventory.d.ts +9 -0
- package/dist/planner/artifact-inventory.d.ts.map +1 -0
- package/dist/planner/artifact-inventory.js +85 -0
- package/dist/planner/artifact-inventory.js.map +1 -0
- package/dist/planner/create-release-plan.d.ts +1 -1
- package/dist/planner/create-release-plan.d.ts.map +1 -1
- package/dist/planner/errors.d.ts +37 -1
- package/dist/planner/errors.d.ts.map +1 -1
- package/dist/planner/errors.js +30 -0
- package/dist/planner/errors.js.map +1 -1
- package/dist/planner/evidence-recorder.d.ts +13 -8
- package/dist/planner/evidence-recorder.d.ts.map +1 -1
- package/dist/planner/evidence-recorder.js +116 -18
- package/dist/planner/evidence-recorder.js.map +1 -1
- package/dist/planner/executor.d.ts +31 -19
- package/dist/planner/executor.d.ts.map +1 -1
- package/dist/planner/executor.js +52 -7
- package/dist/planner/executor.js.map +1 -1
- package/dist/planner/normalize-release.d.ts +2 -2
- package/dist/planner/normalize-release.d.ts.map +1 -1
- package/dist/planner/normalize-release.js +50 -52
- package/dist/planner/normalize-release.js.map +1 -1
- package/dist/planner/reconcile.d.ts +17 -0
- package/dist/planner/reconcile.d.ts.map +1 -0
- package/dist/planner/reconcile.js +337 -0
- package/dist/planner/reconcile.js.map +1 -0
- package/dist/planner/release-eligibility.d.ts +34 -0
- package/dist/planner/release-eligibility.d.ts.map +1 -0
- package/dist/planner/release-eligibility.js +179 -0
- package/dist/planner/release-eligibility.js.map +1 -0
- package/dist/planner/render-plan.d.ts +10 -0
- package/dist/planner/render-plan.d.ts.map +1 -1
- package/dist/planner/render-plan.js +179 -0
- package/dist/planner/render-plan.js.map +1 -1
- package/dist/planner/status.d.ts +40 -0
- package/dist/planner/status.d.ts.map +1 -0
- package/dist/planner/status.js +342 -0
- package/dist/planner/status.js.map +1 -0
- package/dist/targets/github.d.ts.map +1 -1
- package/dist/targets/github.js +28 -13
- package/dist/targets/github.js.map +1 -1
- package/dist/targets/npm.d.ts +2 -2
- package/dist/targets/npm.d.ts.map +1 -1
- package/dist/targets/npm.js +74 -14
- package/dist/targets/npm.js.map +1 -1
- package/dist/workflows/config.d.ts +153 -0
- package/dist/workflows/config.d.ts.map +1 -0
- package/dist/workflows/config.js +301 -0
- package/dist/workflows/config.js.map +1 -0
- package/dist/workflows/diagnostics.d.ts +62 -0
- package/dist/workflows/diagnostics.d.ts.map +1 -0
- package/dist/workflows/diagnostics.js +474 -0
- package/dist/workflows/diagnostics.js.map +1 -0
- package/dist/workflows/evidence.d.ts +21 -0
- package/dist/workflows/evidence.d.ts.map +1 -0
- package/dist/workflows/evidence.js +45 -0
- package/dist/workflows/evidence.js.map +1 -0
- package/dist/workflows/index.d.ts +7 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +6 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/init.d.ts +71 -0
- package/dist/workflows/init.d.ts.map +1 -0
- package/dist/workflows/init.js +384 -0
- package/dist/workflows/init.js.map +1 -0
- package/dist/workflows/live.d.ts +9 -0
- package/dist/workflows/live.d.ts.map +1 -0
- package/dist/workflows/live.js +7 -0
- package/dist/workflows/live.js.map +1 -0
- package/dist/workflows/options.d.ts +30 -0
- package/dist/workflows/options.d.ts.map +1 -0
- package/dist/workflows/options.js +16 -0
- package/dist/workflows/options.js.map +1 -0
- package/examples/README.md +16 -9
- package/examples/github-release/release.config.json +1 -0
- package/examples/homebrew-tap/release.config.json +1 -0
- package/examples/multi-target/release.config.json +10 -1
- package/examples/non-strict-skips/release.config.json +1 -0
- package/examples/npm-first-publish/release.config.json +33 -0
- package/examples/npm-only/release.config.json +10 -1
- package/examples/pypi-registry/release.config.json +1 -0
- package/examples/scoop-bucket/release.config.json +1 -0
- package/package.json +56 -27
- package/templates/README.md +54 -0
- package/templates/github-actions/plan-and-approved-execute.yml +53 -0
- package/templates/github-actions/plan-only.yml +30 -0
- package/templates/github-actions/trusted-publishing.yml +59 -0
- package/templates/multi-target-homebrew/release.config.json +70 -0
- package/templates/multi-target-scoop/release.config.json +72 -0
- package/templates/npm-github/release.config.json +50 -0
- package/templates/npm-only/release.config.json +39 -0
- package/dist/cli/command.d.ts +0 -4
- package/dist/cli/command.d.ts.map +0 -1
- package/dist/cli/command.js +0 -125
- package/dist/cli/command.js.map +0 -1
- package/dist/cli/main.d.ts +0 -3
- package/dist/cli/main.d.ts.map +0 -1
- package/dist/cli/main.js +0 -15
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/programmatic.d.ts +0 -25
- package/dist/cli/programmatic.d.ts.map +0 -1
- package/dist/cli/programmatic.js +0 -53
- package/dist/cli/programmatic.js.map +0 -1
- package/dist/host/bun.d.ts +0 -9
- package/dist/host/bun.d.ts.map +0 -1
- package/dist/host/bun.js +0 -156
- package/dist/host/bun.js.map +0 -1
package/dist/host/http.js
CHANGED
|
@@ -2,7 +2,7 @@ import * as Context from "effect/Context";
|
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
3
|
import * as Layer from "effect/Layer";
|
|
4
4
|
import * as Schema from "effect/Schema";
|
|
5
|
-
import { HttpRequestSpec } from "../domain/operation.js";
|
|
5
|
+
import { HttpHeader, HttpRequestSpec } from "../domain/operation.js";
|
|
6
6
|
export class HttpError extends Schema.TaggedErrorClass()("HttpError", {
|
|
7
7
|
operation: Schema.String,
|
|
8
8
|
url: Schema.String,
|
|
@@ -13,6 +13,7 @@ export class HttpResult extends Schema.Class("HttpResult")({
|
|
|
13
13
|
request: HttpRequestSpec,
|
|
14
14
|
status: Schema.Number,
|
|
15
15
|
json: Schema.Json,
|
|
16
|
+
responseHeaders: Schema.Array(HttpHeader),
|
|
16
17
|
startedAt: Schema.String,
|
|
17
18
|
endedAt: Schema.String,
|
|
18
19
|
durationMillis: Schema.Number
|
|
@@ -46,6 +47,7 @@ export const makeTestReleaseHttpLayer = (options = {}) => {
|
|
|
46
47
|
request,
|
|
47
48
|
status: response.status,
|
|
48
49
|
json: response.json,
|
|
50
|
+
responseHeaders: response.responseHeaders === undefined ? [] : [...response.responseHeaders],
|
|
49
51
|
startedAt,
|
|
50
52
|
endedAt,
|
|
51
53
|
durationMillis: 0
|
package/dist/host/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/host/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/host/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as Layer from "effect/Layer";
|
|
2
|
+
import { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner";
|
|
3
|
+
import { ReleaseCommandRunner } from "./host.js";
|
|
4
|
+
export type * from "../types/effect-internal.js";
|
|
5
|
+
export interface PlatformCommandRunnerOptions {
|
|
6
|
+
readonly root?: string | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare const makePlatformCommandRunnerLayer: (options?: PlatformCommandRunnerOptions) => Layer.Layer<ReleaseCommandRunner, never, ChildProcessSpawner>;
|
|
9
|
+
export declare const PlatformCommandRunnerLayer: Layer.Layer<ReleaseCommandRunner, never, ChildProcessSpawner>;
|
|
10
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/host/platform.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAIrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAA;AAEjF,OAAO,EAAqC,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAEnF,mBAAmB,6BAA6B,CAAA;AAEhD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACnC;AAoFD,eAAO,MAAM,8BAA8B,GACzC,UAAS,4BAAiC,KACzC,KAAK,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,EAAE,mBAAmB,CAyD5D,CAAA;AAEH,eAAO,MAAM,0BAA0B,EAAE,KAAK,CAAC,KAAK,CAClD,oBAAoB,EACpB,KAAK,EACL,mBAAmB,CACe,CAAA"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import * as Config from "effect/Config";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Layer from "effect/Layer";
|
|
4
|
+
import * as Option from "effect/Option";
|
|
5
|
+
import * as Stream from "effect/Stream";
|
|
6
|
+
import * as ChildProcess from "effect/unstable/process/ChildProcess";
|
|
7
|
+
import { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner";
|
|
8
|
+
import { CommandResult, CommandRunnerError, ReleaseCommandRunner } from "./host.js";
|
|
9
|
+
const inheritedEnvNames = [
|
|
10
|
+
"PATH",
|
|
11
|
+
"HOME",
|
|
12
|
+
"USERPROFILE",
|
|
13
|
+
"SystemRoot",
|
|
14
|
+
"TEMP",
|
|
15
|
+
"TMP",
|
|
16
|
+
"CI",
|
|
17
|
+
"GITHUB_ACTIONS",
|
|
18
|
+
"GITHUB_API_URL",
|
|
19
|
+
"GITHUB_EVENT_NAME",
|
|
20
|
+
"GITHUB_GRAPHQL_URL",
|
|
21
|
+
"GITHUB_REF",
|
|
22
|
+
"GITHUB_REF_NAME",
|
|
23
|
+
"GITHUB_REF_TYPE",
|
|
24
|
+
"GITHUB_REPOSITORY",
|
|
25
|
+
"GITHUB_REPOSITORY_ID",
|
|
26
|
+
"GITHUB_REPOSITORY_OWNER",
|
|
27
|
+
"GITHUB_REPOSITORY_OWNER_ID",
|
|
28
|
+
"GITHUB_RUN_ATTEMPT",
|
|
29
|
+
"GITHUB_RUN_ID",
|
|
30
|
+
"GITHUB_RUN_NUMBER",
|
|
31
|
+
"GITHUB_SERVER_URL",
|
|
32
|
+
"GITHUB_SHA",
|
|
33
|
+
"GITHUB_WORKFLOW",
|
|
34
|
+
"GITHUB_WORKFLOW_REF",
|
|
35
|
+
"GITHUB_WORKFLOW_SHA",
|
|
36
|
+
"RUNNER_ENVIRONMENT",
|
|
37
|
+
"RUNNER_OS"
|
|
38
|
+
];
|
|
39
|
+
const formatUnknown = (cause) => cause instanceof Error ? cause.message : String(cause);
|
|
40
|
+
const readOptionalEnv = (name) => Config.string(name).pipe(Effect.option, Effect.map(Option.getOrUndefined));
|
|
41
|
+
const commandEnv = Effect.fn("platform.commandEnv")(function* (command) {
|
|
42
|
+
const names = new Set([
|
|
43
|
+
...inheritedEnvNames,
|
|
44
|
+
...command.requiredEnv
|
|
45
|
+
]);
|
|
46
|
+
const env = {};
|
|
47
|
+
for (const name of names) {
|
|
48
|
+
const value = yield* readOptionalEnv(name);
|
|
49
|
+
if (value !== undefined) {
|
|
50
|
+
env[name] = value;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return env;
|
|
54
|
+
});
|
|
55
|
+
const validateEnv = (command) => Effect.gen(function* () {
|
|
56
|
+
const missing = [];
|
|
57
|
+
for (const name of command.requiredEnv) {
|
|
58
|
+
const value = yield* readOptionalEnv(name);
|
|
59
|
+
if (value === undefined) {
|
|
60
|
+
missing.push(name);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (missing.length > 0) {
|
|
64
|
+
return yield* Effect.fail(CommandRunnerError.make({
|
|
65
|
+
operation: "runCommand",
|
|
66
|
+
reason: `Missing required environment variables: ${missing.join(", ")}`
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
const nowIso = Effect.fn("platform.nowIso")(function* () {
|
|
71
|
+
const millis = yield* Effect.clockWith((clock) => clock.currentTimeMillis);
|
|
72
|
+
return new Date(millis).toISOString();
|
|
73
|
+
});
|
|
74
|
+
const commandOutput = (stream) => Stream.mkString(Stream.decodeText(stream));
|
|
75
|
+
export const makePlatformCommandRunnerLayer = (options = {}) => Layer.effect(ReleaseCommandRunner)(Effect.gen(function* () {
|
|
76
|
+
const spawner = yield* ChildProcessSpawner;
|
|
77
|
+
const commandCwd = (command) => command.cwd === undefined
|
|
78
|
+
? options.root
|
|
79
|
+
: command.cwd;
|
|
80
|
+
return {
|
|
81
|
+
runCommand: (command) => Effect.gen(function* () {
|
|
82
|
+
yield* validateEnv(command);
|
|
83
|
+
const startedAt = yield* nowIso();
|
|
84
|
+
const startedMillis = yield* Effect.clockWith((clock) => clock.currentTimeMillis);
|
|
85
|
+
const env = yield* commandEnv(command);
|
|
86
|
+
const cwd = commandCwd(command);
|
|
87
|
+
const childCommand = ChildProcess.make(command.executable, command.args, {
|
|
88
|
+
...(cwd === undefined ? {} : { cwd }),
|
|
89
|
+
env,
|
|
90
|
+
extendEnv: false,
|
|
91
|
+
stdin: "ignore",
|
|
92
|
+
stdout: "pipe",
|
|
93
|
+
stderr: "pipe"
|
|
94
|
+
});
|
|
95
|
+
const output = yield* Effect.scoped(Effect.gen(function* () {
|
|
96
|
+
const handle = yield* spawner.spawn(childCommand);
|
|
97
|
+
return yield* Effect.all({
|
|
98
|
+
stdout: commandOutput(handle.stdout),
|
|
99
|
+
stderr: commandOutput(handle.stderr),
|
|
100
|
+
exitCode: handle.exitCode
|
|
101
|
+
}, { concurrency: "unbounded" });
|
|
102
|
+
})).pipe(Effect.mapError((cause) => CommandRunnerError.make({
|
|
103
|
+
operation: "runCommand",
|
|
104
|
+
reason: formatUnknown(cause)
|
|
105
|
+
})));
|
|
106
|
+
const endedAt = yield* nowIso();
|
|
107
|
+
const endedMillis = yield* Effect.clockWith((clock) => clock.currentTimeMillis);
|
|
108
|
+
return CommandResult.make({
|
|
109
|
+
command,
|
|
110
|
+
exitCode: Number(output.exitCode),
|
|
111
|
+
stdout: output.stdout,
|
|
112
|
+
stderr: output.stderr,
|
|
113
|
+
startedAt,
|
|
114
|
+
endedAt,
|
|
115
|
+
durationMillis: Math.max(0, endedMillis - startedMillis)
|
|
116
|
+
});
|
|
117
|
+
})
|
|
118
|
+
};
|
|
119
|
+
}));
|
|
120
|
+
export const PlatformCommandRunnerLayer = makePlatformCommandRunnerLayer();
|
|
121
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/host/platform.ts"],"names":[],"mappings":"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"}
|
package/dist/host/test.d.ts
CHANGED
|
@@ -1,19 +1,23 @@
|
|
|
1
|
+
import * as Crypto from "effect/Crypto";
|
|
2
|
+
import * as FileSystem from "effect/FileSystem";
|
|
1
3
|
import * as Layer from "effect/Layer";
|
|
4
|
+
import * as Path from "effect/Path";
|
|
2
5
|
import { CommandSpec } from "../domain/operation.js";
|
|
3
|
-
import {
|
|
6
|
+
import { ReleaseCommandRunner } from "./host.js";
|
|
4
7
|
export type * from "../types/effect-internal.js";
|
|
5
8
|
export interface TestCommandResponse {
|
|
6
9
|
readonly exitCode: number;
|
|
7
10
|
readonly stdout: string;
|
|
8
11
|
readonly stderr: string;
|
|
9
12
|
}
|
|
10
|
-
export interface
|
|
13
|
+
export interface TestCommandRunnerOptions {
|
|
11
14
|
readonly files?: ReadonlyMap<string, string> | undefined;
|
|
12
15
|
readonly directories?: ReadonlySet<string> | undefined;
|
|
13
16
|
readonly env?: ReadonlyMap<string, string> | undefined;
|
|
14
17
|
readonly commands?: ReadonlyMap<string, TestCommandResponse> | undefined;
|
|
15
18
|
readonly timestamps?: ReadonlyArray<string> | undefined;
|
|
19
|
+
readonly pathLayer?: Layer.Layer<Path.Path> | undefined;
|
|
16
20
|
}
|
|
17
21
|
export declare const commandKey: (command: CommandSpec) => string;
|
|
18
|
-
export declare const
|
|
22
|
+
export declare const makeTestCommandRunnerLayer: (options?: TestCommandRunnerOptions) => Layer.Layer<FileSystem.FileSystem | Path.Path | ReleaseCommandRunner | Crypto.Crypto, never, never>;
|
|
19
23
|
//# sourceMappingURL=test.d.ts.map
|
package/dist/host/test.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/host/test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/host/test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAqC,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAEnF,mBAAmB,6BAA6B,CAAA;AAEhD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;IACxD,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IACtD,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,SAAS,CAAA;IACxE,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;CACxD;AAED,eAAO,MAAM,UAAU,GAAI,SAAS,WAAW,KAAG,MACI,CAAA;AAsGtD,eAAO,MAAM,0BAA0B,GACrC,UAAS,wBAA6B,wGAqHvC,CAAA"}
|
package/dist/host/test.js
CHANGED
|
@@ -1,9 +1,102 @@
|
|
|
1
|
+
import * as ConfigProvider from "effect/ConfigProvider";
|
|
2
|
+
import * as Crypto from "effect/Crypto";
|
|
1
3
|
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as FileSystem from "effect/FileSystem";
|
|
2
5
|
import * as Layer from "effect/Layer";
|
|
3
|
-
import
|
|
6
|
+
import * as Option from "effect/Option";
|
|
7
|
+
import * as Path from "effect/Path";
|
|
8
|
+
import * as PlatformError from "effect/PlatformError";
|
|
9
|
+
import { CommandResult, CommandRunnerError, ReleaseCommandRunner } from "./host.js";
|
|
4
10
|
export const commandKey = (command) => [command.executable, ...command.args].join("\u0000");
|
|
5
|
-
const
|
|
6
|
-
|
|
11
|
+
const notFound = (method, path) => PlatformError.systemError({
|
|
12
|
+
_tag: "NotFound",
|
|
13
|
+
module: "FileSystem",
|
|
14
|
+
method,
|
|
15
|
+
pathOrDescriptor: path,
|
|
16
|
+
description: "File not found"
|
|
17
|
+
});
|
|
18
|
+
const fileInfo = (sizeBytes) => ({
|
|
19
|
+
type: "File",
|
|
20
|
+
mtime: Option.none(),
|
|
21
|
+
atime: Option.none(),
|
|
22
|
+
birthtime: Option.none(),
|
|
23
|
+
dev: 0,
|
|
24
|
+
ino: Option.none(),
|
|
25
|
+
mode: 0,
|
|
26
|
+
nlink: Option.none(),
|
|
27
|
+
uid: Option.none(),
|
|
28
|
+
gid: Option.none(),
|
|
29
|
+
rdev: Option.none(),
|
|
30
|
+
size: FileSystem.Size(sizeBytes),
|
|
31
|
+
blksize: Option.none(),
|
|
32
|
+
blocks: Option.none()
|
|
33
|
+
});
|
|
34
|
+
const directoryInfo = {
|
|
35
|
+
type: "Directory",
|
|
36
|
+
mtime: Option.none(),
|
|
37
|
+
atime: Option.none(),
|
|
38
|
+
birthtime: Option.none(),
|
|
39
|
+
dev: 0,
|
|
40
|
+
ino: Option.none(),
|
|
41
|
+
mode: 0,
|
|
42
|
+
nlink: Option.none(),
|
|
43
|
+
uid: Option.none(),
|
|
44
|
+
gid: Option.none(),
|
|
45
|
+
rdev: Option.none(),
|
|
46
|
+
size: FileSystem.Size(0),
|
|
47
|
+
blksize: Option.none(),
|
|
48
|
+
blocks: Option.none()
|
|
49
|
+
};
|
|
50
|
+
const textEncoder = new TextEncoder();
|
|
51
|
+
const textDecoder = new TextDecoder();
|
|
52
|
+
const normalizedSeparators = (path) => path.replaceAll("\\", "/");
|
|
53
|
+
const addVariant = (variants, path) => {
|
|
54
|
+
variants.add(path);
|
|
55
|
+
variants.add(normalizedSeparators(path));
|
|
56
|
+
};
|
|
57
|
+
const addRelativePathVariants = (variants, cwd, path) => {
|
|
58
|
+
const normalizedCwd = normalizedSeparators(cwd);
|
|
59
|
+
const normalizedPath = normalizedSeparators(path);
|
|
60
|
+
if (normalizedPath === normalizedCwd) {
|
|
61
|
+
variants.add(".");
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const cwdPrefix = `${normalizedCwd}/`;
|
|
65
|
+
if (normalizedPath.startsWith(cwdPrefix)) {
|
|
66
|
+
variants.add(normalizedPath.slice(cwdPrefix.length));
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const pathVariants = (path) => {
|
|
70
|
+
const variants = new Set();
|
|
71
|
+
addVariant(variants, path);
|
|
72
|
+
const cwd = globalThis.process?.cwd();
|
|
73
|
+
if (cwd === undefined) {
|
|
74
|
+
return [...variants];
|
|
75
|
+
}
|
|
76
|
+
if (path === cwd) {
|
|
77
|
+
variants.add(".");
|
|
78
|
+
}
|
|
79
|
+
addRelativePathVariants(variants, cwd, path);
|
|
80
|
+
return [...variants];
|
|
81
|
+
};
|
|
82
|
+
const getFixtureFile = (files, path) => {
|
|
83
|
+
for (const variant of pathVariants(path)) {
|
|
84
|
+
const contents = files.get(variant);
|
|
85
|
+
if (contents !== undefined) {
|
|
86
|
+
return contents;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return undefined;
|
|
90
|
+
};
|
|
91
|
+
const hasFixtureDirectory = (directories, path) => {
|
|
92
|
+
for (const variant of pathVariants(path)) {
|
|
93
|
+
if (directories.has(variant)) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
};
|
|
99
|
+
export const makeTestCommandRunnerLayer = (options = {}) => {
|
|
7
100
|
const files = new Map(options.files ?? []);
|
|
8
101
|
const directories = new Set(options.directories ?? []);
|
|
9
102
|
const env = new Map(options.env ?? []);
|
|
@@ -15,31 +108,42 @@ export const makeTestReleaseHostLayer = (options = {}) => {
|
|
|
15
108
|
timestampIndex += 1;
|
|
16
109
|
return value;
|
|
17
110
|
};
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
files.set(path, contents);
|
|
24
|
-
}),
|
|
111
|
+
const envRecord = {};
|
|
112
|
+
for (const [name, value] of env) {
|
|
113
|
+
envRecord[name] = value;
|
|
114
|
+
}
|
|
115
|
+
return Layer.mergeAll(FileSystem.layerNoop({
|
|
25
116
|
stat: (path) => Effect.sync(() => {
|
|
26
|
-
const contents = files
|
|
117
|
+
const contents = getFixtureFile(files, path);
|
|
27
118
|
if (contents !== undefined) {
|
|
28
|
-
return
|
|
119
|
+
return fileInfo(textEncoder.encode(contents).byteLength);
|
|
29
120
|
}
|
|
30
|
-
if (directories
|
|
31
|
-
return
|
|
121
|
+
if (hasFixtureDirectory(directories, path)) {
|
|
122
|
+
return directoryInfo;
|
|
32
123
|
}
|
|
33
124
|
return undefined;
|
|
34
125
|
}).pipe(Effect.flatMap((info) => info === undefined
|
|
35
|
-
? Effect.fail(
|
|
126
|
+
? Effect.fail(notFound("stat", path))
|
|
36
127
|
: Effect.succeed(info))),
|
|
37
|
-
|
|
38
|
-
? Effect.fail(
|
|
39
|
-
: contents
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
128
|
+
readFile: (path) => Effect.sync(() => getFixtureFile(files, path)).pipe(Effect.flatMap((contents) => contents === undefined
|
|
129
|
+
? Effect.fail(notFound("readFile", path))
|
|
130
|
+
: Effect.succeed(textEncoder.encode(contents)))),
|
|
131
|
+
readFileString: (path) => Effect.sync(() => getFixtureFile(files, path)).pipe(Effect.flatMap((contents) => contents === undefined
|
|
132
|
+
? Effect.fail(notFound("readFileString", path))
|
|
133
|
+
: Effect.succeed(contents))),
|
|
134
|
+
makeDirectory: (path) => Effect.sync(() => {
|
|
135
|
+
directories.add(path);
|
|
136
|
+
}),
|
|
137
|
+
writeFile: (path, data) => Effect.sync(() => {
|
|
138
|
+
files.set(path, textDecoder.decode(data));
|
|
139
|
+
}),
|
|
140
|
+
writeFileString: (path, data) => Effect.sync(() => {
|
|
141
|
+
files.set(path, data);
|
|
142
|
+
})
|
|
143
|
+
}), options.pathLayer ?? Path.layer, Layer.succeed(Crypto.Crypto)(Crypto.make({
|
|
144
|
+
randomBytes: (size) => new Uint8Array(size),
|
|
145
|
+
digest: (_algorithm, data) => Effect.succeed(data)
|
|
146
|
+
})), Layer.succeed(ReleaseCommandRunner)({
|
|
43
147
|
runCommand: (command) => Effect.gen(function* () {
|
|
44
148
|
const missing = [];
|
|
45
149
|
for (const name of command.requiredEnv) {
|
|
@@ -48,7 +152,7 @@ export const makeTestReleaseHostLayer = (options = {}) => {
|
|
|
48
152
|
}
|
|
49
153
|
}
|
|
50
154
|
if (missing.length > 0) {
|
|
51
|
-
return yield* Effect.fail(
|
|
155
|
+
return yield* Effect.fail(CommandRunnerError.make({
|
|
52
156
|
operation: "runCommand",
|
|
53
157
|
reason: `Missing required environment variables: ${missing.join(", ")}`
|
|
54
158
|
}));
|
|
@@ -69,8 +173,7 @@ export const makeTestReleaseHostLayer = (options = {}) => {
|
|
|
69
173
|
endedAt,
|
|
70
174
|
durationMillis: 0
|
|
71
175
|
});
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
});
|
|
176
|
+
})
|
|
177
|
+
}), ConfigProvider.layer(ConfigProvider.fromEnv({ env: envRecord })));
|
|
75
178
|
};
|
|
76
179
|
//# sourceMappingURL=test.js.map
|
package/dist/host/test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/host/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/host/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAA;AACvD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAA;AAErD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAmBnF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAU,EAAE,CACzD,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAEtD,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,IAAY,EAA+B,EAAE,CAC7E,aAAa,CAAC,WAAW,CAAC;IACxB,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,YAAY;IACpB,MAAM;IACN,gBAAgB,EAAE,IAAI;IACtB,WAAW,EAAE,gBAAgB;CAC9B,CAAC,CAAA;AAEJ,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAwB,EAAE,CAAC,CAAC;IAC7D,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE;IACpB,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE;IACpB,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE;IACxB,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;IAClB,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE;IACpB,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;IAClB,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;IAClB,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;IACnB,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE;IACtB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;CACtB,CAAC,CAAA;AAEF,MAAM,aAAa,GAAyB;IAC1C,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE;IACpB,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE;IACpB,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE;IACxB,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;IAClB,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE;IACpB,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;IAClB,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;IAClB,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;IACnB,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE;IACtB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;CACtB,CAAA;AAED,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAA;AACrC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAA;AAErC,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAU,EAAE,CACpD,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;AAE5B,MAAM,UAAU,GAAG,CAAC,QAAqB,EAAE,IAAY,EAAQ,EAAE;IAC/D,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAClB,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,uBAAuB,GAAG,CAAC,QAAqB,EAAE,GAAW,EAAE,IAAY,EAAQ,EAAE;IACzF,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAC/C,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAA;IACjD,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;QACrC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACjB,OAAM;IACR,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,aAAa,GAAG,CAAA;IACrC,IAAI,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;IACtD,CAAC;AACH,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,IAAY,EAAyB,EAAE;IAC3D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC1B,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,CAAA;IACrC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAA;IACtB,CAAC;IACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACjB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;IACD,uBAAuB,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAC5C,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAA;AACtB,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,KAAkC,EAAE,IAAY,EAAsB,EAAE;IAC9F,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAA;QACjB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,WAAgC,EAAE,IAAY,EAAW,EAAE;IACtF,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,UAAoC,EAAE,EACtC,EAAE;IACF,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IAC1C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAA;IACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;IACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAA;IAChD,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAA;IAC5E,IAAI,cAAc,GAAG,CAAC,CAAA;IAEtB,MAAM,aAAa,GAAG,GAAW,EAAE;QACjC,MAAM,KAAK,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,0BAA0B,CAAA;QAC3G,cAAc,IAAI,CAAC,CAAA;QACnB,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IAED,MAAM,SAAS,GAA2B,EAAE,CAAA;IAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;QAChC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IACzB,CAAC;IAED,OAAO,KAAK,CAAC,QAAQ,CACnB,UAAU,CAAC,SAAS,CAAC;QACnB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACb,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YAC5C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAA;YAC1D,CAAC;YACD,IAAI,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC3C,OAAO,aAAa,CAAA;YACtB,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACtB,IAAI,KAAK,SAAS;YAChB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACrC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CACzB,CACF;QAEH,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CACjB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CACjD,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1B,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACzC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CACjD,CACF;QAEH,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CACvB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CACjD,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1B,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAC7B,CACF;QAEH,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CACtB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC,CAAC;QAEJ,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CACxB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QAC3C,CAAC,CAAC;QAEJ,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACvB,CAAC,CAAC;KACL,CAAC,EACF,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,EAC/B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAC1B,MAAM,CAAC,IAAI,CAAC;QACV,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC;QAC3C,MAAM,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;KACnD,CAAC,CACH,EACD,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAClC,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CACtB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,OAAO,GAAkB,EAAE,CAAA;YACjC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACvC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACpB,CAAC;YACH,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,kBAAkB,CAAC,IAAI,CAAC;oBACtB,SAAS,EAAE,YAAY;oBACvB,MAAM,EAAE,2CAA2C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBACxE,CAAC,CACH,CAAA;YACH,CAAC;YACD,MAAM,SAAS,GAAG,aAAa,EAAE,CAAA;YACjC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;YAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI;gBACpD,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,EAAE;aACX,CAAA;YACD,OAAO,aAAa,CAAC,IAAI,CAAC;gBACxB,OAAO;gBACP,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,SAAS;gBACT,OAAO;gBACP,cAAc,EAAE,CAAC;aAClB,CAAC,CAAA;QACJ,CAAC,CAAC;KACL,CAAC,EACF,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CACjE,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type * as Path from "effect/Path";
|
|
2
|
+
export type WorkspacePathBoundaryReason = "empty-or-parent-traversal" | "outside-root";
|
|
3
|
+
export interface WorkspacePathOk {
|
|
4
|
+
readonly _tag: "Ok";
|
|
5
|
+
readonly path: string;
|
|
6
|
+
}
|
|
7
|
+
export interface WorkspacePathInvalid {
|
|
8
|
+
readonly _tag: "Invalid";
|
|
9
|
+
readonly reason: WorkspacePathBoundaryReason;
|
|
10
|
+
}
|
|
11
|
+
export type WorkspacePathResult = WorkspacePathOk | WorkspacePathInvalid;
|
|
12
|
+
export declare const hasParentTraversal: (pathName: string) => boolean;
|
|
13
|
+
export declare const resolveWorkspacePath: (path: Path.Path, root: string, pathName: string) => string;
|
|
14
|
+
export declare const isInsidePathBoundary: (path: Path.Path, root: string, targetPath: string) => boolean;
|
|
15
|
+
export declare const validateWorkspaceWritePath: (path: Path.Path, root: string, pathName: string) => WorkspacePathResult;
|
|
16
|
+
//# sourceMappingURL=workspace-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-path.d.ts","sourceRoot":"","sources":["../../src/internal/workspace-path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,aAAa,CAAA;AAExC,MAAM,MAAM,2BAA2B,GAAG,2BAA2B,GAAG,cAAc,CAAA;AAEtF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAA;CAC7C;AAED,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG,oBAAoB,CAAA;AAExE,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,KAAG,OACb,CAAA;AAEzC,eAAO,MAAM,oBAAoB,GAAI,MAAM,IAAI,CAAC,IAAI,EAAE,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,MAMtF,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,MAAM,IAAI,CAAC,IAAI,EAAE,MAAM,MAAM,EAAE,YAAY,MAAM,KAAG,OAIxF,CAAA;AAED,eAAO,MAAM,0BAA0B,GACrC,MAAM,IAAI,CAAC,IAAI,EACf,MAAM,MAAM,EACZ,UAAU,MAAM,KACf,mBAkBF,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const hasParentTraversal = (pathName) => pathName.split(/[\\/]+/).includes("..");
|
|
2
|
+
export const resolveWorkspacePath = (path, root, pathName) => {
|
|
3
|
+
const rootPath = path.resolve(root);
|
|
4
|
+
if (path.isAbsolute(pathName)) {
|
|
5
|
+
return path.resolve(pathName);
|
|
6
|
+
}
|
|
7
|
+
return path.resolve(rootPath, pathName);
|
|
8
|
+
};
|
|
9
|
+
export const isInsidePathBoundary = (path, root, targetPath) => {
|
|
10
|
+
const rootPath = path.resolve(root);
|
|
11
|
+
const relative = path.relative(rootPath, targetPath);
|
|
12
|
+
return relative.length === 0 || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
13
|
+
};
|
|
14
|
+
export const validateWorkspaceWritePath = (path, root, pathName) => {
|
|
15
|
+
if (pathName.trim().length === 0 || hasParentTraversal(pathName)) {
|
|
16
|
+
return {
|
|
17
|
+
_tag: "Invalid",
|
|
18
|
+
reason: "empty-or-parent-traversal"
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const targetPath = resolveWorkspacePath(path, root, pathName);
|
|
22
|
+
if (isInsidePathBoundary(path, root, targetPath)) {
|
|
23
|
+
return {
|
|
24
|
+
_tag: "Ok",
|
|
25
|
+
path: targetPath
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
_tag: "Invalid",
|
|
30
|
+
reason: "outside-root"
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=workspace-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-path.js","sourceRoot":"","sources":["../../src/internal/workspace-path.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAgB,EAAW,EAAE,CAC9D,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AAEzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAe,EAAE,IAAY,EAAE,QAAgB,EAAU,EAAE;IAC9F,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;AACzC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAe,EAAE,IAAY,EAAE,UAAkB,EAAW,EAAE;IACjG,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IACpD,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAA;AAC5F,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,IAAe,EACf,IAAY,EACZ,QAAgB,EACK,EAAE;IACvB,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjE,OAAO;YACL,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,2BAA2B;SACpC,CAAA;IACH,CAAC;IACD,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC7D,IAAI,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;QACjD,OAAO;YACL,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,UAAU;SACjB,CAAA;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,cAAc;KACvB,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as Crypto from "effect/Crypto";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as FileSystem from "effect/FileSystem";
|
|
4
|
+
import * as Path from "effect/Path";
|
|
5
|
+
import { ArtifactIntent, ArtifactInventoryItem } from "../domain/artifact.js";
|
|
6
|
+
import { ReleaseNormalizationError } from "./errors.js";
|
|
7
|
+
export type * from "../types/effect-internal.js";
|
|
8
|
+
export declare const inventoryArtifact: (root: string, artifact: ArtifactIntent) => Effect.Effect<ArtifactInventoryItem, ReleaseNormalizationError, FileSystem.FileSystem | Path.Path | Crypto.Crypto>;
|
|
9
|
+
//# sourceMappingURL=artifact-inventory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-inventory.d.ts","sourceRoot":"","sources":["../../src/planner/artifact-inventory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,EACL,cAAc,EACd,qBAAqB,EAGtB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAEvD,mBAAmB,6BAA6B,CAAA;AAwGhD,eAAO,MAAM,iBAAiB,gKAuB5B,CAAA"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as Crypto from "effect/Crypto";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Encoding from "effect/Encoding";
|
|
4
|
+
import * as FileSystem from "effect/FileSystem";
|
|
5
|
+
import * as Path from "effect/Path";
|
|
6
|
+
import { ArtifactInventoryItem, Checksum } from "../domain/artifact.js";
|
|
7
|
+
import { ReleaseNormalizationError } from "./errors.js";
|
|
8
|
+
const checksumName = (algorithm) => algorithm === "sha256" ? "SHA-256" : "SHA-512";
|
|
9
|
+
const formatUnknown = (cause) => cause instanceof Error ? cause.message : String(cause);
|
|
10
|
+
const artifactPath = (path, root, pathName) => path.isAbsolute(pathName) ? pathName : path.resolve(root, pathName);
|
|
11
|
+
const artifactKind = (info) => info.type === "Directory" ? "directory" : info.type === "File" ? "file" : "other";
|
|
12
|
+
const normalizationPlatformError = (field) => (cause) => ReleaseNormalizationError.make({
|
|
13
|
+
field,
|
|
14
|
+
reason: formatUnknown(cause)
|
|
15
|
+
});
|
|
16
|
+
const validateArtifactFormat = (artifact, kind) => {
|
|
17
|
+
if (artifact.format === "directory" && kind !== "directory") {
|
|
18
|
+
return Effect.fail(ReleaseNormalizationError.make({
|
|
19
|
+
field: `artifacts.${artifact.id}.format`,
|
|
20
|
+
reason: `Expected directory artifact at ${artifact.path}`
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
if (artifact.format !== "directory" && kind === "directory") {
|
|
24
|
+
return Effect.fail(ReleaseNormalizationError.make({
|
|
25
|
+
field: `artifacts.${artifact.id}.format`,
|
|
26
|
+
reason: `Expected file-like artifact at ${artifact.path}`
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
return Effect.void;
|
|
30
|
+
};
|
|
31
|
+
const checksumArtifact = Effect.fn("checksumArtifact")(function* (artifact, targetPath, fileType) {
|
|
32
|
+
if (fileType !== "File") {
|
|
33
|
+
return yield* Effect.fail(ReleaseNormalizationError.make({
|
|
34
|
+
field: `artifacts.${artifact.id}.checksum`,
|
|
35
|
+
reason: "Only file artifacts can be hashed"
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
const fs = yield* FileSystem.FileSystem;
|
|
39
|
+
const crypto = yield* Crypto.Crypto;
|
|
40
|
+
const bytes = yield* fs.readFile(targetPath).pipe(Effect.mapError(normalizationPlatformError(`artifacts.${artifact.id}.checksum`)));
|
|
41
|
+
const digest = yield* crypto.digest(checksumName("sha256"), bytes).pipe(Effect.mapError(normalizationPlatformError(`artifacts.${artifact.id}.checksum`)));
|
|
42
|
+
return Checksum.make({
|
|
43
|
+
algorithm: "sha256",
|
|
44
|
+
value: Encoding.encodeHex(digest)
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
const verifiedChecksum = Effect.fn("verifiedChecksum")(function* (artifact, targetPath, fileType) {
|
|
48
|
+
if (artifact.checksum === undefined) {
|
|
49
|
+
return artifact.format === "directory"
|
|
50
|
+
? undefined
|
|
51
|
+
: yield* checksumArtifact(artifact, targetPath, fileType);
|
|
52
|
+
}
|
|
53
|
+
if (artifact.checksum.algorithm !== "sha256") {
|
|
54
|
+
return yield* Effect.fail(ReleaseNormalizationError.make({
|
|
55
|
+
field: `artifacts.${artifact.id}.checksum`,
|
|
56
|
+
reason: "Only sha256 artifact checksums are supported."
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
const computed = yield* checksumArtifact(artifact, targetPath, fileType);
|
|
60
|
+
if (artifact.checksum.value !== computed.value) {
|
|
61
|
+
return yield* Effect.fail(ReleaseNormalizationError.make({
|
|
62
|
+
field: `artifacts.${artifact.id}.checksum`,
|
|
63
|
+
reason: "Artifact checksum does not match artifact bytes."
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
return artifact.checksum;
|
|
67
|
+
});
|
|
68
|
+
export const inventoryArtifact = Effect.fn("inventoryArtifact")(function* (root, artifact) {
|
|
69
|
+
const fs = yield* FileSystem.FileSystem;
|
|
70
|
+
const path = yield* Path.Path;
|
|
71
|
+
const targetPath = artifactPath(path, root, artifact.path);
|
|
72
|
+
const info = yield* fs.stat(targetPath).pipe(Effect.mapError(normalizationPlatformError(`artifacts.${artifact.id}.path`)));
|
|
73
|
+
const kind = artifactKind(info);
|
|
74
|
+
yield* validateArtifactFormat(artifact, kind);
|
|
75
|
+
const checksum = yield* verifiedChecksum(artifact, targetPath, info.type);
|
|
76
|
+
return ArtifactInventoryItem.make({
|
|
77
|
+
id: artifact.id,
|
|
78
|
+
path: artifact.path,
|
|
79
|
+
format: artifact.format,
|
|
80
|
+
consumers: [...artifact.consumers].sort(),
|
|
81
|
+
sizeBytes: Number(info.size),
|
|
82
|
+
...(checksum === undefined ? {} : { checksum })
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=artifact-inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-inventory.js","sourceRoot":"","sources":["../../src/planner/artifact-inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
2
|
import { ReleaseIntent, ReleasePlan } from "../domain/release.js";
|
|
3
3
|
export type * from "../types/effect-internal.js";
|
|
4
|
-
export declare const createReleasePlan: (intent: ReleaseIntent, root?: string | undefined, configPath?: string | undefined) => Effect.Effect<ReleasePlan, import("./errors.js").ReleaseNormalizationError | import("./errors.js").PlanConstructionError | import("../targets/registry.js").MissingTargetAdapterError, import("../host/host.js").
|
|
4
|
+
export declare const createReleasePlan: (intent: ReleaseIntent, root?: string | undefined, configPath?: string | undefined) => Effect.Effect<ReleasePlan, import("./errors.js").ReleaseNormalizationError | import("./errors.js").PlanConstructionError | import("../targets/registry.js").MissingTargetAdapterError, import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("../host/host.js").ReleaseCommandRunner | import("effect/Crypto").Crypto | import("../targets/registry.js").TargetRegistry>;
|
|
5
5
|
//# sourceMappingURL=create-release-plan.d.ts.map
|