everything-dev 1.53.2 → 2.0.0-rc.1

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 (713) hide show
  1. package/README.md +2 -11
  2. package/dist/_virtual/_rolldown/runtime.cjs +17 -2
  3. package/dist/_virtual/_rolldown/runtime.mjs +36 -0
  4. package/dist/api/auth-middleware.cjs +161 -0
  5. package/dist/api/auth-middleware.cjs.map +1 -0
  6. package/dist/api/auth-middleware.d.cts +69 -0
  7. package/dist/api/auth-middleware.d.mts +69 -0
  8. package/dist/api/auth-middleware.mjs +160 -0
  9. package/dist/api/auth-middleware.mjs.map +1 -0
  10. package/dist/api-contract.cjs +250 -62
  11. package/dist/api-contract.cjs.map +1 -1
  12. package/dist/api-contract.mjs +246 -65
  13. package/dist/api-contract.mjs.map +1 -1
  14. package/dist/app.cjs +99 -26
  15. package/dist/app.cjs.map +1 -1
  16. package/dist/app.d.cts +3 -0
  17. package/dist/app.d.mts +3 -0
  18. package/dist/app.mjs +100 -27
  19. package/dist/app.mjs.map +1 -1
  20. package/dist/auth-login.cjs +163 -0
  21. package/dist/auth-login.cjs.map +1 -0
  22. package/dist/auth-login.mjs +162 -0
  23. package/dist/auth-login.mjs.map +1 -0
  24. package/dist/auth-session.cjs +64 -0
  25. package/dist/auth-session.cjs.map +1 -0
  26. package/dist/auth-session.mjs +58 -0
  27. package/dist/auth-session.mjs.map +1 -0
  28. package/dist/auth-types-gen.cjs +0 -1
  29. package/dist/auth-types-gen.cjs.map +1 -1
  30. package/dist/build.cjs +37 -173
  31. package/dist/build.cjs.map +1 -1
  32. package/dist/build.mjs +37 -171
  33. package/dist/build.mjs.map +1 -1
  34. package/dist/bundle-cache.cjs +74 -0
  35. package/dist/bundle-cache.cjs.map +1 -0
  36. package/dist/bundle-cache.d.cts +27 -0
  37. package/dist/bundle-cache.d.mts +27 -0
  38. package/dist/bundle-cache.mjs +68 -0
  39. package/dist/bundle-cache.mjs.map +1 -0
  40. package/dist/bundle-fs-resolve.cjs +209 -0
  41. package/dist/bundle-fs-resolve.cjs.map +1 -0
  42. package/dist/bundle-fs-resolve.d.cts +76 -0
  43. package/dist/bundle-fs-resolve.d.mts +76 -0
  44. package/dist/bundle-fs-resolve.mjs +202 -0
  45. package/dist/bundle-fs-resolve.mjs.map +1 -0
  46. package/dist/cdn-deploy.cjs +126 -0
  47. package/dist/cdn-deploy.cjs.map +1 -0
  48. package/dist/cdn-deploy.mjs +124 -0
  49. package/dist/cdn-deploy.mjs.map +1 -0
  50. package/dist/cli/db-doctor.cjs +19 -19
  51. package/dist/cli/db-doctor.cjs.map +1 -1
  52. package/dist/cli/db-doctor.mjs +18 -18
  53. package/dist/cli/db-doctor.mjs.map +1 -1
  54. package/dist/cli/db-repair.cjs +9 -32
  55. package/dist/cli/db-repair.cjs.map +1 -1
  56. package/dist/cli/db-repair.mjs +9 -32
  57. package/dist/cli/db-repair.mjs.map +1 -1
  58. package/dist/cli/framework-version.cjs +7 -3
  59. package/dist/cli/framework-version.cjs.map +1 -1
  60. package/dist/cli/framework-version.mjs +7 -3
  61. package/dist/cli/framework-version.mjs.map +1 -1
  62. package/dist/cli/infra.cjs +159 -251
  63. package/dist/cli/infra.cjs.map +1 -1
  64. package/dist/cli/infra.mjs +154 -242
  65. package/dist/cli/infra.mjs.map +1 -1
  66. package/dist/cli/init.cjs +627 -199
  67. package/dist/cli/init.cjs.map +1 -1
  68. package/dist/cli/init.d.cts +61 -8
  69. package/dist/cli/init.d.mts +61 -8
  70. package/dist/cli/init.mjs +616 -197
  71. package/dist/cli/init.mjs.map +1 -1
  72. package/dist/cli/parse.cjs +8 -7
  73. package/dist/cli/parse.cjs.map +1 -1
  74. package/dist/cli/parse.mjs +9 -7
  75. package/dist/cli/parse.mjs.map +1 -1
  76. package/dist/cli/prompts.cjs +14 -1
  77. package/dist/cli/prompts.cjs.map +1 -1
  78. package/dist/cli/prompts.mjs +14 -1
  79. package/dist/cli/prompts.mjs.map +1 -1
  80. package/dist/cli/prune.cjs +220 -0
  81. package/dist/cli/prune.cjs.map +1 -0
  82. package/dist/cli/prune.mjs +220 -0
  83. package/dist/cli/prune.mjs.map +1 -0
  84. package/dist/cli/snapshot.cjs +2 -1
  85. package/dist/cli/snapshot.cjs.map +1 -1
  86. package/dist/cli/snapshot.mjs +2 -1
  87. package/dist/cli/snapshot.mjs.map +1 -1
  88. package/dist/cli/status.cjs +5 -4
  89. package/dist/cli/status.cjs.map +1 -1
  90. package/dist/cli/status.mjs +6 -5
  91. package/dist/cli/status.mjs.map +1 -1
  92. package/dist/cli/sync.cjs +156 -58
  93. package/dist/cli/sync.cjs.map +1 -1
  94. package/dist/cli/sync.mjs +158 -63
  95. package/dist/cli/sync.mjs.map +1 -1
  96. package/dist/cli/timing.cjs +0 -1
  97. package/dist/cli/timing.cjs.map +1 -1
  98. package/dist/cli/upgrade.cjs +95 -69
  99. package/dist/cli/upgrade.cjs.map +1 -1
  100. package/dist/cli/upgrade.mjs +97 -72
  101. package/dist/cli/upgrade.mjs.map +1 -1
  102. package/dist/cli/utils/helpers.cjs.map +1 -1
  103. package/dist/cli.cjs +320 -72
  104. package/dist/cli.cjs.map +1 -1
  105. package/dist/cli.mjs +316 -68
  106. package/dist/cli.mjs.map +1 -1
  107. package/dist/code-artifacts.cjs +76 -8
  108. package/dist/code-artifacts.cjs.map +1 -1
  109. package/dist/code-artifacts.mjs +76 -10
  110. package/dist/code-artifacts.mjs.map +1 -1
  111. package/dist/commands/build.cjs +65 -0
  112. package/dist/commands/build.cjs.map +1 -0
  113. package/dist/commands/build.mjs +65 -0
  114. package/dist/commands/build.mjs.map +1 -0
  115. package/dist/commands/config.cjs +77 -0
  116. package/dist/commands/config.cjs.map +1 -0
  117. package/dist/commands/config.d.cts +8 -0
  118. package/dist/commands/config.d.mts +8 -0
  119. package/dist/commands/config.mjs +74 -0
  120. package/dist/commands/config.mjs.map +1 -0
  121. package/dist/commands/db.cjs +107 -0
  122. package/dist/commands/db.cjs.map +1 -0
  123. package/dist/commands/db.mjs +107 -0
  124. package/dist/commands/db.mjs.map +1 -0
  125. package/dist/commands/deploy.cjs +336 -0
  126. package/dist/commands/deploy.cjs.map +1 -0
  127. package/dist/commands/deploy.mjs +334 -0
  128. package/dist/commands/deploy.mjs.map +1 -0
  129. package/dist/commands/dev.cjs +75 -0
  130. package/dist/commands/dev.cjs.map +1 -0
  131. package/dist/commands/dev.mjs +73 -0
  132. package/dist/commands/dev.mjs.map +1 -0
  133. package/dist/commands/init.cjs +234 -0
  134. package/dist/commands/init.cjs.map +1 -0
  135. package/dist/commands/init.mjs +231 -0
  136. package/dist/commands/init.mjs.map +1 -0
  137. package/dist/commands/keys.cjs +255 -0
  138. package/dist/commands/keys.cjs.map +1 -0
  139. package/dist/commands/keys.mjs +253 -0
  140. package/dist/commands/keys.mjs.map +1 -0
  141. package/dist/commands/ops.cjs +199 -0
  142. package/dist/commands/ops.cjs.map +1 -0
  143. package/dist/commands/ops.mjs +197 -0
  144. package/dist/commands/ops.mjs.map +1 -0
  145. package/dist/commands/plugins.cjs +211 -0
  146. package/dist/commands/plugins.cjs.map +1 -0
  147. package/dist/commands/plugins.mjs +211 -0
  148. package/dist/commands/plugins.mjs.map +1 -0
  149. package/dist/commands/shared.cjs +8 -0
  150. package/dist/commands/shared.cjs.map +1 -0
  151. package/dist/commands/shared.d.cts +6 -0
  152. package/dist/commands/shared.d.mts +6 -0
  153. package/dist/commands/shared.mjs +8 -0
  154. package/dist/commands/shared.mjs.map +1 -0
  155. package/dist/commands/upgrade.cjs +325 -0
  156. package/dist/commands/upgrade.cjs.map +1 -0
  157. package/dist/commands/upgrade.mjs +323 -0
  158. package/dist/commands/upgrade.mjs.map +1 -0
  159. package/dist/components/dev-render.cjs +340 -0
  160. package/dist/components/dev-render.cjs.map +1 -0
  161. package/dist/components/dev-render.mjs +332 -0
  162. package/dist/components/dev-render.mjs.map +1 -0
  163. package/dist/config.cjs +460 -221
  164. package/dist/config.cjs.map +1 -1
  165. package/dist/config.d.cts +491 -48
  166. package/dist/config.d.mts +491 -48
  167. package/dist/config.mjs +439 -212
  168. package/dist/config.mjs.map +1 -1
  169. package/dist/contract.cjs +327 -50
  170. package/dist/contract.cjs.map +1 -1
  171. package/dist/contract.d.cts +1951 -1062
  172. package/dist/contract.d.mts +1951 -1062
  173. package/dist/contract.meta.cjs +107 -12
  174. package/dist/contract.meta.cjs.map +1 -1
  175. package/dist/contract.meta.d.cts +166 -8
  176. package/dist/contract.meta.d.mts +166 -8
  177. package/dist/contract.meta.mjs +107 -11
  178. package/dist/contract.meta.mjs.map +1 -1
  179. package/dist/contract.mjs +580 -327
  180. package/dist/contract.mjs.map +1 -1
  181. package/dist/dag.cjs +5 -3
  182. package/dist/dag.cjs.map +1 -1
  183. package/dist/dag.mjs +6 -3
  184. package/dist/dag.mjs.map +1 -1
  185. package/dist/db/binding.cjs +80 -0
  186. package/dist/db/binding.cjs.map +1 -0
  187. package/dist/db/binding.d.cts +39 -0
  188. package/dist/db/binding.d.mts +39 -0
  189. package/dist/db/binding.mjs +78 -0
  190. package/dist/db/binding.mjs.map +1 -0
  191. package/dist/db/bindings.cjs +78 -0
  192. package/dist/db/bindings.cjs.map +1 -0
  193. package/dist/db/bindings.d.cts +34 -0
  194. package/dist/db/bindings.d.mts +34 -0
  195. package/dist/db/bindings.mjs +76 -0
  196. package/dist/db/bindings.mjs.map +1 -0
  197. package/dist/db/core.cjs +204 -0
  198. package/dist/db/core.cjs.map +1 -0
  199. package/dist/db/core.d.cts +69 -0
  200. package/dist/db/core.d.mts +69 -0
  201. package/dist/db/core.mjs +192 -0
  202. package/dist/db/core.mjs.map +1 -0
  203. package/dist/db/driver.cjs +167 -0
  204. package/dist/db/driver.cjs.map +1 -0
  205. package/dist/db/driver.d.cts +50 -0
  206. package/dist/db/driver.d.mts +50 -0
  207. package/dist/db/driver.mjs +165 -0
  208. package/dist/db/driver.mjs.map +1 -0
  209. package/dist/db/drizzle-kit.cjs +177 -0
  210. package/dist/db/drizzle-kit.cjs.map +1 -0
  211. package/dist/db/drizzle-kit.d.cts +25 -0
  212. package/dist/db/drizzle-kit.d.mts +25 -0
  213. package/dist/db/drizzle-kit.mjs +175 -0
  214. package/dist/db/drizzle-kit.mjs.map +1 -0
  215. package/dist/db/errors.cjs +27 -0
  216. package/dist/db/errors.cjs.map +1 -0
  217. package/dist/db/errors.d.cts +16 -0
  218. package/dist/db/errors.d.mts +16 -0
  219. package/dist/db/errors.mjs +26 -0
  220. package/dist/db/errors.mjs.map +1 -0
  221. package/dist/db/identity.cjs +55 -0
  222. package/dist/db/identity.cjs.map +1 -0
  223. package/dist/db/identity.d.cts +40 -0
  224. package/dist/db/identity.d.mts +40 -0
  225. package/dist/db/identity.mjs +53 -0
  226. package/dist/db/identity.mjs.map +1 -0
  227. package/dist/db/index.cjs +43 -0
  228. package/dist/db/index.d.cts +9 -0
  229. package/dist/db/index.d.mts +9 -0
  230. package/dist/db/index.mjs +10 -0
  231. package/dist/db/run-migrations.cjs +343 -0
  232. package/dist/db/run-migrations.cjs.map +1 -0
  233. package/dist/db/run-migrations.d.cts +87 -0
  234. package/dist/db/run-migrations.d.mts +87 -0
  235. package/dist/db/run-migrations.mjs +341 -0
  236. package/dist/db/run-migrations.mjs.map +1 -0
  237. package/dist/delegate-signer.cjs +85 -0
  238. package/dist/delegate-signer.cjs.map +1 -0
  239. package/dist/delegate-signer.mjs +84 -0
  240. package/dist/delegate-signer.mjs.map +1 -0
  241. package/dist/deploy-diff.cjs +119 -0
  242. package/dist/deploy-diff.cjs.map +1 -0
  243. package/dist/deploy-diff.mjs +109 -0
  244. package/dist/deploy-diff.mjs.map +1 -0
  245. package/dist/descriptor/constructors.cjs +49 -0
  246. package/dist/descriptor/constructors.cjs.map +1 -0
  247. package/dist/descriptor/constructors.d.cts +27 -0
  248. package/dist/descriptor/constructors.d.mts +27 -0
  249. package/dist/descriptor/constructors.mjs +45 -0
  250. package/dist/descriptor/constructors.mjs.map +1 -0
  251. package/dist/descriptor/index.cjs +24 -0
  252. package/dist/descriptor/index.d.cts +5 -0
  253. package/dist/descriptor/index.d.mts +5 -0
  254. package/dist/descriptor/index.mjs +6 -0
  255. package/dist/descriptor/resolve.cjs +258 -0
  256. package/dist/descriptor/resolve.cjs.map +1 -0
  257. package/dist/descriptor/resolve.d.cts +50 -0
  258. package/dist/descriptor/resolve.d.mts +50 -0
  259. package/dist/descriptor/resolve.mjs +252 -0
  260. package/dist/descriptor/resolve.mjs.map +1 -0
  261. package/dist/descriptor/schema.cjs +109 -0
  262. package/dist/descriptor/schema.cjs.map +1 -0
  263. package/dist/descriptor/schema.d.cts +217 -0
  264. package/dist/descriptor/schema.d.mts +217 -0
  265. package/dist/descriptor/schema.mjs +102 -0
  266. package/dist/descriptor/schema.mjs.map +1 -0
  267. package/dist/descriptor/serialize.cjs +45 -0
  268. package/dist/descriptor/serialize.cjs.map +1 -0
  269. package/dist/descriptor/serialize.d.cts +7 -0
  270. package/dist/descriptor/serialize.d.mts +7 -0
  271. package/dist/descriptor/serialize.mjs +45 -0
  272. package/dist/descriptor/serialize.mjs.map +1 -0
  273. package/dist/dev-log-pipeline.cjs +273 -0
  274. package/dist/dev-log-pipeline.cjs.map +1 -0
  275. package/dist/dev-log-pipeline.mjs +267 -0
  276. package/dist/dev-log-pipeline.mjs.map +1 -0
  277. package/dist/dev-logs.cjs +39 -8
  278. package/dist/dev-logs.cjs.map +1 -1
  279. package/dist/dev-logs.mjs +37 -9
  280. package/dist/dev-logs.mjs.map +1 -1
  281. package/dist/dev-program.cjs +405 -0
  282. package/dist/dev-program.cjs.map +1 -0
  283. package/dist/dev-program.d.cts +10 -0
  284. package/dist/dev-program.d.mts +10 -0
  285. package/dist/dev-program.mjs +395 -0
  286. package/dist/dev-program.mjs.map +1 -0
  287. package/dist/dev-session-data.d.cts +27 -0
  288. package/dist/dev-session-data.d.mts +27 -0
  289. package/dist/dev-session.cjs +178 -105
  290. package/dist/dev-session.cjs.map +1 -1
  291. package/dist/dev-session.mjs +180 -105
  292. package/dist/dev-session.mjs.map +1 -1
  293. package/dist/env/process-env.cjs +16 -0
  294. package/dist/env/process-env.cjs.map +1 -0
  295. package/dist/env/process-env.mjs +13 -0
  296. package/dist/env/process-env.mjs.map +1 -0
  297. package/dist/env/project-env.cjs +144 -0
  298. package/dist/env/project-env.cjs.map +1 -0
  299. package/dist/env/project-env.d.cts +1 -0
  300. package/dist/env/project-env.d.mts +1 -0
  301. package/dist/env/project-env.mjs +132 -0
  302. package/dist/env/project-env.mjs.map +1 -0
  303. package/dist/fastkv.cjs +59 -12
  304. package/dist/fastkv.cjs.map +1 -1
  305. package/dist/fastkv.d.cts +42 -6
  306. package/dist/fastkv.d.mts +42 -6
  307. package/dist/fastkv.mjs +58 -13
  308. package/dist/fastkv.mjs.map +1 -1
  309. package/dist/fingerprint.cjs +57 -0
  310. package/dist/fingerprint.cjs.map +1 -0
  311. package/dist/fingerprint.d.cts +14 -0
  312. package/dist/fingerprint.d.mts +14 -0
  313. package/dist/fingerprint.mjs +55 -0
  314. package/dist/fingerprint.mjs.map +1 -0
  315. package/dist/http-client.cjs +17 -17
  316. package/dist/http-client.cjs.map +1 -1
  317. package/dist/http-client.mjs +17 -17
  318. package/dist/http-client.mjs.map +1 -1
  319. package/dist/image-deploy.cjs +186 -0
  320. package/dist/image-deploy.cjs.map +1 -0
  321. package/dist/image-deploy.mjs +182 -0
  322. package/dist/image-deploy.mjs.map +1 -0
  323. package/dist/index.cjs +66 -18
  324. package/dist/index.d.cts +8 -7
  325. package/dist/index.d.mts +8 -7
  326. package/dist/index.mjs +6 -5
  327. package/dist/infra/docker.cjs +77 -0
  328. package/dist/infra/docker.cjs.map +1 -0
  329. package/dist/infra/docker.d.cts +10 -0
  330. package/dist/infra/docker.d.mts +10 -0
  331. package/dist/infra/docker.mjs +69 -0
  332. package/dist/infra/docker.mjs.map +1 -0
  333. package/dist/infra/materializer.cjs +74 -0
  334. package/dist/infra/materializer.cjs.map +1 -0
  335. package/dist/infra/materializer.mjs +70 -0
  336. package/dist/infra/materializer.mjs.map +1 -0
  337. package/dist/infra/planner.cjs +135 -103
  338. package/dist/infra/planner.cjs.map +1 -1
  339. package/dist/infra/planner.mjs +137 -104
  340. package/dist/infra/planner.mjs.map +1 -1
  341. package/dist/infra/port-ownership.cjs +57 -0
  342. package/dist/infra/port-ownership.cjs.map +1 -0
  343. package/dist/infra/port-ownership.mjs +57 -0
  344. package/dist/infra/port-ownership.mjs.map +1 -0
  345. package/dist/infra/preflight.cjs +45 -33
  346. package/dist/infra/preflight.cjs.map +1 -1
  347. package/dist/infra/preflight.d.cts +1 -0
  348. package/dist/infra/preflight.d.mts +1 -0
  349. package/dist/infra/preflight.mjs +46 -34
  350. package/dist/infra/preflight.mjs.map +1 -1
  351. package/dist/infra/types.cjs.map +1 -1
  352. package/dist/infra/types.d.cts +2 -0
  353. package/dist/infra/types.d.mts +2 -0
  354. package/dist/infra/types.mjs.map +1 -1
  355. package/dist/integrity.cjs +50 -61
  356. package/dist/integrity.cjs.map +1 -1
  357. package/dist/integrity.d.cts +16 -10
  358. package/dist/integrity.d.mts +16 -10
  359. package/dist/integrity.mjs +50 -59
  360. package/dist/integrity.mjs.map +1 -1
  361. package/dist/internal/manifest-normalizer.cjs +8 -2
  362. package/dist/internal/manifest-normalizer.cjs.map +1 -1
  363. package/dist/internal/manifest-normalizer.mjs +9 -3
  364. package/dist/internal/manifest-normalizer.mjs.map +1 -1
  365. package/dist/merge.cjs +19 -1
  366. package/dist/merge.cjs.map +1 -1
  367. package/dist/merge.d.cts +1 -1
  368. package/dist/merge.d.mts +1 -1
  369. package/dist/merge.mjs +19 -2
  370. package/dist/merge.mjs.map +1 -1
  371. package/dist/mf.cjs +190 -3
  372. package/dist/mf.cjs.map +1 -1
  373. package/dist/mf.d.cts +24 -2
  374. package/dist/mf.d.mts +24 -2
  375. package/dist/mf.mjs +189 -4
  376. package/dist/mf.mjs.map +1 -1
  377. package/dist/near-cli.cjs +59 -91
  378. package/dist/near-cli.cjs.map +1 -1
  379. package/dist/near-cli.mjs +58 -90
  380. package/dist/near-cli.mjs.map +1 -1
  381. package/dist/near-signer.cjs +73 -0
  382. package/dist/near-signer.cjs.map +1 -0
  383. package/dist/near-signer.mjs +70 -0
  384. package/dist/near-signer.mjs.map +1 -0
  385. package/dist/network.cjs +0 -1
  386. package/dist/network.cjs.map +1 -1
  387. package/dist/orchestrator.cjs +256 -87
  388. package/dist/orchestrator.cjs.map +1 -1
  389. package/dist/orchestrator.mjs +248 -87
  390. package/dist/orchestrator.mjs.map +1 -1
  391. package/dist/platform-deploy.cjs +81 -0
  392. package/dist/platform-deploy.cjs.map +1 -0
  393. package/dist/platform-deploy.mjs +80 -0
  394. package/dist/platform-deploy.mjs.map +1 -0
  395. package/dist/plugin.cjs +54 -1389
  396. package/dist/plugin.cjs.map +1 -1
  397. package/dist/plugin.d.cts +6 -896
  398. package/dist/plugin.d.mts +6 -896
  399. package/dist/plugin.mjs +53 -1387
  400. package/dist/plugin.mjs.map +1 -1
  401. package/dist/process-kill.cjs +44 -0
  402. package/dist/process-kill.cjs.map +1 -0
  403. package/dist/process-kill.mjs +43 -0
  404. package/dist/process-kill.mjs.map +1 -0
  405. package/dist/process-registry.cjs +64 -9
  406. package/dist/process-registry.cjs.map +1 -1
  407. package/dist/process-registry.mjs +61 -10
  408. package/dist/process-registry.mjs.map +1 -1
  409. package/dist/progress.cjs +45 -0
  410. package/dist/progress.cjs.map +1 -0
  411. package/dist/progress.d.cts +13 -0
  412. package/dist/progress.d.mts +13 -0
  413. package/dist/progress.mjs +42 -0
  414. package/dist/progress.mjs.map +1 -0
  415. package/dist/publish.cjs +513 -79
  416. package/dist/publish.cjs.map +1 -1
  417. package/dist/publish.mjs +515 -82
  418. package/dist/publish.mjs.map +1 -1
  419. package/dist/registry-use.cjs +41 -0
  420. package/dist/registry-use.cjs.map +1 -0
  421. package/dist/registry-use.mjs +40 -0
  422. package/dist/registry-use.mjs.map +1 -0
  423. package/dist/resolution/session.cjs +335 -0
  424. package/dist/resolution/session.cjs.map +1 -0
  425. package/dist/resolution/session.d.cts +105 -0
  426. package/dist/resolution/session.d.mts +105 -0
  427. package/dist/resolution/session.mjs +331 -0
  428. package/dist/resolution/session.mjs.map +1 -0
  429. package/dist/rollback.cjs +131 -0
  430. package/dist/rollback.cjs.map +1 -0
  431. package/dist/rollback.mjs +128 -0
  432. package/dist/rollback.mjs.map +1 -0
  433. package/dist/sdk.cjs +7 -7
  434. package/dist/sdk.d.cts +3 -3
  435. package/dist/sdk.d.mts +3 -3
  436. package/dist/sdk.mjs +2 -2
  437. package/dist/service-descriptor.cjs +67 -34
  438. package/dist/service-descriptor.cjs.map +1 -1
  439. package/dist/service-descriptor.d.cts +4 -1
  440. package/dist/service-descriptor.d.mts +3 -0
  441. package/dist/service-descriptor.mjs +63 -35
  442. package/dist/service-descriptor.mjs.map +1 -1
  443. package/dist/shared-deps.cjs +17 -16
  444. package/dist/shared-deps.cjs.map +1 -1
  445. package/dist/shared-deps.mjs +17 -16
  446. package/dist/shared-deps.mjs.map +1 -1
  447. package/dist/start-config-source.cjs +24 -0
  448. package/dist/start-config-source.cjs.map +1 -0
  449. package/dist/start-config-source.d.cts +29 -0
  450. package/dist/start-config-source.d.mts +29 -0
  451. package/dist/start-config-source.mjs +22 -0
  452. package/dist/start-config-source.mjs.map +1 -0
  453. package/dist/storage-upload.cjs +145 -0
  454. package/dist/storage-upload.cjs.map +1 -0
  455. package/dist/storage-upload.mjs +143 -0
  456. package/dist/storage-upload.mjs.map +1 -0
  457. package/dist/types.cjs +126 -20
  458. package/dist/types.cjs.map +1 -1
  459. package/dist/types.d.cts +867 -585
  460. package/dist/types.d.mts +867 -585
  461. package/dist/types.mjs +307 -208
  462. package/dist/types.mjs.map +1 -1
  463. package/dist/ui/api.cjs +105 -0
  464. package/dist/ui/api.cjs.map +1 -0
  465. package/dist/ui/api.d.cts +31 -0
  466. package/dist/ui/api.d.mts +31 -0
  467. package/dist/ui/api.mjs +99 -0
  468. package/dist/ui/api.mjs.map +1 -0
  469. package/dist/ui/auth-guards.cjs +50 -0
  470. package/dist/ui/auth-guards.cjs.map +1 -0
  471. package/dist/ui/auth-guards.d.cts +39 -0
  472. package/dist/ui/auth-guards.d.mts +39 -0
  473. package/dist/ui/auth-guards.mjs +48 -0
  474. package/dist/ui/auth-guards.mjs.map +1 -0
  475. package/dist/ui/auth.cjs +197 -0
  476. package/dist/ui/auth.cjs.map +1 -0
  477. package/dist/ui/auth.d.cts +56 -0
  478. package/dist/ui/auth.d.mts +56 -0
  479. package/dist/ui/auth.mjs +179 -0
  480. package/dist/ui/auth.mjs.map +1 -0
  481. package/dist/ui/entry.cjs +16 -0
  482. package/dist/ui/entry.cjs.map +1 -0
  483. package/dist/ui/entry.d.cts +12 -0
  484. package/dist/ui/entry.d.mts +12 -0
  485. package/dist/ui/entry.mjs +15 -0
  486. package/dist/ui/entry.mjs.map +1 -0
  487. package/dist/ui/head.cjs +14 -7
  488. package/dist/ui/head.cjs.map +1 -1
  489. package/dist/ui/head.mjs +15 -7
  490. package/dist/ui/head.mjs.map +1 -1
  491. package/dist/ui/hydrate.cjs +265 -0
  492. package/dist/ui/hydrate.cjs.map +1 -0
  493. package/dist/ui/hydrate.d.cts +48 -0
  494. package/dist/ui/hydrate.d.mts +48 -0
  495. package/dist/ui/hydrate.mjs +263 -0
  496. package/dist/ui/hydrate.mjs.map +1 -0
  497. package/dist/ui/i18n.cjs +153 -0
  498. package/dist/ui/i18n.cjs.map +1 -0
  499. package/dist/ui/i18n.d.cts +29 -0
  500. package/dist/ui/i18n.d.mts +29 -0
  501. package/dist/ui/i18n.mjs +140 -0
  502. package/dist/ui/i18n.mjs.map +1 -0
  503. package/dist/ui/index.cjs +19 -1
  504. package/dist/ui/index.d.cts +6 -3
  505. package/dist/ui/index.d.mts +6 -3
  506. package/dist/ui/index.mjs +5 -2
  507. package/dist/ui/locale.cjs +53 -0
  508. package/dist/ui/locale.cjs.map +1 -0
  509. package/dist/ui/locale.d.cts +18 -0
  510. package/dist/ui/locale.d.mts +18 -0
  511. package/dist/ui/locale.mjs +49 -0
  512. package/dist/ui/locale.mjs.map +1 -0
  513. package/dist/ui/manifest/index.cjs +25 -0
  514. package/dist/ui/manifest/index.cjs.map +1 -0
  515. package/dist/ui/manifest/index.d.cts +9 -0
  516. package/dist/ui/manifest/index.d.mts +9 -0
  517. package/dist/ui/manifest/index.mjs +13 -0
  518. package/dist/ui/manifest/index.mjs.map +1 -0
  519. package/dist/ui/manifest-generator.cjs +8 -0
  520. package/dist/ui/manifest-generator.d.cts +1 -0
  521. package/dist/ui/manifest-generator.d.mts +1 -0
  522. package/dist/ui/manifest-generator.mjs +3 -0
  523. package/dist/ui/message-catalogs.cjs +8 -0
  524. package/dist/ui/message-catalogs.cjs.map +1 -0
  525. package/dist/ui/message-catalogs.d.cts +5 -0
  526. package/dist/ui/message-catalogs.d.mts +5 -0
  527. package/dist/ui/message-catalogs.mjs +8 -0
  528. package/dist/ui/message-catalogs.mjs.map +1 -0
  529. package/dist/ui/metadata.cjs +0 -1
  530. package/dist/ui/metadata.cjs.map +1 -1
  531. package/dist/ui/metadata.d.cts +1 -1
  532. package/dist/ui/metadata.d.mts +1 -1
  533. package/dist/ui/plugin-path.cjs +37 -0
  534. package/dist/ui/plugin-path.cjs.map +1 -0
  535. package/dist/ui/plugin-path.d.cts +25 -0
  536. package/dist/ui/plugin-path.d.mts +25 -0
  537. package/dist/ui/plugin-path.mjs +35 -0
  538. package/dist/ui/plugin-path.mjs.map +1 -0
  539. package/dist/ui/router-client.cjs +61 -0
  540. package/dist/ui/router-client.cjs.map +1 -0
  541. package/dist/ui/router-client.d.cts +20 -0
  542. package/dist/ui/router-client.d.mts +20 -0
  543. package/dist/ui/router-client.mjs +60 -0
  544. package/dist/ui/router-client.mjs.map +1 -0
  545. package/dist/ui/router-defaults.cjs +48 -0
  546. package/dist/ui/router-defaults.cjs.map +1 -0
  547. package/dist/ui/router-defaults.d.cts +8 -0
  548. package/dist/ui/router-defaults.d.mts +8 -0
  549. package/dist/ui/router-defaults.mjs +45 -0
  550. package/dist/ui/router-defaults.mjs.map +1 -0
  551. package/dist/ui/router-error.cjs +70 -0
  552. package/dist/ui/router-error.cjs.map +1 -0
  553. package/dist/ui/router-error.d.cts +19 -0
  554. package/dist/ui/router-error.d.mts +19 -0
  555. package/dist/ui/router-error.mjs +69 -0
  556. package/dist/ui/router-error.mjs.map +1 -0
  557. package/dist/ui/router-server.cjs +153 -0
  558. package/dist/ui/router-server.cjs.map +1 -0
  559. package/dist/ui/router-server.d.cts +38 -0
  560. package/dist/ui/router-server.d.mts +38 -0
  561. package/dist/ui/router-server.mjs +152 -0
  562. package/dist/ui/router-server.mjs.map +1 -0
  563. package/dist/ui/router.cjs +4 -16
  564. package/dist/ui/router.cjs.map +1 -1
  565. package/dist/ui/router.mjs +4 -15
  566. package/dist/ui/router.mjs.map +1 -1
  567. package/dist/ui/runtime.cjs +5 -1
  568. package/dist/ui/runtime.cjs.map +1 -1
  569. package/dist/ui/runtime.d.cts +2 -1
  570. package/dist/ui/runtime.d.mts +2 -1
  571. package/dist/ui/runtime.mjs +5 -1
  572. package/dist/ui/runtime.mjs.map +1 -1
  573. package/dist/ui/slot.cjs +34 -0
  574. package/dist/ui/slot.cjs.map +1 -0
  575. package/dist/ui/slot.d.cts +43 -0
  576. package/dist/ui/slot.d.mts +43 -0
  577. package/dist/ui/slot.mjs +34 -0
  578. package/dist/ui/slot.mjs.map +1 -0
  579. package/dist/ui/tenant.cjs +300 -0
  580. package/dist/ui/tenant.cjs.map +1 -0
  581. package/dist/ui/tenant.d.cts +122 -0
  582. package/dist/ui/tenant.d.mts +122 -0
  583. package/dist/ui/tenant.mjs +279 -0
  584. package/dist/ui/tenant.mjs.map +1 -0
  585. package/dist/ui/types.d.cts +32 -2
  586. package/dist/ui/types.d.mts +32 -2
  587. package/dist/ui/version-check.cjs +47 -0
  588. package/dist/ui/version-check.cjs.map +1 -0
  589. package/dist/ui/version-check.d.cts +23 -0
  590. package/dist/ui/version-check.d.mts +23 -0
  591. package/dist/ui/version-check.mjs +46 -0
  592. package/dist/ui/version-check.mjs.map +1 -0
  593. package/dist/utils/banner.cjs +2 -2
  594. package/dist/utils/banner.cjs.map +1 -1
  595. package/dist/utils/banner.mjs +2 -2
  596. package/dist/utils/banner.mjs.map +1 -1
  597. package/dist/utils/linkify.cjs +1 -1
  598. package/dist/utils/linkify.cjs.map +1 -1
  599. package/dist/utils/linkify.mjs +1 -0
  600. package/dist/utils/linkify.mjs.map +1 -1
  601. package/dist/utils/run.cjs +6 -6
  602. package/dist/utils/run.cjs.map +1 -1
  603. package/dist/utils/run.mjs +6 -6
  604. package/dist/utils/run.mjs.map +1 -1
  605. package/dist/utils/save-config.cjs +12 -0
  606. package/dist/utils/save-config.cjs.map +1 -1
  607. package/dist/utils/save-config.mjs +12 -0
  608. package/dist/utils/save-config.mjs.map +1 -1
  609. package/dist/utils/snapshot-hash.cjs +10 -0
  610. package/dist/utils/snapshot-hash.cjs.map +1 -0
  611. package/dist/utils/snapshot-hash.mjs +10 -0
  612. package/dist/utils/snapshot-hash.mjs.map +1 -0
  613. package/dist/utils/string.cjs +0 -1
  614. package/dist/utils/string.cjs.map +1 -1
  615. package/dist/utils/theme.cjs +30 -12
  616. package/dist/utils/theme.cjs.map +1 -1
  617. package/dist/utils/theme.mjs +30 -11
  618. package/dist/utils/theme.mjs.map +1 -1
  619. package/dist/version-manifest-deploy.cjs +50 -0
  620. package/dist/version-manifest-deploy.cjs.map +1 -0
  621. package/dist/version-manifest-deploy.mjs +49 -0
  622. package/dist/version-manifest-deploy.mjs.map +1 -0
  623. package/dist/version-manifest-resolve.cjs +42 -0
  624. package/dist/version-manifest-resolve.cjs.map +1 -0
  625. package/dist/version-manifest-resolve.d.cts +38 -0
  626. package/dist/version-manifest-resolve.d.mts +38 -0
  627. package/dist/version-manifest-resolve.mjs +40 -0
  628. package/dist/version-manifest-resolve.mjs.map +1 -0
  629. package/dist/version-status.cjs +18 -0
  630. package/dist/version-status.cjs.map +1 -0
  631. package/dist/version-status.d.cts +22 -0
  632. package/dist/version-status.d.mts +22 -0
  633. package/dist/version-status.mjs +17 -0
  634. package/dist/version-status.mjs.map +1 -0
  635. package/dist/workspace-catalog.cjs +53 -0
  636. package/dist/workspace-catalog.cjs.map +1 -0
  637. package/dist/workspace-catalog.mjs +51 -0
  638. package/dist/workspace-catalog.mjs.map +1 -0
  639. package/dist/workspace.cjs +237 -0
  640. package/dist/workspace.cjs.map +1 -0
  641. package/dist/workspace.mjs +233 -0
  642. package/dist/workspace.mjs.map +1 -0
  643. package/package.json +179 -27
  644. package/skills/add-a-route/SKILL.md +132 -0
  645. package/skills/api-and-auth/SKILL.md +87 -21
  646. package/skills/api-and-auth/references/middleware.md +1 -1
  647. package/skills/cli-reference/SKILL.md +48 -21
  648. package/skills/code-style/SKILL.md +8 -0
  649. package/skills/dev-workflow/SKILL.md +50 -26
  650. package/skills/extends-config/SKILL.md +31 -19
  651. package/skills/init-upgrade/SKILL.md +29 -16
  652. package/skills/plugin-development/SKILL.md +46 -112
  653. package/skills/plugin-development/references/database.md +82 -0
  654. package/skills/plugin-development/references/request-context.md +67 -0
  655. package/skills/publish-sync/SKILL.md +99 -22
  656. package/skills/registry/SKILL.md +82 -0
  657. package/skills/super-app/SKILL.md +25 -15
  658. package/skills/talk-to-the-app/SKILL.md +138 -0
  659. package/skills/ui-integration/SKILL.md +93 -11
  660. package/dist/cli/db-studio.cjs +0 -131
  661. package/dist/cli/db-studio.cjs.map +0 -1
  662. package/dist/cli/db-studio.mjs +0 -127
  663. package/dist/cli/db-studio.mjs.map +0 -1
  664. package/dist/cli/init.d.cts.map +0 -1
  665. package/dist/cli/init.d.mts.map +0 -1
  666. package/dist/components/dev-view.cjs +0 -309
  667. package/dist/components/dev-view.cjs.map +0 -1
  668. package/dist/components/dev-view.mjs +0 -309
  669. package/dist/components/dev-view.mjs.map +0 -1
  670. package/dist/components/streaming-view.cjs +0 -134
  671. package/dist/components/streaming-view.cjs.map +0 -1
  672. package/dist/components/streaming-view.mjs +0 -132
  673. package/dist/components/streaming-view.mjs.map +0 -1
  674. package/dist/config.d.cts.map +0 -1
  675. package/dist/config.d.mts.map +0 -1
  676. package/dist/contract.d.cts.map +0 -1
  677. package/dist/contract.d.mts.map +0 -1
  678. package/dist/contract.meta.d.cts.map +0 -1
  679. package/dist/contract.meta.d.mts.map +0 -1
  680. package/dist/dag.d.cts.map +0 -1
  681. package/dist/dag.d.mts.map +0 -1
  682. package/dist/db.cjs +0 -81
  683. package/dist/db.cjs.map +0 -1
  684. package/dist/db.d.cts +0 -30
  685. package/dist/db.d.cts.map +0 -1
  686. package/dist/db.d.mts +0 -30
  687. package/dist/db.d.mts.map +0 -1
  688. package/dist/db.mjs +0 -75
  689. package/dist/db.mjs.map +0 -1
  690. package/dist/fastkv.d.cts.map +0 -1
  691. package/dist/fastkv.d.mts.map +0 -1
  692. package/dist/integrity.d.cts.map +0 -1
  693. package/dist/integrity.d.mts.map +0 -1
  694. package/dist/merge.d.cts.map +0 -1
  695. package/dist/merge.d.mts.map +0 -1
  696. package/dist/mf.d.cts.map +0 -1
  697. package/dist/mf.d.mts.map +0 -1
  698. package/dist/plugin.d.cts.map +0 -1
  699. package/dist/plugin.d.mts.map +0 -1
  700. package/dist/service-descriptor.d.cts.map +0 -1
  701. package/dist/service-descriptor.d.mts.map +0 -1
  702. package/dist/types.d.cts.map +0 -1
  703. package/dist/types.d.mts.map +0 -1
  704. package/dist/ui/head.d.cts.map +0 -1
  705. package/dist/ui/head.d.mts.map +0 -1
  706. package/dist/ui/metadata.d.cts.map +0 -1
  707. package/dist/ui/metadata.d.mts.map +0 -1
  708. package/dist/ui/router.d.cts.map +0 -1
  709. package/dist/ui/router.d.mts.map +0 -1
  710. package/dist/ui/runtime.d.cts.map +0 -1
  711. package/dist/ui/runtime.d.mts.map +0 -1
  712. package/dist/ui/types.d.cts.map +0 -1
  713. package/dist/ui/types.d.mts.map +0 -1
