@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.
@@ -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;
@@ -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.SequelizeOAuthStore = exports.MemoryOAuthStore = exports.OAuthStore = exports.SequelizePasskeyStore = exports.MemoryPasskeyStore = exports.PasskeyStore = exports.PasskeyService = exports.SequelizeTokenStore = exports.MemoryTokenStore = exports.TokenStore = exports.SequelizeUserStore = exports.MemoryUserStore = exports.UserStore = exports.AuthModule = exports.SqlAuthStore = exports.MemAuthStore = exports.CompositeAuthAdapter = exports.BaseAuthModule = exports.nullAuthModule = exports.BaseAuthAdapter = exports.nullAuthAdapter = exports.ApiModule = exports.ApiError = exports.ApiServer = void 0;
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; } });
@@ -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';
@@ -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';