@savvy-web/silk 1.1.2 → 1.3.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 (60) hide show
  1. package/_virtual/_rolldown/runtime.js +1 -1
  2. package/changesets-changelog.cjs +25753 -929
  3. package/changesets-changelog.d.cts +175 -12
  4. package/changesets-changelog.d.ts +175 -12
  5. package/changesets-markdownlint.cjs +25753 -929
  6. package/changesets-markdownlint.d.cts +175 -12
  7. package/changesets-markdownlint.d.ts +175 -12
  8. package/package.json +8 -8
  9. package/packages/silk-effects/dist/dev/pkg/changesets/categories/types.cjs +0 -1
  10. package/packages/silk-effects/dist/dev/pkg/changesets/categories/types.js +0 -1
  11. package/packages/silk-effects/dist/dev/pkg/changesets/changelog/index.cjs +0 -2
  12. package/packages/silk-effects/dist/dev/pkg/changesets/changelog/index.js +0 -2
  13. package/packages/silk-effects/dist/dev/pkg/changesets/constants.cjs +0 -1
  14. package/packages/silk-effects/dist/dev/pkg/changesets/constants.js +0 -1
  15. package/packages/silk-effects/dist/dev/pkg/changesets/errors.cjs +26 -1
  16. package/packages/silk-effects/dist/dev/pkg/changesets/errors.js +25 -2
  17. package/packages/silk-effects/dist/dev/pkg/changesets/index.cjs +16 -1
  18. package/packages/silk-effects/dist/dev/pkg/changesets/index.js +17 -2
  19. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/dependency-table-format.cjs +2 -2
  20. package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/dependency-table-format.js +2 -2
  21. package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/uncategorized-content.cjs +1 -1
  22. package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/uncategorized-content.js +1 -1
  23. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/changeset.cjs +0 -1
  24. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/changeset.js +0 -1
  25. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/dependency-table.cjs +0 -1
  26. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/dependency-table.js +0 -1
  27. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/git.cjs +0 -1
  28. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/git.js +0 -1
  29. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/github.cjs +0 -1
  30. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/github.js +0 -1
  31. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/options.cjs +0 -1
  32. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/options.js +0 -1
  33. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/package-scope.cjs +0 -1
  34. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/package-scope.js +0 -1
  35. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/primitives.cjs +0 -1
  36. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/primitives.js +0 -1
  37. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/release-plan.cjs +62 -0
  38. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/release-plan.js +56 -0
  39. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/version-files.cjs +0 -1
  40. package/packages/silk-effects/dist/dev/pkg/changesets/schemas/version-files.js +0 -1
  41. package/packages/silk-effects/dist/dev/pkg/changesets/services/branch-analyzer.cjs +0 -1
  42. package/packages/silk-effects/dist/dev/pkg/changesets/services/branch-analyzer.js +0 -1
  43. package/packages/silk-effects/dist/dev/pkg/changesets/services/config-inspector.cjs +2 -3
  44. package/packages/silk-effects/dist/dev/pkg/changesets/services/config-inspector.js +2 -3
  45. package/packages/silk-effects/dist/dev/pkg/changesets/services/release-planner.cjs +254 -0
  46. package/packages/silk-effects/dist/dev/pkg/changesets/services/release-planner.js +251 -0
  47. package/packages/silk-effects/dist/dev/pkg/changesets/utils/publishability.cjs +3 -4
  48. package/packages/silk-effects/dist/dev/pkg/changesets/utils/publishability.js +3 -4
  49. package/packages/silk-effects/dist/dev/pkg/changesets/utils/worktree-snapshot.cjs +1 -1
  50. package/packages/silk-effects/dist/dev/pkg/changesets/utils/worktree-snapshot.js +1 -1
  51. package/packages/silk-effects/dist/dev/pkg/errors/ChangesetConfigError.cjs +2 -1
  52. package/packages/silk-effects/dist/dev/pkg/errors/ChangesetConfigError.js +2 -1
  53. package/packages/silk-effects/dist/dev/pkg/schemas/VersioningSchemas.cjs +7 -3
  54. package/packages/silk-effects/dist/dev/pkg/schemas/VersioningSchemas.js +7 -3
  55. package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfig.cjs +2 -0
  56. package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfig.js +2 -0
  57. package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfigReader.cjs +4 -2
  58. package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfigReader.js +4 -2
  59. package/packages/silk-effects/dist/dev/pkg/services/SilkPublishability.cjs +17 -13
  60. package/packages/silk-effects/dist/dev/pkg/services/SilkPublishability.js +17 -13
@@ -26,7 +26,6 @@ import { Schema } from "effect";
26
26
  * @see {@link PackageScopeSchema} for the new per-package container
