@baseplate-dev/project-builder-lib 0.6.4 → 0.6.6

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 (287) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/compiler/admin-crud-action-compiler.js +1 -1
  3. package/dist/compiler/admin-crud-action-compiler.js.map +1 -1
  4. package/dist/compiler/admin-crud-column-compiler-spec.js +1 -1
  5. package/dist/compiler/admin-crud-column-compiler-spec.js.map +1 -1
  6. package/dist/compiler/admin-crud-input-spec.js +1 -1
  7. package/dist/compiler/admin-crud-input-spec.js.map +1 -1
  8. package/dist/compiler/app-compiler-spec.js +1 -1
  9. package/dist/compiler/app-compiler-spec.js.map +1 -1
  10. package/dist/compiler/index.d.ts +1 -0
  11. package/dist/compiler/index.d.ts.map +1 -1
  12. package/dist/compiler/index.js +1 -0
  13. package/dist/compiler/index.js.map +1 -1
  14. package/dist/compiler/model-transformer-compiler-spec.js +1 -1
  15. package/dist/compiler/model-transformer-compiler-spec.js.map +1 -1
  16. package/dist/compiler/root-compiler-spec.d.ts +25 -0
  17. package/dist/compiler/root-compiler-spec.d.ts.map +1 -0
  18. package/dist/compiler/root-compiler-spec.js +23 -0
  19. package/dist/compiler/root-compiler-spec.js.map +1 -0
  20. package/dist/constants/theme-colors.d.ts +0 -48
  21. package/dist/constants/theme-colors.d.ts.map +1 -1
  22. package/dist/constants/theme-colors.js +0 -32
  23. package/dist/constants/theme-colors.js.map +1 -1
  24. package/dist/definition/feature/feature-utils.d.ts +2 -2
  25. package/dist/definition/feature/feature-utils.d.ts.map +1 -1
  26. package/dist/definition/feature/feature-utils.js +3 -3
  27. package/dist/definition/feature/feature-utils.js.map +1 -1
  28. package/dist/definition/plugins/plugin-utils.d.ts +15 -0
  29. package/dist/definition/plugins/plugin-utils.d.ts.map +1 -1
  30. package/dist/definition/plugins/plugin-utils.js +50 -1
  31. package/dist/definition/plugins/plugin-utils.js.map +1 -1
  32. package/dist/definition/project-definition-container.d.ts.map +1 -1
  33. package/dist/definition/project-definition-container.js +3 -1
  34. package/dist/definition/project-definition-container.js.map +1 -1
  35. package/dist/{schema/models → expression-parsers}/authorizer/authorizer-expression-acorn-parser.d.ts +2 -0
  36. package/dist/expression-parsers/authorizer/authorizer-expression-acorn-parser.d.ts.map +1 -0
  37. package/dist/{schema/models → expression-parsers}/authorizer/authorizer-expression-acorn-parser.js +107 -52
  38. package/dist/expression-parsers/authorizer/authorizer-expression-acorn-parser.js.map +1 -0
  39. package/dist/{schema/models → expression-parsers}/authorizer/authorizer-expression-ast.d.ts +69 -1
  40. package/dist/expression-parsers/authorizer/authorizer-expression-ast.d.ts.map +1 -0
  41. package/dist/{schema/models → expression-parsers}/authorizer/authorizer-expression-ast.js +2 -0
  42. package/dist/expression-parsers/authorizer/authorizer-expression-ast.js.map +1 -0
  43. package/dist/{schema/models → expression-parsers}/authorizer/authorizer-expression-parser.d.ts +13 -14
  44. package/dist/expression-parsers/authorizer/authorizer-expression-parser.d.ts.map +1 -0
  45. package/dist/expression-parsers/authorizer/authorizer-expression-parser.js +292 -0
  46. package/dist/expression-parsers/authorizer/authorizer-expression-parser.js.map +1 -0
  47. package/dist/{schema/models → expression-parsers}/authorizer/authorizer-expression-validator.d.ts +37 -17
  48. package/dist/expression-parsers/authorizer/authorizer-expression-validator.d.ts.map +1 -0
  49. package/dist/expression-parsers/authorizer/authorizer-expression-validator.js +379 -0
  50. package/dist/expression-parsers/authorizer/authorizer-expression-validator.js.map +1 -0
  51. package/dist/expression-parsers/authorizer/authorizer-expression-visitor.d.ts +54 -0
  52. package/dist/expression-parsers/authorizer/authorizer-expression-visitor.d.ts.map +1 -0
  53. package/dist/expression-parsers/authorizer/authorizer-expression-visitor.js +52 -0
  54. package/dist/expression-parsers/authorizer/authorizer-expression-visitor.js.map +1 -0
  55. package/dist/expression-parsers/authorizer/index.d.ts +6 -0
  56. package/dist/expression-parsers/authorizer/index.d.ts.map +1 -0
  57. package/dist/expression-parsers/authorizer/index.js +6 -0
  58. package/dist/expression-parsers/authorizer/index.js.map +1 -0
  59. package/dist/expression-parsers/register-core-module.d.ts +6 -0
  60. package/dist/expression-parsers/register-core-module.d.ts.map +1 -0
  61. package/dist/expression-parsers/register-core-module.js +29 -0
  62. package/dist/expression-parsers/register-core-module.js.map +1 -0
  63. package/dist/index.d.ts +1 -0
  64. package/dist/index.js +1 -0
  65. package/dist/migrations/index.d.ts.map +1 -1
  66. package/dist/migrations/index.js +6 -0
  67. package/dist/migrations/index.js.map +1 -1
  68. package/dist/migrations/migration-029-admin-role-and-auto-assigned.d.ts +25 -0
  69. package/dist/migrations/migration-029-admin-role-and-auto-assigned.d.ts.map +1 -0
  70. package/dist/migrations/migration-029-admin-role-and-auto-assigned.js +72 -0
  71. package/dist/migrations/migration-029-admin-role-and-auto-assigned.js.map +1 -0
  72. package/dist/migrations/migration-030-remove-theme-hover-colors.d.ts +17 -0
  73. package/dist/migrations/migration-030-remove-theme-hover-colors.d.ts.map +1 -0
  74. package/dist/migrations/migration-030-remove-theme-hover-colors.js +41 -0
  75. package/dist/migrations/migration-030-remove-theme-hover-colors.js.map +1 -0
  76. package/dist/migrations/migration-031-uuid-default-generation.d.ts +24 -0
  77. package/dist/migrations/migration-031-uuid-default-generation.d.ts.map +1 -0
  78. package/dist/migrations/migration-031-uuid-default-generation.js +40 -0
  79. package/dist/migrations/migration-031-uuid-default-generation.js.map +1 -0
  80. package/dist/migrations/transform-json-path.d.ts.map +1 -1
  81. package/dist/migrations/transform-json-path.js +2 -3
  82. package/dist/migrations/transform-json-path.js.map +1 -1
  83. package/dist/parser/collect-definition-issues.d.ts.map +1 -1
  84. package/dist/parser/collect-definition-issues.js +10 -2
  85. package/dist/parser/collect-definition-issues.js.map +1 -1
  86. package/dist/parser/collect-expression-issues.d.ts +17 -9
  87. package/dist/parser/collect-expression-issues.d.ts.map +1 -1
  88. package/dist/parser/collect-expression-issues.js +21 -15
  89. package/dist/parser/collect-expression-issues.js.map +1 -1
  90. package/dist/parser/definition-issue-checkers/plugin-dependency-checker.d.ts +11 -0
  91. package/dist/parser/definition-issue-checkers/plugin-dependency-checker.d.ts.map +1 -0
  92. package/dist/parser/definition-issue-checkers/plugin-dependency-checker.js +41 -0
  93. package/dist/parser/definition-issue-checkers/plugin-dependency-checker.js.map +1 -0
  94. package/dist/parser/definition-issue-checkers/plugin-implementation-checker.d.ts +16 -0
  95. package/dist/parser/definition-issue-checkers/plugin-implementation-checker.d.ts.map +1 -0
  96. package/dist/parser/definition-issue-checkers/plugin-implementation-checker.js +69 -0
  97. package/dist/parser/definition-issue-checkers/plugin-implementation-checker.js.map +1 -0
  98. package/dist/parser/definition-issue-utils.d.ts +28 -1
  99. package/dist/parser/definition-issue-utils.d.ts.map +1 -1
  100. package/dist/parser/definition-issue-utils.js +59 -0
  101. package/dist/parser/definition-issue-utils.js.map +1 -1
  102. package/dist/parser/find-orphaned-union-items.d.ts +30 -0
  103. package/dist/parser/find-orphaned-union-items.d.ts.map +1 -0
  104. package/dist/parser/find-orphaned-union-items.js +47 -0
  105. package/dist/parser/find-orphaned-union-items.js.map +1 -0
  106. package/dist/parser/index.d.ts +3 -1
  107. package/dist/parser/index.d.ts.map +1 -1
  108. package/dist/parser/index.js +3 -1
  109. package/dist/parser/index.js.map +1 -1
  110. package/dist/parser/parser.d.ts.map +1 -1
  111. package/dist/parser/parser.js +3 -0
  112. package/dist/parser/parser.js.map +1 -1
  113. package/dist/parser/transform-data-with-schema.js +1 -1
  114. package/dist/parser/transform-data-with-schema.js.map +1 -1
  115. package/dist/plugins/imports/index.d.ts +1 -0
  116. package/dist/plugins/imports/index.d.ts.map +1 -1
  117. package/dist/plugins/imports/index.js +1 -0
  118. package/dist/plugins/imports/index.js.map +1 -1
  119. package/dist/plugins/imports/validate-plugin-dependencies.d.ts +42 -0
  120. package/dist/plugins/imports/validate-plugin-dependencies.d.ts.map +1 -0
  121. package/dist/plugins/imports/validate-plugin-dependencies.js +80 -0
  122. package/dist/plugins/imports/validate-plugin-dependencies.js.map +1 -0
  123. package/dist/plugins/metadata/types.d.ts +13 -0
  124. package/dist/plugins/metadata/types.d.ts.map +1 -1
  125. package/dist/plugins/metadata/types.js +15 -0
  126. package/dist/plugins/metadata/types.js.map +1 -1
  127. package/dist/plugins/spec/auth-config-spec.d.ts +1 -0
  128. package/dist/plugins/spec/auth-config-spec.d.ts.map +1 -1
  129. package/dist/plugins/spec/auth-config-spec.js.map +1 -1
  130. package/dist/references/definition-ref-builder.d.ts +2 -0
  131. package/dist/references/definition-ref-builder.d.ts.map +1 -1
  132. package/dist/references/definition-ref-registry.d.ts +2 -0
  133. package/dist/references/definition-ref-registry.d.ts.map +1 -1
  134. package/dist/references/definition-ref-registry.js.map +1 -1
  135. package/dist/references/expression-parser-ref.d.ts +51 -0
  136. package/dist/references/expression-parser-ref.d.ts.map +1 -0
  137. package/dist/references/expression-parser-ref.js +14 -0
  138. package/dist/references/expression-parser-ref.js.map +1 -0
  139. package/dist/references/expression-parser-spec.d.ts +29 -0
  140. package/dist/references/expression-parser-spec.d.ts.map +1 -0
  141. package/dist/references/expression-parser-spec.js +29 -0
  142. package/dist/references/expression-parser-spec.js.map +1 -0
  143. package/dist/references/expression-types.d.ts +20 -22
  144. package/dist/references/expression-types.d.ts.map +1 -1
  145. package/dist/references/expression-types.js +1 -2
  146. package/dist/references/expression-types.js.map +1 -1
  147. package/dist/references/extend-parser-context-with-refs.d.ts +7 -2
  148. package/dist/references/extend-parser-context-with-refs.d.ts.map +1 -1
  149. package/dist/references/extend-parser-context-with-refs.js +42 -12
  150. package/dist/references/extend-parser-context-with-refs.js.map +1 -1
  151. package/dist/references/extract-definition-refs.js +1 -1
  152. package/dist/references/extract-definition-refs.js.map +1 -1
  153. package/dist/references/fix-definition-refs.d.ts +22 -0
  154. package/dist/references/fix-definition-refs.d.ts.map +1 -0
  155. package/dist/references/fix-definition-refs.js +29 -0
  156. package/dist/references/fix-definition-refs.js.map +1 -0
  157. package/dist/references/fix-expression-renames.d.ts +20 -0
  158. package/dist/references/fix-expression-renames.d.ts.map +1 -0
  159. package/dist/references/fix-expression-renames.js +87 -0
  160. package/dist/references/fix-expression-renames.js.map +1 -0
  161. package/dist/references/index.d.ts +4 -0
  162. package/dist/references/index.d.ts.map +1 -1
  163. package/dist/references/index.js +4 -0
  164. package/dist/references/index.js.map +1 -1
  165. package/dist/references/parse-schema-with-references.d.ts +2 -1
  166. package/dist/references/parse-schema-with-references.d.ts.map +1 -1
  167. package/dist/references/parse-schema-with-references.js.map +1 -1
  168. package/dist/schema/apps/web/admin/sections/crud.d.ts.map +1 -1
  169. package/dist/schema/apps/web/admin/sections/crud.js +3 -2
  170. package/dist/schema/apps/web/admin/sections/crud.js.map +1 -1
  171. package/dist/schema/creator/definition-issue-checkers.d.ts +15 -0
  172. package/dist/schema/creator/definition-issue-checkers.d.ts.map +1 -1
  173. package/dist/schema/creator/definition-issue-checkers.js +33 -0
  174. package/dist/schema/creator/definition-issue-checkers.js.map +1 -1
  175. package/dist/schema/creator/schema-creator.js +1 -1
  176. package/dist/schema/creator/schema-creator.js.map +1 -1
  177. package/dist/schema/features/feature.js +1 -1
  178. package/dist/schema/features/feature.js.map +1 -1
  179. package/dist/schema/libraries/library.d.ts.map +1 -1
  180. package/dist/schema/libraries/library.js +1 -0
  181. package/dist/schema/libraries/library.js.map +1 -1
  182. package/dist/schema/models/authorizer/authorizer-expression-ref.d.ts +11 -0
  183. package/dist/schema/models/authorizer/authorizer-expression-ref.d.ts.map +1 -0
  184. package/dist/schema/models/authorizer/authorizer-expression-ref.js +10 -0
  185. package/dist/schema/models/authorizer/authorizer-expression-ref.js.map +1 -0
  186. package/dist/schema/models/authorizer/authorizer.js +2 -2
  187. package/dist/schema/models/authorizer/authorizer.js.map +1 -1
  188. package/dist/schema/models/authorizer/index.d.ts +1 -4
  189. package/dist/schema/models/authorizer/index.d.ts.map +1 -1
  190. package/dist/schema/models/authorizer/index.js +1 -4
  191. package/dist/schema/models/authorizer/index.js.map +1 -1
  192. package/dist/schema/models/enums.d.ts +12 -0
  193. package/dist/schema/models/enums.d.ts.map +1 -1
  194. package/dist/schema/models/enums.js +5 -2
  195. package/dist/schema/models/enums.js.map +1 -1
  196. package/dist/schema/models/graphql.js +3 -3
  197. package/dist/schema/models/graphql.js.map +1 -1
  198. package/dist/schema/models/models.d.ts +12 -24
  199. package/dist/schema/models/models.d.ts.map +1 -1
  200. package/dist/schema/models/models.js +6 -4
  201. package/dist/schema/models/models.js.map +1 -1
  202. package/dist/schema/plugins/definition.d.ts.map +1 -1
  203. package/dist/schema/plugins/definition.js +2 -0
  204. package/dist/schema/plugins/definition.js.map +1 -1
  205. package/dist/schema/project-definition.d.ts +10 -18
  206. package/dist/schema/project-definition.d.ts.map +1 -1
  207. package/dist/schema/project-definition.js +5 -1
  208. package/dist/schema/project-definition.js.map +1 -1
  209. package/dist/schema/settings/settings.d.ts +2 -10
  210. package/dist/schema/settings/settings.d.ts.map +1 -1
  211. package/dist/schema/settings/theme.d.ts +3 -15
  212. package/dist/schema/settings/theme.d.ts.map +1 -1
  213. package/dist/schema/utils/validation.d.ts.map +1 -1
  214. package/dist/schema/utils/validation.js +16 -3
  215. package/dist/schema/utils/validation.js.map +1 -1
  216. package/dist/specs/packages/library-type-spec.d.ts +4 -0
  217. package/dist/specs/packages/library-type-spec.d.ts.map +1 -1
  218. package/dist/specs/packages/library-type-spec.js +2 -2
  219. package/dist/specs/packages/library-type-spec.js.map +1 -1
  220. package/dist/testing/definition-helpers.test-helper.js +2 -2
  221. package/dist/testing/definition-helpers.test-helper.js.map +1 -1
  222. package/dist/testing/expression-stub-parser.test-helper.d.ts +2 -4
  223. package/dist/testing/expression-stub-parser.test-helper.d.ts.map +1 -1
  224. package/dist/testing/expression-stub-parser.test-helper.js +2 -10
  225. package/dist/testing/expression-stub-parser.test-helper.js.map +1 -1
  226. package/dist/testing/expression-warning-parser.test-helper.d.ts +2 -4
  227. package/dist/testing/expression-warning-parser.test-helper.d.ts.map +1 -1
  228. package/dist/testing/expression-warning-parser.test-helper.js +2 -8
  229. package/dist/testing/expression-warning-parser.test-helper.js.map +1 -1
  230. package/dist/testing/index.d.ts +1 -0
  231. package/dist/testing/index.d.ts.map +1 -1
  232. package/dist/testing/index.js +1 -0
  233. package/dist/testing/index.js.map +1 -1
  234. package/dist/testing/parser-context.test-helper.d.ts.map +1 -1
  235. package/dist/testing/parser-context.test-helper.js +2 -1
  236. package/dist/testing/parser-context.test-helper.js.map +1 -1
  237. package/dist/testing/plugin-store.test-helper.d.ts +11 -0
  238. package/dist/testing/plugin-store.test-helper.d.ts.map +1 -0
  239. package/dist/testing/plugin-store.test-helper.js +32 -0
  240. package/dist/testing/plugin-store.test-helper.js.map +1 -0
  241. package/dist/testing/project-definition-container.test-helper.d.ts.map +1 -1
  242. package/dist/testing/project-definition-container.test-helper.js +2 -1
  243. package/dist/testing/project-definition-container.test-helper.js.map +1 -1
  244. package/dist/tools/index.d.ts +2 -0
  245. package/dist/tools/index.d.ts.map +1 -1
  246. package/dist/tools/index.js +2 -0
  247. package/dist/tools/index.js.map +1 -1
  248. package/dist/tools/sort-entity-arrays.d.ts +15 -0
  249. package/dist/tools/sort-entity-arrays.d.ts.map +1 -0
  250. package/dist/tools/sort-entity-arrays.js +31 -0
  251. package/dist/tools/sort-entity-arrays.js.map +1 -0
  252. package/dist/utils/color-conversions.d.ts +12 -0
  253. package/dist/utils/color-conversions.d.ts.map +1 -1
  254. package/dist/utils/color-conversions.js +17 -1
  255. package/dist/utils/color-conversions.js.map +1 -1
  256. package/dist/utils/color-names.d.ts.map +1 -1
  257. package/dist/utils/color-names.js +6 -5
  258. package/dist/utils/color-names.js.map +1 -1
  259. package/dist/utils/definition-diff/definition-diff.js +2 -2
  260. package/dist/utils/definition-diff/definition-diff.js.map +1 -1
  261. package/dist/utils/theme.d.ts +1 -0
  262. package/dist/utils/theme.d.ts.map +1 -1
  263. package/dist/utils/theme.js +18 -10
  264. package/dist/utils/theme.js.map +1 -1
  265. package/dist/web/components/definition-diff-alert.js +2 -2
  266. package/dist/web/components/definition-diff-alert.js.map +1 -1
  267. package/dist/web/specs/admin-crud-action-web-spec.js +1 -1
  268. package/dist/web/specs/admin-crud-action-web-spec.js.map +1 -1
  269. package/dist/web/specs/admin-crud-column-web-spec.js +1 -1
  270. package/dist/web/specs/admin-crud-column-web-spec.js.map +1 -1
  271. package/dist/web/specs/admin-crud-input-web-spec.js +1 -1
  272. package/dist/web/specs/admin-crud-input-web-spec.js.map +1 -1
  273. package/dist/web/specs/model-transformer-web-spec.d.ts +19 -2
  274. package/dist/web/specs/model-transformer-web-spec.d.ts.map +1 -1
  275. package/dist/web/specs/model-transformer-web-spec.js +1 -1
  276. package/dist/web/specs/model-transformer-web-spec.js.map +1 -1
  277. package/package.json +8 -8
  278. package/dist/schema/models/authorizer/authorizer-expression-acorn-parser.d.ts.map +0 -1
  279. package/dist/schema/models/authorizer/authorizer-expression-acorn-parser.js.map +0 -1
  280. package/dist/schema/models/authorizer/authorizer-expression-ast.d.ts.map +0 -1
  281. package/dist/schema/models/authorizer/authorizer-expression-ast.js.map +0 -1
  282. package/dist/schema/models/authorizer/authorizer-expression-parser.d.ts.map +0 -1
  283. package/dist/schema/models/authorizer/authorizer-expression-parser.js +0 -145
  284. package/dist/schema/models/authorizer/authorizer-expression-parser.js.map +0 -1
  285. package/dist/schema/models/authorizer/authorizer-expression-validator.d.ts.map +0 -1
  286. package/dist/schema/models/authorizer/authorizer-expression-validator.js +0 -284
  287. package/dist/schema/models/authorizer/authorizer-expression-validator.js.map +0 -1
