@opensaas/stack-auth 0.27.1 → 0.28.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 +42 -0
- package/CLAUDE.md +35 -1
- package/dist/config/derive-auth-lists.d.ts +15 -5
- package/dist/config/derive-auth-lists.d.ts.map +1 -1
- package/dist/config/derive-auth-lists.js +59 -98
- package/dist/config/derive-auth-lists.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/plugin.d.ts.map +1 -1
- package/dist/config/plugin.js +31 -13
- package/dist/config/plugin.js.map +1 -1
- package/dist/config/types.d.ts +58 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/lists/index.d.ts +9 -4
- package/dist/lists/index.d.ts.map +1 -1
- package/dist/lists/index.js +3 -2
- package/dist/lists/index.js.map +1 -1
- package/dist/runtime/types.d.ts +7 -5
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/server/schema-converter.d.ts +34 -2
- package/dist/server/schema-converter.d.ts.map +1 -1
- package/dist/server/schema-converter.js +47 -163
- package/dist/server/schema-converter.js.map +1 -1
- package/package.json +2 -2
- package/src/config/derive-auth-lists.ts +61 -87
- package/src/config/index.ts +1 -0
- package/src/config/plugin.ts +36 -13
- package/src/config/types.ts +64 -0
- package/src/lists/index.ts +10 -4
- package/src/runtime/types.ts +7 -5
- package/src/server/schema-converter.ts +68 -158
- package/tests/config.test.ts +110 -0
- package/tests/derive-auth-lists.test.ts +54 -1
- package/tests/lists.test.ts +42 -145
- package/tests/plugin-derived-keys.test.ts +130 -18
- package/tests/schema-converter.test.ts +58 -21
- package/tsconfig.tsbuildinfo +1 -1
package/dist/config/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ListConfig } from '@opensaas/stack-core';
|
|
1
2
|
import type { ExtendUserListConfig } from '../lists/index.js';
|
|
2
3
|
/**
|
|
3
4
|
* OAuth provider configuration
|
|
@@ -93,6 +94,47 @@ export type SessionConfig = {
|
|
|
93
94
|
* })
|
|
94
95
|
* ```
|
|
95
96
|
*/
|
|
97
|
+
/**
|
|
98
|
+
* App-authored operation + field-level access control for the Auth lists,
|
|
99
|
+
* keyed by better-auth model name (not by the derived list key, so it stays
|
|
100
|
+
* remap-proof when e.g. `user.modelName: 'AuthUser'`).
|
|
101
|
+
*
|
|
102
|
+
* Per ADR-0013, the auth plugin ships its created lists (User/Session/
|
|
103
|
+
* Account/Verification) **closed** — no permissive defaults. This is the
|
|
104
|
+
* application's seam to grant them access: the plugin applies each entry to
|
|
105
|
+
* the corresponding list when it creates it (its own `addList` path), so the
|
|
106
|
+
* access rides along with the list's `@@map`/`@@schema`/fields and can't
|
|
107
|
+
* drift from the plugin's shape. A model with no entry here stays closed
|
|
108
|
+
* (deny-by-default).
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* authPlugin({
|
|
113
|
+
* access: {
|
|
114
|
+
* // Signed-in users can read the directory; only self can write.
|
|
115
|
+
* user: {
|
|
116
|
+
* operation: {
|
|
117
|
+
* query: ({ session }) => !!session,
|
|
118
|
+
* update: ({ session, item }) => session?.userId === item.id,
|
|
119
|
+
* },
|
|
120
|
+
* },
|
|
121
|
+
* // A user can read only their own sessions.
|
|
122
|
+
* session: {
|
|
123
|
+
* operation: {
|
|
124
|
+
* query: ({ session }) =>
|
|
125
|
+
* session ? { user: { id: { equals: session.userId } } } : false,
|
|
126
|
+
* },
|
|
127
|
+
* },
|
|
128
|
+
* },
|
|
129
|
+
* })
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export type AuthAccessConfig = {
|
|
133
|
+
user?: ListConfig<any>['access'];
|
|
134
|
+
session?: ListConfig<any>['access'];
|
|
135
|
+
account?: ListConfig<any>['access'];
|
|
136
|
+
verification?: ListConfig<any>['access'];
|
|
137
|
+
};
|
|
96
138
|
export type AuthModelConfig = {
|
|
97
139
|
/**
|
|
98
140
|
* The table/list name for this model.
|
|
@@ -226,6 +268,22 @@ export type AuthConfig = {
|
|
|
226
268
|
* ```
|
|
227
269
|
*/
|
|
228
270
|
extendUserList?: ExtendUserListConfig;
|
|
271
|
+
/**
|
|
272
|
+
* App-authored access control for the Auth lists (User/Session/Account/
|
|
273
|
+
* Verification), keyed by better-auth model name. See {@link AuthAccessConfig}.
|
|
274
|
+
*
|
|
275
|
+
* Per ADR-0013 the auth plugin ships these lists **closed** by default — a
|
|
276
|
+
* model with no entry here denies every operation (`context.db` reads/writes
|
|
277
|
+
* return `null`/`[]` and the list doesn't surface in the admin UI). Grant
|
|
278
|
+
* access explicitly for any Auth list your application reads or writes
|
|
279
|
+
* through `context.db`.
|
|
280
|
+
*
|
|
281
|
+
* For the `user` model specifically, {@link ExtendUserListConfig.access}
|
|
282
|
+
* (via `extendUserList.access`) is still honoured and takes precedence over
|
|
283
|
+
* `access.user` if both are set — it predates this option and remains the
|
|
284
|
+
* narrower, User-specific override.
|
|
285
|
+
*/
|
|
286
|
+
access?: AuthAccessConfig;
|
|
229
287
|
/**
|
|
230
288
|
* Custom email sending function for verification and password reset
|
|
231
289
|
* If not provided, emails will be logged to console
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
package/dist/lists/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ListConfig, FieldConfig } from '@opensaas/stack-core';
|
|
2
|
-
import type { NormalizedAuthModels } from '../config/types.js';
|
|
2
|
+
import type { AuthAccessConfig, NormalizedAuthModels } from '../config/types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Configuration for extending the auto-generated User list
|
|
5
5
|
*/
|
|
@@ -10,8 +10,12 @@ export type ExtendUserListConfig = {
|
|
|
10
10
|
*/
|
|
11
11
|
fields?: Record<string, FieldConfig>;
|
|
12
12
|
/**
|
|
13
|
-
* Access control for the User list
|
|
14
|
-
*
|
|
13
|
+
* Access control for the User list.
|
|
14
|
+
*
|
|
15
|
+
* Per ADR-0013, if neither this nor `authPlugin({ access: { user: … } })` is
|
|
16
|
+
* provided, the User list is **closed** (deny-by-default) — it no longer
|
|
17
|
+
* defaults to permissive access. Takes precedence over `access.user` when
|
|
18
|
+
* both are set.
|
|
15
19
|
*/
|
|
16
20
|
access?: ListConfig<any>['access'];
|
|
17
21
|
/**
|
|
@@ -47,6 +51,7 @@ export declare function createVerificationList(): ListConfig<any>;
|
|
|
47
51
|
*
|
|
48
52
|
* @param userConfig - Extra User-list fields/access/hooks (from `extendUserList`)
|
|
49
53
|
* @param models - Resolved better-auth model config; defaults to the better-auth defaults
|
|
54
|
+
* @param accessConfig - App-authored access for each Auth list, keyed by better-auth model name
|
|
50
55
|
*/
|
|
51
|
-
export declare function getAuthLists(userConfig?: ExtendUserListConfig, models?: NormalizedAuthModels): Record<string, ListConfig<any>>;
|
|
56
|
+
export declare function getAuthLists(userConfig?: ExtendUserListConfig, models?: NormalizedAuthModels, accessConfig?: AuthAccessConfig): Record<string, ListConfig<any>>;
|
|
52
57
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lists/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lists/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAGhF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACpC;;;;;;;OAOG;IAEH,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAA;IAClC;;OAEG;IAEH,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;CACjC,CAAA;AAeD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,MAAM,CAAC,EAAE,oBAAoB,GAE5B,UAAU,CAAC,GAAG,CAAC,CAEjB;AAED;;GAEG;AAEH,wBAAgB,iBAAiB,IAAI,UAAU,CAAC,GAAG,CAAC,CAEnD;AAED;;GAEG;AAEH,wBAAgB,iBAAiB,IAAI,UAAU,CAAC,GAAG,CAAC,CAEnD;AAED;;GAEG;AAEH,wBAAgB,sBAAsB,IAAI,UAAU,CAAC,GAAG,CAAC,CAExD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,UAAU,CAAC,EAAE,oBAAoB,EACjC,MAAM,GAAE,oBAAqC,EAC7C,YAAY,CAAC,EAAE,gBAAgB,GAE9B,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAEjC"}
|
package/dist/lists/index.js
CHANGED
|
@@ -50,8 +50,9 @@ export function createVerificationList() {
|
|
|
50
50
|
*
|
|
51
51
|
* @param userConfig - Extra User-list fields/access/hooks (from `extendUserList`)
|
|
52
52
|
* @param models - Resolved better-auth model config; defaults to the better-auth defaults
|
|
53
|
+
* @param accessConfig - App-authored access for each Auth list, keyed by better-auth model name
|
|
53
54
|
*/
|
|
54
|
-
export function getAuthLists(userConfig, models = DEFAULT_MODELS) {
|
|
55
|
-
return deriveAuthLists(models, userConfig || {}).lists;
|
|
55
|
+
export function getAuthLists(userConfig, models = DEFAULT_MODELS, accessConfig) {
|
|
56
|
+
return deriveAuthLists(models, userConfig || {}, accessConfig || {}).lists;
|
|
56
57
|
}
|
|
57
58
|
//# sourceMappingURL=index.js.map
|
package/dist/lists/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lists/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lists/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AA4BhE;;;;;GAKG;AACH,MAAM,cAAc,GAAyB;IAC3C,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;IACvC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;IAC7C,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;IAC7C,YAAY,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE;CACxD,CAAA;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,MAA6B;IAG7B,OAAO,eAAe,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;AAC3D,CAAC;AAED;;GAEG;AACH,qGAAqG;AACrG,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,OAAO,CAAA;AACtD,CAAC;AAED;;GAEG;AACH,qGAAqG;AACrG,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,OAAO,CAAA;AACtD,CAAC;AAED;;GAEG;AACH,qGAAqG;AACrG,MAAM,UAAU,sBAAsB;IACpC,OAAO,eAAe,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,YAAY,CAAA;AAC3D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAC1B,UAAiC,EACjC,MAAM,GAAyB,cAAc,EAC7C,YAA+B;IAG/B,OAAO,eAAe,CAAC,MAAM,EAAE,UAAU,IAAI,EAAE,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC,KAAK,CAAA;AAC5E,CAAC"}
|
package/dist/runtime/types.d.ts
CHANGED
|
@@ -8,16 +8,18 @@
|
|
|
8
8
|
*/
|
|
9
9
|
export interface AuthRuntimeServices {
|
|
10
10
|
/**
|
|
11
|
-
* Get user by ID
|
|
12
|
-
*
|
|
11
|
+
* Get user by ID.
|
|
12
|
+
* Resolves through the plugin runtime's `sudo` helper, so the result does
|
|
13
|
+
* not depend on the application's User list access policy (ADR-0013).
|
|
13
14
|
*
|
|
14
15
|
* @param userId - The ID of the user to fetch
|
|
15
|
-
* @returns User object or null if not found
|
|
16
|
+
* @returns User object or null if not found
|
|
16
17
|
*/
|
|
17
18
|
getUser: (userId: string) => Promise<unknown>;
|
|
18
19
|
/**
|
|
19
|
-
* Get current user from session
|
|
20
|
-
* Extracts userId from session and fetches user data
|
|
20
|
+
* Get current user from session.
|
|
21
|
+
* Extracts userId from session and fetches user data through the plugin
|
|
22
|
+
* runtime's `sudo` helper — see {@link getUser}.
|
|
21
23
|
*
|
|
22
24
|
* @returns Current user object or null if not authenticated or not found
|
|
23
25
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;OAOG;IACH,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAE7C;;;;;;OAMG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CACvC"}
|
|
@@ -28,13 +28,45 @@ type BetterAuthTableSchema = {
|
|
|
28
28
|
fields: Record<string, BetterAuthFieldAttribute>;
|
|
29
29
|
};
|
|
30
30
|
/**
|
|
31
|
-
* Convert Better Auth table schema to OpenSaaS ListConfig
|
|
31
|
+
* Convert Better Auth table schema to OpenSaaS ListConfig.
|
|
32
|
+
*
|
|
33
|
+
* Per ADR-0013, plugin-injected lists ship **closed** — no access is set here,
|
|
34
|
+
* so the list denies every operation until the application grants it. For a
|
|
35
|
+
* table that resolves onto one of the four base auth models (user/session/
|
|
36
|
+
* account/verification), that means `authPlugin({ access: { ... } })`; for any
|
|
37
|
+
* other better-auth-plugin-declared table (e.g. OAuth client tables from the
|
|
38
|
+
* `mcp` plugin), the application must declare the list itself under the same
|
|
39
|
+
* derived key so the plugin's field-only extend path can merge in (its access
|
|
40
|
+
* then stands untouched).
|
|
32
41
|
*/
|
|
33
42
|
export declare function convertTableToList(tableName: string, tableSchema: BetterAuthTableSchema): ListConfig<any>;
|
|
43
|
+
/**
|
|
44
|
+
* Base better-auth model keys — the four tables the auth plugin's own model
|
|
45
|
+
* config (`user`/`session`/`account`/`verification`) can remap via `modelName`.
|
|
46
|
+
*/
|
|
47
|
+
type BaseAuthModelKey = 'user' | 'session' | 'account' | 'verification';
|
|
48
|
+
/**
|
|
49
|
+
* Resolved list key for each base better-auth model, as derived by
|
|
50
|
+
* {@link deriveAuthLists} from the plugin's configured model-key remap (e.g.
|
|
51
|
+
* `user.modelName: 'AuthUser'`). Passed to {@link convertBetterAuthSchema} so a
|
|
52
|
+
* provider plugin's schema extension of a base model (e.g. `user`) lands on the
|
|
53
|
+
* same adopted Auth list rather than being re-derived from the plugin's own
|
|
54
|
+
* table name.
|
|
55
|
+
*/
|
|
56
|
+
export type BaseAuthModelKeys = Partial<Record<BaseAuthModelKey, string>>;
|
|
34
57
|
/**
|
|
35
58
|
* Convert all Better Auth tables to OpenSaaS list configs
|
|
36
59
|
* This is called by authPlugin() to generate lists from Better Auth + plugins
|
|
60
|
+
*
|
|
61
|
+
* @param tables - The better-auth plugin's declared schema extension
|
|
62
|
+
* @param baseModelKeys - The resolved list keys for the four base auth models
|
|
63
|
+
* (`user`/`session`/`account`/`verification`), from the same model-key remap
|
|
64
|
+
* the Auth lists themselves use. When a table name matches one of these keys
|
|
65
|
+
* (case-insensitively), its list key is taken from here instead of being
|
|
66
|
+
* re-derived from the table name — so a schema extension targeting `user`
|
|
67
|
+
* lands on the adopted Auth list (e.g. `AuthUser`) rather than a re-derived
|
|
68
|
+
* `User`, even when that key collides with an unrelated host list.
|
|
37
69
|
*/
|
|
38
|
-
export declare function convertBetterAuthSchema(tables: Record<string, BetterAuthTableSchema
|
|
70
|
+
export declare function convertBetterAuthSchema(tables: Record<string, BetterAuthTableSchema>, baseModelKeys?: BaseAuthModelKeys): Record<string, ListConfig<any>>;
|
|
39
71
|
export {};
|
|
40
72
|
//# sourceMappingURL=schema-converter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-converter.d.ts","sourceRoot":"","sources":["../../src/server/schema-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,sBAAsB,CAAA;AAEnE;;;GAGG;AACH,KAAK,wBAAwB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE;QACX,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAA;KAC/C,CAAA;IACD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED;;GAEG;AACH,KAAK,qBAAqB,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;CACjD,CAAA;
|
|
1
|
+
{"version":3,"file":"schema-converter.d.ts","sourceRoot":"","sources":["../../src/server/schema-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,sBAAsB,CAAA;AAEnE;;;GAGG;AACH,KAAK,wBAAwB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE;QACX,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAA;KAC/C,CAAA;IACD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED;;GAEG;AACH,KAAK,qBAAqB,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;CACjD,CAAA;AA2DD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,qBAAqB,GAEjC,UAAU,CAAC,GAAG,CAAC,CA4BjB;AAED;;;GAGG;AACH,KAAK,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,CAAA;AAEvE;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAA;AA0BzE;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAC7C,aAAa,GAAE,iBAAsB,GAEpC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAejC"}
|
|
@@ -49,161 +49,16 @@ function convertField(fieldName, betterAuthField) {
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
query: () => true, // Anyone can query users
|
|
63
|
-
create: () => true, // Anyone can create (sign up)
|
|
64
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Access control parameters are runtime values
|
|
65
|
-
update: ({ session, item }) => {
|
|
66
|
-
if (!session)
|
|
67
|
-
return false;
|
|
68
|
-
const userId = session.userId;
|
|
69
|
-
const itemId = item?.id;
|
|
70
|
-
return userId === itemId;
|
|
71
|
-
},
|
|
72
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Access control parameters are runtime values
|
|
73
|
-
delete: ({ session, item }) => {
|
|
74
|
-
if (!session)
|
|
75
|
-
return false;
|
|
76
|
-
const userId = session.userId;
|
|
77
|
-
const itemId = item?.id;
|
|
78
|
-
return userId === itemId;
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
// Session table
|
|
84
|
-
if (lowerTableName === 'session') {
|
|
85
|
-
return {
|
|
86
|
-
operation: {
|
|
87
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Access control parameters are runtime values
|
|
88
|
-
query: ({ session }) => {
|
|
89
|
-
if (!session)
|
|
90
|
-
return false;
|
|
91
|
-
const userId = session.userId;
|
|
92
|
-
if (!userId)
|
|
93
|
-
return false;
|
|
94
|
-
return {
|
|
95
|
-
user: { id: { equals: userId } },
|
|
96
|
-
};
|
|
97
|
-
},
|
|
98
|
-
create: () => true, // Better-auth handles session creation
|
|
99
|
-
update: () => false, // No manual updates
|
|
100
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Access control parameters are runtime values
|
|
101
|
-
delete: ({ session, item }) => {
|
|
102
|
-
if (!session)
|
|
103
|
-
return false;
|
|
104
|
-
const userId = session.userId;
|
|
105
|
-
const itemUserId = item?.user?.id;
|
|
106
|
-
return userId === itemUserId;
|
|
107
|
-
},
|
|
108
|
-
},
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
// Account table
|
|
112
|
-
if (lowerTableName === 'account') {
|
|
113
|
-
return {
|
|
114
|
-
operation: {
|
|
115
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Access control parameters are runtime values
|
|
116
|
-
query: ({ session }) => {
|
|
117
|
-
if (!session)
|
|
118
|
-
return false;
|
|
119
|
-
const userId = session.userId;
|
|
120
|
-
if (!userId)
|
|
121
|
-
return false;
|
|
122
|
-
return {
|
|
123
|
-
user: { id: { equals: userId } },
|
|
124
|
-
};
|
|
125
|
-
},
|
|
126
|
-
create: () => true, // Better-auth handles account creation
|
|
127
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Access control parameters are runtime values
|
|
128
|
-
update: ({ session, item }) => {
|
|
129
|
-
if (!session)
|
|
130
|
-
return false;
|
|
131
|
-
const userId = session.userId;
|
|
132
|
-
const itemUserId = item?.user?.id;
|
|
133
|
-
return userId === itemUserId;
|
|
134
|
-
},
|
|
135
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Access control parameters are runtime values
|
|
136
|
-
delete: ({ session, item }) => {
|
|
137
|
-
if (!session)
|
|
138
|
-
return false;
|
|
139
|
-
const userId = session.userId;
|
|
140
|
-
const itemUserId = item?.user?.id;
|
|
141
|
-
return userId === itemUserId;
|
|
142
|
-
},
|
|
143
|
-
},
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
// Verification table
|
|
147
|
-
if (lowerTableName === 'verification') {
|
|
148
|
-
return {
|
|
149
|
-
operation: {
|
|
150
|
-
query: () => false, // No public querying
|
|
151
|
-
create: () => true, // Better-auth creates verification tokens
|
|
152
|
-
update: () => false, // No updates
|
|
153
|
-
delete: () => true, // Better-auth deletes used/expired tokens
|
|
154
|
-
},
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
// OAuth tables (from MCP/OIDC plugins)
|
|
158
|
-
if (lowerTableName === 'oauthapplication' ||
|
|
159
|
-
lowerTableName === 'oauthaccesstoken' ||
|
|
160
|
-
lowerTableName === 'oauthconsent') {
|
|
161
|
-
return {
|
|
162
|
-
operation: {
|
|
163
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Access control parameters are runtime values
|
|
164
|
-
query: ({ session }) => {
|
|
165
|
-
if (!session)
|
|
166
|
-
return false;
|
|
167
|
-
const userId = session.userId;
|
|
168
|
-
if (!userId)
|
|
169
|
-
return false;
|
|
170
|
-
// Filter by userId if field exists
|
|
171
|
-
return {
|
|
172
|
-
userId: { equals: userId },
|
|
173
|
-
};
|
|
174
|
-
},
|
|
175
|
-
create: () => true, // Better-auth/plugins handle creation
|
|
176
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Access control parameters are runtime values
|
|
177
|
-
update: ({ session, item }) => {
|
|
178
|
-
if (!session)
|
|
179
|
-
return false;
|
|
180
|
-
const userId = session.userId;
|
|
181
|
-
const itemUserId = item?.userId;
|
|
182
|
-
return userId === itemUserId;
|
|
183
|
-
},
|
|
184
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Access control parameters are runtime values
|
|
185
|
-
delete: ({ session, item }) => {
|
|
186
|
-
if (!session)
|
|
187
|
-
return false;
|
|
188
|
-
const userId = session.userId;
|
|
189
|
-
const itemUserId = item?.userId;
|
|
190
|
-
return userId === itemUserId;
|
|
191
|
-
},
|
|
192
|
-
},
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
// Default: restrict all access (safest default)
|
|
196
|
-
return {
|
|
197
|
-
operation: {
|
|
198
|
-
query: () => false,
|
|
199
|
-
create: () => false,
|
|
200
|
-
update: () => false,
|
|
201
|
-
delete: () => false,
|
|
202
|
-
},
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Convert Better Auth table schema to OpenSaaS ListConfig
|
|
52
|
+
* Convert Better Auth table schema to OpenSaaS ListConfig.
|
|
53
|
+
*
|
|
54
|
+
* Per ADR-0013, plugin-injected lists ship **closed** — no access is set here,
|
|
55
|
+
* so the list denies every operation until the application grants it. For a
|
|
56
|
+
* table that resolves onto one of the four base auth models (user/session/
|
|
57
|
+
* account/verification), that means `authPlugin({ access: { ... } })`; for any
|
|
58
|
+
* other better-auth-plugin-declared table (e.g. OAuth client tables from the
|
|
59
|
+
* `mcp` plugin), the application must declare the list itself under the same
|
|
60
|
+
* derived key so the plugin's field-only extend path can merge in (its access
|
|
61
|
+
* then stands untouched).
|
|
207
62
|
*/
|
|
208
63
|
export function convertTableToList(tableName, tableSchema) {
|
|
209
64
|
const fields = {};
|
|
@@ -229,21 +84,50 @@ export function convertTableToList(tableName, tableSchema) {
|
|
|
229
84
|
}
|
|
230
85
|
}
|
|
231
86
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
87
|
+
return list({ fields });
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Look up the configured remap for a table name, if it names one of the four
|
|
91
|
+
* base better-auth models (case-insensitively). Written as an explicit switch
|
|
92
|
+
* rather than an indexed lookup so no type assertion is needed to narrow the
|
|
93
|
+
* table name into {@link BaseAuthModelKey}.
|
|
94
|
+
*/
|
|
95
|
+
function resolveBaseModelKey(tableName, baseModelKeys) {
|
|
96
|
+
switch (tableName.toLowerCase()) {
|
|
97
|
+
case 'user':
|
|
98
|
+
return baseModelKeys.user;
|
|
99
|
+
case 'session':
|
|
100
|
+
return baseModelKeys.session;
|
|
101
|
+
case 'account':
|
|
102
|
+
return baseModelKeys.account;
|
|
103
|
+
case 'verification':
|
|
104
|
+
return baseModelKeys.verification;
|
|
105
|
+
default:
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
237
108
|
}
|
|
238
109
|
/**
|
|
239
110
|
* Convert all Better Auth tables to OpenSaaS list configs
|
|
240
111
|
* This is called by authPlugin() to generate lists from Better Auth + plugins
|
|
112
|
+
*
|
|
113
|
+
* @param tables - The better-auth plugin's declared schema extension
|
|
114
|
+
* @param baseModelKeys - The resolved list keys for the four base auth models
|
|
115
|
+
* (`user`/`session`/`account`/`verification`), from the same model-key remap
|
|
116
|
+
* the Auth lists themselves use. When a table name matches one of these keys
|
|
117
|
+
* (case-insensitively), its list key is taken from here instead of being
|
|
118
|
+
* re-derived from the table name — so a schema extension targeting `user`
|
|
119
|
+
* lands on the adopted Auth list (e.g. `AuthUser`) rather than a re-derived
|
|
120
|
+
* `User`, even when that key collides with an unrelated host list.
|
|
241
121
|
*/
|
|
242
|
-
export function convertBetterAuthSchema(tables) {
|
|
122
|
+
export function convertBetterAuthSchema(tables, baseModelKeys = {}) {
|
|
243
123
|
const lists = {}; // eslint-disable-line @typescript-eslint/no-explicit-any -- ListConfig must accept any TypeInfo
|
|
244
124
|
for (const [tableName, tableSchema] of Object.entries(tables)) {
|
|
245
|
-
//
|
|
246
|
-
|
|
125
|
+
// A base-model remap always wins: it reflects the actual configured list
|
|
126
|
+
// key for that model, whereas `tableSchema.modelName`/the table name are
|
|
127
|
+
// just how the provider plugin happens to describe its own extension.
|
|
128
|
+
const listKey = resolveBaseModelKey(tableName, baseModelKeys) ||
|
|
129
|
+
tableSchema.modelName ||
|
|
130
|
+
toPascalCase(tableName);
|
|
247
131
|
lists[listKey] = convertTableToList(tableName, tableSchema);
|
|
248
132
|
}
|
|
249
133
|
return lists;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-converter.js","sourceRoot":"","sources":["../../src/server/schema-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AA6BhF;;GAEG;AACH,SAAS,YAAY,CACnB,SAAiB,EACjB,eAAyC;IAEzC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,eAAe,CAAA;IAE5E,+CAA+C;IAC/C,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QACjF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,oCAAoC;IACpC,IAAI,UAAU,EAAE,CAAC;QACf,uCAAuC;QACvC,mDAAmD;QACnD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,gDAAgD;IAChD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC;gBACV,UAAU,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;gBACpC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;gBACxC,YAAY,EAAE,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;aAC1E,CAAC,CAAA;QAEJ,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC;gBACb,UAAU,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;gBACpC,YAAY,EAAE,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;aAC1E,CAAC,CAAA;QAEJ,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC;gBACd,YAAY,EAAE,OAAO,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK;aACvE,CAAC,CAAA;QAEJ,KAAK,MAAM;YACT,OAAO,SAAS,CAAC;gBACf,YAAY,EAAE,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;aACnE,CAAC,CAAA;QAEJ;YACE,iCAAiC;YACjC,OAAO,CAAC,IAAI,CACV,gDAAgD,IAAI,gBAAgB,SAAS,6BAA6B,CAC3G,CAAA;YACD,OAAO,IAAI,CAAC;gBACV,UAAU,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;aACrC,CAAC,CAAA;IACN,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"schema-converter.js","sourceRoot":"","sources":["../../src/server/schema-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AA6BhF;;GAEG;AACH,SAAS,YAAY,CACnB,SAAiB,EACjB,eAAyC;IAEzC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,eAAe,CAAA;IAE5E,+CAA+C;IAC/C,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QACjF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,oCAAoC;IACpC,IAAI,UAAU,EAAE,CAAC;QACf,uCAAuC;QACvC,mDAAmD;QACnD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,gDAAgD;IAChD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC;gBACV,UAAU,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;gBACpC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;gBACxC,YAAY,EAAE,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;aAC1E,CAAC,CAAA;QAEJ,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC;gBACb,UAAU,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;gBACpC,YAAY,EAAE,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;aAC1E,CAAC,CAAA;QAEJ,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC;gBACd,YAAY,EAAE,OAAO,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK;aACvE,CAAC,CAAA;QAEJ,KAAK,MAAM;YACT,OAAO,SAAS,CAAC;gBACf,YAAY,EAAE,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;aACnE,CAAC,CAAA;QAEJ;YACE,iCAAiC;YACjC,OAAO,CAAC,IAAI,CACV,gDAAgD,IAAI,gBAAgB,SAAS,6BAA6B,CAC3G,CAAA;YACD,OAAO,IAAI,CAAC;gBACV,UAAU,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;aACrC,CAAC,CAAA;IACN,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,WAAkC;IAGlC,MAAM,MAAM,GAAgC,EAAE,CAAA;IAE9C,qCAAqC;IACrC,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACxE,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QACtD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,SAAS,CAAC,GAAG,WAAW,CAAA;QACjC,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,+FAA+F;IAC/F,6EAA6E;IAC7E,0FAA0F;IAC1F,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACxE,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YACzB,wEAAwE;YACxE,4EAA4E;YAC5E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;oBACvB,UAAU,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,QAAQ,EAAE;iBAC/C,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;AACzB,CAAC;AAkBD;;;;;GAKG;AACH,SAAS,mBAAmB,CAC1B,SAAiB,EACjB,aAAgC;IAEhC,QAAQ,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,KAAK,MAAM;YACT,OAAO,aAAa,CAAC,IAAI,CAAA;QAC3B,KAAK,SAAS;YACZ,OAAO,aAAa,CAAC,OAAO,CAAA;QAC9B,KAAK,SAAS;YACZ,OAAO,aAAa,CAAC,OAAO,CAAA;QAC9B,KAAK,cAAc;YACjB,OAAO,aAAa,CAAC,YAAY,CAAA;QACnC;YACE,OAAO,SAAS,CAAA;IACpB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAA6C,EAC7C,aAAa,GAAsB,EAAE;IAGrC,MAAM,KAAK,GAAoC,EAAE,CAAA,CAAC,gGAAgG;IAElJ,KAAK,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9D,yEAAyE;QACzE,yEAAyE;QACzE,sEAAsE;QACtE,MAAM,OAAO,GACX,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC;YAC7C,WAAW,CAAC,SAAS;YACrB,YAAY,CAAC,SAAS,CAAC,CAAA;QACzB,KAAK,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAC7D,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG;SACP,KAAK,CAAC,MAAM,CAAC;SACb,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SACzE,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opensaas/stack-auth",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.28.0",
|
|
4
4
|
"description": "Better-auth integration for OpenSaas Stack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"react": "^19.2.4",
|
|
66
66
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
67
67
|
"vitest": "^4.1.10",
|
|
68
|
-
"@opensaas/stack-core": "0.
|
|
68
|
+
"@opensaas/stack-core": "0.28.0"
|
|
69
69
|
},
|
|
70
70
|
"scripts": {
|
|
71
71
|
"build": "tsc",
|