runtime-resolver 0.3.12 → 0.3.13

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 (128) hide show
  1. package/bin/runtime-resolver.d.ts +1 -0
  2. package/bin/runtime-resolver.js +30 -261
  3. package/bin/runtime-resolver.js.map +1 -0
  4. package/cli/commands/resolve.js +240 -0
  5. package/cli/commands/resolve.js.map +1 -0
  6. package/cli/schemas/json-schema.js +13 -0
  7. package/cli/schemas/json-schema.js.map +1 -0
  8. package/cli/schemas/response.js +87 -0
  9. package/cli/schemas/response.js.map +1 -0
  10. package/data/bun-defaults.js +851 -0
  11. package/data/bun-defaults.js.map +1 -0
  12. package/data/deno-defaults.js +1523 -0
  13. package/data/deno-defaults.js.map +1 -0
  14. package/data/node-defaults.js +4401 -0
  15. package/data/node-defaults.js.map +1 -0
  16. package/errors/AuthenticationError.js +36 -0
  17. package/errors/AuthenticationError.js.map +1 -0
  18. package/errors/CacheError.js +33 -0
  19. package/errors/CacheError.js.map +1 -0
  20. package/errors/FreshnessError.js +39 -0
  21. package/errors/FreshnessError.js.map +1 -0
  22. package/errors/InvalidInputError.js +34 -0
  23. package/errors/InvalidInputError.js.map +1 -0
  24. package/errors/NetworkError.js +35 -0
  25. package/errors/NetworkError.js.map +1 -0
  26. package/errors/ParseError.js +34 -0
  27. package/errors/ParseError.js.map +1 -0
  28. package/errors/RateLimitError.js +40 -0
  29. package/errors/RateLimitError.js.map +1 -0
  30. package/errors/VersionNotFoundError.js +38 -0
  31. package/errors/VersionNotFoundError.js.map +1 -0
  32. package/index.d.ts +2577 -2608
  33. package/index.d.ts.map +1 -0
  34. package/index.js +159 -132
  35. package/index.js.map +1 -0
  36. package/layers/AutoBunCacheLive.js +48 -0
  37. package/layers/AutoBunCacheLive.js.map +1 -0
  38. package/layers/AutoDenoCacheLive.js +48 -0
  39. package/layers/AutoDenoCacheLive.js.map +1 -0
  40. package/layers/AutoNodeCacheLive.js +59 -0
  41. package/layers/AutoNodeCacheLive.js.map +1 -0
  42. package/layers/BunReleaseCacheLive.js +26 -0
  43. package/layers/BunReleaseCacheLive.js.map +1 -0
  44. package/layers/BunResolverLive.js +86 -0
  45. package/layers/BunResolverLive.js.map +1 -0
  46. package/layers/BunVersionFetcherLive.js +56 -0
  47. package/layers/BunVersionFetcherLive.js.map +1 -0
  48. package/layers/DenoReleaseCacheLive.js +26 -0
  49. package/layers/DenoReleaseCacheLive.js.map +1 -0
  50. package/layers/DenoResolverLive.js +85 -0
  51. package/layers/DenoResolverLive.js.map +1 -0
  52. package/layers/DenoVersionFetcherLive.js +52 -0
  53. package/layers/DenoVersionFetcherLive.js.map +1 -0
  54. package/layers/FreshBunCacheLive.js +61 -0
  55. package/layers/FreshBunCacheLive.js.map +1 -0
  56. package/layers/FreshDenoCacheLive.js +61 -0
  57. package/layers/FreshDenoCacheLive.js.map +1 -0
  58. package/layers/FreshNodeCacheLive.js +56 -0
  59. package/layers/FreshNodeCacheLive.js.map +1 -0
  60. package/layers/GitHubAppAuth.js +59 -0
  61. package/layers/GitHubAppAuth.js.map +1 -0
  62. package/layers/GitHubAutoAuth.js +71 -0
  63. package/layers/GitHubAutoAuth.js.map +1 -0
  64. package/layers/GitHubClientLive.js +131 -0
  65. package/layers/GitHubClientLive.js.map +1 -0
  66. package/layers/GitHubTokenAuth.js +51 -0
  67. package/layers/GitHubTokenAuth.js.map +1 -0
  68. package/layers/NodeReleaseCacheLive.js +78 -0
  69. package/layers/NodeReleaseCacheLive.js.map +1 -0
  70. package/layers/NodeResolverLive.js +108 -0
  71. package/layers/NodeResolverLive.js.map +1 -0
  72. package/layers/NodeScheduleFetcherLive.js +38 -0
  73. package/layers/NodeScheduleFetcherLive.js.map +1 -0
  74. package/layers/NodeVersionFetcherLive.js +56 -0
  75. package/layers/NodeVersionFetcherLive.js.map +1 -0
  76. package/layers/OfflineBunCacheLive.js +41 -0
  77. package/layers/OfflineBunCacheLive.js.map +1 -0
  78. package/layers/OfflineDenoCacheLive.js +41 -0
  79. package/layers/OfflineDenoCacheLive.js.map +1 -0
  80. package/layers/OfflineNodeCacheLive.js +40 -0
  81. package/layers/OfflineNodeCacheLive.js.map +1 -0
  82. package/layers/RuntimeCacheLive.js +79 -0
  83. package/layers/RuntimeCacheLive.js.map +1 -0
  84. package/lib/retry.js +28 -0
  85. package/lib/retry.js.map +1 -0
  86. package/lib/semver.js +22 -0
  87. package/lib/semver.js.map +1 -0
  88. package/package.json +57 -68
  89. package/schemas/bun-release.js +62 -0
  90. package/schemas/bun-release.js.map +1 -0
  91. package/schemas/deno-release.js +62 -0
  92. package/schemas/deno-release.js.map +1 -0
  93. package/schemas/github.js +75 -0
  94. package/schemas/github.js.map +1 -0
  95. package/schemas/node-release.js +131 -0
  96. package/schemas/node-release.js.map +1 -0
  97. package/schemas/node-schedule.js +111 -0
  98. package/schemas/node-schedule.js.map +1 -0
  99. package/schemas/node.js +69 -0
  100. package/schemas/node.js.map +1 -0
  101. package/services/BunReleaseCache.js +34 -0
  102. package/services/BunReleaseCache.js.map +1 -0
  103. package/services/BunResolver.js +37 -0
  104. package/services/BunResolver.js.map +1 -0
  105. package/services/BunVersionFetcher.js +42 -0
  106. package/services/BunVersionFetcher.js.map +1 -0
  107. package/services/DenoReleaseCache.js +34 -0
  108. package/services/DenoReleaseCache.js.map +1 -0
  109. package/services/DenoResolver.js +37 -0
  110. package/services/DenoResolver.js.map +1 -0
  111. package/services/DenoVersionFetcher.js +42 -0
  112. package/services/DenoVersionFetcher.js.map +1 -0
  113. package/services/GitHubClient.js +41 -0
  114. package/services/GitHubClient.js.map +1 -0
  115. package/services/NodeReleaseCache.js +42 -0
  116. package/services/NodeReleaseCache.js.map +1 -0
  117. package/services/NodeResolver.js +45 -0
  118. package/services/NodeResolver.js.map +1 -0
  119. package/services/NodeScheduleFetcher.js +39 -0
  120. package/services/NodeScheduleFetcher.js.map +1 -0
  121. package/services/NodeVersionFetcher.js +40 -0
  122. package/services/NodeVersionFetcher.js.map +1 -0
  123. package/services/OctokitInstance.js +45 -0
  124. package/services/OctokitInstance.js.map +1 -0
  125. package/tsdoc-metadata.json +11 -11
  126. package/612.js +0 -23
  127. package/711.js +0 -7554
  128. package/json-schema.js +0 -95
@@ -0,0 +1 @@
1
+ export { };
@@ -1,269 +1,38 @@
1
1
  #!/usr/bin/env node
2
- import { Command, Options } from "@effect/cli";
2
+ import { appIdOption, appInstallationIdOption, appPrivateKeyOption, bunDefaultOption, bunOption, denoDefaultOption, denoOption, incrementsOption, nodeDateOption, nodeDefaultOption, nodeOption, nodePhasesOption, prettyOption, resolveHandler, schemaOption, tokenOption } from "../cli/commands/resolve.js";
3
+ import { Cause, Console, Effect } from "effect";
4
+ import { Command } from "@effect/cli";
3
5
  import { NodeContext, NodeRuntime } from "@effect/platform-node";
