@baseplate-dev/project-builder-server 0.5.3 → 0.6.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 (245) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/dist/actions/__tests__/action-test-utils.d.ts +24 -0
  3. package/dist/actions/__tests__/action-test-utils.d.ts.map +1 -0
  4. package/dist/actions/__tests__/action-test-utils.js +33 -0
  5. package/dist/actions/__tests__/action-test-utils.js.map +1 -0
  6. package/dist/actions/definition/commit-draft.action.d.ts +16 -0
  7. package/dist/actions/definition/commit-draft.action.d.ts.map +1 -0
  8. package/dist/actions/definition/commit-draft.action.js +65 -0
  9. package/dist/actions/definition/commit-draft.action.js.map +1 -0
  10. package/dist/actions/definition/discard-draft.action.d.ts +7 -0
  11. package/dist/actions/definition/discard-draft.action.d.ts.map +1 -0
  12. package/dist/actions/definition/discard-draft.action.js +30 -0
  13. package/dist/actions/definition/discard-draft.action.js.map +1 -0
  14. package/dist/actions/definition/draft-session.d.ts +41 -0
  15. package/dist/actions/definition/draft-session.d.ts.map +1 -0
  16. package/dist/actions/definition/draft-session.js +117 -0
  17. package/dist/actions/definition/draft-session.js.map +1 -0
  18. package/dist/actions/definition/get-entity-schema.action.d.ts +10 -0
  19. package/dist/actions/definition/get-entity-schema.action.d.ts.map +1 -0
  20. package/dist/actions/definition/get-entity-schema.action.js +48 -0
  21. package/dist/actions/definition/get-entity-schema.action.js.map +1 -0
  22. package/dist/actions/definition/get-entity.action.d.ts +8 -0
  23. package/dist/actions/definition/get-entity.action.d.ts.map +1 -0
  24. package/dist/actions/definition/get-entity.action.js +37 -0
  25. package/dist/actions/definition/get-entity.action.js.map +1 -0
  26. package/dist/actions/definition/index.d.ts +11 -0
  27. package/dist/actions/definition/index.d.ts.map +1 -0
  28. package/dist/actions/definition/index.js +11 -0
  29. package/dist/actions/definition/index.js.map +1 -0
  30. package/dist/actions/definition/list-entities.action.d.ts +13 -0
  31. package/dist/actions/definition/list-entities.action.d.ts.map +1 -0
  32. package/dist/actions/definition/list-entities.action.js +43 -0
  33. package/dist/actions/definition/list-entities.action.js.map +1 -0
  34. package/dist/actions/definition/list-entity-types.action.d.ts +10 -0
  35. package/dist/actions/definition/list-entity-types.action.d.ts.map +1 -0
  36. package/dist/actions/definition/list-entity-types.action.js +42 -0
  37. package/dist/actions/definition/list-entity-types.action.js.map +1 -0
  38. package/dist/actions/definition/load-entity-service-context.d.ts +14 -0
  39. package/dist/actions/definition/load-entity-service-context.d.ts.map +1 -0
  40. package/dist/actions/definition/load-entity-service-context.js +18 -0
  41. package/dist/actions/definition/load-entity-service-context.js.map +1 -0
  42. package/dist/actions/definition/show-draft.action.d.ts +18 -0
  43. package/dist/actions/definition/show-draft.action.d.ts.map +1 -0
  44. package/dist/actions/definition/show-draft.action.js +117 -0
  45. package/dist/actions/definition/show-draft.action.js.map +1 -0
  46. package/dist/actions/definition/stage-create-entity.action.d.ts +19 -0
  47. package/dist/actions/definition/stage-create-entity.action.d.ts.map +1 -0
  48. package/dist/actions/definition/stage-create-entity.action.js +60 -0
  49. package/dist/actions/definition/stage-create-entity.action.js.map +1 -0
  50. package/dist/actions/definition/stage-delete-entity.action.d.ts +18 -0
  51. package/dist/actions/definition/stage-delete-entity.action.d.ts.map +1 -0
  52. package/dist/actions/definition/stage-delete-entity.action.js +55 -0
  53. package/dist/actions/definition/stage-delete-entity.action.js.map +1 -0
  54. package/dist/actions/definition/stage-update-entity.action.d.ts +19 -0
  55. package/dist/actions/definition/stage-update-entity.action.d.ts.map +1 -0
  56. package/dist/actions/definition/stage-update-entity.action.js +59 -0
  57. package/dist/actions/definition/stage-update-entity.action.js.map +1 -0
  58. package/dist/actions/definition/validate-draft.d.ts +17 -0
  59. package/dist/actions/definition/validate-draft.d.ts.map +1 -0
  60. package/dist/actions/definition/validate-draft.js +25 -0
  61. package/dist/actions/definition/validate-draft.js.map +1 -0
  62. package/dist/actions/index.d.ts +4 -0
  63. package/dist/actions/index.d.ts.map +1 -1
  64. package/dist/actions/index.js +4 -0
  65. package/dist/actions/index.js.map +1 -1
  66. package/dist/actions/registry.d.ts +169 -92
  67. package/dist/actions/registry.d.ts.map +1 -1
  68. package/dist/actions/registry.js +17 -1
  69. package/dist/actions/registry.js.map +1 -1
  70. package/dist/actions/snapshot/snapshot-add.action.d.ts +0 -1
  71. package/dist/actions/snapshot/snapshot-add.action.d.ts.map +1 -1
  72. package/dist/actions/snapshot/snapshot-add.action.js +3 -7
  73. package/dist/actions/snapshot/snapshot-add.action.js.map +1 -1
  74. package/dist/actions/snapshot/snapshot-remove.action.d.ts +0 -1
  75. package/dist/actions/snapshot/snapshot-remove.action.d.ts.map +1 -1
  76. package/dist/actions/snapshot/snapshot-remove.action.js +3 -7
  77. package/dist/actions/snapshot/snapshot-remove.action.js.map +1 -1
  78. package/dist/actions/snapshot/snapshot-save.action.d.ts +2 -2
  79. package/dist/actions/snapshot/snapshot-save.action.d.ts.map +1 -1
  80. package/dist/actions/snapshot/snapshot-save.action.js +23 -11
  81. package/dist/actions/snapshot/snapshot-save.action.js.map +1 -1
  82. package/dist/actions/snapshot/snapshot-show.action.d.ts +5 -2
  83. package/dist/actions/snapshot/snapshot-show.action.d.ts.map +1 -1
  84. package/dist/actions/snapshot/snapshot-show.action.js +17 -19
  85. package/dist/actions/snapshot/snapshot-show.action.js.map +1 -1
  86. package/dist/actions/sync/sync-all-projects.action.d.ts.map +1 -1
  87. package/dist/actions/sync/sync-all-projects.action.js +3 -2
  88. package/dist/actions/sync/sync-all-projects.action.js.map +1 -1
  89. package/dist/actions/sync/sync-file.action.js +1 -1
  90. package/dist/actions/sync/sync-file.action.js.map +1 -1
  91. package/dist/actions/sync/sync-project.action.d.ts +1 -1
  92. package/dist/actions/sync/sync-project.action.d.ts.map +1 -1
  93. package/dist/actions/sync/sync-project.action.js +20 -6
  94. package/dist/actions/sync/sync-project.action.js.map +1 -1
  95. package/dist/actions/template-extractor/delete-template-by-name.action.d.ts +13 -0
  96. package/dist/actions/template-extractor/delete-template-by-name.action.d.ts.map +1 -0
  97. package/dist/actions/template-extractor/delete-template-by-name.action.js +46 -0
  98. package/dist/actions/template-extractor/delete-template-by-name.action.js.map +1 -0
  99. package/dist/actions/template-extractor/index.d.ts +1 -0
  100. package/dist/actions/template-extractor/index.d.ts.map +1 -1
  101. package/dist/actions/template-extractor/index.js +1 -0
  102. package/dist/actions/template-extractor/index.js.map +1 -1
  103. package/dist/actions/test-project/index.d.ts +2 -0
  104. package/dist/actions/test-project/index.d.ts.map +1 -0
  105. package/dist/actions/test-project/index.js +2 -0
  106. package/dist/actions/test-project/index.js.map +1 -0
  107. package/dist/actions/test-project/test-project-init.action.d.ts +17 -0
  108. package/dist/actions/test-project/test-project-init.action.d.ts.map +1 -0
  109. package/dist/actions/test-project/test-project-init.action.js +97 -0
  110. package/dist/actions/test-project/test-project-init.action.js.map +1 -0
  111. package/dist/actions/types.d.ts +2 -0
  112. package/dist/actions/types.d.ts.map +1 -1
  113. package/dist/actions/types.js.map +1 -1
  114. package/dist/actions/utils/generation-manifest.d.ts +12 -0
  115. package/dist/actions/utils/generation-manifest.d.ts.map +1 -0
  116. package/dist/actions/utils/generation-manifest.js +142 -0
  117. package/dist/actions/utils/generation-manifest.js.map +1 -0
  118. package/dist/actions/utils/index.d.ts +1 -1
  119. package/dist/actions/utils/index.d.ts.map +1 -1
  120. package/dist/actions/utils/index.js +1 -1
  121. package/dist/actions/utils/index.js.map +1 -1
  122. package/dist/actions/utils/project-discovery.d.ts +23 -9
  123. package/dist/actions/utils/project-discovery.d.ts.map +1 -1
  124. package/dist/actions/utils/project-discovery.js +57 -31
  125. package/dist/actions/utils/project-discovery.js.map +1 -1
  126. package/dist/actions/utils/projects.d.ts.map +1 -1
  127. package/dist/actions/utils/projects.js +2 -1
  128. package/dist/actions/utils/projects.js.map +1 -1
  129. package/dist/compiler/backend/{authorizers.d.ts → authorizer-compiler.d.ts} +22 -2
  130. package/dist/compiler/backend/authorizer-compiler.d.ts.map +1 -0
  131. package/dist/compiler/backend/authorizer-compiler.js +165 -0
  132. package/dist/compiler/backend/authorizer-compiler.js.map +1 -0
  133. package/dist/compiler/backend/feature.d.ts.map +1 -1
  134. package/dist/compiler/backend/feature.js +3 -1
  135. package/dist/compiler/backend/feature.js.map +1 -1
  136. package/dist/compiler/backend/graphql.d.ts.map +1 -1
  137. package/dist/compiler/backend/graphql.js +115 -49
  138. package/dist/compiler/backend/graphql.js.map +1 -1
  139. package/dist/compiler/backend/models.d.ts.map +1 -1
  140. package/dist/compiler/backend/models.js +13 -13
  141. package/dist/compiler/backend/models.js.map +1 -1
  142. package/dist/compiler/backend/query-filter-compiler.d.ts +40 -0
  143. package/dist/compiler/backend/query-filter-compiler.d.ts.map +1 -0
  144. package/dist/compiler/backend/query-filter-compiler.js +168 -0
  145. package/dist/compiler/backend/query-filter-compiler.js.map +1 -0
  146. package/dist/compiler/backend/services.d.ts.map +1 -1
  147. package/dist/compiler/backend/services.js +24 -1
  148. package/dist/compiler/backend/services.js.map +1 -1
  149. package/dist/compiler/index.d.ts +1 -0
  150. package/dist/compiler/index.d.ts.map +1 -1
  151. package/dist/compiler/index.js.map +1 -1
  152. package/dist/compiler/root/root-package-compiler.js +6 -6
  153. package/dist/compiler/root/root-package-compiler.js.map +1 -1
  154. package/dist/compiler/web/admin/crud/index.js +1 -1
  155. package/dist/compiler/web/admin/crud/index.js.map +1 -1
  156. package/dist/compiler/web/admin/index.js +1 -1
  157. package/dist/compiler/web/admin/index.js.map +1 -1
  158. package/dist/compiler/web/admin/sections.d.ts.map +1 -1
  159. package/dist/compiler/web/admin/sections.js +2 -2
  160. package/dist/compiler/web/admin/sections.js.map +1 -1
  161. package/dist/compiler/web/web-compiler.d.ts.map +1 -1
  162. package/dist/compiler/web/web-compiler.js +4 -4
  163. package/dist/compiler/web/web-compiler.js.map +1 -1
  164. package/dist/core-modules/admin-crud-column-compiler.js +1 -1
  165. package/dist/core-modules/admin-crud-column-compiler.js.map +1 -1
  166. package/dist/core-modules/admin-crud-input-compiler.d.ts.map +1 -1
  167. package/dist/core-modules/admin-crud-input-compiler.js +13 -3
  168. package/dist/core-modules/admin-crud-input-compiler.js.map +1 -1
  169. package/dist/dev-server/api/router.d.ts +8 -7
  170. package/dist/dev-server/api/router.d.ts.map +1 -1
  171. package/dist/dev-server/mcp/stdio.d.ts +2 -2
  172. package/dist/dev-server/mcp/stdio.d.ts.map +1 -1
  173. package/dist/dev-server/mcp/stdio.js +2 -2
  174. package/dist/dev-server/mcp/stdio.js.map +1 -1
  175. package/dist/diff/diff-project.d.ts.map +1 -1
  176. package/dist/diff/diff-project.js +4 -4
  177. package/dist/diff/diff-project.js.map +1 -1
  178. package/dist/diff/snapshot/apply-diff-to-generator-output.d.ts.map +1 -1
  179. package/dist/diff/snapshot/apply-diff-to-generator-output.js +17 -2
  180. package/dist/diff/snapshot/apply-diff-to-generator-output.js.map +1 -1
  181. package/dist/diff/snapshot/create-snapshot-for-project.d.ts +12 -6
  182. package/dist/diff/snapshot/create-snapshot-for-project.d.ts.map +1 -1
  183. package/dist/diff/snapshot/create-snapshot-for-project.js +58 -26
  184. package/dist/diff/snapshot/create-snapshot-for-project.js.map +1 -1
  185. package/dist/diff/snapshot/index.d.ts +4 -1
  186. package/dist/diff/snapshot/index.d.ts.map +1 -1
  187. package/dist/diff/snapshot/index.js +4 -0
  188. package/dist/diff/snapshot/index.js.map +1 -1
  189. package/dist/diff/snapshot/save-snapshot.d.ts +11 -3
  190. package/dist/diff/snapshot/save-snapshot.d.ts.map +1 -1
  191. package/dist/diff/snapshot/save-snapshot.js +29 -10
  192. package/dist/diff/snapshot/save-snapshot.js.map +1 -1
  193. package/dist/diff/snapshot/snapshot-management.d.ts +7 -6
  194. package/dist/diff/snapshot/snapshot-management.d.ts.map +1 -1
  195. package/dist/diff/snapshot/snapshot-management.js +18 -22
  196. package/dist/diff/snapshot/snapshot-management.js.map +1 -1
  197. package/dist/diff/snapshot/snapshot-manifest.d.ts +1 -1
  198. package/dist/diff/snapshot/snapshot-manifest.d.ts.map +1 -1
  199. package/dist/diff/snapshot/snapshot-manifest.js +7 -7
  200. package/dist/diff/snapshot/snapshot-manifest.js.map +1 -1
  201. package/dist/diff/snapshot/snapshot-types.d.ts +22 -8
  202. package/dist/diff/snapshot/snapshot-types.d.ts.map +1 -1
  203. package/dist/diff/snapshot/snapshot-types.js +6 -2
  204. package/dist/diff/snapshot/snapshot-types.js.map +1 -1
  205. package/dist/diff/snapshot/snapshot-utils.d.ts +14 -5
  206. package/dist/diff/snapshot/snapshot-utils.d.ts.map +1 -1
  207. package/dist/diff/snapshot/snapshot-utils.js +25 -8
  208. package/dist/diff/snapshot/snapshot-utils.js.map +1 -1
  209. package/dist/index.d.ts +1 -0
  210. package/dist/index.js +1 -0
  211. package/dist/plugins/node-plugin-store.d.ts +1 -1
  212. package/dist/plugins/node-plugin-store.d.ts.map +1 -1
  213. package/dist/plugins/node-plugin-store.js +2 -2
  214. package/dist/plugins/node-plugin-store.js.map +1 -1
  215. package/dist/project-definition/load-project-definition.d.ts +2 -2
  216. package/dist/project-definition/load-project-definition.d.ts.map +1 -1
  217. package/dist/project-definition/load-project-definition.js +3 -3
  218. package/dist/project-definition/load-project-definition.js.map +1 -1
  219. package/dist/sync/generate-for-directory.d.ts +3 -2
  220. package/dist/sync/generate-for-directory.d.ts.map +1 -1
  221. package/dist/sync/generate-for-directory.js +24 -11
  222. package/dist/sync/generate-for-directory.js.map +1 -1
  223. package/dist/sync/sync-project.d.ts +3 -3
  224. package/dist/sync/sync-project.d.ts.map +1 -1
  225. package/dist/sync/sync-project.js +9 -3
  226. package/dist/sync/sync-project.js.map +1 -1
  227. package/dist/templates/create/create-generator.d.ts.map +1 -1
  228. package/dist/templates/create/create-generator.js +3 -3
  229. package/dist/templates/create/create-generator.js.map +1 -1
  230. package/dist/user-config/user-config-schema.d.ts +12 -0
  231. package/dist/user-config/user-config-schema.d.ts.map +1 -1
  232. package/dist/user-config/user-config-schema.js +29 -0
  233. package/dist/user-config/user-config-schema.js.map +1 -1
  234. package/package.json +17 -14
  235. package/dist/actions/utils/is-example-project.d.ts +0 -7
  236. package/dist/actions/utils/is-example-project.d.ts.map +0 -1
  237. package/dist/actions/utils/is-example-project.js +0 -22
  238. package/dist/actions/utils/is-example-project.js.map +0 -1
  239. package/dist/compiler/backend/authorizers.d.ts.map +0 -1
  240. package/dist/compiler/backend/authorizers.js +0 -75
  241. package/dist/compiler/backend/authorizers.js.map +0 -1
  242. package/dist/project-definition/get-single-app-directory-for-project.d.ts +0 -11
  243. package/dist/project-definition/get-single-app-directory-for-project.d.ts.map +0 -1
  244. package/dist/project-definition/get-single-app-directory-for-project.js +0 -19
  245. package/dist/project-definition/get-single-app-directory-for-project.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,74 @@