27
27
  * @see {@link https://effect.website/docs/schema/introduction | Effect Schema documentation}
28
28
  *
29
- * @packageDocumentation
30
29
  */
31
30
  /**
32
31
  * Schema for a JSONPath expression starting with `$.`.
@@ -43,7 +43,6 @@ let node_child_process = require("node:child_process");
43
43
  * @see {@link BranchAnalyzerLive} for the production layer
44
44
  * @see {@link ConfigInspector} for the underlying classification service
45
45
  *
46
- * @packageDocumentation
47
46
  */
48
47
  /** Git diff status as reported by `--name-status`. @public */
49
48
  const FileStatusSchema = effect.Schema.Literal("added", "modified", "deleted", "renamed", "copied", "typechange", "unmerged", "unknown").annotations({ identifier: "FileStatus" });
@@ -43,7 +43,6 @@ import { execFileSync } from "node:child_process";
43
43
  * @see {@link BranchAnalyzerLive} for the production layer
44
44
  * @see {@link ConfigInspector} for the underlying classification service
45
45
  *
46
- * @packageDocumentation
47
46
  */
48
47
  /** Git diff status as reported by `--name-status`. @public */
49
48
  const FileStatusSchema = Schema.Literal("added", "modified", "deleted", "renamed", "copied", "typechange", "unmerged", "unknown").annotations({ identifier: "FileStatus" });
@@ -1,7 +1,7 @@
1
1
  const require_errors = require('../errors.cjs');
2
2
  const require_options = require('../schemas/options.cjs');
3
3
  const require_ChangesetConfigReader = require('../../services/ChangesetConfigReader.cjs');
4
- const require_index = require('../../../../../../../node_modules/.pnpm/workspaces-effect@1.2.0_@effect_platform@0.96.1_effect@3.21.3__effect@3.21.3/node_modules/workspaces-effect/index.cjs');
4
+ const require_index = require('../../../../../../../node_modules/.pnpm/workspaces-effect@1.2.0_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/index.cjs');
5
5
  const require_SilkPublishability = require('../../services/SilkPublishability.cjs');
6
6
  const require_index$1 = require('../../../../../../../node_modules/.pnpm/tinyglobby@0.2.17/node_modules/tinyglobby/dist/index.cjs');
7
7
  let effect = require("effect");
@@ -41,7 +41,6 @@ let _effect_platform = require("@effect/platform");
41
41
  * @see {@link ConfigInspector} for the Effect service tag
42
42
  * @see {@link ConfigInspectorLive} for the production layer
43
43
  *
44
- * @packageDocumentation
45
44
  */
46
45
  /** A `versionFiles` entry expanded to its absolute target paths. @public */
47
46
  const ResolvedVersionFileSchema = effect.Schema.Struct({
@@ -453,7 +452,7 @@ function classifyOne(inspected, path) {
453
452
  /**
454
453
  * Live layer for {@link ConfigInspector}.
455
454
  *
456
- * Requires {@link ChangesetConfigReader} and {@link WorkspaceDiscovery}
455
+ * Requires {@link ChangesetConfigReader} and `WorkspaceDiscovery`
457
456
  * in the environment.
458
457
  *
459
458
  * @public
@@ -1,7 +1,7 @@
1
1
  import { ConfigurationError } from "../errors.js";
2
2
  import { ChangesetOptionsSchema } from "../schemas/options.js";
3
3
  import { ChangesetConfigReader } from "../../services/ChangesetConfigReader.js";
4
- import { WorkspaceDiscovery } from "../../../../../../../node_modules/.pnpm/workspaces-effect@1.2.0_@effect_platform@0.96.1_effect@3.21.3__effect@3.21.3/node_modules/workspaces-effect/index.js";
4
+ import { WorkspaceDiscovery } from "../../../../../../../node_modules/.pnpm/workspaces-effect@1.2.0_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/index.js";
5
5
  import { SilkPublishability, readTargetsBinding } from "../../services/SilkPublishability.js";
6
6
  import { globSync } from "../../../../../../../node_modules/.pnpm/tinyglobby@0.2.17/node_modules/tinyglobby/dist/index.js";
7
7
  import { Context, Effect, Layer, Schema } from "effect";
@@ -41,7 +41,6 @@ import { FileSystem } from "@effect/platform";
41
41
  * @see {@link ConfigInspector} for the Effect service tag
42
42
  * @see {@link ConfigInspectorLive} for the production layer
43
43
  *
44
- * @packageDocumentation
45
44
  */
46
45
  /** A `versionFiles` entry expanded to its absolute target paths. @public */
47
46
  const ResolvedVersionFileSchema = Schema.Struct({
@@ -453,7 +452,7 @@ function classifyOne(inspected, path) {
453
452
  /**
454
453
  * Live layer for {@link ConfigInspector}.
455
454
  *
456
- * Requires {@link ChangesetConfigReader} and {@link WorkspaceDiscovery}
455
+ * Requires {@link ChangesetConfigReader} and `WorkspaceDiscovery`
457
456
  * in the environment.
458
457
  *
459
458
  * @public
@@ -0,0 +1,254 @@
1
+ const require_errors = require('../errors.cjs');
2
+ const require_transformer = require('../api/transformer.cjs');
3
+ const require_config_inspector = require('./config-inspector.cjs');
4
+ const require_version_files = require('../utils/version-files.cjs');
5
+ const require_get_packages_cjs$1 = require('../../../../../../../node_modules/.pnpm/@manypkg_get-packages@1.1.3/node_modules/@manypkg/get-packages/dist/get-packages.cjs.cjs');
6
+ const require_changesets_config_esm = require('../../../../../../../node_modules/.pnpm/@changesets_config@3.1.4/node_modules/@changesets/config/dist/changesets-config.esm.cjs');
7
+ const require_changesets_apply_release_plan_esm = require('../../../../../../../node_modules/.pnpm/@changesets_apply-release-plan@7.1.1/node_modules/@changesets/apply-release-plan/dist/changesets-apply-release-plan.esm.cjs');
8
+ const require_changesets_get_release_plan_esm = require('../../../../../../../node_modules/.pnpm/@changesets_get-release-plan@4.0.16/node_modules/@changesets/get-release-plan/dist/changesets-get-release-plan.esm.cjs');
9
+ let effect = require("effect");
10
+ let node_path = require("node:path");
11
+ let node_fs = require("node:fs");
12
+ let node_os = require("node:os");
13
+
14
+ //#region ../silk-effects/dist/dev/pkg/changesets/services/release-planner.js
15
+ var import_get_packages_cjs = require_get_packages_cjs$1.default;
16
+ /**
17
+ * `ReleasePlanner` service — drive the genuine changesets release engine to
18
+ * compute a plan, render a read-only preview, or natively apply a release.
19
+ *
20
+ * @remarks
21
+ * `preview` and `apply` both run the real `@changesets/apply-release-plan`;
22
+ * `preview` redirects every write into a throwaway temp directory by handing
23
+ * the engine a `@manypkg`-shaped `Packages` object whose `dir`s point at temp,
24
+ * then reads the generated CHANGELOG blocks back. No changesets-internal logic
25
+ * (e.g. `getChangelogEntry`) is re-implemented.
26
+ *
27
+ */
28
+ /** Single workspace-discovery seam; swap to an Effect-native stack later here. */
29
+ const buildPackages = (root) => (0, import_get_packages_cjs.getPackages)(root);
30
+ const errMsg = (e) => e instanceof Error ? e.message : String(e);
31
+ /**
32
+ * Base class for {@link ReleasePlanner}.
33
+ *
34
+ * @privateRemarks Required export for api-extractor (anonymous Context.Tag base). Do not delete.
35
+ * @internal
36
+ */
37
+ const ReleasePlannerBase = effect.Context.Tag("ReleasePlanner")();
38
+ /** Effect service tag for the release planner. @public */
39
+ var ReleasePlanner = class extends ReleasePlannerBase {};
40
+ /** Build the service shape over a resolved {@link ConfigInspector}. */
41
+ function makeShape(inspector) {
42
+ const plan = (root) => effect.Effect.tryPromise({
43
+ try: () => require_changesets_get_release_plan_esm.getReleasePlan(root),
44
+ catch: (e) => new require_errors.ReleasePlanError({
45
+ phase: "plan",
46
+ reason: errMsg(e)
47
+ })
48
+ });
49
+ const preview = (root) => effect.Effect.tryPromise({
50
+ try: () => previewImpl(root),
51
+ catch: (e) => new require_errors.ReleasePlanError({
52
+ phase: "preview",
53
+ reason: errMsg(e)
54
+ })
55
+ });
56
+ const apply = (root, options) => applyEffect(root, options?.dryRun ?? false, inspector);
57
+ return {
58
+ plan,
59
+ preview,
60
+ apply
61
+ };
62
+ }
63
+ /** Production layer. Requires {@link ConfigInspector} (used by `apply`). @public */
64
+ const ReleasePlannerLive = effect.Layer.effect(ReleasePlanner, effect.Effect.gen(function* () {
65
+ return makeShape(yield* require_config_inspector.ConfigInspector);
66
+ }));
67
+ /**
68
+ * Test factory — supply fixed results for any subset of methods. Unsupplied
69
+ * methods fail with a `ReleasePlanError`.
70
+ *
71
+ * @public
72
+ */
73
+ function makeReleasePlannerTest(fixed) {
74
+ const fail = (phase) => effect.Effect.fail(new require_errors.ReleasePlanError({
75
+ phase,
76
+ reason: "not provided in test layer"
77
+ }));
78
+ return effect.Layer.succeed(ReleasePlanner, {
79
+ plan: () => fixed.plan ? effect.Effect.succeed(fixed.plan) : fail("plan"),
80
+ preview: () => fixed.preview ? effect.Effect.succeed(fixed.preview) : fail("preview"),
81
+ apply: () => fixed.apply ? effect.Effect.succeed(fixed.apply) : fail("apply")
82
+ });
83
+ }
84
+ /** Extract the `## <version>` block (down to the next H2 or EOF) from a changelog. */
85
+ function extractVersionBlock(changelog, version) {
86
+ const lines = changelog.split("\n");
87
+ const start = lines.findIndex((l) => l.trim() === `## ${version}`);
88
+ if (start === -1) return "";
89
+ let end = lines.length;
90
+ for (let i = start + 1; i < lines.length; i++) if (/^## /.test(lines[i])) {
91
+ end = i;
92
+ break;
93
+ }
94
+ return lines.slice(start, end).join("\n").trim();
95
+ }
96
+ async function previewImpl(root) {
97
+ const [plan, packages] = await Promise.all([require_changesets_get_release_plan_esm.getReleasePlan(root), buildPackages(root)]);
98
+ const config = await require_changesets_config_esm.read(root, packages);
99
+ const preMode = plan.preState ? plan.preState.mode : null;
100
+ const changesets = plan.changesets.map((cs) => ({
101
+ id: cs.id,
102
+ summary: cs.summary,
103
+ releases: cs.releases.filter((r) => r.type !== "none").map((r) => ({
104
+ name: r.name,
105
+ type: r.type
106
+ }))
107
+ }));
108
+ const releasesToRender = plan.releases.filter((r) => r.type !== "none");
109
+ if (releasesToRender.length === 0) return {
110
+ preMode,
111
+ releases: [],
112
+ changesets
113
+ };
114
+ const tempRoot = (0, node_fs.mkdtempSync)((0, node_path.join)((0, node_os.tmpdir)(), "silk-preview-"));
115
+ try {
116
+ const mapDir = (dir) => {
117
+ const rel = (0, node_path.relative)(packages.root.dir, dir);
118
+ if (rel.startsWith("..") || (0, node_path.isAbsolute)(rel)) throw new Error(`Package directory is outside the workspace root: ${dir}`);
119
+ return (0, node_path.join)(tempRoot, rel);
120
+ };
121
+ const tempPackages = {
122
+ tool: packages.tool,
123
+ root: {
124
+ ...packages.root,
125
+ dir: tempRoot,
126
+ packageJson: structuredClone(packages.root.packageJson)
127
+ },
128
+ packages: packages.packages.map((p) => ({
129
+ ...p,
130
+ dir: mapDir(p.dir),
131
+ packageJson: structuredClone(p.packageJson)
132
+ }))
133
+ };
134
+ (0, node_fs.mkdirSync)((0, node_path.join)(tempRoot, ".changeset"), { recursive: true });
135
+ (0, node_fs.cpSync)((0, node_path.join)(root, "package.json"), (0, node_path.join)(tempRoot, "package.json"));
136
+ const preJson = (0, node_path.join)(root, ".changeset", "pre.json");
137
+ if ((0, node_fs.existsSync)(preJson)) (0, node_fs.cpSync)(preJson, (0, node_path.join)(tempRoot, ".changeset", "pre.json"));
138
+ for (const p of packages.packages) {
139
+ const tDir = mapDir(p.dir);
140
+ (0, node_fs.mkdirSync)(tDir, { recursive: true });
141
+ (0, node_fs.cpSync)((0, node_path.join)(p.dir, "package.json"), (0, node_path.join)(tDir, "package.json"));
142
+ const realCl = (0, node_path.join)(p.dir, "CHANGELOG.md");
143
+ if ((0, node_fs.existsSync)(realCl)) (0, node_fs.cpSync)(realCl, (0, node_path.join)(tDir, "CHANGELOG.md"));
144
+ }
145
+ const rootCl = (0, node_path.join)(packages.root.dir, "CHANGELOG.md");
146
+ if ((0, node_fs.existsSync)(rootCl)) (0, node_fs.cpSync)(rootCl, (0, node_path.join)(tempRoot, "CHANGELOG.md"));
147
+ await require_changesets_apply_release_plan_esm.applyReleasePlan(plan, tempPackages, config, void 0, root);
148
+ const dirByName = /* @__PURE__ */ new Map();
149
+ for (const p of tempPackages.packages) dirByName.set(p.packageJson.name, p.dir);
150
+ if (tempPackages.root.packageJson.name) dirByName.set(tempPackages.root.packageJson.name, tempRoot);
151
+ const releases = [];
152
+ for (const r of releasesToRender) {
153
+ const dir = dirByName.get(r.name);
154
+ if (!dir) continue;
155
+ const clPath = (0, node_path.join)(dir, "CHANGELOG.md");
156
+ if (!(0, node_fs.existsSync)(clPath)) continue;
157
+ require_transformer.ChangelogTransformer.transformFile(clPath);
158
+ const content = (0, node_fs.readFileSync)(clPath, "utf-8");
159
+ releases.push({
160
+ name: r.name,
161
+ type: r.type,
162
+ oldVersion: r.oldVersion,
163
+ newVersion: r.newVersion,
164
+ changesetIds: [...r.changesets],
165
+ changelogEntry: extractVersionBlock(content, r.newVersion)
166
+ });
167
+ }
168
+ return {
169
+ preMode,
170
+ releases,
171
+ changesets
172
+ };
173
+ } finally {
174
+ (0, node_fs.rmSync)(tempRoot, {
175
+ recursive: true,
176
+ force: true
177
+ });
178
+ }
179
+ }
180
+ /** Re-read a package's version from disk (post-bump) to feed versionFiles. */
181
+ function diskVersion(workspaceDir, fallback) {
182
+ try {
183
+ return JSON.parse((0, node_fs.readFileSync)((0, node_path.join)(workspaceDir, "package.json"), "utf-8")).version ?? fallback;
184
+ } catch {
185
+ return fallback;
186
+ }
187
+ }
188
+ function applyEffect(root, dryRun, inspector) {
189
+ return effect.Effect.gen(function* () {
190
+ const { plan, packages, config } = yield* effect.Effect.tryPromise({
191
+ try: async () => {
192
+ const [plan, packages] = await Promise.all([require_changesets_get_release_plan_esm.getReleasePlan(root), buildPackages(root)]);
193
+ return {
194
+ plan,
195
+ packages,
196
+ config: await require_changesets_config_esm.read(root, packages)
197
+ };
198
+ },
199
+ catch: (e) => new require_errors.ReleasePlanError({
200
+ phase: "apply",
201
+ reason: errMsg(e)
202
+ })
203
+ });
204
+ const releases = plan.releases.filter((r) => r.type !== "none").map((r) => ({
205
+ name: r.name,
206
+ type: r.type,
207
+ oldVersion: r.oldVersion,
208
+ newVersion: r.newVersion
209
+ }));
210
+ let touchedFiles = [];
211
+ if (!dryRun) touchedFiles = yield* effect.Effect.tryPromise({
212
+ try: async () => {
213
+ const touched = await require_changesets_apply_release_plan_esm.applyReleasePlan(plan, packages, config);
214
+ for (const f of touched) if (f.endsWith("CHANGELOG.md")) require_transformer.ChangelogTransformer.transformFile(f);
215
+ return touched;
216
+ },
217
+ catch: (e) => new require_errors.ReleasePlanError({
218
+ phase: "apply",
219
+ reason: errMsg(e)
220
+ })
221
+ });
222
+ const newVersionByName = new Map(plan.releases.map((r) => [r.name, r.newVersion]));
223
+ const inspected = yield* inspector.inspect(root).pipe(effect.Effect.catchAll((error) => effect.Effect.logWarning(`Skipping versionFiles update: ${errMsg(error)}`).pipe(effect.Effect.as(null))));
224
+ let versionFileUpdates = [];
225
+ if (inspected) versionFileUpdates = yield* effect.Effect.try({
226
+ try: () => {
227
+ const scopes = inspected.packages.filter((p) => p.versionFiles.length > 0).map((p) => {
228
+ const fresh = dryRun ? newVersionByName.get(p.name) ?? p.version : diskVersion(p.workspaceDir, p.version);
229
+ return fresh !== p.version ? {
230
+ ...p,
231
+ version: fresh
232
+ } : p;
233
+ });
234
+ return scopes.length > 0 ? require_version_files.VersionFiles.processResolvedVersionFiles(scopes, dryRun) : [];
235
+ },
236
+ catch: (e) => new require_errors.ReleasePlanError({
237
+ phase: "apply",
238
+ reason: errMsg(e)
239
+ })
240
+ });
241
+ return {
242
+ dryRun,
243
+ touchedFiles,
244
+ releases,
245
+ versionFileUpdates
246
+ };
247
+ });
248
+ }
249
+
250
+ //#endregion
251
+ exports.ReleasePlanner = ReleasePlanner;
252
+ exports.ReleasePlannerBase = ReleasePlannerBase;
253
+ exports.ReleasePlannerLive = ReleasePlannerLive;
254
+ exports.makeReleasePlannerTest = makeReleasePlannerTest;
@@ -0,0 +1,251 @@
1
+ import { ReleasePlanError } from "../errors.js";
2
+ import { ChangelogTransformer } from "../api/transformer.js";
3
+ import { ConfigInspector } from "./config-inspector.js";
4
+ import { VersionFiles } from "../utils/version-files.js";
5
+ import { require_get_packages_cjs } from "../../../../../../../node_modules/.pnpm/@manypkg_get-packages@1.1.3/node_modules/@manypkg/get-packages/dist/get-packages.cjs.js";
6
+ import { read } from "../../../../../../../node_modules/.pnpm/@changesets_config@3.1.4/node_modules/@changesets/config/dist/changesets-config.esm.js";
7
+ import { applyReleasePlan } from "../../../../../../../node_modules/.pnpm/@changesets_apply-release-plan@7.1.1/node_modules/@changesets/apply-release-plan/dist/changesets-apply-release-plan.esm.js";
8
+ import { getReleasePlan } from "../../../../../../../node_modules/.pnpm/@changesets_get-release-plan@4.0.16/node_modules/@changesets/get-release-plan/dist/changesets-get-release-plan.esm.js";
9
+ import { Context, Effect, Layer } from "effect";
10
+ import { isAbsolute, join, relative } from "node:path";
11
+ import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
12
+ import { tmpdir } from "node:os";
13
+
14
+ //#region ../silk-effects/dist/dev/pkg/changesets/services/release-planner.js
15
+ var import_get_packages_cjs = require_get_packages_cjs();
16
+ /**
17
+ * `ReleasePlanner` service — drive the genuine changesets release engine to
18
+ * compute a plan, render a read-only preview, or natively apply a release.
19
+ *
20
+ * @remarks
21
+ * `preview` and `apply` both run the real `@changesets/apply-release-plan`;
22
+ * `preview` redirects every write into a throwaway temp directory by handing
23
+ * the engine a `@manypkg`-shaped `Packages` object whose `dir`s point at temp,
24
+ * then reads the generated CHANGELOG blocks back. No changesets-internal logic
25
+ * (e.g. `getChangelogEntry`) is re-implemented.
26
+ *
27
+ */
28
+ /** Single workspace-discovery seam; swap to an Effect-native stack later here. */
29
+ const buildPackages = (root) => (0, import_get_packages_cjs.getPackages)(root);
30
+ const errMsg = (e) => e instanceof Error ? e.message : String(e);
31
+ /**
32
+ * Base class for {@link ReleasePlanner}.
33
+ *
34
+ * @privateRemarks Required export for api-extractor (anonymous Context.Tag base). Do not delete.
35
+ * @internal
36
+ */
37
+ const ReleasePlannerBase = Context.Tag("ReleasePlanner")();
38
+ /** Effect service tag for the release planner. @public */
39
+ var ReleasePlanner = class extends ReleasePlannerBase {};
40
+ /** Build the service shape over a resolved {@link ConfigInspector}. */
41
+ function makeShape(inspector) {
42
+ const plan = (root) => Effect.tryPromise({
43
+ try: () => getReleasePlan(root),
44
+ catch: (e) => new ReleasePlanError({
45
+ phase: "plan",
46
+ reason: errMsg(e)
47
+ })
48
+ });
49
+ const preview = (root) => Effect.tryPromise({
50
+ try: () => previewImpl(root),
51
+ catch: (e) => new ReleasePlanError({
52
+ phase: "preview",
53
+ reason: errMsg(e)
54
+ })
55
+ });
56
+ const apply = (root, options) => applyEffect(root, options?.dryRun ?? false, inspector);
57
+ return {
58
+ plan,
59
+ preview,
60
+ apply
61
+ };
62
+ }
63
+ /** Production layer. Requires {@link ConfigInspector} (used by `apply`). @public */
64
+ const ReleasePlannerLive = Layer.effect(ReleasePlanner, Effect.gen(function* () {
65
+ return makeShape(yield* ConfigInspector);
66
+ }));
67
+ /**
68
+ * Test factory — supply fixed results for any subset of methods. Unsupplied
69
+ * methods fail with a `ReleasePlanError`.
70
+ *
71
+ * @public
72
+ */
73
+ function makeReleasePlannerTest(fixed) {
74
+ const fail = (phase) => Effect.fail(new ReleasePlanError({
75
+ phase,
76
+ reason: "not provided in test layer"
77
+ }));
78
+ return Layer.succeed(ReleasePlanner, {
79
+ plan: () => fixed.plan ? Effect.succeed(fixed.plan) : fail("plan"),
80
+ preview: () => fixed.preview ? Effect.succeed(fixed.preview) : fail("preview"),
81
+ apply: () => fixed.apply ? Effect.succeed(fixed.apply) : fail("apply")
82
+ });
83
+ }
84
+ /** Extract the `## <version>` block (down to the next H2 or EOF) from a changelog. */
85
+ function extractVersionBlock(changelog, version) {
86
+ const lines = changelog.split("\n");
87
+ const start = lines.findIndex((l) => l.trim() === `## ${version}`);
88
+ if (start === -1) return "";
89
+ let end = lines.length;
90
+ for (let i = start + 1; i < lines.length; i++) if (/^## /.test(lines[i])) {
91
+ end = i;
92
+ break;
93
+ }
94
+ return lines.slice(start, end).join("\n").trim();
95
+ }
96
+ async function previewImpl(root) {
97
+ const [plan, packages] = await Promise.all([getReleasePlan(root), buildPackages(root)]);
98
+ const config = await read(root, packages);
99
+ const preMode = plan.preState ? plan.preState.mode : null;
100
+ const changesets = plan.changesets.map((cs) => ({
101
+ id: cs.id,
102
+ summary: cs.summary,
103
+ releases: cs.releases.filter((r) => r.type !== "none").map((r) => ({
104
+ name: r.name,
105
+ type: r.type
106
+ }))
107
+ }));
108
+ const releasesToRender = plan.releases.filter((r) => r.type !== "none");
109
+ if (releasesToRender.length === 0) return {
110
+ preMode,
111
+ releases: [],
112
+ changesets
113
+ };
114
+ const tempRoot = mkdtempSync(join(tmpdir(), "silk-preview-"));
115
+ try {
116
+ const mapDir = (dir) => {
117
+ const rel = relative(packages.root.dir, dir);
118
+ if (rel.startsWith("..") || isAbsolute(rel)) throw new Error(`Package directory is outside the workspace root: ${dir}`);
119
+ return join(tempRoot, rel);
120
+ };
121
+ const tempPackages = {
122
+ tool: packages.tool,
123
+ root: {
124
+ ...packages.root,
125
+ dir: tempRoot,
126
+ packageJson: structuredClone(packages.root.packageJson)
127
+ },
128
+ packages: packages.packages.map((p) => ({
129
+ ...p,
130
+ dir: mapDir(p.dir),
131
+ packageJson: structuredClone(p.packageJson)
132
+ }))
133
+ };
134
+ mkdirSync(join(tempRoot, ".changeset"), { recursive: true });
135
+ cpSync(join(root, "package.json"), join(tempRoot, "package.json"));
136
+ const preJson = join(root, ".changeset", "pre.json");
137
+ if (existsSync(preJson)) cpSync(preJson, join(tempRoot, ".changeset", "pre.json"));
138
+ for (const p of packages.packages) {
139
+ const tDir = mapDir(p.dir);
140
+ mkdirSync(tDir, { recursive: true });
141
+ cpSync(join(p.dir, "package.json"), join(tDir, "package.json"));
142
+ const realCl = join(p.dir, "CHANGELOG.md");
143
+ if (existsSync(realCl)) cpSync(realCl, join(tDir, "CHANGELOG.md"));
144
+ }
145
+ const rootCl = join(packages.root.dir, "CHANGELOG.md");
146
+ if (existsSync(rootCl)) cpSync(rootCl, join(tempRoot, "CHANGELOG.md"));
147
+ await applyReleasePlan(plan, tempPackages, config, void 0, root);
148
+ const dirByName = /* @__PURE__ */ new Map();
149
+ for (const p of tempPackages.packages) dirByName.set(p.packageJson.name, p.dir);
150
+ if (tempPackages.root.packageJson.name) dirByName.set(tempPackages.root.packageJson.name, tempRoot);
151
+ const releases = [];
152
+ for (const r of releasesToRender) {
153
+ const dir = dirByName.get(r.name);
154
+ if (!dir) continue;
155
+ const clPath = join(dir, "CHANGELOG.md");
156
+ if (!existsSync(clPath)) continue;
157
+ ChangelogTransformer.transformFile(clPath);
158
+ const content = readFileSync(clPath, "utf-8");
159
+ releases.push({
160
+ name: r.name,
161
+ type: r.type,
162
+ oldVersion: r.oldVersion,
163
+ newVersion: r.newVersion,
164
+ changesetIds: [...r.changesets],
165
+ changelogEntry: extractVersionBlock(content, r.newVersion)
166
+ });
167
+ }
168
+ return {
169
+ preMode,
170
+ releases,
171
+ changesets
172
+ };
173
+ } finally {
174
+ rmSync(tempRoot, {
175
+ recursive: true,
176
+ force: true
177
+ });
178
+ }
179
+ }
180
+ /** Re-read a package's version from disk (post-bump) to feed versionFiles. */
181
+ function diskVersion(workspaceDir, fallback) {
182
+ try {
183
+ return JSON.parse(readFileSync(join(workspaceDir, "package.json"), "utf-8")).version ?? fallback;
184
+ } catch {
185
+ return fallback;
186
+ }
187
+ }
188
+ function applyEffect(root, dryRun, inspector) {
189
+ return Effect.gen(function* () {
190
+ const { plan, packages, config } = yield* Effect.tryPromise({
191
+ try: async () => {
192
+ const [plan, packages] = await Promise.all([getReleasePlan(root), buildPackages(root)]);
193
+ return {
194
+ plan,
195
+ packages,
196
+ config: await read(root, packages)
197
+ };
198
+ },
199
+ catch: (e) => new ReleasePlanError({
200
+ phase: "apply",
201
+ reason: errMsg(e)
202
+ })
203
+ });
204
+ const releases = plan.releases.filter((r) => r.type !== "none").map((r) => ({
205
+ name: r.name,
206
+ type: r.type,
207
+ oldVersion: r.oldVersion,
208
+ newVersion: r.newVersion
209
+ }));
210
+ let touchedFiles = [];
211
+ if (!dryRun) touchedFiles = yield* Effect.tryPromise({
212
+ try: async () => {
213
+ const touched = await applyReleasePlan(plan, packages, config);
214
+ for (const f of touched) if (f.endsWith("CHANGELOG.md")) ChangelogTransformer.transformFile(f);
215
+ return touched;
216
+ },
217
+ catch: (e) => new ReleasePlanError({
218
+ phase: "apply",
219
+ reason: errMsg(e)
220
+ })
221
+ });
222
+ const newVersionByName = new Map(plan.releases.map((r) => [r.name, r.newVersion]));
223
+ const inspected = yield* inspector.inspect(root).pipe(Effect.catchAll((error) => Effect.logWarning(`Skipping versionFiles update: ${errMsg(error)}`).pipe(Effect.as(null))));
224
+ let versionFileUpdates = [];
225
+ if (inspected) versionFileUpdates = yield* Effect.try({
226
+ try: () => {
227
+ const scopes = inspected.packages.filter((p) => p.versionFiles.length > 0).map((p) => {
228
+ const fresh = dryRun ? newVersionByName.get(p.name) ?? p.version : diskVersion(p.workspaceDir, p.version);
229
+ return fresh !== p.version ? {
230
+ ...p,
231
+ version: fresh
232
+ } : p;
233
+ });
234
+ return scopes.length > 0 ? VersionFiles.processResolvedVersionFiles(scopes, dryRun) : [];
235
+ },
236
+ catch: (e) => new ReleasePlanError({
237
+ phase: "apply",
238
+ reason: errMsg(e)
239
+ })
240
+ });
241
+ return {
242
+ dryRun,
243
+ touchedFiles,
244
+ releases,
245
+ versionFileUpdates
246
+ };
247
+ });
248
+ }
249
+
250
+ //#endregion
251
+ export { ReleasePlanner, ReleasePlannerBase, ReleasePlannerLive, makeReleasePlannerTest };
@@ -1,4 +1,4 @@
1
- const require_index = require('../../../../../../../node_modules/.pnpm/workspaces-effect@1.2.0_@effect_platform@0.96.1_effect@3.21.3__effect@3.21.3/node_modules/workspaces-effect/index.cjs');
1
+ const require_index = require('../../../../../../../node_modules/.pnpm/workspaces-effect@1.2.0_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/index.cjs');
2
2
  let effect = require("effect");
3
3
 
4
4
  //#region ../silk-effects/dist/dev/pkg/changesets/utils/publishability.js
@@ -7,18 +7,17 @@ let effect = require("effect");
7
7
  *
8
8
  * @remarks
9
9
  * Provides `listPublishablePackageNames`, a convenience wrapper around
10
- * {@link PublishabilityDetector} that returns a `Set<string>` of
10
+ * {@link SilkPublishability} that returns a `Set<string>` of
11
11
  * publishable package names. Used by the `deps detect` and `deps regen`
12
12
  * commands to filter out workspace packages whose dependency changes
13
13
  * would never reach a release.
14
14
  *
15
- * @packageDocumentation
16
15
  */
17
16
  /**
18
17
  * Compute the set of currently-publishable workspace package names.
19
18
  *
20
19
  * @remarks
21
- * Uses the currently-active {@link PublishabilityDetector} — wire the
20
+ * Uses the currently-active {@link SilkPublishability} — wire the
22
21
  * {@link SilkPublishabilityDetectorLive} layer to get silk semantics.
23
22
  *
24
23
  * @param packages - The workspace packages to evaluate
@@ -1,4 +1,4 @@
1
- import { PublishabilityDetector } from "../../../../../../../node_modules/.pnpm/workspaces-effect@1.2.0_@effect_platform@0.96.1_effect@3.21.3__effect@3.21.3/node_modules/workspaces-effect/index.js";
1
+ import { PublishabilityDetector } from "../../../../../../../node_modules/.pnpm/workspaces-effect@1.2.0_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/index.js";
2
2
  import { Effect } from "effect";
3
3
 
4
4
  //#region ../silk-effects/dist/dev/pkg/changesets/utils/publishability.js
@@ -7,18 +7,17 @@ import { Effect } from "effect";
7
7
  *
8
8
  * @remarks
9
9
  * Provides `listPublishablePackageNames`, a convenience wrapper around
10
- * {@link PublishabilityDetector} that returns a `Set<string>` of
10
+ * {@link SilkPublishability} that returns a `Set<string>` of
11
11
  * publishable package names. Used by the `deps detect` and `deps regen`
12
12
  * commands to filter out workspace packages whose dependency changes
13
13
  * would never reach a release.
14
14
  *
15
- * @packageDocumentation
16
15
  */
17
16
  /**
18
17
  * Compute the set of currently-publishable workspace package names.
19
18
  *
20
19
  * @remarks
21
- * Uses the currently-active {@link PublishabilityDetector} — wire the
20
+ * Uses the currently-active {@link SilkPublishability} — wire the
22
21
  * {@link SilkPublishabilityDetectorLive} layer to get silk semantics.
23
22
  *
24
23
  * @param packages - The workspace packages to evaluate
@@ -81,7 +81,7 @@ function normalizeWorkspaceGlob(glob) {
81
81
  */
82
82
  function snapshotFromWorktree(cwd) {
83
83
  const snapshots = [];
84
- const dirs = new Set([cwd]);
84
+ const dirs = /* @__PURE__ */ new Set([cwd]);
85
85
  for (const dir of expandWorkspaceDirs(cwd)) dirs.add(dir);
86
86
  for (const dir of dirs) try {
87
87
  const pkgJson = JSON.parse((0, node_fs.readFileSync)((0, node_path.join)(dir, "package.json"), "utf8"));
@@ -81,7 +81,7 @@ function normalizeWorkspaceGlob(glob) {
81
81
  */
82
82
  function snapshotFromWorktree(cwd) {
83
83
  const snapshots = [];
84
- const dirs = new Set([cwd]);
84
+ const dirs = /* @__PURE__ */ new Set([cwd]);
85
85
  for (const dir of expandWorkspaceDirs(cwd)) dirs.add(dir);
86
86
  for (const dir of dirs) try {
87
87
  const pkgJson = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
@@ -5,10 +5,11 @@ let effect = require("effect");
5
5
  * Raised when the `.changeset/config.json` file cannot be read or decoded.
6
6
  *
7
7
  * @remarks
8
- * Returned by {@link ChangesetConfigReader.read} when the file is missing,
8
+ * Returned by `ChangesetConfigReader.read` when the file is missing,
9
9
  * contains invalid JSON, or fails Effect Schema validation.
10
10
  *
11
11
  * @since 0.1.0
12
+ * @public
12
13
  */
13
14
  var ChangesetConfigError = class extends effect.Data.TaggedError("ChangesetConfigError") {
14
15
  get message() {