@opensaas/stack-core 0.37.0 → 0.39.0
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +191 -0
- package/CLAUDE.md +42 -3
- package/dist/access/access-filter.d.ts +70 -113
- package/dist/access/access-filter.d.ts.map +1 -1
- package/dist/access/access-filter.js +183 -210
- package/dist/access/access-filter.js.map +1 -1
- package/dist/access/access-filter.test.js +148 -188
- package/dist/access/access-filter.test.js.map +1 -1
- package/dist/access/declared-dependencies.d.ts +66 -26
- package/dist/access/declared-dependencies.d.ts.map +1 -1
- package/dist/access/declared-dependencies.js +62 -17
- package/dist/access/declared-dependencies.js.map +1 -1
- package/dist/access/declared-dependencies.test.d.ts +2 -0
- package/dist/access/declared-dependencies.test.d.ts.map +1 -0
- package/dist/access/declared-dependencies.test.js +226 -0
- package/dist/access/declared-dependencies.test.js.map +1 -0
- package/dist/access/depth-limits.d.ts +8 -7
- package/dist/access/depth-limits.d.ts.map +1 -1
- package/dist/access/depth-limits.js +8 -7
- package/dist/access/depth-limits.js.map +1 -1
- package/dist/access/engine.d.ts +0 -20
- package/dist/access/engine.d.ts.map +1 -1
- package/dist/access/engine.js +0 -25
- package/dist/access/engine.js.map +1 -1
- package/dist/access/errors.d.ts +61 -8
- package/dist/access/errors.d.ts.map +1 -1
- package/dist/access/errors.js +91 -12
- package/dist/access/errors.js.map +1 -1
- package/dist/access/field-access.d.ts +39 -1
- package/dist/access/field-access.d.ts.map +1 -1
- package/dist/access/field-access.js +108 -42
- package/dist/access/field-access.js.map +1 -1
- package/dist/access/field-access.test.js +229 -2
- package/dist/access/field-access.test.js.map +1 -1
- package/dist/access/field-transforms.d.ts +0 -27
- package/dist/access/field-transforms.d.ts.map +1 -1
- package/dist/access/field-visibility.d.ts +2 -5
- package/dist/access/field-visibility.d.ts.map +1 -1
- package/dist/access/field-visibility.js +89 -41
- package/dist/access/field-visibility.js.map +1 -1
- package/dist/access/index.d.ts +6 -3
- package/dist/access/index.d.ts.map +1 -1
- package/dist/access/index.js +12 -2
- package/dist/access/index.js.map +1 -1
- package/dist/access/query-validation.d.ts +121 -0
- package/dist/access/query-validation.d.ts.map +1 -0
- package/dist/access/query-validation.js +292 -0
- package/dist/access/query-validation.js.map +1 -0
- package/dist/access/relationship-count.d.ts +1 -1
- package/dist/access/relationship-count.d.ts.map +1 -1
- package/dist/access/relationship-count.js +2 -10
- package/dist/access/relationship-count.js.map +1 -1
- package/dist/access/relationship-label-filter.d.ts +23 -23
- package/dist/access/relationship-label-filter.d.ts.map +1 -1
- package/dist/access/relationship-label-filter.js +5 -76
- package/dist/access/relationship-label-filter.js.map +1 -1
- package/dist/access/relationship-label-filter.test.js +19 -56
- package/dist/access/relationship-label-filter.test.js.map +1 -1
- package/dist/access/transaction-registry.d.ts +45 -0
- package/dist/access/transaction-registry.d.ts.map +1 -0
- package/dist/access/transaction-registry.js +37 -0
- package/dist/access/transaction-registry.js.map +1 -0
- package/dist/access/types.d.ts +55 -59
- package/dist/access/types.d.ts.map +1 -1
- package/dist/config/index.d.ts +9 -7
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +10 -18
- package/dist/config/index.js.map +1 -1
- package/dist/config/label.d.ts +6 -13
- package/dist/config/label.d.ts.map +1 -1
- package/dist/config/label.js +6 -13
- package/dist/config/label.js.map +1 -1
- package/dist/config/nav-count.d.ts +11 -19
- package/dist/config/nav-count.d.ts.map +1 -1
- package/dist/config/nav-count.js +11 -19
- package/dist/config/nav-count.js.map +1 -1
- package/dist/config/plugin-engine.d.ts +0 -10
- package/dist/config/plugin-engine.d.ts.map +1 -1
- package/dist/config/plugin-engine.js +1 -37
- package/dist/config/plugin-engine.js.map +1 -1
- package/dist/config/types.d.ts +94 -109
- package/dist/config/types.d.ts.map +1 -1
- package/dist/context/apply-defaults.d.ts +8 -31
- package/dist/context/apply-defaults.d.ts.map +1 -1
- package/dist/context/apply-defaults.js +12 -41
- package/dist/context/apply-defaults.js.map +1 -1
- package/dist/context/hook-pipeline.d.ts +4 -29
- package/dist/context/hook-pipeline.d.ts.map +1 -1
- package/dist/context/hook-pipeline.js +8 -41
- package/dist/context/hook-pipeline.js.map +1 -1
- package/dist/context/index.d.ts +4 -15
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +223 -215
- package/dist/context/index.js.map +1 -1
- package/dist/context/nested-operations.d.ts +7 -26
- package/dist/context/nested-operations.d.ts.map +1 -1
- package/dist/context/nested-operations.js +73 -171
- package/dist/context/nested-operations.js.map +1 -1
- package/dist/context/transaction-boundary.d.ts +36 -47
- package/dist/context/transaction-boundary.d.ts.map +1 -1
- package/dist/context/transaction-boundary.js +92 -79
- package/dist/context/transaction-boundary.js.map +1 -1
- package/dist/context/write-pipeline.d.ts +25 -64
- package/dist/context/write-pipeline.d.ts.map +1 -1
- package/dist/context/write-pipeline.js +81 -111
- package/dist/context/write-pipeline.js.map +1 -1
- package/dist/fields/format-prisma-default.d.ts.map +1 -1
- package/dist/fields/format-prisma-default.js +4 -7
- package/dist/fields/format-prisma-default.js.map +1 -1
- package/dist/fields/index.d.ts +17 -2
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +136 -147
- package/dist/fields/index.js.map +1 -1
- package/dist/filter/collect.d.ts +26 -3
- package/dist/filter/collect.d.ts.map +1 -1
- package/dist/filter/collect.js +30 -12
- package/dist/filter/collect.js.map +1 -1
- package/dist/filter/filter.test.js +98 -15
- package/dist/filter/filter.test.js.map +1 -1
- package/dist/filter/index.d.ts +1 -0
- package/dist/filter/index.d.ts.map +1 -1
- package/dist/filter/index.js.map +1 -1
- package/dist/filter/map.d.ts.map +1 -1
- package/dist/filter/map.js +0 -5
- package/dist/filter/map.js.map +1 -1
- package/dist/filter/parse.d.ts.map +1 -1
- package/dist/filter/parse.js +2 -9
- package/dist/filter/parse.js.map +1 -1
- package/dist/filter/serialize.d.ts.map +1 -1
- package/dist/filter/serialize.js +2 -4
- package/dist/filter/serialize.js.map +1 -1
- package/dist/hooks/index.d.ts +4 -42
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +5 -59
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -4
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +1 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +4 -0
- package/dist/internal.js.map +1 -1
- package/dist/lib/case-utils.d.ts +0 -32
- package/dist/lib/case-utils.d.ts.map +1 -1
- package/dist/lib/case-utils.js +0 -32
- package/dist/lib/case-utils.js.map +1 -1
- package/dist/mcp/handler.d.ts +0 -4
- package/dist/mcp/handler.d.ts.map +1 -1
- package/dist/mcp/handler.js +12 -69
- package/dist/mcp/handler.js.map +1 -1
- package/dist/query/index.d.ts +55 -227
- package/dist/query/index.d.ts.map +1 -1
- package/dist/query/index.js +41 -117
- package/dist/query/index.js.map +1 -1
- package/dist/query/relationship-options.d.ts +1 -1
- package/dist/query/relationship-options.js +1 -1
- package/dist/utils/password.d.ts +0 -68
- package/dist/utils/password.d.ts.map +1 -1
- package/dist/utils/password.js +7 -76
- package/dist/utils/password.js.map +1 -1
- package/dist/validation/field-config.d.ts.map +1 -1
- package/dist/validation/field-config.js +0 -6
- package/dist/validation/field-config.js.map +1 -1
- package/dist/validation/schema.d.ts +0 -7
- package/dist/validation/schema.d.ts.map +1 -1
- package/dist/validation/schema.js +0 -10
- package/dist/validation/schema.js.map +1 -1
- package/package.json +1 -1
- package/src/access/access-filter.test.ts +205 -275
- package/src/access/access-filter.ts +236 -272
- package/src/access/declared-dependencies.test.ts +277 -0
- package/src/access/declared-dependencies.ts +117 -37
- package/src/access/depth-limits.ts +8 -7
- package/src/access/engine.ts +0 -25
- package/src/access/errors.ts +97 -12
- package/src/access/field-access.test.ts +312 -2
- package/src/access/field-access.ts +118 -42
- package/src/access/field-transforms.ts +8 -39
- package/src/access/field-visibility.ts +99 -45
- package/src/access/index.ts +17 -5
- package/src/access/query-validation.ts +359 -0
- package/src/access/relationship-count.ts +3 -11
- package/src/access/relationship-label-filter.test.ts +19 -68
- package/src/access/relationship-label-filter.ts +27 -104
- package/src/access/transaction-registry.ts +58 -0
- package/src/access/types.ts +83 -86
- package/src/config/index.ts +10 -22
- package/src/config/label.ts +6 -13
- package/src/config/nav-count.ts +11 -19
- package/src/config/plugin-engine.ts +1 -37
- package/src/config/types.ts +95 -110
- package/src/context/apply-defaults.ts +12 -44
- package/src/context/hook-pipeline.ts +12 -67
- package/src/context/index.ts +311 -276
- package/src/context/nested-operations.ts +94 -226
- package/src/context/transaction-boundary.ts +113 -109
- package/src/context/write-pipeline.ts +99 -155
- package/src/fields/format-prisma-default.ts +4 -7
- package/src/fields/index.ts +155 -147
- package/src/filter/collect.ts +48 -12
- package/src/filter/filter.test.ts +153 -15
- package/src/filter/index.ts +1 -0
- package/src/filter/map.ts +0 -5
- package/src/filter/parse.ts +2 -9
- package/src/filter/serialize.ts +2 -4
- package/src/hooks/index.ts +5 -59
- package/src/index.ts +23 -4
- package/src/internal.ts +5 -0
- package/src/lib/case-utils.ts +0 -32
- package/src/mcp/handler.ts +13 -71
- package/src/query/index.ts +82 -235
- package/src/query/relationship-options.ts +1 -1
- package/src/utils/password.ts +7 -76
- package/src/validation/field-config.ts +0 -6
- package/src/validation/schema.ts +0 -10
- package/tests/access-relationships.test.ts +18 -16
- package/tests/computed-field-selective-evaluation.test.ts +418 -0
- package/tests/context.test.ts +727 -1
- package/tests/field-types.test.ts +222 -0
- package/tests/mcp-handler.test.ts +34 -0
- package/tests/needs-declared-dependencies.test.ts +7 -4
- package/tests/resolve-chain.test.ts +11 -11
- package/tests/transaction-boundary-outermost.test.ts +530 -0
- package/tsconfig.tsbuildinfo +1 -1
package/dist/config/index.d.ts
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import type { OpenSaasConfig, ListConfig, ListConfigInput } from './types.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* Executes plugins if present in config.plugins array
|
|
3
|
+
* Define an OpenSaas config, executing `plugins` if present.
|
|
5
4
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Returns synchronously when there are no plugins (backward compatible);
|
|
6
|
+
* returns a `Promise` when plugins are present, since plugin execution is
|
|
7
|
+
* async.
|
|
8
8
|
*/
|
|
9
9
|
export declare function config(userConfig: OpenSaasConfig): OpenSaasConfig | Promise<OpenSaasConfig>;
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Define a list with type safety.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* `ListConfigInput<TTypeInfo>` accepts raw field configs; the return type
|
|
14
|
+
* `ListConfig<TTypeInfo>` injects `TTypeInfo` so hook/field callbacks (e.g.
|
|
15
|
+
* `resolveInput`'s `item`) are properly typed once `TTypeInfo` is supplied
|
|
16
|
+
* from generated types.
|
|
15
17
|
*
|
|
16
18
|
* @example
|
|
17
19
|
* ```typescript
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,eAAe,EAGhB,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,eAAe,EAGhB,MAAM,YAAY,CAAA;AAwBnB;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,UAAU,EAAE,cAAc,GAAG,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAM3F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,wBAAgB,IAAI,CAAC,SAAS,SAAS,OAAO,YAAY,EAAE,QAAQ,EAClE,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC,GACjC,UAAU,CAAC,SAAS,CAAC,CAQvB;AAED,YAAY,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,SAAS,EACT,YAAY,EACZ,aAAa,EACb,cAAc,EACd,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACvB,SAAS,EACT,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,eAAe,EACf,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,0BAA0B,EAC1B,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,yBAAyB,EACzB,MAAM,EACN,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,YAAY,CAAA"}
|
package/dist/config/index.js
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import { executePlugins } from './plugin-engine.js';
|
|
2
|
-
/**
|
|
3
|
-
* Normalize access control shorthand to object form
|
|
4
|
-
* Converts function shorthand to { operation: { query, create, update, delete } } form
|
|
5
|
-
*/
|
|
6
2
|
function normalizeListAccess(access) {
|
|
7
3
|
if (!access)
|
|
8
4
|
return undefined;
|
|
9
|
-
// If it's a function, convert to object form applying to all operations
|
|
10
5
|
if (typeof access === 'function') {
|
|
11
6
|
const fn = access;
|
|
12
7
|
return {
|
|
@@ -18,29 +13,28 @@ function normalizeListAccess(access) {
|
|
|
18
13
|
},
|
|
19
14
|
};
|
|
20
15
|
}
|
|
21
|
-
// Already in object form
|
|
22
16
|
return access;
|
|
23
17
|
}
|
|
24
18
|
/**
|
|
25
|
-
*
|
|
26
|
-
* Executes plugins if present in config.plugins array
|
|
19
|
+
* Define an OpenSaas config, executing `plugins` if present.
|
|
27
20
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
21
|
+
* Returns synchronously when there are no plugins (backward compatible);
|
|
22
|
+
* returns a `Promise` when plugins are present, since plugin execution is
|
|
23
|
+
* async.
|
|
30
24
|
*/
|
|
31
25
|
export function config(userConfig) {
|
|
32
|
-
// If no plugins, return config as-is (synchronous, backward compatible)
|
|
33
26
|
if (!userConfig.plugins || userConfig.plugins.length === 0) {
|
|
34
27
|
return userConfig;
|
|
35
28
|
}
|
|
36
|
-
// Execute plugins and return promise
|
|
37
29
|
return executePlugins(userConfig);
|
|
38
30
|
}
|
|
39
31
|
/**
|
|
40
|
-
*
|
|
32
|
+
* Define a list with type safety.
|
|
41
33
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
34
|
+
* `ListConfigInput<TTypeInfo>` accepts raw field configs; the return type
|
|
35
|
+
* `ListConfig<TTypeInfo>` injects `TTypeInfo` so hook/field callbacks (e.g.
|
|
36
|
+
* `resolveInput`'s `item`) are properly typed once `TTypeInfo` is supplied
|
|
37
|
+
* from generated types.
|
|
44
38
|
*
|
|
45
39
|
* @example
|
|
46
40
|
* ```typescript
|
|
@@ -91,13 +85,11 @@ export function config(userConfig) {
|
|
|
91
85
|
* ```
|
|
92
86
|
*/
|
|
93
87
|
export function list(config) {
|
|
94
|
-
// Normalize access control shorthand to object form
|
|
95
88
|
const normalizedConfig = {
|
|
96
89
|
...config,
|
|
97
90
|
access: normalizeListAccess(config.access),
|
|
98
91
|
};
|
|
99
|
-
//
|
|
100
|
-
// At type level, they're transformed to inject TypeInfo types
|
|
92
|
+
// Runtime shape is unchanged; the cast only narrows the TS type to inject TTypeInfo.
|
|
101
93
|
return normalizedConfig;
|
|
102
94
|
}
|
|
103
95
|
//# sourceMappingURL=index.js.map
|
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD,SAAS,mBAAmB,CAC1B,MAAwC;IAExC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAE7B,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,MAA0B,CAAA;QACrC,OAAO;YACL,SAAS,EAAE;gBACT,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,EAAE;aACX;SACF,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAC,UAA0B;IAC/C,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,OAAO,cAAc,CAAC,UAAU,CAAC,CAAA;AACnC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,MAAM,UAAU,IAAI,CAClB,MAAkC;IAElC,MAAM,gBAAgB,GAAG;QACvB,GAAG,MAAM;QACT,MAAM,EAAE,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC;KAC3C,CAAA;IAED,qFAAqF;IACrF,OAAO,gBAAyC,CAAA;AAClD,CAAC"}
|
package/dist/config/label.d.ts
CHANGED
|
@@ -1,22 +1,15 @@
|
|
|
1
1
|
import type { ListConfig } from './types.js';
|
|
2
2
|
/**
|
|
3
|
-
* Resolve the field name
|
|
4
|
-
*
|
|
5
|
-
* field this returns, so the field chosen for projection can never drift
|
|
6
|
-
* from the field used for rendering.
|
|
3
|
+
* Resolve the field name used as a list's Label field: `ui.labelField` if
|
|
4
|
+
* set, else `name`, else `title`, else `id`.
|
|
7
5
|
*
|
|
8
|
-
*
|
|
9
|
-
* (
|
|
10
|
-
*
|
|
11
|
-
* @throws if `ui.labelField` is set but does not reference a declared,
|
|
12
|
-
* non-relationship field on the list.
|
|
6
|
+
* @throws if `ui.labelField` names a field not declared on the list, or a
|
|
7
|
+
* relationship field (the Label field must be a scalar).
|
|
13
8
|
*/
|
|
14
9
|
export declare function getLabelFieldName(listConfig: ListConfig<any>): string;
|
|
15
10
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* when that field is missing from the row (e.g. stripped by field-level
|
|
19
|
-
* access).
|
|
11
|
+
* Render a row's Label field ({@link getLabelFieldName}) as text, falling
|
|
12
|
+
* back to `item.id` when the value is `null`/`undefined`.
|
|
20
13
|
*/
|
|
21
14
|
export declare function getItemLabel(listConfig: ListConfig<any>, item: Record<string, unknown>): string;
|
|
22
15
|
//# sourceMappingURL=label.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../src/config/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C
|
|
1
|
+
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../src/config/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C;;;;;;GAMG;AAEH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM,CAqBrE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAE1B,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,EAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CASR"}
|
package/dist/config/label.js
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Resolve the field name
|
|
3
|
-
*
|
|
4
|
-
* field this returns, so the field chosen for projection can never drift
|
|
5
|
-
* from the field used for rendering.
|
|
2
|
+
* Resolve the field name used as a list's Label field: `ui.labelField` if
|
|
3
|
+
* set, else `name`, else `title`, else `id`.
|
|
6
4
|
*
|
|
7
|
-
*
|
|
8
|
-
* (
|
|
9
|
-
*
|
|
10
|
-
* @throws if `ui.labelField` is set but does not reference a declared,
|
|
11
|
-
* non-relationship field on the list.
|
|
5
|
+
* @throws if `ui.labelField` names a field not declared on the list, or a
|
|
6
|
+
* relationship field (the Label field must be a scalar).
|
|
12
7
|
*/
|
|
13
8
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- ListConfig must accept any TypeInfo
|
|
14
9
|
export function getLabelFieldName(listConfig) {
|
|
@@ -30,10 +25,8 @@ export function getLabelFieldName(listConfig) {
|
|
|
30
25
|
return 'id';
|
|
31
26
|
}
|
|
32
27
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* when that field is missing from the row (e.g. stripped by field-level
|
|
36
|
-
* access).
|
|
28
|
+
* Render a row's Label field ({@link getLabelFieldName}) as text, falling
|
|
29
|
+
* back to `item.id` when the value is `null`/`undefined`.
|
|
37
30
|
*/
|
|
38
31
|
export function getItemLabel(
|
|
39
32
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- ListConfig must accept any TypeInfo
|
package/dist/config/label.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../src/config/label.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../src/config/label.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,qGAAqG;AACrG,MAAM,UAAU,iBAAiB,CAAC,UAA2B;IAC3D,MAAM,UAAU,GAAG,UAAU,CAAC,EAAE,EAAE,UAAU,CAAA;IAE5C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,kBAAkB,UAAU,qDAAqD,CAClF,CAAA;QACH,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACb,kBAAkB,UAAU,sDAAsD,CACnF,CAAA;QACH,CAAC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,IAAI,MAAM,IAAI,UAAU,CAAC,MAAM;QAAE,OAAO,MAAM,CAAA;IAC9C,IAAI,OAAO,IAAI,UAAU,CAAC,MAAM;QAAE,OAAO,OAAO,CAAA;IAChD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;AAC1B,qGAAqG;AACrG,UAA2B,EAC3B,IAA6B;IAE7B,MAAM,SAAS,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAA;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAEjG,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACxB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACtB,CAAC"}
|
|
@@ -2,33 +2,25 @@ import type { AccessContext } from '../access/types.js';
|
|
|
2
2
|
import type { ListConfig, OpenSaasConfig } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Whether a list's query access is **statically denied** — provably no session
|
|
5
|
-
* can read any row without evaluating a session-dependent function.
|
|
5
|
+
* can read any row, without evaluating a session-dependent function.
|
|
6
6
|
*
|
|
7
|
-
* Mirrors the list view's `canDeleteList` static check (issue #733):
|
|
8
|
-
* access is
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* context, which re-applies the real rule per row.
|
|
7
|
+
* Mirrors the list view's `canDeleteList` static check (issue #733): absent
|
|
8
|
+
* access is deny-by-default (matching the access engine), so only an explicit
|
|
9
|
+
* `false` counts as statically denied here — a function or `true` falls
|
|
10
|
+
* through to a real per-row check via the secured context.
|
|
12
11
|
*
|
|
13
12
|
* A statically-denied list must render no nav count at all: a `0` there would
|
|
14
13
|
* imply "this list is empty" when the truth is "you may see none of it".
|
|
15
14
|
*/
|
|
16
15
|
export declare function isListQueryStaticallyDenied(listConfig: ListConfig<any>): boolean;
|
|
17
16
|
/**
|
|
18
|
-
* Resolve the access-scoped nav counts for
|
|
19
|
-
* `ui.navCount` (issue #735).
|
|
17
|
+
* Resolve the access-scoped nav counts for lists that opt in via
|
|
18
|
+
* `ui.navCount` (issue #735). A list gets an entry only if it opts in, isn't
|
|
19
|
+
* a singleton (no meaningful count), and isn't {@link isListQueryStaticallyDenied}
|
|
20
|
+
* — everything else is omitted from the map, never zeroed.
|
|
20
21
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* 1. opts in (`ui.navCount === true`) — no count query runs for any other list,
|
|
25
|
-
* 2. is not a singleton (a single-record list has no meaningful count), and
|
|
26
|
-
* 3. does not have statically-denied query access (see
|
|
27
|
-
* {@link isListQueryStaticallyDenied}).
|
|
28
|
-
*
|
|
29
|
-
* Each count is read through the secured `context.db`, whose `count` applies the
|
|
30
|
-
* access filter, so the number reflects exactly what the current session may
|
|
31
|
-
* see (a denied row is not counted). Counts are fetched concurrently.
|
|
22
|
+
* Each count is read through the secured `context.db`, so it reflects
|
|
23
|
+
* exactly what the current session may see.
|
|
32
24
|
*/
|
|
33
25
|
export declare function resolveNavCounts(context: AccessContext, config: OpenSaasConfig): Promise<Record<string, number>>;
|
|
34
26
|
//# sourceMappingURL=nav-count.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-count.d.ts","sourceRoot":"","sources":["../../src/config/nav-count.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAY,MAAM,YAAY,CAAA;AAWtE
|
|
1
|
+
{"version":3,"file":"nav-count.d.ts","sourceRoot":"","sources":["../../src/config/nav-count.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAY,MAAM,YAAY,CAAA;AAWtE;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAEzC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,GAC1B,OAAO,CAKT;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA6BjC"}
|
package/dist/config/nav-count.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { getDbKey } from '../lib/case-utils.js';
|
|
2
2
|
/**
|
|
3
3
|
* Whether a list's query access is **statically denied** — provably no session
|
|
4
|
-
* can read any row without evaluating a session-dependent function.
|
|
4
|
+
* can read any row, without evaluating a session-dependent function.
|
|
5
5
|
*
|
|
6
|
-
* Mirrors the list view's `canDeleteList` static check (issue #733):
|
|
7
|
-
* access is
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* context, which re-applies the real rule per row.
|
|
6
|
+
* Mirrors the list view's `canDeleteList` static check (issue #733): absent
|
|
7
|
+
* access is deny-by-default (matching the access engine), so only an explicit
|
|
8
|
+
* `false` counts as statically denied here — a function or `true` falls
|
|
9
|
+
* through to a real per-row check via the secured context.
|
|
11
10
|
*
|
|
12
11
|
* A statically-denied list must render no nav count at all: a `0` there would
|
|
13
12
|
* imply "this list is empty" when the truth is "you may see none of it".
|
|
@@ -23,20 +22,13 @@ listConfig) {
|
|
|
23
22
|
return false;
|
|
24
23
|
}
|
|
25
24
|
/**
|
|
26
|
-
* Resolve the access-scoped nav counts for
|
|
27
|
-
* `ui.navCount` (issue #735).
|
|
25
|
+
* Resolve the access-scoped nav counts for lists that opt in via
|
|
26
|
+
* `ui.navCount` (issue #735). A list gets an entry only if it opts in, isn't
|
|
27
|
+
* a singleton (no meaningful count), and isn't {@link isListQueryStaticallyDenied}
|
|
28
|
+
* — everything else is omitted from the map, never zeroed.
|
|
28
29
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* 1. opts in (`ui.navCount === true`) — no count query runs for any other list,
|
|
33
|
-
* 2. is not a singleton (a single-record list has no meaningful count), and
|
|
34
|
-
* 3. does not have statically-denied query access (see
|
|
35
|
-
* {@link isListQueryStaticallyDenied}).
|
|
36
|
-
*
|
|
37
|
-
* Each count is read through the secured `context.db`, whose `count` applies the
|
|
38
|
-
* access filter, so the number reflects exactly what the current session may
|
|
39
|
-
* see (a denied row is not counted). Counts are fetched concurrently.
|
|
30
|
+
* Each count is read through the secured `context.db`, so it reflects
|
|
31
|
+
* exactly what the current session may see.
|
|
40
32
|
*/
|
|
41
33
|
export async function resolveNavCounts(context, config) {
|
|
42
34
|
const counts = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-count.js","sourceRoot":"","sources":["../../src/config/nav-count.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAY/C
|
|
1
|
+
{"version":3,"file":"nav-count.js","sourceRoot":"","sources":["../../src/config/nav-count.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAY/C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,2BAA2B;AACzC,qGAAqG;AACrG,UAA2B;IAE3B,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAA;IACvD,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IAC1C,IAAI,OAAO,WAAW,KAAK,SAAS;QAAE,OAAO,CAAC,WAAW,CAAA;IACzD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAsB,EACtB,MAAsB;IAEtB,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;IAEhC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QACpD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAqC,CAAA;QACrE,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAA;QAC7B,IAAI,UAAU,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QAClD,IAAI,UAAU,CAAC,WAAW;YAAE,OAAO,KAAK,CAAA;QACxC,OAAO,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC5B,MAAM,QAAQ,GAA8B,OAAO,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;QAC3E,IAAI,CAAC,QAAQ,EAAE,KAAK;YAAE,OAAM;QAC5B,0EAA0E;QAC1E,sEAAsE;QACtE,2EAA2E;QAC3E,4DAA4D;QAC5D,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAA;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAA;QACrE,CAAC;IACH,CAAC,CAAC,CACH,CAAA;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
import type { OpenSaasConfig } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Execute plugins and transform config
|
|
4
|
-
* Returns modified config with plugin data attached
|
|
5
|
-
*/
|
|
6
2
|
export declare function executePlugins(config: OpenSaasConfig): Promise<OpenSaasConfig>;
|
|
7
|
-
/**
|
|
8
|
-
* Execute beforeGenerate hooks from plugins
|
|
9
|
-
*/
|
|
10
3
|
export declare function executeBeforeGenerateHooks(config: OpenSaasConfig): Promise<OpenSaasConfig>;
|
|
11
|
-
/**
|
|
12
|
-
* Execute afterGenerate hooks from plugins
|
|
13
|
-
*/
|
|
14
4
|
export declare function executeAfterGenerateHooks(config: OpenSaasConfig, files: {
|
|
15
5
|
prismaSchema: string;
|
|
16
6
|
types: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-engine.d.ts","sourceRoot":"","sources":["../../src/config/plugin-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAOf,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin-engine.d.ts","sourceRoot":"","sources":["../../src/config/plugin-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAOf,MAAM,YAAY,CAAA;AAuGnB,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAkHpF;AAED,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAchG;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GACrF,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC,CAc1F"}
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Topological sort for plugin dependency resolution
|
|
3
|
-
* Ensures plugins execute in correct order based on dependencies
|
|
4
|
-
*/
|
|
5
1
|
function sortPluginsByDependencies(plugins) {
|
|
6
2
|
const pluginMap = new Map();
|
|
7
3
|
const visited = new Set();
|
|
8
4
|
const visiting = new Set();
|
|
9
5
|
const sorted = [];
|
|
10
|
-
// Build plugin map
|
|
11
6
|
for (const plugin of plugins) {
|
|
12
7
|
if (pluginMap.has(plugin.name)) {
|
|
13
8
|
throw new Error(`Duplicate plugin name: ${plugin.name}`);
|
|
@@ -25,7 +20,6 @@ function sortPluginsByDependencies(plugins) {
|
|
|
25
20
|
throw new Error(`Plugin "${pluginName}" is required by "${path[path.length - 1]}" but not found`);
|
|
26
21
|
}
|
|
27
22
|
visiting.add(pluginName);
|
|
28
|
-
// Visit dependencies first
|
|
29
23
|
if (plugin.dependencies) {
|
|
30
24
|
for (const dep of plugin.dependencies) {
|
|
31
25
|
visit(dep, [...path, pluginName]);
|
|
@@ -35,23 +29,17 @@ function sortPluginsByDependencies(plugins) {
|
|
|
35
29
|
visited.add(pluginName);
|
|
36
30
|
sorted.push(plugin);
|
|
37
31
|
}
|
|
38
|
-
// Visit all plugins
|
|
39
32
|
for (const plugin of plugins) {
|
|
40
33
|
visit(plugin.name);
|
|
41
34
|
}
|
|
42
35
|
return sorted;
|
|
43
36
|
}
|
|
44
|
-
/**
|
|
45
|
-
* Merge hooks from extension into existing hooks
|
|
46
|
-
* Combines hook arrays so multiple plugins can add hooks
|
|
47
|
-
*/
|
|
48
37
|
function mergeHooks(existing, extension) {
|
|
49
38
|
if (!extension)
|
|
50
39
|
return existing;
|
|
51
40
|
if (!existing)
|
|
52
41
|
return extension;
|
|
53
42
|
const merged = {};
|
|
54
|
-
// Merge resolveInput hooks (chain them, passing resolvedData through)
|
|
55
43
|
if (existing.resolveInput || extension.resolveInput) {
|
|
56
44
|
if (existing.resolveInput && extension.resolveInput) {
|
|
57
45
|
merged.resolveInput = async (args) => {
|
|
@@ -64,7 +52,6 @@ function mergeHooks(existing, extension) {
|
|
|
64
52
|
merged.resolveInput = existing.resolveInput || extension.resolveInput;
|
|
65
53
|
}
|
|
66
54
|
}
|
|
67
|
-
// Merge validateInput hooks (run both)
|
|
68
55
|
if (existing.validateInput || extension.validateInput) {
|
|
69
56
|
if (existing.validateInput && extension.validateInput) {
|
|
70
57
|
merged.validateInput = async (args) => {
|
|
@@ -76,7 +63,6 @@ function mergeHooks(existing, extension) {
|
|
|
76
63
|
merged.validateInput = existing.validateInput || extension.validateInput;
|
|
77
64
|
}
|
|
78
65
|
}
|
|
79
|
-
// Merge beforeOperation hooks (run both in sequence)
|
|
80
66
|
if (existing.beforeOperation || extension.beforeOperation) {
|
|
81
67
|
if (existing.beforeOperation && extension.beforeOperation) {
|
|
82
68
|
merged.beforeOperation = async (args) => {
|
|
@@ -88,7 +74,6 @@ function mergeHooks(existing, extension) {
|
|
|
88
74
|
merged.beforeOperation = existing.beforeOperation || extension.beforeOperation;
|
|
89
75
|
}
|
|
90
76
|
}
|
|
91
|
-
// Merge afterOperation hooks (run both in sequence)
|
|
92
77
|
if (existing.afterOperation || extension.afterOperation) {
|
|
93
78
|
if (existing.afterOperation && extension.afterOperation) {
|
|
94
79
|
merged.afterOperation = async (args) => {
|
|
@@ -102,28 +87,19 @@ function mergeHooks(existing, extension) {
|
|
|
102
87
|
}
|
|
103
88
|
return Object.keys(merged).length > 0 ? merged : undefined;
|
|
104
89
|
}
|
|
105
|
-
/**
|
|
106
|
-
* Execute plugins and transform config
|
|
107
|
-
* Returns modified config with plugin data attached
|
|
108
|
-
*/
|
|
109
90
|
export async function executePlugins(config) {
|
|
110
91
|
if (!config.plugins || config.plugins.length === 0) {
|
|
111
92
|
return config;
|
|
112
93
|
}
|
|
113
|
-
// Sort plugins by dependencies
|
|
114
94
|
const sortedPlugins = sortPluginsByDependencies(config.plugins);
|
|
115
|
-
// Initialize mutable config state - preserve all config properties
|
|
116
95
|
let currentConfig = {
|
|
117
96
|
...config,
|
|
118
97
|
lists: { ...config.lists }, // Clone lists object to avoid mutating original
|
|
119
98
|
_pluginData: {},
|
|
120
99
|
};
|
|
121
|
-
// Field type registry (for third-party fields)
|
|
122
100
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Registry must accept any field config builder
|
|
123
101
|
const fieldTypeRegistry = new Map();
|
|
124
|
-
// MCP tools registry
|
|
125
102
|
const mcpToolsRegistry = [];
|
|
126
|
-
// Execute each plugin
|
|
127
103
|
for (const plugin of sortedPlugins) {
|
|
128
104
|
const context = {
|
|
129
105
|
config: currentConfig,
|
|
@@ -149,14 +125,11 @@ export async function executePlugins(config) {
|
|
|
149
125
|
`but access control belongs to the application (or whichever party created the list), never a ` +
|
|
150
126
|
`plugin extending it. Remove "access" from this extension — see ADR-0013.`);
|
|
151
127
|
}
|
|
152
|
-
// Deep merge fields
|
|
153
128
|
const mergedFields = {
|
|
154
129
|
...existing.fields,
|
|
155
130
|
...extension.fields,
|
|
156
131
|
};
|
|
157
|
-
// Merge hooks
|
|
158
132
|
const mergedHooks = mergeHooks(existing.hooks, extension.hooks);
|
|
159
|
-
// Merge MCP config
|
|
160
133
|
const mergedMcp = extension.mcp
|
|
161
134
|
? {
|
|
162
135
|
...existing.mcp,
|
|
@@ -187,27 +160,21 @@ export async function executePlugins(config) {
|
|
|
187
160
|
currentConfig._pluginData[pluginName] = data;
|
|
188
161
|
},
|
|
189
162
|
};
|
|
190
|
-
// Execute plugin init
|
|
191
163
|
await plugin.init(context);
|
|
192
164
|
}
|
|
193
|
-
// Store registered MCP tools in config (if any)
|
|
194
165
|
if (mcpToolsRegistry.length > 0) {
|
|
195
166
|
if (!currentConfig._pluginData) {
|
|
196
167
|
currentConfig._pluginData = {};
|
|
197
168
|
}
|
|
198
169
|
currentConfig._pluginData.__mcpTools = mcpToolsRegistry;
|
|
199
170
|
}
|
|
200
|
-
//
|
|
201
|
-
// This allows context creation to call plugin.runtime() functions
|
|
171
|
+
// Stored so context creation can call each plugin's runtime() function.
|
|
202
172
|
if (!currentConfig._plugins) {
|
|
203
173
|
currentConfig._plugins = [];
|
|
204
174
|
}
|
|
205
175
|
currentConfig._plugins = sortedPlugins;
|
|
206
176
|
return currentConfig;
|
|
207
177
|
}
|
|
208
|
-
/**
|
|
209
|
-
* Execute beforeGenerate hooks from plugins
|
|
210
|
-
*/
|
|
211
178
|
export async function executeBeforeGenerateHooks(config) {
|
|
212
179
|
if (!config.plugins || config.plugins.length === 0) {
|
|
213
180
|
return config;
|
|
@@ -220,9 +187,6 @@ export async function executeBeforeGenerateHooks(config) {
|
|
|
220
187
|
}
|
|
221
188
|
return currentConfig;
|
|
222
189
|
}
|
|
223
|
-
/**
|
|
224
|
-
* Execute afterGenerate hooks from plugins
|
|
225
|
-
*/
|
|
226
190
|
export async function executeAfterGenerateHooks(config, files) {
|
|
227
191
|
if (!config.plugins || config.plugins.length === 0) {
|
|
228
192
|
return files;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-engine.js","sourceRoot":"","sources":["../../src/config/plugin-engine.ts"],"names":[],"mappings":"AAUA
|
|
1
|
+
{"version":3,"file":"plugin-engine.js","sourceRoot":"","sources":["../../src/config/plugin-engine.ts"],"names":[],"mappings":"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"}
|