@@ -0,0 +1,379 @@
1
+ /**
2
+ * Validator for authorizer expressions.
3
+ *
4
+ * Validates that:
5
+ * - Model field references exist on the parent model
6
+ * - Auth field references are valid AuthContext properties
7
+ * - Role names exist in project config (warning only)
8
+ */
9
+ import { authConfigSpec } from '#src/plugins/spec/auth-config-spec.js';
10
+ import { visitAuthorizerExpression } from './authorizer-expression-visitor.js';
11
+ /**
12
+ * Valid auth context field names that can be accessed.
13
+ */
14
+ const VALID_AUTH_FIELDS = new Set(['userId']);
15
+ /**
16
+ * Get role info from the project definition using the auth config spec.
17
+ *
18
+ * @param pluginStore - The plugin spec store
19
+ * @param definition - The raw project definition data
20
+ * @returns Role information including built-in status
21
+ */
22
+ function getAuthRoleInfo(pluginStore, definition) {
23
+ const authConfig = pluginStore.use(authConfigSpec);
24
+ const roles = authConfig.getAuthConfig(definition)?.roles;
25
+ return {
26
+ allRoleNames: new Set(roles?.map((role) => role.name)),
27
+ autoAssignedRoleNames: new Set(roles?.filter((role) => role.autoAssigned).map((role) => role.name)),
28
+ };
29
+ }
30
+ /**
31
+ * Validate an authorizer expression AST against model and project context.
32
+ *
33
+ * @param ast - The parsed expression AST
34
+ * @param modelContext - Information about the parent model
35
+ * @param pluginStore - The plugin spec store for accessing auth config
36
+ * @param definition - The raw project definition data
37
+ * @returns Array of warnings (errors are thrown, warnings are returned)
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const warnings = validateAuthorizerExpression(
42
+ * ast,
43
+ * { modelName: 'User', scalarFieldNames: new Set(['id', 'email']) },
44
+ * pluginStore,
45
+ * definition,
46
+ * );
47
+ * ```
48
+ */
49
+ export function validateAuthorizerExpression(ast, modelContext, pluginStore, definition) {
50
+ const warnings = [];
51
+ const { allRoleNames, autoAssignedRoleNames } = getAuthRoleInfo(pluginStore, definition);
52
+ const assignableRoleNames = [...allRoleNames].filter((name) => !autoAssignedRoleNames.has(name));
53
+ function warnIfAutoAssignedRole(role, start, end) {
54
+ if (autoAssignedRoleNames.has(role)) {
55
+ const message = role === 'user'
56
+ ? `Role 'user' is an auto-assigned role. Use 'isAuthenticated' instead to check if the user is authenticated.`
57
+ : `Role '${role}' is an auto-assigned role and should not be used in authorizer expressions. Use assignable roles: ${assignableRoleNames.join(', ')}.`;
58
+ warnings.push({ message, start, end });
59
+ }
60
+ }
61
+ const validationVisitor = {
62
+ fieldComparison(node) {
63
+ if (node.left.type === 'fieldRef') {
64
+ validateFieldRef(node.left);
65
+ }
66
+ if (node.right.type === 'fieldRef') {
67
+ validateFieldRef(node.right);
68
+ }
69
+ // Type-check: warn if a model field is compared to an incompatible literal
70
+ const fieldRef = node.left.type === 'fieldRef' ? node.left : node.right;
71
+ const literalNode = node.left.type === 'literalValue'
72
+ ? node.left
73
+ : node.right.type === 'literalValue'
74
+ ? node.right
75
+ : null;
76
+ if (fieldRef.type === 'fieldRef' &&
77
+ fieldRef.source === 'model' &&
78
+ literalNode !== null) {
79
+ const fieldType = modelContext.fieldTypes.get(fieldRef.field);
80
+ if (fieldType) {
81
+ validateLiteralTypeCompatibility(fieldRef.field, fieldType, modelContext.modelName, literalNode);
82
+ }
83
+ }
84
+ },
85
+ hasRole(node) {
86
+ // Warn if role doesn't exist (but allow - plugins may define roles)
87
+ if (allRoleNames.has(node.role)) {
88
+ warnIfAutoAssignedRole(node.role, node.roleStart, node.roleEnd);
89
+ }
90
+ else {
91
+ warnings.push({
92
+ message: `Role '${node.role}' is not defined in the project configuration. Available roles: ${[...allRoleNames].join(', ')}.`,
93
+ start: node.roleStart,
94
+ end: node.roleEnd,
95
+ });
96
+ }
97
+ },
98
+ hasSomeRole(node) {
99
+ for (let i = 0; i < node.roles.length; i++) {
100
+ const role = node.roles[i];
101
+ const start = node.rolesStart[i];
102
+ const end = node.rolesEnd[i];
103
+ if (allRoleNames.has(role)) {
104
+ warnIfAutoAssignedRole(role, start, end);
105
+ }
106
+ else {
107
+ warnings.push({
108
+ message: `Role '${role}' is not defined in the project configuration. Available roles: ${[...allRoleNames].join(', ')}.`,
109
+ start,
110
+ end,
111
+ });
112
+ }
113
+ }
114
+ },
115
+ nestedHasRole(node) {
116
+ validateNestedRelation(node.relationName, node.relationStart, node.relationEnd, [node.role], [node.roleStart], [node.roleEnd]);
117
+ },
118
+ nestedHasSomeRole(node) {
119
+ validateNestedRelation(node.relationName, node.relationStart, node.relationEnd, node.roles, node.rolesStart, node.rolesEnd);
120
+ },
121
+ relationFilter(node) {
122
+ validateRelationFilter(node);
123
+ },
124
+ isAuthenticated() {
125
+ // No validation needed
126
+ },
127
+ binaryLogical(node, _ctx, visit) {
128
+ visit(node.left);
129
+ visit(node.right);
130
+ },
131
+ };
132
+ function validateNestedRelation(relationName, relationStart, relationEnd, roles, rolesStart, rolesEnd) {
133
+ const { relationInfo } = modelContext;
134
+ if (!relationInfo) {
135
+ // Can't validate without relation info
136
+ return;
137
+ }
138
+ const relation = relationInfo.get(relationName);
139
+ if (!relation) {
140
+ const availableRelations = [...relationInfo.keys()].join(', ');
141
+ warnings.push({
142
+ message: `Relation '${relationName}' does not exist on model '${modelContext.modelName}'.${availableRelations ? ` Available relations: ${availableRelations}.` : ''}`,
143
+ start: relationStart,
144
+ end: relationEnd,
145
+ });
146
+ return;
147
+ }
148
+ if (relation.referenceCount !== 1) {
149
+ warnings.push({
150
+ message: `Relation '${relationName}' has ${relation.referenceCount} foreign key references. Nested authorizer checks only support single-key relations.`,
151
+ start: relationStart,
152
+ end: relationEnd,
153
+ });
154
+ return;
155
+ }
156
+ // Validate each role exists on the foreign model's authorizer
157
+ for (const [i, role] of roles.entries()) {
158
+ if (!relation.foreignAuthorizerRoleNames.has(role)) {
159
+ const availableRoles = [...relation.foreignAuthorizerRoleNames].join(', ');
160
+ warnings.push({
161
+ message: `Role '${role}' is not defined on model '${relation.foreignModelName}' authorizer.${availableRoles ? ` Available roles: ${availableRoles}.` : ''}`,
162
+ start: rolesStart[i],
163
+ end: rolesEnd[i],
164
+ });
165
+ }
166
+ }
167
+ }
168
+ function validateRelationFilter(node) {
169
+ const { relationInfo } = modelContext;
170
+ if (!relationInfo) {
171
+ return;
172
+ }
173
+ const relation = relationInfo.get(node.relationName);
174
+ if (!relation) {
175
+ const availableRelations = [...relationInfo.keys()].join(', ');
176
+ warnings.push({
177
+ message: `Relation '${node.relationName}' does not exist on model '${modelContext.modelName}'.${availableRelations ? ` Available relations: ${availableRelations}.` : ''}`,
178
+ start: node.relationStart,
179
+ end: node.relationEnd,
180
+ });
181
+ return;
182
+ }
183
+ // exists()/all() only make sense on reverse (1:many) relations
184
+ if (relation.direction === 'local') {
185
+ warnings.push({
186
+ message: `Relation '${node.relationName}' is a local (belongs-to) relation on model '${modelContext.modelName}'. exists()/all() require a reverse (has-many) relation.`,
187
+ start: node.relationStart,
188
+ end: node.relationEnd,
189
+ });
190
+ return;
191
+ }
192
+ // Validate condition fields exist on the foreign model
193
+ for (const condition of node.conditions) {
194
+ if (relation.foreignScalarFieldNames &&
195
+ !relation.foreignScalarFieldNames.has(condition.field)) {
196
+ const availableFields = [...relation.foreignScalarFieldNames].join(', ');
197
+ warnings.push({
198
+ message: `Field '${condition.field}' does not exist on model '${relation.foreignModelName}'.${availableFields ? ` Available fields: ${availableFields}.` : ''}`,
199
+ start: condition.fieldStart,
200
+ end: condition.fieldEnd,
201
+ });
202
+ }
203
+ // Validate field reference values (e.g., model.typo or invalid auth fields)
204
+ if (condition.value.type === 'fieldRef') {
205
+ validateFieldRef(condition.value);
206
+ }
207
+ // Type-check literal condition values against foreign field types
208
+ if (condition.value.type === 'literalValue' &&
209
+ relation.foreignFieldTypes) {
210
+ const foreignFieldType = relation.foreignFieldTypes.get(condition.field);
211
+ if (foreignFieldType) {
212
+ validateLiteralTypeCompatibility(condition.field, foreignFieldType, relation.foreignModelName, condition.value);
213
+ }
214
+ }
215
+ }
216
+ }
217
+ function validateLiteralTypeCompatibility(fieldName, fieldType, modelName, literalNode) {
218
+ const literalJsType = typeof literalNode.value;
219
+ const isCompatible = (() => {
220
+ switch (fieldType) {
221
+ case 'boolean': {
222
+ return literalJsType === 'boolean';
223
+ }
224
+ case 'int': {
225
+ return (typeof literalNode.value === 'number' &&
226
+ Number.isInteger(literalNode.value));
227
+ }
228
+ case 'float':
229
+ case 'decimal': {
230
+ return literalJsType === 'number';
231
+ }
232
+ case 'string':
233
+ case 'uuid':
234
+ case 'enum': {
235
+ return literalJsType === 'string';
236
+ }
237
+ default: {
238
+ return true;
239
+ }
240
+ }
241
+ })();
242
+ if (!isCompatible) {
243
+ warnings.push({
244
+ message: `Literal value type '${literalJsType}' is not compatible with field '${fieldName}' of type '${fieldType}' on model '${modelName}'.`,
245
+ start: literalNode.start,
246
+ end: literalNode.end,
247
+ });
248
+ }
249
+ }
250
+ function validateFieldRef(node) {
251
+ if (node.source === 'model') {
252
+ // Check if field exists on model
253
+ if (!modelContext.scalarFieldNames.has(node.field)) {
254
+ warnings.push({
255
+ message: `Field '${node.field}' does not exist on model '${modelContext.modelName}'.`,
256
+ start: node.start,
257
+ end: node.end,
258
+ });
259
+ }
260
+ }
261
+ else if (!VALID_AUTH_FIELDS.has(node.field)) {
262
+ // node.source === 'auth' is implied since source is 'model' | 'auth'
263
+ warnings.push({
264
+ message: `Invalid auth property '${node.field}'. Valid properties are: ${[...VALID_AUTH_FIELDS].join(', ')}.`,
265
+ start: node.start,
266
+ end: node.end,
267
+ });
268
+ }
269
+ }
270
+ visitAuthorizerExpression(ast, validationVisitor);
271
+ return warnings;
272
+ }
273
+ /**
274
+ * Build authorizer role info (role names) from a model.
275
+ */
276
+ function buildAuthorizerRoleNames(model) {
277
+ const names = new Set();
278
+ if (model.authorizer?.roles) {
279
+ for (const role of model.authorizer.roles) {
280
+ names.add(role.name);
281
+ }
282
+ }
283
+ return names;
284
+ }
285
+ /**
286
+ * Build scalar field info (names + types) from a model.
287
+ */
288
+ function getModelFields(model) {
289
+ // Fields can be at top level (raw JSON) or nested under model (typed ModelConfig)
290
+ return model.fields ?? model.model?.fields ?? [];
291
+ }
292
+ function buildFieldInfo(model) {
293
+ const fieldNames = new Set();
294
+ const fieldTypes = new Map();
295
+ for (const field of getModelFields(model)) {
296
+ fieldNames.add(field.name);
297
+ if (field.type) {
298
+ fieldTypes.set(field.name, field.type);
299
+ }
300
+ }
301
+ return {
302
+ foreignScalarFieldNames: fieldNames.size > 0 ? fieldNames : undefined,
303
+ foreignFieldTypes: fieldTypes.size > 0 ? fieldTypes : undefined,
304
+ };
305
+ }
306
+ /**
307
+ * Build complete model expression context from a model and all project models.
308
+ *
309
+ * This is the primary entry point for building validation and autocomplete context.
310
+ * It discovers both local relations (FK on this model) and foreign/reverse relations
311
+ * (FK on other models pointing to this model) for use with `hasRole()`, `exists()`, `all()`, etc.
312
+ *
313
+ * @param model - The current model (structural typing: works with both typed ModelConfig and raw JSON)
314
+ * @param allModels - All models in the project
315
+ * @returns Complete model validation context including all relations
316
+ */
317
+ export function buildModelExpressionContext(model, allModels) {
318
+ // Build scalar field info for the current model
319
+ const scalarFieldNames = new Set();
320
+ const fieldTypes = new Map();
321
+ for (const field of getModelFields(model)) {
322
+ scalarFieldNames.add(field.name);
323
+ if (field.type) {
324
+ fieldTypes.set(field.name, field.type);
325
+ }
326
+ }
327
+ // Build lookups by both id and name for flexible matching
328
+ const modelsById = new Map(allModels
329
+ .filter((m) => m.id != null)
330
+ .map((m) => [m.id, m]));
331
+ const modelsByName = new Map(allModels.map((m) => [m.name, m]));
332
+ function lookupModel(ref) {
333
+ return modelsById.get(ref) ?? modelsByName.get(ref);
334
+ }
335
+ const relationInfo = new Map();
336
+ // 1. Local relations (FK on this model) — used by hasRole(model.relation, 'role')
337
+ for (const relation of model.model?.relations ?? []) {
338
+ const foreignModel = lookupModel(relation.modelRef);
339
+ relationInfo.set(relation.name, {
340
+ referenceCount: relation.references?.length ?? 0,
341
+ foreignModelName: foreignModel?.name ?? relation.modelRef,
342
+ foreignAuthorizerRoleNames: foreignModel
343
+ ? buildAuthorizerRoleNames(foreignModel)
344
+ : new Set(),
345
+ ...(foreignModel ? buildFieldInfo(foreignModel) : {}),
346
+ direction: 'local',
347
+ });
348
+ }
349
+ // 2. Foreign/reverse relations (FK on other models pointing to this model)
350
+ // Used by exists(model.members, { ... }) and all(model.tasks, { ... })
351
+ const currentModelId = model.id ?? model.name;
352
+ for (const otherModel of allModels) {
353
+ for (const rel of otherModel.model?.relations ?? []) {
354
+ if (rel.modelRef !== currentModelId || !rel.foreignRelationName) {
355
+ continue;
356
+ }
357
+ // Skip if a local relation already has this name
358
+ if (relationInfo.has(rel.foreignRelationName)) {
359
+ continue;
360
+ }
361
+ // For foreign relations, the "foreign model" (for field/role validation)
362
+ // is the OTHER model that has the FK
363
+ relationInfo.set(rel.foreignRelationName, {
364
+ referenceCount: rel.references?.length ?? 0,
365
+ foreignModelName: otherModel.name,
366
+ foreignAuthorizerRoleNames: buildAuthorizerRoleNames(otherModel),
367
+ ...buildFieldInfo(otherModel),
368
+ direction: 'foreign',
369
+ });
370
+ }
371
+ }
372
+ return {
373
+ modelName: model.name,
374
+ scalarFieldNames,
375
+ fieldTypes,
376
+ relationInfo,
377
+ };
378
+ }
379
+ //# sourceMappingURL=authorizer-expression-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorizer-expression-validator.js","sourceRoot":"","sources":["../../../src/expression-parsers/authorizer/authorizer-expression-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Visitor pattern for traversing authorizer expression ASTs.
3
+ *
4
+ * Provides a type-safe way to implement operations over all expression
5
+ * node types without writing switch statements. Each new operation
6
+ * (code generation, validation, info extraction) implements the visitor
7
+ * interface and is dispatched by `visitAuthorizerExpression`.
8
+ */
9
+ import type { AuthorizerExpressionNode, BinaryLogicalNode, FieldComparisonNode, HasRoleNode, HasSomeRoleNode, IsAuthenticatedNode, NestedHasRoleNode, NestedHasSomeRoleNode, RelationFilterNode } from './authorizer-expression-ast.js';
10
+ /**
11
+ * Visitor interface for authorizer expression AST nodes.
12
+ *
13
+ * Each method handles one node type and returns `TResult`.
14
+ * The `binaryLogical` method receives a `visit` callback to
15
+ * recursively process child nodes.
16
+ *
17
+ * @typeParam TResult - The return type of each visitor method
18
+ * @typeParam TContext - Optional context passed to each method
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const printer: AuthorizerExpressionVisitor<string> = {
23
+ * fieldComparison: (node) => `${node.left} ${node.operator} ${node.right}`,
24
+ * hasRole: (node) => `hasRole('${node.role}')`,
25
+ * // ...
26
+ * };
27
+ * const result = visitAuthorizerExpression(ast, printer);
28
+ * ```
29
+ */
30
+ export interface AuthorizerExpressionVisitor<TResult, TContext = undefined> {
31
+ fieldComparison(node: FieldComparisonNode, ctx: TContext): TResult;
32
+ hasRole(node: HasRoleNode, ctx: TContext): TResult;
33
+ hasSomeRole(node: HasSomeRoleNode, ctx: TContext): TResult;
34
+ nestedHasRole(node: NestedHasRoleNode, ctx: TContext): TResult;
35
+ nestedHasSomeRole(node: NestedHasSomeRoleNode, ctx: TContext): TResult;
36
+ relationFilter(node: RelationFilterNode, ctx: TContext): TResult;
37
+ isAuthenticated(node: IsAuthenticatedNode, ctx: TContext): TResult;
38
+ binaryLogical(node: BinaryLogicalNode, ctx: TContext, visit: (child: AuthorizerExpressionNode) => TResult): TResult;
39
+ }
40
+ /**
41
+ * Walk an authorizer expression AST, dispatching each node to the
42
+ * corresponding visitor method.
43
+ *
44
+ * The `binaryLogical` visitor method receives a bound `visit` callback
45
+ * so it can recursively process `node.left` and `node.right` without
46
+ * needing direct access to the walker.
47
+ *
48
+ * @param node - The AST node to visit
49
+ * @param visitor - The visitor implementation
50
+ * @param ctx - Context passed to every visitor method
51
+ * @returns The result of visiting the root node
52
+ */
53
+ export declare function visitAuthorizerExpression<TResult, TContext = undefined>(node: AuthorizerExpressionNode, visitor: AuthorizerExpressionVisitor<TResult, TContext>, ...args: TContext extends undefined ? [] : [ctx: TContext]): TResult;
54
+ //# sourceMappingURL=authorizer-expression-visitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorizer-expression-visitor.d.ts","sourceRoot":"","sources":["../../../src/expression-parsers/authorizer/authorizer-expression-visitor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AAExC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,2BAA2B,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS;IACxE,eAAe,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC;IACnE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC;IACnD,WAAW,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC3D,aAAa,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC/D,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC;IACvE,cAAc,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC;IACjE,eAAe,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC;IACnE,aAAa,CACX,IAAI,EAAE,iBAAiB,EACvB,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,OAAO,GAClD,OAAO,CAAC;CACZ;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,EACrE,IAAI,EAAE,wBAAwB,EAC9B,OAAO,EAAE,2BAA2B,CAAC,OAAO,EAAE,QAAQ,CAAC,EACvD,GAAG,IAAI,EAAE,QAAQ,SAAS,SAAS,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,GACzD,OAAO,CA+BT"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Visitor pattern for traversing authorizer expression ASTs.
3
+ *
4
+ * Provides a type-safe way to implement operations over all expression
5
+ * node types without writing switch statements. Each new operation
6
+ * (code generation, validation, info extraction) implements the visitor
7
+ * interface and is dispatched by `visitAuthorizerExpression`.
8
+ */
9
+ /**
10
+ * Walk an authorizer expression AST, dispatching each node to the
11
+ * corresponding visitor method.
12
+ *
13
+ * The `binaryLogical` visitor method receives a bound `visit` callback
14
+ * so it can recursively process `node.left` and `node.right` without
15
+ * needing direct access to the walker.
16
+ *
17
+ * @param node - The AST node to visit
18
+ * @param visitor - The visitor implementation
19
+ * @param ctx - Context passed to every visitor method
20
+ * @returns The result of visiting the root node
21
+ */
22
+ export function visitAuthorizerExpression(node, visitor, ...args) {
23
+ const ctx = args[0];
24
+ const visit = (child) => visitAuthorizerExpression(child, visitor, ...args);
25
+ switch (node.type) {
26
+ case 'fieldComparison': {
27
+ return visitor.fieldComparison(node, ctx);
28
+ }
29
+ case 'hasRole': {
30
+ return visitor.hasRole(node, ctx);
31
+ }
32
+ case 'hasSomeRole': {
33
+ return visitor.hasSomeRole(node, ctx);
34
+ }
35
+ case 'nestedHasRole': {
36
+ return visitor.nestedHasRole(node, ctx);
37
+ }
38
+ case 'nestedHasSomeRole': {
39
+ return visitor.nestedHasSomeRole(node, ctx);
40
+ }
41
+ case 'relationFilter': {
42
+ return visitor.relationFilter(node, ctx);
43
+ }
44
+ case 'isAuthenticated': {
45
+ return visitor.isAuthenticated(node, ctx);
46
+ }
47
+ case 'binaryLogical': {
48
+ return visitor.binaryLogical(node, ctx, visit);
49
+ }
50
+ }
51
+ }
52
+ //# sourceMappingURL=authorizer-expression-visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorizer-expression-visitor.js","sourceRoot":"","sources":["../../../src/expression-parsers/authorizer/authorizer-expression-visitor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiDH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAA8B,EAC9B,OAAuD,EACvD,GAAG,IAAuD;IAE1D,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAa,CAAC;IAChC,MAAM,KAAK,GAAG,CAAC,KAA+B,EAAW,EAAE,CACzD,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAErD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,OAAO,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,OAAO,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,OAAO,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './authorizer-expression-acorn-parser.js';
2
+ export * from './authorizer-expression-ast.js';
3
+ export * from './authorizer-expression-parser.js';
4
+ export * from './authorizer-expression-validator.js';
5
+ export * from './authorizer-expression-visitor.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/expression-parsers/authorizer/index.ts"],"names":[],"mappings":"AAAA,cAAc,yCAAyC,CAAC;AACxD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './authorizer-expression-acorn-parser.js';
2
+ export * from './authorizer-expression-ast.js';
3
+ export * from './authorizer-expression-parser.js';
4
+ export * from './authorizer-expression-validator.js';
5
+ export * from './authorizer-expression-visitor.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/expression-parsers/authorizer/index.ts"],"names":[],"mappings":"AAAA,cAAc,yCAAyC,CAAC;AACxD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { PluginModuleWithKey } from '#src/plugins/imports/types.js';
2
+ /**
3
+ * Core module with key for inclusion in PluginStore.coreModules.
4
+ */
5
+ export declare const expressionParserCoreModule: PluginModuleWithKey;
6
+ //# sourceMappingURL=register-core-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-core-module.d.ts","sourceRoot":"","sources":["../../src/expression-parsers/register-core-module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAyBzE;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE,mBAIxC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { createPluginModule } from '#src/plugins/imports/types.js';
2
+ import { expressionParserSpec } from '../references/expression-parser-spec.js';
3
+ import { AuthorizerExpressionParser } from './authorizer/authorizer-expression-parser.js';
4
+ /**
5
+ * Core module that registers built-in expression parsers.
6
+ *
7
+ * This module is included in every consumer's coreModules array
8
+ * (server, web, CLI, tests) to ensure the authorizer expression parser
9
+ * is available for schemas that use `withExpression(authorizerExpressionRef, ...)`.
10
+ */
11
+ const registerExpressionParsersModule = createPluginModule({
12
+ name: 'register-expression-parsers',
13
+ dependencies: {
14
+ expressionParsers: expressionParserSpec,
15
+ },
16
+ initialize: ({ expressionParsers }) => {
17
+ const parser = new AuthorizerExpressionParser();
18
+ expressionParsers.parsers.set(parser.name, parser);
19
+ },
20
+ });
21
+ /**
22
+ * Core module with key for inclusion in PluginStore.coreModules.
23
+ */
24
+ export const expressionParserCoreModule = {
25
+ key: 'core/lib/expression-parsers',
26
+ pluginKey: 'core',
27
+ module: registerExpressionParsersModule,
28
+ };
29
+ //# sourceMappingURL=register-core-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-core-module.js","sourceRoot":"","sources":["../../src/expression-parsers/register-core-module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAE1F;;;;;;GAMG;AACH,MAAM,+BAA+B,GAAG,kBAAkB,CAAC;IACzD,IAAI,EAAE,6BAA6B;IACnC,YAAY,EAAE;QACZ,iBAAiB,EAAE,oBAAoB;KACxC;IACD,UAAU,EAAE,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,0BAA0B,EAAE,CAAC;QAChD,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAwB;IAC7D,GAAG,EAAE,6BAA6B;IAClC,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,+BAA+B;CACxC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './compiler/index.js';
2
2
  export * from './constants/index.js';
