@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jakubmazanec/carson-templates",
3
- "version": "7.1.0-unstable.f3a920ed",
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.2"
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.20",
41
+ "@types/lodash": "^4.17.21",
42
42
  "@types/node": "^24.0.4",
43
- "@types/semver": "^7.7.0",
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.25.9",
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.1",
51
+ "fs-extra": "^11.3.2",
52
52
  "prettier": "^3.6.2",
53
53
  "prettier-plugin-packagejson": "^2.5.19",
54
- "typedoc": "^0.28.10",
55
- "typedoc-plugin-markdown": "^4.8.1",
56
- "typescript": "^5.9.2",
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 proejcts that use Carson.
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: diffOutput} = await $`git diff --name-only HEAD~1`;
177
- let diffLines = diffOutput.split('\n');
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
- if (diffLines.some((diffLine) => diffLine.startsWith('.changeset'))) {
180
- console.log('Changeset already exists!');
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
- let files = diffLines.filter((file) => file.endsWith('package.json'));
183
- let {stdout: shortHash} = await $`git rev-parse --short HEAD`;
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
+ }
@@ -42,7 +42,7 @@ jobs:
42
42
  run: npm ci
43
43
 
44
44
  - name: Generate changeset
45
- run: npx tsx tools/scripts/create-dependencies-changeset.ts
45
+ run: npx tsx tools/scripts/create-dependencies-changeset.mts
46
46
 
47
47
  - name: Update Carson
48
48
  run: |
@@ -15,6 +15,7 @@ strategy: overwrite
15
15
 
16
16
  "enabledManagers": ["npm", "nodenv", "nvm", "github-actions"],
17
17
  "rangeStrategy": "bump",
18
+ "minimumReleaseAge": "14 days",
18
19
 
19
20
  "packageRules": [
20
21
  {