@@ -0,0 +1,51 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { parse, stringify } from "yaml";
4
+
5
+ //#region src/workspace-catalog.ts
6
+ const WORKSPACE_YAML = "pnpm-workspace.yaml";
7
+ function catalogFromPackageJson(pkgJson) {
8
+ const catalog = pkgJson.workspaces?.catalog;
9
+ return catalog && typeof catalog === "object" ? { ...catalog } : {};
10
+ }
11
+ function readWorkspaceCatalog(root) {
12
+ const yamlPath = join(root, WORKSPACE_YAML);
13
+ if (existsSync(yamlPath)) {
14
+ const catalog = parse(readFileSync(yamlPath, "utf8"))?.catalog;
15
+ return catalog && typeof catalog === "object" ? { ...catalog } : {};
16
+ }
17
+ const pkgPath = join(root, "package.json");
18
+ if (existsSync(pkgPath)) try {
19
+ return catalogFromPackageJson(JSON.parse(readFileSync(pkgPath, "utf8")));
20
+ } catch {
21
+ return {};
22
+ }
23
+ return {};
24
+ }
25
+ function writeWorkspaceCatalog(root, catalog) {
26
+ const yamlPath = join(root, WORKSPACE_YAML);
27
+ const pkgPath = join(root, "package.json");
28
+ const usesYaml = existsSync(yamlPath);
29
+ const sorted = Object.fromEntries(Object.entries(catalog).sort(([a], [b]) => a.localeCompare(b)));
30
+ if (usesYaml) {
31
+ const parsed = parse(readFileSync(yamlPath, "utf8"));
32
+ const doc = parsed && typeof parsed === "object" ? parsed : {};
33
+ doc.catalog = sorted;
34
+ const body = stringify(doc, { lineWidth: 0 }).trimEnd();
35
+ writeFileSync(yamlPath, `${body}\n`);
36
+ return;
37
+ }
38
+ let pkg = {};
39
+ if (existsSync(pkgPath)) try {
40
+ pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
41
+ } catch {
42
+ pkg = {};
43
+ }
44
+ if (!pkg.workspaces) pkg.workspaces = {};
45
+ pkg.workspaces.catalog = sorted;
46
+ writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
47
+ }
48
+
49
+ //#endregion
50
+ export { catalogFromPackageJson, readWorkspaceCatalog, writeWorkspaceCatalog };
51
+ //# sourceMappingURL=workspace-catalog.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-catalog.mjs","names":[],"sources":["../src/workspace-catalog.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parse, stringify } from \"yaml\";\n\ninterface PkgJsonLike {\n workspaces?: { packages?: string[]; catalog?: Record<string, string> };\n}\n\ninterface WorkspaceYaml {\n packages?: string[];\n catalog?: Record<string, string>;\n [key: string]: unknown;\n}\n\nconst WORKSPACE_YAML = \"pnpm-workspace.yaml\";\n\nexport function catalogFromPackageJson(pkgJson: PkgJsonLike): Record<string, string> {\n const catalog = pkgJson.workspaces?.catalog;\n return catalog && typeof catalog === \"object\" ? { ...catalog } : {};\n}\n\nexport function readWorkspaceCatalog(root: string): Record<string, string> {\n const yamlPath = join(root, WORKSPACE_YAML);\n if (existsSync(yamlPath)) {\n const doc = parse(readFileSync(yamlPath, \"utf8\")) as WorkspaceYaml | null;\n const catalog = doc?.catalog;\n return catalog && typeof catalog === \"object\" ? { ...catalog } : {};\n }\n\n const pkgPath = join(root, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as PkgJsonLike;\n return catalogFromPackageJson(pkg);\n } catch {\n return {};\n }\n }\n\n return {};\n}\n\nexport function writeWorkspaceCatalog(root: string, catalog: Record<string, string>): void {\n const yamlPath = join(root, WORKSPACE_YAML);\n const pkgPath = join(root, \"package.json\");\n const usesYaml = existsSync(yamlPath);\n const sorted = Object.fromEntries(Object.entries(catalog).sort(([a], [b]) => a.localeCompare(b)));\n\n if (usesYaml) {\n const parsed = parse(readFileSync(yamlPath, \"utf8\")) as WorkspaceYaml | null;\n const doc: WorkspaceYaml = parsed && typeof parsed === \"object\" ? parsed : {};\n doc.catalog = sorted;\n const body = stringify(doc, { lineWidth: 0 }).trimEnd();\n writeFileSync(yamlPath, `${body}\\n`);\n return;\n }\n\n let pkg: PkgJsonLike = {};\n if (existsSync(pkgPath)) {\n try {\n pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as PkgJsonLike;\n } catch {\n pkg = {};\n }\n }\n if (!pkg.workspaces) {\n pkg.workspaces = {};\n }\n pkg.workspaces.catalog = sorted;\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n}\n"],"mappings":";;;;;AAcA,MAAM,iBAAiB;AAEvB,SAAgB,uBAAuB,SAA8C;CACnF,MAAM,UAAU,QAAQ,YAAY;CACpC,OAAO,WAAW,OAAO,YAAY,WAAW,EAAE,GAAG,QAAQ,IAAI,CAAC;AACpE;AAEA,SAAgB,qBAAqB,MAAsC;CACzE,MAAM,WAAW,KAAK,MAAM,cAAc;CAC1C,IAAI,WAAW,QAAQ,GAAG;EAExB,MAAM,UADM,MAAM,aAAa,UAAU,MAAM,CAC7B,CAAC,EAAE;EACrB,OAAO,WAAW,OAAO,YAAY,WAAW,EAAE,GAAG,QAAQ,IAAI,CAAC;CACpE;CAEA,MAAM,UAAU,KAAK,MAAM,cAAc;CACzC,IAAI,WAAW,OAAO,GACpB,IAAI;EAEF,OAAO,uBADK,KAAK,MAAM,aAAa,SAAS,MAAM,CACnB,CAAC;CACnC,QAAQ;EACN,OAAO,CAAC;CACV;CAGF,OAAO,CAAC;AACV;AAEA,SAAgB,sBAAsB,MAAc,SAAuC;CACzF,MAAM,WAAW,KAAK,MAAM,cAAc;CAC1C,MAAM,UAAU,KAAK,MAAM,cAAc;CACzC,MAAM,WAAW,WAAW,QAAQ;CACpC,MAAM,SAAS,OAAO,YAAY,OAAO,QAAQ,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;CAEhG,IAAI,UAAU;EACZ,MAAM,SAAS,MAAM,aAAa,UAAU,MAAM,CAAC;EACnD,MAAM,MAAqB,UAAU,OAAO,WAAW,WAAW,SAAS,CAAC;EAC5E,IAAI,UAAU;EACd,MAAM,OAAO,UAAU,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ;EACtD,cAAc,UAAU,GAAG,KAAK,GAAG;EACnC;CACF;CAEA,IAAI,MAAmB,CAAC;CACxB,IAAI,WAAW,OAAO,GACpB,IAAI;EACF,MAAM,KAAK,MAAM,aAAa,SAAS,MAAM,CAAC;CAChD,QAAQ;EACN,MAAM,CAAC;CACT;CAEF,IAAI,CAAC,IAAI,YACP,IAAI,aAAa,CAAC;CAEpB,IAAI,WAAW,UAAU;CACzB,cAAc,SAAS,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,GAAG;AAC5D"}
@@ -0,0 +1,237 @@
1
+ const require_run = require('./utils/run.cjs');
2
+ let node_fs = require("node:fs");
3
+ let node_path = require("node:path");
4
+ let yaml = require("yaml");
5
+ let node_fs_promises = require("node:fs/promises");
6
+
7
+ //#region src/workspace.ts
8
+ var DepsBuildFailure = class extends Error {
9
+ failures;
10
+ constructor(failures) {
11
+ const detail = failures.map((failure) => `${failure.member.name} (exit ${failure.exitCode})\n${outputTail(failure.output)}`).join("\n\n");
12
+ super(`workspace dependency builds failed:\n${detail}`);
13
+ this.name = "DepsBuildFailure";
14
+ this.failures = [...failures];
15
+ }
16
+ };
17
+ const workspaceRootCache = /* @__PURE__ */ new Map();
18
+ function findWorkspaceRoot(startDir) {
19
+ const key = (0, node_path.resolve)(startDir);
20
+ const cached = workspaceRootCache.get(key);
21
+ if (cached !== void 0) return cached;
22
+ const found = discoverWorkspaceRoot(key);
23
+ workspaceRootCache.set(key, found);
24
+ return found;
25
+ }
26
+ function discoverWorkspaceRoot(dir) {
27
+ let current = dir;
28
+ while (true) {
29
+ const root = readWorkspaceRootAt(current);
30
+ if (root) return root;
31
+ const parent = (0, node_path.dirname)(current);
32
+ if (parent === current) return null;
33
+ current = parent;
34
+ }
35
+ }
36
+ function readWorkspaceRootAt(dir) {
37
+ const yamlPath = (0, node_path.join)(dir, "pnpm-workspace.yaml");
38
+ if ((0, node_fs.existsSync)(yamlPath)) {
39
+ const globs = workspaceGlobsFromYaml((0, yaml.parse)((0, node_fs.readFileSync)(yamlPath, "utf8"))?.packages);
40
+ if (globs) return readWorkspaceMembers(dir, globs);
41
+ }
42
+ const manifestPath = (0, node_path.join)(dir, "package.json");
43
+ if (!(0, node_fs.existsSync)(manifestPath)) return null;
44
+ const manifest = readManifest(manifestPath);
45
+ if (!manifest) return null;
46
+ const globs = workspaceGlobs(manifest.workspaces);
47
+ if (!globs) return null;
48
+ return readWorkspaceMembers(dir, globs);
49
+ }
50
+ function workspaceGlobsFromYaml(packages) {
51
+ if (!Array.isArray(packages)) return null;
52
+ const globs = packages.filter((glob) => typeof glob === "string");
53
+ return globs.length > 0 ? globs : null;
54
+ }
55
+ function readWorkspaceMembers(dir, globs) {
56
+ const memberDirs = matchMemberDirs(dir, globs);
57
+ const drafts = [];
58
+ for (const memberDir of memberDirs) {
59
+ const memberManifest = readManifest((0, node_path.join)(memberDir, "package.json"));
60
+ if (!memberManifest || typeof memberManifest.name !== "string") continue;
61
+ drafts.push({
62
+ name: memberManifest.name,
63
+ dir: memberDir,
64
+ manifest: memberManifest
65
+ });
66
+ }
67
+ const names = new Set(drafts.map((draft) => draft.name));
68
+ return {
69
+ dir,
70
+ members: drafts.map((draft) => ({
71
+ name: draft.name,
72
+ dir: draft.dir,
73
+ localDeps: declaredDepNames(draft.manifest).filter((dep) => names.has(dep))
74
+ })).sort((a, b) => a.name.localeCompare(b.name))
75
+ };
76
+ }
77
+ function workspaceGlobs(workspaces) {
78
+ if (Array.isArray(workspaces)) return workspaces.filter((glob) => typeof glob === "string");
79
+ if (workspaces && typeof workspaces === "object") {
80
+ const packages = workspaces.packages;
81
+ if (Array.isArray(packages)) return packages.filter((glob) => typeof glob === "string");
82
+ }
83
+ return null;
84
+ }
85
+ function matchMemberDirs(rootDir, globs) {
86
+ const found = /* @__PURE__ */ new Set();
87
+ for (const glob of globs) collectMemberDirs(rootDir, glob.split("/"), found);
88
+ return [...found].sort();
89
+ }
90
+ function collectMemberDirs(dir, segments, out) {
91
+ const [head, ...rest] = segments;
92
+ if (!head) return;
93
+ let entries;
94
+ try {
95
+ entries = (0, node_fs.readdirSync)(dir, { withFileTypes: true });
96
+ } catch {
97
+ return;
98
+ }
99
+ for (const entry of entries) {
100
+ if (!entry.isDirectory()) continue;
101
+ if (head !== "*" && head !== entry.name) continue;
102
+ const child = (0, node_path.join)(dir, entry.name);
103
+ if (rest.length === 0) out.add(child);
104
+ else collectMemberDirs(child, rest, out);
105
+ }
106
+ }
107
+ function readManifest(path) {
108
+ try {
109
+ return JSON.parse((0, node_fs.readFileSync)(path, "utf8"));
110
+ } catch {
111
+ return null;
112
+ }
113
+ }
114
+ function declaredDepNames(manifest) {
115
+ const names = [];
116
+ for (const field of ["dependencies", "devDependencies"]) {
117
+ const deps = manifest[field];
118
+ if (deps && typeof deps === "object") names.push(...Object.keys(deps));
119
+ }
120
+ return names;
121
+ }
122
+ function localDepsOf(root, targetDirs) {
123
+ const byName = new Map(root.members.map((member) => [member.name, member]));
124
+ const byDir = new Map(root.members.map((member) => [member.dir, member]));
125
+ const ordered = [];
126
+ const seen = /* @__PURE__ */ new Set();
127
+ const visit = (member) => {
128
+ if (seen.has(member.name)) return;
129
+ seen.add(member.name);
130
+ for (const dep of member.localDeps) {
131
+ const depMember = byName.get(dep);
132
+ if (depMember) visit(depMember);
133
+ }
134
+ ordered.push(member);
135
+ };
136
+ for (const targetDir of targetDirs) {
137
+ const target = byDir.get((0, node_path.resolve)(targetDir));
138
+ if (!target) continue;
139
+ for (const dep of target.localDeps) {
140
+ const depMember = byName.get(dep);
141
+ if (depMember) visit(depMember);
142
+ }
143
+ }
144
+ return ordered;
145
+ }
146
+ async function ensureFreshDeps(startDir, targetDirs, opts) {
147
+ const root = findWorkspaceRoot(startDir);
148
+ if (!root) return {
149
+ rebuilt: [],
150
+ fresh: []
151
+ };
152
+ const closure = localDepsOf(root, targetDirs);
153
+ const force = opts?.force ?? false;
154
+ const judgements = await Promise.all(closure.map(async (member) => force || await isStaleMember(member)));
155
+ const rebuilt = closure.filter((_, index) => judgements[index]);
156
+ const fresh = closure.filter((_, index) => !judgements[index]);
157
+ if (rebuilt.length > 0) {
158
+ const failures = (await Promise.allSettled(rebuilt.map((member) => require_run.run("pnpm", ["run", "build"], {
159
+ cwd: member.dir,
160
+ capture: true,
161
+ env: opts?.env
162
+ })))).flatMap((result, index) => {
163
+ const value = result.status === "fulfilled" ? result.value : void 0;
164
+ if (value && value.exitCode === 0) return [];
165
+ const output = value ? `${value.stdout}\n${value.stderr}` : result.status === "rejected" ? String(result.reason) : "";
166
+ return [{
167
+ member: rebuilt[index],
168
+ exitCode: value ? value.exitCode ?? 1 : 1,
169
+ output
170
+ }];
171
+ });
172
+ if (failures.length > 0) throw new DepsBuildFailure(failures);
173
+ }
174
+ return {
175
+ rebuilt,
176
+ fresh
177
+ };
178
+ }
179
+ async function isStaleMember(member) {
180
+ const oracle = distOracle(member.dir);
181
+ if (!oracle) return false;
182
+ return isWorkspaceDistStale(member.dir, oracle);
183
+ }
184
+ function distOracle(memberDir) {
185
+ const manifest = readManifest((0, node_path.join)(memberDir, "package.json"));
186
+ if (!manifest) return null;
187
+ const entry = manifest.exports && typeof manifest.exports === "object" ? manifest.exports["."] : void 0;
188
+ if (entry && typeof entry === "object") for (const key of [
189
+ "import",
190
+ "default",
191
+ "require",
192
+ "types"
193
+ ]) {
194
+ const value = entry[key];
195
+ if (typeof value === "string" && !value.startsWith("./src")) return value;
196
+ }
197
+ if (typeof manifest.module === "string" && !manifest.module.startsWith("./src")) return manifest.module;
198
+ if (typeof manifest.main === "string" && !manifest.main.startsWith("./src")) return manifest.main;
199
+ const reportPath = (0, node_path.join)(memberDir, "dist", "build-report.json");
200
+ if ((0, node_fs.existsSync)(reportPath)) {
201
+ const report = readManifest(reportPath);
202
+ if (report && typeof report.entry === "string" && report.entry) return (0, node_path.join)("dist", report.entry);
203
+ }
204
+ return null;
205
+ }
206
+ async function newestSourceMtimeMs(dir) {
207
+ let newest = 0;
208
+ const entries = await (0, node_fs_promises.readdir)(dir, { withFileTypes: true });
209
+ for (const entry of entries) {
210
+ if (entry.name === "node_modules" || entry.name === "dist") continue;
211
+ const fullPath = (0, node_path.join)(dir, entry.name);
212
+ if (entry.isDirectory()) newest = Math.max(newest, await newestSourceMtimeMs(fullPath));
213
+ else newest = Math.max(newest, (await (0, node_fs_promises.stat)(fullPath)).mtimeMs);
214
+ }
215
+ return newest;
216
+ }
217
+ async function isWorkspaceDistStale(packageDir, distEntry) {
218
+ const distPath = (0, node_path.join)(packageDir, distEntry);
219
+ if (!(0, node_fs.existsSync)(distPath)) return true;
220
+ const [distMtime, srcMtime, pkgMtime] = await Promise.all([
221
+ (0, node_fs_promises.stat)(distPath).then((s) => s.mtimeMs),
222
+ newestSourceMtimeMs((0, node_path.join)(packageDir, "src")),
223
+ (0, node_fs_promises.stat)((0, node_path.join)(packageDir, "package.json")).then((s) => s.mtimeMs)
224
+ ]);
225
+ return Math.max(srcMtime, pkgMtime) > distMtime;
226
+ }
227
+ function outputTail(output) {
228
+ return output.trim().split("\n").slice(-10).join("\n");
229
+ }
230
+
231
+ //#endregion
232
+ exports.DepsBuildFailure = DepsBuildFailure;
233
+ exports.ensureFreshDeps = ensureFreshDeps;
234
+ exports.findWorkspaceRoot = findWorkspaceRoot;
235
+ exports.isWorkspaceDistStale = isWorkspaceDistStale;
236
+ exports.localDepsOf = localDepsOf;
237
+ //# sourceMappingURL=workspace.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.cjs","names":["resolve","dirname","join","existsSync","parse","readFileSync","readdirSync","run","readdir","stat"],"sources":["../src/workspace.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parse } from \"yaml\";\nimport { run } from \"./utils/run\";\n\nexport interface WorkspaceMember {\n readonly name: string;\n readonly dir: string;\n readonly localDeps: readonly string[];\n}\n\nexport interface WorkspaceRoot {\n readonly dir: string;\n readonly members: readonly WorkspaceMember[];\n}\n\nexport interface DepsReport {\n readonly rebuilt: readonly WorkspaceMember[];\n readonly fresh: readonly WorkspaceMember[];\n}\n\nexport interface DepsBuildFailureEntry {\n readonly member: WorkspaceMember;\n readonly exitCode: number;\n readonly output: string;\n}\n\nexport class DepsBuildFailure extends Error {\n readonly failures: readonly DepsBuildFailureEntry[];\n\n constructor(failures: readonly DepsBuildFailureEntry[]) {\n const detail = failures\n .map(\n (failure) =>\n `${failure.member.name} (exit ${failure.exitCode})\\n${outputTail(failure.output)}`,\n )\n .join(\"\\n\\n\");\n super(`workspace dependency builds failed:\\n${detail}`);\n this.name = \"DepsBuildFailure\";\n this.failures = [...failures];\n }\n}\n\nconst workspaceRootCache = new Map<string, WorkspaceRoot | null>();\n\nexport function clearWorkspaceRootCache(): void {\n workspaceRootCache.clear();\n}\n\nexport function findWorkspaceRoot(startDir: string): WorkspaceRoot | null {\n const key = resolve(startDir);\n const cached = workspaceRootCache.get(key);\n if (cached !== undefined) return cached;\n const found = discoverWorkspaceRoot(key);\n workspaceRootCache.set(key, found);\n return found;\n}\n\nfunction discoverWorkspaceRoot(dir: string): WorkspaceRoot | null {\n let current = dir;\n while (true) {\n const root = readWorkspaceRootAt(current);\n if (root) return root;\n const parent = dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n\nfunction readWorkspaceRootAt(dir: string): WorkspaceRoot | null {\n // v2 (ADR 0026): workspace globs live in pnpm-workspace.yaml. Pre-v2\n // runtimes keep the package.json workspaces fallback.\n const yamlPath = join(dir, \"pnpm-workspace.yaml\");\n if (existsSync(yamlPath)) {\n const doc = parse(readFileSync(yamlPath, \"utf8\")) as { packages?: unknown } | null;\n const globs = workspaceGlobsFromYaml(doc?.packages);\n if (globs) return readWorkspaceMembers(dir, globs);\n }\n\n const manifestPath = join(dir, \"package.json\");\n if (!existsSync(manifestPath)) return null;\n const manifest = readManifest(manifestPath);\n if (!manifest) return null;\n const globs = workspaceGlobs(manifest.workspaces);\n if (!globs) return null;\n\n return readWorkspaceMembers(dir, globs);\n}\n\nfunction workspaceGlobsFromYaml(packages: unknown): string[] | null {\n if (!Array.isArray(packages)) return null;\n const globs = packages.filter((glob): glob is string => typeof glob === \"string\");\n return globs.length > 0 ? globs : null;\n}\n\nfunction readWorkspaceMembers(dir: string, globs: readonly string[]): WorkspaceRoot {\n const memberDirs = matchMemberDirs(dir, globs);\n const drafts: { name: string; dir: string; manifest: Record<string, unknown> }[] = [];\n for (const memberDir of memberDirs) {\n const memberManifest = readManifest(join(memberDir, \"package.json\"));\n if (!memberManifest || typeof memberManifest.name !== \"string\") continue;\n drafts.push({ name: memberManifest.name, dir: memberDir, manifest: memberManifest });\n }\n\n const names = new Set(drafts.map((draft) => draft.name));\n const members = drafts\n .map((draft) => ({\n name: draft.name,\n dir: draft.dir,\n localDeps: declaredDepNames(draft.manifest).filter((dep) => names.has(dep)),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n return { dir, members };\n}\n\nfunction workspaceGlobs(workspaces: unknown): string[] | null {\n if (Array.isArray(workspaces)) {\n return workspaces.filter((glob): glob is string => typeof glob === \"string\");\n }\n if (workspaces && typeof workspaces === \"object\") {\n const packages = (workspaces as { packages?: unknown }).packages;\n if (Array.isArray(packages)) {\n return packages.filter((glob): glob is string => typeof glob === \"string\");\n }\n }\n return null;\n}\n\nfunction matchMemberDirs(rootDir: string, globs: readonly string[]): string[] {\n const found = new Set<string>();\n for (const glob of globs) {\n collectMemberDirs(rootDir, glob.split(\"/\"), found);\n }\n return [...found].sort();\n}\n\nfunction collectMemberDirs(dir: string, segments: readonly string[], out: Set<string>): void {\n const [head, ...rest] = segments;\n if (!head) return;\n let entries: readonly { name: string; isDirectory(): boolean }[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (head !== \"*\" && head !== entry.name) continue;\n const child = join(dir, entry.name);\n if (rest.length === 0) out.add(child);\n else collectMemberDirs(child, rest, out);\n }\n}\n\nfunction readManifest(path: string): Record<string, unknown> | null {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction declaredDepNames(manifest: Record<string, unknown>): string[] {\n const names: string[] = [];\n for (const field of [\"dependencies\", \"devDependencies\"] as const) {\n const deps = manifest[field];\n if (deps && typeof deps === \"object\") {\n names.push(...Object.keys(deps as Record<string, unknown>));\n }\n }\n return names;\n}\n\nexport function localDepsOf(\n root: WorkspaceRoot,\n targetDirs: readonly string[],\n): readonly WorkspaceMember[] {\n const byName = new Map(root.members.map((member) => [member.name, member]));\n const byDir = new Map(root.members.map((member) => [member.dir, member]));\n const ordered: WorkspaceMember[] = [];\n const seen = new Set<string>();\n\n const visit = (member: WorkspaceMember): void => {\n if (seen.has(member.name)) return;\n seen.add(member.name);\n for (const dep of member.localDeps) {\n const depMember = byName.get(dep);\n if (depMember) visit(depMember);\n }\n ordered.push(member);\n };\n\n for (const targetDir of targetDirs) {\n const target = byDir.get(resolve(targetDir));\n if (!target) continue;\n for (const dep of target.localDeps) {\n const depMember = byName.get(dep);\n if (depMember) visit(depMember);\n }\n }\n\n return ordered;\n}\n\nexport async function ensureFreshDeps(\n startDir: string,\n targetDirs: readonly string[],\n opts?: {\n readonly force?: boolean;\n /** Build-mode contract for prerequisite children (ADR 0018): deploy\n * builds run dist-first, so every build child — prerequisite or target —\n * must receive the same env; a bundler-config workspace in the closure\n * resolves differently without it. Callers that pass nothing keep the\n * ambient env (dev-time staleness rebuilds). */\n readonly env?: Record<string, string>;\n },\n): Promise<DepsReport> {\n const root = findWorkspaceRoot(startDir);\n if (!root) return { rebuilt: [], fresh: [] };\n\n const closure = localDepsOf(root, targetDirs);\n const force = opts?.force ?? false;\n const judgements = await Promise.all(\n closure.map(async (member) => force || (await isStaleMember(member))),\n );\n const rebuilt = closure.filter((_, index) => judgements[index]);\n const fresh = closure.filter((_, index) => !judgements[index]);\n\n if (rebuilt.length > 0) {\n const results = await Promise.allSettled(\n rebuilt.map((member) =>\n run(\"pnpm\", [\"run\", \"build\"], {\n cwd: member.dir,\n capture: true,\n env: opts?.env,\n }),\n ),\n );\n const failures = results.flatMap((result, index) => {\n const value = result.status === \"fulfilled\" ? result.value : undefined;\n if (value && value.exitCode === 0) return [];\n const output = value\n ? `${value.stdout}\\n${value.stderr}`\n : result.status === \"rejected\"\n ? String(result.reason)\n : \"\";\n return [\n {\n member: rebuilt[index],\n exitCode: value ? (value.exitCode ?? 1) : 1,\n output,\n },\n ];\n });\n if (failures.length > 0) throw new DepsBuildFailure(failures);\n }\n\n return { rebuilt, fresh };\n}\n\nasync function isStaleMember(member: WorkspaceMember): Promise<boolean> {\n const oracle = distOracle(member.dir);\n if (!oracle) return false;\n return isWorkspaceDistStale(member.dir, oracle);\n}\n\nfunction distOracle(memberDir: string): string | null {\n const manifest = readManifest(join(memberDir, \"package.json\"));\n if (!manifest) return null;\n\n const entry =\n manifest.exports && typeof manifest.exports === \"object\"\n ? (manifest.exports as Record<string, unknown>)[\".\"]\n : undefined;\n if (entry && typeof entry === \"object\") {\n for (const key of [\"import\", \"default\", \"require\", \"types\"] as const) {\n const value = (entry as Record<string, unknown>)[key];\n if (typeof value === \"string\" && !value.startsWith(\"./src\")) return value;\n }\n }\n if (typeof manifest.module === \"string\" && !manifest.module.startsWith(\"./src\")) {\n return manifest.module;\n }\n if (typeof manifest.main === \"string\" && !manifest.main.startsWith(\"./src\")) {\n return manifest.main;\n }\n\n const reportPath = join(memberDir, \"dist\", \"build-report.json\");\n if (existsSync(reportPath)) {\n const report = readManifest(reportPath);\n if (report && typeof report.entry === \"string\" && report.entry) {\n return join(\"dist\", report.entry);\n }\n }\n return null;\n}\n\nasync function newestSourceMtimeMs(dir: string): Promise<number> {\n let newest = 0;\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name === \"node_modules\" || entry.name === \"dist\") continue;\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n newest = Math.max(newest, await newestSourceMtimeMs(fullPath));\n } else {\n newest = Math.max(newest, (await stat(fullPath)).mtimeMs);\n }\n }\n return newest;\n}\n\nexport async function isWorkspaceDistStale(\n packageDir: string,\n distEntry: string,\n): Promise<boolean> {\n const distPath = join(packageDir, distEntry);\n if (!existsSync(distPath)) return true;\n const [distMtime, srcMtime, pkgMtime] = await Promise.all([\n stat(distPath).then((s) => s.mtimeMs),\n newestSourceMtimeMs(join(packageDir, \"src\")),\n stat(join(packageDir, \"package.json\")).then((s) => s.mtimeMs),\n ]);\n return Math.max(srcMtime, pkgMtime) > distMtime;\n}\n\nfunction outputTail(output: string): string {\n const lines = output.trim().split(\"\\n\");\n return lines.slice(-10).join(\"\\n\");\n}\n"],"mappings":"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"}
@@ -0,0 +1,233 @@
1
+ import { run } from "./utils/run.mjs";
2
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { parse } from "yaml";
5
+ import { readdir, stat } from "node:fs/promises";
6
+
7
+ //#region src/workspace.ts
8
+ var DepsBuildFailure = class extends Error {
9
+ failures;
10
+ constructor(failures) {
11
+ const detail = failures.map((failure) => `${failure.member.name} (exit ${failure.exitCode})\n${outputTail(failure.output)}`).join("\n\n");
12
+ super(`workspace dependency builds failed:\n${detail}`);
13
+ this.name = "DepsBuildFailure";
14
+ this.failures = [...failures];
15
+ }
16
+ };
17
+ const workspaceRootCache = /* @__PURE__ */ new Map();
18
+ function findWorkspaceRoot(startDir) {
19
+ const key = resolve(startDir);
20
+ const cached = workspaceRootCache.get(key);
21
+ if (cached !== void 0) return cached;
22
+ const found = discoverWorkspaceRoot(key);
23
+ workspaceRootCache.set(key, found);
24
+ return found;
25
+ }
26
+ function discoverWorkspaceRoot(dir) {
27
+ let current = dir;
28
+ while (true) {
29
+ const root = readWorkspaceRootAt(current);
30
+ if (root) return root;
31
+ const parent = dirname(current);
32
+ if (parent === current) return null;
33
+ current = parent;
34
+ }
35
+ }
36
+ function readWorkspaceRootAt(dir) {
37
+ const yamlPath = join(dir, "pnpm-workspace.yaml");
38
+ if (existsSync(yamlPath)) {
39
+ const globs = workspaceGlobsFromYaml(parse(readFileSync(yamlPath, "utf8"))?.packages);
40
+ if (globs) return readWorkspaceMembers(dir, globs);
41
+ }
42
+ const manifestPath = join(dir, "package.json");
43
+ if (!existsSync(manifestPath)) return null;
44
+ const manifest = readManifest(manifestPath);
45
+ if (!manifest) return null;
46
+ const globs = workspaceGlobs(manifest.workspaces);
47
+ if (!globs) return null;
48
+ return readWorkspaceMembers(dir, globs);
49
+ }
50
+ function workspaceGlobsFromYaml(packages) {
51
+ if (!Array.isArray(packages)) return null;
52
+ const globs = packages.filter((glob) => typeof glob === "string");
53
+ return globs.length > 0 ? globs : null;
54
+ }
55
+ function readWorkspaceMembers(dir, globs) {
56
+ const memberDirs = matchMemberDirs(dir, globs);
57
+ const drafts = [];
58
+ for (const memberDir of memberDirs) {
59
+ const memberManifest = readManifest(join(memberDir, "package.json"));
60
+ if (!memberManifest || typeof memberManifest.name !== "string") continue;
61
+ drafts.push({
62
+ name: memberManifest.name,
63
+ dir: memberDir,
64
+ manifest: memberManifest
65
+ });
66
+ }
67
+ const names = new Set(drafts.map((draft) => draft.name));
68
+ return {
69
+ dir,
70
+ members: drafts.map((draft) => ({
71
+ name: draft.name,
72
+ dir: draft.dir,
73
+ localDeps: declaredDepNames(draft.manifest).filter((dep) => names.has(dep))
74
+ })).sort((a, b) => a.name.localeCompare(b.name))
75
+ };
76
+ }
77
+ function workspaceGlobs(workspaces) {
78
+ if (Array.isArray(workspaces)) return workspaces.filter((glob) => typeof glob === "string");
79
+ if (workspaces && typeof workspaces === "object") {
80
+ const packages = workspaces.packages;
81
+ if (Array.isArray(packages)) return packages.filter((glob) => typeof glob === "string");
82
+ }
83
+ return null;
84
+ }
85
+ function matchMemberDirs(rootDir, globs) {
86
+ const found = /* @__PURE__ */ new Set();
87
+ for (const glob of globs) collectMemberDirs(rootDir, glob.split("/"), found);
88
+ return [...found].sort();
89
+ }
90
+ function collectMemberDirs(dir, segments, out) {
91
+ const [head, ...rest] = segments;
92
+ if (!head) return;
93
+ let entries;
94
+ try {
95
+ entries = readdirSync(dir, { withFileTypes: true });
96
+ } catch {
97
+ return;
98
+ }
99
+ for (const entry of entries) {
100
+ if (!entry.isDirectory()) continue;
101
+ if (head !== "*" && head !== entry.name) continue;
102
+ const child = join(dir, entry.name);
103
+ if (rest.length === 0) out.add(child);
104
+ else collectMemberDirs(child, rest, out);
105
+ }
106
+ }
107
+ function readManifest(path) {
108
+ try {
109
+ return JSON.parse(readFileSync(path, "utf8"));
110
+ } catch {
111
+ return null;
112
+ }
113
+ }
114
+ function declaredDepNames(manifest) {
115
+ const names = [];
116
+ for (const field of ["dependencies", "devDependencies"]) {
117
+ const deps = manifest[field];
118
+ if (deps && typeof deps === "object") names.push(...Object.keys(deps));
119
+ }
120
+ return names;
121
+ }
122
+ function localDepsOf(root, targetDirs) {
123
+ const byName = new Map(root.members.map((member) => [member.name, member]));
124
+ const byDir = new Map(root.members.map((member) => [member.dir, member]));
125
+ const ordered = [];
126
+ const seen = /* @__PURE__ */ new Set();
127
+ const visit = (member) => {
128
+ if (seen.has(member.name)) return;
129
+ seen.add(member.name);
130
+ for (const dep of member.localDeps) {
131
+ const depMember = byName.get(dep);
132
+ if (depMember) visit(depMember);
133
+ }
134
+ ordered.push(member);
135
+ };
136
+ for (const targetDir of targetDirs) {
137
+ const target = byDir.get(resolve(targetDir));
138
+ if (!target) continue;
139
+ for (const dep of target.localDeps) {
140
+ const depMember = byName.get(dep);
141
+ if (depMember) visit(depMember);
142
+ }
143
+ }
144
+ return ordered;
145
+ }
146
+ async function ensureFreshDeps(startDir, targetDirs, opts) {
147
+ const root = findWorkspaceRoot(startDir);
148
+ if (!root) return {
149
+ rebuilt: [],
150
+ fresh: []
151
+ };
152
+ const closure = localDepsOf(root, targetDirs);
153
+ const force = opts?.force ?? false;
154
+ const judgements = await Promise.all(closure.map(async (member) => force || await isStaleMember(member)));
155
+ const rebuilt = closure.filter((_, index) => judgements[index]);
156
+ const fresh = closure.filter((_, index) => !judgements[index]);
157
+ if (rebuilt.length > 0) {
158
+ const failures = (await Promise.allSettled(rebuilt.map((member) => run("pnpm", ["run", "build"], {
159
+ cwd: member.dir,
160
+ capture: true,
161
+ env: opts?.env
162
+ })))).flatMap((result, index) => {
163
+ const value = result.status === "fulfilled" ? result.value : void 0;
164
+ if (value && value.exitCode === 0) return [];
165
+ const output = value ? `${value.stdout}\n${value.stderr}` : result.status === "rejected" ? String(result.reason) : "";
166
+ return [{
167
+ member: rebuilt[index],
168
+ exitCode: value ? value.exitCode ?? 1 : 1,
169
+ output
170
+ }];
171
+ });
172
+ if (failures.length > 0) throw new DepsBuildFailure(failures);
173
+ }
174
+ return {
175
+ rebuilt,
176
+ fresh
177
+ };
178
+ }
179
+ async function isStaleMember(member) {
180
+ const oracle = distOracle(member.dir);
181
+ if (!oracle) return false;
182
+ return isWorkspaceDistStale(member.dir, oracle);
183
+ }
184
+ function distOracle(memberDir) {
185
+ const manifest = readManifest(join(memberDir, "package.json"));
186
+ if (!manifest) return null;
187
+ const entry = manifest.exports && typeof manifest.exports === "object" ? manifest.exports["."] : void 0;
188
+ if (entry && typeof entry === "object") for (const key of [
189
+ "import",
190
+ "default",
191
+ "require",
192
+ "types"
193
+ ]) {
194
+ const value = entry[key];
195
+ if (typeof value === "string" && !value.startsWith("./src")) return value;
196
+ }
197
+ if (typeof manifest.module === "string" && !manifest.module.startsWith("./src")) return manifest.module;
198
+ if (typeof manifest.main === "string" && !manifest.main.startsWith("./src")) return manifest.main;
199
+ const reportPath = join(memberDir, "dist", "build-report.json");
200
+ if (existsSync(reportPath)) {
201
+ const report = readManifest(reportPath);
202
+ if (report && typeof report.entry === "string" && report.entry) return join("dist", report.entry);
203
+ }
204
+ return null;
205
+ }
206
+ async function newestSourceMtimeMs(dir) {
207
+ let newest = 0;
208
+ const entries = await readdir(dir, { withFileTypes: true });
209
+ for (const entry of entries) {
210
+ if (entry.name === "node_modules" || entry.name === "dist") continue;
211
+ const fullPath = join(dir, entry.name);
212
+ if (entry.isDirectory()) newest = Math.max(newest, await newestSourceMtimeMs(fullPath));
213
+ else newest = Math.max(newest, (await stat(fullPath)).mtimeMs);
214
+ }
215
+ return newest;
216
+ }
217
+ async function isWorkspaceDistStale(packageDir, distEntry) {
218
+ const distPath = join(packageDir, distEntry);
219
+ if (!existsSync(distPath)) return true;
220
+ const [distMtime, srcMtime, pkgMtime] = await Promise.all([
221
+ stat(distPath).then((s) => s.mtimeMs),
222
+ newestSourceMtimeMs(join(packageDir, "src")),
223
+ stat(join(packageDir, "package.json")).then((s) => s.mtimeMs)
224
+ ]);
225
+ return Math.max(srcMtime, pkgMtime) > distMtime;
226
+ }
227
+ function outputTail(output) {
228
+ return output.trim().split("\n").slice(-10).join("\n");
229
+ }
230
+
231
+ //#endregion
232
+ export { DepsBuildFailure, ensureFreshDeps, findWorkspaceRoot, isWorkspaceDistStale, localDepsOf };
233
+ //# sourceMappingURL=workspace.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.mjs","names":[],"sources":["../src/workspace.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parse } from \"yaml\";\nimport { run } from \"./utils/run\";\n\nexport interface WorkspaceMember {\n readonly name: string;\n readonly dir: string;\n readonly localDeps: readonly string[];\n}\n\nexport interface WorkspaceRoot {\n readonly dir: string;\n readonly members: readonly WorkspaceMember[];\n}\n\nexport interface DepsReport {\n readonly rebuilt: readonly WorkspaceMember[];\n readonly fresh: readonly WorkspaceMember[];\n}\n\nexport interface DepsBuildFailureEntry {\n readonly member: WorkspaceMember;\n readonly exitCode: number;\n readonly output: string;\n}\n\nexport class DepsBuildFailure extends Error {\n readonly failures: readonly DepsBuildFailureEntry[];\n\n constructor(failures: readonly DepsBuildFailureEntry[]) {\n const detail = failures\n .map(\n (failure) =>\n `${failure.member.name} (exit ${failure.exitCode})\\n${outputTail(failure.output)}`,\n )\n .join(\"\\n\\n\");\n super(`workspace dependency builds failed:\\n${detail}`);\n this.name = \"DepsBuildFailure\";\n this.failures = [...failures];\n }\n}\n\nconst workspaceRootCache = new Map<string, WorkspaceRoot | null>();\n\nexport function clearWorkspaceRootCache(): void {\n workspaceRootCache.clear();\n}\n\nexport function findWorkspaceRoot(startDir: string): WorkspaceRoot | null {\n const key = resolve(startDir);\n const cached = workspaceRootCache.get(key);\n if (cached !== undefined) return cached;\n const found = discoverWorkspaceRoot(key);\n workspaceRootCache.set(key, found);\n return found;\n}\n\nfunction discoverWorkspaceRoot(dir: string): WorkspaceRoot | null {\n let current = dir;\n while (true) {\n const root = readWorkspaceRootAt(current);\n if (root) return root;\n const parent = dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n\nfunction readWorkspaceRootAt(dir: string): WorkspaceRoot | null {\n // v2 (ADR 0026): workspace globs live in pnpm-workspace.yaml. Pre-v2\n // runtimes keep the package.json workspaces fallback.\n const yamlPath = join(dir, \"pnpm-workspace.yaml\");\n if (existsSync(yamlPath)) {\n const doc = parse(readFileSync(yamlPath, \"utf8\")) as { packages?: unknown } | null;\n const globs = workspaceGlobsFromYaml(doc?.packages);\n if (globs) return readWorkspaceMembers(dir, globs);\n }\n\n const manifestPath = join(dir, \"package.json\");\n if (!existsSync(manifestPath)) return null;\n const manifest = readManifest(manifestPath);\n if (!manifest) return null;\n const globs = workspaceGlobs(manifest.workspaces);\n if (!globs) return null;\n\n return readWorkspaceMembers(dir, globs);\n}\n\nfunction workspaceGlobsFromYaml(packages: unknown): string[] | null {\n if (!Array.isArray(packages)) return null;\n const globs = packages.filter((glob): glob is string => typeof glob === \"string\");\n return globs.length > 0 ? globs : null;\n}\n\nfunction readWorkspaceMembers(dir: string, globs: readonly string[]): WorkspaceRoot {\n const memberDirs = matchMemberDirs(dir, globs);\n const drafts: { name: string; dir: string; manifest: Record<string, unknown> }[] = [];\n for (const memberDir of memberDirs) {\n const memberManifest = readManifest(join(memberDir, \"package.json\"));\n if (!memberManifest || typeof memberManifest.name !== \"string\") continue;\n drafts.push({ name: memberManifest.name, dir: memberDir, manifest: memberManifest });\n }\n\n const names = new Set(drafts.map((draft) => draft.name));\n const members = drafts\n .map((draft) => ({\n name: draft.name,\n dir: draft.dir,\n localDeps: declaredDepNames(draft.manifest).filter((dep) => names.has(dep)),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n return { dir, members };\n}\n\nfunction workspaceGlobs(workspaces: unknown): string[] | null {\n if (Array.isArray(workspaces)) {\n return workspaces.filter((glob): glob is string => typeof glob === \"string\");\n }\n if (workspaces && typeof workspaces === \"object\") {\n const packages = (workspaces as { packages?: unknown }).packages;\n if (Array.isArray(packages)) {\n return packages.filter((glob): glob is string => typeof glob === \"string\");\n }\n }\n return null;\n}\n\nfunction matchMemberDirs(rootDir: string, globs: readonly string[]): string[] {\n const found = new Set<string>();\n for (const glob of globs) {\n collectMemberDirs(rootDir, glob.split(\"/\"), found);\n }\n return [...found].sort();\n}\n\nfunction collectMemberDirs(dir: string, segments: readonly string[], out: Set<string>): void {\n const [head, ...rest] = segments;\n if (!head) return;\n let entries: readonly { name: string; isDirectory(): boolean }[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (head !== \"*\" && head !== entry.name) continue;\n const child = join(dir, entry.name);\n if (rest.length === 0) out.add(child);\n else collectMemberDirs(child, rest, out);\n }\n}\n\nfunction readManifest(path: string): Record<string, unknown> | null {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction declaredDepNames(manifest: Record<string, unknown>): string[] {\n const names: string[] = [];\n for (const field of [\"dependencies\", \"devDependencies\"] as const) {\n const deps = manifest[field];\n if (deps && typeof deps === \"object\") {\n names.push(...Object.keys(deps as Record<string, unknown>));\n }\n }\n return names;\n}\n\nexport function localDepsOf(\n root: WorkspaceRoot,\n targetDirs: readonly string[],\n): readonly WorkspaceMember[] {\n const byName = new Map(root.members.map((member) => [member.name, member]));\n const byDir = new Map(root.members.map((member) => [member.dir, member]));\n const ordered: WorkspaceMember[] = [];\n const seen = new Set<string>();\n\n const visit = (member: WorkspaceMember): void => {\n if (seen.has(member.name)) return;\n seen.add(member.name);\n for (const dep of member.localDeps) {\n const depMember = byName.get(dep);\n if (depMember) visit(depMember);\n }\n ordered.push(member);\n };\n\n for (const targetDir of targetDirs) {\n const target = byDir.get(resolve(targetDir));\n if (!target) continue;\n for (const dep of target.localDeps) {\n const depMember = byName.get(dep);\n if (depMember) visit(depMember);\n }\n }\n\n return ordered;\n}\n\nexport async function ensureFreshDeps(\n startDir: string,\n targetDirs: readonly string[],\n opts?: {\n readonly force?: boolean;\n /** Build-mode contract for prerequisite children (ADR 0018): deploy\n * builds run dist-first, so every build child — prerequisite or target —\n * must receive the same env; a bundler-config workspace in the closure\n * resolves differently without it. Callers that pass nothing keep the\n * ambient env (dev-time staleness rebuilds). */\n readonly env?: Record<string, string>;\n },\n): Promise<DepsReport> {\n const root = findWorkspaceRoot(startDir);\n if (!root) return { rebuilt: [], fresh: [] };\n\n const closure = localDepsOf(root, targetDirs);\n const force = opts?.force ?? false;\n const judgements = await Promise.all(\n closure.map(async (member) => force || (await isStaleMember(member))),\n );\n const rebuilt = closure.filter((_, index) => judgements[index]);\n const fresh = closure.filter((_, index) => !judgements[index]);\n\n if (rebuilt.length > 0) {\n const results = await Promise.allSettled(\n rebuilt.map((member) =>\n run(\"pnpm\", [\"run\", \"build\"], {\n cwd: member.dir,\n capture: true,\n env: opts?.env,\n }),\n ),\n );\n const failures = results.flatMap((result, index) => {\n const value = result.status === \"fulfilled\" ? result.value : undefined;\n if (value && value.exitCode === 0) return [];\n const output = value\n ? `${value.stdout}\\n${value.stderr}`\n : result.status === \"rejected\"\n ? String(result.reason)\n : \"\";\n return [\n {\n member: rebuilt[index],\n exitCode: value ? (value.exitCode ?? 1) : 1,\n output,\n },\n ];\n });\n if (failures.length > 0) throw new DepsBuildFailure(failures);\n }\n\n return { rebuilt, fresh };\n}\n\nasync function isStaleMember(member: WorkspaceMember): Promise<boolean> {\n const oracle = distOracle(member.dir);\n if (!oracle) return false;\n return isWorkspaceDistStale(member.dir, oracle);\n}\n\nfunction distOracle(memberDir: string): string | null {\n const manifest = readManifest(join(memberDir, \"package.json\"));\n if (!manifest) return null;\n\n const entry =\n manifest.exports && typeof manifest.exports === \"object\"\n ? (manifest.exports as Record<string, unknown>)[\".\"]\n : undefined;\n if (entry && typeof entry === \"object\") {\n for (const key of [\"import\", \"default\", \"require\", \"types\"] as const) {\n const value = (entry as Record<string, unknown>)[key];\n if (typeof value === \"string\" && !value.startsWith(\"./src\")) return value;\n }\n }\n if (typeof manifest.module === \"string\" && !manifest.module.startsWith(\"./src\")) {\n return manifest.module;\n }\n if (typeof manifest.main === \"string\" && !manifest.main.startsWith(\"./src\")) {\n return manifest.main;\n }\n\n const reportPath = join(memberDir, \"dist\", \"build-report.json\");\n if (existsSync(reportPath)) {\n const report = readManifest(reportPath);\n if (report && typeof report.entry === \"string\" && report.entry) {\n return join(\"dist\", report.entry);\n }\n }\n return null;\n}\n\nasync function newestSourceMtimeMs(dir: string): Promise<number> {\n let newest = 0;\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name === \"node_modules\" || entry.name === \"dist\") continue;\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n newest = Math.max(newest, await newestSourceMtimeMs(fullPath));\n } else {\n newest = Math.max(newest, (await stat(fullPath)).mtimeMs);\n }\n }\n return newest;\n}\n\nexport async function isWorkspaceDistStale(\n packageDir: string,\n distEntry: string,\n): Promise<boolean> {\n const distPath = join(packageDir, distEntry);\n if (!existsSync(distPath)) return true;\n const [distMtime, srcMtime, pkgMtime] = await Promise.all([\n stat(distPath).then((s) => s.mtimeMs),\n newestSourceMtimeMs(join(packageDir, \"src\")),\n stat(join(packageDir, \"package.json\")).then((s) => s.mtimeMs),\n ]);\n return Math.max(srcMtime, pkgMtime) > distMtime;\n}\n\nfunction outputTail(output: string): string {\n const lines = output.trim().split(\"\\n\");\n return lines.slice(-10).join(\"\\n\");\n}\n"],"mappings":"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"}