4
- import { Cause, Console, Effect, Layer, Option } from "effect";
5
- import { readFileSync } from "node:fs";
6
- import { NodeScheduleFetcherLive, AutoDenoCacheLive, DenoVersionFetcherLive, AutoNodeCacheLive, BunResolver, NodeResolver, NodeVersionFetcherLive, NodeResolverLive, GitHubAutoAuth, BunResolverLive, BunVersionFetcherLive, GitHubClientLive, DenoResolverLive, GitHubTokenAuthFromToken, GitHubAppAuth, AutoBunCacheLive, DenoResolver } from "../711.js";
7
- const GitHubLayer = GitHubClientLive.pipe(Layer.provide(GitHubAutoAuth));
8
- const makeNodeLayer = (authOverride)=>{
9
- const ghLayer = authOverride ? GitHubClientLive.pipe(Layer.provide(authOverride)) : GitHubLayer;
10
- const fetchersLayer = Layer.merge(NodeVersionFetcherLive.pipe(Layer.provide(ghLayer)), NodeScheduleFetcherLive.pipe(Layer.provide(ghLayer)));
11
- return NodeResolverLive.pipe(Layer.provide(AutoNodeCacheLive.pipe(Layer.provide(fetchersLayer))));
12
- };
13
- const makeBunLayer = (authOverride)=>{
14
- const ghLayer = authOverride ? GitHubClientLive.pipe(Layer.provide(authOverride)) : GitHubLayer;
15
- return BunResolverLive.pipe(Layer.provide(AutoBunCacheLive.pipe(Layer.provide(BunVersionFetcherLive.pipe(Layer.provide(ghLayer))))));
16
- };
17
- const makeDenoLayer = (authOverride)=>{
18
- const ghLayer = authOverride ? GitHubClientLive.pipe(Layer.provide(authOverride)) : GitHubLayer;
19
- return DenoResolverLive.pipe(Layer.provide(AutoDenoCacheLive.pipe(Layer.provide(DenoVersionFetcherLive.pipe(Layer.provide(ghLayer))))));
20
- };
21
- const SCHEMA_URL = "https://raw.githubusercontent.com/spencerbeggs/runtime-resolver/main/runtime-resolver.schema.json";
22
- const nodeOption = Options.text("node").pipe(Options.optional);
23
- const bunOption = Options.text("bun").pipe(Options.optional);
24
- const denoOption = Options.text("deno").pipe(Options.optional);
25
- const nodePhasesOption = Options.text("node-phases").pipe(Options.optional);
26
- const incrementsOption = Options.text("increments").pipe(Options.optional);
27
- const nodeDefaultOption = Options.text("node-default").pipe(Options.optional);
28
- const bunDefaultOption = Options.text("bun-default").pipe(Options.optional);
29
- const denoDefaultOption = Options.text("deno-default").pipe(Options.optional);
30
- const nodeDateOption = Options.text("node-date").pipe(Options.optional);
31
- const prettyOption = Options.boolean("pretty").pipe(Options.withDefault(false));
32
- const schemaOption = Options.boolean("schema").pipe(Options.withDefault(false));
33
- const tokenOption = Options.text("token").pipe(Options.optional);
34
- const appIdOption = Options.text("app-id").pipe(Options.optional);
35
- const appPrivateKeyOption = Options.text("app-private-key").pipe(Options.optional);
36
- const appInstallationIdOption = Options.text("app-installation-id").pipe(Options.optional);
37
- const VALID_PHASES = [
38
- "current",
39
- "active-lts",
40
- "maintenance-lts",
41
- "end-of-life"
42
- ];
43
- const VALID_INCREMENTS = [
44
- "latest",
45
- "minor",
46
- "patch"
47
- ];
48
- const validatePhases = (raw)=>{
49
- const phases = raw.split(",").map((s)=>s.trim());
50
- for (const p of phases)if (!VALID_PHASES.includes(p)) throw new Error(`Invalid phase: "${p}". Valid values: ${VALID_PHASES.join(", ")}`);
51
- return phases;
52
- };
53
- const validateIncrements = (raw)=>{
54
- if (!VALID_INCREMENTS.includes(raw)) throw new Error(`Invalid increments value: "${raw}". Valid values: ${VALID_INCREMENTS.join(", ")}`);
55
- return raw;
56
- };
57
- const serializeError = (error)=>{
58
- if (error && "object" == typeof error && "_tag" in error && "message" in error) {
59
- const { _tag, message, ...rest } = error;
60
- return {
61
- _tag,
62
- message,
63
- ...rest
64
- };
65
- }
66
- return {
67
- _tag: "UnknownError",
68
- message: error instanceof Error ? error.message : String(error)
69
- };
70
- };
71
- const toSuccess = (name, result)=>[
72
- name,
73
- {
74
- ok: true,
75
- source: result.source,
76
- versions: [
77
- ...result.versions
78
- ],
79
- latest: result.latest,
80
- ...void 0 !== result.lts ? {
81
- lts: result.lts
82
- } : {},
83
- ...void 0 !== result.default ? {
84
- default: result.default
85
- } : {}
86
- }
87
- ];
88
- const toError = (name, error)=>[
89
- name,
90
- {
91
- ok: false,
92
- error: serializeError(error)
93
- }
94
- ];
95
- const resolveNode = (semverRange, phases, increments, defaultVersion, date, authOverride)=>Effect.gen(function*() {
96
- const resolver = yield* NodeResolver;
97
- const result = yield* resolver.resolve({
98
- semverRange,
99
- ...phases ? {
100
- phases
101
- } : {},
102
- ...increments ? {
103
- increments
104
- } : {},
105
- ...defaultVersion ? {
106
- defaultVersion
107
- } : {},
108
- ...date ? {
109
- date
110
- } : {}
111
- });
112
- return toSuccess("node", result);
113
- }).pipe(Effect.provide(makeNodeLayer(authOverride)), Effect.catchAll((error)=>Effect.succeed(toError("node", error))));
114
- const resolveBun = (semverRange, increments, defaultVersion, authOverride)=>Effect.gen(function*() {
115
- const resolver = yield* BunResolver;
116
- const result = yield* resolver.resolve({
117
- semverRange,
118
- ...increments ? {
119
- increments
120
- } : {},
121
- ...defaultVersion ? {
122
- defaultVersion
123
- } : {}
124
- });
125
- return toSuccess("bun", result);
126
- }).pipe(Effect.provide(makeBunLayer(authOverride)), Effect.catchAll((error)=>Effect.succeed(toError("bun", error))));
127
- const resolveDeno = (semverRange, increments, defaultVersion, authOverride)=>Effect.gen(function*() {
128
- const resolver = yield* DenoResolver;
129
- const result = yield* resolver.resolve({
130
- semverRange,
131
- ...increments ? {
132
- increments
133
- } : {},
134
- ...defaultVersion ? {
135
- defaultVersion
136
- } : {}
137
- });
138
- return toSuccess("deno", result);
139
- }).pipe(Effect.provide(makeDenoLayer(authOverride)), Effect.catchAll((error)=>Effect.succeed(toError("deno", error))));
140
- const formatResponse = (ok, results, pretty)=>{
141
- const response = {
142
- $schema: SCHEMA_URL,
143
- ok,
144
- results
145
- };
146
- return JSON.stringify(response, null, pretty ? 2 : void 0);
147
- };
148
- const resolveHandler = (args)=>Effect.gen(function*() {
149
- if (args.schema) {
150
- const resolveFlags = [
151
- args.node,
152
- args.bun,
153
- args.deno,
154
- args.nodePhases,
155
- args.increments,
156
- args.nodeDefault,
157
- args.bunDefault,
158
- args.denoDefault,
159
- args.nodeDate,
160
- args.token,
161
- args.appId,
162
- args.appPrivateKey,
163
- args.appInstallationId
164
- ];
165
- const hasResolveFlags = resolveFlags.some((f)=>Option.isSome(f));
166
- if (hasResolveFlags) return void (yield* Console.error("Error: --schema cannot be combined with resolve flags (--node, --bun, --deno, etc.)"));
167
- const { cliJsonSchema } = yield* Effect.promise(()=>import("../json-schema.js").then((m)=>m.json_schema_namespaceObject));
168
- yield* Console.log(JSON.stringify(cliJsonSchema, null, 2));
169
- return;
170
- }
171
- const hasToken = Option.isSome(args.token);
172
- const hasAppId = Option.isSome(args.appId);
173
- const hasAppPrivateKey = Option.isSome(args.appPrivateKey);
174
- const hasAppInstallationId = Option.isSome(args.appInstallationId);
175
- if (hasToken && (hasAppId || hasAppPrivateKey)) return void (yield* Console.error("Error: --token and --app-id/--app-private-key are mutually exclusive"));
176
- if (hasAppId !== hasAppPrivateKey) return void (yield* Console.error("Error: --app-id and --app-private-key must both be provided"));
177
- if (hasAppInstallationId && !hasAppId) return void (yield* Console.error("Error: --app-installation-id requires --app-id and --app-private-key"));
178
- let resolvedPrivateKey;
179
- if (hasAppPrivateKey) {
180
- const keyValue = args.appPrivateKey.value;
181
- if (keyValue.startsWith("@")) {
182
- const filePath = keyValue.slice(1);
183
- try {
184
- resolvedPrivateKey = readFileSync(filePath, "utf-8");
185
- } catch {
186
- yield* Console.error(`Error: Cannot read private key file: ${filePath}`);
187
- return;
188
- }
189
- } else resolvedPrivateKey = keyValue;
190
- }
191
- let authLayerOverride;
192
- if (hasToken) authLayerOverride = GitHubTokenAuthFromToken(args.token.value);
193
- else if (hasAppId && resolvedPrivateKey) authLayerOverride = GitHubAppAuth({
194
- appId: args.appId.value,
195
- privateKey: resolvedPrivateKey,
196
- ...hasAppInstallationId ? {
197
- installationId: Number(args.appInstallationId.value)
198
- } : {}
199
- });
200
- const hasNode = Option.isSome(args.node);
201
- const hasBun = Option.isSome(args.bun);
202
- const hasDeno = Option.isSome(args.deno);
203
- if (!hasNode && !hasBun && !hasDeno) return void (yield* Console.error("No runtime specified. Use --node, --bun, or --deno to resolve versions.\nRun with --help for usage information."));
204
- let validatedPhases;
205
- if (Option.isSome(args.nodePhases)) try {
206
- validatedPhases = validatePhases(args.nodePhases.value);
207
- } catch (e) {
208
- yield* Console.error(e.message);
209
- return;
210
- }
211
- let validatedIncrements;
212
- if (Option.isSome(args.increments)) try {
213
- validatedIncrements = validateIncrements(args.increments.value);
214
- } catch (e) {
215
- yield* Console.error(e.message);
216
- return;
217
- }
218
- let nodeDate;
219
- if (Option.isSome(args.nodeDate)) {
220
- nodeDate = new Date(args.nodeDate.value);
221
- if (Number.isNaN(nodeDate.getTime())) return void (yield* Console.error(`Invalid date: "${args.nodeDate.value}". Use ISO 8601 format (e.g. 2024-01-15).`));
222
- }
223
- const tasks = [];
224
- if (hasNode) {
225
- const nodeDefaultVersion = Option.isSome(args.nodeDefault) ? args.nodeDefault.value : void 0;
226
- tasks.push(resolveNode(args.node.value, validatedPhases, validatedIncrements, nodeDefaultVersion, nodeDate, authLayerOverride));
227
- }
228
- if (hasBun) {
229
- const bunDefaultVersion = Option.isSome(args.bunDefault) ? args.bunDefault.value : void 0;
230
- tasks.push(resolveBun(args.bun.value, validatedIncrements, bunDefaultVersion, authLayerOverride));
231
- }
232
- if (hasDeno) {
233
- const denoDefaultVersion = Option.isSome(args.denoDefault) ? args.denoDefault.value : void 0;
234
- tasks.push(resolveDeno(args.deno.value, validatedIncrements, denoDefaultVersion, authLayerOverride));
235
- }
236
- const entries = yield* Effect.all(tasks, {
237
- concurrency: "unbounded"
238
- });
239
- const results = Object.fromEntries(entries);
240
- const hasError = Object.values(results).some((r)=>!r.ok);
241
- yield* Console.log(formatResponse(!hasError, results, args.pretty));
242
- });
6
+
7
+ //#region src/cli/index.ts
8
+ /* v8 ignore start - CLI entry point requires integration testing */
243
9
  const rootCommand = Command.make("runtime-resolver", {
244
- node: nodeOption,
245
- bun: bunOption,
246
- deno: denoOption,
247
- nodePhases: nodePhasesOption,
248
- increments: incrementsOption,
249
- nodeDefault: nodeDefaultOption,
250
- bunDefault: bunDefaultOption,
251
- denoDefault: denoDefaultOption,
252
- nodeDate: nodeDateOption,
253
- pretty: prettyOption,
254
- schema: schemaOption,
255
- token: tokenOption,
256
- appId: appIdOption,
257
- appPrivateKey: appPrivateKeyOption,
258
- appInstallationId: appInstallationIdOption
10
+ node: nodeOption,
11
+ bun: bunOption,
12
+ deno: denoOption,
13
+ nodePhases: nodePhasesOption,
14
+ increments: incrementsOption,
15
+ nodeDefault: nodeDefaultOption,
16
+ bunDefault: bunDefaultOption,
17
+ denoDefault: denoDefaultOption,
18
+ nodeDate: nodeDateOption,
19
+ pretty: prettyOption,
20
+ schema: schemaOption,
21
+ token: tokenOption,
22
+ appId: appIdOption,
23
+ appPrivateKey: appPrivateKeyOption,
24
+ appInstallationId: appInstallationIdOption
259
25
  }, resolveHandler);
