@storm-software/workspace-tools 1.269.0 → 1.270.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.
Files changed (274) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +2 -1
  3. package/dist/chunk-A7JGVU4P.js +468 -0
  4. package/dist/chunk-SRN4D7WO.mjs +468 -0
  5. package/dist/executors.js +2 -2
  6. package/dist/executors.mjs +1 -1
  7. package/dist/index.js +2 -2
  8. package/dist/index.mjs +1 -1
  9. package/dist/src/executors/npm-publish/executor.js +2 -2
  10. package/dist/src/executors/npm-publish/executor.mjs +1 -1
  11. package/docs/executors/rollup.md +88 -0
  12. package/executors.ts +23 -0
  13. package/generators.ts +14 -0
  14. package/index.ts +5 -0
  15. package/package.json +4 -4
  16. package/project.json +58 -0
  17. package/src/base/base-executor.ts +200 -0
  18. package/src/base/base-executor.untyped.ts +18 -0
  19. package/src/base/base-generator.ts +130 -0
  20. package/src/base/base-generator.untyped.ts +16 -0
  21. package/src/base/cargo-base-executor.untyped.ts +73 -0
  22. package/src/base/index.ts +8 -0
  23. package/src/base/typescript-build-executor.untyped.ts +153 -0
  24. package/src/base/typescript-library-generator.ts +415 -0
  25. package/src/base/typescript-library-generator.untyped.ts +106 -0
  26. package/src/executors/cargo-build/executor.spec.ts +18 -0
  27. package/src/executors/cargo-build/executor.ts +28 -0
  28. package/src/executors/cargo-build/untyped.ts +18 -0
  29. package/src/executors/cargo-check/executor.spec.ts +18 -0
  30. package/src/executors/cargo-check/executor.ts +27 -0
  31. package/src/executors/cargo-check/untyped.ts +11 -0
  32. package/src/executors/cargo-clippy/executor.spec.ts +18 -0
  33. package/src/executors/cargo-clippy/executor.ts +28 -0
  34. package/src/executors/cargo-clippy/untyped.ts +18 -0
  35. package/src/executors/cargo-doc/executor.spec.ts +18 -0
  36. package/src/executors/cargo-doc/executor.ts +39 -0
  37. package/src/executors/cargo-doc/untyped.ts +44 -0
  38. package/src/executors/cargo-format/executor.spec.ts +18 -0
  39. package/src/executors/cargo-format/executor.ts +28 -0
  40. package/src/executors/cargo-format/untyped.ts +11 -0
  41. package/src/executors/cargo-publish/executor.spec.ts +11 -0
  42. package/src/executors/cargo-publish/executor.ts +139 -0
  43. package/src/executors/cargo-publish/untyped.ts +33 -0
  44. package/src/executors/clean-package/constants.ts +99 -0
  45. package/src/executors/clean-package/executor.spec.ts +18 -0
  46. package/src/executors/clean-package/executor.ts +214 -0
  47. package/src/executors/clean-package/types.ts +6 -0
  48. package/src/executors/clean-package/untyped.ts +60 -0
  49. package/src/executors/clean-package/utils.ts +85 -0
  50. package/src/executors/esbuild/executor.spec.ts +11 -0
  51. package/src/executors/esbuild/executor.ts +67 -0
  52. package/src/executors/esbuild/untyped.ts +20 -0
  53. package/src/executors/npm-publish/executor.spec.ts +11 -0
  54. package/src/executors/npm-publish/executor.ts +681 -0
  55. package/src/executors/npm-publish/untyped.ts +56 -0
  56. package/src/executors/size-limit/executor.spec.ts +18 -0
  57. package/src/executors/size-limit/executor.ts +88 -0
  58. package/src/executors/size-limit/untyped.ts +22 -0
  59. package/src/executors/typia/executor.ts +54 -0
  60. package/src/executors/typia/untyped.ts +48 -0
  61. package/src/executors/unbuild/executor.spec.ts +11 -0
  62. package/src/executors/unbuild/executor.ts +136 -0
  63. package/src/executors/unbuild/untyped.ts +152 -0
  64. package/src/generators/browser-library/generator.spec.ts +20 -0
  65. package/src/generators/browser-library/generator.ts +109 -0
  66. package/src/generators/browser-library/untyped.ts +29 -0
  67. package/src/generators/config-schema/generator.spec.ts +20 -0
  68. package/src/generators/config-schema/generator.ts +90 -0
  69. package/src/generators/config-schema/untyped.ts +19 -0
  70. package/src/generators/init/init.ts +32 -0
  71. package/src/generators/init/untyped.ts +16 -0
  72. package/src/generators/neutral-library/generator.spec.ts +20 -0
  73. package/src/generators/neutral-library/generator.ts +81 -0
  74. package/src/generators/neutral-library/untyped.ts +29 -0
  75. package/src/generators/node-library/generator.spec.ts +20 -0
  76. package/src/generators/node-library/generator.ts +84 -0
  77. package/src/generators/node-library/untyped.ts +29 -0
  78. package/src/generators/preset/files/.all-contributorsrc.template +48 -0
  79. package/src/generators/preset/files/.editorconfig +454 -0
  80. package/src/generators/preset/files/.env.template +38 -0
  81. package/src/generators/preset/files/.gitattributes +52 -0
  82. package/src/generators/preset/files/.github/.nvmrc +1 -0
  83. package/src/generators/preset/files/.github/CODEOWNERS +3 -0
  84. package/src/generators/preset/files/.github/CODE_OF_CONDUCT.md +125 -0
  85. package/src/generators/preset/files/.github/CONTRIBUTING.md.template +15 -0
  86. package/src/generators/preset/files/.github/FUNDING.yml +3 -0
  87. package/src/generators/preset/files/.github/ISSUE_TEMPLATE/bug-report.yml.template +102 -0
  88. package/src/generators/preset/files/.github/ISSUE_TEMPLATE/documentation.yml.template +56 -0
  89. package/src/generators/preset/files/.github/ISSUE_TEMPLATE/feature-request.yml.template +60 -0
  90. package/src/generators/preset/files/.github/PULL_REQUEST_TEMPLATE.md.template +39 -0
  91. package/src/generators/preset/files/.github/SECURITY.md +9 -0
  92. package/src/generators/preset/files/.github/codecov.yml +29 -0
  93. package/src/generators/preset/files/.github/dependabot.yml +64 -0
  94. package/src/generators/preset/files/.github/labels.yml +84 -0
  95. package/src/generators/preset/files/.github/renovate.json +4 -0
  96. package/src/generators/preset/files/.github/renovate.json.template +63 -0
  97. package/src/generators/preset/files/.github/stale.yml +55 -0
  98. package/src/generators/preset/files/.github/workflows/build-release.yml.template +25 -0
  99. package/src/generators/preset/files/.github/workflows/code-review.yml +18 -0
  100. package/src/generators/preset/files/.github/workflows/codeql.yml +84 -0
  101. package/src/generators/preset/files/.github/workflows/dependabot-update.yml +32 -0
  102. package/src/generators/preset/files/.github/workflows/git-guardian.yml +23 -0
  103. package/src/generators/preset/files/.github/workflows/greetings.yml +31 -0
  104. package/src/generators/preset/files/.github/workflows/labels.yml +31 -0
  105. package/src/generators/preset/files/.github/workflows/lock.yml +26 -0
  106. package/src/generators/preset/files/.log4brains.yml.template +5 -0
  107. package/src/generators/preset/files/.markdownlint.json +155 -0
  108. package/src/generators/preset/files/.verdaccio/config.yml.template +40 -0
  109. package/src/generators/preset/files/.vscode/README.md +32 -0
  110. package/src/generators/preset/files/.vscode/cspell.json +3 -0
  111. package/src/generators/preset/files/.vscode/extensions.json +14 -0
  112. package/src/generators/preset/files/.vscode/launch.json +37 -0
  113. package/src/generators/preset/files/.vscode/settings.json +401 -0
  114. package/src/generators/preset/files/.vscode/tasks.json +4 -0
  115. package/src/generators/preset/files/.whitesource +14 -0
  116. package/src/generators/preset/files/assets/diagrams/.gitkeep +0 -0
  117. package/src/generators/preset/files/assets/icons/dark/.gitkeep +0 -0
  118. package/src/generators/preset/files/assets/icons/light/.gitkeep +0 -0
  119. package/src/generators/preset/files/assets/logos/.gitkeep +0 -0
  120. package/src/generators/preset/files/docs/api-reference/.gitkeep +0 -0
  121. package/src/generators/preset/generator.spec.ts +20 -0
  122. package/src/generators/preset/generator.ts +315 -0
  123. package/src/generators/preset/untyped.ts +88 -0
  124. package/src/generators/release-version/generator.spec.ts +20 -0
  125. package/src/generators/release-version/generator.ts +920 -0
  126. package/src/generators/release-version/untyped.ts +156 -0
  127. package/src/plugins/rust/cargo-toml.ts +434 -0
  128. package/src/plugins/rust/index.ts +1 -0
  129. package/src/plugins/typescript/index.ts +1 -0
  130. package/src/plugins/typescript/project-config.ts +564 -0
  131. package/src/plugins/typescript/tsup.ts +198 -0
  132. package/src/types.ts +130 -0
  133. package/src/utils/apply-workspace-tokens.ts +73 -0
  134. package/src/utils/cargo.ts +219 -0
  135. package/src/utils/create-cli-options.ts +23 -0
  136. package/src/utils/get-project-configurations.ts +27 -0
  137. package/src/utils/index.ts +12 -0
  138. package/src/utils/lock-file.ts +159 -0
  139. package/src/utils/package-helpers.ts +54 -0
  140. package/src/utils/plugin-helpers.ts +112 -0
  141. package/src/utils/pnpm-deps-update.ts +111 -0
  142. package/src/utils/project-tags.ts +162 -0
  143. package/src/utils/toml.ts +204 -0
  144. package/src/utils/typia-transform.ts +8 -0
  145. package/src/utils/versions.ts +19 -0
  146. package/tsconfig.json +30 -0
  147. package/tsup.config.ts +36 -0
  148. package/dist/chunk-62LQXZNY.js +0 -282
  149. package/dist/chunk-F3VG4R53.mjs +0 -282
  150. package/dist/src/generators/preset/files/LICENSE +0 -201
  151. package/docs/api/base/base-executor.schema.md +0 -16
  152. package/docs/api/base/base-generator.schema.md +0 -15
  153. package/docs/api/base/cargo-base-executor.schema.md +0 -90
  154. package/docs/api/base/typescript-build-executor.schema.md +0 -126
  155. package/docs/api/base/typescript-library-generator.schema.md +0 -129
  156. package/docs/api/executors/cargo-build/schema.md +0 -89
  157. package/docs/api/executors/cargo-check/schema.md +0 -90
  158. package/docs/api/executors/cargo-clippy/schema.md +0 -99
  159. package/docs/api/executors/cargo-doc/schema.md +0 -130
  160. package/docs/api/executors/cargo-format/schema.md +0 -90
  161. package/docs/api/executors/cargo-publish/schema.md +0 -117
  162. package/docs/api/executors/clean-package/schema.md +0 -65
  163. package/docs/api/executors/esbuild/schema.md +0 -126
  164. package/docs/api/executors/npm-publish/schema.md +0 -64
  165. package/docs/api/executors/size-limit/schema.md +0 -25
  166. package/docs/api/executors/typia/schema.md +0 -46
  167. package/docs/api/executors/unbuild/schema.md +0 -222
  168. package/docs/api/generators/browser-library/files/README.md +0 -58
  169. package/docs/api/generators/browser-library/schema.md +0 -129
  170. package/docs/api/generators/config-schema/schema.md +0 -25
  171. package/docs/api/generators/init/schema.md +0 -15
  172. package/docs/api/generators/neutral-library/files/README.md +0 -58
  173. package/docs/api/generators/neutral-library/schema.md +0 -129
  174. package/docs/api/generators/node-library/files/README.md +0 -63
  175. package/docs/api/generators/node-library/schema.md +0 -129
  176. package/docs/api/generators/preset/schema.md +0 -110
  177. package/docs/api/generators/release-version/schema.md +0 -160
  178. /package/{dist/src → src}/base/base-executor.schema.d.ts +0 -0
  179. /package/{dist/src → src}/base/base-executor.schema.json +0 -0
  180. /package/{dist/src → src}/base/base-executor.schema.md +0 -0
  181. /package/{dist/src → src}/base/base-generator.schema.d.ts +0 -0
  182. /package/{dist/src → src}/base/base-generator.schema.json +0 -0
  183. /package/{dist/src → src}/base/base-generator.schema.md +0 -0
  184. /package/{dist/src → src}/base/cargo-base-executor.schema.d.ts +0 -0
  185. /package/{dist/src → src}/base/cargo-base-executor.schema.json +0 -0
  186. /package/{dist/src → src}/base/cargo-base-executor.schema.md +0 -0
  187. /package/{dist/src → src}/base/typescript-build-executor.schema.d.ts +0 -0
  188. /package/{dist/src → src}/base/typescript-build-executor.schema.json +0 -0
  189. /package/{dist/src → src}/base/typescript-build-executor.schema.md +0 -0
  190. /package/{dist/src → src}/base/typescript-library-generator.schema.d.ts +0 -0
  191. /package/{dist/src → src}/base/typescript-library-generator.schema.json +0 -0
  192. /package/{dist/src → src}/base/typescript-library-generator.schema.md +0 -0
  193. /package/{dist/src → src}/executors/cargo-build/schema.d.ts +0 -0
  194. /package/{dist/src → src}/executors/cargo-build/schema.json +0 -0
  195. /package/{dist/src → src}/executors/cargo-build/schema.md +0 -0
  196. /package/{dist/src → src}/executors/cargo-check/schema.d.ts +0 -0
  197. /package/{dist/src → src}/executors/cargo-check/schema.json +0 -0
  198. /package/{dist/src → src}/executors/cargo-check/schema.md +0 -0
  199. /package/{dist/src → src}/executors/cargo-clippy/schema.d.ts +0 -0
  200. /package/{dist/src → src}/executors/cargo-clippy/schema.json +0 -0
  201. /package/{dist/src → src}/executors/cargo-clippy/schema.md +0 -0
  202. /package/{dist/src → src}/executors/cargo-doc/schema.d.ts +0 -0
  203. /package/{dist/src → src}/executors/cargo-doc/schema.json +0 -0
  204. /package/{dist/src → src}/executors/cargo-doc/schema.md +0 -0
  205. /package/{dist/src → src}/executors/cargo-format/schema.d.ts +0 -0
  206. /package/{dist/src → src}/executors/cargo-format/schema.json +0 -0
  207. /package/{dist/src → src}/executors/cargo-format/schema.md +0 -0
  208. /package/{dist/src → src}/executors/cargo-publish/schema.d.ts +0 -0
  209. /package/{dist/src → src}/executors/cargo-publish/schema.json +0 -0
  210. /package/{dist/src → src}/executors/cargo-publish/schema.md +0 -0
  211. /package/{dist/src → src}/executors/clean-package/schema.d.ts +0 -0
  212. /package/{dist/src → src}/executors/clean-package/schema.json +0 -0
  213. /package/{dist/src → src}/executors/clean-package/schema.md +0 -0
  214. /package/{dist/src → src}/executors/esbuild/schema.d.ts +0 -0
  215. /package/{dist/src → src}/executors/esbuild/schema.json +0 -0
  216. /package/{dist/src → src}/executors/esbuild/schema.md +0 -0
  217. /package/{dist/src → src}/executors/npm-publish/schema.d.ts +0 -0
  218. /package/{dist/src → src}/executors/npm-publish/schema.json +0 -0
  219. /package/{dist/src → src}/executors/npm-publish/schema.md +0 -0
  220. /package/{dist/src → src}/executors/size-limit/schema.d.ts +0 -0
  221. /package/{dist/src → src}/executors/size-limit/schema.json +0 -0
  222. /package/{dist/src → src}/executors/size-limit/schema.md +0 -0
  223. /package/{dist/src → src}/executors/typia/schema.d.ts +0 -0
  224. /package/{dist/src → src}/executors/typia/schema.json +0 -0
  225. /package/{dist/src → src}/executors/typia/schema.md +0 -0
  226. /package/{dist/src → src}/executors/unbuild/schema.d.ts +0 -0
  227. /package/{dist/src → src}/executors/unbuild/schema.json +0 -0
  228. /package/{dist/src → src}/executors/unbuild/schema.md +0 -0
  229. /package/{dist/src → src}/generators/browser-library/files/README.md +0 -0
  230. /package/{dist/src → src}/generators/browser-library/files/jest.config.ts +0 -0
  231. /package/{dist/src → src}/generators/browser-library/files/src/index.ts.template +0 -0
  232. /package/{dist/src → src}/generators/browser-library/files/tsconfig.spec.json +0 -0
  233. /package/{dist/src → src}/generators/browser-library/schema.d.ts +0 -0
  234. /package/{dist/src → src}/generators/browser-library/schema.json +0 -0
  235. /package/{dist/src → src}/generators/browser-library/schema.md +0 -0
  236. /package/{dist/src → src}/generators/config-schema/schema.d.ts +0 -0
  237. /package/{dist/src → src}/generators/config-schema/schema.json +0 -0
  238. /package/{dist/src → src}/generators/config-schema/schema.md +0 -0
  239. /package/{dist/src → src}/generators/init/schema.d.ts +0 -0
  240. /package/{dist/src → src}/generators/init/schema.json +0 -0
  241. /package/{dist/src → src}/generators/init/schema.md +0 -0
  242. /package/{dist/src → src}/generators/neutral-library/files/README.md +0 -0
  243. /package/{dist/src → src}/generators/neutral-library/files/jest.config.ts +0 -0
  244. /package/{dist/src → src}/generators/neutral-library/files/src/index.ts.template +0 -0
  245. /package/{dist/src → src}/generators/neutral-library/files/tsconfig.spec.json +0 -0
  246. /package/{dist/src → src}/generators/neutral-library/schema.d.ts +0 -0
  247. /package/{dist/src → src}/generators/neutral-library/schema.json +0 -0
  248. /package/{dist/src → src}/generators/neutral-library/schema.md +0 -0
  249. /package/{dist/src → src}/generators/node-library/files/README.md +0 -0
  250. /package/{dist/src → src}/generators/node-library/files/jest.config.ts +0 -0
  251. /package/{dist/src → src}/generators/node-library/files/src/index.ts.template +0 -0
  252. /package/{dist/src → src}/generators/node-library/files/tsconfig.spec.json +0 -0
  253. /package/{dist/src → src}/generators/node-library/schema.d.ts +0 -0
  254. /package/{dist/src → src}/generators/node-library/schema.json +0 -0
  255. /package/{dist/src → src}/generators/node-library/schema.md +0 -0
  256. /package/{LICENSE → src/generators/preset/files/LICENSE} +0 -0
  257. /package/{dist/src → src}/generators/preset/files/README.md.template +0 -0
  258. /package/{dist/src → src}/generators/preset/files/docs/readme-templates/README.footer.md.template +0 -0
  259. /package/{dist/src → src}/generators/preset/files/docs/readme-templates/README.header.md.template +0 -0
  260. /package/{dist/src → src}/generators/preset/files/eslint.config.js.template +0 -0
  261. /package/{dist/src → src}/generators/preset/files/knip.json +0 -0
  262. /package/{dist/src → src}/generators/preset/files/lefthook.json +0 -0
  263. /package/{dist/src → src}/generators/preset/files/nx.json +0 -0
  264. /package/{dist/src → src}/generators/preset/files/pnpm-workspace.yaml +0 -0
  265. /package/{dist/src → src}/generators/preset/files/socket.yaml +0 -0
  266. /package/{dist/src → src}/generators/preset/files/storm.json.template +0 -0
  267. /package/{dist/src → src}/generators/preset/files/tsconfig.base.json.template +0 -0
  268. /package/{dist/src → src}/generators/preset/schema.d.ts +0 -0
  269. /package/{dist/src → src}/generators/preset/schema.json +0 -0
  270. /package/{dist/src → src}/generators/preset/schema.md +0 -0
  271. /package/{dist/src → src}/generators/release-version/schema.d.ts +0 -0
  272. /package/{dist/src → src}/generators/release-version/schema.json +0 -0
  273. /package/{dist/src → src}/generators/release-version/schema.md +0 -0
  274. /package/{dist/src → src}/plugins/typescript/untyped-schema.ts +0 -0
