@jakubmazanec/carson-templates 7.1.0-unstable.f3a920ed → 7.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/package.json +9 -9
- package/templates/workspace/.github/tools/create-dependencies-changeset.ts.ejs +25 -31
- package/templates/workspace/.github/tools/create-templates-changeset.ts.ejs +131 -0
- package/templates/workspace/.github/workflows/update-pull-request.yaml.ejs +1 -1
- package/templates/workspace/renovate.json.ejs +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jakubmazanec/carson-templates",
|
|
3
|
-
"version": "7.1.0
|
|
3
|
+
"version": "7.1.0",
|
|
4
4
|
"description": "Collection of Carson templates.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -31,29 +31,29 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"lodash": "^4.17.21",
|
|
34
|
-
"semver": "^7.7.
|
|
34
|
+
"semver": "^7.7.3"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@jakubmazanec/carson": "^3.0.0",
|
|
38
38
|
"@jakubmazanec/eslint-config": "^4.1.0",
|
|
39
39
|
"@jakubmazanec/fs-utils": "^0.2.0",
|
|
40
40
|
"@types/fs-extra": "^11.0.4",
|
|
41
|
-
"@types/lodash": "^4.17.
|
|
41
|
+
"@types/lodash": "^4.17.21",
|
|
42
42
|
"@types/node": "^24.0.4",
|
|
43
|
-
"@types/semver": "^7.7.
|
|
43
|
+
"@types/semver": "^7.7.1",
|
|
44
44
|
"@types/zen-observable": "^0.8.7",
|
|
45
45
|
"@vitest/coverage-v8": "^3.2.4",
|
|
46
46
|
"del-cli": "^6.0.0",
|
|
47
|
-
"esbuild": "^0.
|
|
47
|
+
"esbuild": "^0.27.0",
|
|
48
48
|
"eslint": "^9.33.0",
|
|
49
49
|
"execa": "^9.6.0",
|
|
50
50
|
"fast-glob": "^3.3.3",
|
|
51
|
-
"fs-extra": "^11.3.
|
|
51
|
+
"fs-extra": "^11.3.2",
|
|
52
52
|
"prettier": "^3.6.2",
|
|
53
53
|
"prettier-plugin-packagejson": "^2.5.19",
|
|
54
|
-
"typedoc": "^0.28.
|
|
55
|
-
"typedoc-plugin-markdown": "^4.
|
|
56
|
-
"typescript": "^5.9.
|
|
54
|
+
"typedoc": "^0.28.14",
|
|
55
|
+
"typedoc-plugin-markdown": "^4.9.0",
|
|
56
|
+
"typescript": "^5.9.3",
|
|
57
57
|
"vitest": "^3.2.4",
|
|
58
58
|
"zen-observable": "^0.10.0"
|
|
59
59
|
},
|
|
@@ -24,7 +24,7 @@ type ProjectDependencyBumps = Map<string, string>;
|
|
|
24
24
|
type DependencyBumps = Map<string, ProjectDependencyBumps>;
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
* A function that returns all
|
|
27
|
+
* A function that returns all projects that use Carson.
|
|
28
28
|
*/
|
|
29
29
|
async function getProjectsWithCarson(dir = process.cwd(), result: string[] = []) {
|
|
30
30
|
let entries = await fs.readdir(dir, {withFileTypes: true});
|
|
@@ -76,8 +76,8 @@ async function checkCarsonTemplatesPackage(dependencyBumps: DependencyBumps) {
|
|
|
76
76
|
let newMajorVersion = semver.major(semver.minVersion(bump)!);
|
|
77
77
|
let oldMajorVersion = semver.major(semver.minVersion(result[0])!);
|
|
78
78
|
|
|
79
|
+
// Node.js is a special case, because it isn't specified in `dependencies` field
|
|
79
80
|
if (newMajorVersion > oldMajorVersion || dependencyName === 'node') {
|
|
80
|
-
// Node.js is a special case, because it isn't specified in `dependencies` field
|
|
81
81
|
throw new Error(
|
|
82
82
|
`Bumping major version of dependency "${dependencyName}" that is handled by Carson, update of the Carson template package is needed!`,
|
|
83
83
|
);
|
|
@@ -173,37 +173,31 @@ async function getDependencyBumps(files: string[]): Promise<DependencyBumps> {
|
|
|
173
173
|
return bumps;
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
let {stdout:
|
|
177
|
-
let
|
|
176
|
+
let {stdout: diff} = await $`git diff --name-only HEAD~1`;
|
|
177
|
+
let files = diff.split('\n').filter((file) => file.endsWith('package.json'));
|
|
178
|
+
let {stdout: shortHash} = await $`git rev-parse --short HEAD`;
|
|
179
|
+
let getChangesetName = (suffix?: string) =>
|
|
180
|
+
suffix === undefined ?
|
|
181
|
+
`.changeset/dependencies-update-${shortHash.trim()}.md`
|
|
182
|
+
: `.changeset/dependencies-update-${shortHash.trim()}-${suffix.replaceAll('/', '-')}.md`;
|
|
178
183
|
|
|
179
|
-
|
|
180
|
-
|
|
184
|
+
let dependencyBumps = await getDependencyBumps(files);
|
|
185
|
+
|
|
186
|
+
console.log('Dependecy bumps:', dependencyBumps);
|
|
187
|
+
|
|
188
|
+
if (dependencyBumps.get(WORKSPACE_PLACEHOLDER_NAME)?.has(TEMPLATE_PACKAGE_NAME)) {
|
|
189
|
+
await createChangesetForCarsonTemplates(getChangesetName, dependencyBumps);
|
|
190
|
+
} else if (
|
|
191
|
+
dependencyBumps.size === 0 ||
|
|
192
|
+
(dependencyBumps.size === 1 && dependencyBumps.has(WORKSPACE_PLACEHOLDER_NAME))
|
|
193
|
+
) {
|
|
194
|
+
console.log('No package.json changes to projects, creating empty changeset...');
|
|
195
|
+
|
|
196
|
+
await fs.writeFile(getChangesetName(), '---\n---\n');
|
|
197
|
+
await checkCarsonTemplatesPackage(dependencyBumps);
|
|
181
198
|
} else {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
let getChangesetName = (suffix?: string) =>
|
|
185
|
-
suffix === undefined ?
|
|
186
|
-
`.changeset/dependencies-update-${shortHash.trim()}.md`
|
|
187
|
-
: `.changeset/dependencies-update-${shortHash.trim()}-${suffix.replaceAll('/', '-')}.md`;
|
|
188
|
-
|
|
189
|
-
let dependencyBumps = await getDependencyBumps(files);
|
|
190
|
-
|
|
191
|
-
console.log('Dependecy bumps:', dependencyBumps);
|
|
192
|
-
|
|
193
|
-
if (dependencyBumps.get(WORKSPACE_PLACEHOLDER_NAME)?.has(TEMPLATE_PACKAGE_NAME)) {
|
|
194
|
-
await createChangesetForCarsonTemplates(getChangesetName, dependencyBumps);
|
|
195
|
-
} else if (
|
|
196
|
-
dependencyBumps.size === 0 ||
|
|
197
|
-
(dependencyBumps.size === 1 && dependencyBumps.has(WORKSPACE_PLACEHOLDER_NAME))
|
|
198
|
-
) {
|
|
199
|
-
console.log('No package.json changes to projects, creating empty changeset...');
|
|
200
|
-
|
|
201
|
-
await fs.writeFile(getChangesetName(), '---\n---\n');
|
|
202
|
-
await checkCarsonTemplatesPackage(dependencyBumps);
|
|
203
|
-
} else {
|
|
204
|
-
await createChangeset(getChangesetName, dependencyBumps);
|
|
205
|
-
await checkCarsonTemplatesPackage(dependencyBumps);
|
|
206
|
-
}
|
|
199
|
+
await createChangeset(getChangesetName, dependencyBumps);
|
|
200
|
+
await checkCarsonTemplatesPackage(dependencyBumps);
|
|
207
201
|
}
|
|
208
202
|
|
|
209
203
|
console.log('Done!');
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
to: 'tools/scripts/create-templates-changeset.mts'
|
|
3
|
+
strategy: overwrite
|
|
4
|
+
---
|
|
5
|
+
/**
|
|
6
|
+
* DO NOT EDIT!
|
|
7
|
+
* This file was autogenerated by Carson.
|
|
8
|
+
* Changes may cause incorrect behavior and will be lost when the file is regenerated.
|
|
9
|
+
*
|
|
10
|
+
* Run `npx carson update workspace` to regenerate.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {$} from 'execa';
|
|
14
|
+
import _ from 'lodash';
|
|
15
|
+
import {promises as fs} from 'node:fs';
|
|
16
|
+
import semver from 'semver';
|
|
17
|
+
|
|
18
|
+
const WORKSPACE_PLACEHOLDER_NAME = '@';
|
|
19
|
+
const WORKSPACE_PACKAGE_JSON_PATH = 'package.json';
|
|
20
|
+
const TEMPLATE_PACKAGE_NAME = '<%- TEMPLATE_PACKAGE_NAME %>';
|
|
21
|
+
|
|
22
|
+
type ProjectDependencyBumps = Map<string, string>;
|
|
23
|
+
type DependencyBumps = Map<string, ProjectDependencyBumps>;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A function that checks if one of the updated dependencies was a major version bump that necessitates manual update of the Carson template package.
|
|
27
|
+
*/
|
|
28
|
+
async function checkCarsonTemplatesPackage(
|
|
29
|
+
getChangesetName: (suffix?: string) => string,
|
|
30
|
+
dependencyBumps: DependencyBumps,
|
|
31
|
+
) {
|
|
32
|
+
let constantsFilePath = '<%- `${workspace.projects.find((project) => project.name === TEMPLATE_PACKAGE_NAME)?.relativePath ?? ''}/source/constants.ts` %>';
|
|
33
|
+
let constantsFile = await fs.readFile(constantsFilePath, 'utf8');
|
|
34
|
+
let templatesBump: ProjectDependencyBumps = new Map();
|
|
35
|
+
|
|
36
|
+
for (let [, projectDependencyBumps] of dependencyBumps) {
|
|
37
|
+
if (!projectDependencyBumps.size) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
for (let [dependencyName, bump] of projectDependencyBumps) {
|
|
42
|
+
let regexp = new RegExp(
|
|
43
|
+
`(?<=('${_.escapeRegExp(dependencyName)}'|${_.escapeRegExp(dependencyName)}):\\s+')\\^\\d+\\.\\d+\\.\\d+(?='.*$)`,
|
|
44
|
+
'mi',
|
|
45
|
+
);
|
|
46
|
+
let result = regexp.exec(constantsFile);
|
|
47
|
+
|
|
48
|
+
if (result?.[0]) {
|
|
49
|
+
let newMajorVersion = semver.major(semver.minVersion(bump)!);
|
|
50
|
+
let oldMajorVersion = semver.major(semver.minVersion(result[0])!);
|
|
51
|
+
|
|
52
|
+
// Node.js is a special case, because it isn't specified in `dependencies` field
|
|
53
|
+
if (newMajorVersion > oldMajorVersion || dependencyName === 'node') {
|
|
54
|
+
templatesBump.set(dependencyName, `${newMajorVersion}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (templatesBump.size) {
|
|
61
|
+
console.log('Creating changeset for project:', TEMPLATE_PACKAGE_NAME);
|
|
62
|
+
|
|
63
|
+
let message = '';
|
|
64
|
+
|
|
65
|
+
for (let [dependencyName, dependencyBump] of templatesBump) {
|
|
66
|
+
message += `Templates were updated to use \`${dependencyName}\` v${dependencyBump}.\n`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
message = message.replaceAll('\n', ' ');
|
|
70
|
+
|
|
71
|
+
await fs.writeFile(
|
|
72
|
+
getChangesetName(),
|
|
73
|
+
`---\n'${TEMPLATE_PACKAGE_NAME}': major\n---\n${message.trim()}\n`,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* A function that returns workspace and projects and their updated dependencies. based on `git diff`.
|
|
80
|
+
*/
|
|
81
|
+
async function getDependencyBumps(files: string[]): Promise<DependencyBumps> {
|
|
82
|
+
let bumps: DependencyBumps = new Map();
|
|
83
|
+
|
|
84
|
+
for (let file of files) {
|
|
85
|
+
let projectBumps: ProjectDependencyBumps = new Map();
|
|
86
|
+
let {stdout: changes} = await $`git diff HEAD~1 -- ${file}`;
|
|
87
|
+
|
|
88
|
+
for (let change of changes.split('\n')) {
|
|
89
|
+
if (!change.startsWith('+ ')) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
let match = change.match(/"(.*?)"/g);
|
|
94
|
+
|
|
95
|
+
if (match?.[0] && match[1] && semver.validRange(match[1].replaceAll('"', ''))) {
|
|
96
|
+
projectBumps.set(match[0].replaceAll('"', ''), match[1].replaceAll('"', ''));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (file === WORKSPACE_PACKAGE_JSON_PATH && projectBumps.size) {
|
|
101
|
+
bumps.set(WORKSPACE_PLACEHOLDER_NAME, projectBumps);
|
|
102
|
+
} else if (projectBumps.size) {
|
|
103
|
+
let projectName = (JSON.parse(await fs.readFile(file, 'utf8')) as {name: string}).name;
|
|
104
|
+
|
|
105
|
+
bumps.set(projectName, projectBumps);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return bumps;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// eslint-disable-next-line no-constant-condition, @typescript-eslint/no-unnecessary-condition -- this is autogenerated
|
|
113
|
+
if (<%- workspace.projects.some((project) => project.name === TEMPLATE_PACKAGE_NAME) %>) {
|
|
114
|
+
let {stdout: diff} = await $`git diff --name-only HEAD~1`;
|
|
115
|
+
let files = diff.split('\n').filter((file) => file.endsWith('package.json'));
|
|
116
|
+
let {stdout: shortHash} = await $`git rev-parse --short HEAD`;
|
|
117
|
+
let getChangesetName = (suffix?: string) =>
|
|
118
|
+
suffix === undefined ?
|
|
119
|
+
`.changeset/templates-update-${shortHash.trim()}.md`
|
|
120
|
+
: `.changeset/templates-update-${shortHash.trim()}-${suffix.replaceAll('/', '-')}.md`;
|
|
121
|
+
|
|
122
|
+
let dependencyBumps = await getDependencyBumps(files);
|
|
123
|
+
|
|
124
|
+
console.log('Dependecy bumps:', dependencyBumps);
|
|
125
|
+
|
|
126
|
+
await checkCarsonTemplatesPackage(getChangesetName, dependencyBumps);
|
|
127
|
+
|
|
128
|
+
console.log('Done!');
|
|
129
|
+
} else {
|
|
130
|
+
console.log(`Repository doesn't contain project "${TEMPLATE_PACKAGE_NAME}"!`);
|
|
131
|
+
}
|