@adonis-agora/authkit-server 0.67.0 → 0.68.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.
@@ -138,20 +138,27 @@ export interface LucidAccountStoreOptions {
138
138
  /**
139
139
  * Models Lucid para organizations (multi-tenancy).
140
140
  *
141
- * - `true` → usa os models DEFAULT da lib ({@link defaultOrganizationModels}),
142
- * que já mapeiam as três tabelas lib-owned (`auth_organizations`,
143
- * `auth_organization_members`, `auth_organization_invitations`). É o caminho
144
- * recomendado: as tabelas são criadas/evoluídas pelo `ensureAuthkitSchema`,
145
- * então o mapeamento não é decisão do host.
141
+ * - **Ausente (default)** → usa os models DEFAULT da lib
142
+ * ({@link defaultOrganizationModels}), que já mapeiam as três tabelas
143
+ * lib-owned (`auth_organizations`, `auth_organization_members`,
144
+ * `auth_organization_invitations`). A `OrganizationsCapability` passa a
145
+ * existir por padrão. Isso é seguro porque as rotas do console de conta para
146
+ * orgs JÁ eram montadas por default (`register_auth_host`, bloco `if
147
+ * (mountOrgs)`, com controller capability-probed); antes, sem os models, a
148
+ * tela montada respondia 403; agora ela funciona. Não há tela nova — só uma
149
+ * que deixou de estar quebrada. As tabelas são criadas/evoluídas pelo
150
+ * `ensureAuthkitSchema`, então o mapeamento não é decisão do host.
151
+ * - `true` → idêntico ao default (atalho explícito; é o que apps existentes
152
+ * já usam e continua valendo).
146
153
  * - `{ OrgModel, MemberModel, InvitationModel }` → escape hatch, para quem
147
154
  * guarda as tabelas de auth numa conexão/schema próprios (os defaults não
148
155
  * declaram `static connection`).
149
- * - Ausente → `OrganizationsCapability` AUSENTE no store. Como as rotas
150
- * `/account/orgs*` são montadas por capability-probing, isso deixa a
151
- * feature desligada — silenciosamente, se o host não olhar o
152
- * `authkit:doctor`.
156
+ * - `false` → opt-out explícito: `OrganizationsCapability` AUSENTE no store.
157
+ * Use quando a dependência atual é `supportsOrganizations === false` (ex.:
158
+ * store/rotas que assumem a ausência). O `authkit:doctor` avisa se
159
+ * `organizations.enabled: true` e o store não tem a capability.
153
160
  */
154
- organizationModels?: true | {
161
+ organizationModels?: true | false | {
155
162
  OrgModel: any;
156
163
  MemberModel: any;
157
164
  InvitationModel: any;
@@ -130,7 +130,15 @@ export function lucidAccountStore(Model, options = {}) {
130
130
  const encrypter = options.encrypter === false ? undefined : (options.encrypter ?? appKeyEncrypter());
131
131
  const ProviderIdentityModel = options.providerIdentityModel;
132
132
  const WebauthnCredentialModel = options.webauthnCredentialModel;
133
- const OrgModels = options.organizationModels === true ? defaultOrganizationModels : options.organizationModels;
133
+ // Organizations é padrão: ausente OU `true` → models default da lib. O
134
+ // opt-out explícito é `false`. O trio explícito segue como escape hatch.
135
+ const orgModelsOption = options.organizationModels;
136
+ const usesDefaultOrgModels = orgModelsOption === undefined || orgModelsOption === true;
137
+ const OrgModels = orgModelsOption === false
138
+ ? undefined
139
+ : usesDefaultOrgModels
140
+ ? defaultOrganizationModels
141
+ : orgModelsOption;
134
142
  // RP do WebAuthn: usado nas cerimônias. Default do rpName cai no mfaIssuer.
135
143
  const webauthn = options.webauthn ?? {
136
144
  rpName: mfaIssuer,
@@ -222,17 +230,23 @@ export function lucidAccountStore(Model, options = {}) {
222
230
  // Preferência por usuário de tipos de login: só quando o model tem a coluna
223
231
  // `login_methods` (JSONB). Sem a coluna → capacidade ausente (feature no-op).
224
232
  ...(supportsLoginMethodsColumn(Model) ? buildLoginMethods(ctx) : {}),
225
- // Organizations (multi-tenancy): só quando os três models foram fornecidos.
233
+ // Organizations (multi-tenancy): por padrão usa os models default da lib;
234
+ // ausente só com `organizationModels: false` (opt-out explícito).
226
235
  ...(OrgModels
227
- ? buildOrganizations({
228
- OrgModel: OrgModels.OrgModel,
229
- MemberModel: OrgModels.MemberModel,
230
- InvitationModel: OrgModels.InvitationModel,
231
- findAccountEmail: async (accountId) => {
232
- const row = await Model.find(accountId);
233
- return row?.email ?? null;
234
- },
235
- })
236
+ ? {
237
+ // Origem dos models, para o `authkit:doctor` reportar sem re-inferir.
238
+ // NÃO faz parte do contrato AccountStore.
239
+ __organizationModelsSource: usesDefaultOrgModels ? 'default' : 'explicit',
240
+ ...buildOrganizations({
241
+ OrgModel: OrgModels.OrgModel,
242
+ MemberModel: OrgModels.MemberModel,
243
+ InvitationModel: OrgModels.InvitationModel,
244
+ findAccountEmail: async (accountId) => {
245
+ const row = await Model.find(accountId);
246
+ return row?.email ?? null;
247
+ },
248
+ }),
249
+ }
236
250
  : {}),
237
251
  // Config de senha resolvida — exposta (não-enumerável) para o authkit:doctor
238
252
  // inspecionar policy/checkPwned. NÃO faz parte do contrato AccountStore.
@@ -17,12 +17,13 @@ export interface LucidStoresModels {
17
17
  /**
18
18
  * Organizations (multi-tenancy) — habilita a `OrganizationsCapability`.
19
19
  *
20
- * `true` usa os models default da lib (as três tabelas são lib-owned, criadas
21
- * pelo `ensureAuthkitSchema`), que é o caminho recomendado. O trio explícito
22
- * fica como escape hatch para quem guarda as tabelas de auth numa
20
+ * **Ausente → ligada por padrão** (models default da lib; as três tabelas são
21
+ * lib-owned, criadas pelo `ensureAuthkitSchema`). `true` é o atalho explícito
22
+ * para o mesmo caminho; `false` é o opt-out (capability ausente). O trio
23
+ * explícito fica como escape hatch para quem guarda as tabelas de auth numa
23
24
  * conexão/schema próprios.
24
25
  */
25
- organizations?: true | {
26
+ organizations?: true | false | {
26
27
  OrgModel: any;
27
28
  MemberModel: any;
28
29
  InvitationModel: any;
@@ -49,9 +50,9 @@ export type LucidStoresOptions = Omit<LucidAccountStoreOptions, 'providerIdentit
49
50
  * )
50
51
  * ```
51
52
  *
52
- * `organizations: true` usa os models default da lib. Se as tabelas de auth
53
- * vivem numa conexão/schema próprios, passe o trio explícito
54
- * (`{ OrgModel, MemberModel, InvitationModel }`) — os defaults não declaram
55
- * `static connection`.
53
+ * Organizations é ligada por padrão (models default da lib); `organizations:
54
+ * false` desliga. Se as tabelas de auth vivem numa conexão/schema próprios, passe
55
+ * o trio explícito (`{ OrgModel, MemberModel, InvitationModel }`) — os defaults
56
+ * não declaram `static connection`.
56
57
  */
57
58
  export declare function lucidStores(models: LucidStoresModels, options?: LucidStoresOptions): LucidStoresResult;
@@ -15,10 +15,10 @@ import { lucidAccountStore } from './lucid_account_store.js';
15
15
  * )
16
16
  * ```
17
17
  *
18
- * `organizations: true` usa os models default da lib. Se as tabelas de auth
19
- * vivem numa conexão/schema próprios, passe o trio explícito
20
- * (`{ OrgModel, MemberModel, InvitationModel }`) — os defaults não declaram
21
- * `static connection`.
18
+ * Organizations é ligada por padrão (models default da lib); `organizations:
19
+ * false` desliga. Se as tabelas de auth vivem numa conexão/schema próprios, passe
20
+ * o trio explícito (`{ OrgModel, MemberModel, InvitationModel }`) — os defaults
21
+ * não declaram `static connection`.
22
22
  */
23
23
  export function lucidStores(models, options = {}) {
24
24
  const accountStore = lucidAccountStore(models.account, {
@@ -119,7 +119,11 @@ export declare function checkAccessTokens(input: DoctorInput): Finding | null;
119
119
  /**
120
120
  * Organizations (multi-tenancy). Informa se a capacidade está disponível
121
121
  * (store expõe createOrg) e avisa se `organizations.enabled: true` no config mas
122
- * a capacidade não está presente no store (organizationModels não foram passados).
122
+ * a capacidade não está presente no store.
123
+ *
124
+ * Com `lucidAccountStore()`, a capability existe POR PADRÃO (models default da
125
+ * lib); o aviso abaixo só é alcançável para store não-lucid que não a implementa
126
+ * ou para um store lucid construído com `organizationModels: false` (opt-out).
123
127
  */
124
128
  export declare function checkOrganizations(input: DoctorInput): Finding | null;
125
129
  /**
@@ -488,7 +488,11 @@ export function checkAccessTokens(input) {
488
488
  /**
489
489
  * Organizations (multi-tenancy). Informa se a capacidade está disponível
490
490
  * (store expõe createOrg) e avisa se `organizations.enabled: true` no config mas
491
- * a capacidade não está presente no store (organizationModels não foram passados).
491
+ * a capacidade não está presente no store.
492
+ *
493
+ * Com `lucidAccountStore()`, a capability existe POR PADRÃO (models default da
494
+ * lib); o aviso abaixo só é alcançável para store não-lucid que não a implementa
495
+ * ou para um store lucid construído com `organizationModels: false` (opt-out).
492
496
  */
493
497
  export function checkOrganizations(input) {
494
498
  const cfg = input.authkitConfig;
@@ -501,17 +505,26 @@ export function checkOrganizations(input) {
501
505
  return {
502
506
  level: 'warn',
503
507
  message: 'organizations.enabled: true, but the accountStore has no OrganizationsCapability — ' +
504
- 'pass `organizationModels: true` to `lucidAccountStore()` (usa os models default da lib), ' +
505
- 'ou `{ OrgModel, MemberModel, InvitationModel }` se as tabelas de auth vivem numa ' +
506
- 'conexão/schema próprios. Expected tables: auth_organizations, ' +
508
+ 'with `lucidAccountStore()` it is present by default; if you passed ' +
509
+ '`organizationModels: false`, drop the opt-out (or pass the explicit ' +
510
+ '`{ OrgModel, MemberModel, InvitationModel }` trio when the auth tables live on their ' +
511
+ 'own connection/schema). Expected tables: auth_organizations, ' +
507
512
  'auth_organization_members, auth_organization_invitations.',
508
513
  };
509
514
  }
510
515
  if (storeSupports) {
511
516
  const roles = cfg.organizations?.roles ?? ['owner', 'admin', 'member'];
517
+ // Origem dos models: default da lib (organizationModels ausente/true) ou
518
+ // trio explícito do host. Ausente em store não-lucid → wording genérica.
519
+ const source = store.__organizationModelsSource;
520
+ const models = source === 'default'
521
+ ? 'lib defaults (organizationModels omitted or true)'
522
+ : source === 'explicit'
523
+ ? 'host-provided explicit trio'
524
+ : 'lib defaults or host-provided models';
512
525
  return {
513
526
  level: 'ok',
514
- message: `organizations capability present (roles: ${roles.join(', ')}).`,
527
+ message: `organizations capability present (models: ${models}; roles: ${roles.join(', ')}).`,
515
528
  };
516
529
  }
517
530
  // Auto mode (enabled === undefined) and store doesn't support — silently ok (opt-in).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonis-agora/authkit-server",
3
- "version": "0.67.0",
3
+ "version": "0.68.0",
4
4
  "description": "AdonisJS OIDC/OAuth2 provider (Identity Provider) toolkit: ejectable auth server with sessions, rate-limiting, MFA/TOTP, audit log, federated logout and OpenTelemetry metrics.",
5
5
  "license": "MIT",
6
6
  "author": "dudousxd",