1
1
  # @baseplate-dev/project-builder-server
2
2
 
3
+ ## 0.6.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#806](https://github.com/halfdomelabs/baseplate/pull/806) [`0b973f3`](https://github.com/halfdomelabs/baseplate/commit/0b973f3b9cb03fa1c49ceb49839b210466ecbbc7) Thanks [@kingston](https://github.com/kingston)! - Add bypass roles support to query filters for global role handling
8
+
9
+ - Updated dependencies [[`c371612`](https://github.com/halfdomelabs/baseplate/commit/c37161281c660a799a2a74537cd751fd58f3b05f), [`0b973f3`](https://github.com/halfdomelabs/baseplate/commit/0b973f3b9cb03fa1c49ceb49839b210466ecbbc7)]:
10
+ - @baseplate-dev/fastify-generators@0.6.1
11
+ - @baseplate-dev/core-generators@0.6.1
12
+ - @baseplate-dev/project-builder-lib@0.6.1
13
+ - @baseplate-dev/react-generators@0.6.1
14
+ - @baseplate-dev/sync@0.6.1
15
+ - @baseplate-dev/utils@0.6.1
16
+
17
+ ## 0.6.0
18
+
19
+ ### Patch Changes
20
+
21
+ - [#783](https://github.com/halfdomelabs/baseplate/pull/783) [`bd1095e`](https://github.com/halfdomelabs/baseplate/commit/bd1095e52dc3cecdb40bf84a906490a7c92fec40) Thanks [@kingston](https://github.com/kingston)! - Add offset pagination (skip/take) to list queries and optional count query generation
22
+
23
+ - [#782](https://github.com/halfdomelabs/baseplate/pull/782) [`a136dc9`](https://github.com/halfdomelabs/baseplate/commit/a136dc90ba12783e059fd3c8a067d1b5496ed3ce) Thanks [@kingston](https://github.com/kingston)! - Extract developer tooling into new `@baseplate-dev/project-builder-dev` package with `baseplate-dev` binary.
24
+ - `project-builder-dev` includes: `templates`, `snapshot`, `dev-server`, `sync-examples` commands, plus full MCP server (all actions)
25
+ - `project-builder-cli` retains end-user commands only: `sync`, `diff`, `serve`, `config`, `projects`, and a user-scoped MCP server (sync/diff actions only)
26
+ - `project-builder-server` exports new `USER_SERVICE_ACTIONS` for the subset of actions exposed to end-users via MCP
27
+ - Plugins auto-discovered from CWD's `package.json` — no `project-builder-common` dependency in `project-builder-dev`
28
+ - `generateProject(dir)` exported from `project-builder-dev` for programmatic project generation in tests
29
+
30
+ - [#802](https://github.com/halfdomelabs/baseplate/pull/802) [`801c706`](https://github.com/halfdomelabs/baseplate/commit/801c7066f7e943c026f03e71b8d39242036e0cad) Thanks [@kingston](https://github.com/kingston)! - Update prettier to ignore unchanged files in output
31
+
32
+ - [#802](https://github.com/halfdomelabs/baseplate/pull/802) [`801c706`](https://github.com/halfdomelabs/baseplate/commit/801c7066f7e943c026f03e71b8d39242036e0cad) Thanks [@kingston](https://github.com/kingston)! - Add `isAuthenticated` boolean to authorizer expression DSL and AuthContext. Warn when `hasRole('user')` is used, suggesting `isAuthenticated` instead.
33
+
34
+ - [#798](https://github.com/halfdomelabs/baseplate/pull/798) [`ee7ee0e`](https://github.com/halfdomelabs/baseplate/commit/ee7ee0e552090612190eb4446a52c30f4eefce6a) Thanks [@kingston](https://github.com/kingston)! - Add MCP actions for reading and writing project definition entities, including draft session support for staging changes before committing.
35
+
36
+ - [#802](https://github.com/halfdomelabs/baseplate/pull/802) [`801c706`](https://github.com/halfdomelabs/baseplate/commit/801c7066f7e943c026f03e71b8d39242036e0cad) Thanks [@kingston](https://github.com/kingston)! - Add nested authorizer expressions: `hasRole(model.relation, 'role')` and `hasSomeRole(model.relation, ['role1', 'role2'])` for checking roles on related model authorizers, with autocomplete and linter support.
37
+
38
+ - [#777](https://github.com/halfdomelabs/baseplate/pull/777) [`dc238be`](https://github.com/halfdomelabs/baseplate/commit/dc238be00158a528a60d9e6ef9cec32b2d8297be) Thanks [@kingston](https://github.com/kingston)! - Add per-field authorization support for GraphQL object type fields
39
+
40
+ - [#796](https://github.com/halfdomelabs/baseplate/pull/796) [`8258b27`](https://github.com/halfdomelabs/baseplate/commit/8258b278e9a25a6e4bd5039a134238d071a63ecd) Thanks [@kingston](https://github.com/kingston)! - Add query filter code generation for instance-level authorization on GraphQL queries
41
+
42
+ - [#793](https://github.com/halfdomelabs/baseplate/pull/793) [`6e2675d`](https://github.com/halfdomelabs/baseplate/commit/6e2675d2166ac9bf470486efdc6a0e48df9bcc6d) Thanks [@kingston](https://github.com/kingston)! - Move mutation authorization from GraphQL-level to service-level, add compact grid-based role picker UI, filter system role from auth pickers, and hide disabled service methods from GraphQL mutations section
43
+
44
+ - [#789](https://github.com/halfdomelabs/baseplate/pull/789) [`2f860c5`](https://github.com/halfdomelabs/baseplate/commit/2f860c513a1caf95fdfd0729cf548990166f9a6f) Thanks [@kingston](https://github.com/kingston)! - Unify test and example project discovery under a single system:
45
+ - Add `type: 'user' | 'example' | 'test'` and `baseplateDirectory` to `ProjectInfo`, replacing `isInternalExample`.
46
+ - Add `baseplate.config.json` for deterministic project discovery — replaces `isExampleProject` heuristic and `EXCLUDE_EXAMPLES`/`PLUGIN_ROOT_DIRECTORIES` env vars.
47
+ - Unify `discoverProjects` to accept structured options by project type — removes `discoverTestProjects` and duplicate `project-resolver.ts`.
48
+ - Test projects live in `tests/<name>/` with output to `.output/` (gitignored).
49
+ - Replace `test-project` subcommands with `baseplate-dev init <name> --type example|test` and `baseplate-dev run-env <test-name>`.
50
+
51
+ - [#800](https://github.com/halfdomelabs/baseplate/pull/800) [`83c713b`](https://github.com/halfdomelabs/baseplate/commit/83c713b075eca2abc946e74bf3f03e515e601eba) Thanks [@kingston](https://github.com/kingston)! - Upgrade fastify and related packages
52
+ - fastify: 5.7.4 → 5.8.1 (includes security fix CVE-2026-3419)
53
+ - @fastify/helmet: 13.0.0 → 13.0.2
54
+ - @fastify/websocket: 11.0.1 → 11.2.0
55
+ - @fastify/request-context: 6.0.1 → 6.2.1
56
+ - @fastify/formbody: 8.0.1 → 8.0.2
57
+ - @fastify/cookie: 11.0.1 → 11.0.2
58
+ - altair-fastify-plugin: 8.0.4 → 8.5.1
59
+
60
+ - [#785](https://github.com/halfdomelabs/baseplate/pull/785) [`bd25ff0`](https://github.com/halfdomelabs/baseplate/commit/bd25ff08e71faeb97b560e7b349dba1967155704) Thanks [@kingston](https://github.com/kingston)! - Remove redundant `.optional()` wrapper from `withDefault`
61
+
62
+ `withDefault` previously wrapped the schema in both `.prefault()` and `.optional()`. Since `.prefault()` already makes fields accept absent/undefined input, the `.optional()` was redundant and caused the output type to incorrectly include `| undefined` for defaulted fields.
63
+
64
+ - Updated dependencies [[`ee7ee0e`](https://github.com/halfdomelabs/baseplate/commit/ee7ee0e552090612190eb4446a52c30f4eefce6a), [`bd1095e`](https://github.com/halfdomelabs/baseplate/commit/bd1095e52dc3cecdb40bf84a906490a7c92fec40), [`801c706`](https://github.com/halfdomelabs/baseplate/commit/801c7066f7e943c026f03e71b8d39242036e0cad), [`1225fda`](https://github.com/halfdomelabs/baseplate/commit/1225fdace3e8da20152e0e78c4decf0c063faa56), [`3029d42`](https://github.com/halfdomelabs/baseplate/commit/3029d42f5d5967721f2b0d5892ea07a80c5f3a1f), [`dfa9638`](https://github.com/halfdomelabs/baseplate/commit/dfa963825c4ba847f9d21f4f014c4dd1722403d6), [`d6be7a9`](https://github.com/halfdomelabs/baseplate/commit/d6be7a97b5e6970be674bf9b49eddf1499b51f04), [`3b3be2b`](https://github.com/halfdomelabs/baseplate/commit/3b3be2b8d45b08552dca3d4e2b5ce391a958341b), [`eadad84`](https://github.com/halfdomelabs/baseplate/commit/eadad8494128ded2cbc76dfbe3b97f93769ea41f), [`801c706`](https://github.com/halfdomelabs/baseplate/commit/801c7066f7e943c026f03e71b8d39242036e0cad), [`ee7ee0e`](https://github.com/halfdomelabs/baseplate/commit/ee7ee0e552090612190eb4446a52c30f4eefce6a), [`801c706`](https://github.com/halfdomelabs/baseplate/commit/801c7066f7e943c026f03e71b8d39242036e0cad), [`dc238be`](https://github.com/halfdomelabs/baseplate/commit/dc238be00158a528a60d9e6ef9cec32b2d8297be), [`bd25ff0`](https://github.com/halfdomelabs/baseplate/commit/bd25ff08e71faeb97b560e7b349dba1967155704), [`8258b27`](https://github.com/halfdomelabs/baseplate/commit/8258b278e9a25a6e4bd5039a134238d071a63ecd), [`6e2675d`](https://github.com/halfdomelabs/baseplate/commit/6e2675d2166ac9bf470486efdc6a0e48df9bcc6d), [`634f6c5`](https://github.com/halfdomelabs/baseplate/commit/634f6c5aaffab982a985be9f85062de9d1e8a99b), [`2f860c5`](https://github.com/halfdomelabs/baseplate/commit/2f860c513a1caf95fdfd0729cf548990166f9a6f), [`cad5352`](https://github.com/halfdomelabs/baseplate/commit/cad535239b47080e30f894383cc330e37213a76c), [`83c713b`](https://github.com/halfdomelabs/baseplate/commit/83c713b075eca2abc946e74bf3f03e515e601eba), [`78315cc`](https://github.com/halfdomelabs/baseplate/commit/78315ccd9b0b0330cd2d08584c6d5ec516d641e3), [`2104145`](https://github.com/halfdomelabs/baseplate/commit/210414588d8b1f6816c45054be3b7eea5763b5ce), [`bd25ff0`](https://github.com/halfdomelabs/baseplate/commit/bd25ff08e71faeb97b560e7b349dba1967155704), [`cad5352`](https://github.com/halfdomelabs/baseplate/commit/cad535239b47080e30f894383cc330e37213a76c)]:
65
+ - @baseplate-dev/utils@0.6.0
66
+ - @baseplate-dev/project-builder-lib@0.6.0
67
+ - @baseplate-dev/fastify-generators@0.6.0
68
+ - @baseplate-dev/react-generators@0.6.0
69
+ - @baseplate-dev/core-generators@0.6.0
70
+ - @baseplate-dev/sync@0.6.0
71
+
3
72
  ## 0.5.3
4
73
 
5
74
  ### Patch Changes
@@ -0,0 +1,24 @@
1
+ import type { ProjectDefinitionInput, SchemaParserContext } from '@baseplate-dev/project-builder-lib';
2
+ import type { ServiceActionContext } from '#src/actions/types.js';
3
+ import type { EntityServiceContextResult } from '../definition/load-entity-service-context.js';
4
+ /**
5
+ * Creates a minimal ServiceActionContext for testing.
6
+ *
7
+ * @param overrides - Partial overrides for context properties.
8
+ * @returns A ServiceActionContext with sensible test defaults.
9
+ */
10
+ export declare function createTestActionContext(overrides?: Partial<ServiceActionContext>): ServiceActionContext;
11
+ /**
12
+ * Creates a test EntityServiceContext from a partial project definition input.
13
+ *
14
+ * Uses `createTestProjectDefinitionContainer` to build the container in-memory,
15
+ * then converts it to an EntityServiceContext. No file I/O required.
16
+ *
17
+ * @param input - Partial ProjectDefinitionInput to customise the test definition.
18
+ * @returns An EntityServiceContextResult matching the shape returned by `loadEntityServiceContext`.
19
+ */
20
+ export interface TestEntityServiceContextResult extends EntityServiceContextResult {
21
+ parserContext: SchemaParserContext;
22
+ }
23
+ export declare function createTestEntityServiceContext(input?: Partial<ProjectDefinitionInput>): TestEntityServiceContextResult;
24
+ //# sourceMappingURL=action-test-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-test-utils.d.ts","sourceRoot":"","sources":["../../../src/actions/__tests__/action-test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,oCAAoC,CAAC;AAK5C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAE/F;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,GAAE,OAAO,CAAC,oBAAoB,CAAM,GAC5C,oBAAoB,CAkBtB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,8BAA+B,SAAQ,0BAA0B;IAChF,aAAa,EAAE,mBAAmB,CAAC;CACpC;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,GAAE,OAAO,CAAC,sBAAsB,CAAM,GAC1C,8BAA8B,CAIhC"}
@@ -0,0 +1,33 @@
1
+ import { createTestProjectDefinitionContainer } from '@baseplate-dev/project-builder-lib/testing';
2
+ import { createConsoleLogger } from '@baseplate-dev/sync';
3
+ /**
4
+ * Creates a minimal ServiceActionContext for testing.
5
+ *
6
+ * @param overrides - Partial overrides for context properties.
7
+ * @returns A ServiceActionContext with sensible test defaults.
8
+ */
9
+ export function createTestActionContext(overrides = {}) {
10
+ return {
11
+ projects: [
12
+ {
13
+ id: 'test-project',
14
+ name: 'test-project',
15
+ directory: '/test-project',
16
+ baseplateDirectory: '/test-project/baseplate',
17
+ type: 'user',
18
+ },
19
+ ],
20
+ plugins: [],
21
+ userConfig: {},
22
+ logger: createConsoleLogger('warn'),
23
+ cliVersion: '0.0.0-test',
24
+ sessionId: 'default',
25
+ ...overrides,
26
+ };
27
+ }
28
+ export function createTestEntityServiceContext(input = {}) {
29
+ const container = createTestProjectDefinitionContainer(input);
30
+ const entityContext = container.toEntityServiceContext();
31
+ return { entityContext, container, parserContext: container.parserContext };
32
+ }
33
+ //# sourceMappingURL=action-test-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-test-utils.js","sourceRoot":"","sources":["../../../src/actions/__tests__/action-test-utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oCAAoC,EAAE,MAAM,4CAA4C,CAAC;AAClG,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAM1D;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAA2C,EAAE;IAE7C,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,EAAE,EAAE,cAAc;gBAClB,IAAI,EAAE,cAAc;gBACpB,SAAS,EAAE,eAAe;gBAC1B,kBAAkB,EAAE,yBAAyB;gBAC7C,IAAI,EAAE,MAAM;aACb;SACF;QACD,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,EAAE;QACd,MAAM,EAAE,mBAAmB,CAAC,MAAM,CAAC;QACnC,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE,SAAS;QACpB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAeD,MAAM,UAAU,8BAA8B,CAC5C,QAAyC,EAAE;IAE3C,MAAM,SAAS,GAAG,oCAAoC,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,SAAS,CAAC,sBAAsB,EAAE,CAAC;IACzD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ export declare const commitDraftAction: import("#src/actions/types.js").ServiceAction<z.ZodObject<{
3
+ project: z.ZodString;
4
+ }, z.core.$strip>, z.ZodObject<{
5
+ message: z.ZodString;
6
+ issues: z.ZodOptional<z.ZodArray<z.ZodObject<{
7
+ message: z.ZodString;
8
+ entityId: z.ZodOptional<z.ZodString>;
9
+ path: z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
10
+ severity: z.ZodEnum<{
11
+ error: "error";
12
+ warning: "warning";
13
+ }>;
14
+ }, z.core.$strip>>>;
15
+ }, z.core.$strip>>;
16
+ //# sourceMappingURL=commit-draft.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-draft.action.d.ts","sourceRoot":"","sources":["../../../src/actions/definition/commit-draft.action.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0BxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;kBAkE5B,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { collectDefinitionIssues, ProjectDefinitionContainer, } from '@baseplate-dev/project-builder-lib';
2
+ import { writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { z } from 'zod';
5
+ import { createServiceAction } from '#src/actions/types.js';
6
+ import { resolveBaseplateDir } from '#src/diff/snapshot/snapshot-utils.js';
7
+ import { createNodeSchemaParserContext } from '#src/plugins/node-plugin-store.js';
8
+ import { getProjectByNameOrId } from '../utils/projects.js';
9
+ import { deleteDraftSession, loadDefinitionHash, loadDraftSession, } from './draft-session.js';
10
+ import { definitionIssueSchema } from './validate-draft.js';
11
+ const commitDraftInputSchema = z.object({
12
+ project: z.string().describe('The name or ID of the project.'),
13
+ });
14
+ const commitDraftOutputSchema = z.object({
15
+ message: z.string().describe('A summary of the commit result.'),
16
+ issues: z
17
+ .array(definitionIssueSchema)
18
+ .optional()
19
+ .describe('Definition issues that blocked the commit.'),
20
+ });
21
+ export const commitDraftAction = createServiceAction({
22
+ name: 'commit-draft',
23
+ title: 'Commit Draft',
24
+ description: 'Commit the staged draft changes to the project-definition.json file.',
25
+ inputSchema: commitDraftInputSchema,
26
+ outputSchema: commitDraftOutputSchema,
27
+ handler: async (input, context) => {
28
+ const project = getProjectByNameOrId(context.projects, input.project);
29
+ const session = await loadDraftSession(project.directory);
30
+ if (!session) {
31
+ throw new Error('No draft session found. Stage changes first with stage-create-entity, stage-update-entity, or stage-delete-entity.');
32
+ }
33
+ // Verify the definition hasn't changed since the draft was created
34
+ const currentHash = await loadDefinitionHash(project.directory);
35
+ if (currentHash !== session.definitionHash) {
36
+ throw new Error('The project definition has changed since the draft was created. ' +
37
+ 'Discard the draft with discard-draft and start over.');
38
+ }
39
+ // Convert the serialized draft back to a proper definition and serialize it
40
+ const parserContext = await createNodeSchemaParserContext(project, context.logger, context.plugins, context.cliVersion);
41
+ const container = ProjectDefinitionContainer.fromSerializedConfig(session.draftDefinition, parserContext);
42
+ // Validate the draft definition before committing
43
+ const issues = collectDefinitionIssues(container);
44
+ if (issues.length > 0) {
45
+ const messages = issues
46
+ .map((i) => `[${i.severity}] ${i.message}`)
47
+ .join('; ');
48
+ throw new Error(`Commit blocked by definition issues: ${messages}`);
49
+ }
50
+ const serializedContents = container.toSerializedContents();
51
+ // Write to project-definition.json
52
+ const baseplateDir = resolveBaseplateDir(project.directory);
53
+ const projectJsonPath = path.join(baseplateDir, 'project-definition.json');
54
+ await writeFile(projectJsonPath, serializedContents, 'utf-8');
55
+ // Clean up draft session
56
+ await deleteDraftSession(project.directory);
57
+ return {
58
+ message: 'Draft committed successfully to project-definition.json.',
59
+ };
60
+ },
61
+ writeCliOutput: (output) => {
62
+ console.info(`✓ ${output.message}`);
63
+ },
64
+ });
65
+ //# sourceMappingURL=commit-draft.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-draft.action.js","sourceRoot":"","sources":["../../../src/actions/definition/commit-draft.action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { z } from 'zod';
2
+ export declare const discardDraftAction: import("#src/actions/types.js").ServiceAction<z.ZodObject<{
3
+ project: z.ZodString;
4
+ }, z.core.$strip>, z.ZodObject<{
5
+ message: z.ZodString;
6
+ }, z.core.$strip>>;
7
+ //# sourceMappingURL=discard-draft.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discard-draft.action.d.ts","sourceRoot":"","sources":["../../../src/actions/definition/discard-draft.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAexB,eAAO,MAAM,kBAAkB;;;;kBAsB7B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ import { createServiceAction } from '#src/actions/types.js';
3
+ import { getProjectByNameOrId } from '../utils/projects.js';
4
+ import { deleteDraftSession, loadDraftSession } from './draft-session.js';
5
+ const discardDraftInputSchema = z.object({
6
+ project: z.string().describe('The name or ID of the project.'),
7
+ });
8
+ const discardDraftOutputSchema = z.object({
9
+ message: z.string().describe('A summary of the discard result.'),
10
+ });
11
+ export const discardDraftAction = createServiceAction({
12
+ name: 'discard-draft',
13
+ title: 'Discard Draft',
14
+ description: 'Discard the current draft session, removing all staged changes.',
15
+ inputSchema: discardDraftInputSchema,
16
+ outputSchema: discardDraftOutputSchema,
17
+ handler: async (input, context) => {
18
+ const project = getProjectByNameOrId(context.projects, input.project);
19
+ const session = await loadDraftSession(project.directory);
20
+ if (!session) {
21
+ return { message: 'No draft session to discard.' };
22
+ }
23
+ await deleteDraftSession(project.directory);
24
+ return { message: 'Draft session discarded.' };
25
+ },
26
+ writeCliOutput: (output) => {
27
+ console.info(`✓ ${output.message}`);
28
+ },
29
+ });
30
+ //# sourceMappingURL=discard-draft.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discard-draft.action.js","sourceRoot":"","sources":["../../../src/actions/definition/discard-draft.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE1E,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACjE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;IACpD,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,eAAe;IACtB,WAAW,EACT,iEAAiE;IACnE,WAAW,EAAE,uBAAuB;IACpC,YAAY,EAAE,wBAAwB;IACtC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC;QACrD,CAAC;QAED,MAAM,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE5C,OAAO,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACjD,CAAC;IACD,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { EntityServiceContext, SchemaParserContext } from '@baseplate-dev/project-builder-lib';
2
+ import { z } from 'zod';
3
+ import type { ServiceActionContext } from '#src/actions/types.js';
4
+ declare const draftSessionMetadataSchema: z.ZodObject<{
5
+ sessionId: z.ZodString;
6
+ definitionHash: z.ZodString;
7
+ }, z.core.$strip>;
8
+ /**
9
+ * Metadata for a draft session, stored separately from the large definition payload.
10
+ */
11
+ export type DraftSessionMetadata = z.infer<typeof draftSessionMetadataSchema>;
12
+ /**
13
+ * A draft session holds staged entity changes before they are committed
14
+ * to the project-definition.json file.
15
+ */
16
+ export interface DraftSession extends DraftSessionMetadata {
17
+ /** The modified serialized definition (with names, not IDs). */
18
+ draftDefinition: Record<string, unknown>;
19
+ }
20
+ export declare function loadDraftSession(projectDirectory: string): Promise<DraftSession | null>;
21
+ export declare function saveDraftSession(projectDirectory: string, session: DraftSession): Promise<void>;
22
+ export declare function deleteDraftSession(projectDirectory: string): Promise<void>;
23
+ export interface DraftSessionContext {
24
+ session: DraftSession;
25
+ entityContext: EntityServiceContext;
26
+ parserContext: SchemaParserContext;
27
+ projectDirectory: string;
28
+ }
29
+ /**
30
+ * Gets the existing draft session or creates a new one from the current project definition.
31
+ *
32
+ * If a draft exists but the session ID or definition hash doesn't match, an error is thrown
33
+ * requiring the caller to discard the stale draft first.
34
+ */
35
+ export declare function getOrCreateDraftSession(projectNameOrId: string, context: ServiceActionContext): Promise<DraftSessionContext>;
36
+ /**
37
+ * Loads the definition hash for the given project directory.
38
+ */
39
+ export declare function loadDefinitionHash(projectDirectory: string): Promise<string>;
40
+ export {};
41
+ //# sourceMappingURL=draft-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-session.d.ts","sourceRoot":"","sources":["../../../src/actions/definition/draft-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,oCAAoC,CAAC;AAO5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAQlE,QAAA,MAAM,0BAA0B;;;iBAK9B,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E;;;GAGG;AACH,MAAM,WAAW,YAAa,SAAQ,oBAAoB;IACxD,gEAAgE;IAChE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAkBD,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAiB9B;AAED,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAsB,kBAAkB,CACtC,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,CAAC;IACtB,aAAa,EAAE,oBAAoB,CAAC;IACpC,aAAa,EAAE,mBAAmB,CAAC;IACnC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAiE9B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CAKjB"}
@@ -0,0 +1,117 @@
1
+ import { ProjectDefinitionContainer } from '@baseplate-dev/project-builder-lib';
2
+ import { hashWithSHA256, stringifyPrettyStable } from '@baseplate-dev/utils';
3
+ import { fileExists, handleFileNotFoundError } from '@baseplate-dev/utils/node';
4
+ import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
5
+ import path from 'node:path';
6
+ import { z } from 'zod';
7
+ import { resolveBaseplateDir } from '#src/diff/snapshot/snapshot-utils.js';
8
+ import { createNodeSchemaParserContext } from '#src/plugins/node-plugin-store.js';
9
+ import { loadProjectDefinition } from '#src/project-definition/load-project-definition.js';
10
+ import { getProjectByNameOrId } from '../utils/projects.js';
11
+ const draftSessionMetadataSchema = z.object({
12
+ /** ID of the session that created this draft. */
13
+ sessionId: z.string(),
14
+ /** SHA-256 hash of the original project-definition.json when the draft was created. */
15
+ definitionHash: z.string(),
16
+ });
17
+ const DRAFT_SESSION_FILENAME = 'draft-session.json';
18
+ const DRAFT_DEFINITION_FILENAME = 'draft-definition.json';
19
+ function getDraftDir(projectDirectory) {
20
+ const baseplateDir = resolveBaseplateDir(projectDirectory);
21
+ return path.join(baseplateDir, '.build');
22
+ }
23
+ function getDraftSessionPath(projectDirectory) {
24
+ return path.join(getDraftDir(projectDirectory), DRAFT_SESSION_FILENAME);
25
+ }
26
+ function getDraftDefinitionPath(projectDirectory) {
27
+ return path.join(getDraftDir(projectDirectory), DRAFT_DEFINITION_FILENAME);
28
+ }
29
+ export async function loadDraftSession(projectDirectory) {
30
+ const sessionPath = getDraftSessionPath(projectDirectory);
31
+ if (!(await fileExists(sessionPath))) {
32
+ return null;
33
+ }
34
+ const [sessionContents, definitionContents] = await Promise.all([
35
+ readFile(sessionPath, 'utf-8'),
36
+ readFile(getDraftDefinitionPath(projectDirectory), 'utf-8'),
37
+ ]);
38
+ const metadata = draftSessionMetadataSchema.parse(JSON.parse(sessionContents));
39
+ const draftDefinition = JSON.parse(definitionContents);
40
+ return { ...metadata, draftDefinition };
41
+ }
42
+ export async function saveDraftSession(projectDirectory, session) {
43
+ const draftDir = getDraftDir(projectDirectory);
44
+ await mkdir(draftDir, { recursive: true });
45
+ const metadata = {
46
+ sessionId: session.sessionId,
47
+ definitionHash: session.definitionHash,
48
+ };
49
+ await Promise.all([
50
+ writeFile(getDraftSessionPath(projectDirectory), stringifyPrettyStable(metadata)),
51
+ writeFile(getDraftDefinitionPath(projectDirectory), stringifyPrettyStable(session.draftDefinition)),
52
+ ]);
53
+ }
54
+ export async function deleteDraftSession(projectDirectory) {
55
+ const sessionPath = getDraftSessionPath(projectDirectory);
56
+ const definitionPath = getDraftDefinitionPath(projectDirectory);
57
+ await Promise.all([
58
+ rm(sessionPath).catch(handleFileNotFoundError),
59
+ rm(definitionPath).catch(handleFileNotFoundError),
60
+ ]);
61
+ }
62
+ /**
63
+ * Gets the existing draft session or creates a new one from the current project definition.
64
+ *
65
+ * If a draft exists but the session ID or definition hash doesn't match, an error is thrown
66
+ * requiring the caller to discard the stale draft first.
67
+ */
68
+ export async function getOrCreateDraftSession(projectNameOrId, context) {
69
+ const project = getProjectByNameOrId(context.projects, projectNameOrId);
70
+ const { sessionId } = context;
71
+ const parserContext = await createNodeSchemaParserContext(project, context.logger, context.plugins, context.cliVersion);
72
+ const { definition, hash } = await loadProjectDefinition(project.baseplateDirectory, parserContext);
73
+ const existingDraft = await loadDraftSession(project.directory);
74
+ if (existingDraft) {
75
+ if (existingDraft.sessionId !== sessionId) {
76
+ throw new Error(`A draft session exists from a different session (${existingDraft.sessionId}). ` +
77
+ 'Discard it with discard-draft before starting a new one.');
78
+ }
79
+ if (existingDraft.definitionHash !== hash) {
80
+ throw new Error('The project definition has changed since the draft was created. ' +
81
+ 'Discard the draft with discard-draft and start over.');
82
+ }
83
+ // Rebuild EntityServiceContext from the draft definition
84
+ const draftContainer = ProjectDefinitionContainer.fromSerializedConfig(existingDraft.draftDefinition, parserContext);
85
+ const entityContext = draftContainer.toEntityServiceContext();
86
+ return {
87
+ session: existingDraft,
88
+ entityContext,
89
+ parserContext,
90
+ projectDirectory: project.directory,
91
+ };
92
+ }
93
+ // Create a new draft from the current definition
94
+ const container = ProjectDefinitionContainer.fromSerializedConfig(definition, parserContext);
95
+ const entityContext = container.toEntityServiceContext();
96
+ const session = {
97
+ sessionId,
98
+ definitionHash: hash,
99
+ draftDefinition: entityContext.serializedDefinition,
100
+ };
101
+ return {
102
+ session,
103
+ entityContext,
104
+ parserContext,
105
+ projectDirectory: project.directory,
106
+ };
107
+ }
108
+ /**
109
+ * Loads the definition hash for the given project directory.
110
+ */
111
+ export async function loadDefinitionHash(projectDirectory) {
112
+ const baseplateDir = resolveBaseplateDir(projectDirectory);
113
+ const projectJsonPath = path.join(baseplateDir, 'project-definition.json');
114
+ const contents = await readFile(projectJsonPath, 'utf-8');
115
+ return hashWithSHA256(contents);
116
+ }
117
+ //# sourceMappingURL=draft-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-session.js","sourceRoot":"","sources":["../../../src/actions/definition/draft-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ export declare const getEntitySchemaAction: import("#src/actions/types.js").ServiceAction<z.ZodObject<{
3
+ project: z.ZodString;
4
+ entityTypeName: z.ZodString;
5
+ }, z.core.$strip>, z.ZodObject<{
6
+ entityTypeName: z.ZodString;
7
+ parentEntityTypeName: z.ZodNullable<z.ZodString>;
8
+ schema: z.ZodString;
9
+ }, z.core.$strip>>;
10
+ //# sourceMappingURL=get-entity-schema.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-entity-schema.action.d.ts","sourceRoot":"","sources":["../../../src/actions/definition/get-entity-schema.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2BxB,eAAO,MAAM,qBAAqB;;;;;;;kBAmChC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { z } from 'zod';
2
+ import { createAuxiliaryTypeStore, printNode, zodToTs } from 'zod-to-ts';
3
+ import { createServiceAction } from '#src/actions/types.js';
4
+ import { loadEntityServiceContext } from './load-entity-service-context.js';
5
+ const getEntitySchemaInputSchema = z.object({
6
+ project: z.string().describe('The name or ID of the project.'),
7
+ entityTypeName: z
8
+ .string()
9
+ .describe('The entity type to get the schema for (e.g., "feature", "model", "model-scalar-field").'),
10
+ });
11
+ const getEntitySchemaOutputSchema = z.object({
12
+ entityTypeName: z.string().describe('The entity type name.'),
13
+ parentEntityTypeName: z
14
+ .string()
15
+ .nullable()
16
+ .describe('The parent entity type name, or null for top-level entities.'),
17
+ schema: z
18
+ .string()
19
+ .describe('The TypeScript type representation of this entity type.'),
20
+ });
21
+ export const getEntitySchemaAction = createServiceAction({
22
+ name: 'get-entity-schema',
23
+ title: 'Get Entity Schema',
24
+ description: 'Get the TypeScript type for a given entity type. Useful for understanding valid field shapes before creating or updating entities.',
25
+ inputSchema: getEntitySchemaInputSchema,
26
+ outputSchema: getEntitySchemaOutputSchema,
27
+ writeCliOutput: (output) => {
28
+ console.info(output.schema);
29
+ },
30
+ handler: async (input, context) => {
31
+ const { entityContext } = await loadEntityServiceContext(input.project, context);
32
+ const metadata = entityContext.entityTypeMap.get(input.entityTypeName);
33
+ if (!metadata) {
34
+ throw new Error(`Unknown entity type: "${input.entityTypeName}". Use list-entities with entityTypeName "*" to discover available types.`);
35
+ }
36
+ const { node } = zodToTs(metadata.elementSchema, {
37
+ auxiliaryTypeStore: createAuxiliaryTypeStore(),
38
+ unrepresentable: 'any',
39
+ });
40
+ const schemaText = printNode(node);
41
+ return {
42
+ entityTypeName: input.entityTypeName,
43
+ parentEntityTypeName: metadata.parentEntityTypeName ?? null,
44
+ schema: schemaText,
45
+ };
46
+ },
47
+ });
48
+ //# sourceMappingURL=get-entity-schema.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-entity-schema.action.js","sourceRoot":"","sources":["../../../src/actions/definition/get-entity-schema.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC9D,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,CACP,yFAAyF,CAC1F;CACJ,CAAC,CAAC;AAEH,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC5D,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,8DAA8D,CAAC;IAC3E,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,CAAC,yDAAyD,CAAC;CACvE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;IACvD,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EACT,oIAAoI;IACtI,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,2BAA2B;IACzC,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,wBAAwB,CACtD,KAAK,CAAC,OAAO,EACb,OAAO,CACR,CAAC;QAEF,MAAM,QAAQ,GAAG,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,yBAAyB,KAAK,CAAC,cAAc,2EAA2E,CACzH,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE;YAC/C,kBAAkB,EAAE,wBAAwB,EAAE;YAC9C,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAEnC,OAAO;YACL,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB,IAAI,IAAI;YAC3D,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+ export declare const getEntityAction: import("#src/actions/types.js").ServiceAction<z.ZodObject<{
3
+ project: z.ZodString;
4
+ entityId: z.ZodString;
5
+ }, z.core.$strip>, z.ZodObject<{
6
+ entity: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
7
+ }, z.core.$strip>>;
8
+ //# sourceMappingURL=get-entity.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-entity.action.d.ts","sourceRoot":"","sources":["../../../src/actions/definition/get-entity.action.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB,eAAO,MAAM,eAAe;;;;;kBAwB1B,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { getEntity } from '@baseplate-dev/project-builder-lib';
2
+ import { stringifyPrettyStable } from '@baseplate-dev/utils';
3
+ import { z } from 'zod';
4
+ import { createServiceAction } from '#src/actions/types.js';
5
+ import { loadEntityServiceContext } from './load-entity-service-context.js';
6
+ const getEntityInputSchema = z.object({
7
+ project: z.string().describe('The name or ID of the project.'),
8
+ entityId: z
9
+ .string()
10
+ .describe('The ID of the entity to retrieve (e.g., "model:abc123").'),
11
+ });
12
+ const getEntityOutputSchema = z.object({
13
+ entity: z
14
+ .record(z.string(), z.unknown())
15
+ .nullable()
16
+ .describe('The serialized entity data with references resolved to names, or null if not found.'),
17
+ });
18
+ export const getEntityAction = createServiceAction({
19
+ name: 'get-entity',
20
+ title: 'Get Entity',
21
+ description: 'Get the full serialized data for a specific entity by ID. Returns name-resolved JSON.',
22
+ inputSchema: getEntityInputSchema,
23
+ outputSchema: getEntityOutputSchema,
24
+ writeCliOutput: (output) => {
25
+ if (output.entity === null) {
26
+ console.info('Entity not found.');
27
+ return;
28
+ }
29
+ console.info(stringifyPrettyStable(output.entity));
30
+ },
31
+ handler: async (input, context) => {
32
+ const { entityContext } = await loadEntityServiceContext(input.project, context);
33
+ const entity = getEntity(input.entityId, entityContext);
34
+ return { entity: entity ?? null };
35
+ },
36
+ });
37
+ //# sourceMappingURL=get-entity.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-entity.action.js","sourceRoot":"","sources":["../../../src/actions/definition/get-entity.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC9D,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,0DAA0D,CAAC;CACxE,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,CAAC;SACN,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/B,QAAQ,EAAE;SACV,QAAQ,CACP,qFAAqF,CACtF;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;IACjD,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,YAAY;IACnB,WAAW,EACT,uFAAuF;IACzF,WAAW,EAAE,oBAAoB;IACjC,YAAY,EAAE,qBAAqB;IACnC,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE;QACzB,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,wBAAwB,CACtD,KAAK,CAAC,OAAO,EACb,OAAO,CACR,CAAC;QAEF,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAExD,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC;IACpC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { commitDraftAction } from './commit-draft.action.js';
2
+ export { discardDraftAction } from './discard-draft.action.js';
3
+ export { getEntitySchemaAction } from './get-entity-schema.action.js';
4
+ export { getEntityAction } from './get-entity.action.js';
5
+ export { listEntitiesAction } from './list-entities.action.js';
6
+ export { listEntityTypesAction } from './list-entity-types.action.js';
7
+ export { showDraftAction } from './show-draft.action.js';
8
+ export { stageCreateEntityAction } from './stage-create-entity.action.js';
9
+ export { stageDeleteEntityAction } from './stage-delete-entity.action.js';
10
+ export { stageUpdateEntityAction } from './stage-update-entity.action.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actions/definition/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC"}