@jakubmazanec/carson-templates 7.0.0 → 7.1.0-unstable.f3a920ed

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.
@@ -123,6 +123,7 @@ export const DEPENDENCY_VERSIONS = {
123
123
  "@testing-library/react": "^16.0.0",
124
124
  "@types/lodash": "^4.0.0",
125
125
  "@types/react": "^19.0.0",
126
+ "@types/semver": "^7.0.0",
126
127
  "@types/react-dom": "^19.0.0",
127
128
  "@vitest/coverage-v8": "^3.0.0",
128
129
  chromatic: "^13.0.0",
@@ -131,6 +132,7 @@ export const DEPENDENCY_VERSIONS = {
131
132
  "del-cli": "^6.0.0",
132
133
  esbuild: "^0.24.0",
133
134
  eslint: "^9.0.0",
135
+ execa: "^9.0.0",
134
136
  "happy-dom": "^18.0.0",
135
137
  isbot: "^5.0.0",
136
138
  lodash: "^4.0.0",
@@ -141,9 +143,11 @@ export const DEPENDENCY_VERSIONS = {
141
143
  react: "^19.0.0",
142
144
  "react-dom": "^19.0.0",
143
145
  "react-router": "^7.0.0",
146
+ semver: "^7.0.0",
144
147
  storybook: "^9.0.0",
145
148
  tailwindcss: "^4.0.0",
146
149
  "@tailwindcss/vite": "^4.0.0",
150
+ tsx: "^4.0.0",
147
151
  turbo: "^2.0.0",
148
152
  typedoc: "^0.28.0",
149
153
  "typedoc-plugin-markdown": "^4.0.0",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../source/constants.ts"],
4
- "sourcesContent": ["import fs from 'node:fs';\nimport {createRequire} from 'node:module';\nimport semver from 'semver';\n\nexport const AUTHOR = 'Jakub Mazanec <jakub@mazanec.dev>';\n\nexport const BUILD_DIRECTORY = 'build';\nexport const STORYBOOK_BUILD_DIRECTORY = 'storybook-static';\nexport const SOURCE_DIRECTORY = 'source';\n\nexport const APP_PORT = 5000;\n\nexport const CARSON_PACKAGE_NAME = '@jakubmazanec/carson';\nexport const TEMPLATE_PACKAGE_NAME = '@jakubmazanec/carson-templates';\nexport const LINTER_CONFIG_PACKAGE_NAME = '@jakubmazanec/eslint-config';\nexport const CHANGELOG_PACKAGE_NAME = '@jakubmazanec/changesets-changelog';\n\nexport const MAIN_BRANCH_NAMES = new Set(['main', 'master']);\nexport const DEVELOPMENT_BRANCH_NAMES = new Set(['dev', 'develop', 'development']);\n\nexport const LINT_IGNORES = [\n '.cache/**',\n '.turbo/**',\n 'bin/**',\n 'coverage/**',\n 'node_modules/**',\n 'public/**',\n '**/*.d.ts',\n '**/*.json',\n '**/*.md',\n '**/*.mdx',\n `${BUILD_DIRECTORY}/**`,\n].sort();\n\nexport const FORMAT_IGNORE_PATTERNS = [\n '.cache/',\n '.turbo/',\n 'coverage/',\n 'node_modules/',\n 'public/',\n 'npm-shrinkwrap.json',\n 'package-lock.json',\n 'CHANGELOG.md',\n 'LICENSE.md',\n `${BUILD_DIRECTORY}/`,\n].sort();\n\nexport const ECMASCRIPT_VERSION = 2024;\n\nexport const TSCONFIG_COMPILER_OPTIONS = {\n allowSyntheticDefaultImports: true,\n composite: true,\n exactOptionalPropertyTypes: true,\n forceConsistentCasingInFileNames: true,\n isolatedModules: true,\n jsx: 'react-jsx',\n lib: ['dom', 'dom.iterable', `es${ECMASCRIPT_VERSION}`],\n module: 'node16',\n moduleResolution: 'node16',\n noEmitOnError: true,\n noImplicitOverride: true,\n noImplicitReturns: true,\n noUncheckedIndexedAccess: true,\n skipLibCheck: true,\n strict: true,\n target: `es${ECMASCRIPT_VERSION}`,\n};\n\nexport const PRETTIER_OPTIONS = {\n arrowParens: 'always',\n bracketSameLine: false,\n bracketSpacing: false,\n embeddedLanguageFormatting: 'auto',\n experimentalTernaries: true,\n htmlWhitespaceSensitivity: 'css',\n jsxSingleQuote: false,\n printWidth: 100,\n proseWrap: 'always',\n quoteProps: 'as-needed',\n requirePragma: false,\n semi: true,\n singleQuote: true,\n trailingComma: 'all',\n // TODO: remove when this is fixed: https://github.com/prettier/prettier/issues/15956\n overrides: [\n {\n files: ['tsconfig.json'],\n options: {\n trailingComma: 'none',\n },\n },\n ],\n};\n\nexport const TYPEDOC_CONFIG = {\n plugin: 'typedoc-plugin-markdown',\n entryPoints: [`./${SOURCE_DIRECTORY}/main.ts`],\n out: 'docs',\n readme: 'none',\n githubPages: false,\n hideBreadcrumbs: true,\n};\n\n// dependencies\nlet require = createRequire(import.meta.url);\nlet carsonPackageVersion =\n semver\n .minVersion(\n (\n JSON.parse(\n fs.readFileSync(require.resolve(`${TEMPLATE_PACKAGE_NAME}/package.json`), {\n encoding: 'utf8',\n }),\n ) as {peerDependencies: Record<string, string>}\n ).peerDependencies[CARSON_PACKAGE_NAME] ?? '^1.0.0',\n )\n ?.format() ?? '1.0.0';\nlet isCarsonPackageVersionPrerelease = !!semver.prerelease(carsonPackageVersion)?.length;\nlet templatesPackageVersion = (\n JSON.parse(\n fs.readFileSync(require.resolve(`${TEMPLATE_PACKAGE_NAME}/package.json`), {\n encoding: 'utf8',\n }),\n ) as {version: string}\n).version;\nlet isTemplatesPackageVersionPrerelease = !!semver.prerelease(templatesPackageVersion)?.length;\n\nexport const DEPENDENCY_VERSIONS: Record<string, string> = {\n [CARSON_PACKAGE_NAME]:\n isCarsonPackageVersionPrerelease ? carsonPackageVersion : `^${carsonPackageVersion}`,\n [TEMPLATE_PACKAGE_NAME]:\n isTemplatesPackageVersionPrerelease ? templatesPackageVersion : `^${templatesPackageVersion}`,\n [CHANGELOG_PACKAGE_NAME]: '^2.0.0',\n [LINTER_CONFIG_PACKAGE_NAME]: '^4.0.0',\n\n '@changesets/cli': '^2.0.0',\n '@chromatic-com/storybook': '^4.0.0',\n '@react-router/dev': '^7.0.0',\n '@react-router/fs-routes': '^7.0.0',\n '@react-router/node': '^7.0.0',\n '@react-router/serve': '^7.0.0',\n '@storybook/addon-links': '^9.0.0',\n '@storybook/addon-docs': '^9.0.0',\n '@storybook/react-vite': '^9.0.0',\n '@testing-library/jest-dom': '^6.0.0',\n '@testing-library/react': '^16.0.0',\n '@types/lodash': '^4.0.0',\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n '@vitest/coverage-v8': '^3.0.0',\n chromatic: '^13.0.0',\n concurrently: '^9.0.0',\n 'cross-env': '^10.0.0',\n 'del-cli': '^6.0.0',\n esbuild: '^0.24.0',\n eslint: '^9.0.0',\n 'happy-dom': '^18.0.0',\n isbot: '^5.0.0',\n lodash: '^4.0.0',\n 'patch-package': '^8.0.0',\n prettier: '^3.0.0',\n 'prettier-plugin-packagejson': '^2.0.0',\n 'prettier-plugin-tailwindcss': '^0.6.0',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n 'react-router': '^7.0.0',\n storybook: '^9.0.0',\n tailwindcss: '^4.0.0',\n '@tailwindcss/vite': '^4.0.0',\n turbo: '^2.0.0',\n typedoc: '^0.28.0',\n 'typedoc-plugin-markdown': '^4.0.0',\n typescript: '^5.0.0',\n vite: '^7.0.0',\n vitest: '^3.0.0',\n\n node: '^24.0.0',\n '@types/node': '^24.0.0',\n npm: '^11.0.0',\n\n gel: '^6.7.0',\n};\n\n// commands\nexport const FORMAT_COMMAND = 'prettier . --write --ignore-unknown';\nexport const TEST_COMMAND = 'vitest run --coverage --passWithNoTests';\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import fs from 'node:fs';\nimport {createRequire} from 'node:module';\nimport semver from 'semver';\n\nexport const AUTHOR = 'Jakub Mazanec <jakub@mazanec.dev>';\n\nexport const BUILD_DIRECTORY = 'build';\nexport const STORYBOOK_BUILD_DIRECTORY = 'storybook-static';\nexport const SOURCE_DIRECTORY = 'source';\n\nexport const APP_PORT = 5000;\n\nexport const CARSON_PACKAGE_NAME = '@jakubmazanec/carson';\nexport const TEMPLATE_PACKAGE_NAME = '@jakubmazanec/carson-templates';\nexport const LINTER_CONFIG_PACKAGE_NAME = '@jakubmazanec/eslint-config';\nexport const CHANGELOG_PACKAGE_NAME = '@jakubmazanec/changesets-changelog';\n\nexport const MAIN_BRANCH_NAMES = new Set(['main', 'master']);\nexport const DEVELOPMENT_BRANCH_NAMES = new Set(['dev', 'develop', 'development']);\n\nexport const LINT_IGNORES = [\n '.cache/**',\n '.turbo/**',\n 'bin/**',\n 'coverage/**',\n 'node_modules/**',\n 'public/**',\n '**/*.d.ts',\n '**/*.json',\n '**/*.md',\n '**/*.mdx',\n `${BUILD_DIRECTORY}/**`,\n].sort();\n\nexport const FORMAT_IGNORE_PATTERNS = [\n '.cache/',\n '.turbo/',\n 'coverage/',\n 'node_modules/',\n 'public/',\n 'npm-shrinkwrap.json',\n 'package-lock.json',\n 'CHANGELOG.md',\n 'LICENSE.md',\n `${BUILD_DIRECTORY}/`,\n].sort();\n\nexport const ECMASCRIPT_VERSION = 2024;\n\nexport const TSCONFIG_COMPILER_OPTIONS = {\n allowSyntheticDefaultImports: true,\n composite: true,\n exactOptionalPropertyTypes: true,\n forceConsistentCasingInFileNames: true,\n isolatedModules: true,\n jsx: 'react-jsx',\n lib: ['dom', 'dom.iterable', `es${ECMASCRIPT_VERSION}`],\n module: 'node16',\n moduleResolution: 'node16',\n noEmitOnError: true,\n noImplicitOverride: true,\n noImplicitReturns: true,\n noUncheckedIndexedAccess: true,\n skipLibCheck: true,\n strict: true,\n target: `es${ECMASCRIPT_VERSION}`,\n};\n\nexport const PRETTIER_OPTIONS = {\n arrowParens: 'always',\n bracketSameLine: false,\n bracketSpacing: false,\n embeddedLanguageFormatting: 'auto',\n experimentalTernaries: true,\n htmlWhitespaceSensitivity: 'css',\n jsxSingleQuote: false,\n printWidth: 100,\n proseWrap: 'always',\n quoteProps: 'as-needed',\n requirePragma: false,\n semi: true,\n singleQuote: true,\n trailingComma: 'all',\n // TODO: remove when this is fixed: https://github.com/prettier/prettier/issues/15956\n overrides: [\n {\n files: ['tsconfig.json'],\n options: {\n trailingComma: 'none',\n },\n },\n ],\n};\n\nexport const TYPEDOC_CONFIG = {\n plugin: 'typedoc-plugin-markdown',\n entryPoints: [`./${SOURCE_DIRECTORY}/main.ts`],\n out: 'docs',\n readme: 'none',\n githubPages: false,\n hideBreadcrumbs: true,\n};\n\n// dependencies\nlet require = createRequire(import.meta.url);\nlet carsonPackageVersion =\n semver\n .minVersion(\n (\n JSON.parse(\n fs.readFileSync(require.resolve(`${TEMPLATE_PACKAGE_NAME}/package.json`), {\n encoding: 'utf8',\n }),\n ) as {peerDependencies: Record<string, string>}\n ).peerDependencies[CARSON_PACKAGE_NAME] ?? '^1.0.0',\n )\n ?.format() ?? '1.0.0';\nlet isCarsonPackageVersionPrerelease = !!semver.prerelease(carsonPackageVersion)?.length;\nlet templatesPackageVersion = (\n JSON.parse(\n fs.readFileSync(require.resolve(`${TEMPLATE_PACKAGE_NAME}/package.json`), {\n encoding: 'utf8',\n }),\n ) as {version: string}\n).version;\nlet isTemplatesPackageVersionPrerelease = !!semver.prerelease(templatesPackageVersion)?.length;\n\nexport const DEPENDENCY_VERSIONS: Record<string, string> = {\n [CARSON_PACKAGE_NAME]:\n isCarsonPackageVersionPrerelease ? carsonPackageVersion : `^${carsonPackageVersion}`,\n [TEMPLATE_PACKAGE_NAME]:\n isTemplatesPackageVersionPrerelease ? templatesPackageVersion : `^${templatesPackageVersion}`,\n [CHANGELOG_PACKAGE_NAME]: '^2.0.0',\n [LINTER_CONFIG_PACKAGE_NAME]: '^4.0.0',\n\n '@changesets/cli': '^2.0.0',\n '@chromatic-com/storybook': '^4.0.0',\n '@react-router/dev': '^7.0.0',\n '@react-router/fs-routes': '^7.0.0',\n '@react-router/node': '^7.0.0',\n '@react-router/serve': '^7.0.0',\n '@storybook/addon-links': '^9.0.0',\n '@storybook/addon-docs': '^9.0.0',\n '@storybook/react-vite': '^9.0.0',\n '@testing-library/jest-dom': '^6.0.0',\n '@testing-library/react': '^16.0.0',\n '@types/lodash': '^4.0.0',\n '@types/react': '^19.0.0',\n '@types/semver': '^7.0.0',\n '@types/react-dom': '^19.0.0',\n '@vitest/coverage-v8': '^3.0.0',\n chromatic: '^13.0.0',\n concurrently: '^9.0.0',\n 'cross-env': '^10.0.0',\n 'del-cli': '^6.0.0',\n esbuild: '^0.24.0',\n eslint: '^9.0.0',\n execa: '^9.0.0',\n 'happy-dom': '^18.0.0',\n isbot: '^5.0.0',\n lodash: '^4.0.0',\n 'patch-package': '^8.0.0',\n prettier: '^3.0.0',\n 'prettier-plugin-packagejson': '^2.0.0',\n 'prettier-plugin-tailwindcss': '^0.6.0',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n 'react-router': '^7.0.0',\n semver: '^7.0.0',\n storybook: '^9.0.0',\n tailwindcss: '^4.0.0',\n '@tailwindcss/vite': '^4.0.0',\n tsx: '^4.0.0',\n turbo: '^2.0.0',\n typedoc: '^0.28.0',\n 'typedoc-plugin-markdown': '^4.0.0',\n typescript: '^5.0.0',\n vite: '^7.0.0',\n vitest: '^3.0.0',\n\n node: '^24.0.0',\n '@types/node': '^24.0.0',\n npm: '^11.0.0',\n\n gel: '^6.7.0',\n};\n\n// commands\nexport const FORMAT_COMMAND = 'prettier . --write --ignore-unknown';\nexport const TEST_COMMAND = 'vitest run --coverage --passWithNoTests';\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jakubmazanec/carson-templates",
3
- "version": "7.0.0",
3
+ "version": "7.1.0-unstable.f3a920ed",
4
4
  "description": "Collection of Carson templates.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,6 +40,7 @@
40
40
  "@types/fs-extra": "^11.0.4",
41
41
  "@types/lodash": "^4.17.20",
42
42
  "@types/node": "^24.0.4",
43
+ "@types/semver": "^7.7.0",
43
44
  "@types/zen-observable": "^0.8.7",
44
45
  "@vitest/coverage-v8": "^3.2.4",
45
46
  "del-cli": "^6.0.0",
@@ -146,6 +146,7 @@ export const DEPENDENCY_VERSIONS: Record<string, string> = {
146
146
  '@testing-library/react': '^16.0.0',
147
147
  '@types/lodash': '^4.0.0',
148
148
  '@types/react': '^19.0.0',
149
+ '@types/semver': '^7.0.0',
149
150
  '@types/react-dom': '^19.0.0',
150
151
  '@vitest/coverage-v8': '^3.0.0',
151
152
  chromatic: '^13.0.0',
@@ -154,6 +155,7 @@ export const DEPENDENCY_VERSIONS: Record<string, string> = {
154
155
  'del-cli': '^6.0.0',
155
156
  esbuild: '^0.24.0',
156
157
  eslint: '^9.0.0',
158
+ execa: '^9.0.0',
157
159
  'happy-dom': '^18.0.0',
158
160
  isbot: '^5.0.0',
159
161
  lodash: '^4.0.0',
@@ -164,9 +166,11 @@ export const DEPENDENCY_VERSIONS: Record<string, string> = {
164
166
  react: '^19.0.0',
165
167
  'react-dom': '^19.0.0',
166
168
  'react-router': '^7.0.0',
169
+ semver: '^7.0.0',
167
170
  storybook: '^9.0.0',
168
171
  tailwindcss: '^4.0.0',
169
172
  '@tailwindcss/vite': '^4.0.0',
173
+ tsx: '^4.0.0',
170
174
  turbo: '^2.0.0',
171
175
  typedoc: '^0.28.0',
172
176
  'typedoc-plugin-markdown': '^4.0.0',
@@ -0,0 +1,209 @@
1
+ ---
2
+ to: 'tools/scripts/create-dependencies-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 path from 'node:path';
17
+ import semver from 'semver';
18
+
19
+ const WORKSPACE_PLACEHOLDER_NAME = '@';
20
+ const WORKSPACE_PACKAGE_JSON_PATH = 'package.json';
21
+ const TEMPLATE_PACKAGE_NAME = '<%- TEMPLATE_PACKAGE_NAME %>';
22
+
23
+ type ProjectDependencyBumps = Map<string, string>;
24
+ type DependencyBumps = Map<string, ProjectDependencyBumps>;
25
+
26
+ /**
27
+ * A function that returns all proejcts that use Carson.
28
+ */
29
+ async function getProjectsWithCarson(dir = process.cwd(), result: string[] = []) {
30
+ let entries = await fs.readdir(dir, {withFileTypes: true});
31
+
32
+ for (let entry of entries) {
33
+ let fullPath = path.join(dir, entry.name);
34
+
35
+ if (entry.isDirectory()) {
36
+ if (entry.name === '.carson' && dir !== process.cwd()) {
37
+ let packageJson = JSON.parse(await fs.readFile(path.join(dir, 'package.json'), 'utf8')) as {
38
+ name: string;
39
+ };
40
+
41
+ result.push(packageJson.name);
42
+ } else {
43
+ await getProjectsWithCarson(fullPath, result);
44
+ }
45
+ }
46
+ }
47
+
48
+ return result;
49
+ }
50
+
51
+ /**
52
+ * A function that checks if one of the updated dependencies was a major version bump that necessitates manual update of the Carson template package.
53
+ */
54
+ async function checkCarsonTemplatesPackage(dependencyBumps: DependencyBumps) {
55
+ // eslint-disable-next-line no-constant-condition, @typescript-eslint/no-unnecessary-condition -- this is autogenerated
56
+ if (<%- !workspace.projects.some((project) => project.name === TEMPLATE_PACKAGE_NAME) %>) {
57
+ return;
58
+ }
59
+
60
+ let constantsFilePath = '<%- `${workspace.projects.find((project) => project.name === TEMPLATE_PACKAGE_NAME)?.relativePath ?? ''}/source/constants.ts` %>';
61
+ let constantsFile = await fs.readFile(constantsFilePath, 'utf8');
62
+
63
+ for (let [, projectDependencyBumps] of dependencyBumps) {
64
+ if (!projectDependencyBumps.size) {
65
+ continue;
66
+ }
67
+
68
+ for (let [dependencyName, bump] of projectDependencyBumps) {
69
+ let regexp = new RegExp(
70
+ `(?<=('${_.escapeRegExp(dependencyName)}'|${_.escapeRegExp(dependencyName)}):\\s+')\\^\\d+\\.\\d+\\.\\d+(?='.*$)`,
71
+ 'mi',
72
+ );
73
+ let result = regexp.exec(constantsFile);
74
+
75
+ if (result?.[0]) {
76
+ let newMajorVersion = semver.major(semver.minVersion(bump)!);
77
+ let oldMajorVersion = semver.major(semver.minVersion(result[0])!);
78
+
79
+ if (newMajorVersion > oldMajorVersion || dependencyName === 'node') {
80
+ // Node.js is a special case, because it isn't specified in `dependencies` field
81
+ throw new Error(
82
+ `Bumping major version of dependency "${dependencyName}" that is handled by Carson, update of the Carson template package is needed!`,
83
+ );
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+
90
+ /**
91
+ * A function that creates changesets for projects dependencies update.
92
+ */
93
+ async function createChangeset(
94
+ getChangesetName: (suffix?: string) => string,
95
+ dependencyBumps: DependencyBumps,
96
+ ) {
97
+ for (let [projectName, projectDependencyBumps] of dependencyBumps) {
98
+ if (!projectDependencyBumps.size) {
99
+ continue;
100
+ }
101
+
102
+ if (projectName !== WORKSPACE_PLACEHOLDER_NAME) {
103
+ console.log('Creating changeset for project:', projectName);
104
+
105
+ let message = '';
106
+
107
+ for (let [dependencyName, dependencyBump] of projectDependencyBumps) {
108
+ message += `Dependency \`${dependencyName}\` updated to version \`${dependencyBump}\`.\n`;
109
+ }
110
+
111
+ message = message.replaceAll('\n', ' ');
112
+
113
+ await fs.writeFile(
114
+ getChangesetName(projectName),
115
+ `---\n'${projectName}': patch\n---\n${message.trim()}\n`,
116
+ );
117
+ }
118
+ }
119
+ }
120
+
121
+ /**
122
+ * A function that creates changeset when updating the Carson template package.
123
+ */
124
+ async function createChangesetForCarsonTemplates(
125
+ getChangesetName: (suffix?: string) => string,
126
+ dependencyBumps: DependencyBumps,
127
+ ) {
128
+ console.log('Creating changeset for Carson templates update...');
129
+
130
+ let workspaceDependencyBumps = dependencyBumps.get(WORKSPACE_PLACEHOLDER_NAME);
131
+
132
+ if (workspaceDependencyBumps) {
133
+ let message = `Applies templates from \`${TEMPLATE_PACKAGE_NAME}\` updated to version \`${workspaceDependencyBumps.get(TEMPLATE_PACKAGE_NAME) ?? '?'}\`.\n`;
134
+
135
+ let projects = await getProjectsWithCarson();
136
+ let header = projects.map((projectName) => `'${projectName}': patch`).join('\n');
137
+
138
+ await fs.writeFile(getChangesetName(), `---\n${header}\n---\n${message.trim()}\n`);
139
+ }
140
+ }
141
+
142
+ /**
143
+ * A function that returns workspace and projects and their updated dependencies. based on `git diff`.
144
+ */
145
+ async function getDependencyBumps(files: string[]): Promise<DependencyBumps> {
146
+ let bumps: DependencyBumps = new Map();
147
+
148
+ for (let file of files) {
149
+ let projectBumps: ProjectDependencyBumps = new Map();
150
+ let {stdout: changes} = await $`git diff HEAD~1 -- ${file}`;
151
+
152
+ for (let change of changes.split('\n')) {
153
+ if (!change.startsWith('+ ')) {
154
+ continue;
155
+ }
156
+
157
+ let match = change.match(/"(.*?)"/g);
158
+
159
+ if (match?.[0] && match[1] && semver.validRange(match[1].replaceAll('"', ''))) {
160
+ projectBumps.set(match[0].replaceAll('"', ''), match[1].replaceAll('"', ''));
161
+ }
162
+ }
163
+
164
+ if (file === WORKSPACE_PACKAGE_JSON_PATH && projectBumps.size) {
165
+ bumps.set(WORKSPACE_PLACEHOLDER_NAME, projectBumps);
166
+ } else if (projectBumps.size) {
167
+ let projectName = (JSON.parse(await fs.readFile(file, 'utf8')) as {name: string}).name;
168
+
169
+ bumps.set(projectName, projectBumps);
170
+ }
171
+ }
172
+
173
+ return bumps;
174
+ }
175
+
176
+ let {stdout: diffOutput} = await $`git diff --name-only HEAD~1`;
177
+ let diffLines = diffOutput.split('\n');
178
+
179
+ if (diffLines.some((diffLine) => diffLine.startsWith('.changeset'))) {
180
+ console.log('Changeset already exists!');
181
+ } 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
+ }
207
+ }
208
+
209
+ console.log('Done!');
@@ -42,167 +42,7 @@ jobs:
42
42
  run: npm ci
43
43
 
44
44
  - name: Generate changeset
45
- uses: actions/github-script@v7
46
- with:
47
- script: |
48
- let {promises: fs} = require('node:fs');
49
- let path = require('node:path');
50
- let semver = require('semver');
51
- let _ = require('lodash');
52
-
53
- async function checkCarsonTemplatesPackage(dependencyBumps) {
54
- if (<%- !workspace.projects.some((project) => project.name === TEMPLATE_PACKAGE_NAME) %>) {
55
- return false;
56
- }
57
-
58
- let constantsFilePath = '<%- `${workspace.projects.find((project) => project.name === TEMPLATE_PACKAGE_NAME)?.relativePath ?? ''}/source/constants.ts` %>';
59
- let constantsFile = await fs.readFile(constantsFilePath, 'utf8');
60
-
61
- for (let [dependencyName, bump] of dependencyBumps) {
62
- let regexp = new RegExp(`(?<=('${_.escapeRegExp(dependencyName)}'|${_.escapeRegExp(dependencyName)}):\\s+')\\^\\d+\\.\\d+\\.\\d+(?='.*$)`, 'mi');
63
- let result = regexp.exec(constantsFile);
64
-
65
- if (result) {
66
- let newMajorVersion = semver.major(semver.minVersion(bump));
67
- let oldMajorVersion = semver.major(semver.minVersion(result[0]));
68
-
69
- if (newMajorVersion > oldMajorVersion || dependencyName === 'node') { // Node.js is a special case, because it isn't specified in `dependencies` field
70
- throw new Error(`Bumping major version of dependency "${dependencyName}" that is handled by Carson, update of the Carson template package is needed!`);
71
- }
72
- }
73
- }
74
-
75
- return;
76
- }
77
-
78
- async function getProjects(files) {
79
- let names = [];
80
-
81
- for (let file of files) {
82
- let packageJson = JSON.parse(await fs.readFile(file, 'utf8'));
83
-
84
- names.push(packageJson.name);
85
- }
86
-
87
- return names;
88
- }
89
-
90
- async function createChangeset(fileName, dependencyBumps, projects) {
91
- console.log('Creating changeset...');
92
-
93
- let message = '';
94
-
95
- for (let [dependencyName, bump] of dependencyBumps) {
96
- message = message + `Dependency \`${dependencyName}\` updated to version \`${bump}\`.\n`;
97
- }
98
-
99
- message = message.replace('\n', ' ');
100
-
101
- let header = projects.map((projectName) => `'${projectName}': patch`).join('\n');
102
-
103
- await fs.writeFile(fileName, `---\n${header}\n---\n${message.trim()}\n`);
104
- }
105
-
106
- async function createChangesetForCarsonTemplates(fileName, dependencyBumps, projects) {
107
- console.log('Creating changeset for Carson templates update...');
108
-
109
- let message = '';
110
-
111
- for (let [dependencyName, bump] of dependencyBumps) {
112
- message = message + `Applies templates from \`${dependencyName}\` updated to version \`${bump}\`.\n`;
113
- }
114
-
115
- message = message.replace('\n', ' ');
116
-
117
- let header = projects.map((projectName) => `'${projectName}': patch`).join('\n');
118
-
119
- await fs.writeFile(fileName, `---\n${header}\n---\n${message.trim()}\n`);
120
- }
121
-
122
- async function getBumps(files) {
123
- let bumps = new Map();
124
-
125
- for (let file of files) {
126
- let {stdout: changes} = await exec.getExecOutput('git', ['show', file]);
127
-
128
- for (let change of changes.split('\n')) {
129
- if (!change.startsWith('+ ')) {
130
- continue;
131
- }
132
-
133
- let match = change.match(/"(.*?)"/g);
134
-
135
- bumps.set(match[0].replace(/"/g, ''), match[1].replace(/"/g, ''));
136
- }
137
- }
138
-
139
- return bumps;
140
- }
141
-
142
- async function getProjectsUsingCarsonTemplates(dir = process.cwd(), result = []) {
143
- let entries = await fs.readdir(dir, {withFileTypes: true});
144
-
145
- for (let entry of entries) {
146
- let fullPath = path.join(dir, entry.name);
147
-
148
- if (entry.isDirectory()) {
149
- if (entry.name === '.carson' && dir !== process.cwd()) {
150
- let packageJson = JSON.parse(await fs.readFile(path.join(dir, 'package.json'), 'utf8'));
151
-
152
- result.push(packageJson.name);
153
- } else {
154
- await getProjectsUsingCarsonTemplates(fullPath, result);
155
- }
156
- }
157
- }
158
-
159
- return result;
160
- }
161
-
162
- let diffOutput = await exec.getExecOutput('git diff --name-only HEAD~1');
163
- let diffFiles = diffOutput.stdout.split('\n');
164
-
165
- if (diffFiles.find((diffFile) => diffFile.startsWith('.changeset'))) {
166
- console.log('Changeset already exists, skipping...');
167
-
168
- return;
169
- }
170
-
171
- let files = diffFiles
172
- .filter((file) => file !== 'package.json') // skip workspace package.json
173
- .filter((file) => file.includes('package.json'));
174
- let filesWithWorkspace = diffFiles
175
- .filter((file) => file.includes('package.json'));
176
- let {stdout: shortHash} = await exec.getExecOutput('git rev-parse --short HEAD');
177
- let changesetName = `.changeset/renovate-${shortHash.trim()}.md`;
178
- let updatedProjects = await getProjects(files);
179
- let dependencyBumpsWithWorkspace = await getBumps(filesWithWorkspace);
180
-
181
- console.log('Changed package.json files:', files);
182
- console.log('Updated projects:', updatedProjects);
183
- console.log('Dependecy bumps (including the workspace):', Array.from(dependencyBumpsWithWorkspace));
184
-
185
- if (dependencyBumpsWithWorkspace.has('<%- TEMPLATE_PACKAGE_NAME %>')) {
186
- updatedProjects = await getProjectsUsingCarsonTemplates();
187
-
188
- await createChangesetForCarsonTemplates(changesetName, dependencyBumpsWithWorkspace, updatedProjects);
189
-
190
- return;
191
- } else if (!updatedProjects.length) {
192
- console.log('No package.json changes to published packages, skipping...');
193
-
194
- await exec.exec('npx', ['changeset', '--empty']);
195
-
196
- return;
197
- }
198
-
199
- let dependencyBumps = await getBumps(files);
200
-
201
- console.log('Dependecy bumps:', Array.from(dependencyBumps));
202
-
203
- await createChangeset(changesetName, dependencyBumps, updatedProjects);
204
-
205
- await checkCarsonTemplatesPackage(dependencyBumpsWithWorkspace);
45
+ run: npx tsx tools/scripts/create-dependencies-changeset.ts
206
46
 
207
47
  - name: Update Carson
208
48
  run: |
@@ -9,10 +9,15 @@ let developmentDependencies = [
9
9
  TEMPLATE_PACKAGE_NAME,
10
10
  '@changesets/cli',
11
11
  '@types/node',
12
+ '@types/semver',
12
13
  'del-cli',
14
+ 'execa',
15
+ 'lodash',
13
16
  'patch-package',
14
17
  'prettier',
15
18
  'prettier-plugin-packagejson',
19
+ 'semver',
20
+ 'tsx',
16
21
  'turbo',
17
22
  'typescript',
18
23
  ].filter((dependency) => {
@@ -55,8 +60,3 @@ if (workspace.projects.find((project) => project.name === TEMPLATE_PACKAGE_NAME)
55
60
  packageJson.scripts.prepare += ' && carson update workspace';
56
61
  -%>
57
62
  <%- JSON.stringify(packageJson) %>
58
-
59
-
60
-
61
-
62
-
@@ -9,7 +9,7 @@ let tsconfig = {
9
9
  noEmit: true,
10
10
  rootDir: '.',
11
11
  },
12
- include: ['./*.ts'],
12
+ include: ['./*', './tools/**/*'],
13
13
  };
14
14
  -%>
15
15
  //
@@ -15,5 +15,5 @@ strategy: overwrite
15
15
  "compilerOptions": {
16
16
  "composite": false
17
17
  },
18
- "include": ["./*.ts"]
18
+ "include": ["./*", "./tools/**/*"]
19
19
  }