@baseplate-dev/project-builder-lib 0.6.3 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/dist/compiler/admin-crud-action-compiler.js +1 -1
- package/dist/compiler/admin-crud-action-compiler.js.map +1 -1
- package/dist/compiler/admin-crud-column-compiler-spec.js +1 -1
- package/dist/compiler/admin-crud-column-compiler-spec.js.map +1 -1
- package/dist/compiler/admin-crud-input-spec.js +1 -1
- package/dist/compiler/admin-crud-input-spec.js.map +1 -1
- package/dist/compiler/app-compiler-spec.js +1 -1
- package/dist/compiler/app-compiler-spec.js.map +1 -1
- package/dist/compiler/index.d.ts +1 -0
- package/dist/compiler/index.d.ts.map +1 -1
- package/dist/compiler/index.js +1 -0
- package/dist/compiler/index.js.map +1 -1
- package/dist/compiler/model-transformer-compiler-spec.js +1 -1
- package/dist/compiler/model-transformer-compiler-spec.js.map +1 -1
- package/dist/compiler/root-compiler-spec.d.ts +25 -0
- package/dist/compiler/root-compiler-spec.d.ts.map +1 -0
- package/dist/compiler/root-compiler-spec.js +23 -0
- package/dist/compiler/root-compiler-spec.js.map +1 -0
- package/dist/constants/theme-colors.d.ts +0 -48
- package/dist/constants/theme-colors.d.ts.map +1 -1
- package/dist/constants/theme-colors.js +0 -32
- package/dist/constants/theme-colors.js.map +1 -1
- package/dist/definition/feature/feature-utils.d.ts +9 -3
- package/dist/definition/feature/feature-utils.d.ts.map +1 -1
- package/dist/definition/feature/feature-utils.js +30 -2
- package/dist/definition/feature/feature-utils.js.map +1 -1
- package/dist/definition/plugins/plugin-utils.d.ts +15 -0
- package/dist/definition/plugins/plugin-utils.d.ts.map +1 -1
- package/dist/definition/plugins/plugin-utils.js +50 -1
- package/dist/definition/plugins/plugin-utils.js.map +1 -1
- package/dist/definition/project-definition-container.d.ts.map +1 -1
- package/dist/definition/project-definition-container.js +3 -1
- package/dist/definition/project-definition-container.js.map +1 -1
- package/dist/{schema/models → expression-parsers}/authorizer/authorizer-expression-acorn-parser.d.ts +2 -0
- package/dist/expression-parsers/authorizer/authorizer-expression-acorn-parser.d.ts.map +1 -0
- package/dist/{schema/models → expression-parsers}/authorizer/authorizer-expression-acorn-parser.js +107 -52
- package/dist/expression-parsers/authorizer/authorizer-expression-acorn-parser.js.map +1 -0
- package/dist/{schema/models → expression-parsers}/authorizer/authorizer-expression-ast.d.ts +69 -1
- package/dist/expression-parsers/authorizer/authorizer-expression-ast.d.ts.map +1 -0
- package/dist/{schema/models → expression-parsers}/authorizer/authorizer-expression-ast.js +2 -0
- package/dist/expression-parsers/authorizer/authorizer-expression-ast.js.map +1 -0
- package/dist/{schema/models → expression-parsers}/authorizer/authorizer-expression-parser.d.ts +13 -14
- package/dist/expression-parsers/authorizer/authorizer-expression-parser.d.ts.map +1 -0
- package/dist/expression-parsers/authorizer/authorizer-expression-parser.js +292 -0
- package/dist/expression-parsers/authorizer/authorizer-expression-parser.js.map +1 -0
- package/dist/{schema/models → expression-parsers}/authorizer/authorizer-expression-validator.d.ts +37 -17
- package/dist/expression-parsers/authorizer/authorizer-expression-validator.d.ts.map +1 -0
- package/dist/expression-parsers/authorizer/authorizer-expression-validator.js +379 -0
- package/dist/expression-parsers/authorizer/authorizer-expression-validator.js.map +1 -0
- package/dist/expression-parsers/authorizer/authorizer-expression-visitor.d.ts +54 -0
- package/dist/expression-parsers/authorizer/authorizer-expression-visitor.d.ts.map +1 -0
- package/dist/expression-parsers/authorizer/authorizer-expression-visitor.js +52 -0
- package/dist/expression-parsers/authorizer/authorizer-expression-visitor.js.map +1 -0
- package/dist/expression-parsers/authorizer/index.d.ts +6 -0
- package/dist/expression-parsers/authorizer/index.d.ts.map +1 -0
- package/dist/expression-parsers/authorizer/index.js +6 -0
- package/dist/expression-parsers/authorizer/index.js.map +1 -0
- package/dist/expression-parsers/register-core-module.d.ts +6 -0
- package/dist/expression-parsers/register-core-module.d.ts.map +1 -0
- package/dist/expression-parsers/register-core-module.js +29 -0
- package/dist/expression-parsers/register-core-module.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +6 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/migration-029-admin-role-and-auto-assigned.d.ts +25 -0
- package/dist/migrations/migration-029-admin-role-and-auto-assigned.d.ts.map +1 -0
- package/dist/migrations/migration-029-admin-role-and-auto-assigned.js +72 -0
- package/dist/migrations/migration-029-admin-role-and-auto-assigned.js.map +1 -0
- package/dist/migrations/migration-030-remove-theme-hover-colors.d.ts +17 -0
- package/dist/migrations/migration-030-remove-theme-hover-colors.d.ts.map +1 -0
- package/dist/migrations/migration-030-remove-theme-hover-colors.js +41 -0
- package/dist/migrations/migration-030-remove-theme-hover-colors.js.map +1 -0
- package/dist/migrations/migration-031-uuid-default-generation.d.ts +24 -0
- package/dist/migrations/migration-031-uuid-default-generation.d.ts.map +1 -0
- package/dist/migrations/migration-031-uuid-default-generation.js +40 -0
- package/dist/migrations/migration-031-uuid-default-generation.js.map +1 -0
- package/dist/migrations/transform-json-path.d.ts.map +1 -1
- package/dist/migrations/transform-json-path.js +2 -3
- package/dist/migrations/transform-json-path.js.map +1 -1
- package/dist/parser/collect-definition-issues.d.ts.map +1 -1
- package/dist/parser/collect-definition-issues.js +10 -2
- package/dist/parser/collect-definition-issues.js.map +1 -1
- package/dist/parser/collect-expression-issues.d.ts +17 -9
- package/dist/parser/collect-expression-issues.d.ts.map +1 -1
- package/dist/parser/collect-expression-issues.js +21 -15
- package/dist/parser/collect-expression-issues.js.map +1 -1
- package/dist/parser/definition-issue-checkers/plugin-dependency-checker.d.ts +11 -0
- package/dist/parser/definition-issue-checkers/plugin-dependency-checker.d.ts.map +1 -0
- package/dist/parser/definition-issue-checkers/plugin-dependency-checker.js +41 -0
- package/dist/parser/definition-issue-checkers/plugin-dependency-checker.js.map +1 -0
- package/dist/parser/definition-issue-checkers/plugin-implementation-checker.d.ts +16 -0
- package/dist/parser/definition-issue-checkers/plugin-implementation-checker.d.ts.map +1 -0
- package/dist/parser/definition-issue-checkers/plugin-implementation-checker.js +69 -0
- package/dist/parser/definition-issue-checkers/plugin-implementation-checker.js.map +1 -0
- package/dist/parser/definition-issue-utils.d.ts +28 -1
- package/dist/parser/definition-issue-utils.d.ts.map +1 -1
- package/dist/parser/definition-issue-utils.js +59 -0
- package/dist/parser/definition-issue-utils.js.map +1 -1
- package/dist/parser/find-orphaned-union-items.d.ts +30 -0
- package/dist/parser/find-orphaned-union-items.d.ts.map +1 -0
- package/dist/parser/find-orphaned-union-items.js +47 -0
- package/dist/parser/find-orphaned-union-items.js.map +1 -0
- package/dist/parser/index.d.ts +3 -1
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +3 -1
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/parser.js +3 -0
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/transform-data-with-schema.js +1 -1
- package/dist/parser/transform-data-with-schema.js.map +1 -1
- package/dist/plugins/imports/index.d.ts +1 -0
- package/dist/plugins/imports/index.d.ts.map +1 -1
- package/dist/plugins/imports/index.js +1 -0
- package/dist/plugins/imports/index.js.map +1 -1
- package/dist/plugins/imports/validate-plugin-dependencies.d.ts +42 -0
- package/dist/plugins/imports/validate-plugin-dependencies.d.ts.map +1 -0
- package/dist/plugins/imports/validate-plugin-dependencies.js +80 -0
- package/dist/plugins/imports/validate-plugin-dependencies.js.map +1 -0
- package/dist/plugins/metadata/types.d.ts +13 -0
- package/dist/plugins/metadata/types.d.ts.map +1 -1
- package/dist/plugins/metadata/types.js +15 -0
- package/dist/plugins/metadata/types.js.map +1 -1
- package/dist/plugins/spec/auth-config-spec.d.ts +1 -0
- package/dist/plugins/spec/auth-config-spec.d.ts.map +1 -1
- package/dist/plugins/spec/auth-config-spec.js.map +1 -1
- package/dist/references/definition-ref-builder.d.ts +2 -0
- package/dist/references/definition-ref-builder.d.ts.map +1 -1
- package/dist/references/definition-ref-registry.d.ts +2 -0
- package/dist/references/definition-ref-registry.d.ts.map +1 -1
- package/dist/references/definition-ref-registry.js.map +1 -1
- package/dist/references/expression-parser-ref.d.ts +51 -0
- package/dist/references/expression-parser-ref.d.ts.map +1 -0
- package/dist/references/expression-parser-ref.js +14 -0
- package/dist/references/expression-parser-ref.js.map +1 -0
- package/dist/references/expression-parser-spec.d.ts +29 -0
- package/dist/references/expression-parser-spec.d.ts.map +1 -0
- package/dist/references/expression-parser-spec.js +29 -0
- package/dist/references/expression-parser-spec.js.map +1 -0
- package/dist/references/expression-types.d.ts +20 -22
- package/dist/references/expression-types.d.ts.map +1 -1
- package/dist/references/expression-types.js +1 -2
- package/dist/references/expression-types.js.map +1 -1
- package/dist/references/extend-parser-context-with-refs.d.ts +7 -2
- package/dist/references/extend-parser-context-with-refs.d.ts.map +1 -1
- package/dist/references/extend-parser-context-with-refs.js +42 -12
- package/dist/references/extend-parser-context-with-refs.js.map +1 -1
- package/dist/references/extract-definition-refs.js +1 -1
- package/dist/references/extract-definition-refs.js.map +1 -1
- package/dist/references/fix-definition-refs.d.ts +22 -0
- package/dist/references/fix-definition-refs.d.ts.map +1 -0
- package/dist/references/fix-definition-refs.js +29 -0
- package/dist/references/fix-definition-refs.js.map +1 -0
- package/dist/references/fix-expression-renames.d.ts +20 -0
- package/dist/references/fix-expression-renames.d.ts.map +1 -0
- package/dist/references/fix-expression-renames.js +87 -0
- package/dist/references/fix-expression-renames.js.map +1 -0
- package/dist/references/index.d.ts +4 -0
- package/dist/references/index.d.ts.map +1 -1
- package/dist/references/index.js +4 -0
- package/dist/references/index.js.map +1 -1
- package/dist/references/parse-schema-with-references.d.ts +2 -1
- package/dist/references/parse-schema-with-references.d.ts.map +1 -1
- package/dist/references/parse-schema-with-references.js.map +1 -1
- package/dist/schema/apps/web/admin/sections/crud.d.ts.map +1 -1
- package/dist/schema/apps/web/admin/sections/crud.js +3 -2
- package/dist/schema/apps/web/admin/sections/crud.js.map +1 -1
- package/dist/schema/creator/definition-issue-checkers.d.ts +15 -0
- package/dist/schema/creator/definition-issue-checkers.d.ts.map +1 -1
- package/dist/schema/creator/definition-issue-checkers.js +33 -0
- package/dist/schema/creator/definition-issue-checkers.js.map +1 -1
- package/dist/schema/creator/schema-creator.js +1 -1
- package/dist/schema/creator/schema-creator.js.map +1 -1
- package/dist/schema/features/feature.js +1 -1
- package/dist/schema/features/feature.js.map +1 -1
- package/dist/schema/libraries/library.d.ts.map +1 -1
- package/dist/schema/libraries/library.js +1 -0
- package/dist/schema/libraries/library.js.map +1 -1
- package/dist/schema/models/authorizer/authorizer-expression-ref.d.ts +11 -0
- package/dist/schema/models/authorizer/authorizer-expression-ref.d.ts.map +1 -0
- package/dist/schema/models/authorizer/authorizer-expression-ref.js +10 -0
- package/dist/schema/models/authorizer/authorizer-expression-ref.js.map +1 -0
- package/dist/schema/models/authorizer/authorizer.js +2 -2
- package/dist/schema/models/authorizer/authorizer.js.map +1 -1
- package/dist/schema/models/authorizer/index.d.ts +1 -4
- package/dist/schema/models/authorizer/index.d.ts.map +1 -1
- package/dist/schema/models/authorizer/index.js +1 -4
- package/dist/schema/models/authorizer/index.js.map +1 -1
- package/dist/schema/models/enums.d.ts +12 -0
- package/dist/schema/models/enums.d.ts.map +1 -1
- package/dist/schema/models/enums.js +5 -2
- package/dist/schema/models/enums.js.map +1 -1
- package/dist/schema/models/graphql.js +3 -3
- package/dist/schema/models/graphql.js.map +1 -1
- package/dist/schema/models/models.d.ts +24 -36
- package/dist/schema/models/models.d.ts.map +1 -1
- package/dist/schema/models/models.js +7 -5
- package/dist/schema/models/models.js.map +1 -1
- package/dist/schema/plugins/definition.d.ts.map +1 -1
- package/dist/schema/plugins/definition.js +2 -0
- package/dist/schema/plugins/definition.js.map +1 -1
- package/dist/schema/project-definition.d.ts +14 -22
- package/dist/schema/project-definition.d.ts.map +1 -1
- package/dist/schema/project-definition.js +5 -1
- package/dist/schema/project-definition.js.map +1 -1
- package/dist/schema/settings/settings.d.ts +2 -10
- package/dist/schema/settings/settings.d.ts.map +1 -1
- package/dist/schema/settings/theme.d.ts +3 -15
- package/dist/schema/settings/theme.d.ts.map +1 -1
- package/dist/schema/utils/validation.d.ts.map +1 -1
- package/dist/schema/utils/validation.js +16 -3
- package/dist/schema/utils/validation.js.map +1 -1
- package/dist/specs/packages/library-type-spec.d.ts +4 -0
- package/dist/specs/packages/library-type-spec.d.ts.map +1 -1
- package/dist/specs/packages/library-type-spec.js +2 -2
- package/dist/specs/packages/library-type-spec.js.map +1 -1
- package/dist/testing/definition-helpers.test-helper.js +2 -2
- package/dist/testing/definition-helpers.test-helper.js.map +1 -1
- package/dist/testing/expression-stub-parser.test-helper.d.ts +2 -4
- package/dist/testing/expression-stub-parser.test-helper.d.ts.map +1 -1
- package/dist/testing/expression-stub-parser.test-helper.js +2 -10
- package/dist/testing/expression-stub-parser.test-helper.js.map +1 -1
- package/dist/testing/expression-warning-parser.test-helper.d.ts +2 -4
- package/dist/testing/expression-warning-parser.test-helper.d.ts.map +1 -1
- package/dist/testing/expression-warning-parser.test-helper.js +2 -8
- package/dist/testing/expression-warning-parser.test-helper.js.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/parser-context.test-helper.d.ts.map +1 -1
- package/dist/testing/parser-context.test-helper.js +2 -1
- package/dist/testing/parser-context.test-helper.js.map +1 -1
- package/dist/testing/plugin-store.test-helper.d.ts +11 -0
- package/dist/testing/plugin-store.test-helper.d.ts.map +1 -0
- package/dist/testing/plugin-store.test-helper.js +32 -0
- package/dist/testing/plugin-store.test-helper.js.map +1 -0
- package/dist/testing/project-definition-container.test-helper.d.ts.map +1 -1
- package/dist/testing/project-definition-container.test-helper.js +2 -1
- package/dist/testing/project-definition-container.test-helper.js.map +1 -1
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/sort-entity-arrays.d.ts +15 -0
- package/dist/tools/sort-entity-arrays.d.ts.map +1 -0
- package/dist/tools/sort-entity-arrays.js +31 -0
- package/dist/tools/sort-entity-arrays.js.map +1 -0
- package/dist/utils/color-conversions.d.ts +12 -0
- package/dist/utils/color-conversions.d.ts.map +1 -1
- package/dist/utils/color-conversions.js +17 -1
- package/dist/utils/color-conversions.js.map +1 -1
- package/dist/utils/color-names.d.ts.map +1 -1
- package/dist/utils/color-names.js +6 -5
- package/dist/utils/color-names.js.map +1 -1
- package/dist/utils/definition-diff/definition-diff.js +2 -2
- package/dist/utils/definition-diff/definition-diff.js.map +1 -1
- package/dist/utils/theme.d.ts +1 -0
- package/dist/utils/theme.d.ts.map +1 -1
- package/dist/utils/theme.js +18 -10
- package/dist/utils/theme.js.map +1 -1
- package/dist/web/components/definition-diff-alert.js +2 -2
- package/dist/web/components/definition-diff-alert.js.map +1 -1
- package/dist/web/components/feature-combobox-field.d.ts.map +1 -1
- package/dist/web/components/feature-combobox-field.js +5 -3
- package/dist/web/components/feature-combobox-field.js.map +1 -1
- package/dist/web/specs/admin-crud-action-web-spec.js +1 -1
- package/dist/web/specs/admin-crud-action-web-spec.js.map +1 -1
- package/dist/web/specs/admin-crud-column-web-spec.js +1 -1
- package/dist/web/specs/admin-crud-column-web-spec.js.map +1 -1
- package/dist/web/specs/admin-crud-input-web-spec.js +1 -1
- package/dist/web/specs/admin-crud-input-web-spec.js.map +1 -1
- package/dist/web/specs/model-transformer-web-spec.d.ts +19 -2
- package/dist/web/specs/model-transformer-web-spec.d.ts.map +1 -1
- package/dist/web/specs/model-transformer-web-spec.js +1 -1
- package/dist/web/specs/model-transformer-web-spec.js.map +1 -1
- package/package.json +8 -8
- package/dist/schema/models/authorizer/authorizer-expression-acorn-parser.d.ts.map +0 -1
- package/dist/schema/models/authorizer/authorizer-expression-acorn-parser.js.map +0 -1
- package/dist/schema/models/authorizer/authorizer-expression-ast.d.ts.map +0 -1
- package/dist/schema/models/authorizer/authorizer-expression-ast.js.map +0 -1
- package/dist/schema/models/authorizer/authorizer-expression-parser.d.ts.map +0 -1
- package/dist/schema/models/authorizer/authorizer-expression-parser.js +0 -145
- package/dist/schema/models/authorizer/authorizer-expression-parser.js.map +0 -1
- package/dist/schema/models/authorizer/authorizer-expression-validator.d.ts.map +0 -1
- package/dist/schema/models/authorizer/authorizer-expression-validator.js +0 -284
- 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;
|
|
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"}
|
package/dist/migrations/index.js
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"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"}
|