@mannyc1/ts-release 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +249 -0
  2. package/SPEC.md +254 -0
  3. package/dist/cli/command.d.ts +4 -0
  4. package/dist/cli/command.d.ts.map +1 -0
  5. package/dist/cli/command.js +90 -0
  6. package/dist/cli/command.js.map +1 -0
  7. package/dist/cli/main.d.ts +3 -0
  8. package/dist/cli/main.d.ts.map +1 -0
  9. package/dist/cli/main.js +12 -0
  10. package/dist/cli/main.js.map +1 -0
  11. package/dist/cli/programmatic.d.ts +25 -0
  12. package/dist/cli/programmatic.d.ts.map +1 -0
  13. package/dist/cli/programmatic.js +48 -0
  14. package/dist/cli/programmatic.js.map +1 -0
  15. package/dist/config/errors.d.ts +23 -0
  16. package/dist/config/errors.d.ts.map +1 -0
  17. package/dist/config/errors.js +18 -0
  18. package/dist/config/errors.js.map +1 -0
  19. package/dist/config/load.d.ts +9 -0
  20. package/dist/config/load.d.ts.map +1 -0
  21. package/dist/config/load.js +27 -0
  22. package/dist/config/load.js.map +1 -0
  23. package/dist/config/schema.d.ts +8 -0
  24. package/dist/config/schema.d.ts.map +1 -0
  25. package/dist/config/schema.js +6 -0
  26. package/dist/config/schema.js.map +1 -0
  27. package/dist/domain/artifact.d.ts +36 -0
  28. package/dist/domain/artifact.d.ts.map +1 -0
  29. package/dist/domain/artifact.js +29 -0
  30. package/dist/domain/artifact.js.map +1 -0
  31. package/dist/domain/evidence.d.ts +58 -0
  32. package/dist/domain/evidence.d.ts.map +1 -0
  33. package/dist/domain/evidence.js +50 -0
  34. package/dist/domain/evidence.js.map +1 -0
  35. package/dist/domain/operation.d.ts +98 -0
  36. package/dist/domain/operation.d.ts.map +1 -0
  37. package/dist/domain/operation.js +133 -0
  38. package/dist/domain/operation.js.map +1 -0
  39. package/dist/domain/release.d.ts +66 -0
  40. package/dist/domain/release.d.ts.map +1 -0
  41. package/dist/domain/release.js +56 -0
  42. package/dist/domain/release.js.map +1 -0
  43. package/dist/domain/target.d.ts +75 -0
  44. package/dist/domain/target.d.ts.map +1 -0
  45. package/dist/domain/target.js +67 -0
  46. package/dist/domain/target.js.map +1 -0
  47. package/dist/host/bun.d.ts +9 -0
  48. package/dist/host/bun.d.ts.map +1 -0
  49. package/dist/host/bun.js +156 -0
  50. package/dist/host/bun.js.map +1 -0
  51. package/dist/host/host.d.ts +47 -0
  52. package/dist/host/host.d.ts.map +1 -0
  53. package/dist/host/host.js +42 -0
  54. package/dist/host/host.js.map +1 -0
  55. package/dist/host/test.d.ts +19 -0
  56. package/dist/host/test.d.ts.map +1 -0
  57. package/dist/host/test.js +76 -0
  58. package/dist/host/test.js.map +1 -0
  59. package/dist/index.d.ts +2 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +2 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/planner/create-release-plan.d.ts +5 -0
  64. package/dist/planner/create-release-plan.d.ts.map +1 -0
  65. package/dist/planner/create-release-plan.js +25 -0
  66. package/dist/planner/create-release-plan.js.map +1 -0
  67. package/dist/planner/errors.d.ts +37 -0
  68. package/dist/planner/errors.d.ts.map +1 -0
  69. package/dist/planner/errors.js +30 -0
  70. package/dist/planner/errors.js.map +1 -0
  71. package/dist/planner/evidence-recorder.d.ts +18 -0
  72. package/dist/planner/evidence-recorder.d.ts.map +1 -0
  73. package/dist/planner/evidence-recorder.js +95 -0
  74. package/dist/planner/evidence-recorder.js.map +1 -0
  75. package/dist/planner/executor.d.ts +19 -0
  76. package/dist/planner/executor.d.ts.map +1 -0
  77. package/dist/planner/executor.js +59 -0
  78. package/dist/planner/executor.js.map +1 -0
  79. package/dist/planner/normalize-release.d.ts +7 -0
  80. package/dist/planner/normalize-release.d.ts.map +1 -0
  81. package/dist/planner/normalize-release.js +101 -0
  82. package/dist/planner/normalize-release.js.map +1 -0
  83. package/dist/planner/render-plan.d.ts +5 -0
  84. package/dist/planner/render-plan.d.ts.map +1 -0
  85. package/dist/planner/render-plan.js +49 -0
  86. package/dist/planner/render-plan.js.map +1 -0
  87. package/dist/targets/adapter.d.ts +15 -0
  88. package/dist/targets/adapter.d.ts.map +1 -0
  89. package/dist/targets/adapter.js +2 -0
  90. package/dist/targets/adapter.js.map +1 -0
  91. package/dist/targets/github.d.ts +11 -0
  92. package/dist/targets/github.d.ts.map +1 -0
  93. package/dist/targets/github.js +174 -0
  94. package/dist/targets/github.js.map +1 -0
  95. package/dist/targets/homebrew.d.ts +11 -0
  96. package/dist/targets/homebrew.d.ts.map +1 -0
  97. package/dist/targets/homebrew.js +153 -0
  98. package/dist/targets/homebrew.js.map +1 -0
  99. package/dist/targets/live.d.ts +5 -0
  100. package/dist/targets/live.d.ts.map +1 -0
  101. package/dist/targets/live.js +31 -0
  102. package/dist/targets/live.js.map +1 -0
  103. package/dist/targets/npm.d.ts +11 -0
  104. package/dist/targets/npm.d.ts.map +1 -0
  105. package/dist/targets/npm.js +105 -0
  106. package/dist/targets/npm.js.map +1 -0
  107. package/dist/targets/registry.d.ts +25 -0
  108. package/dist/targets/registry.d.ts.map +1 -0
  109. package/dist/targets/registry.js +34 -0
  110. package/dist/targets/registry.js.map +1 -0
  111. package/dist/types/effect-internal.d.ts +5 -0
  112. package/dist/types/effect-internal.d.ts.map +1 -0
  113. package/dist/types/effect-internal.js +2 -0
  114. package/dist/types/effect-internal.js.map +1 -0
  115. package/examples/README.md +15 -0
  116. package/examples/github-release/artifacts/release-example-github-0.1.0.tgz +1 -0
  117. package/examples/github-release/release.config.json +31 -0
  118. package/examples/homebrew-tap/artifacts/release-example-homebrew-0.1.0.tgz +1 -0
  119. package/examples/homebrew-tap/release.config.json +34 -0
  120. package/examples/non-strict-skips/artifacts/release-example-skips-0.1.0.tgz +1 -0
  121. package/examples/non-strict-skips/release.config.json +29 -0
  122. package/examples/npm-only/index.js +1 -0
  123. package/examples/npm-only/package.json +8 -0
  124. package/examples/npm-only/release.config.json +30 -0
  125. package/package.json +176 -0
