@mnaoumov/typescript-dev-toolkit 6.0.2 → 6.2.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 +36 -0
- package/dist/lib/cjs/changelog-grouping.cjs +132 -0
- package/dist/lib/cjs/changelog-grouping.d.cts +59 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/linters/eslint-config.cjs +4 -1
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +3 -1
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +4 -1
- package/dist/lib/cjs/linters/eslint-rules/index.d.cts +1 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-spread.cjs +114 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-spread.d.cts +12 -0
- package/dist/lib/cjs/version.cjs +111 -23
- package/dist/lib/cjs/version.d.cts +41 -0
- package/dist/lib/esm/changelog-grouping.d.mts +59 -0
- package/dist/lib/esm/changelog-grouping.mjs +106 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/linters/eslint-config.mjs +4 -1
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +3 -1
- package/dist/lib/esm/linters/eslint-rules/index.d.mts +1 -0
- package/dist/lib/esm/linters/eslint-rules/index.mjs +3 -1
- package/dist/lib/esm/linters/eslint-rules/prefer-spread.d.mts +12 -0
- package/dist/lib/esm/linters/eslint-rules/prefer-spread.mjs +80 -0
- package/dist/lib/esm/version.d.mts +41 -0
- package/dist/lib/esm/version.mjs +114 -23
- package/linters/eslint-rules/prefer-spread/package.json +6 -0
- package/package.json +21 -21
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return '/';
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: 'android'
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const existingProcess = globalThis.process;
|
|
17
|
+
|
|
18
|
+
if (!existingProcess) {
|
|
19
|
+
globalThis.process = browserProcess;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (existingProcess.versions?.node) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const existingProcessRecord = existingProcess;
|
|
28
|
+
|
|
29
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
30
|
+
existingProcessRecord[key] ??= value;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
existingProcessRecord['browser'] = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
ensureBrowserProcess();
|
|
37
|
+
})();
|
|
38
|
+
|
|
39
|
+
import { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
|
|
40
|
+
import eslintPluginUnicorn from "eslint-plugin-unicorn";
|
|
41
|
+
import { toTSESTreeNode } from "./ts-estree-node.mjs";
|
|
42
|
+
const unicornRule = ensureNonNullable(ensureNonNullable(eslintPluginUnicorn.rules)["prefer-spread"]);
|
|
43
|
+
const preferSpread = {
|
|
44
|
+
create(context) {
|
|
45
|
+
const reportingContext = Object.create(context, {
|
|
46
|
+
report: {
|
|
47
|
+
value(descriptor) {
|
|
48
|
+
const { messageId, node } = descriptor;
|
|
49
|
+
if (messageId === "array-slice" && !isArrayReceiver(node, context.sourceCode)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
context.report(descriptor);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
return unicornRule.create(reportingContext);
|
|
57
|
+
},
|
|
58
|
+
meta: {
|
|
59
|
+
...unicornRule.meta,
|
|
60
|
+
docs: {
|
|
61
|
+
description: "Prefer spread syntax without changing the type returned by slice"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
function isArrayReceiver(node, sourceCode) {
|
|
66
|
+
const member = ensureNonNullable(sourceCode.getAncestors(node).at(-1));
|
|
67
|
+
const services = sourceCode.parserServices;
|
|
68
|
+
if (!services.program) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
const checker = services.program.getTypeChecker();
|
|
72
|
+
const receiverType = checker.getTypeAtLocation(ensureNonNullable(services.esTreeNodeToTSNodeMap).get(toTSESTreeNode(member.object)));
|
|
73
|
+
const type = checker.getBaseConstraintOfType(receiverType) ?? receiverType;
|
|
74
|
+
const constituents = type.isUnion() ? type.types : [type];
|
|
75
|
+
return constituents.every((constituent) => checker.isArrayType(constituent) || checker.isTupleType(constituent));
|
|
76
|
+
}
|
|
77
|
+
export {
|
|
78
|
+
preferSpread
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saW50ZXJzL2VzbGludC1ydWxlcy9wcmVmZXItc3ByZWFkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBVbmljb3JuJ3Mgc3ByZWFkIHJ1bGUsIHdpdGggc2xpY2UgcmV3cml0ZXMgcmVzdHJpY3RlZCB0byBwcm92ZW4gYXJyYXkgcmVjZWl2ZXJzLlxuICogQSB0eXBlZCBhcnJheSdzIHNsaWNlIHByZXNlcnZlcyBpdHMgdHlwZTsgc3ByZWFkaW5nIGl0IHByb2R1Y2VzIGFuIG9yZGluYXJ5IGFycmF5LlxuICovXG5cbmltcG9ydCB0eXBlIHsgUGFyc2VyU2VydmljZXNXaXRoVHlwZUluZm9ybWF0aW9uIH0gZnJvbSAnQHR5cGVzY3JpcHQtZXNsaW50L3V0aWxzJztcbmltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gJ2VzbGludCc7XG5pbXBvcnQgdHlwZSB7XG4gIE1lbWJlckV4cHJlc3Npb24sXG4gIE5vZGVcbn0gZnJvbSAnZXN0cmVlJztcblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IGVzbGludFBsdWdpblVuaWNvcm4gZnJvbSAnZXNsaW50LXBsdWdpbi11bmljb3JuJztcblxuaW1wb3J0IHsgdG9UU0VTVHJlZU5vZGUgfSBmcm9tICcuL3RzLWVzdHJlZS1ub2RlLnRzJztcblxuY29uc3QgdW5pY29yblJ1bGUgPSBlbnN1cmVOb25OdWxsYWJsZShlbnN1cmVOb25OdWxsYWJsZShlc2xpbnRQbHVnaW5Vbmljb3JuLnJ1bGVzKVsncHJlZmVyLXNwcmVhZCddKSBhcyBSdWxlLlJ1bGVNb2R1bGU7XG5cbmludGVyZmFjZSBTcHJlYWRSZXBvcnREZXNjcmlwdG9yIHtcbiAgcmVhZG9ubHkgbWVzc2FnZUlkPzogc3RyaW5nO1xuICByZWFkb25seSBub2RlOiBOb2RlO1xufVxuXG4vKipcbiAqIFByZWZlcnMgc3ByZWFkIHN5bnRheCB3aGlsZSBwcmVzZXJ2aW5nIHNsaWNlIGNhbGxzIHdob3NlIHJlY2VpdmVyIGlzIG5vdCBwcm92ZW4gdG8gYmUgYW4gYXJyYXkuXG4gKi9cbmV4cG9ydCBjb25zdCBwcmVmZXJTcHJlYWQ6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCByZXBvcnRpbmdDb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0ID0gT2JqZWN0LmNyZWF0ZShjb250ZXh0LCB7XG4gICAgICByZXBvcnQ6IHtcbiAgICAgICAgdmFsdWUoZGVzY3JpcHRvcjogUnVsZS5SZXBvcnREZXNjcmlwdG9yKTogdm9pZCB7XG4gICAgICAgICAgY29uc3QgeyBtZXNzYWdlSWQsIG5vZGUgfSA9IGRlc2NyaXB0b3IgYXMgU3ByZWFkUmVwb3J0RGVzY3JpcHRvcjtcbiAgICAgICAgICBpZiAobWVzc2FnZUlkID09PSAnYXJyYXktc2xpY2UnICYmICFpc0FycmF5UmVjZWl2ZXIobm9kZSwgY29udGV4dC5zb3VyY2VDb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZXh0LnJlcG9ydChkZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB1bmljb3JuUnVsZS5jcmVhdGUocmVwb3J0aW5nQ29udGV4dCk7XG4gIH0sXG4gIG1ldGE6IHtcbiAgICAuLi51bmljb3JuUnVsZS5tZXRhLFxuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUHJlZmVyIHNwcmVhZCBzeW50YXggd2l0aG91dCBjaGFuZ2luZyB0aGUgdHlwZSByZXR1cm5lZCBieSBzbGljZSdcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGlzQXJyYXlSZWNlaXZlcihub2RlOiBOb2RlLCBzb3VyY2VDb2RlOiBSdWxlLlJ1bGVDb250ZXh0Wydzb3VyY2VDb2RlJ10pOiBib29sZWFuIHtcbiAgLy8gVW5pY29ybiByZXBvcnRzIGFycmF5LXNsaWNlIG9uIHRoZSBtZXRob2QgcHJvcGVydHkgb2YgYSBtZW1iZXIgZXhwcmVzc2lvbi5cbiAgY29uc3QgbWVtYmVyID0gZW5zdXJlTm9uTnVsbGFibGUoc291cmNlQ29kZS5nZXRBbmNlc3RvcnMobm9kZSkuYXQoLTEpKSBhcyBNZW1iZXJFeHByZXNzaW9uO1xuICBjb25zdCBzZXJ2aWNlcyA9IHNvdXJjZUNvZGUucGFyc2VyU2VydmljZXMgYXMgUGFydGlhbDxQYXJzZXJTZXJ2aWNlc1dpdGhUeXBlSW5mb3JtYXRpb24+O1xuICBpZiAoIXNlcnZpY2VzLnByb2dyYW0pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY2hlY2tlciA9IHNlcnZpY2VzLnByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3QgcmVjZWl2ZXJUeXBlID0gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihlbnN1cmVOb25OdWxsYWJsZShzZXJ2aWNlcy5lc1RyZWVOb2RlVG9UU05vZGVNYXApLmdldCh0b1RTRVNUcmVlTm9kZShtZW1iZXIub2JqZWN0KSkpO1xuICBjb25zdCB0eXBlID0gY2hlY2tlci5nZXRCYXNlQ29uc3RyYWludE9mVHlwZShyZWNlaXZlclR5cGUpID8/IHJlY2VpdmVyVHlwZTtcbiAgY29uc3QgY29uc3RpdHVlbnRzID0gdHlwZS5pc1VuaW9uKCkgPyB0eXBlLnR5cGVzIDogW3R5cGVdO1xuICByZXR1cm4gY29uc3RpdHVlbnRzLmV2ZXJ5KChjb25zdGl0dWVudCkgPT4gY2hlY2tlci5pc0FycmF5VHlwZShjb25zdGl0dWVudCkgfHwgY2hlY2tlci5pc1R1cGxlVHlwZShjb25zdGl0dWVudCkpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLFNBQVMseUJBQXlCO0FBQ2xDLE9BQU8seUJBQXlCO0FBRWhDLFNBQVMsc0JBQXNCO0FBRS9CLE1BQU0sY0FBYyxrQkFBa0Isa0JBQWtCLG9CQUFvQixLQUFLLEVBQUUsZUFBZSxDQUFDO0FBVTVGLE1BQU0sZUFBZ0M7QUFBQSxFQUMzQyxPQUFPLFNBQVM7QUFDZCxVQUFNLG1CQUFxQyxPQUFPLE9BQU8sU0FBUztBQUFBLE1BQ2hFLFFBQVE7QUFBQSxRQUNOLE1BQU0sWUFBeUM7QUFDN0MsZ0JBQU0sRUFBRSxXQUFXLEtBQUssSUFBSTtBQUM1QixjQUFJLGNBQWMsaUJBQWlCLENBQUMsZ0JBQWdCLE1BQU0sUUFBUSxVQUFVLEdBQUc7QUFDN0U7QUFBQSxVQUNGO0FBQ0Esa0JBQVEsT0FBTyxVQUFVO0FBQUEsUUFDM0I7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDO0FBQ0QsV0FBTyxZQUFZLE9BQU8sZ0JBQWdCO0FBQUEsRUFDNUM7QUFBQSxFQUNBLE1BQU07QUFBQSxJQUNKLEdBQUcsWUFBWTtBQUFBLElBQ2YsTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLGdCQUFnQixNQUFZLFlBQXFEO0FBRXhGLFFBQU0sU0FBUyxrQkFBa0IsV0FBVyxhQUFhLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNyRSxRQUFNLFdBQVcsV0FBVztBQUM1QixNQUFJLENBQUMsU0FBUyxTQUFTO0FBQ3JCLFdBQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxVQUFVLFNBQVMsUUFBUSxlQUFlO0FBQ2hELFFBQU0sZUFBZSxRQUFRLGtCQUFrQixrQkFBa0IsU0FBUyxxQkFBcUIsRUFBRSxJQUFJLGVBQWUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUNuSSxRQUFNLE9BQU8sUUFBUSx3QkFBd0IsWUFBWSxLQUFLO0FBQzlELFFBQU0sZUFBZSxLQUFLLFFBQVEsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJO0FBQ3hELFNBQU8sYUFBYSxNQUFNLENBQUMsZ0JBQWdCLFFBQVEsWUFBWSxXQUFXLEtBQUssUUFBUSxZQUFZLFdBQVcsQ0FBQztBQUNqSDsiLCJuYW1lcyI6W119
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* Git operations such as tagging and pushing.
|
|
10
10
|
*/
|
|
11
11
|
import { parseArgs } from 'node:util';
|
|
12
|
+
import type { ChangelogStyle } from './changelog-grouping.mjs';
|
|
12
13
|
/**
|
|
13
14
|
* Options for {@link addUpdatedFilesToGit}.
|
|
14
15
|
*/
|
|
@@ -53,6 +54,13 @@ export interface PublishGitHubReleaseOptions {
|
|
|
53
54
|
* @default `true`
|
|
54
55
|
*/
|
|
55
56
|
readonly shouldCloseReleasedIssues?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Whether to require every asset to exist, require an existing remote tag, and verify the published
|
|
59
|
+
* non-draft release and its uploaded assets before closing issues.
|
|
60
|
+
*
|
|
61
|
+
* @default `false`
|
|
62
|
+
*/
|
|
63
|
+
readonly shouldVerifyRelease?: boolean;
|
|
56
64
|
}
|
|
57
65
|
/**
|
|
58
66
|
* Options for {@link updateChangelog}.
|
|
@@ -69,6 +77,16 @@ export interface UpdateChangelogOptions {
|
|
|
69
77
|
* @default the first-parent commit subjects since the previous version
|
|
70
78
|
*/
|
|
71
79
|
readonly changelogFilePath?: string | undefined;
|
|
80
|
+
/**
|
|
81
|
+
* How the section generated from the commit messages is laid out: `grouped` sorts the entries under plain-language
|
|
82
|
+
* headings and counts the maintenance commits instead of listing them, `commits` writes one bullet per first-parent
|
|
83
|
+
* commit. See {@link ChangelogStyle}.
|
|
84
|
+
*
|
|
85
|
+
* Ignored when {@link changelogFilePath} is set.
|
|
86
|
+
*
|
|
87
|
+
* @default `'grouped'`
|
|
88
|
+
*/
|
|
89
|
+
readonly changelogStyle?: ChangelogStyle | undefined;
|
|
72
90
|
/**
|
|
73
91
|
* Whether to open the generated changelog in the editor for an interactive review. When `false`,
|
|
74
92
|
* the changelog is still generated from commit messages, but it is not opened in the editor for
|
|
@@ -95,6 +113,12 @@ export interface UpdateVersionOptions {
|
|
|
95
113
|
* @default the first-parent commit subjects since the previous version
|
|
96
114
|
*/
|
|
97
115
|
readonly changelogFilePath?: string | undefined;
|
|
116
|
+
/**
|
|
117
|
+
* How the section generated from the commit messages is laid out. See {@link UpdateChangelogOptions.changelogStyle}.
|
|
118
|
+
*
|
|
119
|
+
* @default `'grouped'`
|
|
120
|
+
*/
|
|
121
|
+
readonly changelogStyle?: ChangelogStyle | undefined;
|
|
98
122
|
/**
|
|
99
123
|
* Returns the files to attach to the GitHub release. See {@link PublishGitHubReleaseOptions.getReleaseAssetPaths}.
|
|
100
124
|
*/
|
|
@@ -133,6 +157,16 @@ export interface UpdateVersionOptions {
|
|
|
133
157
|
* @default `true`
|
|
134
158
|
*/
|
|
135
159
|
readonly shouldEditChangelog?: boolean;
|
|
160
|
+
/**
|
|
161
|
+
* Whether to publish and verify the GitHub release before pushing the version commit to the branch.
|
|
162
|
+
* Preparation and asset validation happen before any push. Only the release tag is pushed first;
|
|
163
|
+
* a failed preparation, publication or verification leaves the remote branch unchanged.
|
|
164
|
+
* Uses the `origin` remote and pushes the verified commit to the original branch without force.
|
|
165
|
+
* Ignored when {@link shouldRelease} is `false`.
|
|
166
|
+
*
|
|
167
|
+
* @default `false`
|
|
168
|
+
*/
|
|
169
|
+
readonly shouldPublishBeforePush?: boolean;
|
|
136
170
|
/**
|
|
137
171
|
* Whether to publish the release. When `false`, all local steps are executed (version bump,
|
|
138
172
|
* changelog, commit, tag), but the changes are not pushed and no GitHub release is published.
|
|
@@ -317,6 +351,9 @@ export declare const VERSION_ARGUMENT_OPTIONS: {
|
|
|
317
351
|
readonly 'changelog-file': {
|
|
318
352
|
readonly type: "string";
|
|
319
353
|
};
|
|
354
|
+
readonly 'changelog-style': {
|
|
355
|
+
readonly type: "string";
|
|
356
|
+
};
|
|
320
357
|
readonly 'no-build': {
|
|
321
358
|
readonly type: "boolean";
|
|
322
359
|
};
|
|
@@ -364,6 +401,7 @@ export declare function isPreRelease(version: string): boolean;
|
|
|
364
401
|
* value instead and has no default. Recognized flags:
|
|
365
402
|
* - `--changelog-file=<path>` — use this file's contents as the new version's changelog section instead of
|
|
366
403
|
* the commit-derived bullets, and skip the interactive review entirely.
|
|
404
|
+
* - `--changelog-style=<grouped|commits>` — how the commit-derived section is laid out (default `grouped`).
|
|
367
405
|
* - `--no-build` — skip the build step (only safe when the build output already matches the current code).
|
|
368
406
|
* - `--no-changelog-editing` — generate the changelog without opening it for manual review.
|
|
369
407
|
* - `--no-checks` — skip the clean-repo check, format, spellcheck, lint, over-exposure analysis, and tests (the build still runs).
|
|
@@ -431,6 +469,9 @@ export declare function updateChangelog(newVersion: string, options?: UpdateChan
|
|
|
431
469
|
* 11. Prepares and publishes a GitHub release.
|
|
432
470
|
* 12. Closes the issues the release carries, with a link to it.
|
|
433
471
|
*
|
|
472
|
+
* With {@link UpdateVersionOptions.shouldPublishBeforePush}, preparation and asset validation precede
|
|
473
|
+
* the tag push. Publication and verification then precede the branch push, and issue closing remains last.
|
|
474
|
+
*
|
|
434
475
|
* @param versionUpdateType - The type of version update to perform (major, minor, patch, premajor, preminor, prepatch, prerelease, or x.y.z[-suffix]).
|
|
435
476
|
* @param options - The {@link UpdateVersionOptions} controlling the release behavior.
|
|
436
477
|
* @returns A {@link Promise} that resolves when the version update is complete.
|