@jakubmazanec/carson-templates 7.1.0-unstable.73a94021 → 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/build/constants.js +1 -0
- package/build/constants.js.map +2 -2
- package/package.json +9 -9
- package/source/constants.ts +1 -0
- package/templates/workspace/.github/tools/create-dependencies-changeset.ts.ejs +121 -108
- 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/package.json.ejs +1 -0
- package/templates/workspace/renovate.json.ejs +1 -0
package/build/constants.js
CHANGED
package/build/constants.js.map
CHANGED
|
@@ -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/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 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": ";AAAA,OAAO,QAAQ;AACf,SAAQ,qBAAoB;AAC5B,OAAO,YAAY;AAEZ,aAAM,SAAS;AAEf,aAAM,kBAAkB;AACxB,aAAM,4BAA4B;AAClC,aAAM,mBAAmB;AAEzB,aAAM,WAAW;AAEjB,aAAM,sBAAsB;AAC5B,aAAM,wBAAwB;AAC9B,aAAM,6BAA6B;AACnC,aAAM,yBAAyB;AAE/B,aAAM,oBAAoB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,CAAC;AACpD,aAAM,2BAA2B,oBAAI,IAAI,CAAC,OAAO,WAAW,aAAa,CAAC;AAE1E,aAAM,eAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG,eAAe;AACpB,EAAE,KAAK;AAEA,aAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG,eAAe;AACpB,EAAE,KAAK;AAEA,aAAM,qBAAqB;AAE3B,aAAM,4BAA4B;AAAA,EACvC,8BAA8B;AAAA,EAC9B,WAAW;AAAA,EACX,4BAA4B;AAAA,EAC5B,kCAAkC;AAAA,EAClC,iBAAiB;AAAA,EACjB,KAAK;AAAA,EACL,KAAK,CAAC,OAAO,gBAAgB,KAAK,kBAAkB,EAAE;AAAA,EACtD,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,QAAQ,KAAK,kBAAkB;AACjC;AAEO,aAAM,mBAAmB;AAAA,EAC9B,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,4BAA4B;AAAA,EAC5B,uBAAuB;AAAA,EACvB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,MAAM;AAAA,EACN,aAAa;AAAA,EACb,eAAe;AAAA;AAAA,EAEf,WAAW;AAAA,IACT;AAAA,MACE,OAAO,CAAC,eAAe;AAAA,MACvB,SAAS;AAAA,QACP,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAEO,aAAM,iBAAiB;AAAA,EAC5B,QAAQ;AAAA,EACR,aAAa,CAAC,KAAK,gBAAgB,UAAU;AAAA,EAC7C,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,iBAAiB;AACnB;AAGA,IAAI,UAAU,cAAc,YAAY,GAAG;AAC3C,IAAI,uBACF,OACG;AAAA,EAEG,KAAK;AAAA,IACH,GAAG,aAAa,QAAQ,QAAQ,GAAG,qBAAqB,eAAe,GAAG;AAAA,MACxE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,EACA,iBAAiB,mBAAmB,KAAK;AAC7C,GACE,OAAO,KAAK;AAClB,IAAI,mCAAmC,CAAC,CAAC,OAAO,WAAW,oBAAoB,GAAG;AAClF,IAAI,0BACF,KAAK;AAAA,EACH,GAAG,aAAa,QAAQ,QAAQ,GAAG,qBAAqB,eAAe,GAAG;AAAA,IACxE,UAAU;AAAA,EACZ,CAAC;AACH,EACA;AACF,IAAI,sCAAsC,CAAC,CAAC,OAAO,WAAW,uBAAuB,GAAG;AAEjF,aAAM,sBAA8C;AAAA,EACzD,CAAC,mBAAmB,GAClB,mCAAmC,uBAAuB,IAAI,oBAAoB;AAAA,EACpF,CAAC,qBAAqB,GACpB,sCAAsC,0BAA0B,IAAI,uBAAuB;AAAA,EAC7F,CAAC,sBAAsB,GAAG;AAAA,EAC1B,CAAC,0BAA0B,GAAG;AAAA,EAE9B,mBAAmB;AAAA,EACnB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,aAAa;AAAA,EACb,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,aAAa;AAAA,EACb,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EAER,MAAM;AAAA,EACN,eAAe;AAAA,EACf,KAAK;AAAA,EAEL,KAAK;AACP;AAGO,aAAM,iBAAiB;AACvB,aAAM,eAAe;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
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
|
},
|
package/source/constants.ts
CHANGED
|
@@ -16,8 +16,41 @@ import {promises as fs} from 'node:fs';
|
|
|
16
16
|
import path from 'node:path';
|
|
17
17
|
import semver from 'semver';
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
const WORKSPACE_PLACEHOLDER_NAME = '@';
|
|
20
|
+
const WORKSPACE_PACKAGE_JSON_PATH = 'package.json';
|
|
21
|
+
const TEMPLATE_PACKAGE_NAME = '<%- TEMPLATE_PACKAGE_NAME %>';
|
|
20
22
|
|
|
23
|
+
type ProjectDependencyBumps = Map<string, string>;
|
|
24
|
+
type DependencyBumps = Map<string, ProjectDependencyBumps>;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A function that returns all projects 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
|
+
*/
|
|
21
54
|
async function checkCarsonTemplatesPackage(dependencyBumps: DependencyBumps) {
|
|
22
55
|
// eslint-disable-next-line no-constant-condition, @typescript-eslint/no-unnecessary-condition -- this is autogenerated
|
|
23
56
|
if (<%- !workspace.projects.some((project) => project.name === TEMPLATE_PACKAGE_NAME) %>) {
|
|
@@ -27,85 +60,94 @@ async function checkCarsonTemplatesPackage(dependencyBumps: DependencyBumps) {
|
|
|
27
60
|
let constantsFilePath = '<%- `${workspace.projects.find((project) => project.name === TEMPLATE_PACKAGE_NAME)?.relativePath ?? ''}/source/constants.ts` %>';
|
|
28
61
|
let constantsFile = await fs.readFile(constantsFilePath, 'utf8');
|
|
29
62
|
|
|
30
|
-
for (let [
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
let
|
|
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);
|
|
36
74
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
75
|
+
if (result?.[0]) {
|
|
76
|
+
let newMajorVersion = semver.major(semver.minVersion(bump)!);
|
|
77
|
+
let oldMajorVersion = semver.major(semver.minVersion(result[0])!);
|
|
40
78
|
|
|
41
|
-
if (newMajorVersion > oldMajorVersion || dependencyName === 'node') {
|
|
42
79
|
// Node.js is a special case, because it isn't specified in `dependencies` field
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
80
|
+
if (newMajorVersion > oldMajorVersion || dependencyName === 'node') {
|
|
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
|
+
}
|
|
46
85
|
}
|
|
47
86
|
}
|
|
48
87
|
}
|
|
49
88
|
}
|
|
50
89
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
for (let file of files) {
|
|
55
|
-
let rawfile = await fs.readFile(file, 'utf8');
|
|
56
|
-
let packageJson = JSON.parse(rawfile) as {name: string};
|
|
57
|
-
|
|
58
|
-
names.push(packageJson.name);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return names;
|
|
62
|
-
}
|
|
63
|
-
|
|
90
|
+
/**
|
|
91
|
+
* A function that creates changesets for projects dependencies update.
|
|
92
|
+
*/
|
|
64
93
|
async function createChangeset(
|
|
65
|
-
|
|
94
|
+
getChangesetName: (suffix?: string) => string,
|
|
66
95
|
dependencyBumps: DependencyBumps,
|
|
67
|
-
projects: string[],
|
|
68
96
|
) {
|
|
69
|
-
|
|
97
|
+
for (let [projectName, projectDependencyBumps] of dependencyBumps) {
|
|
98
|
+
if (!projectDependencyBumps.size) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
70
101
|
|
|
71
|
-
|
|
102
|
+
if (projectName !== WORKSPACE_PLACEHOLDER_NAME) {
|
|
103
|
+
console.log('Creating changeset for project:', projectName);
|
|
72
104
|
|
|
73
|
-
|
|
74
|
-
message += `Dependency \`${dependencyName}\` updated to version \`${bump}\`.\n`;
|
|
75
|
-
}
|
|
105
|
+
let message = '';
|
|
76
106
|
|
|
77
|
-
|
|
107
|
+
for (let [dependencyName, dependencyBump] of projectDependencyBumps) {
|
|
108
|
+
message += `Dependency \`${dependencyName}\` updated to version \`${dependencyBump}\`.\n`;
|
|
109
|
+
}
|
|
78
110
|
|
|
79
|
-
|
|
111
|
+
message = message.replaceAll('\n', ' ');
|
|
80
112
|
|
|
81
|
-
|
|
113
|
+
await fs.writeFile(
|
|
114
|
+
getChangesetName(projectName),
|
|
115
|
+
`---\n'${projectName}': patch\n---\n${message.trim()}\n`,
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
82
119
|
}
|
|
83
120
|
|
|
121
|
+
/**
|
|
122
|
+
* A function that creates changeset when updating the Carson template package.
|
|
123
|
+
*/
|
|
84
124
|
async function createChangesetForCarsonTemplates(
|
|
85
|
-
|
|
125
|
+
getChangesetName: (suffix?: string) => string,
|
|
86
126
|
dependencyBumps: DependencyBumps,
|
|
87
|
-
projects: string[],
|
|
88
127
|
) {
|
|
89
128
|
console.log('Creating changeset for Carson templates update...');
|
|
90
129
|
|
|
91
|
-
let
|
|
130
|
+
let workspaceDependencyBumps = dependencyBumps.get(WORKSPACE_PLACEHOLDER_NAME);
|
|
92
131
|
|
|
93
|
-
|
|
94
|
-
message
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
message = message.replace('\n', ' ');
|
|
132
|
+
if (workspaceDependencyBumps) {
|
|
133
|
+
let message = `Applies templates from \`${TEMPLATE_PACKAGE_NAME}\` updated to version \`${workspaceDependencyBumps.get(TEMPLATE_PACKAGE_NAME) ?? '?'}\`.\n`;
|
|
98
134
|
|
|
99
|
-
|
|
135
|
+
let projects = await getProjectsWithCarson();
|
|
136
|
+
let header = projects.map((projectName) => `'${projectName}': patch`).join('\n');
|
|
100
137
|
|
|
101
|
-
|
|
138
|
+
await fs.writeFile(getChangesetName(), `---\n${header}\n---\n${message.trim()}\n`);
|
|
139
|
+
}
|
|
102
140
|
}
|
|
103
141
|
|
|
104
|
-
|
|
105
|
-
|
|
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();
|
|
106
147
|
|
|
107
148
|
for (let file of files) {
|
|
108
|
-
let
|
|
149
|
+
let projectBumps: ProjectDependencyBumps = new Map();
|
|
150
|
+
let {stdout: changes} = await $`git diff HEAD~1 -- ${file}`;
|
|
109
151
|
|
|
110
152
|
for (let change of changes.split('\n')) {
|
|
111
153
|
if (!change.startsWith('+ ')) {
|
|
@@ -114,77 +156,48 @@ async function getBumps(files: string[]) {
|
|
|
114
156
|
|
|
115
157
|
let match = change.match(/"(.*?)"/g);
|
|
116
158
|
|
|
117
|
-
if (match?.[0] && match[1]) {
|
|
118
|
-
|
|
159
|
+
if (match?.[0] && match[1] && semver.validRange(match[1].replaceAll('"', ''))) {
|
|
160
|
+
projectBumps.set(match[0].replaceAll('"', ''), match[1].replaceAll('"', ''));
|
|
119
161
|
}
|
|
120
162
|
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return bumps;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
async function getProjectsWithCarsonTemplates(dir = process.cwd(), result: string[] = []) {
|
|
127
|
-
let entries = await fs.readdir(dir, {withFileTypes: true});
|
|
128
|
-
|
|
129
|
-
for (let entry of entries) {
|
|
130
|
-
let fullPath = path.join(dir, entry.name);
|
|
131
163
|
|
|
132
|
-
if (
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
};
|
|
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;
|
|
137
168
|
|
|
138
|
-
|
|
139
|
-
} else {
|
|
140
|
-
await getProjectsWithCarsonTemplates(fullPath, result);
|
|
141
|
-
}
|
|
169
|
+
bumps.set(projectName, projectBumps);
|
|
142
170
|
}
|
|
143
171
|
}
|
|
144
172
|
|
|
145
|
-
return
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
let {stdout: diffOutput} = await $`git diff --name-only HEAD~1`;
|
|
149
|
-
let diffFiles = diffOutput.split('\n');
|
|
150
|
-
|
|
151
|
-
if (diffFiles.find((diffFile) => diffFile.startsWith('.changeset'))) {
|
|
152
|
-
throw new Error('Changeset already exists!');
|
|
173
|
+
return bumps;
|
|
153
174
|
}
|
|
154
175
|
|
|
155
|
-
let
|
|
156
|
-
|
|
157
|
-
.filter((file) => file.endsWith('package.json'));
|
|
158
|
-
let filesWithWorkspace = diffFiles.filter((file) => file.endsWith('package.json'));
|
|
176
|
+
let {stdout: diff} = await $`git diff --name-only HEAD~1`;
|
|
177
|
+
let files = diff.split('\n').filter((file) => file.endsWith('package.json'));
|
|
159
178
|
let {stdout: shortHash} = await $`git rev-parse --short HEAD`;
|
|
160
|
-
let
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
console.log('Changed package.json files:', files);
|
|
165
|
-
|
|
166
|
-
if (dependencyBumpsWithWorkspace.has('<%- TEMPLATE_PACKAGE_NAME %>')) {
|
|
167
|
-
updatedProjects = await getProjectsWithCarsonTemplates();
|
|
179
|
+
let getChangesetName = (suffix?: string) =>
|
|
180
|
+
suffix === undefined ?
|
|
181
|
+
`.changeset/dependencies-update-${shortHash.trim()}.md`
|
|
182
|
+
: `.changeset/dependencies-update-${shortHash.trim()}-${suffix.replaceAll('/', '-')}.md`;
|
|
168
183
|
|
|
169
|
-
|
|
170
|
-
console.log('Dependecy bumps (including the workspace):', [...dependencyBumpsWithWorkspace]);
|
|
184
|
+
let dependencyBumps = await getDependencyBumps(files);
|
|
171
185
|
|
|
172
|
-
|
|
173
|
-
changesetName,
|
|
174
|
-
dependencyBumpsWithWorkspace,
|
|
175
|
-
updatedProjects,
|
|
176
|
-
);
|
|
177
|
-
} else if (updatedProjects.length) {
|
|
178
|
-
let dependencyBumps = await getBumps(files);
|
|
186
|
+
console.log('Dependecy bumps:', dependencyBumps);
|
|
179
187
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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...');
|
|
184
195
|
|
|
185
|
-
await
|
|
196
|
+
await fs.writeFile(getChangesetName(), '---\n---\n');
|
|
197
|
+
await checkCarsonTemplatesPackage(dependencyBumps);
|
|
186
198
|
} else {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
await fs.writeFile(changesetName, '---\n---\n');
|
|
199
|
+
await createChangeset(getChangesetName, dependencyBumps);
|
|
200
|
+
await checkCarsonTemplatesPackage(dependencyBumps);
|
|
190
201
|
}
|
|
202
|
+
|
|
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
|
+
}
|