@opensaas/stack-auth 0.36.0 → 0.38.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 +146 -0
- package/CLAUDE.md +153 -9
- package/README.md +18 -7
- package/dist/config/adopt-better-auth-tables.d.ts +47 -0
- package/dist/config/adopt-better-auth-tables.d.ts.map +1 -1
- package/dist/config/adopt-better-auth-tables.js +29 -1
- package/dist/config/adopt-better-auth-tables.js.map +1 -1
- package/dist/config/derive-auth-lists.d.ts +7 -5
- package/dist/config/derive-auth-lists.d.ts.map +1 -1
- package/dist/config/derive-auth-lists.js +33 -34
- package/dist/config/derive-auth-lists.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +41 -11
- package/dist/config/index.js.map +1 -1
- package/dist/config/plugin.d.ts.map +1 -1
- package/dist/config/plugin.js +39 -27
- package/dist/config/plugin.js.map +1 -1
- package/dist/config/types.d.ts +143 -28
- package/dist/config/types.d.ts.map +1 -1
- package/dist/server/build-better-auth-options.test.d.ts +2 -0
- package/dist/server/build-better-auth-options.test.d.ts.map +1 -0
- package/dist/server/build-better-auth-options.test.js +29 -0
- package/dist/server/build-better-auth-options.test.js.map +1 -0
- package/dist/server/index.d.ts +112 -8
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +284 -96
- package/dist/server/index.js.map +1 -1
- package/dist/server/schema-converter.d.ts +3 -3
- package/dist/server/schema-converter.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/config/adopt-better-auth-tables.ts +70 -1
- package/src/config/derive-auth-lists.ts +37 -38
- package/src/config/index.ts +47 -12
- package/src/config/plugin.ts +40 -28
- package/src/config/types.ts +144 -27
- package/src/server/build-better-auth-options.test.ts +59 -0
- package/src/server/index.ts +470 -106
- package/src/server/schema-converter.ts +3 -3
- package/tests/adopt-better-auth-tables.test.ts +99 -0
- package/tests/config.test.ts +66 -8
- package/tests/derive-auth-lists.test.ts +79 -5
- package/tests/generated-fk-shape.test.ts +65 -0
- package/tests/plugin-derived-keys.test.ts +48 -0
- package/tests/server.test.ts +723 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +7 -1
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
* Pure `better-auth config → Auth lists` derivation.
|
|
3
3
|
*
|
|
4
4
|
* This module is intentionally free of side effects and plugin/runtime
|
|
5
|
-
* concerns: given the resolved better-auth model config (per-model `modelName
|
|
6
|
-
* and `fields` column maps) plus any custom User fields, it
|
|
7
|
-
* OpenSaaS Auth lists (user/session/account/verification)
|
|
5
|
+
* concerns: given the resolved better-auth model config (per-model `modelName`,
|
|
6
|
+
* `tableName`, and `fields` column maps) plus any custom User fields, it
|
|
7
|
+
* produces the four OpenSaaS Auth lists (user/session/account/verification)
|
|
8
|
+
* with:
|
|
8
9
|
*
|
|
9
10
|
* - list keys taken from each model's `modelName`
|
|
10
|
-
* - a table `@@map` (list-level `db.map`)
|
|
11
|
-
*
|
|
11
|
+
* - a table `@@map` (list-level `db.map`) taken from each model's resolved
|
|
12
|
+
* `tableName` — independent of `modelName`, so a renamed list key can still
|
|
13
|
+
* adopt a differently-named live table
|
|
12
14
|
* - field-level `@map` (`db.map`) for any better-auth field → column override
|
|
13
15
|
* - relationship refs between the auth lists wired to the *derived* keys
|
|
14
16
|
* (e.g. `Session.user → AuthUser.sessions`)
|
|
@@ -25,16 +27,6 @@
|
|
|
25
27
|
*/
|
|
26
28
|
import { list } from '@opensaas/stack-core';
|
|
27
29
|
import { text, timestamp, checkbox, relationship } from '@opensaas/stack-core/fields';
|
|
28
|
-
/**
|
|
29
|
-
* Default better-auth model names — used to decide whether a `@@map` is needed
|
|
30
|
-
* (only when the configured `modelName` differs from the default).
|
|
31
|
-
*/
|
|
32
|
-
const DEFAULT_MODEL_NAMES = {
|
|
33
|
-
user: 'User',
|
|
34
|
-
session: 'Session',
|
|
35
|
-
account: 'Account',
|
|
36
|
-
verification: 'Verification',
|
|
37
|
-
};
|
|
38
30
|
/**
|
|
39
31
|
* Build the list-level `db` config (`timestamps` + `@@map` + `@@schema`) for a
|
|
40
32
|
* derived list.
|
|
@@ -46,21 +38,20 @@ const DEFAULT_MODEL_NAMES = {
|
|
|
46
38
|
* Auth list must opt back in so the generated models keep those columns and
|
|
47
39
|
* better-auth keeps working.
|
|
48
40
|
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* schema via `@@schema(...)`.
|
|
41
|
+
* The physical table name (`@@map`) comes from the model's resolved
|
|
42
|
+
* `tableName` — independent of the list key/`modelName` — so a renamed list
|
|
43
|
+
* key can still adopt a differently-named live table (e.g. better-auth's own
|
|
44
|
+
* default lowercase table names). When a `schema` is configured (plugin-level
|
|
45
|
+
* or per-model), the list is placed in that Postgres schema via `@@schema(...)`.
|
|
54
46
|
*
|
|
55
|
-
* With no `
|
|
47
|
+
* With no `tableName`/`schema` overrides we emit only `timestamps: true`,
|
|
56
48
|
* leaving the default `User`/`Session`/... table/schema output unchanged.
|
|
57
49
|
*/
|
|
58
|
-
function listDb(model
|
|
59
|
-
const map = model.modelName !== defaultModelName ? model.modelName : undefined;
|
|
50
|
+
function listDb(model) {
|
|
60
51
|
const schema = model.schema;
|
|
61
52
|
return {
|
|
62
53
|
timestamps: true,
|
|
63
|
-
...(
|
|
54
|
+
...(model.tableName !== undefined ? { map: model.tableName } : {}),
|
|
64
55
|
...(schema !== undefined ? { schema } : {}),
|
|
65
56
|
};
|
|
66
57
|
}
|
|
@@ -80,14 +71,18 @@ function fieldDb(fieldName, fields) {
|
|
|
80
71
|
* Build the `db` config for a `user` relationship (`Session.user` /
|
|
81
72
|
* `Account.user`), honouring a `userId` column override from the better-auth
|
|
82
73
|
* `fields` map and mirroring better-auth's own FK shape: no separate FK index
|
|
83
|
-
* — the index is applied at the field level via `isIndexed: false` —
|
|
84
|
-
* `onDelete: Cascade`,
|
|
85
|
-
* better-auth
|
|
86
|
-
*
|
|
74
|
+
* — the index is applied at the field level via `isIndexed: false` —
|
|
75
|
+
* `onDelete: Cascade`, and a required (non-nullable) foreign key, since
|
|
76
|
+
* better-auth's adapter always writes a `userId` on every session/account row
|
|
77
|
+
* it creates. This means a generated Auth schema diffs clean against a live
|
|
78
|
+
* better-auth database on all three dimensions instead of showing a spurious
|
|
79
|
+
* index drop, a referential-action change, and a `DROP NOT NULL` (issues #679,
|
|
80
|
+
* #863).
|
|
87
81
|
*/
|
|
88
82
|
function userRelationshipDb(fields) {
|
|
89
83
|
const column = fields.userId;
|
|
90
84
|
return {
|
|
85
|
+
isNullable: false,
|
|
91
86
|
...(column ? { foreignKey: { map: column } } : {}),
|
|
92
87
|
extendPrismaSchema: ({ fkLine, relationLine }) => ({
|
|
93
88
|
fkLine,
|
|
@@ -122,7 +117,7 @@ function createUserList(model, keys, userConfig, access) {
|
|
|
122
117
|
// Custom fields from user config
|
|
123
118
|
...(userConfig.fields || {}),
|
|
124
119
|
},
|
|
125
|
-
db: listDb(model
|
|
120
|
+
db: listDb(model),
|
|
126
121
|
access: userConfig.access || access,
|
|
127
122
|
hooks: userConfig.hooks,
|
|
128
123
|
});
|
|
@@ -142,7 +137,9 @@ function createSessionList(model, keys, access) {
|
|
|
142
137
|
isIndexed: 'unique',
|
|
143
138
|
db: fieldDb('token', f),
|
|
144
139
|
}),
|
|
145
|
-
expiresAt: timestamp({
|
|
140
|
+
expiresAt: timestamp({
|
|
141
|
+
db: { isNullable: false, ...fieldDb('expiresAt', f) },
|
|
142
|
+
}),
|
|
146
143
|
ipAddress: text({ db: fieldDb('ipAddress', f) }),
|
|
147
144
|
userAgent: text({ db: fieldDb('userAgent', f) }),
|
|
148
145
|
user: relationship({
|
|
@@ -151,7 +148,7 @@ function createSessionList(model, keys, access) {
|
|
|
151
148
|
db: userRelationshipDb(f),
|
|
152
149
|
}),
|
|
153
150
|
},
|
|
154
|
-
db: listDb(model
|
|
151
|
+
db: listDb(model),
|
|
155
152
|
access,
|
|
156
153
|
});
|
|
157
154
|
}
|
|
@@ -180,7 +177,7 @@ function createAccountList(model, keys, access) {
|
|
|
180
177
|
idToken: text({ db: fieldDb('idToken', f) }),
|
|
181
178
|
password: text({ db: fieldDb('password', f) }),
|
|
182
179
|
},
|
|
183
|
-
db: listDb(model
|
|
180
|
+
db: listDb(model),
|
|
184
181
|
access,
|
|
185
182
|
});
|
|
186
183
|
}
|
|
@@ -196,9 +193,11 @@ function createVerificationList(model, access) {
|
|
|
196
193
|
fields: {
|
|
197
194
|
identifier: text({ validation: { isRequired: true }, db: fieldDb('identifier', f) }),
|
|
198
195
|
value: text({ validation: { isRequired: true }, db: fieldDb('value', f) }),
|
|
199
|
-
expiresAt: timestamp({
|
|
196
|
+
expiresAt: timestamp({
|
|
197
|
+
db: { isNullable: false, ...fieldDb('expiresAt', f) },
|
|
198
|
+
}),
|
|
200
199
|
},
|
|
201
|
-
db: listDb(model
|
|
200
|
+
db: listDb(model),
|
|
202
201
|
access,
|
|
203
202
|
});
|
|
204
203
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive-auth-lists.js","sourceRoot":"","sources":["../../src/config/derive-auth-lists.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"derive-auth-lists.js","sourceRoot":"","sources":["../../src/config/derive-auth-lists.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAEV,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAEV,oBAAoB,EAOrB,MAAM,YAAY,CAAA;AA4EnB;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,oBAAoB,CAyE5E;AAED,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAA;AAChD,cAAc,YAAY,CAAA"}
|
package/dist/config/index.js
CHANGED
|
@@ -14,10 +14,20 @@ const DEFAULT_MODEL_NAMES = {
|
|
|
14
14
|
* falling back to the better-auth default model name and an empty column map.
|
|
15
15
|
* The model's Postgres schema is the per-model `schema` override when present,
|
|
16
16
|
* otherwise the plugin-level `schema` default (or `undefined` for `public`).
|
|
17
|
+
*
|
|
18
|
+
* `tableName` defaults to today's behaviour when not explicitly set: it
|
|
19
|
+
* follows `modelName` when that differs from the better-auth default (so a
|
|
20
|
+
* renamed list still pins its table via `@@map`), otherwise it stays unset.
|
|
21
|
+
* An explicit `tableName` is independent of `modelName` — it lets a renamed
|
|
22
|
+
* list key adopt a differently-named live table (e.g. better-auth's own
|
|
23
|
+
* default lowercase table names).
|
|
17
24
|
*/
|
|
18
25
|
function normalizeModelConfig(config, defaultModelName, defaultSchema) {
|
|
26
|
+
const modelName = config?.modelName || defaultModelName;
|
|
27
|
+
const tableName = config?.tableName ?? (modelName !== defaultModelName ? modelName : undefined);
|
|
19
28
|
return {
|
|
20
|
-
modelName
|
|
29
|
+
modelName,
|
|
30
|
+
tableName,
|
|
21
31
|
fields: config?.fields || {},
|
|
22
32
|
schema: config?.schema ?? defaultSchema,
|
|
23
33
|
};
|
|
@@ -36,6 +46,18 @@ function normalizeAuthModels(config) {
|
|
|
36
46
|
verification: normalizeModelConfig(config.verification, DEFAULT_MODEL_NAMES.verification, defaultSchema),
|
|
37
47
|
};
|
|
38
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Default `sendResetPassword`/`sendVerificationEmail` — logs to console
|
|
51
|
+
* instead of sending, matching the pre-existing "no sendEmail configured"
|
|
52
|
+
* behavior for apps that haven't wired a real email provider yet.
|
|
53
|
+
*/
|
|
54
|
+
function defaultSendAuthEmail(kind) {
|
|
55
|
+
return async ({ user, url }) => {
|
|
56
|
+
console.log(`[Auth] ${kind[0].toUpperCase()}${kind.slice(1)} email not sent (no callback configured):`);
|
|
57
|
+
console.log(`To: ${user.email}`);
|
|
58
|
+
console.log(`URL: ${url}`);
|
|
59
|
+
};
|
|
60
|
+
}
|
|
39
61
|
/**
|
|
40
62
|
* Normalize auth configuration with defaults
|
|
41
63
|
*/
|
|
@@ -46,16 +68,30 @@ export function normalizeAuthConfig(config) {
|
|
|
46
68
|
enabled: true,
|
|
47
69
|
minPasswordLength: config.emailAndPassword.minPasswordLength ?? 8,
|
|
48
70
|
requireConfirmation: config.emailAndPassword.requireConfirmation ?? true,
|
|
71
|
+
sendResetPassword: config.emailAndPassword.sendResetPassword ??
|
|
72
|
+
defaultSendAuthEmail('password reset'),
|
|
49
73
|
}
|
|
50
|
-
: {
|
|
74
|
+
: {
|
|
75
|
+
enabled: false,
|
|
76
|
+
minPasswordLength: 8,
|
|
77
|
+
requireConfirmation: true,
|
|
78
|
+
sendResetPassword: defaultSendAuthEmail('password reset'),
|
|
79
|
+
};
|
|
51
80
|
// Email verification defaults
|
|
52
81
|
const emailVerification = config.emailVerification?.enabled
|
|
53
82
|
? {
|
|
54
83
|
enabled: true,
|
|
55
84
|
sendOnSignUp: config.emailVerification.sendOnSignUp ?? true,
|
|
56
85
|
tokenExpiration: config.emailVerification.tokenExpiration ?? 86400,
|
|
86
|
+
sendVerificationEmail: config.emailVerification.sendVerificationEmail ??
|
|
87
|
+
defaultSendAuthEmail('verification'),
|
|
57
88
|
}
|
|
58
|
-
: {
|
|
89
|
+
: {
|
|
90
|
+
enabled: false,
|
|
91
|
+
sendOnSignUp: true,
|
|
92
|
+
tokenExpiration: 86400,
|
|
93
|
+
sendVerificationEmail: defaultSendAuthEmail('verification'),
|
|
94
|
+
};
|
|
59
95
|
// Password reset defaults
|
|
60
96
|
const passwordReset = config.passwordReset?.enabled
|
|
61
97
|
? {
|
|
@@ -66,7 +102,7 @@ export function normalizeAuthConfig(config) {
|
|
|
66
102
|
// Session defaults
|
|
67
103
|
const session = {
|
|
68
104
|
expiresIn: config.session?.expiresIn || 604800, // 7 days
|
|
69
|
-
updateAge: config.session?.updateAge ??
|
|
105
|
+
updateAge: config.session?.updateAge ?? 86400, // 1 day, matching better-auth's own default
|
|
70
106
|
};
|
|
71
107
|
// Session fields defaults
|
|
72
108
|
const sessionFields = config.sessionFields || ['userId', 'email', 'name'];
|
|
@@ -84,15 +120,9 @@ export function normalizeAuthConfig(config) {
|
|
|
84
120
|
sessionFields,
|
|
85
121
|
extendUserList: config.extendUserList || {},
|
|
86
122
|
access: config.access || {},
|
|
87
|
-
sendEmail: config.sendEmail ||
|
|
88
|
-
(async ({ to, subject, html }) => {
|
|
89
|
-
console.log('[Auth] Email not sent (no sendEmail configured):');
|
|
90
|
-
console.log(`To: ${to}`);
|
|
91
|
-
console.log(`Subject: ${subject}`);
|
|
92
|
-
console.log(`Body: ${html}`);
|
|
93
|
-
}),
|
|
94
123
|
betterAuthPlugins: config.betterAuthPlugins || [],
|
|
95
124
|
rateLimit: config.rateLimit,
|
|
125
|
+
betterAuthOptions: config.betterAuthOptions || {},
|
|
96
126
|
};
|
|
97
127
|
}
|
|
98
128
|
export * from './types.js';
|
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/config/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,YAAY,CAAA;AAKlE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/config/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,YAAY,CAAA;AAKlE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAwLrD"}
|
package/dist/config/plugin.js
CHANGED
|
@@ -50,33 +50,13 @@ export function authPlugin(config) {
|
|
|
50
50
|
account: normalized.models.account.modelName,
|
|
51
51
|
verification: normalized.models.verification.modelName,
|
|
52
52
|
};
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
for (const [listName, listConfig] of Object.entries(pluginLists)) {
|
|
61
|
-
if (context.config.lists[listName]) {
|
|
62
|
-
// List already exists — merge fields/hooks/mcp in only. Access
|
|
63
|
-
// control belongs to whoever owns the list; per ADR-0013 an
|
|
64
|
-
// extension must never carry operation-level access for a
|
|
65
|
-
// pre-existing list (the plugin engine throws if it does).
|
|
66
|
-
context.extendList(listName, {
|
|
67
|
-
fields: listConfig.fields,
|
|
68
|
-
hooks: listConfig.hooks,
|
|
69
|
-
mcp: listConfig.mcp,
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
// List doesn't exist, add it
|
|
74
|
-
context.addList(listName, listConfig);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// Add all auth lists.
|
|
53
|
+
// Add all auth lists FIRST, before any better-auth plugin schema
|
|
54
|
+
// extension is processed. This must happen before the betterAuthPlugins
|
|
55
|
+
// loop below so a base-model extension (e.g. a plugin's `schema: {
|
|
56
|
+
// user: { fields: … } }`) always finds the real derived list already
|
|
57
|
+
// registered under its key and takes the merge (`extendList`) path
|
|
58
|
+
// against it — instead of pre-empting that key with a bare
|
|
59
|
+
// `list({ fields })` that carries no `db`/`access` (see #861).
|
|
80
60
|
//
|
|
81
61
|
// The plugin only ever touches its OWN derived keys. When a developer
|
|
82
62
|
// renames the auth user model (e.g. user.modelName: 'AuthUser'), the
|
|
@@ -102,6 +82,38 @@ export function authPlugin(config) {
|
|
|
102
82
|
context.addList(listName, listConfig);
|
|
103
83
|
}
|
|
104
84
|
}
|
|
85
|
+
// Extract additional lists from Better Auth plugins. Because the auth
|
|
86
|
+
// lists above are already registered, a schema extension of a base
|
|
87
|
+
// model (user/session/account/verification) always finds its resolved
|
|
88
|
+
// key occupied by the real derived list and merges via `extendList` —
|
|
89
|
+
// its `db`/`access` are preserved. Non-base plugin tables (e.g.
|
|
90
|
+
// `oauth_application`, `passkey`) still register as new lists via
|
|
91
|
+
// `addList`, same as before.
|
|
92
|
+
for (const plugin of normalized.betterAuthPlugins) {
|
|
93
|
+
if (plugin && typeof plugin === 'object' && plugin.schema) {
|
|
94
|
+
// Plugin has schema property - convert to OpenSaaS lists
|
|
95
|
+
const pluginSchema = plugin.schema;
|
|
96
|
+
const pluginLists = convertBetterAuthSchema(pluginSchema, baseModelKeys);
|
|
97
|
+
// Add or extend lists from plugin
|
|
98
|
+
for (const [listName, listConfig] of Object.entries(pluginLists)) {
|
|
99
|
+
if (context.config.lists[listName]) {
|
|
100
|
+
// List already exists — merge fields/hooks/mcp in only. Access
|
|
101
|
+
// control belongs to whoever owns the list; per ADR-0013 an
|
|
102
|
+
// extension must never carry operation-level access for a
|
|
103
|
+
// pre-existing list (the plugin engine throws if it does).
|
|
104
|
+
context.extendList(listName, {
|
|
105
|
+
fields: listConfig.fields,
|
|
106
|
+
hooks: listConfig.hooks,
|
|
107
|
+
mcp: listConfig.mcp,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// List doesn't exist, add it
|
|
112
|
+
context.addList(listName, listConfig);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
105
117
|
// Store auth config for runtime access
|
|
106
118
|
// Access at runtime via: config._pluginData.auth
|
|
107
119
|
context.setPluginData('auth', normalized);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/config/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AAEvE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;IAE9C,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,OAAO;QAEhB,mBAAmB,EAAE;YACnB,MAAM,EAAE,iEAAiE;YACzE,QAAQ,EAAE,qBAAqB;SAChC;QAED,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACtB,uEAAuE;YACvE,mEAAmE;YACnE,+DAA+D;YAC/D,uEAAuE;YACvE,iDAAiD;YACjD,MAAM,SAAS,GAAG,YAAY,CAC5B,UAAU,CAAC,cAAc,EACzB,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,MAAM,CAClB,CAAA;YAED,wEAAwE;YACxE,kEAAkE;YAClE,oEAAoE;YACpE,gEAAgE;YAChE,+DAA+D;YAC/D,MAAM,aAAa,GAAG;gBACpB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;gBACtC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS;gBAC5C,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS;gBAC5C,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS;aACvD,CAAA;YAED,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/config/plugin.ts"],"names":[],"mappings":"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"}
|