openxiangda-devkit-core 2.0.0-alpha.106 → 2.0.0-alpha.108

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 (53) hide show
  1. package/dist/application-services.d.ts +181 -1
  2. package/dist/application-services.d.ts.map +1 -1
  3. package/dist/application-services.js +33 -0
  4. package/dist/application-services.js.map +1 -1
  5. package/dist/application-ui-contract.d.ts +5 -0
  6. package/dist/application-ui-contract.d.ts.map +1 -0
  7. package/dist/application-ui-contract.js +149 -0
  8. package/dist/application-ui-contract.js.map +1 -0
  9. package/dist/command-registry.d.ts +2 -2
  10. package/dist/command-registry.js +1 -1
  11. package/dist/command-registry.js.map +1 -1
  12. package/dist/compiler/application-model.d.ts +60 -0
  13. package/dist/compiler/application-model.d.ts.map +1 -0
  14. package/dist/compiler/application-model.js +141 -0
  15. package/dist/compiler/application-model.js.map +1 -0
  16. package/dist/compiler/bundle.d.ts.map +1 -1
  17. package/dist/compiler/bundle.js +50 -12
  18. package/dist/compiler/bundle.js.map +1 -1
  19. package/dist/compiler/config.d.ts +27 -8
  20. package/dist/compiler/config.d.ts.map +1 -1
  21. package/dist/compiler/config.js +205 -61
  22. package/dist/compiler/config.js.map +1 -1
  23. package/dist/compiler/field-surface.js +1 -1
  24. package/dist/compiler/field-surface.js.map +1 -1
  25. package/dist/compiler/permission-review.d.ts +139 -0
  26. package/dist/compiler/permission-review.d.ts.map +1 -0
  27. package/dist/compiler/permission-review.js +131 -0
  28. package/dist/compiler/permission-review.js.map +1 -0
  29. package/dist/index.d.ts +4 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +4 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/optional-backend.d.ts +14 -0
  34. package/dist/optional-backend.d.ts.map +1 -0
  35. package/dist/optional-backend.js +145 -0
  36. package/dist/optional-backend.js.map +1 -0
  37. package/dist/workspace-loader.d.ts.map +1 -1
  38. package/dist/workspace-loader.js +16 -1
  39. package/dist/workspace-loader.js.map +1 -1
  40. package/package.json +3 -2
  41. package/templates/backend/.turbo/turbo-build.log +4 -0
  42. package/templates/backend/.turbo/turbo-check.log +4 -0
  43. package/templates/backend/.turbo/turbo-test.log +13 -0
  44. package/templates/backend/Dockerfile +20 -0
  45. package/templates/backend/node_modules/.bin/openxiangda +21 -0
  46. package/templates/backend/node_modules/.bin/tsc +21 -0
  47. package/templates/backend/node_modules/.bin/tsserver +21 -0
  48. package/templates/backend/node_modules/.bin/tsx +21 -0
  49. package/templates/backend/package.json +27 -0
  50. package/templates/backend/src/app.module.ts +23 -0
  51. package/templates/backend/src/main.ts +5 -0
  52. package/templates/backend/test/smoke.test.ts +17 -0
  53. package/templates/backend/tsconfig.json +9 -0