3
3
  export * from './definition/index.js';
4
+ export { expressionParserCoreModule } from './expression-parsers/register-core-module.js';
4
5
  export * from './feature-flags/index.js';
5
6
  export * from './migrations/index.js';
6
7
  export * from './parser/index.js';
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './compiler/index.js';
2
2
  export * from './constants/index.js';
3
3
  export * from './definition/index.js';
4
+ export { expressionParserCoreModule } from './expression-parsers/register-core-module.js';
4
5
  export * from './feature-flags/index.js';
5
6
  export * from './migrations/index.js';
6
7
  export * from './parser/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA2BlD,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAyB9C,CAAC;AAEF,wBAAgB,8BAA8B,CAC5C,iBAAiB,EAAE,OAAO,GACzB,iBAAiB,IAAI,iBAAiB,CAMxC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAgB,aAAa,EAAE,MAAM,CAAC;IACtC,SAAgB,KAAK,EAAE,OAAO,CAAC;gBAEnB,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAQlD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG;IAC9D,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,iBAAiB,EAAE,eAAe,EAAE,CAAC;CACtC,CAoBA;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAElD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA8BlD,eAAO,MAAM,iBAAiB,EAAE,eAAe,EA4B9C,CAAC;AAEF,wBAAgB,8BAA8B,CAC5C,iBAAiB,EAAE,OAAO,GACzB,iBAAiB,IAAI,iBAAiB,CAMxC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAgB,aAAa,EAAE,MAAM,CAAC;IACtC,SAAgB,KAAK,EAAE,OAAO,CAAC;gBAEnB,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAQlD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG;IAC9D,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,iBAAiB,EAAE,eAAe,EAAE,CAAC;CACtC,CAoBA;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAElD"}