@@ -0,0 +1,49 @@
1
+ const commandLine = (operation) => [operation.command.executable, ...operation.command.args].join(" ");
2
+ const artifactLine = (artifact) => {
3
+ const checksum = artifact.checksum === undefined
4
+ ? "checksum=none"
5
+ : `checksum=${artifact.checksum.algorithm}:${artifact.checksum.value}`;
6
+ return `- ${artifact.id} ${artifact.path} [${artifact.format}] size=${artifact.sizeBytes} ${checksum}`;
7
+ };
8
+ export const renderPlanJson = (plan) => `${JSON.stringify(plan, null, 2)}\n`;
9
+ export const renderPlanText = (plan) => {
10
+ const lines = [
11
+ `${plan.identity.name}@${plan.identity.version}`,
12
+ `commit: ${plan.identity.commit}`,
13
+ `evidence: ${plan.evidenceDirectory}`,
14
+ `artifacts: ${plan.artifacts.length}`,
15
+ `targets: ${plan.targets.length}`,
16
+ `operations: ${plan.operations.length}`,
17
+ ""
18
+ ];
19
+ lines.push("artifacts:");
20
+ for (const artifact of plan.artifacts) {
21
+ lines.push(` ${artifactLine(artifact)}`);
22
+ }
23
+ lines.push("");
24
+ lines.push("targets:");
25
+ for (const capability of plan.targetCapabilities) {
26
+ lines.push(` - ${capability.targetId} [${capability.targetTag}] auth=${capability.authRequirement} ` +
27
+ `dry-run=${capability.dryRunSupport} strategy=${capability.validationStrategy} ` +
28
+ `mutability=${capability.mutability} recovery=${capability.recovery}`);
29
+ }
30
+ lines.push("");
31
+ lines.push("operations:");
32
+ for (const operation of plan.operations) {
33
+ lines.push(` - ${operation.id} [${operation.risk}] ${operation.description}`);
34
+ if ("command" in operation) {
35
+ lines.push(` command: ${commandLine(operation)}`);
36
+ }
37
+ if (operation._tag === "RenderFileOperation") {
38
+ lines.push(` write: ${operation.path}`);
39
+ }
40
+ if (operation._tag === "ValidationNoteOperation") {
41
+ lines.push(` note: ${operation.message}`);
42
+ }
43
+ if (operation.gate.requiresExecute) {
44
+ lines.push(` gate: execute${operation.gate.requiresIrreversibleApproval ? " + irreversible approval" : ""}`);
45
+ }
46
+ }
47
+ return `${lines.join("\n")}\n`;
48
+ };
49
+ //# sourceMappingURL=render-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-plan.js","sourceRoot":"","sources":["../../src/planner/render-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { Operation } from "../domain/operation.js";
3
+ import { ReleaseModel } from "../domain/release.js";
4
+ import { GitHubReleaseTarget, HomebrewTapTarget, NpmRegistryTarget, TargetCapabilities, TargetConfig } from "../domain/target.js";
5
+ import { PlanConstructionError } from "../planner/errors.js";
6
+ export type * from "../types/effect-internal.js";
7
+ export interface TargetAdapter<Target extends TargetConfig> {
8
+ readonly targetTag: Target["_tag"];
9
+ readonly capabilities: (target: Target) => TargetCapabilities;
10
+ readonly planOperations: (target: Target, model: ReleaseModel) => Effect.Effect<ReadonlyArray<Operation>, PlanConstructionError>;
11
+ }
12
+ export type NpmTargetAdapter = TargetAdapter<NpmRegistryTarget>;
13
+ export type GitHubTargetAdapter = TargetAdapter<GitHubReleaseTarget>;
14
+ export type HomebrewTargetAdapter = TargetAdapter<HomebrewTapTarget>;
15
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/targets/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACb,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,mBAAmB,6BAA6B,CAAA;AAEhD,MAAM,WAAW,aAAa,CAAC,MAAM,SAAS,YAAY;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAClC,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,CAAA;IAC7D,QAAQ,CAAC,cAAc,EAAE,CACvB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY,KAChB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAA;CACpE;AAED,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAA;AAC/D,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAA;AACpE,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/targets/adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { PublishCommandOperation, ValidateCommandOperation, ValidationNoteOperation, VerifyRemoteOperation } from "../domain/operation.js";
3
+ import { ReleaseModel } from "../domain/release.js";
4
+ import { GitHubReleaseTarget, TargetCapabilities } from "../domain/target.js";
5
+ import { PlanConstructionError } from "../planner/errors.js";
6
+ import { GitHubTargetAdapter } from "./adapter.js";
7
+ export type * from "../types/effect-internal.js";
8
+ export declare const githubTargetCapabilities: (target: GitHubReleaseTarget) => TargetCapabilities;
9
+ export declare const planGitHubOperations: (target: GitHubReleaseTarget, model: ReleaseModel) => Effect.Effect<(import("../domain/operation.js").RenderFileOperation | ValidateCommandOperation | ValidationNoteOperation | PublishCommandOperation | VerifyRemoteOperation)[], PlanConstructionError, never>;
10
+ export declare const GitHubAdapter: GitHubTargetAdapter;
11
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/targets/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAML,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAGnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,mBAAmB,6BAA6B,CAAA;AAoBhD,eAAO,MAAM,wBAAwB,GAAI,QAAQ,mBAAmB,KAAG,kBASnE,CAAA;AAkKJ,eAAO,MAAM,oBAAoB,oQA6C/B,CAAA;AAEF,eAAO,MAAM,aAAa,EAAE,mBAI3B,CAAA"}
@@ -0,0 +1,174 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { CommandSpec, executeGate, irreversibleGate, noApprovalGate, PublishCommandOperation, ValidateCommandOperation, ValidationNoteOperation, VerifyRemoteOperation } from "../domain/operation.js";
3
+ import { TargetCapabilities, targetAuthRequirement } from "../domain/target.js";
4
+ import { PlanConstructionError } from "../planner/errors.js";
5
+ const envNames = (target) => target.tokenEnv === undefined ? [] : [target.tokenEnv];
6
+ const ghCommand = (target, args, includeAuth) => CommandSpec.make({
7
+ executable: "gh",
8
+ args: [...args],
9
+ requiredEnv: includeAuth ? envNames(target) : [],
10
+ redactedEnv: includeAuth ? envNames(target) : []
11
+ });
12
+ const githubValidationStrategy = (target) => target.dryRunSupport === "none" ? "skipped" : "simulated-plan";
13
+ export const githubTargetCapabilities = (target) => TargetCapabilities.make({
14
+ targetId: target.id,
15
+ targetTag: target._tag,
16
+ authRequirement: targetAuthRequirement(target),
17
+ dryRunSupport: target.dryRunSupport,
18
+ mutability: target.mutability,
19
+ recovery: target.recovery,
20
+ validationStrategy: githubValidationStrategy(target)
21
+ });
22
+ const targetArtifacts = (target, model) => model.artifacts.filter((artifact) => artifact.consumers.includes(target.id));
23
+ const pathBaseName = (path) => {
24
+ const parts = path.replaceAll("\\", "/").split("/");
25
+ return parts[parts.length - 1] ?? path;
26
+ };
27
+ const jqString = (value) => JSON.stringify(value);
28
+ const jqAssert = (condition, message) => `if ${condition} then empty else error(${jqString(message)}) end`;
29
+ const releaseViewJsonCommand = (target, model, fields, jq) => ghCommand(target, [
30
+ "release",
31
+ "view",
32
+ model.identity.tag ?? model.identity.version,
33
+ "--repo",
34
+ target.repository,
35
+ "--json",
36
+ fields.join(","),
37
+ "--jq",
38
+ jq
39
+ ], true);
40
+ const releaseArgs = (target, model) => {
41
+ const args = [
42
+ "release",
43
+ "create",
44
+ model.identity.tag ?? model.identity.version,
45
+ "--repo",
46
+ target.repository,
47
+ "--title",
48
+ `${model.identity.name} ${model.identity.version}`
49
+ ];
50
+ if (target.draft === true) {
51
+ args.push("--draft");
52
+ }
53
+ if (target.prerelease === true) {
54
+ args.push("--prerelease");
55
+ }
56
+ if (model.identity.notes !== undefined) {
57
+ args.push("--notes", model.identity.notes);
58
+ }
59
+ for (const artifact of targetArtifacts(target, model)) {
60
+ args.push(artifact.path);
61
+ }
62
+ return args;
63
+ };
64
+ const githubVerificationOperations = (target, model) => {
65
+ const tag = model.identity.tag ?? model.identity.version;
66
+ const title = `${model.identity.name} ${model.identity.version}`;
67
+ const isDraft = target.draft === true;
68
+ const isPrerelease = target.prerelease === true;
69
+ return [
70
+ VerifyRemoteOperation.make({
71
+ id: `${target.id}:gh-release-view`,
72
+ targetId: target.id,
73
+ description: "Verify the GitHub release tag exists.",
74
+ risk: "read-only",
75
+ gate: noApprovalGate("Release verification is read-only."),
76
+ command: releaseViewJsonCommand(target, model, ["tagName"], jqAssert(`.tagName == ${jqString(tag)}`, `Expected release tag ${tag}.`))
77
+ }),
78
+ VerifyRemoteOperation.make({
79
+ id: `${target.id}:gh-release-verify-title`,
80
+ targetId: target.id,
81
+ description: "Verify the GitHub release title.",
82
+ risk: "read-only",
83
+ gate: noApprovalGate("Release title verification is read-only."),
84
+ command: releaseViewJsonCommand(target, model, ["name"], jqAssert(`.name == ${jqString(title)}`, `Expected release title ${title}.`))
85
+ }),
86
+ VerifyRemoteOperation.make({
87
+ id: `${target.id}:gh-release-verify-draft`,
88
+ targetId: target.id,
89
+ description: "Verify the GitHub release draft flag.",
90
+ risk: "read-only",
91
+ gate: noApprovalGate("Release draft verification is read-only."),
92
+ command: releaseViewJsonCommand(target, model, ["isDraft"], jqAssert(`.isDraft == ${isDraft ? "true" : "false"}`, `Expected release draft flag ${isDraft}.`))
93
+ }),
94
+ VerifyRemoteOperation.make({
95
+ id: `${target.id}:gh-release-verify-prerelease`,
96
+ targetId: target.id,
97
+ description: "Verify the GitHub release prerelease flag.",
98
+ risk: "read-only",
99
+ gate: noApprovalGate("Release prerelease verification is read-only."),
100
+ command: releaseViewJsonCommand(target, model, ["isPrerelease"], jqAssert(`.isPrerelease == ${isPrerelease ? "true" : "false"}`, `Expected release prerelease flag ${isPrerelease}.`))
101
+ }),
102
+ ...targetArtifacts(target, model).map((artifact) => {
103
+ const assetName = pathBaseName(artifact.path);
104
+ return VerifyRemoteOperation.make({
105
+ id: `${target.id}:gh-release-verify-asset-${artifact.id}`,
106
+ targetId: target.id,
107
+ description: `Verify GitHub release asset ${assetName}.`,
108
+ risk: "read-only",
109
+ gate: noApprovalGate("Release asset verification is read-only."),
110
+ command: releaseViewJsonCommand(target, model, ["assets"], jqAssert(`.assets | map(.name) | index(${jqString(assetName)}) != null`, `Expected release asset ${assetName}`))
111
+ });
112
+ })
113
+ ];
114
+ };
115
+ const githubDryRunOperation = (target) => ValidationNoteOperation.make({
116
+ id: `${target.id}:gh-release-dry-run`,
117
+ targetId: target.id,
118
+ description: target.dryRunSupport === "none"
119
+ ? "Record skipped GitHub release dry-run validation."
120
+ : "Record simulated GitHub release dry-run validation.",
121
+ risk: "read-only",
122
+ gate: noApprovalGate("Validation notes do not modify local or remote state."),
123
+ message: target.dryRunSupport === "none"
124
+ ? "GitHub release dry-run validation was skipped because this target declares no dry-run support."
125
+ : "GitHub release dry-run validation is simulated by the deterministic release plan; gh release create has no native dry-run command.",
126
+ skipped: target.dryRunSupport === "none",
127
+ severity: target.dryRunSupport === "none" ? "warning" : "info"
128
+ });
129
+ export const planGitHubOperations = Effect.fn("planGitHubOperations")(function* (target, model) {
130
+ if (model.strict && target.dryRunSupport === "none") {
131
+ return yield* Effect.fail(PlanConstructionError.make({
132
+ targetId: target.id,
133
+ reason: "GitHub release target declares no dry-run support in strict mode."
134
+ }));
135
+ }
136
+ const publishRisk = target.mutability === "immutable" ? "irreversible" : "externally-visible";
137
+ const publishGate = publishRisk === "irreversible"
138
+ ? irreversibleGate("Creating this GitHub release is externally visible and configured as immutable.")
139
+ : executeGate("Creating or updating a GitHub release is externally visible.");
140
+ return [
141
+ ValidateCommandOperation.make({
142
+ id: `${target.id}:gh-version`,
143
+ targetId: target.id,
144
+ description: "Check GitHub CLI availability.",
145
+ risk: "read-only",
146
+ gate: noApprovalGate("CLI availability validation is read-only."),
147
+ command: ghCommand(target, ["--version"], false)
148
+ }),
149
+ ValidateCommandOperation.make({
150
+ id: `${target.id}:gh-auth-status`,
151
+ targetId: target.id,
152
+ description: "Validate GitHub CLI authentication.",
153
+ risk: "read-only",
154
+ gate: noApprovalGate("gh auth status checks authentication without publishing."),
155
+ command: ghCommand(target, ["auth", "status"], true)
156
+ }),
157
+ githubDryRunOperation(target),
158
+ PublishCommandOperation.make({
159
+ id: `${target.id}:gh-release-create`,
160
+ targetId: target.id,
161
+ description: `Create GitHub release for ${model.identity.name}@${model.identity.version}.`,
162
+ risk: publishRisk,
163
+ gate: publishGate,
164
+ command: ghCommand(target, releaseArgs(target, model), true)
165
+ }),
166
+ ...githubVerificationOperations(target, model)
167
+ ];
168
+ });
169
+ export const GitHubAdapter = {
170
+ targetTag: "GitHubReleaseTarget",
171
+ capabilities: githubTargetCapabilities,
172
+ planOperations: planGitHubOperations
173
+ };
174
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/targets/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { PublishCommandOperation, RenderFileOperation, ValidateCommandOperation, ValidationNoteOperation } from "../domain/operation.js";
3
+ import { ReleaseModel } from "../domain/release.js";
4
+ import { HomebrewTapTarget, TargetCapabilities } from "../domain/target.js";
5
+ import { PlanConstructionError } from "../planner/errors.js";
6
+ import { HomebrewTargetAdapter } from "./adapter.js";
7
+ export type * from "../types/effect-internal.js";
8
+ export declare const homebrewTargetCapabilities: (target: HomebrewTapTarget) => TargetCapabilities;
9
+ export declare const planHomebrewOperations: (target: HomebrewTapTarget, model: ReleaseModel) => Effect.Effect<(RenderFileOperation | ValidateCommandOperation | ValidationNoteOperation | PublishCommandOperation | import("../domain/operation.js").VerifyRemoteOperation)[], PlanConstructionError, never>;
10
+ export declare const HomebrewAdapter: HomebrewTargetAdapter;
11
+ //# sourceMappingURL=homebrew.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homebrew.d.ts","sourceRoot":"","sources":["../../src/targets/homebrew.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAML,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAGnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,mBAAmB,6BAA6B,CAAA;AA8BhD,eAAO,MAAM,0BAA0B,GAAI,QAAQ,iBAAiB,KAAG,kBASnE,CAAA;AA2FJ,eAAO,MAAM,sBAAsB,kQAyDjC,CAAA;AAEF,eAAO,MAAM,eAAe,EAAE,qBAI7B,CAAA"}
@@ -0,0 +1,153 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { CommandSpec, executeGate, irreversibleGate, noApprovalGate, PublishCommandOperation, RenderFileOperation, ValidateCommandOperation, ValidationNoteOperation } from "../domain/operation.js";
3
+ import { TargetCapabilities, targetAuthRequirement } from "../domain/target.js";
4
+ import { PlanConstructionError } from "../planner/errors.js";
5
+ const envNames = (target) => target.tokenEnv === undefined ? [] : [target.tokenEnv];
6
+ const command = (target, executable, args, includeAuth, cwd = undefined) => CommandSpec.make({
7
+ executable,
8
+ args: [...args],
9
+ ...(cwd === undefined ? {} : { cwd }),
10
+ requiredEnv: includeAuth ? envNames(target) : [],
11
+ redactedEnv: includeAuth ? envNames(target) : []
12
+ });
13
+ const validationStrategy = (target) => {
14
+ if (target.dryRunSupport === "native") {
15
+ return "native-command";
16
+ }
17
+ if (target.dryRunSupport === "simulated") {
18
+ return "simulated-plan";
19
+ }
20
+ return "skipped";
21
+ };
22
+ export const homebrewTargetCapabilities = (target) => TargetCapabilities.make({
23
+ targetId: target.id,
24
+ targetTag: target._tag,
25
+ authRequirement: targetAuthRequirement(target),
26
+ dryRunSupport: target.dryRunSupport,
27
+ mutability: target.mutability,
28
+ recovery: target.recovery,
29
+ validationStrategy: validationStrategy(target)
30
+ });
31
+ const pathBaseName = (path) => {
32
+ const parts = path.replaceAll("\\", "/").split("/");
33
+ return parts[parts.length - 1] ?? path;
34
+ };
35
+ const rubyString = (value) => JSON.stringify(value);
36
+ const formulaClassName = (formulaName) => {
37
+ const parts = formulaName.split(/[^A-Za-z0-9]+/).filter((part) => part.length > 0);
38
+ const className = parts.map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`).join("");
39
+ return className.length === 0 ? "GeneratedFormula" : className;
40
+ };
41
+ const renderFormula = (target, model) => Effect.gen(function* () {
42
+ const artifact = model.artifacts.find((item) => item.id === target.artifactId);
43
+ if (artifact === undefined) {
44
+ return yield* Effect.fail(PlanConstructionError.make({
45
+ targetId: target.id,
46
+ reason: `Homebrew target references missing artifact ${target.artifactId}.`
47
+ }));
48
+ }
49
+ if (artifact.format === "directory") {
50
+ return yield* Effect.fail(PlanConstructionError.make({
51
+ targetId: target.id,
52
+ reason: "Homebrew formula artifacts must be file-like, not directories."
53
+ }));
54
+ }
55
+ if (artifact.checksum === undefined || artifact.checksum.algorithm !== "sha256") {
56
+ return yield* Effect.fail(PlanConstructionError.make({
57
+ targetId: target.id,
58
+ reason: "Homebrew formula rendering requires a sha256 artifact checksum."
59
+ }));
60
+ }
61
+ const installLines = target.installPath === undefined
62
+ ? [" prefix.install Dir[\"*\"]"]
63
+ : [` bin.install ${rubyString(target.installPath)} => ${rubyString(target.formulaName)}`];
64
+ const homepage = target.homepage ?? `https://github.com/${target.repository}`;
65
+ const url = target.url ?? artifact.path;
66
+ return [
67
+ `class ${formulaClassName(target.formulaName)} < Formula`,
68
+ ` desc ${rubyString(`${model.identity.name} ${model.identity.version} release artifact`)}`,
69
+ ` homepage ${rubyString(homepage)}`,
70
+ ` url ${rubyString(url)}`,
71
+ ` sha256 ${rubyString(artifact.checksum.value)}`,
72
+ ` version ${rubyString(model.identity.version)}`,
73
+ "",
74
+ " def install",
75
+ ...installLines,
76
+ " end",
77
+ "end",
78
+ ""
79
+ ].join("\n");
80
+ });
81
+ const dryRunOperation = (target) => target.dryRunSupport === "native"
82
+ ? ValidateCommandOperation.make({
83
+ id: `${target.id}:brew-audit`,
84
+ targetId: target.id,
85
+ description: "Validate generated Homebrew formula with brew audit.",
86
+ risk: "read-only",
87
+ gate: noApprovalGate("brew audit validates the generated formula without publishing."),
88
+ command: command(target, "brew", ["audit", "--strict", "--formula", target.formulaPath], false)
89
+ })
90
+ : ValidationNoteOperation.make({
91
+ id: `${target.id}:brew-audit`,
92
+ targetId: target.id,
93
+ description: target.dryRunSupport === "simulated"
94
+ ? "Record simulated Homebrew formula validation."
95
+ : "Record skipped Homebrew formula validation.",
96
+ risk: "read-only",
97
+ gate: noApprovalGate("Validation notes do not modify local or remote state."),
98
+ message: target.dryRunSupport === "simulated"
99
+ ? "Homebrew formula validation is simulated by the deterministic release plan."
100
+ : "Homebrew formula validation was skipped because this target declares no dry-run support.",
101
+ skipped: target.dryRunSupport === "none",
102
+ severity: target.dryRunSupport === "none" ? "warning" : "info"
103
+ });
104
+ export const planHomebrewOperations = Effect.fn("planHomebrewOperations")(function* (target, model) {
105
+ if (model.strict && target.dryRunSupport === "none") {
106
+ return yield* Effect.fail(PlanConstructionError.make({
107
+ targetId: target.id,
108
+ reason: "Homebrew tap target declares no dry-run support in strict mode."
109
+ }));
110
+ }
111
+ const formula = yield* renderFormula(target, model);
112
+ const publishRisk = target.mutability === "immutable" ? "irreversible" : "externally-visible";
113
+ const publishGate = publishRisk === "irreversible"
114
+ ? irreversibleGate("Pushing a Homebrew tap update is configured as irreversible.")
115
+ : executeGate("Pushing a Homebrew tap update is externally visible.");
116
+ const tapDirectory = target.tapDirectory ?? ".";
117
+ const operations = [
118
+ RenderFileOperation.make({
119
+ id: `${target.id}:homebrew-render-formula`,
120
+ targetId: target.id,
121
+ description: `Render Homebrew formula ${pathBaseName(target.formulaPath)}.`,
122
+ risk: "writes-local",
123
+ gate: executeGate("Rendering a Homebrew formula writes a local generated file."),
124
+ path: target.formulaPath,
125
+ contents: formula
126
+ })
127
+ ];
128
+ if (target.dryRunSupport === "native") {
129
+ operations.push(ValidateCommandOperation.make({
130
+ id: `${target.id}:brew-version`,
131
+ targetId: target.id,
132
+ description: "Check Homebrew CLI availability.",
133
+ risk: "read-only",
134
+ gate: noApprovalGate("CLI availability validation is read-only."),
135
+ command: command(target, "brew", ["--version"], false)
136
+ }));
137
+ }
138
+ operations.push(dryRunOperation(target), PublishCommandOperation.make({
139
+ id: `${target.id}:homebrew-push`,
140
+ targetId: target.id,
141
+ description: `Push Homebrew tap update for ${model.identity.name}@${model.identity.version}.`,
142
+ risk: publishRisk,
143
+ gate: publishGate,
144
+ command: command(target, "git", ["-C", tapDirectory, "push"], true)
145
+ }));
146
+ return operations;
147
+ });
148
+ export const HomebrewAdapter = {
149
+ targetTag: "HomebrewTapTarget",
150
+ capabilities: homebrewTargetCapabilities,
151
+ planOperations: planHomebrewOperations
152
+ };
153
+ //# sourceMappingURL=homebrew.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homebrew.js","sourceRoot":"","sources":["../../src/targets/homebrew.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EACL,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,cAAc,EAEd,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAEL,kBAAkB,EAClB,qBAAqB,EAEtB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAK5D,MAAM,QAAQ,GAAG,CAAC,MAAyB,EAAyB,EAAE,CACpE,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;AAExD,MAAM,OAAO,GAAG,CACd,MAAyB,EACzB,UAAkB,EAClB,IAA2B,EAC3B,WAAoB,EACpB,MAA0B,SAAS,EACtB,EAAE,CACf,WAAW,CAAC,IAAI,CAAC;IACf,UAAU;IACV,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;IACrC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;IAChD,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;CACjD,CAAC,CAAA;AAEJ,MAAM,kBAAkB,GAAG,CAAC,MAAyB,EAA4B,EAAE;IACjF,IAAI,MAAM,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,gBAAgB,CAAA;IACzB,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;QACzC,OAAO,gBAAgB,CAAA;IACzB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,MAAyB,EAAsB,EAAE,CAC1F,kBAAkB,CAAC,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,EAAE;IACnB,SAAS,EAAE,MAAM,CAAC,IAAI;IACtB,eAAe,EAAE,qBAAqB,CAAC,MAAM,CAAC;IAC9C,aAAa,EAAE,MAAM,CAAC,aAAa;IACnC,UAAU,EAAE,MAAM,CAAC,UAAU;IAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;IACzB,kBAAkB,EAAE,kBAAkB,CAAC,MAAM,CAAC;CAC/C,CAAC,CAAA;AAEJ,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACnD,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAA;AACxC,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CAC3C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAEvB,MAAM,gBAAgB,GAAG,CAAC,WAAmB,EAAU,EAAE;IACvD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAClF,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACnG,OAAO,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAA;AAChE,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,MAAyB,EAAE,KAAmB,EAAgD,EAAE,CACrH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,UAAU,CAAC,CAAA;IAC9E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,qBAAqB,CAAC,IAAI,CAAC;YACzB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,MAAM,EAAE,+CAA+C,MAAM,CAAC,UAAU,GAAG;SAC5E,CAAC,CACH,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,qBAAqB,CAAC,IAAI,CAAC;YACzB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,MAAM,EAAE,gEAAgE;SACzE,CAAC,CACH,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChF,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,qBAAqB,CAAC,IAAI,CAAC;YACzB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,MAAM,EAAE,iEAAiE;SAC1E,CAAC,CACH,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,KAAK,SAAS;QACnD,CAAC,CAAC,CAAC,+BAA+B,CAAC;QACnC,CAAC,CAAC,CAAC,mBAAmB,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IAC9F,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,sBAAsB,MAAM,CAAC,UAAU,EAAE,CAAA;IAC7E,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAA;IAEvC,OAAO;QACL,SAAS,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY;QACzD,UAAU,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,mBAAmB,CAAC,EAAE;QAC3F,cAAc,UAAU,CAAC,QAAQ,CAAC,EAAE;QACpC,SAAS,UAAU,CAAC,GAAG,CAAC,EAAE;QAC1B,YAAY,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACjD,aAAa,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjD,EAAE;QACF,eAAe;QACf,GAAG,YAAY;QACf,OAAO;QACP,KAAK;QACL,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC,CAAC,CAAA;AAEJ,MAAM,eAAe,GAAG,CAAC,MAAyB,EAAa,EAAE,CAC/D,MAAM,CAAC,aAAa,KAAK,QAAQ;IAC/B,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC;QAC9B,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,aAAa;QAC7B,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,WAAW,EAAE,sDAAsD;QACnE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,cAAc,CAAC,gEAAgE,CAAC;QACtF,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;KAChG,CAAC;IACF,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC;QAC7B,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,aAAa;QAC7B,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,WAAW,EAAE,MAAM,CAAC,aAAa,KAAK,WAAW;YAC/C,CAAC,CAAC,+CAA+C;YACjD,CAAC,CAAC,6CAA6C;QACjD,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,cAAc,CAAC,uDAAuD,CAAC;QAC7E,OAAO,EAAE,MAAM,CAAC,aAAa,KAAK,WAAW;YAC3C,CAAC,CAAC,6EAA6E;YAC/E,CAAC,CAAC,0FAA0F;QAC9F,OAAO,EAAE,MAAM,CAAC,aAAa,KAAK,MAAM;QACxC,QAAQ,EAAE,MAAM,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;KAC/D,CAAC,CAAA;AAEN,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EACjF,MAAyB,EACzB,KAAmB;IAEnB,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,qBAAqB,CAAC,IAAI,CAAC;YACzB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,MAAM,EAAE,iEAAiE;SAC1E,CAAC,CACH,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACnD,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,oBAAoB,CAAA;IAC7F,MAAM,WAAW,GAAG,WAAW,KAAK,cAAc;QAChD,CAAC,CAAC,gBAAgB,CAAC,8DAA8D,CAAC;QAClF,CAAC,CAAC,WAAW,CAAC,sDAAsD,CAAC,CAAA;IACvE,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,GAAG,CAAA;IAC/C,MAAM,UAAU,GAAqB;QACnC,mBAAmB,CAAC,IAAI,CAAC;YACvB,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,0BAA0B;YAC1C,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,2BAA2B,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG;YAC3E,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,WAAW,CAAC,6DAA6D,CAAC;YAChF,IAAI,EAAE,MAAM,CAAC,WAAW;YACxB,QAAQ,EAAE,OAAO;SAClB,CAAC;KACH,CAAA;IAED,IAAI,MAAM,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtC,UAAU,CAAC,IAAI,CACb,wBAAwB,CAAC,IAAI,CAAC;YAC5B,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,eAAe;YAC/B,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,kCAAkC;YAC/C,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,cAAc,CAAC,2CAA2C,CAAC;YACjE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;SACvD,CAAC,CACH,CAAA;IACH,CAAC;IAED,UAAU,CAAC,IAAI,CACb,eAAe,CAAC,MAAM,CAAC,EACvB,uBAAuB,CAAC,IAAI,CAAC;QAC3B,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,gBAAgB;QAChC,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,WAAW,EAAE,gCAAgC,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,GAAG;QAC7F,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC;KACpE,CAAC,CACH,CAAA;IAED,OAAO,UAAU,CAAA;AACnB,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAA0B;IACpD,SAAS,EAAE,mBAAmB;IAC9B,YAAY,EAAE,0BAA0B;IACxC,cAAc,EAAE,sBAAsB;CACvC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import * as Layer from "effect/Layer";
2
+ import { TargetRegistry } from "./registry.js";
3
+ export type * from "../types/effect-internal.js";
4
+ export declare const LiveTargetRegistryLayer: Layer.Layer<TargetRegistry>;
5
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/targets/live.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAMrC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,mBAAmB,6BAA6B,CAAA;AA2BhD,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,CAG9D,CAAA"}
@@ -0,0 +1,31 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Layer from "effect/Layer";
3
+ import { GitHubAdapter } from "./github.js";
4
+ import { HomebrewAdapter } from "./homebrew.js";
5
+ import { NpmAdapter } from "./npm.js";
6
+ import { TargetRegistry } from "./registry.js";
7
+ const planLiveTargetOperations = Effect.fn("planLiveTargetOperations")(function* (target, model) {
8
+ switch (target._tag) {
9
+ case "NpmRegistryTarget":
10
+ return yield* NpmAdapter.planOperations(target, model);
11
+ case "GitHubReleaseTarget":
12
+ return yield* GitHubAdapter.planOperations(target, model);
13
+ case "HomebrewTapTarget":
14
+ return yield* HomebrewAdapter.planOperations(target, model);
15
+ }
16
+ });
17
+ const liveTargetCapabilities = (target) => {
18
+ switch (target._tag) {
19
+ case "NpmRegistryTarget":
20
+ return NpmAdapter.capabilities(target);
21
+ case "GitHubReleaseTarget":
22
+ return GitHubAdapter.capabilities(target);
23
+ case "HomebrewTapTarget":
24
+ return HomebrewAdapter.capabilities(target);
25
+ }
26
+ };
27
+ export const LiveTargetRegistryLayer = Layer.succeed(TargetRegistry)({
28
+ targetCapabilities: liveTargetCapabilities,
29
+ planTargetOperations: planLiveTargetOperations
30
+ });
31
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../../src/targets/live.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAI9C,MAAM,wBAAwB,GAAG,MAAM,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC,QAAQ,CAAC,EAC9E,MAAoB,EACpB,KAAmB;IAEnB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,mBAAmB;YACtB,OAAO,KAAK,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACxD,KAAK,qBAAqB;YACxB,OAAO,KAAK,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC3D,KAAK,mBAAmB;YACtB,OAAO,KAAK,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,sBAAsB,GAAG,CAAC,MAAoB,EAAE,EAAE;IACtD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,mBAAmB;YACtB,OAAO,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QACxC,KAAK,qBAAqB;YACxB,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAC3C,KAAK,mBAAmB;YACtB,OAAO,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAgC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAChG,kBAAkB,EAAE,sBAAsB;IAC1C,oBAAoB,EAAE,wBAAwB;CAC/C,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { PublishCommandOperation, ValidateCommandOperation, ValidationNoteOperation } from "../domain/operation.js";
3
+ import { ReleaseModel } from "../domain/release.js";
4
+ import { NpmRegistryTarget, TargetCapabilities } from "../domain/target.js";
5
+ import { PlanConstructionError } from "../planner/errors.js";
6
+ import { NpmTargetAdapter } from "./adapter.js";
7
+ export type * from "../types/effect-internal.js";
8
+ export declare const npmTargetCapabilities: (target: NpmRegistryTarget) => TargetCapabilities;
9
+ export declare const planNpmOperations: (target: NpmRegistryTarget, model: ReleaseModel) => Effect.Effect<(import("../domain/operation.js").RenderFileOperation | ValidateCommandOperation | ValidationNoteOperation | PublishCommandOperation | import("../domain/operation.js").VerifyRemoteOperation)[], PlanConstructionError, never>;
10
+ export declare const NpmAdapter: NpmTargetAdapter;
11
+ //# sourceMappingURL=npm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../../src/targets/npm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAKL,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAmD,MAAM,qBAAqB,CAAA;AAC5H,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C,mBAAmB,6BAA6B,CAAA;AA6BhD,eAAO,MAAM,qBAAqB,GAAI,QAAQ,iBAAiB,KAAG,kBAS9D,CAAA;AAsCJ,eAAO,MAAM,iBAAiB,mSAyC5B,CAAA;AAEF,eAAO,MAAM,UAAU,EAAE,gBAIxB,CAAA"}