@acorex-platform/module-auth-server 0.0.15 → 2.0.0-next.42

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.
Files changed (53) hide show
  1. package/contracts/src/commands.keys.d.ts +10 -0
  2. package/contracts/src/commands.keys.js +11 -1
  3. package/contracts/src/commands.keys.js.map +1 -1
  4. package/contracts/src/index.d.ts +1 -1
  5. package/contracts/src/index.js +1 -1
  6. package/contracts/src/index.js.map +1 -1
  7. package/contracts/src/menu.keys.js.map +1 -1
  8. package/contracts/src/permission.keys.d.ts +12 -2
  9. package/contracts/src/permission.keys.js +12 -3
  10. package/contracts/src/permission.keys.js.map +1 -1
  11. package/contracts/src/queries.keys.d.ts +6 -0
  12. package/contracts/src/queries.keys.js +12 -0
  13. package/contracts/src/queries.keys.js.map +1 -0
  14. package/contracts/src/root-config.d.ts +9 -0
  15. package/contracts/src/root-config.js +9 -0
  16. package/contracts/src/root-config.js.map +1 -1
  17. package/contracts/src/settings.keys.d.ts +55 -2
  18. package/contracts/src/settings.keys.js +92 -2
  19. package/contracts/src/settings.keys.js.map +1 -1
  20. package/package.json +19 -13
  21. package/server/src/index.js.map +1 -0
  22. package/server/src/lib/auth-lockout-settings.service.d.ts +9 -0
  23. package/server/src/lib/auth-lockout-settings.service.js +51 -0
  24. package/server/src/lib/auth-lockout-settings.service.js.map +1 -0
  25. package/server/src/lib/auth-max-device-sessions-settings.service.d.ts +8 -0
  26. package/server/src/lib/auth-max-device-sessions-settings.service.js +48 -0
  27. package/server/src/lib/auth-max-device-sessions-settings.service.js.map +1 -0
  28. package/server/src/lib/auth-server.module.js +53 -0
  29. package/server/src/lib/auth-server.module.js.map +1 -0
  30. package/server/src/lib/inactive-session/auth-device-session-activity.interceptor.d.ts +14 -0
  31. package/server/src/lib/inactive-session/auth-device-session-activity.interceptor.js +77 -0
  32. package/server/src/lib/inactive-session/auth-device-session-activity.interceptor.js.map +1 -0
  33. package/server/src/lib/inactive-session/auth-inactive-session-termination-purge.command.d.ts +7 -0
  34. package/server/src/lib/inactive-session/auth-inactive-session-termination-purge.command.js +39 -0
  35. package/server/src/lib/inactive-session/auth-inactive-session-termination-purge.command.js.map +1 -0
  36. package/server/src/lib/inactive-session/auth-inactive-session-termination-settings.service.d.ts +9 -0
  37. package/server/src/lib/inactive-session/auth-inactive-session-termination-settings.service.js +57 -0
  38. package/server/src/lib/inactive-session/auth-inactive-session-termination-settings.service.js.map +1 -0
  39. package/server/src/lib/inactive-session/auth-inactive-session-termination.service.d.ts +18 -0
  40. package/server/src/lib/inactive-session/auth-inactive-session-termination.service.js +120 -0
  41. package/server/src/lib/inactive-session/auth-inactive-session-termination.service.js.map +1 -0
  42. package/server/src/lib/queries/list-connected-captcha-providers.query.d.ts +12 -0
  43. package/server/src/lib/queries/list-connected-captcha-providers.query.js +96 -0
  44. package/server/src/lib/queries/list-connected-captcha-providers.query.js.map +1 -0
  45. package/contracts/src/datasource.keys.d.ts +0 -4
  46. package/contracts/src/datasource.keys.js +0 -10
  47. package/contracts/src/datasource.keys.js.map +0 -1
  48. package/src/index.js.map +0 -1
  49. package/src/lib/auth-server.module.js +0 -15
  50. package/src/lib/auth-server.module.js.map +0 -1
  51. /package/{src → server/src}/index.d.ts +0 -0
  52. /package/{src → server/src}/index.js +0 -0
  53. /package/{src → server/src}/lib/auth-server.module.d.ts +0 -0
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuthServerModule = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const core_1 = require("@nestjs/core");
7
+ const core_2 = require("@acorex-platform/framework-server/core");
8
+ const module_settings_management_contracts_1 = require("@acorex-platform/module-settings-management-client/contracts");
9
+ const module_settings_management_server_1 = require("@acorex-platform/module-settings-management-server");
10
+ const module_auth_contracts_1 = require("@acorex-platform/module-auth-client/contracts");
11
+ const auth_lockout_settings_service_1 = require("./auth-lockout-settings.service");
12
+ const auth_max_device_sessions_settings_service_1 = require("./auth-max-device-sessions-settings.service");
13
+ const auth_device_session_activity_interceptor_1 = require("./inactive-session/auth-device-session-activity.interceptor");
14
+ const auth_inactive_session_termination_purge_command_1 = require("./inactive-session/auth-inactive-session-termination-purge.command");
15
+ const auth_inactive_session_termination_settings_service_1 = require("./inactive-session/auth-inactive-session-termination-settings.service");
16
+ const auth_inactive_session_termination_service_1 = require("./inactive-session/auth-inactive-session-termination.service");
17
+ const list_connected_captcha_providers_query_1 = require("./queries/list-connected-captcha-providers.query");
18
+ //#region ----- Auth server module -----
19
+ let AuthServerModule = class AuthServerModule {
20
+ };
21
+ exports.AuthServerModule = AuthServerModule;
22
+ exports.AuthServerModule = AuthServerModule = tslib_1.__decorate([
23
+ (0, common_1.Module)({
24
+ imports: [module_settings_management_server_1.SettingsManagementServerModule, core_2.EntityStorageModule],
25
+ providers: [
26
+ auth_lockout_settings_service_1.AuthLockoutSettingsService,
27
+ auth_max_device_sessions_settings_service_1.AuthMaxDeviceSessionsSettingsService,
28
+ auth_inactive_session_termination_settings_service_1.AuthInactiveSessionTerminationSettingsService,
29
+ auth_inactive_session_termination_service_1.AuthInactiveSessionTerminationService,
30
+ auth_inactive_session_termination_purge_command_1.AuthInactiveSessionTerminationPurgeCommand,
31
+ auth_device_session_activity_interceptor_1.AuthDeviceSessionActivityInterceptor,
32
+ list_connected_captcha_providers_query_1.AuthListConnectedCaptchaProvidersQuery,
33
+ {
34
+ provide: core_1.APP_INTERCEPTOR,
35
+ useExisting: auth_device_session_activity_interceptor_1.AuthDeviceSessionActivityInterceptor,
36
+ },
37
+ (0, module_settings_management_contracts_1.provideSettingsDefaults)((0, module_settings_management_contracts_1.createStaticSettingsDefaultsProvider)({
38
+ scope: 'P',
39
+ layer: 'auth',
40
+ priority: module_settings_management_contracts_1.SETTINGS_DEFAULTS_PRIORITY.module,
41
+ values: Object.assign(Object.assign({}, module_auth_contracts_1.AXP_AUTH_LOCKOUT_SETTING_DEFAULTS), { [module_auth_contracts_1.AXPAuthSettings.SignInPageSlogan]: module_auth_contracts_1.AXP_AUTH_SIGN_IN_PAGE_SLOGAN_DEFAULT, [module_auth_contracts_1.AXPAuthSettings.SignInPageDescription]: module_auth_contracts_1.AXP_AUTH_SIGN_IN_PAGE_DESCRIPTION_DEFAULT }),
42
+ })),
43
+ (0, module_settings_management_contracts_1.provideSettingsDefaults)((0, module_settings_management_contracts_1.createStaticSettingsDefaultsProvider)({
44
+ scope: 'T',
45
+ layer: 'auth-session',
46
+ priority: module_settings_management_contracts_1.SETTINGS_DEFAULTS_PRIORITY.module,
47
+ values: Object.assign(Object.assign({}, module_auth_contracts_1.AXP_AUTH_MAX_ACTIVE_DEVICE_SESSIONS_SETTING_DEFAULTS), module_auth_contracts_1.AXP_AUTH_INACTIVE_SESSION_TERMINATION_SETTING_DEFAULTS),
48
+ })),
49
+ ],
50
+ })
51
+ ], AuthServerModule);
52
+ //#endregion
53
+ //# sourceMappingURL=auth-server.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-server.module.js","sourceRoot":"","sources":["../../../../../../libs/modules/auth/server/src/lib/auth-server.module.ts"],"names":[],"mappings":";;;;AAAA,2CAAwC;AACxC,uCAA+C;AAC/C,iEAA6E;AAC7E,gHAI+D;AAC/D,0GAAoG;AACpG,kFAOgD;AAChD,mFAA6E;AAC7E,2GAAmG;AACnG,0HAAmH;AACnH,wIAAgI;AAChI,8IAAsI;AACtI,4HAAqH;AACrH,6GAA0G;AAE1G,wCAAwC;AAyCjC,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAAG,CAAA;AAAnB,4CAAgB;2BAAhB,gBAAgB;IAvC5B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,kEAA8B,EAAE,0BAAmB,CAAC;QAC9D,SAAS,EAAE;YACT,0DAA0B;YAC1B,gFAAoC;YACpC,kGAA6C;YAC7C,iFAAqC;YACrC,4FAA0C;YAC1C,+EAAoC;YACpC,+EAAsC;YACtC;gBACE,OAAO,EAAE,sBAAe;gBACxB,WAAW,EAAE,+EAAoC;aAClD;YACD,IAAA,8DAAuB,EACrB,IAAA,2EAAoC,EAAC;gBACnC,KAAK,EAAE,GAAG;gBACV,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,iEAA0B,CAAC,MAAM;gBAC3C,MAAM,kCACD,yDAAiC,KACpC,CAAC,uCAAe,CAAC,gBAAgB,CAAC,EAAE,4DAAoC,EACxE,CAAC,uCAAe,CAAC,qBAAqB,CAAC,EAAE,iEAAyC,GACnF;aACF,CAAC,CACH;YACD,IAAA,8DAAuB,EACrB,IAAA,2EAAoC,EAAC;gBACnC,KAAK,EAAE,GAAG;gBACV,KAAK,EAAE,cAAc;gBACrB,QAAQ,EAAE,iEAA0B,CAAC,MAAM;gBAC3C,MAAM,kCACD,4EAAoD,GACpD,8EAAsD,CAC1D;aACF,CAAC,CACH;SACF;KACF,CAAC;GACW,gBAAgB,CAAG;AAEhC,YAAY"}
@@ -0,0 +1,14 @@
1
+ import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
+ import { EntityStorageMiddlewareService } from '@acorex-platform/framework-server/core';
3
+ import type { Observable } from 'rxjs';
4
+ /**
5
+ * Refreshes DeviceSessions.lastLoginDate while the user is making authenticated API calls
6
+ * so InactiveSessionTermination measures real inactivity (not only original login time).
7
+ */
8
+ export declare class AuthDeviceSessionActivityInterceptor implements NestInterceptor {
9
+ private readonly storage;
10
+ private readonly lastTouchBySid;
11
+ constructor(storage: EntityStorageMiddlewareService);
12
+ intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
13
+ private touchActivity;
14
+ }
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuthDeviceSessionActivityInterceptor = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const core_1 = require("@acorex-platform/framework-server/core");
7
+ const security_1 = require("@acorex-platform/framework-server/security");
8
+ //#region ----- Constants -----
9
+ const DEVICE_SESSION_ENTITY = 'SecurityManagement.DeviceSessions';
10
+ /** Avoid writing lastLoginDate on every request; once per sid per throttle window is enough. */
11
+ const TOUCH_THROTTLE_MS = 30000;
12
+ //#endregion
13
+ //#region ----- Device session activity interceptor -----
14
+ /**
15
+ * Refreshes DeviceSessions.lastLoginDate while the user is making authenticated API calls
16
+ * so InactiveSessionTermination measures real inactivity (not only original login time).
17
+ */
18
+ let AuthDeviceSessionActivityInterceptor = class AuthDeviceSessionActivityInterceptor {
19
+ constructor(storage) {
20
+ this.storage = storage;
21
+ this.lastTouchBySid = new Map();
22
+ }
23
+ intercept(context, next) {
24
+ var _a, _b;
25
+ if (context.getType() === 'http') {
26
+ const request = context.switchToHttp().getRequest();
27
+ const sid = (_b = (_a = request === null || request === void 0 ? void 0 : request[security_1.CURRENT_SESSION_KEY]) === null || _a === void 0 ? void 0 : _a.sid) === null || _b === void 0 ? void 0 : _b.trim();
28
+ if (sid) {
29
+ void this.touchActivity(sid);
30
+ }
31
+ }
32
+ return next.handle();
33
+ }
34
+ touchActivity(sessionId) {
35
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
36
+ var _a, _b, _c;
37
+ const now = Date.now();
38
+ const last = (_a = this.lastTouchBySid.get(sessionId)) !== null && _a !== void 0 ? _a : 0;
39
+ if (now - last < TOUCH_THROTTLE_MS) {
40
+ return;
41
+ }
42
+ this.lastTouchBySid.set(sessionId, now);
43
+ try {
44
+ const page = yield this.storage.queryAsEngine(DEVICE_SESSION_ENTITY, {
45
+ skip: 0,
46
+ take: 5,
47
+ filter: {
48
+ logic: 'and',
49
+ filters: [
50
+ { field: 'sessionId', operator: { type: 'equal' }, value: sessionId },
51
+ { field: 'status', operator: { type: 'equal' }, value: 'active' },
52
+ ],
53
+ },
54
+ });
55
+ const items = ((_b = page.items) !== null && _b !== void 0 ? _b : []);
56
+ const id = typeof ((_c = items[0]) === null || _c === void 0 ? void 0 : _c.id) === 'string' ? items[0].id : '';
57
+ if (!id) {
58
+ return;
59
+ }
60
+ yield this.storage.updateOneAsEngine(DEVICE_SESSION_ENTITY, id, {
61
+ lastLoginDate: new Date(),
62
+ });
63
+ }
64
+ catch (_d) {
65
+ // Best-effort; do not fail the request if activity stamp fails.
66
+ this.lastTouchBySid.delete(sessionId);
67
+ }
68
+ });
69
+ }
70
+ };
71
+ exports.AuthDeviceSessionActivityInterceptor = AuthDeviceSessionActivityInterceptor;
72
+ exports.AuthDeviceSessionActivityInterceptor = AuthDeviceSessionActivityInterceptor = tslib_1.__decorate([
73
+ (0, common_1.Injectable)(),
74
+ tslib_1.__metadata("design:paramtypes", [core_1.EntityStorageMiddlewareService])
75
+ ], AuthDeviceSessionActivityInterceptor);
76
+ //#endregion
77
+ //# sourceMappingURL=auth-device-session-activity.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-device-session-activity.interceptor.js","sourceRoot":"","sources":["../../../../../../../libs/modules/auth/server/src/lib/inactive-session/auth-device-session-activity.interceptor.ts"],"names":[],"mappings":";;;;AAAA,2CAKwB;AACxB,iEAAwF;AACxF,yEAA6G;AAG7G,+BAA+B;AAE/B,MAAM,qBAAqB,GAAG,mCAAmC,CAAC;AAClE,gGAAgG;AAChG,MAAM,iBAAiB,GAAG,KAAM,CAAC;AAEjC,YAAY;AAEZ,yDAAyD;AAEzD;;;GAGG;AAEI,IAAM,oCAAoC,GAA1C,MAAM,oCAAoC;IAG/C,YAA6B,OAAuC;QAAvC,YAAO,GAAP,OAAO,CAAgC;QAFnD,mBAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEW,CAAC;IAExE,SAAS,CAAC,OAAyB,EAAE,IAAiB;;QACpD,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAE7C,CAAC;YACL,MAAM,GAAG,GAAG,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,8BAAmB,CAAC,0CAAE,GAAG,0CAAE,IAAI,EAAE,CAAC;YACxD,IAAI,GAAG,EAAE,CAAC;gBACR,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAEa,aAAa,CAAC,SAAiB;;;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,MAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAI,CAAC,CAAC;YACrD,IAAI,GAAG,GAAG,IAAI,GAAG,iBAAiB,EAAE,CAAC;gBACnC,OAAO;YACT,CAAC;YACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAExC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,qBAAqB,EAAE;oBACnE,IAAI,EAAE,CAAC;oBACP,IAAI,EAAE,CAAC;oBACP,MAAM,EAAE;wBACN,KAAK,EAAE,KAAK;wBACZ,OAAO,EAAE;4BACP,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;4BACrE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;yBAClE;qBACF;iBACF,CAAC,CAAC;gBAEH,MAAM,KAAK,GAAG,CAAC,MAAA,IAAI,CAAC,KAAK,mCAAI,EAAE,CAA4B,CAAC;gBAC5D,MAAM,EAAE,GAAG,OAAO,CAAA,MAAA,KAAK,CAAC,CAAC,CAAC,0CAAE,EAAE,CAAA,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,IAAI,CAAC,EAAE,EAAE,CAAC;oBACR,OAAO;gBACT,CAAC;gBAED,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,EAAE,EAAE;oBAC9D,aAAa,EAAE,IAAI,IAAI,EAAE;iBAC1B,CAAC,CAAC;YACL,CAAC;YAAC,WAAM,CAAC;gBACP,gEAAgE;gBAChE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;KAAA;CACF,CAAA;AAtDY,oFAAoC;+CAApC,oCAAoC;IADhD,IAAA,mBAAU,GAAE;6CAI2B,qCAA8B;GAHzD,oCAAoC,CAsDhD;AAED,YAAY"}
@@ -0,0 +1,7 @@
1
+ import type { AXPCommand, AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';
2
+ import { AuthInactiveSessionTerminationService, type AuthInactiveSessionTerminationPurgeResult } from './auth-inactive-session-termination.service';
3
+ export declare class AuthInactiveSessionTerminationPurgeCommand implements AXPCommand<Record<string, unknown>, AuthInactiveSessionTerminationPurgeResult> {
4
+ private readonly termination;
5
+ constructor(termination: AuthInactiveSessionTerminationService);
6
+ execute(): AXPCommandExecuteResultPromise<AuthInactiveSessionTerminationPurgeResult>;
7
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuthInactiveSessionTerminationPurgeCommand = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const background_job_1 = require("@acorex-platform/framework-server/background-job");
7
+ const abstract_1 = require("@acorex-platform/framework-server/domain/abstract");
8
+ const module_auth_contracts_1 = require("@acorex-platform/module-auth-client/contracts");
9
+ const auth_inactive_session_termination_service_1 = require("./auth-inactive-session-termination.service");
10
+ //#region ----- Inactive session termination purge command -----
11
+ let AuthInactiveSessionTerminationPurgeCommand = class AuthInactiveSessionTerminationPurgeCommand {
12
+ constructor(termination) {
13
+ this.termination = termination;
14
+ }
15
+ execute() {
16
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
17
+ const runtime = background_job_1.BackgroundJobRuntime.current();
18
+ yield (runtime === null || runtime === void 0 ? void 0 : runtime.reportProgress(5, 'Scanning inactive device sessions'));
19
+ yield (runtime === null || runtime === void 0 ? void 0 : runtime.heartbeat());
20
+ const result = yield this.termination.purgeInactiveSessions();
21
+ const message = result.revoked > 0
22
+ ? `Revoked ${result.revoked} inactive session(s) (scanned ${result.scanned})`
23
+ : `Revoked 0 sessions — scanned ${result.scanned} active session(s)`;
24
+ yield (runtime === null || runtime === void 0 ? void 0 : runtime.reportProgress(100, message));
25
+ return { success: true, kind: 'object', data: result, message: { text: message } };
26
+ });
27
+ }
28
+ };
29
+ exports.AuthInactiveSessionTerminationPurgeCommand = AuthInactiveSessionTerminationPurgeCommand;
30
+ exports.AuthInactiveSessionTerminationPurgeCommand = AuthInactiveSessionTerminationPurgeCommand = tslib_1.__decorate([
31
+ (0, abstract_1.ServerHandler)({
32
+ key: module_auth_contracts_1.AXM_AUTH_INACTIVE_SESSION_TERMINATION_PURGE_COMMAND_KEY,
33
+ concurrency: { policy: 'skip-if-running', scope: 'global' },
34
+ }),
35
+ (0, common_1.Injectable)(),
36
+ tslib_1.__metadata("design:paramtypes", [auth_inactive_session_termination_service_1.AuthInactiveSessionTerminationService])
37
+ ], AuthInactiveSessionTerminationPurgeCommand);
38
+ //#endregion
39
+ //# sourceMappingURL=auth-inactive-session-termination-purge.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-inactive-session-termination-purge.command.js","sourceRoot":"","sources":["../../../../../../../libs/modules/auth/server/src/lib/inactive-session/auth-inactive-session-termination-purge.command.ts"],"names":[],"mappings":";;;;AAAA,2CAA4C;AAE5C,qFAAwF;AACxF,gFAAkF;AAClF,kFAAiH;AACjH,2GAGqD;AAErD,gEAAgE;AAOzD,IAAM,0CAA0C,GAAhD,MAAM,0CAA0C;IAGrD,YAA6B,WAAkD;QAAlD,gBAAW,GAAX,WAAW,CAAuC;IAAG,CAAC;IAE7E,OAAO;;YACX,MAAM,OAAO,GAAG,qCAAoB,CAAC,OAAO,EAAE,CAAC;YAC/C,MAAM,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,CAAC,CAAC,EAAE,mCAAmC,CAAC,CAAA,CAAC;YACtE,MAAM,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE,CAAA,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,qBAAqB,EAAE,CAAC;YAC9D,MAAM,OAAO,GACX,MAAM,CAAC,OAAO,GAAG,CAAC;gBAChB,CAAC,CAAC,WAAW,MAAM,CAAC,OAAO,iCAAiC,MAAM,CAAC,OAAO,GAAG;gBAC7E,CAAC,CAAC,gCAAgC,MAAM,CAAC,OAAO,oBAAoB,CAAC;YAEzE,MAAM,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA,CAAC;YAE5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;QACrF,CAAC;KAAA;CACF,CAAA;AApBY,gGAA0C;qDAA1C,0CAA0C;IALtD,IAAA,wBAAa,EAAC;QACb,GAAG,EAAE,+EAAuD;QAC5D,WAAW,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE;KAC5D,CAAC;IACD,IAAA,mBAAU,GAAE;6CAI+B,iFAAqC;GAHpE,0CAA0C,CAoBtD;AAED,YAAY"}
@@ -0,0 +1,9 @@
1
+ import { SettingsManagementStoreService } from '@acorex-platform/module-settings-management-server';
2
+ export declare class AuthInactiveSessionTerminationSettingsService {
3
+ private readonly settingsStore;
4
+ constructor(settingsStore: SettingsManagementStoreService);
5
+ /**
6
+ * Effective inactivity window: user override → tenant default → code default.
7
+ */
8
+ resolveDurationMs(userId: string, tenantId: string | undefined | null): Promise<number>;
9
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuthInactiveSessionTerminationSettingsService = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const module_settings_management_server_1 = require("@acorex-platform/module-settings-management-server");
7
+ const module_auth_contracts_1 = require("@acorex-platform/module-auth-client/contracts");
8
+ //#region ----- Inactive session termination settings -----
9
+ let AuthInactiveSessionTerminationSettingsService = class AuthInactiveSessionTerminationSettingsService {
10
+ constructor(settingsStore) {
11
+ this.settingsStore = settingsStore;
12
+ }
13
+ /**
14
+ * Effective inactivity window: user override → tenant default → code default.
15
+ */
16
+ resolveDurationMs(userId, tenantId) {
17
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
18
+ var _a, _b;
19
+ const uid = userId === null || userId === void 0 ? void 0 : userId.trim();
20
+ const tid = tenantId === null || tenantId === void 0 ? void 0 : tenantId.trim();
21
+ if (!uid) {
22
+ return (0, module_auth_contracts_1.resolveAuthInactiveSessionTerminationDurationMs)(module_auth_contracts_1.AXP_AUTH_INACTIVE_SESSION_TERMINATION_SETTING_DEFAULTS[module_auth_contracts_1.AXPAuthSettings.InactiveSessionTermination]);
23
+ }
24
+ if (uid) {
25
+ const userDocument = yield this.settingsStore.findByPartition({
26
+ scope: 'U',
27
+ documentId: `U:${uid}`,
28
+ userId: uid,
29
+ tenantId: tid || undefined,
30
+ });
31
+ const userValue = (_a = userDocument === null || userDocument === void 0 ? void 0 : userDocument.values) === null || _a === void 0 ? void 0 : _a[module_auth_contracts_1.AXPAuthSettings.InactiveSessionTermination];
32
+ if (userValue != null && userValue !== '') {
33
+ return (0, module_auth_contracts_1.resolveAuthInactiveSessionTerminationDurationMs)(userValue);
34
+ }
35
+ }
36
+ if (tid) {
37
+ const tenantDocument = yield this.settingsStore.findByPartition({
38
+ scope: 'T',
39
+ documentId: `T:${tid}`,
40
+ tenantId: tid,
41
+ });
42
+ const tenantValue = (_b = tenantDocument === null || tenantDocument === void 0 ? void 0 : tenantDocument.values) === null || _b === void 0 ? void 0 : _b[module_auth_contracts_1.AXPAuthSettings.InactiveSessionTermination];
43
+ if (tenantValue != null && tenantValue !== '') {
44
+ return (0, module_auth_contracts_1.resolveAuthInactiveSessionTerminationDurationMs)(tenantValue);
45
+ }
46
+ }
47
+ return (0, module_auth_contracts_1.resolveAuthInactiveSessionTerminationDurationMs)(module_auth_contracts_1.AXP_AUTH_INACTIVE_SESSION_TERMINATION_SETTING_DEFAULTS[module_auth_contracts_1.AXPAuthSettings.InactiveSessionTermination]);
48
+ });
49
+ }
50
+ };
51
+ exports.AuthInactiveSessionTerminationSettingsService = AuthInactiveSessionTerminationSettingsService;
52
+ exports.AuthInactiveSessionTerminationSettingsService = AuthInactiveSessionTerminationSettingsService = tslib_1.__decorate([
53
+ (0, common_1.Injectable)(),
54
+ tslib_1.__metadata("design:paramtypes", [module_settings_management_server_1.SettingsManagementStoreService])
55
+ ], AuthInactiveSessionTerminationSettingsService);
56
+ //#endregion
57
+ //# sourceMappingURL=auth-inactive-session-termination-settings.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-inactive-session-termination-settings.service.js","sourceRoot":"","sources":["../../../../../../../libs/modules/auth/server/src/lib/inactive-session/auth-inactive-session-termination-settings.service.ts"],"names":[],"mappings":";;;;AAAA,2CAA4C;AAC5C,0GAAoG;AACpG,kFAIgD;AAEhD,2DAA2D;AAGpD,IAAM,6CAA6C,GAAnD,MAAM,6CAA6C;IACxD,YAA6B,aAA6C;QAA7C,kBAAa,GAAb,aAAa,CAAgC;IAAG,CAAC;IAE9E;;OAEG;IACG,iBAAiB,CAAC,MAAc,EAAE,QAAmC;;;YACzE,MAAM,GAAG,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,IAAA,uEAA+C,EACpD,8EAAsD,CAAC,uCAAe,CAAC,0BAA0B,CAAC,CACnG,CAAC;YACJ,CAAC;YAED,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC;oBAC5D,KAAK,EAAE,GAAG;oBACV,UAAU,EAAE,KAAK,GAAG,EAAE;oBACtB,MAAM,EAAE,GAAG;oBACX,QAAQ,EAAE,GAAG,IAAI,SAAS;iBAC3B,CAAC,CAAC;gBACH,MAAM,SAAS,GAAG,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,0CAAG,uCAAe,CAAC,0BAA0B,CAAC,CAAC;gBACrF,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;oBAC1C,OAAO,IAAA,uEAA+C,EAAC,SAAS,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;YAED,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC;oBAC9D,KAAK,EAAE,GAAG;oBACV,UAAU,EAAE,KAAK,GAAG,EAAE;oBACtB,QAAQ,EAAE,GAAG;iBACd,CAAC,CAAC;gBACH,MAAM,WAAW,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,0CAAG,uCAAe,CAAC,0BAA0B,CAAC,CAAC;gBACzF,IAAI,WAAW,IAAI,IAAI,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;oBAC9C,OAAO,IAAA,uEAA+C,EAAC,WAAW,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;YAED,OAAO,IAAA,uEAA+C,EACpD,8EAAsD,CAAC,uCAAe,CAAC,0BAA0B,CAAC,CACnG,CAAC;QACJ,CAAC;KAAA;CACF,CAAA;AA5CY,sGAA6C;wDAA7C,6CAA6C;IADzD,IAAA,mBAAU,GAAE;6CAEiC,kEAA8B;GAD/D,6CAA6C,CA4CzD;AAED,YAAY"}
@@ -0,0 +1,18 @@
1
+ import { EntityStorageMiddlewareService } from '@acorex-platform/framework-server/core';
2
+ import { AuthInactiveSessionTerminationSettingsService } from './auth-inactive-session-termination-settings.service';
3
+ export interface AuthInactiveSessionTerminationPurgeResult {
4
+ scanned: number;
5
+ revoked: number;
6
+ }
7
+ export declare class AuthInactiveSessionTerminationService {
8
+ private readonly storage;
9
+ private readonly settings;
10
+ private readonly logger;
11
+ constructor(storage: EntityStorageMiddlewareService, settings: AuthInactiveSessionTerminationSettingsService);
12
+ /**
13
+ * Revokes active DeviceSessions whose last activity (`lastLoginDate`) is older
14
+ * than the effective InactiveSessionTermination setting for that user/tenant.
15
+ * Token revoke middleware stamps Redis + emits realtime kick.
16
+ */
17
+ purgeInactiveSessions(): Promise<AuthInactiveSessionTerminationPurgeResult>;
18
+ }
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ var AuthInactiveSessionTerminationService_1;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AuthInactiveSessionTerminationService = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const common_1 = require("@nestjs/common");
7
+ const core_1 = require("@acorex-platform/framework-server/core");
8
+ const module_auth_contracts_1 = require("@acorex-platform/module-auth-client/contracts");
9
+ const auth_inactive_session_termination_settings_service_1 = require("./auth-inactive-session-termination-settings.service");
10
+ //#region ----- Types -----
11
+ const DEVICE_SESSION_ENTITY = 'SecurityManagement.DeviceSessions';
12
+ const PAGE_SIZE = 100;
13
+ //#endregion
14
+ //#region ----- Inactive session termination purge -----
15
+ let AuthInactiveSessionTerminationService = AuthInactiveSessionTerminationService_1 = class AuthInactiveSessionTerminationService {
16
+ constructor(storage, settings) {
17
+ this.storage = storage;
18
+ this.settings = settings;
19
+ this.logger = new common_1.Logger(AuthInactiveSessionTerminationService_1.name);
20
+ }
21
+ /**
22
+ * Revokes active DeviceSessions whose last activity (`lastLoginDate`) is older
23
+ * than the effective InactiveSessionTermination setting for that user/tenant.
24
+ * Token revoke middleware stamps Redis + emits realtime kick.
25
+ */
26
+ purgeInactiveSessions() {
27
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
28
+ var _a;
29
+ const now = Date.now();
30
+ // Prefilter: only rows idle at least as long as the shortest selectable option.
31
+ const minIdleMs = module_auth_contracts_1.AXP_AUTH_INACTIVE_SESSION_TERMINATION_DURATION_MS[module_auth_contracts_1.AXPAuthInactiveSessionTerminationOptions.OneWeek];
32
+ const earliestIdleCutoff = new Date(now - minIdleMs);
33
+ let scanned = 0;
34
+ let revoked = 0;
35
+ let skip = 0;
36
+ for (let pass = 0; pass < 200; pass += 1) {
37
+ const page = yield this.storage.queryAsEngine(DEVICE_SESSION_ENTITY, {
38
+ skip,
39
+ take: PAGE_SIZE,
40
+ filter: {
41
+ logic: 'and',
42
+ filters: [
43
+ { field: 'status', operator: { type: 'equal' }, value: 'active' },
44
+ {
45
+ field: 'lastLoginDate',
46
+ operator: { type: 'lessThan' },
47
+ value: earliestIdleCutoff,
48
+ },
49
+ ],
50
+ },
51
+ });
52
+ const items = ((_a = page.items) !== null && _a !== void 0 ? _a : []);
53
+ if (items.length === 0) {
54
+ break;
55
+ }
56
+ scanned += items.length;
57
+ let passRevoked = 0;
58
+ for (const row of items) {
59
+ const id = typeof row.id === 'string' ? row.id.trim() : '';
60
+ const userId = typeof row.userId === 'string' ? row.userId.trim() : '';
61
+ if (!id || !userId) {
62
+ continue;
63
+ }
64
+ const lastActivityMs = toEpochMs(row.lastLoginDate);
65
+ if (lastActivityMs == null) {
66
+ continue;
67
+ }
68
+ const tenantId = typeof row.tenantId === 'string' ? row.tenantId.trim() : '';
69
+ const durationMs = yield this.settings.resolveDurationMs(userId, tenantId || undefined);
70
+ if (now - lastActivityMs < durationMs) {
71
+ continue;
72
+ }
73
+ try {
74
+ yield this.storage.updateOneAsEngine(DEVICE_SESSION_ENTITY, id, {
75
+ status: 'revoked',
76
+ loggedOutAt: new Date(),
77
+ isActiveSession: false,
78
+ });
79
+ revoked += 1;
80
+ passRevoked += 1;
81
+ }
82
+ catch (error) {
83
+ this.logger.warn(`Failed to revoke inactive device session ${id}: ${String(error)}`);
84
+ }
85
+ }
86
+ // Deleting while paging: advance past rows that stayed active.
87
+ skip += items.length - passRevoked;
88
+ if (items.length < PAGE_SIZE) {
89
+ break;
90
+ }
91
+ }
92
+ if (revoked > 0) {
93
+ this.logger.log(`Inactive session purge revoked ${revoked} of ${scanned} active session(s)`);
94
+ }
95
+ else {
96
+ this.logger.debug(`Inactive session purge finished with no revocations (scanned ${scanned})`);
97
+ }
98
+ return { scanned, revoked };
99
+ });
100
+ }
101
+ };
102
+ exports.AuthInactiveSessionTerminationService = AuthInactiveSessionTerminationService;
103
+ exports.AuthInactiveSessionTerminationService = AuthInactiveSessionTerminationService = AuthInactiveSessionTerminationService_1 = tslib_1.__decorate([
104
+ (0, common_1.Injectable)(),
105
+ tslib_1.__metadata("design:paramtypes", [core_1.EntityStorageMiddlewareService,
106
+ auth_inactive_session_termination_settings_service_1.AuthInactiveSessionTerminationSettingsService])
107
+ ], AuthInactiveSessionTerminationService);
108
+ function toEpochMs(value) {
109
+ if (value instanceof Date) {
110
+ const ms = value.getTime();
111
+ return Number.isNaN(ms) ? null : ms;
112
+ }
113
+ if (typeof value === 'string' || typeof value === 'number') {
114
+ const ms = new Date(value).getTime();
115
+ return Number.isNaN(ms) ? null : ms;
116
+ }
117
+ return null;
118
+ }
119
+ //#endregion
120
+ //# sourceMappingURL=auth-inactive-session-termination.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-inactive-session-termination.service.js","sourceRoot":"","sources":["../../../../../../../libs/modules/auth/server/src/lib/inactive-session/auth-inactive-session-termination.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { EntityStorageMiddlewareService } from '@acorex-platform/framework-server/core';
2
+ import { type AXPServerQueryHandler } from '@acorex-platform/framework-server/domain/abstract';
3
+ import type { AXPQueryFetchResultPromise } from '@acorex-platform/framework-shared/runtime';
4
+ export interface AuthConnectedCaptchaProviderDto {
5
+ id: string;
6
+ title: string;
7
+ }
8
+ export declare class AuthListConnectedCaptchaProvidersQuery implements AXPServerQueryHandler<void, AuthConnectedCaptchaProviderDto> {
9
+ private readonly storage;
10
+ constructor(storage: EntityStorageMiddlewareService);
11
+ execute(): AXPQueryFetchResultPromise<AuthConnectedCaptchaProviderDto>;
12
+ }
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ //#region ----- Imports -----
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AuthListConnectedCaptchaProvidersQuery = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const common_1 = require("@nestjs/common");
7
+ const core_1 = require("@acorex-platform/framework-server/core");
8
+ const abstract_1 = require("@acorex-platform/framework-server/domain/abstract");
9
+ const abstract_2 = require("@acorex-platform/framework-server/jql/abstract");
10
+ const security_1 = require("@acorex-platform/framework-server/security");
11
+ const core_2 = require("@acorex-platform/framework-shared/core");
12
+ const module_auth_contracts_1 = require("@acorex-platform/module-auth-client/contracts");
13
+ const module_integration_management_contracts_1 = require("@acorex-platform/module-integration-management-client/contracts");
14
+ //#endregion
15
+ //#region ----- List connected captcha providers -----
16
+ const INTEGRATION_CONNECTION = module_integration_management_contracts_1.RootConfig.entities.integrationConnection.source;
17
+ let AuthListConnectedCaptchaProvidersQuery = class AuthListConnectedCaptchaProvidersQuery {
18
+ constructor(storage) {
19
+ this.storage = storage;
20
+ }
21
+ execute() {
22
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
23
+ var _a, _b, _c, _d;
24
+ const registrations = (0, security_1.listAuthCaptchaProviders)();
25
+ if (registrations.length === 0) {
26
+ return (0, core_2.runtimeQuerySuccessCollection)({ items: [], total: 0 });
27
+ }
28
+ const platformTenantId = (_a = (0, abstract_2.getPrimaryPlatformTenantId)()) === null || _a === void 0 ? void 0 : _a.trim();
29
+ if (!platformTenantId) {
30
+ return (0, core_2.runtimeQuerySuccessCollection)({ items: [], total: 0 });
31
+ }
32
+ const providerIds = registrations.map((r) => r.providerId);
33
+ const titleById = new Map(registrations.map((r) => [r.providerId, r.titleKey]));
34
+ try {
35
+ const result = yield this.storage.queryAsEngine(INTEGRATION_CONNECTION, {
36
+ skip: 0,
37
+ take: 100,
38
+ filter: {
39
+ logic: 'and',
40
+ filters: [
41
+ {
42
+ field: 'providerId',
43
+ operator: { type: 'in' },
44
+ value: providerIds,
45
+ },
46
+ {
47
+ field: 'connectionScope',
48
+ operator: { type: 'equal' },
49
+ value: core_2.AXP_INTEGRATION_CONNECTION_SCOPE.Tenant,
50
+ },
51
+ {
52
+ field: 'scopeInfo.tenantId',
53
+ operator: { type: 'equal' },
54
+ value: platformTenantId,
55
+ },
56
+ {
57
+ field: 'status',
58
+ operator: { type: 'equal' },
59
+ value: core_2.AXP_INTEGRATION_CONNECTION_STATUS.Connected,
60
+ },
61
+ { field: 'isRevoked', operator: { type: 'equal' }, value: false },
62
+ { field: 'isDisabled', operator: { type: 'equal' }, value: false },
63
+ ],
64
+ },
65
+ });
66
+ const items = [];
67
+ const seen = new Set();
68
+ for (const row of ((_b = result.items) !== null && _b !== void 0 ? _b : [])) {
69
+ const id = String((_c = row.providerId) !== null && _c !== void 0 ? _c : '').trim();
70
+ if (!id || seen.has(id) || !titleById.has(id)) {
71
+ continue;
72
+ }
73
+ seen.add(id);
74
+ const displayName = String((_d = row.displayName) !== null && _d !== void 0 ? _d : '').trim();
75
+ items.push({
76
+ id,
77
+ title: displayName || titleById.get(id) || id,
78
+ });
79
+ }
80
+ items.sort((a, b) => a.title.localeCompare(b.title));
81
+ return (0, core_2.runtimeQuerySuccessCollection)({ items, total: items.length });
82
+ }
83
+ catch (_e) {
84
+ return (0, core_2.runtimeQuerySuccessCollection)({ items: [], total: 0 });
85
+ }
86
+ });
87
+ }
88
+ };
89
+ exports.AuthListConnectedCaptchaProvidersQuery = AuthListConnectedCaptchaProvidersQuery;
90
+ exports.AuthListConnectedCaptchaProvidersQuery = AuthListConnectedCaptchaProvidersQuery = tslib_1.__decorate([
91
+ (0, abstract_1.ServerQueryHandler)({ key: module_auth_contracts_1.AXMAuthQueryKeys.Captcha.ListConnectedProviders, auth: 'session' }),
92
+ (0, common_1.Injectable)(),
93
+ tslib_1.__metadata("design:paramtypes", [core_1.EntityStorageMiddlewareService])
94
+ ], AuthListConnectedCaptchaProvidersQuery);
95
+ //#endregion
96
+ //# sourceMappingURL=list-connected-captcha-providers.query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-connected-captcha-providers.query.js","sourceRoot":"","sources":["../../../../../../../libs/modules/auth/server/src/lib/queries/list-connected-captcha-providers.query.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- /** Auth module datasource registry names. */
2
- export declare const AXMAuthDataSourceKeys: {
3
- readonly UserActivity: "auth-user-activity";
4
- };
@@ -1,10 +0,0 @@
1
- "use strict";
2
- //#region ---- Datasource keys ----
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.AXMAuthDataSourceKeys = void 0;
5
- /** Auth module datasource registry names. */
6
- exports.AXMAuthDataSourceKeys = {
7
- UserActivity: 'auth-user-activity',
8
- };
9
- //#endregion
10
- //# sourceMappingURL=datasource.keys.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"datasource.keys.js","sourceRoot":"","sources":["../../../../../libs/modules/auth/server/contracts/src/datasource.keys.ts"],"names":[],"mappings":";AAAA,mCAAmC;;;AAEnC,6CAA6C;AAChC,QAAA,qBAAqB,GAAG;IACnC,YAAY,EAAE,oBAAoB;CAC1B,CAAC;AAEX,YAAY"}
package/src/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/modules/auth/server/src/index.ts"],"names":[],"mappings":";;;AAAA,mEAAyC"}
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AuthServerModule = void 0;
4
- const tslib_1 = require("tslib");
5
- const common_1 = require("@nestjs/common");
6
- let AuthServerModule = class AuthServerModule {
7
- };
8
- exports.AuthServerModule = AuthServerModule;
9
- exports.AuthServerModule = AuthServerModule = tslib_1.__decorate([
10
- (0, common_1.Module)({
11
- imports: [],
12
- exports: [],
13
- })
14
- ], AuthServerModule);
15
- //# sourceMappingURL=auth-server.module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-server.module.js","sourceRoot":"","sources":["../../../../../libs/modules/auth/server/src/lib/auth-server.module.ts"],"names":[],"mappings":";;;;AAAA,2CAAwC;AAOjC,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAAI,CAAA;AAApB,4CAAgB;2BAAhB,gBAAgB;IAJ5B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;KACZ,CAAC;GACW,gBAAgB,CAAI"}
File without changes
File without changes
File without changes