@@ -22,6 +22,9 @@ import { migration025ServiceMethodAuth } from './migration-025-service-method-au
22
22
  import { migration026QuerySharedRoles } from './migration-026-query-shared-roles.js';
23
23
  import { migration027EnableSentryPlugin } from './migration-027-enable-sentry-plugin.js';
24
24
  import { migration028EnableStripePlugin } from './migration-028-enable-stripe-plugin.js';
25
+ import { migration029AdminRoleAndAutoAssigned } from './migration-029-admin-role-and-auto-assigned.js';
26
+ import { migration030RemoveThemeHoverColors } from './migration-030-remove-theme-hover-colors.js';
27
+ import { migration031UuidDefaultGeneration } from './migration-031-uuid-default-generation.js';
25
28
  export const SCHEMA_MIGRATIONS = [
26
29
  migration005PrimaryUniqueRefs,
27
30
  migration006IndividualServiceControllers,
@@ -47,6 +50,9 @@ export const SCHEMA_MIGRATIONS = [
47
50
  migration026QuerySharedRoles,
48
51
  migration027EnableSentryPlugin,
49
52
  migration028EnableStripePlugin,
53
+ migration029AdminRoleAndAutoAssigned,
54
+ migration030RemoveThemeHoverColors,
55
+ migration031UuidDefaultGeneration,
50
56
  ];
51
57
  export function isMigrateableProjectDefinition(projectDefinition) {
52
58
  return (typeof projectDefinition === 'object' &&
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,wCAAwC,EAAE,MAAM,mDAAmD,CAAC;AAC7G,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,+BAA+B,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,+BAA+B,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,qCAAqC,EAAE,MAAM,iDAAiD,CAAC;AACxG,OAAO,EAAE,iCAAiC,EAAE,MAAM,6CAA6C,CAAC;AAChG,OAAO,EAAE,qCAAqC,EAAE,MAAM,iDAAiD,CAAC;AACxG,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,sCAAsC,EAAE,MAAM,mDAAmD,CAAC;AAC3G,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAEzF,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,6BAA6B;IAC7B,wCAAwC;IACxC,wBAAwB;IACxB,+BAA+B;IAC/B,sBAAsB;IACtB,sBAAsB;IACtB,oBAAoB;IACpB,6BAA6B;IAC7B,+BAA+B;IAC/B,4BAA4B;IAC5B,0BAA0B;IAC1B,0BAA0B;IAC1B,4BAA4B;IAC5B,4BAA4B;IAC5B,2BAA2B;IAC3B,qCAAqC;IACrC,iCAAiC;IACjC,qCAAqC;IACrC,0BAA0B;IAC1B,sCAAsC;IACtC,6BAA6B;IAC7B,4BAA4B;IAC5B,8BAA8B;IAC9B,8BAA8B;CAC/B,CAAC;AAEF,MAAM,UAAU,8BAA8B,CAC5C,iBAA0B;IAE1B,OAAO,CACL,OAAO,iBAAiB,KAAK,QAAQ;QACrC,CAAC,CAAC,iBAAiB;QACnB,eAAe,IAAI,iBAAiB,CACrC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7B,aAAa,CAAS;IACtB,KAAK,CAAU;IAE/B,YAAY,aAAqB,EAAE,KAAc;QAC/C,KAAK,CACH,oBAAoB,aAAa,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAyB;IAI3D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IAEjC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,MAAM,CAClD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,aAAa,CACjC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,kBAAkB,GAAG,MAAM,CAAC;IAChC,KAAK,MAAM,SAAS,IAAI,mBAAmB,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,kBAAkB,GAAG;gBACnB,GAAI,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAuB;gBAC/D,aAAa,EAAE,SAAS,CAAC,OAAO;aACjC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,oBAAoB,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,OAAO,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"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"}