260
26
  const cli = Command.run(rootCommand, {
261
- name: "runtime-resolver",
262
- version: "0.3.12"
27
+ name: "runtime-resolver",
28
+ version: "0.3.13"
263
29
  });
264
- const main = Effect.suspend(()=>cli(process.argv)).pipe(Effect.provide(NodeContext.layer), Effect.catchAllCause((cause)=>{
265
- const defects = Cause.defects(cause);
266
- if (defects.length > 0) return Console.error(Cause.pretty(cause)).pipe(Effect.andThen(Effect.failCause(cause)));
267
- return Effect.failCause(cause);
30
+ const main = Effect.suspend(() => cli(process.argv)).pipe(Effect.provide(NodeContext.layer), Effect.catchAllCause((cause) => {
31
+ if (Cause.defects(cause).length > 0) return Console.error(Cause.pretty(cause)).pipe(Effect.andThen(Effect.failCause(cause)));
32
+ return Effect.failCause(cause);
268
33
  }));
269
34
  NodeRuntime.runMain(main);
35
+
36
+ //#endregion
37
+ export { };
38
+ //# sourceMappingURL=runtime-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-resolver.js","names":[],"sources":["../../../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n/* v8 ignore start - CLI entry point requires integration testing */\nimport { Command } from \"@effect/cli\";\nimport { NodeContext, NodeRuntime } from \"@effect/platform-node\";\nimport { Cause, Console, Effect } from \"effect\";\n\nimport {\n\tappIdOption,\n\tappInstallationIdOption,\n\tappPrivateKeyOption,\n\tbunDefaultOption,\n\tbunOption,\n\tdenoDefaultOption,\n\tdenoOption,\n\tincrementsOption,\n\tnodeDateOption,\n\tnodeDefaultOption,\n\tnodeOption,\n\tnodePhasesOption,\n\tprettyOption,\n\tresolveHandler,\n\tschemaOption,\n\ttokenOption,\n} from \"./commands/resolve.js\";\n\nconst rootCommand = Command.make(\n\t\"runtime-resolver\",\n\t{\n\t\tnode: nodeOption,\n\t\tbun: bunOption,\n\t\tdeno: denoOption,\n\t\tnodePhases: nodePhasesOption,\n\t\tincrements: incrementsOption,\n\t\tnodeDefault: nodeDefaultOption,\n\t\tbunDefault: bunDefaultOption,\n\t\tdenoDefault: denoDefaultOption,\n\t\tnodeDate: nodeDateOption,\n\t\tpretty: prettyOption,\n\t\tschema: schemaOption,\n\t\ttoken: tokenOption,\n\t\tappId: appIdOption,\n\t\tappPrivateKey: appPrivateKeyOption,\n\t\tappInstallationId: appInstallationIdOption,\n\t},\n\tresolveHandler,\n);\n\nconst cli = Command.run(rootCommand, {\n\tname: \"runtime-resolver\",\n\tversion: process.env.__PACKAGE_VERSION__ ?? \"0.0.0\",\n});\n\nconst main = Effect.suspend(() => cli(process.argv)).pipe(\n\tEffect.provide(NodeContext.layer),\n\tEffect.catchAllCause((cause) => {\n\t\tconst defects = Cause.defects(cause);\n\t\tif (defects.length > 0) {\n\t\t\treturn Console.error(Cause.pretty(cause)).pipe(Effect.andThen(Effect.failCause(cause)));\n\t\t}\n\t\treturn Effect.failCause(cause);\n\t}),\n);\n\nNodeRuntime.runMain(main);\n"],"mappings":";;;;;;;;AAyBA,MAAM,cAAc,QAAQ,KAC3B,oBACA;CACC,MAAM;CACN,KAAK;CACL,MAAM;CACN,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,aAAa;CACb,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,OAAO;CACP,eAAe;CACf,mBAAmB;AACpB,GACA,cACD;AAEA,MAAM,MAAM,QAAQ,IAAI,aAAa;CACpC,MAAM;CACN;AACD,CAAC;AAED,MAAM,OAAO,OAAO,cAAc,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,KACpD,OAAO,QAAQ,YAAY,KAAK,GAChC,OAAO,eAAe,UAAU;CAE/B,IADgB,MAAM,QAAQ,KACpB,CAAC,CAAC,SAAS,GACpB,OAAO,QAAQ,MAAM,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,UAAU,KAAK,CAAC,CAAC;CAEvF,OAAO,OAAO,UAAU,KAAK;AAC9B,CAAC,CACF;AAEA,YAAY,QAAQ,IAAI"}
@@ -0,0 +1,240 @@
1
+ import { AutoBunCacheLive } from "../../layers/AutoBunCacheLive.js";
2
+ import { AutoDenoCacheLive } from "../../layers/AutoDenoCacheLive.js";
3
+ import { AutoNodeCacheLive } from "../../layers/AutoNodeCacheLive.js";
4
+ import { BunResolver } from "../../services/BunResolver.js";
5
+ import { BunResolverLive } from "../../layers/BunResolverLive.js";
6
+ import { BunVersionFetcherLive } from "../../layers/BunVersionFetcherLive.js";
7
+ import { DenoResolver } from "../../services/DenoResolver.js";
8
+ import { DenoResolverLive } from "../../layers/DenoResolverLive.js";
9
+ import { DenoVersionFetcherLive } from "../../layers/DenoVersionFetcherLive.js";
10
+ import { GitHubAppAuth } from "../../layers/GitHubAppAuth.js";
11
+ import { GitHubAutoAuth } from "../../layers/GitHubAutoAuth.js";
12
+ import { GitHubClientLive } from "../../layers/GitHubClientLive.js";
13
+ import { NodeResolver } from "../../services/NodeResolver.js";
14
+ import { NodeResolverLive } from "../../layers/NodeResolverLive.js";
15
+ import { NodeScheduleFetcherLive } from "../../layers/NodeScheduleFetcherLive.js";
16
+ import { NodeVersionFetcherLive } from "../../layers/NodeVersionFetcherLive.js";
17
+ import { GitHubTokenAuthFromToken } from "../../layers/GitHubTokenAuth.js";
18
+ import { Console, Effect, Layer, Option } from "effect";
19
+ import { Options } from "@effect/cli";
20
+ import { readFileSync } from "node:fs";
21
+
22
+ //#region src/cli/commands/resolve.ts
23
+ /* v8 ignore start */
24
+ const GitHubLayer = GitHubClientLive.pipe(Layer.provide(GitHubAutoAuth));
25
+ const makeNodeLayer = (authOverride) => {
26
+ const ghLayer = authOverride ? GitHubClientLive.pipe(Layer.provide(authOverride)) : GitHubLayer;
27
+ const fetchersLayer = Layer.merge(NodeVersionFetcherLive.pipe(Layer.provide(ghLayer)), NodeScheduleFetcherLive.pipe(Layer.provide(ghLayer)));
28
+ return NodeResolverLive.pipe(Layer.provide(AutoNodeCacheLive.pipe(Layer.provide(fetchersLayer))));
29
+ };
30
+ const makeBunLayer = (authOverride) => {
31
+ const ghLayer = authOverride ? GitHubClientLive.pipe(Layer.provide(authOverride)) : GitHubLayer;
32
+ return BunResolverLive.pipe(Layer.provide(AutoBunCacheLive.pipe(Layer.provide(BunVersionFetcherLive.pipe(Layer.provide(ghLayer))))));
33
+ };
34
+ const makeDenoLayer = (authOverride) => {
35
+ const ghLayer = authOverride ? GitHubClientLive.pipe(Layer.provide(authOverride)) : GitHubLayer;
36
+ return DenoResolverLive.pipe(Layer.provide(AutoDenoCacheLive.pipe(Layer.provide(DenoVersionFetcherLive.pipe(Layer.provide(ghLayer))))));
37
+ };
38
+ const SCHEMA_URL = "https://raw.githubusercontent.com/spencerbeggs/runtime-resolver/main/runtime-resolver.schema.json";
39
+ const nodeOption = Options.text("node").pipe(Options.optional);
40
+ const bunOption = Options.text("bun").pipe(Options.optional);
41
+ const denoOption = Options.text("deno").pipe(Options.optional);
42
+ const nodePhasesOption = Options.text("node-phases").pipe(Options.optional);
43
+ const incrementsOption = Options.text("increments").pipe(Options.optional);
44
+ const nodeDefaultOption = Options.text("node-default").pipe(Options.optional);
45
+ const bunDefaultOption = Options.text("bun-default").pipe(Options.optional);
46
+ const denoDefaultOption = Options.text("deno-default").pipe(Options.optional);
47
+ const nodeDateOption = Options.text("node-date").pipe(Options.optional);
48
+ const prettyOption = Options.boolean("pretty").pipe(Options.withDefault(false));
49
+ const schemaOption = Options.boolean("schema").pipe(Options.withDefault(false));
50
+ const tokenOption = Options.text("token").pipe(Options.optional);
51
+ const appIdOption = Options.text("app-id").pipe(Options.optional);
52
+ const appPrivateKeyOption = Options.text("app-private-key").pipe(Options.optional);
53
+ const appInstallationIdOption = Options.text("app-installation-id").pipe(Options.optional);
54
+ const VALID_PHASES = [
55
+ "current",
56
+ "active-lts",
57
+ "maintenance-lts",
58
+ "end-of-life"
59
+ ];
60
+ const VALID_INCREMENTS = [
61
+ "latest",
62
+ "minor",
63
+ "patch"
64
+ ];
65
+ const validatePhases = (raw) => {
66
+ const phases = raw.split(",").map((s) => s.trim());
67
+ for (const p of phases) if (!VALID_PHASES.includes(p)) throw new Error(`Invalid phase: "${p}". Valid values: ${VALID_PHASES.join(", ")}`);
68
+ return phases;
69
+ };
70
+ const validateIncrements = (raw) => {
71
+ if (!VALID_INCREMENTS.includes(raw)) throw new Error(`Invalid increments value: "${raw}". Valid values: ${VALID_INCREMENTS.join(", ")}`);
72
+ return raw;
73
+ };
74
+ const serializeError = (error) => {
75
+ if (error && typeof error === "object" && "_tag" in error && "message" in error) {
76
+ const { _tag, message, ...rest } = error;
77
+ return {
78
+ _tag,
79
+ message,
80
+ ...rest
81
+ };
82
+ }
83
+ return {
84
+ _tag: "UnknownError",
85
+ message: error instanceof Error ? error.message : String(error)
86
+ };
87
+ };
88
+ const toSuccess = (name, result) => [name, {
89
+ ok: true,
90
+ source: result.source,
91
+ versions: [...result.versions],
92
+ latest: result.latest,
93
+ ...result.lts !== void 0 ? { lts: result.lts } : {},
94
+ ...result.default !== void 0 ? { default: result.default } : {}
95
+ }];
96
+ const toError = (name, error) => [name, {
97
+ ok: false,
98
+ error: serializeError(error)
99
+ }];
100
+ const resolveNode = (semverRange, phases, increments, defaultVersion, date, authOverride) => Effect.gen(function* () {
101
+ return toSuccess("node", yield* (yield* NodeResolver).resolve({
102
+ semverRange,
103
+ ...phases ? { phases } : {},
104
+ ...increments ? { increments } : {},
105
+ ...defaultVersion ? { defaultVersion } : {},
106
+ ...date ? { date } : {}
107
+ }));
108
+ }).pipe(Effect.provide(makeNodeLayer(authOverride)), Effect.catchAll((error) => Effect.succeed(toError("node", error))));
109
+ const resolveBun = (semverRange, increments, defaultVersion, authOverride) => Effect.gen(function* () {
110
+ return toSuccess("bun", yield* (yield* BunResolver).resolve({
111
+ semverRange,
112
+ ...increments ? { increments } : {},
113
+ ...defaultVersion ? { defaultVersion } : {}
114
+ }));
115
+ }).pipe(Effect.provide(makeBunLayer(authOverride)), Effect.catchAll((error) => Effect.succeed(toError("bun", error))));
116
+ const resolveDeno = (semverRange, increments, defaultVersion, authOverride) => Effect.gen(function* () {
117
+ return toSuccess("deno", yield* (yield* DenoResolver).resolve({
118
+ semverRange,
119
+ ...increments ? { increments } : {},
120
+ ...defaultVersion ? { defaultVersion } : {}
121
+ }));
122
+ }).pipe(Effect.provide(makeDenoLayer(authOverride)), Effect.catchAll((error) => Effect.succeed(toError("deno", error))));
123
+ const formatResponse = (ok, results, pretty) => {
124
+ return JSON.stringify({
125
+ $schema: SCHEMA_URL,
126
+ ok,
127
+ results
128
+ }, null, pretty ? 2 : void 0);
129
+ };
130
+ const resolveHandler = (args) => Effect.gen(function* () {
131
+ if (args.schema) {
132
+ if ([
133
+ args.node,
134
+ args.bun,
135
+ args.deno,
136
+ args.nodePhases,
137
+ args.increments,
138
+ args.nodeDefault,
139
+ args.bunDefault,
140
+ args.denoDefault,
141
+ args.nodeDate,
142
+ args.token,
143
+ args.appId,
144
+ args.appPrivateKey,
145
+ args.appInstallationId
146
+ ].some((f) => Option.isSome(f))) {
147
+ yield* Console.error("Error: --schema cannot be combined with resolve flags (--node, --bun, --deno, etc.)");
148
+ return;
149
+ }
150
+ const { cliJsonSchema } = yield* Effect.promise(() => import("../schemas/json-schema.js"));
151
+ yield* Console.log(JSON.stringify(cliJsonSchema, null, 2));
152
+ return;
153
+ }
154
+ const hasToken = Option.isSome(args.token);
155
+ const hasAppId = Option.isSome(args.appId);
156
+ const hasAppPrivateKey = Option.isSome(args.appPrivateKey);
157
+ const hasAppInstallationId = Option.isSome(args.appInstallationId);
158
+ if (hasToken && (hasAppId || hasAppPrivateKey)) {
159
+ yield* Console.error("Error: --token and --app-id/--app-private-key are mutually exclusive");
160
+ return;
161
+ }
162
+ if (hasAppId !== hasAppPrivateKey) {
163
+ yield* Console.error("Error: --app-id and --app-private-key must both be provided");
164
+ return;
165
+ }
166
+ if (hasAppInstallationId && !hasAppId) {
167
+ yield* Console.error("Error: --app-installation-id requires --app-id and --app-private-key");
168
+ return;
169
+ }
170
+ let resolvedPrivateKey;
171
+ if (hasAppPrivateKey) {
172
+ const keyValue = args.appPrivateKey.value;
173
+ if (keyValue.startsWith("@")) {
174
+ const filePath = keyValue.slice(1);
175
+ try {
176
+ resolvedPrivateKey = readFileSync(filePath, "utf-8");
177
+ } catch {
178
+ yield* Console.error(`Error: Cannot read private key file: ${filePath}`);
179
+ return;
180
+ }
181
+ } else resolvedPrivateKey = keyValue;
182
+ }
183
+ let authLayerOverride;
184
+ if (hasToken) authLayerOverride = GitHubTokenAuthFromToken(args.token.value);
185
+ else if (hasAppId && resolvedPrivateKey) authLayerOverride = GitHubAppAuth({
186
+ appId: args.appId.value,
187
+ privateKey: resolvedPrivateKey,
188
+ ...hasAppInstallationId ? { installationId: Number(args.appInstallationId.value) } : {}
189
+ });
190
+ const hasNode = Option.isSome(args.node);
191
+ const hasBun = Option.isSome(args.bun);
192
+ const hasDeno = Option.isSome(args.deno);
193
+ if (!hasNode && !hasBun && !hasDeno) {
194
+ yield* Console.error("No runtime specified. Use --node, --bun, or --deno to resolve versions.\nRun with --help for usage information.");
195
+ return;
196
+ }
197
+ let validatedPhases;
198
+ if (Option.isSome(args.nodePhases)) try {
199
+ validatedPhases = validatePhases(args.nodePhases.value);
200
+ } catch (e) {
201
+ yield* Console.error(e.message);
202
+ return;
203
+ }
204
+ let validatedIncrements;
205
+ if (Option.isSome(args.increments)) try {
206
+ validatedIncrements = validateIncrements(args.increments.value);
207
+ } catch (e) {
208
+ yield* Console.error(e.message);
209
+ return;
210
+ }
211
+ let nodeDate;
212
+ if (Option.isSome(args.nodeDate)) {
213
+ nodeDate = new Date(args.nodeDate.value);
214
+ if (Number.isNaN(nodeDate.getTime())) {
215
+ yield* Console.error(`Invalid date: "${args.nodeDate.value}". Use ISO 8601 format (e.g. 2024-01-15).`);
216
+ return;
217
+ }
218
+ }
219
+ const tasks = [];
220
+ if (hasNode) {
221
+ const nodeDefaultVersion = Option.isSome(args.nodeDefault) ? args.nodeDefault.value : void 0;
222
+ tasks.push(resolveNode(args.node.value, validatedPhases, validatedIncrements, nodeDefaultVersion, nodeDate, authLayerOverride));
223
+ }
224
+ if (hasBun) {
225
+ const bunDefaultVersion = Option.isSome(args.bunDefault) ? args.bunDefault.value : void 0;
226
+ tasks.push(resolveBun(args.bun.value, validatedIncrements, bunDefaultVersion, authLayerOverride));
227
+ }
228
+ if (hasDeno) {
229
+ const denoDefaultVersion = Option.isSome(args.denoDefault) ? args.denoDefault.value : void 0;
230
+ tasks.push(resolveDeno(args.deno.value, validatedIncrements, denoDefaultVersion, authLayerOverride));
231
+ }
232
+ const entries = yield* Effect.all(tasks, { concurrency: "unbounded" });
233
+ const results = Object.fromEntries(entries);
234
+ const hasError = Object.values(results).some((r) => !r.ok);
235
+ yield* Console.log(formatResponse(!hasError, results, args.pretty));
236
+ });
237
+
238
+ //#endregion
239
+ export { appIdOption, appInstallationIdOption, appPrivateKeyOption, bunDefaultOption, bunOption, denoDefaultOption, denoOption, incrementsOption, nodeDateOption, nodeDefaultOption, nodeOption, nodePhasesOption, prettyOption, resolveHandler, schemaOption, tokenOption };
240
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","names":[],"sources":["../../../../../src/cli/commands/resolve.ts"],"sourcesContent":["/* v8 ignore start */\nimport { readFileSync } from \"node:fs\";\nimport { Options } from \"@effect/cli\";\nimport { Console, Effect, Layer, Option } from \"effect\";\nimport type { AuthenticationError } from \"../../errors/AuthenticationError.js\";\nimport { AutoBunCacheLive } from \"../../layers/AutoBunCacheLive.js\";\nimport { AutoDenoCacheLive } from \"../../layers/AutoDenoCacheLive.js\";\nimport { AutoNodeCacheLive } from \"../../layers/AutoNodeCacheLive.js\";\nimport { BunResolverLive } from \"../../layers/BunResolverLive.js\";\nimport { BunVersionFetcherLive } from \"../../layers/BunVersionFetcherLive.js\";\nimport { DenoResolverLive } from \"../../layers/DenoResolverLive.js\";\nimport { DenoVersionFetcherLive } from \"../../layers/DenoVersionFetcherLive.js\";\nimport { GitHubAppAuth } from \"../../layers/GitHubAppAuth.js\";\nimport { GitHubAutoAuth } from \"../../layers/GitHubAutoAuth.js\";\nimport { GitHubClientLive } from \"../../layers/GitHubClientLive.js\";\nimport { GitHubTokenAuthFromToken } from \"../../layers/GitHubTokenAuth.js\";\nimport { NodeResolverLive } from \"../../layers/NodeResolverLive.js\";\nimport { NodeScheduleFetcherLive } from \"../../layers/NodeScheduleFetcherLive.js\";\nimport { NodeVersionFetcherLive } from \"../../layers/NodeVersionFetcherLive.js\";\nimport type { Increments, NodePhase } from \"../../schemas/common.js\";\nimport { BunResolver } from \"../../services/BunResolver.js\";\nimport { DenoResolver } from \"../../services/DenoResolver.js\";\nimport { NodeResolver } from \"../../services/NodeResolver.js\";\nimport type { OctokitInstance } from \"../../services/OctokitInstance.js\";\nimport type { CliResponse, CliRuntimeResult } from \"../schemas/response.js\";\n\nconst GitHubLayer = GitHubClientLive.pipe(Layer.provide(GitHubAutoAuth));\n\nconst makeNodeLayer = (authOverride?: Layer.Layer<OctokitInstance, AuthenticationError>) => {\n\tconst ghLayer = authOverride ? GitHubClientLive.pipe(Layer.provide(authOverride)) : GitHubLayer;\n\tconst fetchersLayer = Layer.merge(\n\t\tNodeVersionFetcherLive.pipe(Layer.provide(ghLayer)),\n\t\tNodeScheduleFetcherLive.pipe(Layer.provide(ghLayer)),\n\t);\n\treturn NodeResolverLive.pipe(Layer.provide(AutoNodeCacheLive.pipe(Layer.provide(fetchersLayer))));\n};\n\nconst makeBunLayer = (authOverride?: Layer.Layer<OctokitInstance, AuthenticationError>) => {\n\tconst ghLayer = authOverride ? GitHubClientLive.pipe(Layer.provide(authOverride)) : GitHubLayer;\n\treturn BunResolverLive.pipe(\n\t\tLayer.provide(AutoBunCacheLive.pipe(Layer.provide(BunVersionFetcherLive.pipe(Layer.provide(ghLayer))))),\n\t);\n};\n\nconst makeDenoLayer = (authOverride?: Layer.Layer<OctokitInstance, AuthenticationError>) => {\n\tconst ghLayer = authOverride ? GitHubClientLive.pipe(Layer.provide(authOverride)) : GitHubLayer;\n\treturn DenoResolverLive.pipe(\n\t\tLayer.provide(AutoDenoCacheLive.pipe(Layer.provide(DenoVersionFetcherLive.pipe(Layer.provide(ghLayer))))),\n\t);\n};\n\nconst SCHEMA_URL = \"https://raw.githubusercontent.com/spencerbeggs/runtime-resolver/main/runtime-resolver.schema.json\";\n\n// --- Options ---\n\nexport const nodeOption = Options.text(\"node\").pipe(Options.optional);\nexport const bunOption = Options.text(\"bun\").pipe(Options.optional);\nexport const denoOption = Options.text(\"deno\").pipe(Options.optional);\nexport const nodePhasesOption = Options.text(\"node-phases\").pipe(Options.optional);\nexport const incrementsOption = Options.text(\"increments\").pipe(Options.optional);\nexport const nodeDefaultOption = Options.text(\"node-default\").pipe(Options.optional);\nexport const bunDefaultOption = Options.text(\"bun-default\").pipe(Options.optional);\nexport const denoDefaultOption = Options.text(\"deno-default\").pipe(Options.optional);\nexport const nodeDateOption = Options.text(\"node-date\").pipe(Options.optional);\nexport const prettyOption = Options.boolean(\"pretty\").pipe(Options.withDefault(false));\nexport const schemaOption = Options.boolean(\"schema\").pipe(Options.withDefault(false));\nexport const tokenOption = Options.text(\"token\").pipe(Options.optional);\nexport const appIdOption = Options.text(\"app-id\").pipe(Options.optional);\nexport const appPrivateKeyOption = Options.text(\"app-private-key\").pipe(Options.optional);\nexport const appInstallationIdOption = Options.text(\"app-installation-id\").pipe(Options.optional);\n\n// --- Validation helpers ---\n\nconst VALID_PHASES = [\"current\", \"active-lts\", \"maintenance-lts\", \"end-of-life\"] as const;\nconst VALID_INCREMENTS = [\"latest\", \"minor\", \"patch\"] as const;\n\nconst validatePhases = (raw: string): NodePhase[] => {\n\tconst phases = raw.split(\",\").map((s) => s.trim());\n\tfor (const p of phases) {\n\t\tif (!(VALID_PHASES as readonly string[]).includes(p)) {\n\t\t\tthrow new Error(`Invalid phase: \"${p}\". Valid values: ${VALID_PHASES.join(\", \")}`);\n\t\t}\n\t}\n\treturn phases as NodePhase[];\n};\n\nconst validateIncrements = (raw: string): Increments => {\n\tif (!(VALID_INCREMENTS as readonly string[]).includes(raw)) {\n\t\tthrow new Error(`Invalid increments value: \"${raw}\". Valid values: ${VALID_INCREMENTS.join(\", \")}`);\n\t}\n\treturn raw as Increments;\n};\n\n// --- Error serialization ---\n\nconst serializeError = (error: unknown): { _tag: string; message: string; [key: string]: unknown } => {\n\tif (error && typeof error === \"object\" && \"_tag\" in error && \"message\" in error) {\n\t\tconst { _tag, message, ...rest } = error as { _tag: string; message: string; [key: string]: unknown };\n\t\treturn { _tag, message, ...rest };\n\t}\n\treturn {\n\t\t_tag: \"UnknownError\",\n\t\tmessage: error instanceof Error ? error.message : String(error),\n\t};\n};\n\n// --- Runtime resolution helpers ---\n\ntype RuntimeEntry = readonly [string, CliRuntimeResult];\n\nconst toSuccess = (\n\tname: string,\n\tresult: {\n\t\tsource: string;\n\t\tversions: readonly string[];\n\t\tlatest: string;\n\t\tlts?: string | undefined;\n\t\tdefault?: string | undefined;\n\t},\n): RuntimeEntry => [\n\tname,\n\t{\n\t\tok: true as const,\n\t\tsource: result.source,\n\t\tversions: [...result.versions],\n\t\tlatest: result.latest,\n\t\t...(result.lts !== undefined ? { lts: result.lts } : {}),\n\t\t...(result.default !== undefined ? { default: result.default } : {}),\n\t},\n];\n\nconst toError = (name: string, error: unknown): RuntimeEntry => [\n\tname,\n\t{ ok: false as const, error: serializeError(error) },\n];\n\nconst resolveNode = (\n\tsemverRange: string,\n\tphases?: NodePhase[],\n\tincrements?: Increments,\n\tdefaultVersion?: string,\n\tdate?: Date,\n\tauthOverride?: Layer.Layer<OctokitInstance, AuthenticationError>,\n): Effect.Effect<RuntimeEntry> =>\n\tEffect.gen(function* () {\n\t\tconst resolver = yield* NodeResolver;\n\t\tconst result = yield* resolver.resolve({\n\t\t\tsemverRange,\n\t\t\t...(phases ? { phases } : {}),\n\t\t\t...(increments ? { increments } : {}),\n\t\t\t...(defaultVersion ? { defaultVersion } : {}),\n\t\t\t...(date ? { date } : {}),\n\t\t});\n\t\treturn toSuccess(\"node\", result);\n\t}).pipe(\n\t\tEffect.provide(makeNodeLayer(authOverride)),\n\t\tEffect.catchAll((error) => Effect.succeed(toError(\"node\", error))),\n\t);\n\nconst resolveBun = (\n\tsemverRange: string,\n\tincrements?: Increments,\n\tdefaultVersion?: string,\n\tauthOverride?: Layer.Layer<OctokitInstance, AuthenticationError>,\n): Effect.Effect<RuntimeEntry> =>\n\tEffect.gen(function* () {\n\t\tconst resolver = yield* BunResolver;\n\t\tconst result = yield* resolver.resolve({\n\t\t\tsemverRange,\n\t\t\t...(increments ? { increments } : {}),\n\t\t\t...(defaultVersion ? { defaultVersion } : {}),\n\t\t});\n\t\treturn toSuccess(\"bun\", result);\n\t}).pipe(\n\t\tEffect.provide(makeBunLayer(authOverride)),\n\t\tEffect.catchAll((error) => Effect.succeed(toError(\"bun\", error))),\n\t);\n\nconst resolveDeno = (\n\tsemverRange: string,\n\tincrements?: Increments,\n\tdefaultVersion?: string,\n\tauthOverride?: Layer.Layer<OctokitInstance, AuthenticationError>,\n): Effect.Effect<RuntimeEntry> =>\n\tEffect.gen(function* () {\n\t\tconst resolver = yield* DenoResolver;\n\t\tconst result = yield* resolver.resolve({\n\t\t\tsemverRange,\n\t\t\t...(increments ? { increments } : {}),\n\t\t\t...(defaultVersion ? { defaultVersion } : {}),\n\t\t});\n\t\treturn toSuccess(\"deno\", result);\n\t}).pipe(\n\t\tEffect.provide(makeDenoLayer(authOverride)),\n\t\tEffect.catchAll((error) => Effect.succeed(toError(\"deno\", error))),\n\t);\n\n// --- Response serialization ---\n\nconst formatResponse = (ok: CliResponse[\"ok\"], results: Record<string, CliRuntimeResult>, pretty: boolean): string => {\n\tconst response = { $schema: SCHEMA_URL, ok, results } satisfies CliResponse & { $schema: string };\n\treturn JSON.stringify(response, null, pretty ? 2 : undefined);\n};\n\n// --- Handler ---\n\nexport const resolveHandler = (args: {\n\treadonly node: Option.Option<string>;\n\treadonly bun: Option.Option<string>;\n\treadonly deno: Option.Option<string>;\n\treadonly nodePhases: Option.Option<string>;\n\treadonly increments: Option.Option<string>;\n\treadonly nodeDefault: Option.Option<string>;\n\treadonly bunDefault: Option.Option<string>;\n\treadonly denoDefault: Option.Option<string>;\n\treadonly nodeDate: Option.Option<string>;\n\treadonly pretty: boolean;\n\treadonly schema: boolean;\n\treadonly token: Option.Option<string>;\n\treadonly appId: Option.Option<string>;\n\treadonly appPrivateKey: Option.Option<string>;\n\treadonly appInstallationId: Option.Option<string>;\n}) =>\n\tEffect.gen(function* () {\n\t\t// Handle --schema flag with strict validation\n\t\tif (args.schema) {\n\t\t\tconst resolveFlags = [\n\t\t\t\targs.node,\n\t\t\t\targs.bun,\n\t\t\t\targs.deno,\n\t\t\t\targs.nodePhases,\n\t\t\t\targs.increments,\n\t\t\t\targs.nodeDefault,\n\t\t\t\targs.bunDefault,\n\t\t\t\targs.denoDefault,\n\t\t\t\targs.nodeDate,\n\t\t\t\targs.token,\n\t\t\t\targs.appId,\n\t\t\t\targs.appPrivateKey,\n\t\t\t\targs.appInstallationId,\n\t\t\t];\n\t\t\tconst hasResolveFlags = resolveFlags.some((f) => Option.isSome(f));\n\t\t\tif (hasResolveFlags) {\n\t\t\t\tyield* Console.error(\"Error: --schema cannot be combined with resolve flags (--node, --bun, --deno, etc.)\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { cliJsonSchema } = yield* Effect.promise(() => import(\"../schemas/json-schema.js\"));\n\t\t\tyield* Console.log(JSON.stringify(cliJsonSchema, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\t// Auth flag validation\n\t\tconst hasToken = Option.isSome(args.token);\n\t\tconst hasAppId = Option.isSome(args.appId);\n\t\tconst hasAppPrivateKey = Option.isSome(args.appPrivateKey);\n\t\tconst hasAppInstallationId = Option.isSome(args.appInstallationId);\n\n\t\tif (hasToken && (hasAppId || hasAppPrivateKey)) {\n\t\t\tyield* Console.error(\"Error: --token and --app-id/--app-private-key are mutually exclusive\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (hasAppId !== hasAppPrivateKey) {\n\t\t\tyield* Console.error(\"Error: --app-id and --app-private-key must both be provided\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (hasAppInstallationId && !hasAppId) {\n\t\t\tyield* Console.error(\"Error: --app-installation-id requires --app-id and --app-private-key\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Resolve private key (@ prefix means file path)\n\t\tlet resolvedPrivateKey: string | undefined;\n\t\tif (hasAppPrivateKey) {\n\t\t\tconst keyValue = args.appPrivateKey.value;\n\t\t\tif (keyValue.startsWith(\"@\")) {\n\t\t\t\tconst filePath = keyValue.slice(1);\n\t\t\t\ttry {\n\t\t\t\t\tresolvedPrivateKey = readFileSync(filePath, \"utf-8\");\n\t\t\t\t} catch {\n\t\t\t\t\tyield* Console.error(`Error: Cannot read private key file: ${filePath}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresolvedPrivateKey = keyValue;\n\t\t\t}\n\t\t}\n\n\t\t// Construct auth layer override if CLI flags provided\n\t\tlet authLayerOverride: Layer.Layer<OctokitInstance, AuthenticationError> | undefined;\n\t\tif (hasToken) {\n\t\t\tauthLayerOverride = GitHubTokenAuthFromToken(args.token.value);\n\t\t} else if (hasAppId && resolvedPrivateKey) {\n\t\t\tauthLayerOverride = GitHubAppAuth({\n\t\t\t\tappId: args.appId.value,\n\t\t\t\tprivateKey: resolvedPrivateKey,\n\t\t\t\t...(hasAppInstallationId ? { installationId: Number(args.appInstallationId.value) } : {}),\n\t\t\t});\n\t\t}\n\n\t\tconst hasNode = Option.isSome(args.node);\n\t\tconst hasBun = Option.isSome(args.bun);\n\t\tconst hasDeno = Option.isSome(args.deno);\n\n\t\tif (!hasNode && !hasBun && !hasDeno) {\n\t\t\tyield* Console.error(\n\t\t\t\t\"No runtime specified. Use --node, --bun, or --deno to resolve versions.\\nRun with --help for usage information.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Validate and extract phases\n\t\tlet validatedPhases: NodePhase[] | undefined;\n\t\tif (Option.isSome(args.nodePhases)) {\n\t\t\ttry {\n\t\t\t\tvalidatedPhases = validatePhases(args.nodePhases.value);\n\t\t\t} catch (e) {\n\t\t\t\tyield* Console.error((e as Error).message);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Validate and extract increments\n\t\tlet validatedIncrements: Increments | undefined;\n\t\tif (Option.isSome(args.increments)) {\n\t\t\ttry {\n\t\t\t\tvalidatedIncrements = validateIncrements(args.increments.value);\n\t\t\t} catch (e) {\n\t\t\t\tyield* Console.error((e as Error).message);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Parse node date\n\t\tlet nodeDate: Date | undefined;\n\t\tif (Option.isSome(args.nodeDate)) {\n\t\t\tnodeDate = new Date(args.nodeDate.value);\n\t\t\tif (Number.isNaN(nodeDate.getTime())) {\n\t\t\t\tyield* Console.error(`Invalid date: \"${args.nodeDate.value}\". Use ISO 8601 format (e.g. 2024-01-15).`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Resolve each requested runtime independently\n\t\tconst tasks: Effect.Effect<RuntimeEntry>[] = [];\n\n\t\tif (hasNode) {\n\t\t\tconst nodeDefaultVersion = Option.isSome(args.nodeDefault) ? args.nodeDefault.value : undefined;\n\t\t\ttasks.push(\n\t\t\t\tresolveNode(\n\t\t\t\t\targs.node.value,\n\t\t\t\t\tvalidatedPhases,\n\t\t\t\t\tvalidatedIncrements,\n\t\t\t\t\tnodeDefaultVersion,\n\t\t\t\t\tnodeDate,\n\t\t\t\t\tauthLayerOverride,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tif (hasBun) {\n\t\t\tconst bunDefaultVersion = Option.isSome(args.bunDefault) ? args.bunDefault.value : undefined;\n\t\t\ttasks.push(resolveBun(args.bun.value, validatedIncrements, bunDefaultVersion, authLayerOverride));\n\t\t}\n\t\tif (hasDeno) {\n\t\t\tconst denoDefaultVersion = Option.isSome(args.denoDefault) ? args.denoDefault.value : undefined;\n\t\t\ttasks.push(resolveDeno(args.deno.value, validatedIncrements, denoDefaultVersion, authLayerOverride));\n\t\t}\n\n\t\tconst entries = yield* Effect.all(tasks, { concurrency: \"unbounded\" });\n\t\tconst results: Record<string, CliRuntimeResult> = Object.fromEntries(entries);\n\t\tconst hasError = Object.values(results).some((r) => !r.ok);\n\n\t\tyield* Console.log(formatResponse(!hasError as CliResponse[\"ok\"], results, args.pretty));\n\t});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAM,cAAc,iBAAiB,KAAK,MAAM,QAAQ,cAAc,CAAC;AAEvE,MAAM,iBAAiB,iBAAqE;CAC3F,MAAM,UAAU,eAAe,iBAAiB,KAAK,MAAM,QAAQ,YAAY,CAAC,IAAI;CACpF,MAAM,gBAAgB,MAAM,MAC3B,uBAAuB,KAAK,MAAM,QAAQ,OAAO,CAAC,GAClD,wBAAwB,KAAK,MAAM,QAAQ,OAAO,CAAC,CACpD;CACA,OAAO,iBAAiB,KAAK,MAAM,QAAQ,kBAAkB,KAAK,MAAM,QAAQ,aAAa,CAAC,CAAC,CAAC;AACjG;AAEA,MAAM,gBAAgB,iBAAqE;CAC1F,MAAM,UAAU,eAAe,iBAAiB,KAAK,MAAM,QAAQ,YAAY,CAAC,IAAI;CACpF,OAAO,gBAAgB,KACtB,MAAM,QAAQ,iBAAiB,KAAK,MAAM,QAAQ,sBAAsB,KAAK,MAAM,QAAQ,OAAO,CAAC,CAAC,CAAC,CAAC,CACvG;AACD;AAEA,MAAM,iBAAiB,iBAAqE;CAC3F,MAAM,UAAU,eAAe,iBAAiB,KAAK,MAAM,QAAQ,YAAY,CAAC,IAAI;CACpF,OAAO,iBAAiB,KACvB,MAAM,QAAQ,kBAAkB,KAAK,MAAM,QAAQ,uBAAuB,KAAK,MAAM,QAAQ,OAAO,CAAC,CAAC,CAAC,CAAC,CACzG;AACD;AAEA,MAAM,aAAa;AAInB,MAAa,aAAa,QAAQ,KAAK,MAAM,CAAC,CAAC,KAAK,QAAQ,QAAQ;AACpE,MAAa,YAAY,QAAQ,KAAK,KAAK,CAAC,CAAC,KAAK,QAAQ,QAAQ;AAClE,MAAa,aAAa,QAAQ,KAAK,MAAM,CAAC,CAAC,KAAK,QAAQ,QAAQ;AACpE,MAAa,mBAAmB,QAAQ,KAAK,aAAa,CAAC,CAAC,KAAK,QAAQ,QAAQ;AACjF,MAAa,mBAAmB,QAAQ,KAAK,YAAY,CAAC,CAAC,KAAK,QAAQ,QAAQ;AAChF,MAAa,oBAAoB,QAAQ,KAAK,cAAc,CAAC,CAAC,KAAK,QAAQ,QAAQ;AACnF,MAAa,mBAAmB,QAAQ,KAAK,aAAa,CAAC,CAAC,KAAK,QAAQ,QAAQ;AACjF,MAAa,oBAAoB,QAAQ,KAAK,cAAc,CAAC,CAAC,KAAK,QAAQ,QAAQ;AACnF,MAAa,iBAAiB,QAAQ,KAAK,WAAW,CAAC,CAAC,KAAK,QAAQ,QAAQ;AAC7E,MAAa,eAAe,QAAQ,QAAQ,QAAQ,CAAC,CAAC,KAAK,QAAQ,YAAY,KAAK,CAAC;AACrF,MAAa,eAAe,QAAQ,QAAQ,QAAQ,CAAC,CAAC,KAAK,QAAQ,YAAY,KAAK,CAAC;AACrF,MAAa,cAAc,QAAQ,KAAK,OAAO,CAAC,CAAC,KAAK,QAAQ,QAAQ;AACtE,MAAa,cAAc,QAAQ,KAAK,QAAQ,CAAC,CAAC,KAAK,QAAQ,QAAQ;AACvE,MAAa,sBAAsB,QAAQ,KAAK,iBAAiB,CAAC,CAAC,KAAK,QAAQ,QAAQ;AACxF,MAAa,0BAA0B,QAAQ,KAAK,qBAAqB,CAAC,CAAC,KAAK,QAAQ,QAAQ;AAIhG,MAAM,eAAe;CAAC;CAAW;CAAc;CAAmB;AAAa;AAC/E,MAAM,mBAAmB;CAAC;CAAU;CAAS;AAAO;AAEpD,MAAM,kBAAkB,QAA6B;CACpD,MAAM,SAAS,IAAI,MAAM,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC;CACjD,KAAK,MAAM,KAAK,QACf,IAAI,CAAE,aAAmC,SAAS,CAAC,GAClD,MAAM,IAAI,MAAM,mBAAmB,EAAE,mBAAmB,aAAa,KAAK,IAAI,GAAG;CAGnF,OAAO;AACR;AAEA,MAAM,sBAAsB,QAA4B;CACvD,IAAI,CAAE,iBAAuC,SAAS,GAAG,GACxD,MAAM,IAAI,MAAM,8BAA8B,IAAI,mBAAmB,iBAAiB,KAAK,IAAI,GAAG;CAEnG,OAAO;AACR;AAIA,MAAM,kBAAkB,UAA8E;CACrG,IAAI,SAAS,OAAO,UAAU,YAAY,UAAU,SAAS,aAAa,OAAO;EAChF,MAAM,EAAE,MAAM,SAAS,GAAG,SAAS;EACnC,OAAO;GAAE;GAAM;GAAS,GAAG;EAAK;CACjC;CACA,OAAO;EACN,MAAM;EACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;CAC/D;AACD;AAMA,MAAM,aACL,MACA,WAOkB,CAClB,MACA;CACC,IAAI;CACJ,QAAQ,OAAO;CACf,UAAU,CAAC,GAAG,OAAO,QAAQ;CAC7B,QAAQ,OAAO;CACf,GAAI,OAAO,QAAQ,SAAY,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC;CACtD,GAAI,OAAO,YAAY,SAAY,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AACnE,CACD;AAEA,MAAM,WAAW,MAAc,UAAiC,CAC/D,MACA;CAAE,IAAI;CAAgB,OAAO,eAAe,KAAK;AAAE,CACpD;AAEA,MAAM,eACL,aACA,QACA,YACA,gBACA,MACA,iBAEA,OAAO,IAAI,aAAa;CASvB,OAAO,UAAU,QAAQ,QAPH,OADE,aACM,CAAC,QAAQ;EACtC;EACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;EACnC,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;EAC3C,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;CACxB,CAAC,CAC8B;AAChC,CAAC,CAAC,CAAC,KACF,OAAO,QAAQ,cAAc,YAAY,CAAC,GAC1C,OAAO,UAAU,UAAU,OAAO,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAClE;AAED,MAAM,cACL,aACA,YACA,gBACA,iBAEA,OAAO,IAAI,aAAa;CAOvB,OAAO,UAAU,OAAO,QALF,OADE,YACM,CAAC,QAAQ;EACtC;EACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;EACnC,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;CAC5C,CAAC,CAC6B;AAC/B,CAAC,CAAC,CAAC,KACF,OAAO,QAAQ,aAAa,YAAY,CAAC,GACzC,OAAO,UAAU,UAAU,OAAO,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC,CACjE;AAED,MAAM,eACL,aACA,YACA,gBACA,iBAEA,OAAO,IAAI,aAAa;CAOvB,OAAO,UAAU,QAAQ,QALH,OADE,aACM,CAAC,QAAQ;EACtC;EACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;EACnC,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;CAC5C,CAAC,CAC8B;AAChC,CAAC,CAAC,CAAC,KACF,OAAO,QAAQ,cAAc,YAAY,CAAC,GAC1C,OAAO,UAAU,UAAU,OAAO,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAClE;AAID,MAAM,kBAAkB,IAAuB,SAA2C,WAA4B;CAErH,OAAO,KAAK,UAAU;EADH,SAAS;EAAY;EAAI;CACf,GAAG,MAAM,SAAS,IAAI,MAAS;AAC7D;AAIA,MAAa,kBAAkB,SAiB9B,OAAO,IAAI,aAAa;CAEvB,IAAI,KAAK,QAAQ;EAiBhB,IADwB;GAdvB,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;EAE6B,CAAC,CAAC,MAAM,MAAM,OAAO,OAAO,CAAC,CAC9C,GAAG;GACpB,OAAO,QAAQ,MAAM,qFAAqF;GAC1G;EACD;EAEA,MAAM,EAAE,kBAAkB,OAAO,OAAO,cAAc,OAAO,4BAA4B;EACzF,OAAO,QAAQ,IAAI,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;EACzD;CACD;CAGA,MAAM,WAAW,OAAO,OAAO,KAAK,KAAK;CACzC,MAAM,WAAW,OAAO,OAAO,KAAK,KAAK;CACzC,MAAM,mBAAmB,OAAO,OAAO,KAAK,aAAa;CACzD,MAAM,uBAAuB,OAAO,OAAO,KAAK,iBAAiB;CAEjE,IAAI,aAAa,YAAY,mBAAmB;EAC/C,OAAO,QAAQ,MAAM,sEAAsE;EAC3F;CACD;CAEA,IAAI,aAAa,kBAAkB;EAClC,OAAO,QAAQ,MAAM,6DAA6D;EAClF;CACD;CAEA,IAAI,wBAAwB,CAAC,UAAU;EACtC,OAAO,QAAQ,MAAM,sEAAsE;EAC3F;CACD;CAGA,IAAI;CACJ,IAAI,kBAAkB;EACrB,MAAM,WAAW,KAAK,cAAc;EACpC,IAAI,SAAS,WAAW,GAAG,GAAG;GAC7B,MAAM,WAAW,SAAS,MAAM,CAAC;GACjC,IAAI;IACH,qBAAqB,aAAa,UAAU,OAAO;GACpD,QAAQ;IACP,OAAO,QAAQ,MAAM,wCAAwC,UAAU;IACvE;GACD;EACD,OACC,qBAAqB;CAEvB;CAGA,IAAI;CACJ,IAAI,UACH,oBAAoB,yBAAyB,KAAK,MAAM,KAAK;MACvD,IAAI,YAAY,oBACtB,oBAAoB,cAAc;EACjC,OAAO,KAAK,MAAM;EAClB,YAAY;EACZ,GAAI,uBAAuB,EAAE,gBAAgB,OAAO,KAAK,kBAAkB,KAAK,EAAE,IAAI,CAAC;CACxF,CAAC;CAGF,MAAM,UAAU,OAAO,OAAO,KAAK,IAAI;CACvC,MAAM,SAAS,OAAO,OAAO,KAAK,GAAG;CACrC,MAAM,UAAU,OAAO,OAAO,KAAK,IAAI;CAEvC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS;EACpC,OAAO,QAAQ,MACd,iHACD;EACA;CACD;CAGA,IAAI;CACJ,IAAI,OAAO,OAAO,KAAK,UAAU,GAChC,IAAI;EACH,kBAAkB,eAAe,KAAK,WAAW,KAAK;CACvD,SAAS,GAAG;EACX,OAAO,QAAQ,MAAO,EAAY,OAAO;EACzC;CACD;CAID,IAAI;CACJ,IAAI,OAAO,OAAO,KAAK,UAAU,GAChC,IAAI;EACH,sBAAsB,mBAAmB,KAAK,WAAW,KAAK;CAC/D,SAAS,GAAG;EACX,OAAO,QAAQ,MAAO,EAAY,OAAO;EACzC;CACD;CAID,IAAI;CACJ,IAAI,OAAO,OAAO,KAAK,QAAQ,GAAG;EACjC,WAAW,IAAI,KAAK,KAAK,SAAS,KAAK;EACvC,IAAI,OAAO,MAAM,SAAS,QAAQ,CAAC,GAAG;GACrC,OAAO,QAAQ,MAAM,kBAAkB,KAAK,SAAS,MAAM,0CAA0C;GACrG;EACD;CACD;CAGA,MAAM,QAAuC,CAAC;CAE9C,IAAI,SAAS;EACZ,MAAM,qBAAqB,OAAO,OAAO,KAAK,WAAW,IAAI,KAAK,YAAY,QAAQ;EACtF,MAAM,KACL,YACC,KAAK,KAAK,OACV,iBACA,qBACA,oBACA,UACA,iBACD,CACD;CACD;CACA,IAAI,QAAQ;EACX,MAAM,oBAAoB,OAAO,OAAO,KAAK,UAAU,IAAI,KAAK,WAAW,QAAQ;EACnF,MAAM,KAAK,WAAW,KAAK,IAAI,OAAO,qBAAqB,mBAAmB,iBAAiB,CAAC;CACjG;CACA,IAAI,SAAS;EACZ,MAAM,qBAAqB,OAAO,OAAO,KAAK,WAAW,IAAI,KAAK,YAAY,QAAQ;EACtF,MAAM,KAAK,YAAY,KAAK,KAAK,OAAO,qBAAqB,oBAAoB,iBAAiB,CAAC;CACpG;CAEA,MAAM,UAAU,OAAO,OAAO,IAAI,OAAO,EAAE,aAAa,YAAY,CAAC;CACrE,MAAM,UAA4C,OAAO,YAAY,OAAO;CAC5E,MAAM,WAAW,OAAO,OAAO,OAAO,CAAC,CAAC,MAAM,MAAM,CAAC,EAAE,EAAE;CAEzD,OAAO,QAAQ,IAAI,eAAe,CAAC,UAA+B,SAAS,KAAK,MAAM,CAAC;AACxF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { CliResponse } from "./response.js";
2
+ import { JSONSchema } from "effect";
3
+
4
+ //#region src/cli/schemas/json-schema.ts
5
+ /**
6
+ * JSON Schema for the CLI response envelope.
7
+ * Used by --schema flag and can be published alongside the package.
8
+ */
9
+ const cliJsonSchema = JSONSchema.make(CliResponse);
10
+
11
+ //#endregion
12
+ export { cliJsonSchema };
13
+ //# sourceMappingURL=json-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema.js","names":[],"sources":["../../../../../src/cli/schemas/json-schema.ts"],"sourcesContent":["import { JSONSchema } from \"effect\";\nimport { CliResponse } from \"./response.js\";\n\n/**\n * JSON Schema for the CLI response envelope.\n * Used by --schema flag and can be published alongside the package.\n */\nexport const cliJsonSchema = JSONSchema.make(CliResponse);\n"],"mappings":";;;;;;;;AAOA,MAAa,gBAAgB,WAAW,KAAK,WAAW"}