@savvy-web/silk 2.0.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/changesets-changelog.cjs +109 -61
- package/changesets-changelog.d.cts +1 -1
- package/changesets-changelog.d.ts +1 -1
- package/changesets-changelog.js +54099 -1
- package/changesets-markdownlint.cjs +109 -61
- package/changesets-markdownlint.d.cts +1 -1
- package/changesets-markdownlint.d.ts +1 -1
- package/changesets-markdownlint.js +54099 -1
- package/package.json +5 -4
- package/tsconfig/node/dist/tsconfig.tsbuildinfo +1 -1
- package/_virtual/_rolldown/runtime.cjs +0 -45
- package/_virtual/_rolldown/runtime.js +0 -45
- package/packages/silk-effects/dist/dev/pkg/_virtual/_rolldown/runtime.cjs +0 -15
- package/packages/silk-effects/dist/dev/pkg/_virtual/_rolldown/runtime.js +0 -14
- package/packages/silk-effects/dist/dev/pkg/changesets/api/categories.cjs +0 -247
- package/packages/silk-effects/dist/dev/pkg/changesets/api/categories.js +0 -247
- package/packages/silk-effects/dist/dev/pkg/changesets/api/changelog.cjs +0 -134
- package/packages/silk-effects/dist/dev/pkg/changesets/api/changelog.js +0 -134
- package/packages/silk-effects/dist/dev/pkg/changesets/api/dependency-table.cjs +0 -163
- package/packages/silk-effects/dist/dev/pkg/changesets/api/dependency-table.js +0 -163
- package/packages/silk-effects/dist/dev/pkg/changesets/api/linter.cjs +0 -170
- package/packages/silk-effects/dist/dev/pkg/changesets/api/linter.js +0 -170
- package/packages/silk-effects/dist/dev/pkg/changesets/api/transformer.cjs +0 -134
- package/packages/silk-effects/dist/dev/pkg/changesets/api/transformer.js +0 -134
- package/packages/silk-effects/dist/dev/pkg/changesets/categories/index.cjs +0 -317
- package/packages/silk-effects/dist/dev/pkg/changesets/categories/index.js +0 -299
- package/packages/silk-effects/dist/dev/pkg/changesets/categories/types.cjs +0 -65
- package/packages/silk-effects/dist/dev/pkg/changesets/categories/types.js +0 -65
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/formatting.cjs +0 -114
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/formatting.js +0 -113
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getDependencyReleaseLine.cjs +0 -118
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getDependencyReleaseLine.js +0 -118
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getReleaseLine.cjs +0 -122
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getReleaseLine.js +0 -122
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/index.cjs +0 -97
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/index.js +0 -97
- package/packages/silk-effects/dist/dev/pkg/changesets/constants.cjs +0 -43
- package/packages/silk-effects/dist/dev/pkg/changesets/constants.js +0 -42
- package/packages/silk-effects/dist/dev/pkg/changesets/errors.cjs +0 -386
- package/packages/silk-effects/dist/dev/pkg/changesets/errors.js +0 -371
- package/packages/silk-effects/dist/dev/pkg/changesets/index.cjs +0 -300
- package/packages/silk-effects/dist/dev/pkg/changesets/index.js +0 -179
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/index.cjs +0 -34
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/index.js +0 -29
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/content-structure.cjs +0 -98
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/content-structure.js +0 -98
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/dependency-table-format.cjs +0 -170
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/dependency-table-format.js +0 -170
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/heading-hierarchy.cjs +0 -61
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/heading-hierarchy.js +0 -61
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/required-sections.cjs +0 -54
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/required-sections.js +0 -54
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/uncategorized-content.cjs +0 -54
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/uncategorized-content.js +0 -54
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/utils.cjs +0 -31
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/utils.js +0 -30
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/aggregate-dependency-tables.cjs +0 -47
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/aggregate-dependency-tables.js +0 -47
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/contributor-footnotes.cjs +0 -123
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/contributor-footnotes.js +0 -123
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/deduplicate-items.cjs +0 -32
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/deduplicate-items.js +0 -32
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/issue-link-refs.cjs +0 -59
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/issue-link-refs.js +0 -59
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/maintenance-note.cjs +0 -61
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/maintenance-note.js +0 -61
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/merge-sections.cjs +0 -43
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/merge-sections.js +0 -43
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/normalize-format.cjs +0 -47
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/normalize-format.js +0 -47
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/reorder-sections.cjs +0 -34
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/reorder-sections.js +0 -34
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/presets.cjs +0 -120
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/presets.js +0 -119
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/content-structure.cjs +0 -22
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/content-structure.js +0 -22
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/dependency-table-format.cjs +0 -40
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/dependency-table-format.js +0 -40
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/heading-hierarchy.cjs +0 -19
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/heading-hierarchy.js +0 -19
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/required-sections.cjs +0 -17
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/required-sections.js +0 -17
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/uncategorized-content.cjs +0 -31
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/uncategorized-content.js +0 -31
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/changeset.cjs +0 -148
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/changeset.js +0 -145
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/dependency-table.cjs +0 -203
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/dependency-table.js +0 -198
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/git.cjs +0 -69
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/git.js +0 -68
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/github.cjs +0 -177
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/github.js +0 -174
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/options.cjs +0 -183
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/options.js +0 -181
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/package-scope.cjs +0 -129
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/package-scope.js +0 -127
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/primitives.cjs +0 -72
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/primitives.js +0 -71
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/release-plan.cjs +0 -62
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/release-plan.js +0 -56
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/version-files.cjs +0 -154
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/version-files.js +0 -150
- package/packages/silk-effects/dist/dev/pkg/changesets/services/branch-analyzer.cjs +0 -300
- package/packages/silk-effects/dist/dev/pkg/changesets/services/branch-analyzer.js +0 -294
- package/packages/silk-effects/dist/dev/pkg/changesets/services/changelog.cjs +0 -50
- package/packages/silk-effects/dist/dev/pkg/changesets/services/changelog.js +0 -49
- package/packages/silk-effects/dist/dev/pkg/changesets/services/config-inspector.cjs +0 -489
- package/packages/silk-effects/dist/dev/pkg/changesets/services/config-inspector.js +0 -481
- package/packages/silk-effects/dist/dev/pkg/changesets/services/deps-regen.cjs +0 -375
- package/packages/silk-effects/dist/dev/pkg/changesets/services/deps-regen.js +0 -371
- package/packages/silk-effects/dist/dev/pkg/changesets/services/github.cjs +0 -160
- package/packages/silk-effects/dist/dev/pkg/changesets/services/github.js +0 -157
- package/packages/silk-effects/dist/dev/pkg/changesets/services/maintenance-reason.cjs +0 -68
- package/packages/silk-effects/dist/dev/pkg/changesets/services/maintenance-reason.js +0 -66
- package/packages/silk-effects/dist/dev/pkg/changesets/services/markdown.cjs +0 -87
- package/packages/silk-effects/dist/dev/pkg/changesets/services/markdown.js +0 -85
- package/packages/silk-effects/dist/dev/pkg/changesets/services/release-planner.cjs +0 -352
- package/packages/silk-effects/dist/dev/pkg/changesets/services/release-planner.js +0 -348
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/commit-parser.cjs +0 -81
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/commit-parser.js +0 -80
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/dep-diff.cjs +0 -111
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/dep-diff.js +0 -111
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/dependency-table.cjs +0 -351
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/dependency-table.js +0 -347
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/git.cjs +0 -51
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/git.js +0 -51
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/issue-refs.cjs +0 -102
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/issue-refs.js +0 -101
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/jsonpath.cjs +0 -178
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/jsonpath.js +0 -175
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/logger.cjs +0 -51
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/logger.js +0 -50
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/markdown-link.cjs +0 -59
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/markdown-link.js +0 -57
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/publishability.cjs +0 -50
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/publishability.js +0 -50
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/remark-pipeline.cjs +0 -81
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/remark-pipeline.js +0 -79
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/section-parser.cjs +0 -94
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/section-parser.js +0 -94
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/strip-frontmatter.cjs +0 -47
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/strip-frontmatter.js +0 -46
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/version-blocks.cjs +0 -110
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/version-blocks.js +0 -108
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/version-files.cjs +0 -336
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/version-files.js +0 -336
- package/packages/silk-effects/dist/dev/pkg/changesets/vendor/github-info.cjs +0 -77
- package/packages/silk-effects/dist/dev/pkg/changesets/vendor/github-info.js +0 -77
- package/packages/silk-effects/dist/dev/pkg/errors/ChangesetConfigError.cjs +0 -21
- package/packages/silk-effects/dist/dev/pkg/errors/ChangesetConfigError.js +0 -21
- package/packages/silk-effects/dist/dev/pkg/schemas/VersioningSchemas.cjs +0 -101
- package/packages/silk-effects/dist/dev/pkg/schemas/VersioningSchemas.js +0 -99
- package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfig.cjs +0 -81
- package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfig.js +0 -80
- package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfigReader.cjs +0 -109
- package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfigReader.js +0 -108
- package/packages/silk-effects/dist/dev/pkg/services/SilkPublishability.cjs +0 -238
- package/packages/silk-effects/dist/dev/pkg/services/SilkPublishability.js +0 -236
|
@@ -1,348 +0,0 @@
|
|
|
1
|
-
import { ReleasePlanError } from "../errors.js";
|
|
2
|
-
import { ChangelogTransformer } from "../api/transformer.js";
|
|
3
|
-
import { ConfigInspector } from "./config-inspector.js";
|
|
4
|
-
import { deriveMaintenanceReason } from "./maintenance-reason.js";
|
|
5
|
-
import { VersionFiles } from "../utils/version-files.js";
|
|
6
|
-
import { getPackages } from "../../../../../../../node_modules/.pnpm/@manypkg_get-packages@3.1.0/node_modules/@manypkg/get-packages/dist/manypkg-get-packages.js";
|
|
7
|
-
import { readConfig } from "../../../../../../../node_modules/.pnpm/@changesets_config@4.0.0-next.6/node_modules/@changesets/config/dist/index.js";
|
|
8
|
-
import { applyReleasePlan } from "../../../../../../../node_modules/.pnpm/@changesets_apply-release-plan@8.0.0-next.7/node_modules/@changesets/apply-release-plan/dist/index.js";
|
|
9
|
-
import { getReleasePlan } from "../../../../../../../node_modules/.pnpm/@changesets_get-release-plan@5.0.0-next.7/node_modules/@changesets/get-release-plan/dist/index.js";
|
|
10
|
-
import { Context, Effect, Layer } from "effect";
|
|
11
|
-
import { FileSystem } from "@effect/platform";
|
|
12
|
-
import { dirname, isAbsolute, join, relative } from "node:path";
|
|
13
|
-
|
|
14
|
-
//#region ../silk-effects/dist/dev/pkg/changesets/services/release-planner.js
|
|
15
|
-
/**
|
|
16
|
-
* `ReleasePlanner` service — drive the genuine changesets release engine to
|
|
17
|
-
* compute a plan, render a read-only preview, or natively apply a release.
|
|
18
|
-
*
|
|
19
|
-
* @remarks
|
|
20
|
-
* `preview` and `apply` both run the real `@changesets/apply-release-plan`;
|
|
21
|
-
* `preview` redirects every write into a throwaway temp directory by handing
|
|
22
|
-
* the engine a `@manypkg`-shaped `Packages` object whose `dir`s point at temp,
|
|
23
|
-
* then reads the generated CHANGELOG blocks back. No changesets-internal logic
|
|
24
|
-
* (e.g. `getChangelogEntry`) is re-implemented.
|
|
25
|
-
*
|
|
26
|
-
*/
|
|
27
|
-
const errMsg = (e) => e instanceof Error ? e.message : String(e);
|
|
28
|
-
/**
|
|
29
|
-
* Read the changesets config, surfacing non-throwing `readConfig` errors as a
|
|
30
|
-
* thrown `Error` so callers inside `Effect.tryPromise` land on the existing
|
|
31
|
-
* `ReleasePlanError` mapping. Warnings are returned alongside the config so
|
|
32
|
-
* the caller can log them via the Effect runtime rather than console output.
|
|
33
|
-
*/
|
|
34
|
-
async function loadConfig(root, packages) {
|
|
35
|
-
const configResult = await readConfig(root, packages);
|
|
36
|
-
if (configResult.config === void 0) throw new Error(`Invalid changeset config:\n${configResult.errors.join("\n")}`);
|
|
37
|
-
return {
|
|
38
|
-
config: configResult.config,
|
|
39
|
-
warnings: configResult.warnings
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Base class for {@link ReleasePlanner}.
|
|
44
|
-
*
|
|
45
|
-
* @privateRemarks Required export for api-extractor (anonymous Context.Tag base). Do not delete.
|
|
46
|
-
* @internal
|
|
47
|
-
*/
|
|
48
|
-
const ReleasePlannerBase = Context.Tag("ReleasePlanner")();
|
|
49
|
-
/** Effect service tag for the release planner. @public */
|
|
50
|
-
var ReleasePlanner = class extends ReleasePlannerBase {};
|
|
51
|
-
/** Build the service shape over a resolved {@link ConfigInspector} and {@link FileSystem.FileSystem}. */
|
|
52
|
-
function makeShape(inspector, fs) {
|
|
53
|
-
const plan = (root) => Effect.tryPromise({
|
|
54
|
-
try: () => getReleasePlan(root),
|
|
55
|
-
catch: (e) => new ReleasePlanError({
|
|
56
|
-
phase: "plan",
|
|
57
|
-
reason: errMsg(e)
|
|
58
|
-
})
|
|
59
|
-
});
|
|
60
|
-
const preview = (root) => previewEffect(root, fs);
|
|
61
|
-
const apply = (root, options) => applyEffect(root, options?.dryRun ?? false, options?.changelogModules, inspector, fs);
|
|
62
|
-
return {
|
|
63
|
-
plan,
|
|
64
|
-
preview,
|
|
65
|
-
apply
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
/** Production layer. Requires {@link ConfigInspector} (used by `apply`) and `FileSystem`. @public */
|
|
69
|
-
const ReleasePlannerLive = Layer.effect(ReleasePlanner, Effect.gen(function* () {
|
|
70
|
-
return makeShape(yield* ConfigInspector, yield* FileSystem.FileSystem);
|
|
71
|
-
}));
|
|
72
|
-
/**
|
|
73
|
-
* Test factory — supply fixed results for any subset of methods. Unsupplied
|
|
74
|
-
* methods fail with a `ReleasePlanError`.
|
|
75
|
-
*
|
|
76
|
-
* @public
|
|
77
|
-
*/
|
|
78
|
-
function makeReleasePlannerTest(fixed) {
|
|
79
|
-
const fail = (phase) => Effect.fail(new ReleasePlanError({
|
|
80
|
-
phase,
|
|
81
|
-
reason: "not provided in test layer"
|
|
82
|
-
}));
|
|
83
|
-
return Layer.succeed(ReleasePlanner, {
|
|
84
|
-
plan: () => fixed.plan ? Effect.succeed(fixed.plan) : fail("plan"),
|
|
85
|
-
preview: () => fixed.preview ? Effect.succeed(fixed.preview) : fail("preview"),
|
|
86
|
-
apply: () => fixed.apply ? Effect.succeed(fixed.apply) : fail("apply")
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
/** Extract the `## <version>` block (down to the next H2 or EOF) from a changelog. */
|
|
90
|
-
function extractVersionBlock(changelog, version) {
|
|
91
|
-
const lines = changelog.split("\n");
|
|
92
|
-
const start = lines.findIndex((l) => l.trim() === `## ${version}`);
|
|
93
|
-
if (start === -1) return "";
|
|
94
|
-
let end = lines.length;
|
|
95
|
-
for (let i = start + 1; i < lines.length; i++) if (/^## /.test(lines[i])) {
|
|
96
|
-
end = i;
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
return lines.slice(start, end).join("\n").trim();
|
|
100
|
-
}
|
|
101
|
-
/** Maintenance reasons for every changeset-less release in the plan, keyed by package name. */
|
|
102
|
-
function maintenanceReasons(plan, config) {
|
|
103
|
-
const reasons = /* @__PURE__ */ new Map();
|
|
104
|
-
for (const r of plan.releases) {
|
|
105
|
-
if (r.type === "none") continue;
|
|
106
|
-
const reason = deriveMaintenanceReason(r, plan, config);
|
|
107
|
-
if (reason) reasons.set(r.name, reason);
|
|
108
|
-
}
|
|
109
|
-
return reasons;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Render a non-destructive preview by redirecting every write into a
|
|
113
|
-
* scope-managed temp directory (cleaned up automatically when the scope
|
|
114
|
-
* closes) and reading the generated CHANGELOG blocks back.
|
|
115
|
-
*/
|
|
116
|
-
function previewEffect(root, fs) {
|
|
117
|
-
const program = Effect.gen(function* () {
|
|
118
|
-
const [plan, packages] = yield* Effect.tryPromise({
|
|
119
|
-
try: () => Promise.all([getReleasePlan(root), getPackages(root)]),
|
|
120
|
-
catch: (e) => new ReleasePlanError({
|
|
121
|
-
phase: "preview",
|
|
122
|
-
reason: errMsg(e)
|
|
123
|
-
})
|
|
124
|
-
});
|
|
125
|
-
if (!packages.rootPackage) return yield* Effect.fail(new ReleasePlanError({
|
|
126
|
-
phase: "preview",
|
|
127
|
-
reason: `Workspace root has no package.json: ${root}`
|
|
128
|
-
}));
|
|
129
|
-
const rootPackage = packages.rootPackage;
|
|
130
|
-
const { config, warnings } = yield* Effect.tryPromise({
|
|
131
|
-
try: () => loadConfig(root, packages),
|
|
132
|
-
catch: (e) => new ReleasePlanError({
|
|
133
|
-
phase: "preview",
|
|
134
|
-
reason: errMsg(e)
|
|
135
|
-
})
|
|
136
|
-
});
|
|
137
|
-
yield* Effect.forEach(warnings, (w) => Effect.logWarning(w));
|
|
138
|
-
const reasonByName = maintenanceReasons(plan, config);
|
|
139
|
-
const preMode = plan.preState ? plan.preState.mode : null;
|
|
140
|
-
const changesets = plan.changesets.map((cs) => ({
|
|
141
|
-
id: cs.id,
|
|
142
|
-
summary: cs.summary,
|
|
143
|
-
releases: cs.releases.filter((r) => r.type !== "none").map((r) => ({
|
|
144
|
-
name: r.name,
|
|
145
|
-
type: r.type
|
|
146
|
-
}))
|
|
147
|
-
}));
|
|
148
|
-
const releasesToRender = plan.releases.filter((r) => r.type !== "none");
|
|
149
|
-
if (releasesToRender.length === 0) return {
|
|
150
|
-
preMode,
|
|
151
|
-
releases: [],
|
|
152
|
-
changesets
|
|
153
|
-
};
|
|
154
|
-
const tempRoot = yield* fs.makeTempDirectoryScoped({ prefix: "silk-preview-" });
|
|
155
|
-
const mapDir = (dir) => {
|
|
156
|
-
const rel = relative(packages.rootDir, dir);
|
|
157
|
-
if (rel.startsWith("..") || isAbsolute(rel)) return Effect.fail(new ReleasePlanError({
|
|
158
|
-
phase: "preview",
|
|
159
|
-
reason: `Package directory is outside the workspace root: ${dir}`
|
|
160
|
-
}));
|
|
161
|
-
return Effect.succeed(join(tempRoot, rel));
|
|
162
|
-
};
|
|
163
|
-
const tempDirs = yield* Effect.forEach(packages.packages, (p) => mapDir(p.dir));
|
|
164
|
-
const tempPackages = {
|
|
165
|
-
tool: packages.tool,
|
|
166
|
-
rootDir: tempRoot,
|
|
167
|
-
rootPackage: {
|
|
168
|
-
dir: tempRoot,
|
|
169
|
-
packageJson: structuredClone(rootPackage.packageJson)
|
|
170
|
-
},
|
|
171
|
-
packages: packages.packages.map((p, i) => ({
|
|
172
|
-
dir: tempDirs[i],
|
|
173
|
-
packageJson: structuredClone(p.packageJson)
|
|
174
|
-
}))
|
|
175
|
-
};
|
|
176
|
-
yield* fs.makeDirectory(join(tempRoot, ".changeset"), { recursive: true });
|
|
177
|
-
yield* fs.copyFile(join(root, "package.json"), join(tempRoot, "package.json"));
|
|
178
|
-
const preJson = join(root, ".changeset", "pre.json");
|
|
179
|
-
if (yield* fs.exists(preJson)) yield* fs.copyFile(preJson, join(tempRoot, ".changeset", "pre.json"));
|
|
180
|
-
for (let i = 0; i < packages.packages.length; i++) {
|
|
181
|
-
const p = packages.packages[i];
|
|
182
|
-
const tDir = tempDirs[i];
|
|
183
|
-
yield* fs.makeDirectory(tDir, { recursive: true });
|
|
184
|
-
yield* fs.copyFile(join(p.dir, "package.json"), join(tDir, "package.json"));
|
|
185
|
-
const realCl = join(p.dir, "CHANGELOG.md");
|
|
186
|
-
if (yield* fs.exists(realCl)) yield* fs.copyFile(realCl, join(tDir, "CHANGELOG.md"));
|
|
187
|
-
}
|
|
188
|
-
const rootCl = join(packages.rootDir, "CHANGELOG.md");
|
|
189
|
-
if (yield* fs.exists(rootCl)) yield* fs.copyFile(rootCl, join(tempRoot, "CHANGELOG.md"));
|
|
190
|
-
yield* Effect.tryPromise({
|
|
191
|
-
try: () => applyReleasePlan(plan, tempPackages, config, void 0, root),
|
|
192
|
-
catch: (e) => new ReleasePlanError({
|
|
193
|
-
phase: "preview",
|
|
194
|
-
reason: errMsg(e)
|
|
195
|
-
})
|
|
196
|
-
});
|
|
197
|
-
const dirByName = /* @__PURE__ */ new Map();
|
|
198
|
-
for (const p of tempPackages.packages) dirByName.set(p.packageJson.name, p.dir);
|
|
199
|
-
if (tempPackages.rootPackage?.packageJson.name) dirByName.set(tempPackages.rootPackage.packageJson.name, tempRoot);
|
|
200
|
-
const releases = [];
|
|
201
|
-
for (const r of releasesToRender) {
|
|
202
|
-
const dir = dirByName.get(r.name);
|
|
203
|
-
if (!dir) continue;
|
|
204
|
-
const clPath = join(dir, "CHANGELOG.md");
|
|
205
|
-
if (!(yield* fs.exists(clPath))) continue;
|
|
206
|
-
const reason = reasonByName.get(r.name);
|
|
207
|
-
yield* Effect.try({
|
|
208
|
-
try: () => ChangelogTransformer.transformFile(clPath, reason ? { maintenance: {
|
|
209
|
-
version: r.newVersion,
|
|
210
|
-
reason
|
|
211
|
-
} } : void 0),
|
|
212
|
-
catch: (e) => new ReleasePlanError({
|
|
213
|
-
phase: "preview",
|
|
214
|
-
reason: errMsg(e)
|
|
215
|
-
})
|
|
216
|
-
});
|
|
217
|
-
const content = yield* fs.readFileString(clPath);
|
|
218
|
-
releases.push({
|
|
219
|
-
name: r.name,
|
|
220
|
-
type: r.type,
|
|
221
|
-
oldVersion: r.oldVersion,
|
|
222
|
-
newVersion: r.newVersion,
|
|
223
|
-
changesetIds: [...r.changesets],
|
|
224
|
-
changelogEntry: extractVersionBlock(content, r.newVersion)
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
return {
|
|
228
|
-
preMode,
|
|
229
|
-
releases,
|
|
230
|
-
changesets
|
|
231
|
-
};
|
|
232
|
-
});
|
|
233
|
-
return Effect.scoped(program).pipe(Effect.mapError((e) => e instanceof ReleasePlanError ? e : new ReleasePlanError({
|
|
234
|
-
phase: "preview",
|
|
235
|
-
reason: errMsg(e)
|
|
236
|
-
})));
|
|
237
|
-
}
|
|
238
|
-
/** Re-read a package's version from disk (post-bump) to feed versionFiles; unreadable/unparseable falls back. */
|
|
239
|
-
function diskVersion(workspaceDir, fallback, fs) {
|
|
240
|
-
return fs.readFileString(join(workspaceDir, "package.json")).pipe(Effect.flatMap((raw) => Effect.try(() => JSON.parse(raw).version ?? fallback)), Effect.orElseSucceed(() => fallback));
|
|
241
|
-
}
|
|
242
|
-
function applyEffect(root, dryRun, changelogModules, inspector, fs) {
|
|
243
|
-
return Effect.gen(function* () {
|
|
244
|
-
const { plan, packages, config, warnings } = yield* Effect.tryPromise({
|
|
245
|
-
try: async () => {
|
|
246
|
-
const [plan, packages] = await Promise.all([getReleasePlan(root), getPackages(root)]);
|
|
247
|
-
const { config, warnings } = await loadConfig(root, packages);
|
|
248
|
-
return {
|
|
249
|
-
plan,
|
|
250
|
-
packages,
|
|
251
|
-
config,
|
|
252
|
-
warnings
|
|
253
|
-
};
|
|
254
|
-
},
|
|
255
|
-
catch: (e) => new ReleasePlanError({
|
|
256
|
-
phase: "apply",
|
|
257
|
-
reason: errMsg(e)
|
|
258
|
-
})
|
|
259
|
-
});
|
|
260
|
-
yield* Effect.forEach(warnings, (w) => Effect.logWarning(w));
|
|
261
|
-
let engineConfig = config;
|
|
262
|
-
if (changelogModules) {
|
|
263
|
-
engineConfig = {
|
|
264
|
-
...config,
|
|
265
|
-
format: false
|
|
266
|
-
};
|
|
267
|
-
if (Array.isArray(config.changelog)) {
|
|
268
|
-
const configuredId = config.changelog[0];
|
|
269
|
-
const mapped = changelogModules[configuredId];
|
|
270
|
-
if (mapped === void 0) {
|
|
271
|
-
const supported = Object.keys(changelogModules).join(", ");
|
|
272
|
-
return yield* Effect.fail(new ReleasePlanError({
|
|
273
|
-
phase: "apply",
|
|
274
|
-
reason: `changelog id "${configuredId}" is not in changelogModules (supported: ${supported})`
|
|
275
|
-
}));
|
|
276
|
-
}
|
|
277
|
-
engineConfig = {
|
|
278
|
-
...engineConfig,
|
|
279
|
-
changelog: [mapped, config.changelog[1]]
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
const releases = plan.releases.filter((r) => r.type !== "none").map((r) => ({
|
|
284
|
-
name: r.name,
|
|
285
|
-
type: r.type,
|
|
286
|
-
oldVersion: r.oldVersion,
|
|
287
|
-
newVersion: r.newVersion
|
|
288
|
-
}));
|
|
289
|
-
let touchedFiles = [];
|
|
290
|
-
if (!dryRun) {
|
|
291
|
-
const reasonByName = maintenanceReasons(plan, config);
|
|
292
|
-
const versionByPkgName = new Map(plan.releases.map((r) => [r.name, r.newVersion]));
|
|
293
|
-
const nameByDir = /* @__PURE__ */ new Map();
|
|
294
|
-
for (const p of packages.packages) nameByDir.set(p.dir, p.packageJson.name);
|
|
295
|
-
if (packages.rootPackage?.packageJson.name) nameByDir.set(packages.rootDir, packages.rootPackage.packageJson.name);
|
|
296
|
-
touchedFiles = yield* Effect.tryPromise({
|
|
297
|
-
try: async () => {
|
|
298
|
-
const touched = await applyReleasePlan(plan, packages, engineConfig);
|
|
299
|
-
for (const f of touched) {
|
|
300
|
-
if (!f.endsWith("CHANGELOG.md")) continue;
|
|
301
|
-
const pkgName = nameByDir.get(dirname(f));
|
|
302
|
-
const reason = pkgName ? reasonByName.get(pkgName) : void 0;
|
|
303
|
-
const newVersion = pkgName ? versionByPkgName.get(pkgName) : void 0;
|
|
304
|
-
ChangelogTransformer.transformFile(f, reason && newVersion ? { maintenance: {
|
|
305
|
-
version: newVersion,
|
|
306
|
-
reason
|
|
307
|
-
} } : void 0);
|
|
308
|
-
}
|
|
309
|
-
return touched;
|
|
310
|
-
},
|
|
311
|
-
catch: (e) => new ReleasePlanError({
|
|
312
|
-
phase: "apply",
|
|
313
|
-
reason: errMsg(e)
|
|
314
|
-
})
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
const newVersionByName = new Map(plan.releases.map((r) => [r.name, r.newVersion]));
|
|
318
|
-
const inspected = yield* inspector.inspect(root).pipe(Effect.catchAll((error) => Effect.logWarning(`Skipping versionFiles update: ${errMsg(error)}`).pipe(Effect.as(null))));
|
|
319
|
-
let versionFileUpdates = [];
|
|
320
|
-
if (inspected) {
|
|
321
|
-
const candidates = inspected.packages.filter((p) => p.versionFiles.length > 0);
|
|
322
|
-
const freshVersions = yield* Effect.forEach(candidates, (p) => dryRun ? Effect.succeed(newVersionByName.get(p.name) ?? p.version) : diskVersion(p.workspaceDir, p.version, fs));
|
|
323
|
-
const scopes = candidates.map((p, i) => {
|
|
324
|
-
const fresh = freshVersions[i];
|
|
325
|
-
return fresh !== p.version ? {
|
|
326
|
-
...p,
|
|
327
|
-
version: fresh
|
|
328
|
-
} : p;
|
|
329
|
-
});
|
|
330
|
-
versionFileUpdates = yield* Effect.try({
|
|
331
|
-
try: () => scopes.length > 0 ? VersionFiles.processResolvedVersionFiles(scopes, dryRun) : [],
|
|
332
|
-
catch: (e) => new ReleasePlanError({
|
|
333
|
-
phase: "apply",
|
|
334
|
-
reason: errMsg(e)
|
|
335
|
-
})
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
return {
|
|
339
|
-
dryRun,
|
|
340
|
-
touchedFiles,
|
|
341
|
-
releases,
|
|
342
|
-
versionFileUpdates
|
|
343
|
-
};
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
//#endregion
|
|
348
|
-
export { ReleasePlanner, ReleasePlannerBase, ReleasePlannerLive, extractVersionBlock, makeReleasePlannerTest };
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region ../silk-effects/dist/dev/pkg/changesets/utils/commit-parser.js
|
|
3
|
-
/**
|
|
4
|
-
* Conventional commit message parsing.
|
|
5
|
-
*
|
|
6
|
-
* Implements a parser for the
|
|
7
|
-
* {@link https://www.conventionalcommits.org/ | Conventional Commits}
|
|
8
|
-
* specification, extracting type, scope, breaking-change indicator,
|
|
9
|
-
* description, and body from commit messages.
|
|
10
|
-
*
|
|
11
|
-
* @remarks
|
|
12
|
-
* The parser uses a single regex pass for the first line, then splits
|
|
13
|
-
* remaining lines to extract the body. Non-conventional messages are
|
|
14
|
-
* returned with only the `description` field populated (set to the
|
|
15
|
-
* full message text).
|
|
16
|
-
*
|
|
17
|
-
* @see {@link Changelog} for the public API that consumes parsed commits
|
|
18
|
-
*
|
|
19
|
-
* @internal
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* Matches conventional commit format: `type(scope)!: description`.
|
|
23
|
-
*
|
|
24
|
-
* Capture groups:
|
|
25
|
-
* - `[1]` — commit type (e.g., `feat`, `fix`)
|
|
26
|
-
* - `[2]` — optional scope (e.g., `api`, `ui`)
|
|
27
|
-
* - `[3]` — optional `!` breaking-change indicator
|
|
28
|
-
* - `[4]` — description text after the colon
|
|
29
|
-
*
|
|
30
|
-
* @internal
|
|
31
|
-
*/
|
|
32
|
-
const CONVENTIONAL_COMMIT_PATTERN = /^(\w+)(?:\(([^)]+)\))?(!)?\s*:\s*(.+)/;
|
|
33
|
-
/**
|
|
34
|
-
* Parse a commit message following the Conventional Commits specification.
|
|
35
|
-
*
|
|
36
|
-
* Supports the full format: `type(scope)!: description\n\nbody`
|
|
37
|
-
*
|
|
38
|
-
* @remarks
|
|
39
|
-
* The algorithm first attempts to match the first line against the
|
|
40
|
-
* conventional commit pattern. If matched, the type, optional scope,
|
|
41
|
-
* optional breaking indicator, and description are extracted. The body
|
|
42
|
-
* is everything after the first line, trimmed. If the message does not
|
|
43
|
-
* match, a fallback result with only the `description` set to the raw
|
|
44
|
-
* message is returned.
|
|
45
|
-
*
|
|
46
|
-
* @param message - The commit message to parse
|
|
47
|
-
* @returns Parsed components; only `description` is guaranteed present
|
|
48
|
-
*
|
|
49
|
-
* @example
|
|
50
|
-
* ```typescript
|
|
51
|
-
* import { parseCommitMessage } from "../utils/commit-parser.js";
|
|
52
|
-
*
|
|
53
|
-
* const result = parseCommitMessage("feat(api)!: add v2 routes\n\nBREAKING CHANGE: v1 removed");
|
|
54
|
-
* // result.type === "feat"
|
|
55
|
-
* // result.scope === "api"
|
|
56
|
-
* // result.breaking === true
|
|
57
|
-
* // result.description === "add v2 routes"
|
|
58
|
-
* // result.body === "BREAKING CHANGE: v1 removed"
|
|
59
|
-
* ```
|
|
60
|
-
*
|
|
61
|
-
* @internal
|
|
62
|
-
*/
|
|
63
|
-
function parseCommitMessage(message) {
|
|
64
|
-
const match = CONVENTIONAL_COMMIT_PATTERN.exec(message);
|
|
65
|
-
if (match) {
|
|
66
|
-
const [, type, scope, bang, description] = match;
|
|
67
|
-
const body = message.split("\n").slice(1).join("\n").trim();
|
|
68
|
-
const result = {
|
|
69
|
-
type,
|
|
70
|
-
description: description.trim()
|
|
71
|
-
};
|
|
72
|
-
if (scope) result.scope = scope;
|
|
73
|
-
if (bang === "!") result.breaking = true;
|
|
74
|
-
if (body) result.body = body;
|
|
75
|
-
return result;
|
|
76
|
-
}
|
|
77
|
-
return { description: message };
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
//#endregion
|
|
81
|
-
exports.parseCommitMessage = parseCommitMessage;
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
//#region ../silk-effects/dist/dev/pkg/changesets/utils/commit-parser.js
|
|
2
|
-
/**
|
|
3
|
-
* Conventional commit message parsing.
|
|
4
|
-
*
|
|
5
|
-
* Implements a parser for the
|
|
6
|
-
* {@link https://www.conventionalcommits.org/ | Conventional Commits}
|
|
7
|
-
* specification, extracting type, scope, breaking-change indicator,
|
|
8
|
-
* description, and body from commit messages.
|
|
9
|
-
*
|
|
10
|
-
* @remarks
|
|
11
|
-
* The parser uses a single regex pass for the first line, then splits
|
|
12
|
-
* remaining lines to extract the body. Non-conventional messages are
|
|
13
|
-
* returned with only the `description` field populated (set to the
|
|
14
|
-
* full message text).
|
|
15
|
-
*
|
|
16
|
-
* @see {@link Changelog} for the public API that consumes parsed commits
|
|
17
|
-
*
|
|
18
|
-
* @internal
|
|
19
|
-
*/
|
|
20
|
-
/**
|
|
21
|
-
* Matches conventional commit format: `type(scope)!: description`.
|
|
22
|
-
*
|
|
23
|
-
* Capture groups:
|
|
24
|
-
* - `[1]` — commit type (e.g., `feat`, `fix`)
|
|
25
|
-
* - `[2]` — optional scope (e.g., `api`, `ui`)
|
|
26
|
-
* - `[3]` — optional `!` breaking-change indicator
|
|
27
|
-
* - `[4]` — description text after the colon
|
|
28
|
-
*
|
|
29
|
-
* @internal
|
|
30
|
-
*/
|
|
31
|
-
const CONVENTIONAL_COMMIT_PATTERN = /^(\w+)(?:\(([^)]+)\))?(!)?\s*:\s*(.+)/;
|
|
32
|
-
/**
|
|
33
|
-
* Parse a commit message following the Conventional Commits specification.
|
|
34
|
-
*
|
|
35
|
-
* Supports the full format: `type(scope)!: description\n\nbody`
|
|
36
|
-
*
|
|
37
|
-
* @remarks
|
|
38
|
-
* The algorithm first attempts to match the first line against the
|
|
39
|
-
* conventional commit pattern. If matched, the type, optional scope,
|
|
40
|
-
* optional breaking indicator, and description are extracted. The body
|
|
41
|
-
* is everything after the first line, trimmed. If the message does not
|
|
42
|
-
* match, a fallback result with only the `description` set to the raw
|
|
43
|
-
* message is returned.
|
|
44
|
-
*
|
|
45
|
-
* @param message - The commit message to parse
|
|
46
|
-
* @returns Parsed components; only `description` is guaranteed present
|
|
47
|
-
*
|
|
48
|
-
* @example
|
|
49
|
-
* ```typescript
|
|
50
|
-
* import { parseCommitMessage } from "../utils/commit-parser.js";
|
|
51
|
-
*
|
|
52
|
-
* const result = parseCommitMessage("feat(api)!: add v2 routes\n\nBREAKING CHANGE: v1 removed");
|
|
53
|
-
* // result.type === "feat"
|
|
54
|
-
* // result.scope === "api"
|
|
55
|
-
* // result.breaking === true
|
|
56
|
-
* // result.description === "add v2 routes"
|
|
57
|
-
* // result.body === "BREAKING CHANGE: v1 removed"
|
|
58
|
-
* ```
|
|
59
|
-
*
|
|
60
|
-
* @internal
|
|
61
|
-
*/
|
|
62
|
-
function parseCommitMessage(message) {
|
|
63
|
-
const match = CONVENTIONAL_COMMIT_PATTERN.exec(message);
|
|
64
|
-
if (match) {
|
|
65
|
-
const [, type, scope, bang, description] = match;
|
|
66
|
-
const body = message.split("\n").slice(1).join("\n").trim();
|
|
67
|
-
const result = {
|
|
68
|
-
type,
|
|
69
|
-
description: description.trim()
|
|
70
|
-
};
|
|
71
|
-
if (scope) result.scope = scope;
|
|
72
|
-
if (bang === "!") result.breaking = true;
|
|
73
|
-
if (body) result.body = body;
|
|
74
|
-
return result;
|
|
75
|
-
}
|
|
76
|
-
return { description: message };
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
//#endregion
|
|
80
|
-
export { parseCommitMessage };
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
const require_dependency_table = require('./dependency-table.cjs');
|
|
2
|
-
let effect = require("effect");
|
|
3
|
-
|
|
4
|
-
//#region ../silk-effects/dist/dev/pkg/changesets/utils/dep-diff.js
|
|
5
|
-
/**
|
|
6
|
-
* Compute per-workspace-package dependency-table rows from two
|
|
7
|
-
* {@link WorkspaceStateSnapshot}s, resolving `catalog:` / `workspace:`
|
|
8
|
-
* specifiers against each side's own catalogs and package versions BEFORE
|
|
9
|
-
* comparing.
|
|
10
|
-
*
|
|
11
|
-
* @remarks
|
|
12
|
-
* Operates on declared dependencies only (the `dependencies` /
|
|
13
|
-
* `devDependencies` / `peerDependencies` / `optionalDependencies` fields
|
|
14
|
-
* of each workspace's `package.json`). Lockfile-only movements
|
|
15
|
-
* (resolved versions changing while declared ranges stay put) are
|
|
16
|
-
* intentionally excluded — those happen on every `pnpm install` and
|
|
17
|
-
* would generate constant noise.
|
|
18
|
-
*
|
|
19
|
-
* Each side carries its own catalogs and package versions, so a specifier
|
|
20
|
-
* is resolved against the snapshot it belongs to: `catalog:silk` resolves
|
|
21
|
-
* to that ref's `silk` catalog entry, `workspace:*` to that ref's target
|
|
22
|
-
* package version. A row is emitted iff the two RESOLVED values differ (or
|
|
23
|
-
* the dependency was added/removed) — a package that merely adopted a
|
|
24
|
-
* `catalog:` specifier without changing the concrete version produces NO
|
|
25
|
-
* row. When a side cannot resolve a specifier (no matching catalog entry,
|
|
26
|
-
* plain range, etc.) it falls back to the raw specifier string.
|
|
27
|
-
*
|
|
28
|
-
* @see {@link DependencyTableRow} for the row schema
|
|
29
|
-
* @see {@link WorkspaceStateSnapshot} for the input shape
|
|
30
|
-
*
|
|
31
|
-
*/
|
|
32
|
-
/** The em-dash sentinel (U+2014) used for added ("from") / removed ("to") cells. */
|
|
33
|
-
const EM_DASH = "—";
|
|
34
|
-
const DEP_TYPE_MAP = [
|
|
35
|
-
["dependencies", "dependency"],
|
|
36
|
-
["devDependencies", "devDependency"],
|
|
37
|
-
["peerDependencies", "peerDependency"],
|
|
38
|
-
["optionalDependencies", "optionalDependency"]
|
|
39
|
-
];
|
|
40
|
-
/**
|
|
41
|
-
* Resolve a specifier against the snapshot it belongs to, falling back to
|
|
42
|
-
* the raw specifier string when the snapshot cannot resolve it.
|
|
43
|
-
*/
|
|
44
|
-
const resolveOrRaw = (snapshot, dep, spec) => effect.Option.getOrElse(snapshot.resolve(dep, spec), () => spec);
|
|
45
|
-
/**
|
|
46
|
-
* Diff two workspace snapshots and return per-package dependency-table rows,
|
|
47
|
-
* comparing already-resolved specifier values per side.
|
|
48
|
-
*
|
|
49
|
-
* @param before - Snapshot at the older ref (typically the merge base). A
|
|
50
|
-
* workspace package absent here reports every declared dep as `"added"`.
|
|
51
|
-
* @param after - Snapshot at the newer ref (typically the working tree).
|
|
52
|
-
* @returns One {@link WorkspaceDependencyDiff} entry per workspace package
|
|
53
|
-
* that has at least one row. Packages with no resolved-value changes are
|
|
54
|
-
* omitted.
|
|
55
|
-
*
|
|
56
|
-
* @public
|
|
57
|
-
*/
|
|
58
|
-
function computeWorkspaceDependencyDiffs(before, after) {
|
|
59
|
-
const result = [];
|
|
60
|
-
for (const afterPkg of after.packages) {
|
|
61
|
-
const beforePkg = effect.Option.getOrNull(before.package(afterPkg.name));
|
|
62
|
-
const rows = [];
|
|
63
|
-
for (const [field, type] of DEP_TYPE_MAP) {
|
|
64
|
-
const beforeRecord = beforePkg?.[field] ?? {};
|
|
65
|
-
const afterRecord = afterPkg[field];
|
|
66
|
-
const seen = /* @__PURE__ */ new Set();
|
|
67
|
-
for (const [name, beforeSpec] of Object.entries(beforeRecord)) {
|
|
68
|
-
seen.add(name);
|
|
69
|
-
const from = resolveOrRaw(before, name, beforeSpec);
|
|
70
|
-
const afterSpec = afterRecord[name];
|
|
71
|
-
if (afterSpec === void 0) {
|
|
72
|
-
rows.push({
|
|
73
|
-
dependency: name,
|
|
74
|
-
type,
|
|
75
|
-
action: "removed",
|
|
76
|
-
from,
|
|
77
|
-
to: EM_DASH
|
|
78
|
-
});
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
const to = resolveOrRaw(after, name, afterSpec);
|
|
82
|
-
if (from !== to) rows.push({
|
|
83
|
-
dependency: name,
|
|
84
|
-
type,
|
|
85
|
-
action: "updated",
|
|
86
|
-
from,
|
|
87
|
-
to
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
for (const [name, afterSpec] of Object.entries(afterRecord)) {
|
|
91
|
-
if (seen.has(name)) continue;
|
|
92
|
-
rows.push({
|
|
93
|
-
dependency: name,
|
|
94
|
-
type,
|
|
95
|
-
action: "added",
|
|
96
|
-
from: EM_DASH,
|
|
97
|
-
to: resolveOrRaw(after, name, afterSpec)
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
if (rows.length > 0) result.push({
|
|
102
|
-
package: afterPkg.name,
|
|
103
|
-
relativePath: afterPkg.relativePath,
|
|
104
|
-
rows: require_dependency_table.sortDependencyRows(rows)
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
return result;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
//#endregion
|
|
111
|
-
exports.computeWorkspaceDependencyDiffs = computeWorkspaceDependencyDiffs;
|