@@ -2,7 +2,7 @@ const WIDGETS_BY_TYPE = {
2
2
  'text.short': ['text', 'email', 'phone'],
3
3
  'text.long': ['textarea'],
4
4
  'text.rich': ['rich-text'],
5
- 'number.integer': ['number'],
5
+ 'number.integer': ['number', 'rating'],
6
6
  'number.decimal': ['number', 'money', 'percent'],
7
7
  boolean: ['switch'],
8
8
  date: ['date'],
@@ -1 +1 @@
1
- {"version":3,"file":"field-surface.js","sourceRoot":"","sources":["../../src/compiler/field-surface.ts"],"names":[],"mappings":"AASA,MAAM,eAAe,GAGjB;IACF,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;IACxC,WAAW,EAAE,CAAC,UAAU,CAAC;IACzB,WAAW,EAAE,CAAC,WAAW,CAAC;IAC1B,gBAAgB,EAAE,CAAC,QAAQ,CAAC;IAC5B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;IAChD,OAAO,EAAE,CAAC,QAAQ,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,gBAAgB,EAAE,CAAC,gBAAgB,CAAC;IACpC,eAAe,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IACpC,iBAAiB,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC;IAC/C,gBAAgB,EAAE,CAAC,SAAS,CAAC;IAC7B,kBAAkB,EAAE,CAAC,SAAS,CAAC;IAC/B,aAAa,EAAE,CAAC,gBAAgB,CAAC;IACjC,eAAe,EAAE,CAAC,gBAAgB,CAAC;IACnC,mBAAmB,EAAE,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACtD,qBAAqB,EAAE,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACxD,qBAAqB,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC;IACtD,uBAAuB,EAAE,CAAC,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC;IACjE,IAAI,EAAE,CAAC,YAAY,CAAC;IACpB,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,SAAS,EAAE,CAAC,WAAW,CAAC;IACxB,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,eAAe,EAAE,CAAC,UAAU,CAAC;IAC7B,QAAQ,EAAE,CAAC,UAAU,CAAC;CACvB,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,IAAiC;IACjE,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAA0B;IAChE,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAC3C,KAA0B;IAE1B,IAAI,KAAK,CAAC,MAAM,IAAI,uBAAuB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IACxE,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"field-surface.js","sourceRoot":"","sources":["../../src/compiler/field-surface.ts"],"names":[],"mappings":"AASA,MAAM,eAAe,GAGjB;IACF,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;IACxC,WAAW,EAAE,CAAC,UAAU,CAAC;IACzB,WAAW,EAAE,CAAC,WAAW,CAAC;IAC1B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACtC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;IAChD,OAAO,EAAE,CAAC,QAAQ,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,gBAAgB,EAAE,CAAC,gBAAgB,CAAC;IACpC,eAAe,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IACpC,iBAAiB,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC;IAC/C,gBAAgB,EAAE,CAAC,SAAS,CAAC;IAC7B,kBAAkB,EAAE,CAAC,SAAS,CAAC;IAC/B,aAAa,EAAE,CAAC,gBAAgB,CAAC;IACjC,eAAe,EAAE,CAAC,gBAAgB,CAAC;IACnC,mBAAmB,EAAE,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACtD,qBAAqB,EAAE,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACxD,qBAAqB,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC;IACtD,uBAAuB,EAAE,CAAC,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC;IACjE,IAAI,EAAE,CAAC,YAAY,CAAC;IACpB,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,SAAS,EAAE,CAAC,WAAW,CAAC;IACxB,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,eAAe,EAAE,CAAC,UAAU,CAAC;IAC7B,QAAQ,EAAE,CAAC,UAAU,CAAC;CACvB,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,IAAiC;IACjE,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAA0B;IAChE,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAC3C,KAA0B;IAE1B,IAAI,KAAK,CAAC,MAAM,IAAI,uBAAuB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IACxE,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,139 @@
1
+ import { type ConfigurationBundleV3, type ContractBundleV3 } from 'openxiangda-contracts';
2
+ export type PermissionReviewFieldRequirement = {
3
+ kind: 'inherit-resource-operation';
4
+ } | {
5
+ kind: 'deny';
6
+ } | {
7
+ kind: 'all-of';
8
+ capabilityCodes: string[];
9
+ };
10
+ /**
11
+ * A normalized review of sealed declarations, never an authorization engine.
12
+ * References join roles to capability requirements and pages to resources/views;
13
+ * no role × page × field cross product or new grant state is generated.
14
+ */
15
+ export declare function buildPermissionReview(configuration: ConfigurationBundleV3, contracts: ContractBundleV3): {
16
+ digest: string;
17
+ schemaVersion: "openxiangda.permission-review/v2";
18
+ appCode: string;
19
+ configDigest: string;
20
+ contractDigest: string;
21
+ authority: "declaration-projection";
22
+ runtimeAuthorizationRequired: true;
23
+ semantics: {
24
+ roleCapabilities: "sealed-declared-grants; current-user application roles are unioned";
25
+ roleDeniedCapabilities: "removed from that role during compilation; not a global deny across roles";
26
+ capabilityMatch: "static prerequisite only; never runtime allow";
27
+ fieldPolicies: "resource operation is required; field rules can only narrow it; empty is deny";
28
+ hiddenFields: "presentation only; not an authorization rule";
29
+ rowPolicies: "raw declarations; evaluated by the platform with current identity, grants and record facts";
30
+ workflowTasks: "platform Task Surface and fresh command token decide current participant, state, field and operation access";
31
+ navigation: "page selection and visibility do not grant resource or operation access";
32
+ perspectives: "read projections only; never replace the actor or mutation/workflow authorization";
33
+ };
34
+ roles: {
35
+ capabilityCodes: string[];
36
+ description?: string;
37
+ code: string;
38
+ name: string;
39
+ }[];
40
+ capabilities: import("openxiangda-contracts").AppCapabilityContract[];
41
+ perspectives: import("openxiangda-contracts").AppPerspectiveContract[];
42
+ pages: {
43
+ adminAccess: import("openxiangda-contracts").AppFrontendRouteAccess | null;
44
+ admin: import("openxiangda-contracts").AppAdminPageContract[];
45
+ custom: import("openxiangda-contracts").AppFrontendRouteContract[];
46
+ standard: import("openxiangda-contracts").AppRouteManifestEntryV3[];
47
+ };
48
+ resources: {
49
+ code: string;
50
+ name: string;
51
+ operationCapabilities: {
52
+ read: string;
53
+ create: string;
54
+ update: string;
55
+ delete: string;
56
+ };
57
+ dataPolicyCode: string | null;
58
+ mutationOwner: "native" | "action" | "readonly" | "workflow" | null;
59
+ generated: {
60
+ list?: boolean;
61
+ detail?: boolean;
62
+ create?: boolean;
63
+ update?: boolean;
64
+ delete?: boolean;
65
+ } | null;
66
+ views: {
67
+ code: string;
68
+ name: string;
69
+ generated: Required<{
70
+ list?: boolean;
71
+ detail?: boolean;
72
+ create?: boolean;
73
+ update?: boolean;
74
+ delete?: boolean;
75
+ }>;
76
+ fieldOrder: {
77
+ list: string[];
78
+ form: string[];
79
+ detail: string[];
80
+ };
81
+ mobile: {
82
+ enabled: boolean;
83
+ };
84
+ }[];
85
+ defaultFieldOrder: {
86
+ list: string[] | null;
87
+ form: string[] | null;
88
+ detail: string[] | null;
89
+ } | null;
90
+ fields: {
91
+ code: string;
92
+ type: "boolean" | "date" | "file" | "subtable" | "text.short" | "text.long" | "text.rich" | "number.integer" | "number.decimal" | "time" | "datetime" | "date-range" | "datetime-range" | "option.single" | "option.multiple" | "cascade.single" | "cascade.multiple" | "user.single" | "user.multiple" | "department.single" | "department.multiple" | "resource-ref.single" | "resource-ref.multiple" | "image" | "signature" | "address" | "location" | "uuid" | "json" | "serial-number";
93
+ label: string;
94
+ hidden: boolean;
95
+ system: boolean;
96
+ read: PermissionReviewFieldRequirement;
97
+ create: PermissionReviewFieldRequirement;
98
+ update: PermissionReviewFieldRequirement;
99
+ mask: "null" | "omit" | null;
100
+ }[];
101
+ }[];
102
+ authorization: {
103
+ authenticatedUserRoleCode: string | null;
104
+ dataPolicies: import("openxiangda-contracts").AppDataPolicyDeclaration[];
105
+ scopeDimensions: import("openxiangda-contracts").AppScopeDimensionDeclaration[];
106
+ scopeSources: import("openxiangda-contracts").AppScopeSourceDeclaration[];
107
+ roleMembershipSources: import("openxiangda-contracts").AppRoleMembershipSourceDeclaration[];
108
+ relationshipGrantSources: import("openxiangda-contracts").AppRelationshipGrantSourceDeclaration[];
109
+ authorizationTransitions: import("openxiangda-contracts").AppAuthorizationTransitionDeclaration[];
110
+ publicAccess: import("openxiangda-contracts").AnonymousPublicAccessContractV2 | null;
111
+ };
112
+ operations: import("openxiangda-contracts").AppApiOperationContract[];
113
+ workflows: {
114
+ runtimeAuthorizationRequired: true;
115
+ contracts: import("openxiangda-contracts").AppWorkflowContract[];
116
+ definitions: {
117
+ workflowCode: string;
118
+ version: number;
119
+ subject: import("openxiangda-contracts").WorkflowSubjectDefinition;
120
+ organizationContext: {
121
+ department?: {
122
+ source: "none" | "user_primary_department" | "choose_if_multiple" | "always_choose" | "fixed" | "from_input" | "from_role_scope";
123
+ required?: boolean;
124
+ value?: string;
125
+ path?: string;
126
+ dimension?: string;
127
+ };
128
+ } | null;
129
+ startAt: string;
130
+ nodes: Record<string, import("openxiangda-contracts").WorkflowNode>;
131
+ }[];
132
+ bindings: import("openxiangda-contracts").NativeWorkflowBindingDeclaration[];
133
+ activations: import("openxiangda-contracts").NativeWorkflowActivationDeclaration[];
134
+ providers: import("openxiangda-contracts").NativeWorkflowProviderDeclaration[];
135
+ editableParameters: import("openxiangda-contracts").NativeWorkflowEditableParameterDeclaration[];
136
+ };
137
+ };
138
+ export type PermissionReview = ReturnType<typeof buildPermissionReview>;
139
+ //# sourceMappingURL=permission-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-review.d.ts","sourceRoot":"","sources":["../../src/compiler/permission-review.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EAEtB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,gCAAgC,GACxC;IAAE,IAAI,EAAE,4BAA4B,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAgBlD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,qBAAqB,EACpC,SAAS,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAmIu3jD,CAAC;yBAA4B,CAAC;wBAA0B,CAAC;6BAAqH,CAAC;;;;;;;;;;;EAHlkkD;AAED,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { canonicalJson, sha256Digest, } from 'openxiangda-contracts';
2
+ function fieldRequirement(policy, operation) {
3
+ const capabilities = policy[operation];
4
+ if (capabilities === undefined)
5
+ return { kind: 'inherit-resource-operation' };
6
+ if (capabilities.length === 0)
7
+ return { kind: 'deny' };
8
+ return { kind: 'all-of', capabilityCodes: [...capabilities].sort() };
9
+ }
10
+ function byCode(entries) {
11
+ return [...entries].sort((left, right) => left.code.localeCompare(right.code));
12
+ }
13
+ /**
14
+ * A normalized review of sealed declarations, never an authorization engine.
15
+ * References join roles to capability requirements and pages to resources/views;
16
+ * no role × page × field cross product or new grant state is generated.
17
+ */
18
+ export function buildPermissionReview(configuration, contracts) {
19
+ if (configuration.appCode !== contracts.appCode ||
20
+ sha256Digest(configuration) !== contracts.configDigest) {
21
+ throw new Error('PERMISSION_REVIEW_CONFIG_MISMATCH: use configuration and contracts from the same compilation');
22
+ }
23
+ const adminRouteCodes = new Set(contracts.adminPages.flatMap(page => page.routeCode ? [page.routeCode] : []));
24
+ const standardRouteCodes = new Set(contracts.routeManifest.routes.flatMap(route => [
25
+ route.desktop.routeCode,
26
+ route.mobile.routeCode,
27
+ ]));
28
+ const review = {
29
+ schemaVersion: 'openxiangda.permission-review/v2',
30
+ appCode: configuration.appCode,
31
+ configDigest: contracts.configDigest,
32
+ contractDigest: sha256Digest(contracts),
33
+ authority: 'declaration-projection',
34
+ runtimeAuthorizationRequired: true,
35
+ semantics: {
36
+ roleCapabilities: 'sealed-declared-grants; current-user application roles are unioned',
37
+ roleDeniedCapabilities: 'removed from that role during compilation; not a global deny across roles',
38
+ capabilityMatch: 'static prerequisite only; never runtime allow',
39
+ fieldPolicies: 'resource operation is required; field rules can only narrow it; empty is deny',
40
+ hiddenFields: 'presentation only; not an authorization rule',
41
+ rowPolicies: 'raw declarations; evaluated by the platform with current identity, grants and record facts',
42
+ workflowTasks: 'platform Task Surface and fresh command token decide current participant, state, field and operation access',
43
+ navigation: 'page selection and visibility do not grant resource or operation access',
44
+ perspectives: 'read projections only; never replace the actor or mutation/workflow authorization',
45
+ },
46
+ roles: byCode(configuration.authz.roles).map(role => ({
47
+ code: role.code,
48
+ name: role.name,
49
+ ...(role.description ? { description: role.description } : {}),
50
+ capabilityCodes: [...role.capabilities].sort(),
51
+ })),
52
+ capabilities: byCode(contracts.capabilities),
53
+ perspectives: byCode(contracts.perspectives),
54
+ pages: {
55
+ adminAccess: contracts.adminAccess ?? null,
56
+ admin: byCode(contracts.adminPages),
57
+ custom: byCode(contracts.routes.filter(route => !adminRouteCodes.has(route.code) && !standardRouteCodes.has(route.code))),
58
+ standard: byCode(contracts.routeManifest.routes),
59
+ },
60
+ resources: byCode(configuration.data.resources).map(resource => ({
61
+ code: resource.code,
62
+ name: resource.name,
63
+ operationCapabilities: resource.capabilities,
64
+ dataPolicyCode: resource.dataPolicyCode ?? null,
65
+ mutationOwner: resource.surface?.mutationOwner ?? null,
66
+ generated: resource.surface?.generated ?? null,
67
+ views: byCode(resource.surface?.views ?? []).map(view => ({
68
+ code: view.code,
69
+ name: view.name,
70
+ generated: view.generated,
71
+ fieldOrder: {
72
+ list: view.list.fieldOrder,
73
+ form: view.form.fieldOrder,
74
+ detail: view.detail.fieldOrder,
75
+ },
76
+ mobile: view.mobile,
77
+ })),
78
+ defaultFieldOrder: resource.surface ? {
79
+ list: resource.surface.list?.fieldOrder ?? null,
80
+ form: resource.surface.form?.fieldOrder ?? null,
81
+ detail: resource.surface.detail?.fieldOrder ?? null,
82
+ } : null,
83
+ fields: byCode(resource.schema.fields).map(field => {
84
+ const policy = resource.fieldPolicies[field.code] ?? {};
85
+ const surface = resource.surface?.fields[field.code];
86
+ return {
87
+ code: field.code,
88
+ type: field.type,
89
+ label: surface?.label ?? field.code,
90
+ hidden: surface?.hidden ?? false,
91
+ system: surface?.system ?? false,
92
+ read: fieldRequirement(policy, 'read'),
93
+ create: fieldRequirement(policy, 'create'),
94
+ update: fieldRequirement(policy, 'update'),
95
+ mask: policy.mask ?? null,
96
+ };
97
+ }),
98
+ })),
99
+ authorization: {
100
+ authenticatedUserRoleCode: configuration.authz.authenticatedUserRoleCode ?? null,
101
+ dataPolicies: byCode(configuration.authz.dataPolicies),
102
+ scopeDimensions: byCode(configuration.authz.scopeDimensions),
103
+ scopeSources: byCode(configuration.authz.scopeSources),
104
+ roleMembershipSources: byCode(configuration.authz.roleMembershipSources),
105
+ relationshipGrantSources: byCode(configuration.authz.relationshipGrantSources),
106
+ authorizationTransitions: [...configuration.authz.authorizationTransitions].sort((left, right) => left.fromAuthzDigest.localeCompare(right.fromAuthzDigest)),
107
+ publicAccess: configuration.frontend.publicAccess ?? null,
108
+ },
109
+ operations: byCode(contracts.operations),
110
+ workflows: {
111
+ runtimeAuthorizationRequired: true,
112
+ contracts: byCode(contracts.workflows),
113
+ definitions: [...configuration.workflows.definitions].sort((left, right) => left.definition.code.localeCompare(right.definition.code) || left.version - right.version).map(({ version, definition }) => ({
114
+ workflowCode: definition.code,
115
+ version,
116
+ subject: definition.subject,
117
+ organizationContext: definition.organizationContext ?? null,
118
+ startAt: definition.startAt,
119
+ nodes: definition.nodes,
120
+ })),
121
+ bindings: [...configuration.workflows.bindings].sort((left, right) => left.binding.workflowCode.localeCompare(right.binding.workflowCode) || left.version - right.version),
122
+ activations: [...configuration.workflows.activations].sort((left, right) => left.workflowCode.localeCompare(right.workflowCode)),
123
+ providers: byCode(configuration.workflows.providers),
124
+ editableParameters: byCode(configuration.workflows.editableParameters),
125
+ },
126
+ };
127
+ // Do not share mutable arrays/objects with compiler output or change its digest.
128
+ const value = JSON.parse(canonicalJson(review));
129
+ return { ...value, digest: sha256Digest(value) };
130
+ }
131
+ //# sourceMappingURL=permission-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-review.js","sourceRoot":"","sources":["../../src/compiler/permission-review.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export * from './application-services.js';
2
2
  export * from './app-spec.js';
3
3
  export * from './connected-development.js';
4
4
  export * from './compiler/bundle.js';
5
+ export * from './compiler/permission-review.js';
5
6
  export * from './command-registry.js';
6
7
  export * from './config.js';
7
8
  export * from './control-plane-client.js';
@@ -9,9 +10,12 @@ export * from './deployment.js';
9
10
  export * from './package-compiler.js';
10
11
  export * from './compiler/ai-catalog.js';
11
12
  export * from './compiler/schema-composition.js';
13
+ export * from './compiler/application-model.js';
12
14
  export * from './workspace.js';
13
15
  export * from './workspace-loader.js';
14
16
  export * from './session.js';
15
17
  export * from './version.js';
16
18
  export * from './toolchain-capsule.js';
19
+ export * from './application-ui-contract.js';
20
+ export * from './optional-backend.js';
17
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AAEvC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@ export * from './application-services.js';
2
2
  export * from './app-spec.js';
3
3
  export * from './connected-development.js';
4
4
  export * from './compiler/bundle.js';
5
+ export * from './compiler/permission-review.js';
5
6
  export * from './command-registry.js';
6
7
  export * from './config.js';
7
8
  export * from './control-plane-client.js';
@@ -9,9 +10,12 @@ export * from './deployment.js';
9
10
  export * from './package-compiler.js';
10
11
  export * from './compiler/ai-catalog.js';
11
12
  export * from './compiler/schema-composition.js';
13
+ export * from './compiler/application-model.js';
12
14
  export * from './workspace.js';
13
15
  export * from './workspace-loader.js';
14
16
  export * from './session.js';
15
17
  export * from './version.js';
16
18
  export * from './toolchain-capsule.js';
19
+ export * from './application-ui-contract.js';
20
+ export * from './optional-backend.js';
17
21
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AAEvC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type OpenXiangdaAppConfig } from './compiler/config.js';
2
+ export interface OptionalBackendInitialization {
3
+ required: boolean;
4
+ created: boolean;
5
+ installed: boolean;
6
+ root: string;
7
+ }
8
+ /** Initialize user-owned source only when the application declares server execution. */
9
+ export declare function initializeOptionalBackend(workspaceRoot: string, config: OpenXiangdaAppConfig, options?: {
10
+ sdkVersion?: string;
11
+ /** Package manager boundary, injectable by deterministic toolchain tests. */
12
+ install?: (root: string) => void;
13
+ }): OptionalBackendInitialization;
14
+ //# sourceMappingURL=optional-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional-backend.d.ts","sourceRoot":"","sources":["../src/optional-backend.ts"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEzF,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wFAAwF;AACxF,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,GACL,6BAA6B,CAwE/B"}
@@ -0,0 +1,145 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { closeSync, cpSync, existsSync, lstatSync, mkdirSync, mkdtempSync, openSync, readFileSync, renameSync, rmSync, writeFileSync, } from 'node:fs';
3
+ import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { backendRuntimeRequired } from './compiler/config.js';
6
+ /** Initialize user-owned source only when the application declares server execution. */
7
+ export function initializeOptionalBackend(workspaceRoot, config, options = {}) {
8
+ const root = resolve(workspaceRoot);
9
+ const required = backendRuntimeRequired(config);
10
+ const result = { required, created: false, installed: false, root: config.backend.root };
11
+ if (!required)
12
+ return result;
13
+ const target = resolve(root, config.backend.root);
14
+ assertContainedPath(root, target);
15
+ const receiptRoot = join(root, '.openxiangda');
16
+ assertContainedPath(root, receiptRoot);
17
+ const receipt = join(receiptRoot, 'backend-install-pending.json');
18
+ assertContainedPath(root, receipt);
19
+ // Existing authored backends belong to the app; no regeneration or reinstall.
20
+ if (existsSync(target) && !existsSync(receipt))
21
+ return result;
22
+ mkdirSync(receiptRoot, { recursive: true });
23
+ const lock = join(receiptRoot, 'backend-initialization.lock');
24
+ assertContainedPath(root, lock);
25
+ const lockFd = acquireInitializationLock(lock);
26
+ let staging;
27
+ try {
28
+ assertContainedPath(root, target);
29
+ if (!existsSync(target)) {
30
+ const sdkVersion = options.sdkVersion || workspaceSdkVersion(root);
31
+ if (!sdkVersion || !/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(sdkVersion)) {
32
+ throw initializationError('OPENXIANGDA_BACKEND_SDK_VERSION_REQUIRED', '按需后端需要工作区精确版本的 openxiangda 依赖');
33
+ }
34
+ const source = fileURLToPath(new URL('../templates/backend/', import.meta.url));
35
+ mkdirSync(dirname(target), { recursive: true });
36
+ staging = mkdtempSync(join(dirname(target), '.openxiangda-backend-'));
37
+ cpSync(source, staging, {
38
+ recursive: true,
39
+ filter: path => !/(?:^|\/)(?:node_modules|dist)(?:\/|$)/.test(relative(source, path)),
40
+ });
41
+ const manifestPath = join(staging, 'package.json');
42
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
43
+ manifest.dependencies.openxiangda = sdkVersion;
44
+ writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
45
+ const tsconfigPath = join(staging, 'tsconfig.json');
46
+ const tsconfig = JSON.parse(readFileSync(tsconfigPath, 'utf8'));
47
+ tsconfig.extends = relative(target, join(root, 'tsconfig.base.json')).split(sep).join('/');
48
+ writeFileSync(tsconfigPath, `${JSON.stringify(tsconfig, null, 2)}\n`);
49
+ const dockerfilePath = join(staging, 'Dockerfile');
50
+ writeFileSync(dockerfilePath, readFileSync(dockerfilePath, 'utf8')
51
+ .replaceAll('apps/server', relative(root, target).split(sep).join('/')));
52
+ // Write the retry receipt before committing source so interrupted setup is resumable.
53
+ if (!existsSync(receipt)) {
54
+ writeFileSync(receipt, `${JSON.stringify({ root: config.backend.root })}\n`, { flag: 'wx' });
55
+ }
56
+ else if (JSON.parse(readFileSync(receipt, 'utf8')).root !== config.backend.root) {
57
+ throw initializationError('OPENXIANGDA_BACKEND_INITIALIZATION_CONFLICT', '未完成的后端初始化与当前声明不一致');
58
+ }
59
+ if (existsSync(target))
60
+ throw initializationError('OPENXIANGDA_BACKEND_SOURCE_CONFLICT', '后端目录已由另一操作创建,未覆盖其内容');
61
+ renameSync(staging, target);
62
+ staging = undefined;
63
+ result.created = true;
64
+ }
65
+ if (existsSync(receipt)) {
66
+ const pending = JSON.parse(readFileSync(receipt, 'utf8'));
67
+ if (pending.root !== config.backend.root || !existsSync(join(target, 'package.json'))) {
68
+ throw initializationError('OPENXIANGDA_BACKEND_INITIALIZATION_CONFLICT', '未完成的后端初始化与当前声明不一致;请检查 .openxiangda/backend-install-pending.json');
69
+ }
70
+ (options.install || installBackendDependencies)(root);
71
+ rmSync(receipt);
72
+ result.installed = true;
73
+ }
74
+ return result;
75
+ }
76
+ finally {
77
+ if (staging)
78
+ rmSync(staging, { recursive: true, force: true });
79
+ closeSync(lockFd);
80
+ rmSync(lock, { force: true });
81
+ }
82
+ }
83
+ function acquireInitializationLock(path) {
84
+ for (let attempt = 0; attempt < 2; attempt += 1) {
85
+ try {
86
+ const fd = openSync(path, 'wx');
87
+ writeFileSync(fd, String(process.pid));
88
+ return fd;
89
+ }
90
+ catch (error) {
91
+ if (error.code !== 'EEXIST')
92
+ throw error;
93
+ const owner = readFileSync(path, 'utf8');
94
+ const pid = Number(owner);
95
+ if (Number.isSafeInteger(pid) && pid > 0 && pid <= 2147483647) {
96
+ try {
97
+ process.kill(pid, 0);
98
+ }
99
+ catch (probe) {
100
+ if (probe.code === 'ESRCH' && readFileSync(path, 'utf8') === owner) {
101
+ rmSync(path);
102
+ continue;
103
+ }
104
+ }
105
+ }
106
+ break;
107
+ }
108
+ }
109
+ throw initializationError('OPENXIANGDA_BACKEND_INITIALIZATION_BUSY', '另一进程正在初始化后端;待其完成后重试', true);
110
+ }
111
+ function workspaceSdkVersion(root) {
112
+ const manifest = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
113
+ return manifest.devDependencies?.openxiangda || manifest.dependencies?.openxiangda;
114
+ }
115
+ function installBackendDependencies(root) {
116
+ const installed = spawnSync('pnpm', ['install', '--no-frozen-lockfile', '--ignore-scripts'], {
117
+ cwd: root, encoding: 'utf8', timeout: 180_000, maxBuffer: 4 * 1024 * 1024,
118
+ });
119
+ if (installed.status !== 0 || installed.error) {
120
+ throw initializationError('OPENXIANGDA_BACKEND_INSTALL_FAILED', '后端源码已保留,依赖安装未完成;检查包管理器/网络后重新运行 openxiangda check 或 dev', true);
121
+ }
122
+ }
123
+ function assertContainedPath(root, target) {
124
+ const name = relative(root, target);
125
+ if (!name || name.startsWith(`..${sep}`) || name === '..' || isAbsolute(name)) {
126
+ throw initializationError('OPENXIANGDA_BACKEND_PATH_INVALID', '后端目录必须位于当前工作区内');
127
+ }
128
+ let current = root;
129
+ for (const part of name.split(sep)) {
130
+ current = join(current, part);
131
+ try {
132
+ if (lstatSync(current).isSymbolicLink()) {
133
+ throw initializationError('OPENXIANGDA_BACKEND_PATH_INVALID', '后端目录不能穿过符号链接');
134
+ }
135
+ }
136
+ catch (error) {
137
+ if (error.code !== 'ENOENT')
138
+ throw error;
139
+ }
140
+ }
141
+ }
142
+ function initializationError(code, message, retryable = false) {
143
+ return Object.assign(new Error(`${code}: ${message}`), { code, retryable });
144
+ }
145
+ //# sourceMappingURL=optional-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional-backend.js","sourceRoot":"","sources":["../src/optional-backend.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-loader.d.ts","sourceRoot":"","sources":["../src/workspace-loader.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,oBAAoB,EAE1B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;CACpD;AAED,wBAAsB,aAAa,CACjC,KAAK,SAAgB,EACrB,gBAAgB,SAAgC,GAC/C,OAAO,CAAC,eAAe,CAAC,CAyB1B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,SAAgB;;;EAetD;AAED,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,iCAuDrD;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAS/C"}
1
+ {"version":3,"file":"workspace-loader.d.ts","sourceRoot":"","sources":["../src/workspace-loader.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,oBAAoB,EAE1B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;CACpD;AAED,wBAAsB,aAAa,CACjC,KAAK,SAAgB,EACrB,gBAAgB,SAAgC,GAC/C,OAAO,CAAC,eAAe,CAAC,CAyB1B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,SAAgB;;;EAetD;AAED,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,iCA4ErD;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAS/C"}
@@ -57,6 +57,17 @@ export async function loadAppConfig(configPath) {
57
57
  if (!schemaCompositionModule) {
58
58
  throw new Error('OPENXIANGDA_CONFIG_SCHEMA_HELPERS_MISSING');
59
59
  }
60
+ const configHelpersModule = [
61
+ join(moduleRoot, 'compiler', 'config.js'),
62
+ join(moduleRoot, 'compiler', 'config.ts'),
63
+ ].find(existsSync);
64
+ const modelHelpersModule = [
65
+ join(moduleRoot, 'compiler', 'application-model.js'),
66
+ join(moduleRoot, 'compiler', 'application-model.ts'),
67
+ ].find(existsSync);
68
+ if (!configHelpersModule || !modelHelpersModule) {
69
+ throw new Error('OPENXIANGDA_CONFIG_HELPERS_MISSING');
70
+ }
60
71
  const result = await build({
61
72
  entryPoints: [configPath],
62
73
  bundle: true,
@@ -75,12 +86,16 @@ export async function loadAppConfig(configPath) {
75
86
  {
76
87
  name: 'openxiangda-config-contract',
77
88
  setup(context) {
89
+ context.onResolve({ filter: /^openxiangda-config-helpers$/ }, () => ({ path: configHelpersModule }));
90
+ context.onResolve({ filter: /^openxiangda-model-helpers$/ }, () => ({ path: modelHelpersModule }));
78
91
  context.onResolve({ filter: /^openxiangda-schema-composition$/ }, () => ({ path: schemaCompositionModule }));
79
92
  context.onResolve({ filter: /^openxiangda\/config$/ }, () => ({ path: 'config', namespace: 'openxiangda-config' }));
80
93
  context.onLoad({ filter: /.*/, namespace: 'openxiangda-config' }, () => ({
81
94
  loader: 'js',
82
95
  contents: 'export const defineOpenXiangdaApp = value => Object.freeze(value); export const defineAdminNavigation = value => Object.freeze(value); export const adminNavigationGroup = (code, label, items, options = {}) => ({ code, label, items, ...options }); export const adminResourcePage = (resourceCode, options = {}) => ({ page: { kind: "resource", resourceCode }, ...options }); export const adminOperationPage = (routeCode, options = {}) => ({ page: { kind: "operation", routeCode }, ...options }); export const adminApplicationTodoCenterPage = (options = {}) => ({ page: { kind: "application-todo-center" }, ...options }); export const resourceCapabilityCodes = (appCode, resourceCode) => { const prefix = `app:${appCode}:data:${resourceCode}`; return { read: `${prefix}:read`, create: `${prefix}:create`, update: `${prefix}:update`, delete: `${prefix}:delete` }; }; export const currentUserDataPolicy = input => ({ code: input.code, name: input.name, resourceCode: input.resourceCode, ...(input.unrestrictedRoleCodes ? { unrestrictedRoleCodes: [...input.unrestrictedRoleCodes] } : {}), matchMode: "AND", rules: [{ subject: "current_user", field: input.field, roleCodes: [...input.roleCodes] }] }); export const dataPolicyExpression = { allOf: (...values) => ({ allOf: values }), anyOf: (...values) => ({ anyOf: values }), constant: input => ({ ...input }), null: input => ({ ...input }), databaseNow: input => ({ ...input, operand: "db_now" }), currentUser: input => ({ ...input, subject: "current_user" }), dimension: input => ({ ...input }), relation: input => ({ ...input }) }; export const resourceReadPolicy = input => ({ code: input.code, name: input.name, resourceCode: input.resourceCode, ...(input.unrestrictedRoleCodes ? { unrestrictedRoleCodes: [...input.unrestrictedRoleCodes] } : {}), matchMode: input.writeBoundary === "capability_only" ? "AND" : input.matchMode, rules: input.writeBoundary === "capability_only" ? [] : input.rules, readExpression: input.expression, ...(input.writeBoundary === "capability_only" ? { writeBoundary: "capability_only" } : {}) });' +
83
- ' export { composeAppOperationSchemas, composeJsonSchema, resourceRecordSchema, schemaRef } from "openxiangda-schema-composition";',
96
+ ' export { composeAppOperationSchemas, composeJsonSchema, resourceRecordSchema, schemaRef } from "openxiangda-schema-composition";' +
97
+ ' export { defineApplicationModule, defineDataModel, defineResourceForm, defineResourceList } from "openxiangda-model-helpers";' +
98
+ ' export { resourceRoleCapabilities } from "openxiangda-config-helpers";',
84
99
  }));
85
100
  },
86
101
  },
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-loader.js","sourceRoot":"","sources":["../src/workspace-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-loader.js","sourceRoot":"","sources":["../src/workspace-loader.ts"],"names":[],"mappings":"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"}