@mnaoumov/typescript-dev-toolkit 6.1.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/bin/rewrite-changelog.mjs +8 -0
- package/dist/lib/cjs/changelog-grouping.cjs +153 -0
- package/dist/lib/cjs/changelog-grouping.d.cts +70 -0
- package/dist/lib/cjs/changelog-rewrite-cli.cjs +177 -0
- package/dist/lib/cjs/changelog-rewrite-cli.d.cts +105 -0
- package/dist/lib/cjs/changelog-rewrite.cjs +143 -0
- package/dist/lib/cjs/changelog-rewrite.d.cts +108 -0
- package/dist/lib/cjs/index.cjs +10 -1
- package/dist/lib/cjs/index.d.cts +3 -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 +57 -22
- package/dist/lib/cjs/version.d.cts +29 -0
- package/dist/lib/esm/changelog-grouping.d.mts +70 -0
- package/dist/lib/esm/changelog-grouping.mjs +126 -0
- package/dist/lib/esm/changelog-rewrite-cli.d.mts +105 -0
- package/dist/lib/esm/changelog-rewrite-cli.mjs +147 -0
- package/dist/lib/esm/changelog-rewrite.d.mts +108 -0
- package/dist/lib/esm/changelog-rewrite.mjs +118 -0
- package/dist/lib/esm/index.d.mts +3 -0
- package/dist/lib/esm/index.mjs +7 -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 +29 -0
- package/dist/lib/esm/version.mjs +59 -22
- package/linters/eslint-rules/prefer-spread/package.json +6 -0
- package/package.json +2 -1
|
@@ -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 { ChangelogCommitEntry, ChangelogStyle } from './changelog-grouping.mjs';
|
|
12
13
|
/**
|
|
13
14
|
* Options for {@link addUpdatedFilesToGit}.
|
|
14
15
|
*/
|
|
@@ -76,6 +77,16 @@ export interface UpdateChangelogOptions {
|
|
|
76
77
|
* @default the first-parent commit subjects since the previous version
|
|
77
78
|
*/
|
|
78
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;
|
|
79
90
|
/**
|
|
80
91
|
* Whether to open the generated changelog in the editor for an interactive review. When `false`,
|
|
81
92
|
* the changelog is still generated from commit messages, but it is not opened in the editor for
|
|
@@ -102,6 +113,12 @@ export interface UpdateVersionOptions {
|
|
|
102
113
|
* @default the first-parent commit subjects since the previous version
|
|
103
114
|
*/
|
|
104
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;
|
|
105
122
|
/**
|
|
106
123
|
* Returns the files to attach to the GitHub release. See {@link PublishGitHubReleaseOptions.getReleaseAssetPaths}.
|
|
107
124
|
*/
|
|
@@ -334,6 +351,9 @@ export declare const VERSION_ARGUMENT_OPTIONS: {
|
|
|
334
351
|
readonly 'changelog-file': {
|
|
335
352
|
readonly type: "string";
|
|
336
353
|
};
|
|
354
|
+
readonly 'changelog-style': {
|
|
355
|
+
readonly type: "string";
|
|
356
|
+
};
|
|
337
357
|
readonly 'no-build': {
|
|
338
358
|
readonly type: "boolean";
|
|
339
359
|
};
|
|
@@ -381,6 +401,7 @@ export declare function isPreRelease(version: string): boolean;
|
|
|
381
401
|
* value instead and has no default. Recognized flags:
|
|
382
402
|
* - `--changelog-file=<path>` — use this file's contents as the new version's changelog section instead of
|
|
383
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`).
|
|
384
405
|
* - `--no-build` — skip the build step (only safe when the build output already matches the current code).
|
|
385
406
|
* - `--no-changelog-editing` — generate the changelog without opening it for manual review.
|
|
386
407
|
* - `--no-checks` — skip the clean-repo check, format, spellcheck, lint, over-exposure analysis, and tests (the build still runs).
|
|
@@ -406,6 +427,14 @@ export declare function parseVersionArguments($arguments: string[]): ParsedVersi
|
|
|
406
427
|
* @returns A {@link Promise} that resolves when the release has been published.
|
|
407
428
|
*/
|
|
408
429
|
export declare function publishGitHubRelease(newVersion: string, options?: PublishGitHubReleaseOptions): Promise<void>;
|
|
430
|
+
/**
|
|
431
|
+
* Reads one first-parent commit into the parts both changelog styles render: the line {@link toChangelogEntry}
|
|
432
|
+
* describes, the issue references it does not already show, and what else the body says.
|
|
433
|
+
*
|
|
434
|
+
* @param commitMessage - The full commit message.
|
|
435
|
+
* @returns The parts, with bare URLs in the entry and the detail lines autolinked.
|
|
436
|
+
*/
|
|
437
|
+
export declare function toChangelogCommitEntry(commitMessage: string): ChangelogCommitEntry;
|
|
409
438
|
/**
|
|
410
439
|
* Maps the values `parseArgs` reports for {@link VERSION_ARGUMENT_OPTIONS} onto {@link UpdateVersionOptions}.
|
|
411
440
|
*
|