@technomoron/api-server-base 2.0.0-beta.12 → 2.0.0-beta.14
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/dist/cjs/api-server-base.cjs +58 -0
- package/dist/cjs/api-server-base.d.ts +4 -0
- package/dist/cjs/index.cjs +1 -11
- package/dist/cjs/index.d.ts +0 -5
- package/dist/esm/api-server-base.d.ts +4 -0
- package/dist/esm/api-server-base.js +58 -0
- package/dist/esm/index.d.ts +0 -5
- package/dist/esm/index.js +0 -5
- package/docs/swagger/openapi.json +2010 -0
- package/package.json +56 -10
|
@@ -11,6 +11,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.ApiServer = exports.ApiError = exports.ApiModule = void 0;
|
|
13
13
|
const node_crypto_1 = require("node:crypto");
|
|
14
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
15
|
+
const node_module_1 = require("node:module");
|
|
16
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
14
17
|
const cookie_parser_1 = __importDefault(require("cookie-parser"));
|
|
15
18
|
const cors_1 = __importDefault(require("cors"));
|
|
16
19
|
const express_1 = __importDefault(require("express"));
|
|
@@ -340,6 +343,8 @@ function fillConfig(config) {
|
|
|
340
343
|
origins: config.origins ?? [],
|
|
341
344
|
debug: config.debug ?? false,
|
|
342
345
|
apiBasePath: config.apiBasePath ?? '/api',
|
|
346
|
+
swaggerEnabled: config.swaggerEnabled ?? false,
|
|
347
|
+
swaggerPath: config.swaggerPath ?? '',
|
|
343
348
|
accessSecret: config.accessSecret ?? '',
|
|
344
349
|
refreshSecret: config.refreshSecret ?? '',
|
|
345
350
|
cookieDomain: config.cookieDomain ?? '.somewhere-over-the-rainbow.com',
|
|
@@ -391,6 +396,7 @@ class ApiServer {
|
|
|
391
396
|
}
|
|
392
397
|
this.middlewares();
|
|
393
398
|
this.installPingHandler();
|
|
399
|
+
this.installSwaggerHandler();
|
|
394
400
|
// addSwaggerUi(this.app);
|
|
395
401
|
this.installApiNotFoundHandler();
|
|
396
402
|
}
|
|
@@ -630,6 +636,58 @@ class ApiServer {
|
|
|
630
636
|
res.status(200).json({ success: true, code: 200, message: 'Success', data: payload, errors: {} });
|
|
631
637
|
});
|
|
632
638
|
}
|
|
639
|
+
loadSwaggerSpec() {
|
|
640
|
+
const candidates = [node_path_1.default.resolve(process.cwd(), 'docs/swagger/openapi.json')];
|
|
641
|
+
if (typeof __dirname === 'string') {
|
|
642
|
+
candidates.push(node_path_1.default.resolve(__dirname, '../../docs/swagger/openapi.json'));
|
|
643
|
+
}
|
|
644
|
+
try {
|
|
645
|
+
const require = (0, node_module_1.createRequire)(node_path_1.default.join(process.cwd(), 'package.json'));
|
|
646
|
+
const entry = require.resolve('@technomoron/api-server-base');
|
|
647
|
+
const packageRoot = node_path_1.default.resolve(node_path_1.default.dirname(entry), '..', '..');
|
|
648
|
+
candidates.push(node_path_1.default.join(packageRoot, 'docs/swagger/openapi.json'));
|
|
649
|
+
}
|
|
650
|
+
catch {
|
|
651
|
+
// Ignore resolution failures; fall back to any existing candidate.
|
|
652
|
+
}
|
|
653
|
+
for (const candidate of candidates) {
|
|
654
|
+
if (!node_fs_1.default.existsSync(candidate)) {
|
|
655
|
+
continue;
|
|
656
|
+
}
|
|
657
|
+
try {
|
|
658
|
+
const raw = node_fs_1.default.readFileSync(candidate, 'utf8');
|
|
659
|
+
return JSON.parse(raw);
|
|
660
|
+
}
|
|
661
|
+
catch {
|
|
662
|
+
return null;
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
return null;
|
|
666
|
+
}
|
|
667
|
+
installSwaggerHandler() {
|
|
668
|
+
const rawPath = typeof this.config.swaggerPath === 'string' ? this.config.swaggerPath.trim() : '';
|
|
669
|
+
const enabled = Boolean(this.config.swaggerEnabled) || rawPath.length > 0;
|
|
670
|
+
if (!enabled) {
|
|
671
|
+
return;
|
|
672
|
+
}
|
|
673
|
+
const base = this.apiBasePath === '/' ? '' : this.apiBasePath;
|
|
674
|
+
const resolved = rawPath.length > 0 ? rawPath : `${base}/swagger`;
|
|
675
|
+
const path = resolved.startsWith('/') ? resolved : `/${resolved}`;
|
|
676
|
+
const spec = this.loadSwaggerSpec();
|
|
677
|
+
this.app.get(path, (_req, res) => {
|
|
678
|
+
if (!spec) {
|
|
679
|
+
res.status(500).json({
|
|
680
|
+
success: false,
|
|
681
|
+
code: 500,
|
|
682
|
+
message: 'Swagger spec is unavailable',
|
|
683
|
+
data: null,
|
|
684
|
+
errors: {}
|
|
685
|
+
});
|
|
686
|
+
return;
|
|
687
|
+
}
|
|
688
|
+
res.status(200).json(spec);
|
|
689
|
+
});
|
|
690
|
+
}
|
|
633
691
|
normalizeApiBasePath(path) {
|
|
634
692
|
if (!path || typeof path !== 'string') {
|
|
635
693
|
return '/api';
|
|
@@ -95,6 +95,8 @@ export interface ApiServerConf {
|
|
|
95
95
|
origins: string[];
|
|
96
96
|
debug: boolean;
|
|
97
97
|
apiBasePath: string;
|
|
98
|
+
swaggerEnabled?: boolean;
|
|
99
|
+
swaggerPath?: string;
|
|
98
100
|
accessSecret: string;
|
|
99
101
|
refreshSecret: string;
|
|
100
102
|
cookieDomain: string;
|
|
@@ -190,6 +192,8 @@ export declare class ApiServer {
|
|
|
190
192
|
protected authorize(apiReq: ApiRequest, requiredClass: ApiAuthClass): Promise<void>;
|
|
191
193
|
private middlewares;
|
|
192
194
|
private installPingHandler;
|
|
195
|
+
private loadSwaggerSpec;
|
|
196
|
+
private installSwaggerHandler;
|
|
193
197
|
private normalizeApiBasePath;
|
|
194
198
|
private installApiNotFoundHandler;
|
|
195
199
|
private ensureApiNotFoundOrdering;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.MemoryOAuthStore = exports.OAuthStore = exports.MemoryPasskeyStore = exports.PasskeyStore = exports.PasskeyService = exports.MemoryTokenStore = exports.TokenStore = exports.MemoryUserStore = exports.UserStore = exports.AuthModule = exports.MemAuthStore = exports.CompositeAuthAdapter = exports.BaseAuthModule = exports.nullAuthModule = exports.BaseAuthAdapter = exports.nullAuthAdapter = exports.ApiModule = exports.ApiError = exports.ApiServer = void 0;
|
|
7
7
|
var api_server_base_js_1 = require("./api-server-base.cjs");
|
|
8
8
|
Object.defineProperty(exports, "ApiServer", { enumerable: true, get: function () { return __importDefault(api_server_base_js_1).default; } });
|
|
9
9
|
var api_server_base_js_2 = require("./api-server-base.cjs");
|
|
@@ -20,33 +20,23 @@ var compat_auth_storage_js_1 = require("./auth-api/compat-auth-storage.js");
|
|
|
20
20
|
Object.defineProperty(exports, "CompositeAuthAdapter", { enumerable: true, get: function () { return compat_auth_storage_js_1.CompositeAuthAdapter; } });
|
|
21
21
|
var mem_auth_store_js_1 = require("./auth-api/mem-auth-store.js");
|
|
22
22
|
Object.defineProperty(exports, "MemAuthStore", { enumerable: true, get: function () { return mem_auth_store_js_1.MemAuthStore; } });
|
|
23
|
-
var sql_auth_store_js_1 = require("./auth-api/sql-auth-store.js");
|
|
24
|
-
Object.defineProperty(exports, "SqlAuthStore", { enumerable: true, get: function () { return sql_auth_store_js_1.SqlAuthStore; } });
|
|
25
23
|
var auth_module_js_1 = require("./auth-api/auth-module.js");
|
|
26
24
|
Object.defineProperty(exports, "AuthModule", { enumerable: true, get: function () { return __importDefault(auth_module_js_1).default; } });
|
|
27
25
|
var base_js_1 = require("./user/base.js");
|
|
28
26
|
Object.defineProperty(exports, "UserStore", { enumerable: true, get: function () { return base_js_1.UserStore; } });
|
|
29
27
|
var memory_js_1 = require("./user/memory.js");
|
|
30
28
|
Object.defineProperty(exports, "MemoryUserStore", { enumerable: true, get: function () { return memory_js_1.MemoryUserStore; } });
|
|
31
|
-
var sequelize_js_1 = require("./user/sequelize.js");
|
|
32
|
-
Object.defineProperty(exports, "SequelizeUserStore", { enumerable: true, get: function () { return sequelize_js_1.SequelizeUserStore; } });
|
|
33
29
|
var base_js_2 = require("./token/base.js");
|
|
34
30
|
Object.defineProperty(exports, "TokenStore", { enumerable: true, get: function () { return base_js_2.TokenStore; } });
|
|
35
31
|
var memory_js_2 = require("./token/memory.js");
|
|
36
32
|
Object.defineProperty(exports, "MemoryTokenStore", { enumerable: true, get: function () { return memory_js_2.MemoryTokenStore; } });
|
|
37
|
-
var sequelize_js_2 = require("./token/sequelize.js");
|
|
38
|
-
Object.defineProperty(exports, "SequelizeTokenStore", { enumerable: true, get: function () { return sequelize_js_2.SequelizeTokenStore; } });
|
|
39
33
|
var service_js_1 = require("./passkey/service.js");
|
|
40
34
|
Object.defineProperty(exports, "PasskeyService", { enumerable: true, get: function () { return service_js_1.PasskeyService; } });
|
|
41
35
|
var base_js_3 = require("./passkey/base.js");
|
|
42
36
|
Object.defineProperty(exports, "PasskeyStore", { enumerable: true, get: function () { return base_js_3.PasskeyStore; } });
|
|
43
37
|
var memory_js_3 = require("./passkey/memory.js");
|
|
44
38
|
Object.defineProperty(exports, "MemoryPasskeyStore", { enumerable: true, get: function () { return memory_js_3.MemoryPasskeyStore; } });
|
|
45
|
-
var sequelize_js_3 = require("./passkey/sequelize.js");
|
|
46
|
-
Object.defineProperty(exports, "SequelizePasskeyStore", { enumerable: true, get: function () { return sequelize_js_3.SequelizePasskeyStore; } });
|
|
47
39
|
var base_js_4 = require("./oauth/base.js");
|
|
48
40
|
Object.defineProperty(exports, "OAuthStore", { enumerable: true, get: function () { return base_js_4.OAuthStore; } });
|
|
49
41
|
var memory_js_4 = require("./oauth/memory.js");
|
|
50
42
|
Object.defineProperty(exports, "MemoryOAuthStore", { enumerable: true, get: function () { return memory_js_4.MemoryOAuthStore; } });
|
|
51
|
-
var sequelize_js_4 = require("./oauth/sequelize.js");
|
|
52
|
-
Object.defineProperty(exports, "SequelizeOAuthStore", { enumerable: true, get: function () { return sequelize_js_4.SequelizeOAuthStore; } });
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -11,22 +11,17 @@ export { nullAuthAdapter, BaseAuthAdapter } from './auth-api/storage.js';
|
|
|
11
11
|
export { nullAuthModule, BaseAuthModule } from './auth-api/module.js';
|
|
12
12
|
export { CompositeAuthAdapter } from './auth-api/compat-auth-storage.js';
|
|
13
13
|
export { MemAuthStore } from './auth-api/mem-auth-store.js';
|
|
14
|
-
export { SqlAuthStore } from './auth-api/sql-auth-store.js';
|
|
15
14
|
export { default as AuthModule } from './auth-api/auth-module.js';
|
|
16
15
|
export type { OAuthStartParams, OAuthStartResult, OAuthCallbackParams, OAuthCallbackResult } from './oauth/types.js';
|
|
17
16
|
export type { BcryptHasherOptions, CreateUserInput, UpdateUserInput, PublicUserMapper } from './user/types.js';
|
|
18
17
|
export { UserStore } from './user/base.js';
|
|
19
18
|
export { MemoryUserStore } from './user/memory.js';
|
|
20
|
-
export { SequelizeUserStore } from './user/sequelize.js';
|
|
21
19
|
export type { MemoryUserAttributes, MemoryUserStoreOptions } from './user/memory.js';
|
|
22
20
|
export { TokenStore } from './token/base.js';
|
|
23
21
|
export { MemoryTokenStore } from './token/memory.js';
|
|
24
|
-
export { SequelizeTokenStore } from './token/sequelize.js';
|
|
25
22
|
export { PasskeyService } from './passkey/service.js';
|
|
26
23
|
export { PasskeyStore } from './passkey/base.js';
|
|
27
24
|
export { MemoryPasskeyStore } from './passkey/memory.js';
|
|
28
|
-
export { SequelizePasskeyStore } from './passkey/sequelize.js';
|
|
29
25
|
export type { PasskeyServiceConfig, PasskeyChallengeRecord, PasskeyUserDescriptor, StoredPasskeyCredential, PasskeyChallenge, PasskeyChallengeParams, PasskeyVerificationParams, PasskeyVerificationResult } from './passkey/types.js';
|
|
30
26
|
export { OAuthStore } from './oauth/base.js';
|
|
31
27
|
export { MemoryOAuthStore } from './oauth/memory.js';
|
|
32
|
-
export { SequelizeOAuthStore } from './oauth/sequelize.js';
|
|
@@ -95,6 +95,8 @@ export interface ApiServerConf {
|
|
|
95
95
|
origins: string[];
|
|
96
96
|
debug: boolean;
|
|
97
97
|
apiBasePath: string;
|
|
98
|
+
swaggerEnabled?: boolean;
|
|
99
|
+
swaggerPath?: string;
|
|
98
100
|
accessSecret: string;
|
|
99
101
|
refreshSecret: string;
|
|
100
102
|
cookieDomain: string;
|
|
@@ -190,6 +192,8 @@ export declare class ApiServer {
|
|
|
190
192
|
protected authorize(apiReq: ApiRequest, requiredClass: ApiAuthClass): Promise<void>;
|
|
191
193
|
private middlewares;
|
|
192
194
|
private installPingHandler;
|
|
195
|
+
private loadSwaggerSpec;
|
|
196
|
+
private installSwaggerHandler;
|
|
193
197
|
private normalizeApiBasePath;
|
|
194
198
|
private installApiNotFoundHandler;
|
|
195
199
|
private ensureApiNotFoundOrdering;
|
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import { createRequire } from 'node:module';
|
|
10
|
+
import path from 'node:path';
|
|
8
11
|
import cookieParser from 'cookie-parser';
|
|
9
12
|
import cors from 'cors';
|
|
10
13
|
import express from 'express';
|
|
@@ -332,6 +335,8 @@ function fillConfig(config) {
|
|
|
332
335
|
origins: config.origins ?? [],
|
|
333
336
|
debug: config.debug ?? false,
|
|
334
337
|
apiBasePath: config.apiBasePath ?? '/api',
|
|
338
|
+
swaggerEnabled: config.swaggerEnabled ?? false,
|
|
339
|
+
swaggerPath: config.swaggerPath ?? '',
|
|
335
340
|
accessSecret: config.accessSecret ?? '',
|
|
336
341
|
refreshSecret: config.refreshSecret ?? '',
|
|
337
342
|
cookieDomain: config.cookieDomain ?? '.somewhere-over-the-rainbow.com',
|
|
@@ -383,6 +388,7 @@ export class ApiServer {
|
|
|
383
388
|
}
|
|
384
389
|
this.middlewares();
|
|
385
390
|
this.installPingHandler();
|
|
391
|
+
this.installSwaggerHandler();
|
|
386
392
|
// addSwaggerUi(this.app);
|
|
387
393
|
this.installApiNotFoundHandler();
|
|
388
394
|
}
|
|
@@ -622,6 +628,58 @@ export class ApiServer {
|
|
|
622
628
|
res.status(200).json({ success: true, code: 200, message: 'Success', data: payload, errors: {} });
|
|
623
629
|
});
|
|
624
630
|
}
|
|
631
|
+
loadSwaggerSpec() {
|
|
632
|
+
const candidates = [path.resolve(process.cwd(), 'docs/swagger/openapi.json')];
|
|
633
|
+
if (typeof __dirname === 'string') {
|
|
634
|
+
candidates.push(path.resolve(__dirname, '../../docs/swagger/openapi.json'));
|
|
635
|
+
}
|
|
636
|
+
try {
|
|
637
|
+
const require = createRequire(path.join(process.cwd(), 'package.json'));
|
|
638
|
+
const entry = require.resolve('@technomoron/api-server-base');
|
|
639
|
+
const packageRoot = path.resolve(path.dirname(entry), '..', '..');
|
|
640
|
+
candidates.push(path.join(packageRoot, 'docs/swagger/openapi.json'));
|
|
641
|
+
}
|
|
642
|
+
catch {
|
|
643
|
+
// Ignore resolution failures; fall back to any existing candidate.
|
|
644
|
+
}
|
|
645
|
+
for (const candidate of candidates) {
|
|
646
|
+
if (!fs.existsSync(candidate)) {
|
|
647
|
+
continue;
|
|
648
|
+
}
|
|
649
|
+
try {
|
|
650
|
+
const raw = fs.readFileSync(candidate, 'utf8');
|
|
651
|
+
return JSON.parse(raw);
|
|
652
|
+
}
|
|
653
|
+
catch {
|
|
654
|
+
return null;
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
return null;
|
|
658
|
+
}
|
|
659
|
+
installSwaggerHandler() {
|
|
660
|
+
const rawPath = typeof this.config.swaggerPath === 'string' ? this.config.swaggerPath.trim() : '';
|
|
661
|
+
const enabled = Boolean(this.config.swaggerEnabled) || rawPath.length > 0;
|
|
662
|
+
if (!enabled) {
|
|
663
|
+
return;
|
|
664
|
+
}
|
|
665
|
+
const base = this.apiBasePath === '/' ? '' : this.apiBasePath;
|
|
666
|
+
const resolved = rawPath.length > 0 ? rawPath : `${base}/swagger`;
|
|
667
|
+
const path = resolved.startsWith('/') ? resolved : `/${resolved}`;
|
|
668
|
+
const spec = this.loadSwaggerSpec();
|
|
669
|
+
this.app.get(path, (_req, res) => {
|
|
670
|
+
if (!spec) {
|
|
671
|
+
res.status(500).json({
|
|
672
|
+
success: false,
|
|
673
|
+
code: 500,
|
|
674
|
+
message: 'Swagger spec is unavailable',
|
|
675
|
+
data: null,
|
|
676
|
+
errors: {}
|
|
677
|
+
});
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
res.status(200).json(spec);
|
|
681
|
+
});
|
|
682
|
+
}
|
|
625
683
|
normalizeApiBasePath(path) {
|
|
626
684
|
if (!path || typeof path !== 'string') {
|
|
627
685
|
return '/api';
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -11,22 +11,17 @@ export { nullAuthAdapter, BaseAuthAdapter } from './auth-api/storage.js';
|
|
|
11
11
|
export { nullAuthModule, BaseAuthModule } from './auth-api/module.js';
|
|
12
12
|
export { CompositeAuthAdapter } from './auth-api/compat-auth-storage.js';
|
|
13
13
|
export { MemAuthStore } from './auth-api/mem-auth-store.js';
|
|
14
|
-
export { SqlAuthStore } from './auth-api/sql-auth-store.js';
|
|
15
14
|
export { default as AuthModule } from './auth-api/auth-module.js';
|
|
16
15
|
export type { OAuthStartParams, OAuthStartResult, OAuthCallbackParams, OAuthCallbackResult } from './oauth/types.js';
|
|
17
16
|
export type { BcryptHasherOptions, CreateUserInput, UpdateUserInput, PublicUserMapper } from './user/types.js';
|
|
18
17
|
export { UserStore } from './user/base.js';
|
|
19
18
|
export { MemoryUserStore } from './user/memory.js';
|
|
20
|
-
export { SequelizeUserStore } from './user/sequelize.js';
|
|
21
19
|
export type { MemoryUserAttributes, MemoryUserStoreOptions } from './user/memory.js';
|
|
22
20
|
export { TokenStore } from './token/base.js';
|
|
23
21
|
export { MemoryTokenStore } from './token/memory.js';
|
|
24
|
-
export { SequelizeTokenStore } from './token/sequelize.js';
|
|
25
22
|
export { PasskeyService } from './passkey/service.js';
|
|
26
23
|
export { PasskeyStore } from './passkey/base.js';
|
|
27
24
|
export { MemoryPasskeyStore } from './passkey/memory.js';
|
|
28
|
-
export { SequelizePasskeyStore } from './passkey/sequelize.js';
|
|
29
25
|
export type { PasskeyServiceConfig, PasskeyChallengeRecord, PasskeyUserDescriptor, StoredPasskeyCredential, PasskeyChallenge, PasskeyChallengeParams, PasskeyVerificationParams, PasskeyVerificationResult } from './passkey/types.js';
|
|
30
26
|
export { OAuthStore } from './oauth/base.js';
|
|
31
27
|
export { MemoryOAuthStore } from './oauth/memory.js';
|
|
32
|
-
export { SequelizeOAuthStore } from './oauth/sequelize.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -5,18 +5,13 @@ export { nullAuthAdapter, BaseAuthAdapter } from './auth-api/storage.js';
|
|
|
5
5
|
export { nullAuthModule, BaseAuthModule } from './auth-api/module.js';
|
|
6
6
|
export { CompositeAuthAdapter } from './auth-api/compat-auth-storage.js';
|
|
7
7
|
export { MemAuthStore } from './auth-api/mem-auth-store.js';
|
|
8
|
-
export { SqlAuthStore } from './auth-api/sql-auth-store.js';
|
|
9
8
|
export { default as AuthModule } from './auth-api/auth-module.js';
|
|
10
9
|
export { UserStore } from './user/base.js';
|
|
11
10
|
export { MemoryUserStore } from './user/memory.js';
|
|
12
|
-
export { SequelizeUserStore } from './user/sequelize.js';
|
|
13
11
|
export { TokenStore } from './token/base.js';
|
|
14
12
|
export { MemoryTokenStore } from './token/memory.js';
|
|
15
|
-
export { SequelizeTokenStore } from './token/sequelize.js';
|
|
16
13
|
export { PasskeyService } from './passkey/service.js';
|
|
17
14
|
export { PasskeyStore } from './passkey/base.js';
|
|
18
15
|
export { MemoryPasskeyStore } from './passkey/memory.js';
|
|
19
|
-
export { SequelizePasskeyStore } from './passkey/sequelize.js';
|
|
20
16
|
export { OAuthStore } from './oauth/base.js';
|
|
21
17
|
export { MemoryOAuthStore } from './oauth/memory.js';
|
|
22
|
-
export { SequelizeOAuthStore } from './oauth/sequelize.js';
|