@@ -0,0 +1,159 @@
1
+ import {
2
+ output,
3
+ readJsonFile,
4
+ workspaceRoot,
5
+ type CreateDependenciesContext,
6
+ type CreateNodesContext,
7
+ type PackageManager,
8
+ type ProjectGraphExternalNode,
9
+ type RawProjectGraphDependency,
10
+ } from "@nx/devkit";
11
+ import { existsSync } from "node:fs";
12
+ import { join } from "node:path";
13
+ import {
14
+ getNpmLockfileDependencies,
15
+ getNpmLockfileNodes,
16
+ } from "nx/src/plugins/js/lock-file/npm-parser";
17
+ import {
18
+ getPnpmLockfileDependencies,
19
+ getPnpmLockfileNodes,
20
+ } from "nx/src/plugins/js/lock-file/pnpm-parser";
21
+ import {
22
+ getYarnLockfileDependencies,
23
+ getYarnLockfileNodes,
24
+ } from "nx/src/plugins/js/lock-file/yarn-parser";
25
+
26
+ export const YARN_LOCK_FILE = "yarn.lock";
27
+ export const NPM_LOCK_FILE = "package-lock.json";
28
+ export const PNPM_LOCK_FILE = "pnpm-lock.yaml";
29
+ export const LOCK_FILES = [YARN_LOCK_FILE, NPM_LOCK_FILE, PNPM_LOCK_FILE];
30
+
31
+ export const YARN_LOCK_PATH = join(workspaceRoot, YARN_LOCK_FILE);
32
+ export const NPM_LOCK_PATH = join(workspaceRoot, NPM_LOCK_FILE);
33
+ export const PNPM_LOCK_PATH = join(workspaceRoot, PNPM_LOCK_FILE);
34
+
35
+ /**
36
+ * Parses lock file and maps dependencies and metadata to {@link LockFileGraph}
37
+ */
38
+ export function getLockFileNodes(
39
+ packageManager: PackageManager,
40
+ contents: string,
41
+ lockFileHash: string,
42
+ context: CreateNodesContext,
43
+ ): Record<string, ProjectGraphExternalNode> {
44
+ try {
45
+ if (packageManager === "yarn") {
46
+ const packageJson = readJsonFile(
47
+ join(context.workspaceRoot, "package.json"),
48
+ );
49
+ return getYarnLockfileNodes(contents, lockFileHash, packageJson);
50
+ }
51
+ if (packageManager === "pnpm") {
52
+ return getPnpmLockfileNodes(contents, lockFileHash);
53
+ }
54
+ if (packageManager === "npm") {
55
+ return getNpmLockfileNodes(contents, lockFileHash);
56
+ }
57
+ } catch (e) {
58
+ if (!isPostInstallProcess()) {
59
+ output.error({
60
+ title: `Failed to parse ${packageManager} lockfile`,
61
+ bodyLines: errorBodyLines(e),
62
+ });
63
+ }
64
+ throw e;
65
+ }
66
+ throw new Error(`Unknown package manager: ${packageManager}`);
67
+ }
68
+
69
+ /**
70
+ * Parses lock file and maps dependencies and metadata to {@link LockFileGraph}
71
+ */
72
+ export function getLockFileDependencies(
73
+ packageManager: PackageManager,
74
+ contents: string,
75
+ lockFileHash: string,
76
+ context: CreateDependenciesContext,
77
+ ): RawProjectGraphDependency[] {
78
+ try {
79
+ if (packageManager === "yarn") {
80
+ return getYarnLockfileDependencies(contents, lockFileHash, context);
81
+ }
82
+ if (packageManager === "pnpm") {
83
+ return getPnpmLockfileDependencies(contents, lockFileHash, context);
84
+ }
85
+ if (packageManager === "npm") {
86
+ return getNpmLockfileDependencies(contents, lockFileHash, context);
87
+ }
88
+ } catch (e) {
89
+ if (!isPostInstallProcess()) {
90
+ output.error({
91
+ title: `Failed to parse ${packageManager} lockfile`,
92
+ bodyLines: errorBodyLines(e),
93
+ });
94
+ }
95
+ throw e;
96
+ }
97
+ throw new Error(`Unknown package manager: ${packageManager}`);
98
+ }
99
+
100
+ export function lockFileExists(packageManager: PackageManager): boolean {
101
+ if (packageManager === "yarn") {
102
+ return existsSync(YARN_LOCK_PATH);
103
+ }
104
+ if (packageManager === "pnpm") {
105
+ return existsSync(PNPM_LOCK_PATH);
106
+ }
107
+ if (packageManager === "npm") {
108
+ return existsSync(NPM_LOCK_PATH);
109
+ }
110
+ throw new Error(
111
+ `Unknown package manager ${packageManager} or lock file missing`,
112
+ );
113
+ }
114
+
115
+ /**
116
+ * Returns lock file name based on the detected package manager in the root
117
+ * @param packageManager
118
+ * @returns
119
+ */
120
+ export function getLockFileName(packageManager: PackageManager): string {
121
+ if (packageManager === "yarn") {
122
+ return YARN_LOCK_FILE;
123
+ }
124
+ if (packageManager === "pnpm") {
125
+ return PNPM_LOCK_FILE;
126
+ }
127
+ if (packageManager === "npm") {
128
+ return NPM_LOCK_FILE;
129
+ }
130
+ throw new Error(`Unknown package manager: ${packageManager}`);
131
+ }
132
+
133
+ // generate body lines for error message
134
+ function errorBodyLines(
135
+ originalError: Error,
136
+ additionalInfo: string[] = [],
137
+ ): string[] {
138
+ const result = [
139
+ "Please open an issue at `https://github.com/storm-software/storm-ops/issues/new?template=1-bug.yml` and provide a reproduction.",
140
+ ...(additionalInfo as string[]),
141
+ ];
142
+
143
+ if (originalError.message) {
144
+ result.push(`\nOriginal error: ${originalError.message}\n\n`);
145
+ }
146
+
147
+ if (originalError.stack) {
148
+ result.push(originalError.stack);
149
+ }
150
+
151
+ return result;
152
+ }
153
+
154
+ function isPostInstallProcess(): boolean {
155
+ return (
156
+ process.env.npm_command === "install" &&
157
+ process.env.npm_lifecycle_event === "postinstall"
158
+ );
159
+ }
@@ -0,0 +1,54 @@
1
+ import {
2
+ joinPathFragments,
3
+ ProjectConfiguration,
4
+ readJsonFile,
5
+ } from "@nx/devkit";
6
+ import { existsSync } from "node:fs";
7
+ import type { PackageJson } from "nx/src/utils/package-json.js";
8
+ import { isEqualProjectTag, ProjectTagConstants } from "./project-tags";
9
+ import { CargoToml, parseCargoToml } from "./toml";
10
+
11
+ export type PackageManagerType = "package.json" | "Cargo.toml";
12
+ export const PackageManagerTypes = {
13
+ PackageJson: "package.json" as PackageManagerType,
14
+ CargoToml: "Cargo.toml" as PackageManagerType,
15
+ };
16
+
17
+ export type PackageInfo = {
18
+ content: PackageJson | CargoToml;
19
+ type: PackageManagerType;
20
+ };
21
+
22
+ export const getPackageInfo = (
23
+ project: ProjectConfiguration,
24
+ ): null | PackageInfo => {
25
+ if (
26
+ isEqualProjectTag(
27
+ project,
28
+ ProjectTagConstants.Language.TAG_ID,
29
+ ProjectTagConstants.Language.RUST,
30
+ ) &&
31
+ existsSync(joinPathFragments(project.root, "Cargo.toml"))
32
+ ) {
33
+ return {
34
+ type: "Cargo.toml",
35
+ content: parseCargoToml(joinPathFragments(project.root, "Cargo.toml")),
36
+ };
37
+ } else if (
38
+ isEqualProjectTag(
39
+ project,
40
+ ProjectTagConstants.Language.TAG_ID,
41
+ ProjectTagConstants.Language.TYPESCRIPT,
42
+ ) &&
43
+ existsSync(joinPathFragments(project.root, "package.json"))
44
+ ) {
45
+ return {
46
+ type: "package.json",
47
+ content: readJsonFile(
48
+ joinPathFragments(project.root, "package.json"),
49
+ ) as PackageJson,
50
+ };
51
+ }
52
+
53
+ return null;
54
+ };
@@ -0,0 +1,112 @@
1
+ import { ProjectConfiguration, readJsonFile } from "@nx/devkit";
2
+ import defu from "defu";
3
+ import { existsSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
+ import { PackageJson } from "pkg-types";
6
+ import { getProjectTag, ProjectTagConstants } from "./project-tags";
7
+
8
+ export const getProjectPlatform = (
9
+ project: ProjectConfiguration,
10
+ ignoreTags = false,
11
+ ): "node" | "neutral" | "browser" | "worker" => {
12
+ const tsconfigJson = readJsonFile(join(project.root, "tsconfig.json"));
13
+ if (!tsconfigJson) {
14
+ throw new Error(`No tsconfig.json found in project root: ${project.root}`);
15
+ }
16
+
17
+ const packageJson = readJsonFile(join(project.root, "package.json"));
18
+ if (!packageJson) {
19
+ throw new Error(`No package.json found in project root: ${project.root}`);
20
+ }
21
+
22
+ let platformTag: string | undefined = undefined;
23
+ if (!ignoreTags) {
24
+ platformTag = getProjectTag(project, ProjectTagConstants.Platform.TAG_ID);
25
+ }
26
+
27
+ if (platformTag !== ProjectTagConstants.Platform.NEUTRAL) {
28
+ const types = Array.isArray(tsconfigJson.compilerOptions?.types)
29
+ ? tsconfigJson.compilerOptions.types
30
+ : [];
31
+
32
+ if (
33
+ platformTag === ProjectTagConstants.Platform.WORKER ||
34
+ types.some(
35
+ (type) => type.toLowerCase() === "@cloudflare/workers-types",
36
+ ) ||
37
+ packageJson.devDependencies?.["@cloudflare/workers-types"] ||
38
+ packageJson.devDependencies?.["wrangler"]
39
+ ) {
40
+ return "worker";
41
+ }
42
+
43
+ if (
44
+ platformTag === ProjectTagConstants.Platform.NODE ||
45
+ types?.some((type) => type.toLowerCase() === "node") ||
46
+ packageJson.devDependencies?.["@types/node"]
47
+ ) {
48
+ return "node";
49
+ }
50
+
51
+ if (
52
+ platformTag === ProjectTagConstants.Platform.BROWSER ||
53
+ types?.some((type) => type.toLowerCase() === "dom") ||
54
+ (packageJson.dependencies &&
55
+ Object.keys(packageJson.dependencies).some((dependency) =>
56
+ dependency.includes("react"),
57
+ )) ||
58
+ (packageJson.devDependencies &&
59
+ Object.keys(packageJson.devDependencies).some((devDependency) =>
60
+ devDependency.includes("react"),
61
+ ))
62
+ ) {
63
+ return "browser";
64
+ }
65
+ }
66
+
67
+ return "neutral";
68
+ };
69
+
70
+ export const getProjectConfigFromProjectJsonPath = (
71
+ projectJsonPath: string,
72
+ packageJson: PackageJson,
73
+ ): ProjectConfiguration => {
74
+ return getProjectConfigFromProjectRoot(dirname(projectJsonPath), packageJson);
75
+ };
76
+
77
+ export const getProjectConfigFromProjectRoot = (
78
+ projectRoot: string,
79
+ packageJson: PackageJson,
80
+ ): ProjectConfiguration => {
81
+ const { nx, name } = packageJson;
82
+ const projectJson = readJsonFile(join(projectRoot, "project.json"));
83
+
84
+ return defu(nx ?? {}, projectJson, {
85
+ targets: {},
86
+ tags: [],
87
+ name,
88
+ root: projectRoot,
89
+ }) as ProjectConfiguration;
90
+ };
91
+
92
+ export const getProjectRoot = (
93
+ configPath: string,
94
+ workspaceRoot: string,
95
+ ): string | null => {
96
+ try {
97
+ const root = dirname(configPath);
98
+ const projectRoot = join(workspaceRoot, root);
99
+
100
+ if (
101
+ !existsSync(join(projectRoot, "package.json")) &&
102
+ !existsSync(join(projectRoot, "project.json"))
103
+ ) {
104
+ return null;
105
+ }
106
+
107
+ return projectRoot;
108
+ } catch (error_) {
109
+ console.error(error_);
110
+ return null;
111
+ }
112
+ };
@@ -0,0 +1,111 @@
1
+ import { joinPaths } from "@storm-software/config-tools";
2
+ import { existsSync } from "node:fs";
3
+ import { readFile, writeFile } from "node:fs/promises";
4
+ import { format } from "prettier";
5
+ import readYamlFile from "read-yaml-file";
6
+
7
+ let pnpmCatalog!: Record<string, string>;
8
+
9
+ /**
10
+ * Update package.json dependencies to use pnpm catalog versions
11
+ *
12
+ * @param packageRoot - The root of the package
13
+ * @param workspaceRoot - The root of the workspace
14
+ */
15
+ export async function pnpmCatalogUpdate(
16
+ packageRoot: string,
17
+ workspaceRoot: string = process.cwd(),
18
+ ) {
19
+ if (!pnpmCatalog) {
20
+ const pnpmWorkspacePath = joinPaths(workspaceRoot, "pnpm-workspace.yaml");
21
+ if (!existsSync(pnpmWorkspacePath)) {
22
+ console.warn(
23
+ `No \`pnpm-workspace.yaml\` file found in workspace root (searching in: ${pnpmWorkspacePath}). Skipping pnpm catalog read for now.`,
24
+ );
25
+
26
+ return;
27
+ }
28
+
29
+ const pnpmWorkspaceYaml = await readYamlFile<{
30
+ catalog: Record<string, string>;
31
+ }>(pnpmWorkspacePath);
32
+ console.info(
33
+ `pnpmWorkspaceYaml: ${JSON.stringify(pnpmWorkspaceYaml ?? {})}`,
34
+ );
35
+
36
+ if (pnpmWorkspaceYaml?.catalog) {
37
+ pnpmCatalog = pnpmWorkspaceYaml.catalog;
38
+ } else {
39
+ console.warn(
40
+ `Found a \`pnpm-workspace.yaml\` file in the workspace root directory, but no pnpm catalog existed:
41
+ File name: ${pnpmWorkspacePath}
42
+ File contents: ${pnpmWorkspaceYaml ? JSON.stringify(pnpmWorkspaceYaml) : "EMPTY FILE"}`,
43
+ );
44
+ }
45
+ }
46
+
47
+ if (!pnpmCatalog) {
48
+ console.warn(
49
+ `No pnpm catalog found. Attempting to read from workspace root's \`pnpm-workspace.yaml\` file.`,
50
+ );
51
+ }
52
+
53
+ const packageJsonPath = joinPaths(packageRoot, "package.json");
54
+ const packageJsonFile = await readFile(packageJsonPath, "utf8");
55
+ if (!packageJsonFile) {
56
+ throw new Error(
57
+ "No package.json file found in package root: " + packageRoot,
58
+ );
59
+ }
60
+
61
+ const packageJson = JSON.parse(packageJsonFile);
62
+ for (const dependencyType of [
63
+ "dependencies",
64
+ "devDependencies",
65
+ "peerDependencies",
66
+ ]) {
67
+ const dependencies = packageJson[dependencyType];
68
+ if (!dependencies) {
69
+ continue;
70
+ }
71
+
72
+ for (const dependencyName of Object.keys(dependencies)) {
73
+ if (dependencies[dependencyName] === "catalog:") {
74
+ if (!pnpmCatalog) {
75
+ throw new Error(
76
+ `Dependency ${dependencyName} is marked as \`catalog:\`, but no catalog exists in the workspace root's \`pnpm-workspace.yaml\` file.`,
77
+ );
78
+ }
79
+
80
+ const catalogVersion = pnpmCatalog[dependencyName];
81
+ if (!catalogVersion) {
82
+ throw new Error("Missing pnpm catalog version for " + dependencyName);
83
+ }
84
+
85
+ dependencies[dependencyName] = catalogVersion;
86
+ } else if (dependencies[dependencyName].startsWith("catalog:")) {
87
+ throw new Error("multiple named catalogs not supported");
88
+ }
89
+ }
90
+ }
91
+
92
+ return writeFile(
93
+ packageJsonPath,
94
+ await format(JSON.stringify(packageJson), {
95
+ parser: "json",
96
+ proseWrap: "always",
97
+ trailingComma: "none",
98
+ tabWidth: 2,
99
+ semi: true,
100
+ singleQuote: false,
101
+ quoteProps: "as-needed",
102
+ insertPragma: false,
103
+ bracketSameLine: true,
104
+ printWidth: 80,
105
+ bracketSpacing: true,
106
+ arrowParens: "avoid",
107
+ endOfLine: "lf",
108
+ plugins: ["prettier-plugin-pkg"],
109
+ }),
110
+ );
111
+ }
@@ -0,0 +1,162 @@
1
+ import { ProjectConfiguration } from "@nx/devkit";
2
+ import {
3
+ ProjectTagDistStyleValue,
4
+ ProjectTagLanguageValue,
5
+ ProjectTagPlatformValue,
6
+ ProjectTagRegistryValue,
7
+ ProjectTagTypeValue,
8
+ ProjectTagVariant,
9
+ } from "../types";
10
+
11
+ export const ProjectTagConstants = {
12
+ Language: {
13
+ TAG_ID: "language" as ProjectTagVariant,
14
+
15
+ TYPESCRIPT: "typescript" as ProjectTagLanguageValue,
16
+ RUST: "rust" as ProjectTagLanguageValue,
17
+ },
18
+ ProjectType: {
19
+ TAG_ID: "type" as ProjectTagVariant,
20
+
21
+ LIBRARY: "library" as ProjectTagTypeValue,
22
+ APPLICATION: "application" as ProjectTagTypeValue,
23
+ },
24
+ DistStyle: {
25
+ TAG_ID: "dist-style" as ProjectTagVariant,
26
+
27
+ NORMAL: "normal" as ProjectTagDistStyleValue,
28
+ CLEAN: "clean" as ProjectTagDistStyleValue,
29
+ },
30
+ Provider: {
31
+ TAG_ID: "provider" as ProjectTagVariant,
32
+ },
33
+ Platform: {
34
+ TAG_ID: "platform" as ProjectTagVariant,
35
+
36
+ NODE: "node" as ProjectTagPlatformValue,
37
+ BROWSER: "browser" as ProjectTagPlatformValue,
38
+ NEUTRAL: "neutral" as ProjectTagPlatformValue,
39
+ WORKER: "worker" as ProjectTagPlatformValue,
40
+ },
41
+ Registry: {
42
+ TAG_ID: "registry" as ProjectTagVariant,
43
+
44
+ CARGO: "cargo" as ProjectTagRegistryValue,
45
+ NPM: "npm" as ProjectTagRegistryValue,
46
+ CONTAINER: "container" as ProjectTagRegistryValue,
47
+ CYCLONE: "cyclone" as ProjectTagRegistryValue,
48
+ },
49
+ Plugin: {
50
+ TAG_ID: "plugin" as ProjectTagVariant,
51
+ },
52
+ } as const;
53
+
54
+ export const formatProjectTag = (variant: ProjectTagVariant, value: string) => {
55
+ return `${variant}:${value}`;
56
+ };
57
+
58
+ export const hasProjectTag = (
59
+ project: ProjectConfiguration,
60
+ variant: ProjectTagVariant,
61
+ ) => {
62
+ project.tags = project.tags ?? [];
63
+
64
+ const prefix = formatProjectTag(variant, "");
65
+ return project.tags.some(
66
+ (tag) => tag.startsWith(prefix) && tag.length > prefix.length,
67
+ );
68
+ };
69
+
70
+ export const getProjectTag = (
71
+ project: ProjectConfiguration,
72
+ variant: ProjectTagVariant,
73
+ ): string | undefined => {
74
+ if (!hasProjectTag(project, variant)) {
75
+ return undefined;
76
+ }
77
+
78
+ project.tags = project.tags ?? [];
79
+ const prefix = formatProjectTag(variant, "");
80
+ const tag = project.tags.find((tag) => tag.startsWith(prefix));
81
+
82
+ return tag?.replace(prefix, "");
83
+ };
84
+
85
+ export const isEqualProjectTag = (
86
+ project: ProjectConfiguration,
87
+ variant: ProjectTagVariant,
88
+ value: string,
89
+ ): boolean => {
90
+ const tag = getProjectTag(project, variant);
91
+
92
+ return !!(tag && tag?.toUpperCase() === value.toUpperCase());
93
+ };
94
+
95
+ export const addProjectTag = (
96
+ project: ProjectConfiguration,
97
+ variant: ProjectTagVariant,
98
+ value: string,
99
+ options: {
100
+ overwrite?: boolean;
101
+ } = {
102
+ overwrite: false,
103
+ },
104
+ ) => {
105
+ project.tags = project.tags ?? [];
106
+ if (options.overwrite || !hasProjectTag(project, variant)) {
107
+ project.tags = project.tags.filter(
108
+ (tag) => !tag.startsWith(formatProjectTag(variant, "")),
109
+ );
110
+ project.tags.push(formatProjectTag(variant, value));
111
+ }
112
+ };
113
+
114
+ export const addPluginProjectTag = (
115
+ project: ProjectConfiguration,
116
+ plugin: string,
117
+ ) => {
118
+ project.tags = project.tags ?? [];
119
+ project.tags.push(
120
+ formatProjectTag(ProjectTagConstants.Plugin.TAG_ID, plugin),
121
+ );
122
+ };
123
+
124
+ export const setDefaultProjectTags = (
125
+ project: ProjectConfiguration,
126
+ plugin?: string,
127
+ ) => {
128
+ project.tags = project.tags ?? [];
129
+
130
+ addProjectTag(
131
+ project,
132
+ ProjectTagConstants.ProjectType.TAG_ID,
133
+ project.projectType === "application"
134
+ ? ProjectTagConstants.ProjectType.APPLICATION
135
+ : ProjectTagConstants.ProjectType.LIBRARY,
136
+ { overwrite: true },
137
+ );
138
+ addProjectTag(
139
+ project,
140
+ ProjectTagConstants.DistStyle.TAG_ID,
141
+ project.targets && Object.keys(project.targets).includes("clean-package")
142
+ ? ProjectTagConstants.DistStyle.CLEAN
143
+ : ProjectTagConstants.DistStyle.NORMAL,
144
+ { overwrite: true },
145
+ );
146
+ addProjectTag(
147
+ project,
148
+ ProjectTagConstants.Platform.TAG_ID,
149
+ project.targets?.build?.options.platform === "node"
150
+ ? ProjectTagConstants.Platform.NODE
151
+ : project.targets?.build?.options.platform === "worker"
152
+ ? ProjectTagConstants.Platform.WORKER
153
+ : project.targets?.build?.options.platform === "browser"
154
+ ? ProjectTagConstants.Platform.BROWSER
155
+ : ProjectTagConstants.Platform.NEUTRAL,
156
+ { overwrite: false },
157
+ );
158
+
159
+ if (plugin) {
160
+ addPluginProjectTag(project, plugin);
161
+ }
162
+ };