@savvy-web/silk 1.3.9 → 1.3.11
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/changesets-changelog.cjs +9204 -685
- package/changesets-changelog.d.cts +120 -29
- package/changesets-changelog.d.ts +120 -29
- package/changesets-markdownlint.cjs +9204 -685
- package/changesets-markdownlint.d.cts +120 -29
- package/changesets-markdownlint.d.ts +120 -29
- package/package.json +11 -11
- package/packages/silk-effects/dist/dev/pkg/changesets/api/transformer.cjs +24 -30
- package/packages/silk-effects/dist/dev/pkg/changesets/api/transformer.js +24 -30
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/formatting.cjs +4 -10
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/formatting.js +4 -10
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getDependencyReleaseLine.cjs +13 -9
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getDependencyReleaseLine.js +13 -9
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getReleaseLine.cjs +8 -8
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getReleaseLine.js +8 -8
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/index.cjs +1 -1
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/index.js +1 -1
- package/packages/silk-effects/dist/dev/pkg/changesets/index.cjs +12 -2
- package/packages/silk-effects/dist/dev/pkg/changesets/index.js +9 -3
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/deduplicate-items.cjs +11 -9
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/deduplicate-items.js +11 -9
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/maintenance-note.cjs +61 -0
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/maintenance-note.js +61 -0
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/presets.cjs +1 -1
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/presets.js +1 -1
- package/packages/silk-effects/dist/dev/pkg/changesets/services/maintenance-reason.cjs +68 -0
- package/packages/silk-effects/dist/dev/pkg/changesets/services/maintenance-reason.js +66 -0
- package/packages/silk-effects/dist/dev/pkg/changesets/services/release-planner.cjs +75 -16
- package/packages/silk-effects/dist/dev/pkg/changesets/services/release-planner.js +76 -17
- package/tsconfig/node/dist/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const require_version_blocks = require('../../utils/version-blocks.cjs');
|
|
2
|
+
|
|
3
|
+
//#region ../silk-effects/dist/dev/pkg/changesets/remark/plugins/maintenance-note.js
|
|
4
|
+
function buildNoteChildren(reason) {
|
|
5
|
+
if (reason.kind === "unspecified" || reason.triggers.length === 0) return [{
|
|
6
|
+
type: "text",
|
|
7
|
+
value: "Version-only release to keep workspace versions consistent; no changes to this package."
|
|
8
|
+
}];
|
|
9
|
+
const label = reason.kind === "fixed" ? "fixed version group" : "linked version group";
|
|
10
|
+
const children = [{
|
|
11
|
+
type: "text",
|
|
12
|
+
value: "Released in lockstep with "
|
|
13
|
+
}];
|
|
14
|
+
reason.triggers.forEach((trigger, index) => {
|
|
15
|
+
if (index > 0) children.push({
|
|
16
|
+
type: "text",
|
|
17
|
+
value: ", "
|
|
18
|
+
});
|
|
19
|
+
children.push({
|
|
20
|
+
type: "inlineCode",
|
|
21
|
+
value: `${trigger.name}@${trigger.version}`
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
children.push({
|
|
25
|
+
type: "text",
|
|
26
|
+
value: ` (${label}).`
|
|
27
|
+
});
|
|
28
|
+
return children;
|
|
29
|
+
}
|
|
30
|
+
const MaintenanceNotePlugin = (options) => {
|
|
31
|
+
return (tree) => {
|
|
32
|
+
const block = require_version_blocks.getVersionBlocks(tree).find((b) => require_version_blocks.getHeadingText(tree.children[b.headingIndex]) === options.version);
|
|
33
|
+
if (!block) return;
|
|
34
|
+
if (block.endIndex > block.startIndex) return;
|
|
35
|
+
const heading = {
|
|
36
|
+
type: "heading",
|
|
37
|
+
depth: 3,
|
|
38
|
+
children: [{
|
|
39
|
+
type: "text",
|
|
40
|
+
value: "Maintenance"
|
|
41
|
+
}]
|
|
42
|
+
};
|
|
43
|
+
const list = {
|
|
44
|
+
type: "list",
|
|
45
|
+
ordered: false,
|
|
46
|
+
spread: false,
|
|
47
|
+
children: [{
|
|
48
|
+
type: "listItem",
|
|
49
|
+
spread: false,
|
|
50
|
+
children: [{
|
|
51
|
+
type: "paragraph",
|
|
52
|
+
children: buildNoteChildren(options.reason)
|
|
53
|
+
}]
|
|
54
|
+
}]
|
|
55
|
+
};
|
|
56
|
+
tree.children.splice(block.startIndex, 0, heading, list);
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
//#endregion
|
|
61
|
+
exports.MaintenanceNotePlugin = MaintenanceNotePlugin;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { getHeadingText, getVersionBlocks } from "../../utils/version-blocks.js";
|
|
2
|
+
|
|
3
|
+
//#region ../silk-effects/dist/dev/pkg/changesets/remark/plugins/maintenance-note.js
|
|
4
|
+
function buildNoteChildren(reason) {
|
|
5
|
+
if (reason.kind === "unspecified" || reason.triggers.length === 0) return [{
|
|
6
|
+
type: "text",
|
|
7
|
+
value: "Version-only release to keep workspace versions consistent; no changes to this package."
|
|
8
|
+
}];
|
|
9
|
+
const label = reason.kind === "fixed" ? "fixed version group" : "linked version group";
|
|
10
|
+
const children = [{
|
|
11
|
+
type: "text",
|
|
12
|
+
value: "Released in lockstep with "
|
|
13
|
+
}];
|
|
14
|
+
reason.triggers.forEach((trigger, index) => {
|
|
15
|
+
if (index > 0) children.push({
|
|
16
|
+
type: "text",
|
|
17
|
+
value: ", "
|
|
18
|
+
});
|
|
19
|
+
children.push({
|
|
20
|
+
type: "inlineCode",
|
|
21
|
+
value: `${trigger.name}@${trigger.version}`
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
children.push({
|
|
25
|
+
type: "text",
|
|
26
|
+
value: ` (${label}).`
|
|
27
|
+
});
|
|
28
|
+
return children;
|
|
29
|
+
}
|
|
30
|
+
const MaintenanceNotePlugin = (options) => {
|
|
31
|
+
return (tree) => {
|
|
32
|
+
const block = getVersionBlocks(tree).find((b) => getHeadingText(tree.children[b.headingIndex]) === options.version);
|
|
33
|
+
if (!block) return;
|
|
34
|
+
if (block.endIndex > block.startIndex) return;
|
|
35
|
+
const heading = {
|
|
36
|
+
type: "heading",
|
|
37
|
+
depth: 3,
|
|
38
|
+
children: [{
|
|
39
|
+
type: "text",
|
|
40
|
+
value: "Maintenance"
|
|
41
|
+
}]
|
|
42
|
+
};
|
|
43
|
+
const list = {
|
|
44
|
+
type: "list",
|
|
45
|
+
ordered: false,
|
|
46
|
+
spread: false,
|
|
47
|
+
children: [{
|
|
48
|
+
type: "listItem",
|
|
49
|
+
spread: false,
|
|
50
|
+
children: [{
|
|
51
|
+
type: "paragraph",
|
|
52
|
+
children: buildNoteChildren(options.reason)
|
|
53
|
+
}]
|
|
54
|
+
}]
|
|
55
|
+
};
|
|
56
|
+
tree.children.splice(block.startIndex, 0, heading, list);
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
//#endregion
|
|
61
|
+
export { MaintenanceNotePlugin };
|
|
@@ -3,13 +3,13 @@ const require_dependency_table_format = require('./rules/dependency-table-format
|
|
|
3
3
|
const require_heading_hierarchy = require('./rules/heading-hierarchy.cjs');
|
|
4
4
|
const require_required_sections = require('./rules/required-sections.cjs');
|
|
5
5
|
const require_uncategorized_content = require('./rules/uncategorized-content.cjs');
|
|
6
|
+
const require_aggregate_dependency_tables = require('./plugins/aggregate-dependency-tables.cjs');
|
|
6
7
|
const require_contributor_footnotes = require('./plugins/contributor-footnotes.cjs');
|
|
7
8
|
const require_deduplicate_items = require('./plugins/deduplicate-items.cjs');
|
|
8
9
|
const require_issue_link_refs = require('./plugins/issue-link-refs.cjs');
|
|
9
10
|
const require_merge_sections = require('./plugins/merge-sections.cjs');
|
|
10
11
|
const require_normalize_format = require('./plugins/normalize-format.cjs');
|
|
11
12
|
const require_reorder_sections = require('./plugins/reorder-sections.cjs');
|
|
12
|
-
const require_aggregate_dependency_tables = require('./plugins/aggregate-dependency-tables.cjs');
|
|
13
13
|
|
|
14
14
|
//#region ../silk-effects/dist/dev/pkg/changesets/remark/presets.js
|
|
15
15
|
/**
|
|
@@ -3,13 +3,13 @@ import { DependencyTableFormatRule } from "./rules/dependency-table-format.js";
|
|
|
3
3
|
import { HeadingHierarchyRule } from "./rules/heading-hierarchy.js";
|
|
4
4
|
import { RequiredSectionsRule } from "./rules/required-sections.js";
|
|
5
5
|
import { UncategorizedContentRule } from "./rules/uncategorized-content.js";
|
|
6
|
+
import { AggregateDependencyTablesPlugin } from "./plugins/aggregate-dependency-tables.js";
|
|
6
7
|
import { ContributorFootnotesPlugin } from "./plugins/contributor-footnotes.js";
|
|
7
8
|
import { DeduplicateItemsPlugin } from "./plugins/deduplicate-items.js";
|
|
8
9
|
import { IssueLinkRefsPlugin } from "./plugins/issue-link-refs.js";
|
|
9
10
|
import { MergeSectionsPlugin } from "./plugins/merge-sections.js";
|
|
10
11
|
import { NormalizeFormatPlugin } from "./plugins/normalize-format.js";
|
|
11
12
|
import { ReorderSectionsPlugin } from "./plugins/reorder-sections.js";
|
|
12
|
-
import { AggregateDependencyTablesPlugin } from "./plugins/aggregate-dependency-tables.js";
|
|
13
13
|
|
|
14
14
|
//#region ../silk-effects/dist/dev/pkg/changesets/remark/presets.js
|
|
15
15
|
/**
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const require_ChangesetConfig = require('../../services/ChangesetConfig.cjs');
|
|
2
|
+
let effect = require("effect");
|
|
3
|
+
|
|
4
|
+
//#region ../silk-effects/dist/dev/pkg/changesets/services/maintenance-reason.js
|
|
5
|
+
/**
|
|
6
|
+
* A group co-member whose own changesets forced this release.
|
|
7
|
+
*
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
const MaintenanceTriggerSchema = effect.Schema.Struct({
|
|
11
|
+
/** Package name of the triggering co-member. */
|
|
12
|
+
name: effect.Schema.String,
|
|
13
|
+
/** The co-member's new version in the same release plan. */
|
|
14
|
+
version: effect.Schema.String
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* Why a package is releasing with no changesets of its own.
|
|
18
|
+
*
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
const MaintenanceReasonSchema = effect.Schema.Struct({
|
|
22
|
+
/** Coupling that forced the release; `"unspecified"` when undetermined. */
|
|
23
|
+
kind: effect.Schema.Literal("fixed", "linked", "unspecified"),
|
|
24
|
+
/** Triggering co-members; empty for `"unspecified"`. */
|
|
25
|
+
triggers: effect.Schema.Array(MaintenanceTriggerSchema)
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Derive the {@link MaintenanceReason} for a release, or `undefined` when the
|
|
29
|
+
* release has its own changesets (not a maintenance release).
|
|
30
|
+
*
|
|
31
|
+
* @param release - The release to classify.
|
|
32
|
+
* @param plan - The full release plan (source of group co-members).
|
|
33
|
+
* @param config - Resolved changesets config (`fixed` / `linked` groups).
|
|
34
|
+
* @returns The reason, or `undefined` for releases with their own changesets.
|
|
35
|
+
*
|
|
36
|
+
* @remarks
|
|
37
|
+
* Group entries are matched with {@link ChangesetConfig.matches} — exact names
|
|
38
|
+
* and trailing `"@scope/*"` prefixes only, a subset of the micromatch globs
|
|
39
|
+
* changesets accepts. A group entry using richer glob syntax (e.g. `"pkg-*"`)
|
|
40
|
+
* will not match here; the release then degrades gracefully to the
|
|
41
|
+
* `"unspecified"` fallback sentence instead of naming its triggers.
|
|
42
|
+
*
|
|
43
|
+
* @public
|
|
44
|
+
*/
|
|
45
|
+
function deriveMaintenanceReason(release, plan, config) {
|
|
46
|
+
if (release.changesets.length > 0) return void 0;
|
|
47
|
+
const groupKinds = [["fixed", config.fixed], ["linked", config.linked]];
|
|
48
|
+
for (const [kind, groups] of groupKinds) for (const group of groups) {
|
|
49
|
+
if (!group.some((pattern) => require_ChangesetConfig.ChangesetConfig.matches(release.name, pattern))) continue;
|
|
50
|
+
const triggers = plan.releases.filter((r) => r.name !== release.name && r.changesets.length > 0 && group.some((pattern) => require_ChangesetConfig.ChangesetConfig.matches(r.name, pattern))).map((r) => ({
|
|
51
|
+
name: r.name,
|
|
52
|
+
version: r.newVersion
|
|
53
|
+
}));
|
|
54
|
+
if (triggers.length > 0) return {
|
|
55
|
+
kind,
|
|
56
|
+
triggers
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
kind: "unspecified",
|
|
61
|
+
triggers: []
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//#endregion
|
|
66
|
+
exports.MaintenanceReasonSchema = MaintenanceReasonSchema;
|
|
67
|
+
exports.MaintenanceTriggerSchema = MaintenanceTriggerSchema;
|
|
68
|
+
exports.deriveMaintenanceReason = deriveMaintenanceReason;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { ChangesetConfig } from "../../services/ChangesetConfig.js";
|
|
2
|
+
import { Schema } from "effect";
|
|
3
|
+
|
|
4
|
+
//#region ../silk-effects/dist/dev/pkg/changesets/services/maintenance-reason.js
|
|
5
|
+
/**
|
|
6
|
+
* A group co-member whose own changesets forced this release.
|
|
7
|
+
*
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
const MaintenanceTriggerSchema = Schema.Struct({
|
|
11
|
+
/** Package name of the triggering co-member. */
|
|
12
|
+
name: Schema.String,
|
|
13
|
+
/** The co-member's new version in the same release plan. */
|
|
14
|
+
version: Schema.String
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* Why a package is releasing with no changesets of its own.
|
|
18
|
+
*
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
const MaintenanceReasonSchema = Schema.Struct({
|
|
22
|
+
/** Coupling that forced the release; `"unspecified"` when undetermined. */
|
|
23
|
+
kind: Schema.Literal("fixed", "linked", "unspecified"),
|
|
24
|
+
/** Triggering co-members; empty for `"unspecified"`. */
|
|
25
|
+
triggers: Schema.Array(MaintenanceTriggerSchema)
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Derive the {@link MaintenanceReason} for a release, or `undefined` when the
|
|
29
|
+
* release has its own changesets (not a maintenance release).
|
|
30
|
+
*
|
|
31
|
+
* @param release - The release to classify.
|
|
32
|
+
* @param plan - The full release plan (source of group co-members).
|
|
33
|
+
* @param config - Resolved changesets config (`fixed` / `linked` groups).
|
|
34
|
+
* @returns The reason, or `undefined` for releases with their own changesets.
|
|
35
|
+
*
|
|
36
|
+
* @remarks
|
|
37
|
+
* Group entries are matched with {@link ChangesetConfig.matches} — exact names
|
|
38
|
+
* and trailing `"@scope/*"` prefixes only, a subset of the micromatch globs
|
|
39
|
+
* changesets accepts. A group entry using richer glob syntax (e.g. `"pkg-*"`)
|
|
40
|
+
* will not match here; the release then degrades gracefully to the
|
|
41
|
+
* `"unspecified"` fallback sentence instead of naming its triggers.
|
|
42
|
+
*
|
|
43
|
+
* @public
|
|
44
|
+
*/
|
|
45
|
+
function deriveMaintenanceReason(release, plan, config) {
|
|
46
|
+
if (release.changesets.length > 0) return void 0;
|
|
47
|
+
const groupKinds = [["fixed", config.fixed], ["linked", config.linked]];
|
|
48
|
+
for (const [kind, groups] of groupKinds) for (const group of groups) {
|
|
49
|
+
if (!group.some((pattern) => ChangesetConfig.matches(release.name, pattern))) continue;
|
|
50
|
+
const triggers = plan.releases.filter((r) => r.name !== release.name && r.changesets.length > 0 && group.some((pattern) => ChangesetConfig.matches(r.name, pattern))).map((r) => ({
|
|
51
|
+
name: r.name,
|
|
52
|
+
version: r.newVersion
|
|
53
|
+
}));
|
|
54
|
+
if (triggers.length > 0) return {
|
|
55
|
+
kind,
|
|
56
|
+
triggers
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
kind: "unspecified",
|
|
61
|
+
triggers: []
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//#endregion
|
|
66
|
+
export { MaintenanceReasonSchema, MaintenanceTriggerSchema, deriveMaintenanceReason };
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
const require_errors = require('../errors.cjs');
|
|
2
2
|
const require_transformer = require('../api/transformer.cjs');
|
|
3
3
|
const require_config_inspector = require('./config-inspector.cjs');
|
|
4
|
+
const require_maintenance_reason = require('./maintenance-reason.cjs');
|
|
4
5
|
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
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
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
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
|
+
const require_manypkg_get_packages = require('../../../../../../../node_modules/.pnpm/@manypkg_get-packages@3.1.0/node_modules/@manypkg/get-packages/dist/manypkg-get-packages.cjs');
|
|
9
10
|
let effect = require("effect");
|
|
10
11
|
let _effect_platform = require("@effect/platform");
|
|
11
12
|
let node_path = require("node:path");
|
|
12
13
|
|
|
13
14
|
//#region ../silk-effects/dist/dev/pkg/changesets/services/release-planner.js
|
|
14
|
-
var import_get_packages_cjs = require_get_packages_cjs$1.default;
|
|
15
15
|
/**
|
|
16
16
|
* `ReleasePlanner` service — drive the genuine changesets release engine to
|
|
17
17
|
* compute a plan, render a read-only preview, or natively apply a release.
|
|
@@ -24,8 +24,36 @@ var import_get_packages_cjs = require_get_packages_cjs$1.default;
|
|
|
24
24
|
* (e.g. `getChangelogEntry`) is re-implemented.
|
|
25
25
|
*
|
|
26
26
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const V1_TOOLS = /* @__PURE__ */ new Set([
|
|
28
|
+
"yarn",
|
|
29
|
+
"bolt",
|
|
30
|
+
"pnpm",
|
|
31
|
+
"lerna",
|
|
32
|
+
"root"
|
|
33
|
+
]);
|
|
34
|
+
/**
|
|
35
|
+
* Single workspace-discovery seam; swap to an Effect-native stack later here.
|
|
36
|
+
*
|
|
37
|
+
* Discovers with `@manypkg/get-packages@3.x` and adapts to the v1 shape:
|
|
38
|
+
* `tool` collapses to its type string (tools unknown to v1 map to `"root"` —
|
|
39
|
+
* the engine never reads `tool` at runtime, only `root.dir`), and
|
|
40
|
+
* `rootDir`/`rootPackage` fold back into `root`.
|
|
41
|
+
*/
|
|
42
|
+
const buildPackages = async (root) => {
|
|
43
|
+
const { tool, rootDir, rootPackage, packages } = await require_manypkg_get_packages.getPackages(root);
|
|
44
|
+
if (!rootPackage) throw new Error(`Workspace root has no package.json: ${rootDir}`);
|
|
45
|
+
return {
|
|
46
|
+
tool: V1_TOOLS.has(tool.type) ? tool.type : "root",
|
|
47
|
+
root: {
|
|
48
|
+
dir: rootPackage.dir,
|
|
49
|
+
packageJson: rootPackage.packageJson
|
|
50
|
+
},
|
|
51
|
+
packages: packages.map((p) => ({
|
|
52
|
+
dir: p.dir,
|
|
53
|
+
packageJson: p.packageJson
|
|
54
|
+
}))
|
|
55
|
+
};
|
|
56
|
+
};
|
|
29
57
|
const errMsg = (e) => e instanceof Error ? e.message : String(e);
|
|
30
58
|
/**
|
|
31
59
|
* Base class for {@link ReleasePlanner}.
|
|
@@ -86,6 +114,16 @@ function extractVersionBlock(changelog, version) {
|
|
|
86
114
|
}
|
|
87
115
|
return lines.slice(start, end).join("\n").trim();
|
|
88
116
|
}
|
|
117
|
+
/** Maintenance reasons for every changeset-less release in the plan, keyed by package name. */
|
|
118
|
+
function maintenanceReasons(plan, config) {
|
|
119
|
+
const reasons = /* @__PURE__ */ new Map();
|
|
120
|
+
for (const r of plan.releases) {
|
|
121
|
+
if (r.type === "none") continue;
|
|
122
|
+
const reason = require_maintenance_reason.deriveMaintenanceReason(r, plan, config);
|
|
123
|
+
if (reason) reasons.set(r.name, reason);
|
|
124
|
+
}
|
|
125
|
+
return reasons;
|
|
126
|
+
}
|
|
89
127
|
/**
|
|
90
128
|
* Render a non-destructive preview by redirecting every write into a
|
|
91
129
|
* scope-managed temp directory (cleaned up automatically when the scope
|
|
@@ -107,6 +145,7 @@ function previewEffect(root, fs) {
|
|
|
107
145
|
reason: errMsg(e)
|
|
108
146
|
})
|
|
109
147
|
});
|
|
148
|
+
const reasonByName = maintenanceReasons(plan, config);
|
|
110
149
|
const preMode = plan.preState ? plan.preState.mode : null;
|
|
111
150
|
const changesets = plan.changesets.map((cs) => ({
|
|
112
151
|
id: cs.id,
|
|
@@ -175,8 +214,12 @@ function previewEffect(root, fs) {
|
|
|
175
214
|
if (!dir) continue;
|
|
176
215
|
const clPath = (0, node_path.join)(dir, "CHANGELOG.md");
|
|
177
216
|
if (!(yield* fs.exists(clPath))) continue;
|
|
217
|
+
const reason = reasonByName.get(r.name);
|
|
178
218
|
yield* effect.Effect.try({
|
|
179
|
-
try: () => require_transformer.ChangelogTransformer.transformFile(clPath
|
|
219
|
+
try: () => require_transformer.ChangelogTransformer.transformFile(clPath, reason ? { maintenance: {
|
|
220
|
+
version: r.newVersion,
|
|
221
|
+
reason
|
|
222
|
+
} } : void 0),
|
|
180
223
|
catch: (e) => new require_errors.ReleasePlanError({
|
|
181
224
|
phase: "preview",
|
|
182
225
|
reason: errMsg(e)
|
|
@@ -230,17 +273,33 @@ function applyEffect(root, dryRun, inspector, fs) {
|
|
|
230
273
|
newVersion: r.newVersion
|
|
231
274
|
}));
|
|
232
275
|
let touchedFiles = [];
|
|
233
|
-
if (!dryRun)
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
276
|
+
if (!dryRun) {
|
|
277
|
+
const reasonByName = maintenanceReasons(plan, config);
|
|
278
|
+
const versionByPkgName = new Map(plan.releases.map((r) => [r.name, r.newVersion]));
|
|
279
|
+
const nameByDir = /* @__PURE__ */ new Map();
|
|
280
|
+
for (const p of packages.packages) nameByDir.set(p.dir, p.packageJson.name);
|
|
281
|
+
if (packages.root.packageJson.name) nameByDir.set(packages.root.dir, packages.root.packageJson.name);
|
|
282
|
+
touchedFiles = yield* effect.Effect.tryPromise({
|
|
283
|
+
try: async () => {
|
|
284
|
+
const touched = await require_changesets_apply_release_plan_esm.default(plan, packages, config);
|
|
285
|
+
for (const f of touched) {
|
|
286
|
+
if (!f.endsWith("CHANGELOG.md")) continue;
|
|
287
|
+
const pkgName = nameByDir.get((0, node_path.dirname)(f));
|
|
288
|
+
const reason = pkgName ? reasonByName.get(pkgName) : void 0;
|
|
289
|
+
const newVersion = pkgName ? versionByPkgName.get(pkgName) : void 0;
|
|
290
|
+
require_transformer.ChangelogTransformer.transformFile(f, reason && newVersion ? { maintenance: {
|
|
291
|
+
version: newVersion,
|
|
292
|
+
reason
|
|
293
|
+
} } : void 0);
|
|
294
|
+
}
|
|
295
|
+
return touched;
|
|
296
|
+
},
|
|
297
|
+
catch: (e) => new require_errors.ReleasePlanError({
|
|
298
|
+
phase: "apply",
|
|
299
|
+
reason: errMsg(e)
|
|
300
|
+
})
|
|
301
|
+
});
|
|
302
|
+
}
|
|
244
303
|
const newVersionByName = new Map(plan.releases.map((r) => [r.name, r.newVersion]));
|
|
245
304
|
const inspected = yield* inspector.inspect(root).pipe(effect.Effect.catchAll((error) => effect.Effect.logWarning(`Skipping versionFiles update: ${errMsg(error)}`).pipe(effect.Effect.as(null))));
|
|
246
305
|
let versionFileUpdates = [];
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { ReleasePlanError } from "../errors.js";
|
|
2
2
|
import { ChangelogTransformer } from "../api/transformer.js";
|
|
3
3
|
import { ConfigInspector } from "./config-inspector.js";
|
|
4
|
+
import { deriveMaintenanceReason } from "./maintenance-reason.js";
|
|
4
5
|
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
6
|
import { read } from "../../../../../../../node_modules/.pnpm/@changesets_config@3.1.4/node_modules/@changesets/config/dist/changesets-config.esm.js";
|
|
7
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
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 { getPackages } from "../../../../../../../node_modules/.pnpm/@manypkg_get-packages@3.1.0/node_modules/@manypkg/get-packages/dist/manypkg-get-packages.js";
|
|
9
10
|
import { Context, Effect, Layer } from "effect";
|
|
10
11
|
import { FileSystem } from "@effect/platform";
|
|
11
|
-
import { isAbsolute, join, relative } from "node:path";
|
|
12
|
+
import { dirname, isAbsolute, join, relative } from "node:path";
|
|
12
13
|
|
|
13
14
|
//#region ../silk-effects/dist/dev/pkg/changesets/services/release-planner.js
|
|
14
|
-
var import_get_packages_cjs = require_get_packages_cjs();
|
|
15
15
|
/**
|
|
16
16
|
* `ReleasePlanner` service — drive the genuine changesets release engine to
|
|
17
17
|
* compute a plan, render a read-only preview, or natively apply a release.
|
|
@@ -24,8 +24,36 @@ var import_get_packages_cjs = require_get_packages_cjs();
|
|
|
24
24
|
* (e.g. `getChangelogEntry`) is re-implemented.
|
|
25
25
|
*
|
|
26
26
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const V1_TOOLS = /* @__PURE__ */ new Set([
|
|
28
|
+
"yarn",
|
|
29
|
+
"bolt",
|
|
30
|
+
"pnpm",
|
|
31
|
+
"lerna",
|
|
32
|
+
"root"
|
|
33
|
+
]);
|
|
34
|
+
/**
|
|
35
|
+
* Single workspace-discovery seam; swap to an Effect-native stack later here.
|
|
36
|
+
*
|
|
37
|
+
* Discovers with `@manypkg/get-packages@3.x` and adapts to the v1 shape:
|
|
38
|
+
* `tool` collapses to its type string (tools unknown to v1 map to `"root"` —
|
|
39
|
+
* the engine never reads `tool` at runtime, only `root.dir`), and
|
|
40
|
+
* `rootDir`/`rootPackage` fold back into `root`.
|
|
41
|
+
*/
|
|
42
|
+
const buildPackages = async (root) => {
|
|
43
|
+
const { tool, rootDir, rootPackage, packages } = await getPackages(root);
|
|
44
|
+
if (!rootPackage) throw new Error(`Workspace root has no package.json: ${rootDir}`);
|
|
45
|
+
return {
|
|
46
|
+
tool: V1_TOOLS.has(tool.type) ? tool.type : "root",
|
|
47
|
+
root: {
|
|
48
|
+
dir: rootPackage.dir,
|
|
49
|
+
packageJson: rootPackage.packageJson
|
|
50
|
+
},
|
|
51
|
+
packages: packages.map((p) => ({
|
|
52
|
+
dir: p.dir,
|
|
53
|
+
packageJson: p.packageJson
|
|
54
|
+
}))
|
|
55
|
+
};
|
|
56
|
+
};
|
|
29
57
|
const errMsg = (e) => e instanceof Error ? e.message : String(e);
|
|
30
58
|
/**
|
|
31
59
|
* Base class for {@link ReleasePlanner}.
|
|
@@ -86,6 +114,16 @@ function extractVersionBlock(changelog, version) {
|
|
|
86
114
|
}
|
|
87
115
|
return lines.slice(start, end).join("\n").trim();
|
|
88
116
|
}
|
|
117
|
+
/** Maintenance reasons for every changeset-less release in the plan, keyed by package name. */
|
|
118
|
+
function maintenanceReasons(plan, config) {
|
|
119
|
+
const reasons = /* @__PURE__ */ new Map();
|
|
120
|
+
for (const r of plan.releases) {
|
|
121
|
+
if (r.type === "none") continue;
|
|
122
|
+
const reason = deriveMaintenanceReason(r, plan, config);
|
|
123
|
+
if (reason) reasons.set(r.name, reason);
|
|
124
|
+
}
|
|
125
|
+
return reasons;
|
|
126
|
+
}
|
|
89
127
|
/**
|
|
90
128
|
* Render a non-destructive preview by redirecting every write into a
|
|
91
129
|
* scope-managed temp directory (cleaned up automatically when the scope
|
|
@@ -107,6 +145,7 @@ function previewEffect(root, fs) {
|
|
|
107
145
|
reason: errMsg(e)
|
|
108
146
|
})
|
|
109
147
|
});
|
|
148
|
+
const reasonByName = maintenanceReasons(plan, config);
|
|
110
149
|
const preMode = plan.preState ? plan.preState.mode : null;
|
|
111
150
|
const changesets = plan.changesets.map((cs) => ({
|
|
112
151
|
id: cs.id,
|
|
@@ -175,8 +214,12 @@ function previewEffect(root, fs) {
|
|
|
175
214
|
if (!dir) continue;
|
|
176
215
|
const clPath = join(dir, "CHANGELOG.md");
|
|
177
216
|
if (!(yield* fs.exists(clPath))) continue;
|
|
217
|
+
const reason = reasonByName.get(r.name);
|
|
178
218
|
yield* Effect.try({
|
|
179
|
-
try: () => ChangelogTransformer.transformFile(clPath
|
|
219
|
+
try: () => ChangelogTransformer.transformFile(clPath, reason ? { maintenance: {
|
|
220
|
+
version: r.newVersion,
|
|
221
|
+
reason
|
|
222
|
+
} } : void 0),
|
|
180
223
|
catch: (e) => new ReleasePlanError({
|
|
181
224
|
phase: "preview",
|
|
182
225
|
reason: errMsg(e)
|
|
@@ -230,17 +273,33 @@ function applyEffect(root, dryRun, inspector, fs) {
|
|
|
230
273
|
newVersion: r.newVersion
|
|
231
274
|
}));
|
|
232
275
|
let touchedFiles = [];
|
|
233
|
-
if (!dryRun)
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
276
|
+
if (!dryRun) {
|
|
277
|
+
const reasonByName = maintenanceReasons(plan, config);
|
|
278
|
+
const versionByPkgName = new Map(plan.releases.map((r) => [r.name, r.newVersion]));
|
|
279
|
+
const nameByDir = /* @__PURE__ */ new Map();
|
|
280
|
+
for (const p of packages.packages) nameByDir.set(p.dir, p.packageJson.name);
|
|
281
|
+
if (packages.root.packageJson.name) nameByDir.set(packages.root.dir, packages.root.packageJson.name);
|
|
282
|
+
touchedFiles = yield* Effect.tryPromise({
|
|
283
|
+
try: async () => {
|
|
284
|
+
const touched = await applyReleasePlan(plan, packages, config);
|
|
285
|
+
for (const f of touched) {
|
|
286
|
+
if (!f.endsWith("CHANGELOG.md")) continue;
|
|
287
|
+
const pkgName = nameByDir.get(dirname(f));
|
|
288
|
+
const reason = pkgName ? reasonByName.get(pkgName) : void 0;
|
|
289
|
+
const newVersion = pkgName ? versionByPkgName.get(pkgName) : void 0;
|
|
290
|
+
ChangelogTransformer.transformFile(f, reason && newVersion ? { maintenance: {
|
|
291
|
+
version: newVersion,
|
|
292
|
+
reason
|
|
293
|
+
} } : void 0);
|
|
294
|
+
}
|
|
295
|
+
return touched;
|
|
296
|
+
},
|
|
297
|
+
catch: (e) => new ReleasePlanError({
|
|
298
|
+
phase: "apply",
|
|
299
|
+
reason: errMsg(e)
|
|
300
|
+
})
|
|
301
|
+
});
|
|
302
|
+
}
|
|
244
303
|
const newVersionByName = new Map(plan.releases.map((r) => [r.name, r.newVersion]));
|
|
245
304
|
const inspected = yield* inspector.inspect(root).pipe(Effect.catchAll((error) => Effect.logWarning(`Skipping versionFiles update: ${errMsg(error)}`).pipe(Effect.as(null))));
|
|
246
305
|
let versionFileUpdates = [];
|