@savvy-web/silk 1.3.11 → 2.1.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.
- package/README.md +7 -5
- package/changesets-changelog.cjs +39298 -96760
- package/changesets-changelog.d.cts +24 -14
- package/changesets-changelog.d.ts +24 -14
- package/changesets-changelog.js +54057 -1
- package/changesets-markdownlint.cjs +39295 -96757
- package/changesets-markdownlint.d.cts +24 -14
- package/changesets-markdownlint.d.ts +24 -14
- package/changesets-markdownlint.js +54057 -1
- package/package.json +6 -5
- 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 -338
- package/packages/silk-effects/dist/dev/pkg/changesets/services/release-planner.js +0 -334
- 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 -55
- package/packages/silk-effects/dist/dev/pkg/changesets/vendor/github-info.js +0 -55
- 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,347 +0,0 @@
|
|
|
1
|
-
import { toString } from "../../../../../../../node_modules/.pnpm/mdast-util-to-string@4.0.0/node_modules/mdast-util-to-string/lib/index.js";
|
|
2
|
-
import remarkGfm from "../../../../../../../node_modules/.pnpm/remark-gfm@4.0.1/node_modules/remark-gfm/lib/index.js";
|
|
3
|
-
import remarkStringify from "../../../../../../../node_modules/.pnpm/remark-stringify@11.0.0/node_modules/remark-stringify/lib/index.js";
|
|
4
|
-
import { unified } from "../../../../../../../node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.js";
|
|
5
|
-
import { DependencyTableRowSchema } from "../schemas/dependency-table.js";
|
|
6
|
-
import { Schema } from "effect";
|
|
7
|
-
|
|
8
|
-
//#region ../silk-effects/dist/dev/pkg/changesets/utils/dependency-table.js
|
|
9
|
-
/**
|
|
10
|
-
* Dependency table utilities for parsing, serializing, collapsing, and sorting
|
|
11
|
-
* dependency table rows between MDAST table nodes and typed representations.
|
|
12
|
-
*
|
|
13
|
-
* @remarks
|
|
14
|
-
* This module provides the low-level functional primitives that the
|
|
15
|
-
* {@link DependencyTable} class wraps with a stateful, fluent API.
|
|
16
|
-
* It operates on arrays of `DependencyTableRow` objects and MDAST `Table`
|
|
17
|
-
* nodes, converting between the two representations.
|
|
18
|
-
*
|
|
19
|
-
* The collapse algorithm merges rows sharing the same `dependency + type`
|
|
20
|
-
* key, applying semantic rules (e.g., added then removed = net zero).
|
|
21
|
-
* Sorting follows a stable order: removed, updated, added, then
|
|
22
|
-
* alphabetically by type and dependency name.
|
|
23
|
-
*
|
|
24
|
-
* @see {@link DependencyTable} for the public class-based API
|
|
25
|
-
*
|
|
26
|
-
* @internal
|
|
27
|
-
*/
|
|
28
|
-
/**
|
|
29
|
-
* Ordered column headers for dependency tables.
|
|
30
|
-
*
|
|
31
|
-
* Defines the canonical header row: `Dependency | Type | Action | From | To`.
|
|
32
|
-
*
|
|
33
|
-
* @internal
|
|
34
|
-
*/
|
|
35
|
-
const COLUMN_HEADERS = [
|
|
36
|
-
"Dependency",
|
|
37
|
-
"Type",
|
|
38
|
-
"Action",
|
|
39
|
-
"From",
|
|
40
|
-
"To"
|
|
41
|
-
];
|
|
42
|
-
/**
|
|
43
|
-
* Property keys on {@link DependencyTableRow} corresponding to each column
|
|
44
|
-
* in {@link COLUMN_HEADERS}.
|
|
45
|
-
*
|
|
46
|
-
* Used to map between positional table cells and typed object fields.
|
|
47
|
-
*
|
|
48
|
-
* @internal
|
|
49
|
-
*/
|
|
50
|
-
const COLUMN_KEYS = [
|
|
51
|
-
"dependency",
|
|
52
|
-
"type",
|
|
53
|
-
"action",
|
|
54
|
-
"from",
|
|
55
|
-
"to"
|
|
56
|
-
];
|
|
57
|
-
/** Schema decoder for validating raw cell values into a typed row. */
|
|
58
|
-
const decode = Schema.decodeUnknownSync(DependencyTableRowSchema);
|
|
59
|
-
/**
|
|
60
|
-
* Parse an MDAST table node into validated dependency table rows.
|
|
61
|
-
*
|
|
62
|
-
* @remarks
|
|
63
|
-
* Validates the header row against {@link COLUMN_HEADERS} (case-insensitive),
|
|
64
|
-
* then decodes each data row through the `DependencyTableRowSchema` for
|
|
65
|
-
* type-safe validation of action values, version strings, and dependency types.
|
|
66
|
-
*
|
|
67
|
-
* @param table - An MDAST `Table` node (from remark-gfm)
|
|
68
|
-
* @returns Array of validated `DependencyTableRow` objects
|
|
69
|
-
* @throws If the table has fewer than 2 rows (header + at least one data row)
|
|
70
|
-
* @throws If the header columns do not match the expected column names
|
|
71
|
-
* @throws If any data row fails schema validation
|
|
72
|
-
*
|
|
73
|
-
* @example
|
|
74
|
-
* ```typescript
|
|
75
|
-
* import { parseDependencyTable } from "../utils/dependency-table.js";
|
|
76
|
-
* import { parseMarkdown } from "../utils/remark-pipeline.js";
|
|
77
|
-
* import type { Table } from "mdast";
|
|
78
|
-
*
|
|
79
|
-
* const tree = parseMarkdown("| Dependency | Type | Action | From | To |\n| --- | --- | --- | --- | --- |\n| foo | dependency | added | — | 1.0.0 |");
|
|
80
|
-
* const table = tree.children.find((n) => n.type === "table") as Table;
|
|
81
|
-
* const rows = parseDependencyTable(table);
|
|
82
|
-
* // rows[0].dependency === "foo"
|
|
83
|
-
* ```
|
|
84
|
-
*
|
|
85
|
-
* @internal
|
|
86
|
-
*/
|
|
87
|
-
function parseDependencyTable(table) {
|
|
88
|
-
const rows = table.children;
|
|
89
|
-
if (rows.length < 2) throw new Error("Dependency table must have at least one data row");
|
|
90
|
-
const headers = rows[0].children.map((cell) => toString(cell).trim().toLowerCase());
|
|
91
|
-
const expected = COLUMN_HEADERS.map((h) => h.toLowerCase());
|
|
92
|
-
if (headers.length !== expected.length || !headers.every((h, i) => h === expected[i])) throw new Error(`Table must have columns: ${COLUMN_HEADERS.join(", ")}. Got: ${headers.join(", ")}`);
|
|
93
|
-
const result = [];
|
|
94
|
-
for (let i = 1; i < rows.length; i++) {
|
|
95
|
-
const cells = rows[i].children;
|
|
96
|
-
const raw = {};
|
|
97
|
-
for (let c = 0; c < COLUMN_KEYS.length; c++) raw[COLUMN_KEYS[c]] = toString(cells[c]).trim();
|
|
98
|
-
result.push(decode(raw));
|
|
99
|
-
}
|
|
100
|
-
return result;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Create a table cell with a text node.
|
|
104
|
-
*
|
|
105
|
-
* @param text - The cell text content
|
|
106
|
-
* @returns An MDAST `TableCell` node
|
|
107
|
-
*
|
|
108
|
-
* @internal
|
|
109
|
-
*/
|
|
110
|
-
function makeCell(text) {
|
|
111
|
-
return {
|
|
112
|
-
type: "tableCell",
|
|
113
|
-
children: [{
|
|
114
|
-
type: "text",
|
|
115
|
-
value: text
|
|
116
|
-
}]
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Create a table row from an array of cell texts.
|
|
121
|
-
*
|
|
122
|
-
* @param texts - Array of cell text values
|
|
123
|
-
* @returns An MDAST `TableRow` node
|
|
124
|
-
*
|
|
125
|
-
* @internal
|
|
126
|
-
*/
|
|
127
|
-
function makeRow(texts) {
|
|
128
|
-
return {
|
|
129
|
-
type: "tableRow",
|
|
130
|
-
children: texts.map(makeCell)
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Serialize dependency table rows into an MDAST `Table` node.
|
|
135
|
-
*
|
|
136
|
-
* @remarks
|
|
137
|
-
* Creates a well-formed GFM table with the canonical header row
|
|
138
|
-
* ({@link COLUMN_HEADERS}) followed by one data row per entry.
|
|
139
|
-
* The inverse of {@link parseDependencyTable}.
|
|
140
|
-
*
|
|
141
|
-
* @param rows - Array of `DependencyTableRow` objects
|
|
142
|
-
* @returns An MDAST `Table` node ready for insertion into an AST
|
|
143
|
-
*
|
|
144
|
-
* @example
|
|
145
|
-
* ```typescript
|
|
146
|
-
* import { serializeDependencyTable } from "../utils/dependency-table.js";
|
|
147
|
-
* import type { DependencyTableRow } from "../schemas/dependency-table.js";
|
|
148
|
-
*
|
|
149
|
-
* const rows: DependencyTableRow[] = [
|
|
150
|
-
* { dependency: "effect", type: "dependency", action: "updated", from: "3.18.0", to: "3.19.0" },
|
|
151
|
-
* ];
|
|
152
|
-
* const table = serializeDependencyTable(rows);
|
|
153
|
-
* // table.type === "table"
|
|
154
|
-
* // table.children.length === 2 (header + 1 data row)
|
|
155
|
-
* ```
|
|
156
|
-
*
|
|
157
|
-
* @internal
|
|
158
|
-
*/
|
|
159
|
-
function serializeDependencyTable(rows) {
|
|
160
|
-
return {
|
|
161
|
-
type: "table",
|
|
162
|
-
children: [makeRow([...COLUMN_HEADERS]), ...rows.map((row) => makeRow(COLUMN_KEYS.map((key) => row[key])))]
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Serialize dependency table rows to a markdown table string.
|
|
167
|
-
*
|
|
168
|
-
* @remarks
|
|
169
|
-
* Combines {@link serializeDependencyTable} with unified/remark-gfm/remark-stringify
|
|
170
|
-
* to produce a ready-to-use GFM markdown table string. The result is trimmed
|
|
171
|
-
* of leading/trailing whitespace.
|
|
172
|
-
*
|
|
173
|
-
* @param rows - Array of `DependencyTableRow` objects
|
|
174
|
-
* @returns Markdown table string (GFM format)
|
|
175
|
-
*
|
|
176
|
-
* @example
|
|
177
|
-
* ```typescript
|
|
178
|
-
* import { serializeDependencyTableToMarkdown } from "../utils/dependency-table.js";
|
|
179
|
-
* import type { DependencyTableRow } from "../schemas/dependency-table.js";
|
|
180
|
-
*
|
|
181
|
-
* const rows: DependencyTableRow[] = [
|
|
182
|
-
* { dependency: "effect", type: "dependency", action: "updated", from: "3.18.0", to: "3.19.0" },
|
|
183
|
-
* ];
|
|
184
|
-
* const md = serializeDependencyTableToMarkdown(rows);
|
|
185
|
-
* // "| Dependency | Type | Action | From | To |\n| --- | --- | ..."
|
|
186
|
-
* ```
|
|
187
|
-
*
|
|
188
|
-
* @internal
|
|
189
|
-
*/
|
|
190
|
-
function serializeDependencyTableToMarkdown(rows) {
|
|
191
|
-
const tree = {
|
|
192
|
-
type: "root",
|
|
193
|
-
children: [serializeDependencyTable(rows)]
|
|
194
|
-
};
|
|
195
|
-
return unified().use(remarkGfm).use(remarkStringify).stringify(tree).trim();
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Sort priority for dependency actions: removed first, then updated, then added.
|
|
199
|
-
*
|
|
200
|
-
* @remarks
|
|
201
|
-
* Used by {@link sortDependencyRows} for primary sort ordering. The numeric
|
|
202
|
-
* values define the sort position (lower = earlier in the sorted output).
|
|
203
|
-
*
|
|
204
|
-
* @internal
|
|
205
|
-
*/
|
|
206
|
-
const ACTION_ORDER = {
|
|
207
|
-
removed: 0,
|
|
208
|
-
updated: 1,
|
|
209
|
-
added: 2
|
|
210
|
-
};
|
|
211
|
-
/**
|
|
212
|
-
* Collapse dependency table rows with the same `dependency + type` key.
|
|
213
|
-
*
|
|
214
|
-
* @remarks
|
|
215
|
-
* When multiple changelog entries affect the same dependency, this function
|
|
216
|
-
* merges them into a single row using semantic collapse rules. Rows are
|
|
217
|
-
* grouped by a composite key of `dependency\0type` (null-byte separated).
|
|
218
|
-
*
|
|
219
|
-
* The collapse rules applied by {@link collapseTwo} are:
|
|
220
|
-
*
|
|
221
|
-
* | First action | Second action | Result |
|
|
222
|
-
* |---|---|---|
|
|
223
|
-
* | `updated` | `updated` | `updated` (earliest `from`, latest `to`) |
|
|
224
|
-
* | `added` | `updated` | `added` (final `to`) |
|
|
225
|
-
* | `added` | `removed` | dropped (net zero change) |
|
|
226
|
-
* | `updated` | `removed` | `removed` (original `from`) |
|
|
227
|
-
* | `removed` | `added` | `updated` (original `from`, new `to`) |
|
|
228
|
-
* | other | other | keep later entry |
|
|
229
|
-
*
|
|
230
|
-
* @param rows - Array of `DependencyTableRow` objects (in chronological order)
|
|
231
|
-
* @returns Collapsed array with at most one row per `dependency + type` pair
|
|
232
|
-
*
|
|
233
|
-
* @example
|
|
234
|
-
* ```typescript
|
|
235
|
-
* import { collapseDependencyRows } from "../utils/dependency-table.js";
|
|
236
|
-
* import type { DependencyTableRow } from "../schemas/dependency-table.js";
|
|
237
|
-
*
|
|
238
|
-
* const rows: DependencyTableRow[] = [
|
|
239
|
-
* { dependency: "effect", type: "dependency", action: "updated", from: "3.17.0", to: "3.18.0" },
|
|
240
|
-
* { dependency: "effect", type: "dependency", action: "updated", from: "3.18.0", to: "3.19.0" },
|
|
241
|
-
* ];
|
|
242
|
-
* const collapsed = collapseDependencyRows(rows);
|
|
243
|
-
* // collapsed[0].from === "3.17.0", collapsed[0].to === "3.19.0"
|
|
244
|
-
* ```
|
|
245
|
-
*
|
|
246
|
-
* @see {@link DependencyTable} for the public API that wraps this function
|
|
247
|
-
*
|
|
248
|
-
* @internal
|
|
249
|
-
*/
|
|
250
|
-
function collapseDependencyRows(rows) {
|
|
251
|
-
const groups = /* @__PURE__ */ new Map();
|
|
252
|
-
for (const row of rows) {
|
|
253
|
-
const key = `${row.dependency}\0${row.type}`;
|
|
254
|
-
const existing = groups.get(key);
|
|
255
|
-
if (!existing) {
|
|
256
|
-
groups.set(key, { ...row });
|
|
257
|
-
continue;
|
|
258
|
-
}
|
|
259
|
-
const merged = collapseTwo(existing, row);
|
|
260
|
-
if (merged === null) groups.delete(key);
|
|
261
|
-
else groups.set(key, merged);
|
|
262
|
-
}
|
|
263
|
-
return [...groups.values()];
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Collapse two rows sharing the same `dependency + type` key into one,
|
|
267
|
-
* or return `null` if they cancel out (net zero).
|
|
268
|
-
*
|
|
269
|
-
* @remarks
|
|
270
|
-
* This is the core merge function called by {@link collapseDependencyRows}.
|
|
271
|
-
* It applies the semantic collapse rules based on the action pair.
|
|
272
|
-
* See {@link collapseDependencyRows} for the full rule table.
|
|
273
|
-
*
|
|
274
|
-
* @param first - The earlier (existing) row
|
|
275
|
-
* @param second - The later (incoming) row
|
|
276
|
-
* @returns The merged row, or `null` to drop the entry entirely
|
|
277
|
-
*
|
|
278
|
-
* @internal
|
|
279
|
-
*/
|
|
280
|
-
function collapseTwo(first, second) {
|
|
281
|
-
const a = first.action;
|
|
282
|
-
const b = second.action;
|
|
283
|
-
if (a === "updated" && b === "updated") return {
|
|
284
|
-
...first,
|
|
285
|
-
to: second.to
|
|
286
|
-
};
|
|
287
|
-
if (a === "added" && b === "updated") return {
|
|
288
|
-
...first,
|
|
289
|
-
to: second.to
|
|
290
|
-
};
|
|
291
|
-
if (a === "added" && b === "removed") return null;
|
|
292
|
-
if (a === "updated" && b === "removed") return {
|
|
293
|
-
...first,
|
|
294
|
-
action: "removed",
|
|
295
|
-
to: "—"
|
|
296
|
-
};
|
|
297
|
-
if (a === "removed" && b === "added") return {
|
|
298
|
-
...first,
|
|
299
|
-
action: "updated",
|
|
300
|
-
to: second.to
|
|
301
|
-
};
|
|
302
|
-
return { ...second };
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Sort dependency table rows into canonical display order.
|
|
306
|
-
*
|
|
307
|
-
* @remarks
|
|
308
|
-
* Applies a three-level stable sort:
|
|
309
|
-
* 1. **Action** — `removed` first, then `updated`, then `added`
|
|
310
|
-
* (per {@link ACTION_ORDER})
|
|
311
|
-
* 2. **Type** — alphabetically (e.g., `config` before `dependency`)
|
|
312
|
-
* 3. **Dependency name** — alphabetically within each action+type group
|
|
313
|
-
*
|
|
314
|
-
* Returns a new array; the input is not mutated.
|
|
315
|
-
*
|
|
316
|
-
* @param rows - Array of `DependencyTableRow` objects
|
|
317
|
-
* @returns New sorted array
|
|
318
|
-
*
|
|
319
|
-
* @example
|
|
320
|
-
* ```typescript
|
|
321
|
-
* import { sortDependencyRows } from "../utils/dependency-table.js";
|
|
322
|
-
* import type { DependencyTableRow } from "../schemas/dependency-table.js";
|
|
323
|
-
*
|
|
324
|
-
* const rows: DependencyTableRow[] = [
|
|
325
|
-
* { dependency: "zod", type: "dependency", action: "added", from: "\u2014", to: "3.0.0" },
|
|
326
|
-
* { dependency: "effect", type: "dependency", action: "removed", from: "3.19.0", to: "\u2014" },
|
|
327
|
-
* ];
|
|
328
|
-
* const sorted = sortDependencyRows(rows);
|
|
329
|
-
* // sorted[0].dependency === "effect" (removed comes first)
|
|
330
|
-
* ```
|
|
331
|
-
*
|
|
332
|
-
* @see {@link DependencyTable} for the public API that wraps this function
|
|
333
|
-
*
|
|
334
|
-
* @internal
|
|
335
|
-
*/
|
|
336
|
-
function sortDependencyRows(rows) {
|
|
337
|
-
return [...rows].sort((a, b) => {
|
|
338
|
-
const actionDiff = (ACTION_ORDER[a.action] ?? 99) - (ACTION_ORDER[b.action] ?? 99);
|
|
339
|
-
if (actionDiff !== 0) return actionDiff;
|
|
340
|
-
const typeDiff = a.type.localeCompare(b.type);
|
|
341
|
-
if (typeDiff !== 0) return typeDiff;
|
|
342
|
-
return a.dependency.localeCompare(b.dependency);
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
//#endregion
|
|
347
|
-
export { collapseDependencyRows, parseDependencyTable, serializeDependencyTable, serializeDependencyTableToMarkdown, sortDependencyRows };
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
const require_errors = require('../errors.cjs');
|
|
2
|
-
let effect = require("effect");
|
|
3
|
-
let node_child_process = require("node:child_process");
|
|
4
|
-
|
|
5
|
-
//#region ../silk-effects/dist/dev/pkg/changesets/utils/git.js
|
|
6
|
-
/**
|
|
7
|
-
* Git helpers for the changesets deps regen/detect orchestration.
|
|
8
|
-
*
|
|
9
|
-
* @remarks
|
|
10
|
-
* `PointInTimeWorkspace` (from `workspaces-effect`) reads both sides of a
|
|
11
|
-
* dependency diff over `CommandExecutor`. The one git operation it does not
|
|
12
|
-
* cover is resolving the default `--from` ref — the merge-base with the base
|
|
13
|
-
* branch — which stays here as a synchronous `execFileSync` shell-out.
|
|
14
|
-
*
|
|
15
|
-
* @internal
|
|
16
|
-
*/
|
|
17
|
-
/**
|
|
18
|
-
* Run `git merge-base <base> HEAD`, returning the SHA. Errors propagate
|
|
19
|
-
* as {@link GitError}.
|
|
20
|
-
*
|
|
21
|
-
* @internal
|
|
22
|
-
*/
|
|
23
|
-
function gitMergeBase(cwd, base) {
|
|
24
|
-
return effect.Effect.try({
|
|
25
|
-
try: () => (0, node_child_process.execFileSync)("git", [
|
|
26
|
-
"merge-base",
|
|
27
|
-
base,
|
|
28
|
-
"HEAD"
|
|
29
|
-
], {
|
|
30
|
-
cwd,
|
|
31
|
-
encoding: "utf8",
|
|
32
|
-
stdio: [
|
|
33
|
-
"ignore",
|
|
34
|
-
"pipe",
|
|
35
|
-
"pipe"
|
|
36
|
-
]
|
|
37
|
-
}).trim(),
|
|
38
|
-
catch: (error) => {
|
|
39
|
-
const stderr = error.stderr;
|
|
40
|
-
const text = typeof stderr === "string" ? stderr : stderr?.toString() ?? "";
|
|
41
|
-
return new require_errors.GitError({
|
|
42
|
-
command: `git merge-base ${base} HEAD`,
|
|
43
|
-
cwd,
|
|
44
|
-
reason: text.trim() || (error.message ?? String(error))
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
//#endregion
|
|
51
|
-
exports.gitMergeBase = gitMergeBase;
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { GitError } from "../errors.js";
|
|
2
|
-
import { Effect } from "effect";
|
|
3
|
-
import { execFileSync } from "node:child_process";
|
|
4
|
-
|
|
5
|
-
//#region ../silk-effects/dist/dev/pkg/changesets/utils/git.js
|
|
6
|
-
/**
|
|
7
|
-
* Git helpers for the changesets deps regen/detect orchestration.
|
|
8
|
-
*
|
|
9
|
-
* @remarks
|
|
10
|
-
* `PointInTimeWorkspace` (from `workspaces-effect`) reads both sides of a
|
|
11
|
-
* dependency diff over `CommandExecutor`. The one git operation it does not
|
|
12
|
-
* cover is resolving the default `--from` ref — the merge-base with the base
|
|
13
|
-
* branch — which stays here as a synchronous `execFileSync` shell-out.
|
|
14
|
-
*
|
|
15
|
-
* @internal
|
|
16
|
-
*/
|
|
17
|
-
/**
|
|
18
|
-
* Run `git merge-base <base> HEAD`, returning the SHA. Errors propagate
|
|
19
|
-
* as {@link GitError}.
|
|
20
|
-
*
|
|
21
|
-
* @internal
|
|
22
|
-
*/
|
|
23
|
-
function gitMergeBase(cwd, base) {
|
|
24
|
-
return Effect.try({
|
|
25
|
-
try: () => execFileSync("git", [
|
|
26
|
-
"merge-base",
|
|
27
|
-
base,
|
|
28
|
-
"HEAD"
|
|
29
|
-
], {
|
|
30
|
-
cwd,
|
|
31
|
-
encoding: "utf8",
|
|
32
|
-
stdio: [
|
|
33
|
-
"ignore",
|
|
34
|
-
"pipe",
|
|
35
|
-
"pipe"
|
|
36
|
-
]
|
|
37
|
-
}).trim(),
|
|
38
|
-
catch: (error) => {
|
|
39
|
-
const stderr = error.stderr;
|
|
40
|
-
const text = typeof stderr === "string" ? stderr : stderr?.toString() ?? "";
|
|
41
|
-
return new GitError({
|
|
42
|
-
command: `git merge-base ${base} HEAD`,
|
|
43
|
-
cwd,
|
|
44
|
-
reason: text.trim() || (error.message ?? String(error))
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
//#endregion
|
|
51
|
-
export { gitMergeBase };
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region ../silk-effects/dist/dev/pkg/changesets/utils/issue-refs.js
|
|
3
|
-
/**
|
|
4
|
-
* GitHub issue reference parsing from commit messages.
|
|
5
|
-
*
|
|
6
|
-
* @remarks
|
|
7
|
-
* Extracts categorized issue references (`Closes`, `Fixes`, `Refs`) from
|
|
8
|
-
* commit message bodies. Supports multiple formats including with/without
|
|
9
|
-
* colons, singular/plural keywords, and comma-separated issue lists.
|
|
10
|
-
* Input is truncated to 10,000 characters to prevent ReDoS on adversarial input.
|
|
11
|
-
*
|
|
12
|
-
* @see {@link Changelog} for the public API that consumes issue references
|
|
13
|
-
*
|
|
14
|
-
* @internal
|
|
15
|
-
*/
|
|
16
|
-
/**
|
|
17
|
-
* Matches "closes #123" or "close: #456, #789" patterns (case-insensitive).
|
|
18
|
-
*
|
|
19
|
-
* Capture group `[1]` contains the comma-separated issue number list.
|
|
20
|
-
*
|
|
21
|
-
* @internal
|
|
22
|
-
*/
|
|
23
|
-
const CLOSES_ISSUE_PATTERN = /closes?:?\s*#?(\d+(?:, *#?\d+)*)/i;
|
|
24
|
-
/**
|
|
25
|
-
* Matches "fixes #123" or "fix: #456, #789" patterns (case-insensitive).
|
|
26
|
-
*
|
|
27
|
-
* Capture group `[1]` contains the comma-separated issue number list.
|
|
28
|
-
*
|
|
29
|
-
* @internal
|
|
30
|
-
*/
|
|
31
|
-
const FIXES_ISSUE_PATTERN = /fix(?:es)?:?\s*#?(\d+(?:, *#?\d+)*)/i;
|
|
32
|
-
/**
|
|
33
|
-
* Matches "refs #123" or "ref: #456, #789" patterns (case-insensitive).
|
|
34
|
-
*
|
|
35
|
-
* Capture group `[1]` contains the comma-separated issue number list.
|
|
36
|
-
*
|
|
37
|
-
* @internal
|
|
38
|
-
*/
|
|
39
|
-
const REFS_ISSUE_PATTERN = /refs?:?\s*#?(\d+(?:, *#?\d+)*)/i;
|
|
40
|
-
/**
|
|
41
|
-
* Pattern for splitting comma-separated issue numbers.
|
|
42
|
-
*
|
|
43
|
-
* @internal
|
|
44
|
-
*/
|
|
45
|
-
const ISSUE_NUMBER_SPLIT_PATTERN = /, */;
|
|
46
|
-
/**
|
|
47
|
-
* Extract issue numbers from a regex match against a commit message.
|
|
48
|
-
*
|
|
49
|
-
* @remarks
|
|
50
|
-
* Truncates the input to 10,000 characters before matching to prevent
|
|
51
|
-
* ReDoS on adversarial input. Strips `#` prefixes from matched numbers.
|
|
52
|
-
*
|
|
53
|
-
* @param pattern - The regex pattern to match (must have a capture group for issue numbers)
|
|
54
|
-
* @param message - The commit message body to search
|
|
55
|
-
* @returns Array of issue number strings (without `#` prefix)
|
|
56
|
-
*
|
|
57
|
-
* @internal
|
|
58
|
-
*/
|
|
59
|
-
function extractIssueNumbers(pattern, message) {
|
|
60
|
-
const safeMessage = message.slice(0, 1e4);
|
|
61
|
-
const match = pattern.exec(safeMessage);
|
|
62
|
-
if (!match?.[1]) return [];
|
|
63
|
-
return match[1].split(ISSUE_NUMBER_SPLIT_PATTERN).map((num) => num.replace("#", "").trim());
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Parse a commit message for GitHub issue references.
|
|
67
|
-
*
|
|
68
|
-
* Recognizes `Closes`, `Fixes`, and `Refs` keywords with various formats:
|
|
69
|
-
* - `Closes #123`
|
|
70
|
-
* - `Fixes: #456, #789`
|
|
71
|
-
* - `Refs #101`
|
|
72
|
-
*
|
|
73
|
-
* @remarks
|
|
74
|
-
* Each keyword category is matched independently, so a single commit
|
|
75
|
-
* message can contain references in all three categories. Keywords are
|
|
76
|
-
* case-insensitive and accept both singular and plural forms.
|
|
77
|
-
*
|
|
78
|
-
* @param commitMessage - The commit message body to parse
|
|
79
|
-
* @returns Categorized issue references with numbers as strings (no `#` prefix)
|
|
80
|
-
*
|
|
81
|
-
* @example
|
|
82
|
-
* ```typescript
|
|
83
|
-
* import { parseIssueReferences } from "../utils/issue-refs.js";
|
|
84
|
-
*
|
|
85
|
-
* const refs = parseIssueReferences("feat: add API\n\nCloses #42\nFixes: #17, #23");
|
|
86
|
-
* // refs.closes === ["42"]
|
|
87
|
-
* // refs.fixes === ["17", "23"]
|
|
88
|
-
* // refs.refs === []
|
|
89
|
-
* ```
|
|
90
|
-
*
|
|
91
|
-
* @internal
|
|
92
|
-
*/
|
|
93
|
-
function parseIssueReferences(commitMessage) {
|
|
94
|
-
return {
|
|
95
|
-
closes: extractIssueNumbers(CLOSES_ISSUE_PATTERN, commitMessage),
|
|
96
|
-
fixes: extractIssueNumbers(FIXES_ISSUE_PATTERN, commitMessage),
|
|
97
|
-
refs: extractIssueNumbers(REFS_ISSUE_PATTERN, commitMessage)
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
//#endregion
|
|
102
|
-
exports.parseIssueReferences = parseIssueReferences;
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
//#region ../silk-effects/dist/dev/pkg/changesets/utils/issue-refs.js
|
|
2
|
-
/**
|
|
3
|
-
* GitHub issue reference parsing from commit messages.
|
|
4
|
-
*
|
|
5
|
-
* @remarks
|
|
6
|
-
* Extracts categorized issue references (`Closes`, `Fixes`, `Refs`) from
|
|
7
|
-
* commit message bodies. Supports multiple formats including with/without
|
|
8
|
-
* colons, singular/plural keywords, and comma-separated issue lists.
|
|
9
|
-
* Input is truncated to 10,000 characters to prevent ReDoS on adversarial input.
|
|
10
|
-
*
|
|
11
|
-
* @see {@link Changelog} for the public API that consumes issue references
|
|
12
|
-
*
|
|
13
|
-
* @internal
|
|
14
|
-
*/
|
|
15
|
-
/**
|
|
16
|
-
* Matches "closes #123" or "close: #456, #789" patterns (case-insensitive).
|
|
17
|
-
*
|
|
18
|
-
* Capture group `[1]` contains the comma-separated issue number list.
|
|
19
|
-
*
|
|
20
|
-
* @internal
|
|
21
|
-
*/
|
|
22
|
-
const CLOSES_ISSUE_PATTERN = /closes?:?\s*#?(\d+(?:, *#?\d+)*)/i;
|
|
23
|
-
/**
|
|
24
|
-
* Matches "fixes #123" or "fix: #456, #789" patterns (case-insensitive).
|
|
25
|
-
*
|
|
26
|
-
* Capture group `[1]` contains the comma-separated issue number list.
|
|
27
|
-
*
|
|
28
|
-
* @internal
|
|
29
|
-
*/
|
|
30
|
-
const FIXES_ISSUE_PATTERN = /fix(?:es)?:?\s*#?(\d+(?:, *#?\d+)*)/i;
|
|
31
|
-
/**
|
|
32
|
-
* Matches "refs #123" or "ref: #456, #789" patterns (case-insensitive).
|
|
33
|
-
*
|
|
34
|
-
* Capture group `[1]` contains the comma-separated issue number list.
|
|
35
|
-
*
|
|
36
|
-
* @internal
|
|
37
|
-
*/
|
|
38
|
-
const REFS_ISSUE_PATTERN = /refs?:?\s*#?(\d+(?:, *#?\d+)*)/i;
|
|
39
|
-
/**
|
|
40
|
-
* Pattern for splitting comma-separated issue numbers.
|
|
41
|
-
*
|
|
42
|
-
* @internal
|
|
43
|
-
*/
|
|
44
|
-
const ISSUE_NUMBER_SPLIT_PATTERN = /, */;
|
|
45
|
-
/**
|
|
46
|
-
* Extract issue numbers from a regex match against a commit message.
|
|
47
|
-
*
|
|
48
|
-
* @remarks
|
|
49
|
-
* Truncates the input to 10,000 characters before matching to prevent
|
|
50
|
-
* ReDoS on adversarial input. Strips `#` prefixes from matched numbers.
|
|
51
|
-
*
|
|
52
|
-
* @param pattern - The regex pattern to match (must have a capture group for issue numbers)
|
|
53
|
-
* @param message - The commit message body to search
|
|
54
|
-
* @returns Array of issue number strings (without `#` prefix)
|
|
55
|
-
*
|
|
56
|
-
* @internal
|
|
57
|
-
*/
|
|
58
|
-
function extractIssueNumbers(pattern, message) {
|
|
59
|
-
const safeMessage = message.slice(0, 1e4);
|
|
60
|
-
const match = pattern.exec(safeMessage);
|
|
61
|
-
if (!match?.[1]) return [];
|
|
62
|
-
return match[1].split(ISSUE_NUMBER_SPLIT_PATTERN).map((num) => num.replace("#", "").trim());
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Parse a commit message for GitHub issue references.
|
|
66
|
-
*
|
|
67
|
-
* Recognizes `Closes`, `Fixes`, and `Refs` keywords with various formats:
|
|
68
|
-
* - `Closes #123`
|
|
69
|
-
* - `Fixes: #456, #789`
|
|
70
|
-
* - `Refs #101`
|
|
71
|
-
*
|
|
72
|
-
* @remarks
|
|
73
|
-
* Each keyword category is matched independently, so a single commit
|
|
74
|
-
* message can contain references in all three categories. Keywords are
|
|
75
|
-
* case-insensitive and accept both singular and plural forms.
|
|
76
|
-
*
|
|
77
|
-
* @param commitMessage - The commit message body to parse
|
|
78
|
-
* @returns Categorized issue references with numbers as strings (no `#` prefix)
|
|
79
|
-
*
|
|
80
|
-
* @example
|
|
81
|
-
* ```typescript
|
|
82
|
-
* import { parseIssueReferences } from "../utils/issue-refs.js";
|
|
83
|
-
*
|
|
84
|
-
* const refs = parseIssueReferences("feat: add API\n\nCloses #42\nFixes: #17, #23");
|
|
85
|
-
* // refs.closes === ["42"]
|
|
86
|
-
* // refs.fixes === ["17", "23"]
|
|
87
|
-
* // refs.refs === []
|
|
88
|
-
* ```
|
|
89
|
-
*
|
|
90
|
-
* @internal
|
|
91
|
-
*/
|
|
92
|
-
function parseIssueReferences(commitMessage) {
|
|
93
|
-
return {
|
|
94
|
-
closes: extractIssueNumbers(CLOSES_ISSUE_PATTERN, commitMessage),
|
|
95
|
-
fixes: extractIssueNumbers(FIXES_ISSUE_PATTERN, commitMessage),
|
|
96
|
-
refs: extractIssueNumbers(REFS_ISSUE_PATTERN, commitMessage)
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
//#endregion
|
|
101
|
-
export { parseIssueReferences };
|