@qelos/integrator-nest 4.0.1 → 4.1.1

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.
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Rewrite the `Domain=` attribute of a single `Set-Cookie` header value.
3
+ *
4
+ * - If the cookie contains a `Domain=<value>` attribute (case-insensitive), its
5
+ * value is replaced with `newDomain`, with any trailing `:port` suffix
6
+ * stripped first (cookie `Domain` attributes do not include a port).
7
+ * - If `newDomain` is `undefined` (or empty), the entire `; Domain=<value>`
8
+ * segment is removed so the browser scopes the cookie to the current host.
9
+ * - If no `Domain=` attribute is present, the input is returned unchanged.
10
+ *
11
+ * All other attributes, their casing/order and the original cookie name/value
12
+ * bytes are preserved.
13
+ */
14
+ export declare function rewriteSetCookieDomain(setCookie: string, newDomain: string | undefined): string;
15
+ /**
16
+ * Apply {@link rewriteSetCookieDomain} to each entry of a `Set-Cookie` array
17
+ * (e.g. the result of `Headers.getSetCookie()`).
18
+ */
19
+ export declare function rewriteSetCookieDomains(values: string[], newDomain: string | undefined): string[];
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rewriteSetCookieDomain = rewriteSetCookieDomain;
4
+ exports.rewriteSetCookieDomains = rewriteSetCookieDomains;
5
+ /**
6
+ * Rewrite the `Domain=` attribute of a single `Set-Cookie` header value.
7
+ *
8
+ * - If the cookie contains a `Domain=<value>` attribute (case-insensitive), its
9
+ * value is replaced with `newDomain`, with any trailing `:port` suffix
10
+ * stripped first (cookie `Domain` attributes do not include a port).
11
+ * - If `newDomain` is `undefined` (or empty), the entire `; Domain=<value>`
12
+ * segment is removed so the browser scopes the cookie to the current host.
13
+ * - If no `Domain=` attribute is present, the input is returned unchanged.
14
+ *
15
+ * All other attributes, their casing/order and the original cookie name/value
16
+ * bytes are preserved.
17
+ */
18
+ function rewriteSetCookieDomain(setCookie, newDomain) {
19
+ const domainSegment = /;\s*Domain\s*=\s*[^;]+/i;
20
+ if (!domainSegment.test(setCookie))
21
+ return setCookie;
22
+ const stripped = newDomain ? stripPort(newDomain) : '';
23
+ if (!stripped) {
24
+ return setCookie.replace(domainSegment, '');
25
+ }
26
+ return setCookie.replace(/(;\s*Domain\s*=\s*)[^;]+/i, `$1${stripped}`);
27
+ }
28
+ /**
29
+ * Apply {@link rewriteSetCookieDomain} to each entry of a `Set-Cookie` array
30
+ * (e.g. the result of `Headers.getSetCookie()`).
31
+ */
32
+ function rewriteSetCookieDomains(values, newDomain) {
33
+ return values.map((value) => rewriteSetCookieDomain(value, newDomain));
34
+ }
35
+ function stripPort(host) {
36
+ if (host.startsWith('[')) {
37
+ const end = host.indexOf(']');
38
+ return end === -1 ? host : host.slice(1, end);
39
+ }
40
+ const colon = host.indexOf(':');
41
+ return colon === -1 ? host : host.slice(0, colon);
42
+ }
43
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../src/cookies.ts"],"names":[],"mappings":";;AAaA,wDAeC;AAMD,0DAKC;AAvCD;;;;;;;;;;;;GAYG;AACH,SAAgB,sBAAsB,CACpC,SAAiB,EACjB,SAA6B;IAE7B,MAAM,aAAa,GAAG,yBAAyB,CAAC;IAChD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAErD,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,SAAS,CAAC,OAAO,CACtB,2BAA2B,EAC3B,KAAK,QAAQ,EAAE,CAChB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CACrC,MAAgB,EAChB,SAA6B;IAE7B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,sBAAsB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ // Run with: `pnpm -F @qelos/integrator-nest test` (includes src/**/*.test.ts)
7
+ const node_test_1 = require("node:test");
8
+ const strict_1 = __importDefault(require("node:assert/strict"));
9
+ const cookies_1 = require("./cookies");
10
+ (0, node_test_1.describe)('rewriteSetCookieDomain', () => {
11
+ (0, node_test_1.it)('replaces a leading-dot Domain value', () => {
12
+ const input = 'sid=abc; Path=/; Domain=.qelos.app; HttpOnly; Secure';
13
+ strict_1.default.equal((0, cookies_1.rewriteSetCookieDomain)(input, 'example.com'), 'sid=abc; Path=/; Domain=example.com; HttpOnly; Secure');
14
+ });
15
+ (0, node_test_1.it)('replaces a wildcard Domain value', () => {
16
+ const input = 'sid=abc; Path=/; Domain=*.qelos.app; HttpOnly';
17
+ strict_1.default.equal((0, cookies_1.rewriteSetCookieDomain)(input, 'example.com'), 'sid=abc; Path=/; Domain=example.com; HttpOnly');
18
+ });
19
+ (0, node_test_1.it)('returns the cookie unchanged when no Domain attribute is present', () => {
20
+ const input = 'sid=abc; Path=/; HttpOnly; Secure; SameSite=Lax';
21
+ strict_1.default.equal((0, cookies_1.rewriteSetCookieDomain)(input, 'example.com'), input);
22
+ });
23
+ (0, node_test_1.it)('strips the port from a host:port newDomain before substitution', () => {
24
+ const input = 'sid=abc; Domain=.qelos.app; Path=/';
25
+ strict_1.default.equal((0, cookies_1.rewriteSetCookieDomain)(input, 'localhost:3000'), 'sid=abc; Domain=localhost; Path=/');
26
+ });
27
+ (0, node_test_1.it)('preserves attribute order and other attributes across replacement', () => {
28
+ const input = 'sid=abc; Path=/; Domain=.qelos.app; HttpOnly; Secure; SameSite=Lax; Max-Age=3600';
29
+ strict_1.default.equal((0, cookies_1.rewriteSetCookieDomain)(input, 'example.com'), 'sid=abc; Path=/; Domain=example.com; HttpOnly; Secure; SameSite=Lax; Max-Age=3600');
30
+ });
31
+ (0, node_test_1.it)('preserves an Expires attribute (which contains commas) across replacement', () => {
32
+ const input = 'sid=abc; Domain=.qelos.app; Expires=Wed, 21 Oct 2026 07:28:00 GMT; Path=/';
33
+ strict_1.default.equal((0, cookies_1.rewriteSetCookieDomain)(input, 'example.com'), 'sid=abc; Domain=example.com; Expires=Wed, 21 Oct 2026 07:28:00 GMT; Path=/');
34
+ });
35
+ (0, node_test_1.it)('matches the Domain attribute name case-insensitively and preserves its casing', () => {
36
+ const input = 'sid=abc; domain=.qelos.app; Path=/';
37
+ strict_1.default.equal((0, cookies_1.rewriteSetCookieDomain)(input, 'example.com'), 'sid=abc; domain=example.com; Path=/');
38
+ });
39
+ (0, node_test_1.it)('strips the entire Domain segment when newDomain is undefined', () => {
40
+ const input = 'sid=abc; Path=/; Domain=.qelos.app; HttpOnly; Secure; SameSite=Lax';
41
+ strict_1.default.equal((0, cookies_1.rewriteSetCookieDomain)(input, undefined), 'sid=abc; Path=/; HttpOnly; Secure; SameSite=Lax');
42
+ });
43
+ (0, node_test_1.it)('strips the entire Domain segment when newDomain is an empty string', () => {
44
+ const input = 'sid=abc; Domain=.qelos.app; Path=/';
45
+ strict_1.default.equal((0, cookies_1.rewriteSetCookieDomain)(input, ''), 'sid=abc; Path=/');
46
+ });
47
+ (0, node_test_1.it)('removes the Domain segment when it is the last attribute', () => {
48
+ const input = 'sid=abc; Path=/; Domain=.qelos.app';
49
+ strict_1.default.equal((0, cookies_1.rewriteSetCookieDomain)(input, undefined), 'sid=abc; Path=/');
50
+ });
51
+ });
52
+ (0, node_test_1.describe)('rewriteSetCookieDomains', () => {
53
+ (0, node_test_1.it)('applies the rewrite to each entry of an array', () => {
54
+ const values = [
55
+ 'a=1; Domain=.qelos.app; Path=/',
56
+ 'b=2; Path=/; HttpOnly',
57
+ 'c=3; Domain=*.qelos.app; Secure',
58
+ ];
59
+ strict_1.default.deepEqual((0, cookies_1.rewriteSetCookieDomains)(values, 'example.com'), [
60
+ 'a=1; Domain=example.com; Path=/',
61
+ 'b=2; Path=/; HttpOnly',
62
+ 'c=3; Domain=example.com; Secure',
63
+ ]);
64
+ });
65
+ (0, node_test_1.it)('strips the Domain segment from each entry when newDomain is undefined', () => {
66
+ const values = [
67
+ 'a=1; Domain=.qelos.app; Path=/',
68
+ 'b=2; Domain=*.qelos.app; HttpOnly',
69
+ ];
70
+ strict_1.default.deepEqual((0, cookies_1.rewriteSetCookieDomains)(values, undefined), [
71
+ 'a=1; Path=/',
72
+ 'b=2; HttpOnly',
73
+ ]);
74
+ });
75
+ });
76
+ //# sourceMappingURL=cookies.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.test.js","sourceRoot":"","sources":["../src/cookies.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,8 +2,11 @@ export { QELOS_MODULE_OPTIONS, QELOS_SDK } from './constants';
2
2
  export { QelosModule } from './module';
3
3
  export type { QelosModuleAsyncOptions, QelosOptionsFactory, } from './module';
4
4
  export { QelosMiddleware } from './middleware';
5
+ export { QelosProxyMiddleware } from './proxy.middleware';
5
6
  export { QelosAuthGuard, QelosGuard } from './guard';
6
7
  export { QelosCtx, QelosSdk, QelosUser, QelosWorkspace } from './decorators';
7
8
  export { createRequestSdk } from './sdk-factory';
8
9
  export type { CreateSdkParams } from './sdk-factory';
9
- export type { AnyRequest, AnyResponse, QelosModuleOptions, QelosNestConfig, QelosRequestContext, QelosTokenPair, ResolvedTokens, TokenRefreshContext, TokenRefreshHook, WorkspaceResolver, } from './types';
10
+ export { rewriteSetCookieDomain, rewriteSetCookieDomains } from './cookies';
11
+ export { resolveQelosProxyTarget } from './proxy-target';
12
+ export type { AnyRequest, AnyResponse, QelosModuleOptions, QelosNestConfig, QelosRequestContext, WorkspaceResolver, } from './types';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createRequestSdk = exports.QelosWorkspace = exports.QelosUser = exports.QelosSdk = exports.QelosCtx = exports.QelosGuard = exports.QelosAuthGuard = exports.QelosMiddleware = exports.QelosModule = exports.QELOS_SDK = exports.QELOS_MODULE_OPTIONS = void 0;
3
+ exports.resolveQelosProxyTarget = exports.rewriteSetCookieDomains = exports.rewriteSetCookieDomain = exports.createRequestSdk = exports.QelosWorkspace = exports.QelosUser = exports.QelosSdk = exports.QelosCtx = exports.QelosGuard = exports.QelosAuthGuard = exports.QelosProxyMiddleware = exports.QelosMiddleware = exports.QelosModule = exports.QELOS_SDK = exports.QELOS_MODULE_OPTIONS = void 0;
4
4
  var constants_1 = require("./constants");
5
5
  Object.defineProperty(exports, "QELOS_MODULE_OPTIONS", { enumerable: true, get: function () { return constants_1.QELOS_MODULE_OPTIONS; } });
6
6
  Object.defineProperty(exports, "QELOS_SDK", { enumerable: true, get: function () { return constants_1.QELOS_SDK; } });
@@ -8,6 +8,8 @@ var module_1 = require("./module");
8
8
  Object.defineProperty(exports, "QelosModule", { enumerable: true, get: function () { return module_1.QelosModule; } });
9
9
  var middleware_1 = require("./middleware");
10
10
  Object.defineProperty(exports, "QelosMiddleware", { enumerable: true, get: function () { return middleware_1.QelosMiddleware; } });
11
+ var proxy_middleware_1 = require("./proxy.middleware");
12
+ Object.defineProperty(exports, "QelosProxyMiddleware", { enumerable: true, get: function () { return proxy_middleware_1.QelosProxyMiddleware; } });
11
13
  var guard_1 = require("./guard");
12
14
  Object.defineProperty(exports, "QelosAuthGuard", { enumerable: true, get: function () { return guard_1.QelosAuthGuard; } });
13
15
  Object.defineProperty(exports, "QelosGuard", { enumerable: true, get: function () { return guard_1.QelosGuard; } });
@@ -18,4 +20,9 @@ Object.defineProperty(exports, "QelosUser", { enumerable: true, get: function ()
18
20
  Object.defineProperty(exports, "QelosWorkspace", { enumerable: true, get: function () { return decorators_1.QelosWorkspace; } });
19
21
  var sdk_factory_1 = require("./sdk-factory");
20
22
  Object.defineProperty(exports, "createRequestSdk", { enumerable: true, get: function () { return sdk_factory_1.createRequestSdk; } });
23
+ var cookies_1 = require("./cookies");
24
+ Object.defineProperty(exports, "rewriteSetCookieDomain", { enumerable: true, get: function () { return cookies_1.rewriteSetCookieDomain; } });
25
+ Object.defineProperty(exports, "rewriteSetCookieDomains", { enumerable: true, get: function () { return cookies_1.rewriteSetCookieDomains; } });
26
+ var proxy_target_1 = require("./proxy-target");
27
+ Object.defineProperty(exports, "resolveQelosProxyTarget", { enumerable: true, get: function () { return proxy_target_1.resolveQelosProxyTarget; } });
21
28
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA8D;AAArD,iHAAA,oBAAoB,OAAA;AAAE,sGAAA,SAAS,OAAA;AACxC,mCAAuC;AAA9B,qGAAA,WAAW,OAAA;AAKpB,2CAA+C;AAAtC,6GAAA,eAAe,OAAA;AACxB,iCAAqD;AAA5C,uGAAA,cAAc,OAAA;AAAE,mGAAA,UAAU,OAAA;AACnC,2CAA6E;AAApE,sGAAA,QAAQ,OAAA;AAAE,sGAAA,QAAQ,OAAA;AAAE,uGAAA,SAAS,OAAA;AAAE,4GAAA,cAAc,OAAA;AACtD,6CAAiD;AAAxC,+GAAA,gBAAgB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA8D;AAArD,iHAAA,oBAAoB,OAAA;AAAE,sGAAA,SAAS,OAAA;AACxC,mCAAuC;AAA9B,qGAAA,WAAW,OAAA;AAKpB,2CAA+C;AAAtC,6GAAA,eAAe,OAAA;AACxB,uDAA0D;AAAjD,wHAAA,oBAAoB,OAAA;AAC7B,iCAAqD;AAA5C,uGAAA,cAAc,OAAA;AAAE,mGAAA,UAAU,OAAA;AACnC,2CAA6E;AAApE,sGAAA,QAAQ,OAAA;AAAE,sGAAA,QAAQ,OAAA;AAAE,uGAAA,SAAS,OAAA;AAAE,4GAAA,cAAc,OAAA;AACtD,6CAAiD;AAAxC,+GAAA,gBAAgB,OAAA;AAEzB,qCAA4E;AAAnE,iHAAA,sBAAsB,OAAA;AAAE,kHAAA,uBAAuB,OAAA;AACxD,+CAAyD;AAAhD,uHAAA,uBAAuB,OAAA"}
@@ -15,8 +15,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.QelosMiddleware = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const constants_1 = require("./constants");
18
- const sdk_factory_1 = require("./sdk-factory");
18
+ const cookies_1 = require("./cookies");
19
+ const proxy_target_1 = require("./proxy-target");
19
20
  const request_utils_1 = require("./request-utils");
21
+ const sdk_factory_1 = require("./sdk-factory");
22
+ function buildMeUrl(base) {
23
+ return `${base.replace(/\/+$/, '')}/api/me`;
24
+ }
20
25
  let QelosMiddleware = class QelosMiddleware {
21
26
  constructor(options) {
22
27
  this.options = options;
@@ -25,32 +30,21 @@ let QelosMiddleware = class QelosMiddleware {
25
30
  const request = req;
26
31
  const response = res;
27
32
  const { config, resolveWorkspace } = this.options;
28
- const onTokenRefresh = this.options.onTokenRefresh ||
29
- (async ({ response: r, newTokens }) => {
30
- (0, request_utils_1.writeTokensToCookies)(r, config, newTokens);
31
- });
33
+ const sdkFetch = (config.sdkOptions?.fetch ?? globalThis.fetch);
32
34
  if ((0, request_utils_1.shouldSkip)(request, config)) {
33
35
  next();
34
36
  return;
35
37
  }
36
- const tokens = (0, request_utils_1.readTokens)(request, config);
37
- const sdk = (0, sdk_factory_1.createRequestSdk)({
38
- config,
39
- tokens,
40
- request,
41
- response,
42
- onTokenRefresh,
43
- });
38
+ const sdk = (0, sdk_factory_1.createRequestSdk)({ config, request });
44
39
  const ctx = {
45
40
  user: null,
46
41
  workspace: null,
47
42
  workspaces: [],
48
43
  sdk,
49
- tokens,
50
44
  };
51
45
  request.qelos = ctx;
52
- const hasAuthMaterial = Boolean(config.apiToken || tokens.accessToken || tokens.refreshToken);
53
- if (!hasAuthMaterial) {
46
+ const base = (0, proxy_target_1.resolveQelosProxyTarget)(config);
47
+ if (!base && !config.apiToken) {
54
48
  if (config.requireAuth) {
55
49
  next(new common_1.UnauthorizedException());
56
50
  return;
@@ -58,10 +52,56 @@ let QelosMiddleware = class QelosMiddleware {
58
52
  next();
59
53
  return;
60
54
  }
61
- try {
62
- ctx.user = await sdk.authentication.getLoggedInUser();
55
+ if (base) {
56
+ const headers = {};
57
+ const cookieHeader = request.headers.cookie;
58
+ const cookie = typeof cookieHeader === 'string'
59
+ ? cookieHeader
60
+ : Array.isArray(cookieHeader)
61
+ ? cookieHeader.join('; ')
62
+ : undefined;
63
+ if (cookie)
64
+ headers.cookie = cookie;
65
+ const rawAuth = request.headers.authorization;
66
+ const authHeader = Array.isArray(rawAuth) ? rawAuth[0] : rawAuth;
67
+ if (authHeader)
68
+ headers.authorization = authHeader;
69
+ const hostHeader = request.headers.host;
70
+ const originalHost = typeof hostHeader === 'string'
71
+ ? hostHeader
72
+ : Array.isArray(hostHeader)
73
+ ? hostHeader[0]
74
+ : undefined;
75
+ let upstream;
76
+ try {
77
+ upstream = await sdkFetch(buildMeUrl(base), {
78
+ method: 'GET',
79
+ headers,
80
+ redirect: 'manual',
81
+ });
82
+ }
83
+ catch {
84
+ if (config.requireAuth) {
85
+ next(new common_1.UnauthorizedException());
86
+ return;
87
+ }
88
+ next();
89
+ return;
90
+ }
91
+ const setCookieValues = upstream.headers.getSetCookie?.() ?? [];
92
+ for (const value of setCookieValues) {
93
+ (0, request_utils_1.appendSetCookie)(response, (0, cookies_1.rewriteSetCookieDomain)(value, originalHost));
94
+ }
95
+ if (upstream.ok) {
96
+ try {
97
+ ctx.user = (await upstream.json());
98
+ }
99
+ catch {
100
+ ctx.user = null;
101
+ }
102
+ }
63
103
  }
64
- catch {
104
+ if (!ctx.user) {
65
105
  if (config.requireAuth) {
66
106
  next(new common_1.UnauthorizedException());
67
107
  return;
@@ -75,18 +115,18 @@ let QelosMiddleware = class QelosMiddleware {
75
115
  catch {
76
116
  ctx.workspaces = [];
77
117
  }
78
- if (ctx.user && ctx.workspaces.length) {
79
- if (resolveWorkspace) {
80
- ctx.workspace =
81
- (await resolveWorkspace({
82
- request,
83
- user: ctx.user,
84
- workspaces: ctx.workspaces,
85
- })) || null;
86
- }
87
- else {
88
- ctx.workspace = ctx.workspaces[0] || null;
89
- }
118
+ if (resolveWorkspace) {
119
+ ctx.workspace =
120
+ (await resolveWorkspace({
121
+ request,
122
+ user: ctx.user,
123
+ workspaces: ctx.workspaces,
124
+ })) || null;
125
+ }
126
+ else {
127
+ ctx.workspace =
128
+ ctx.user.workspace ||
129
+ null;
90
130
  }
91
131
  next();
92
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,8 @@ import type { QelosModuleOptions, QelosNestConfig } from './types';
3
3
  * `forRoot` / `forRootAsync` accept either a full {@link QelosModuleOptions}
4
4
  * object or a shorthand {@link QelosNestConfig} (same shape as Express
5
5
  * `createQelosMiddleware({ config })`).
6
+ *
7
+ * When `disableProxy` is not `true`, `/api/` is prepended to `skipPaths` so
8
+ * the user resolver does not shadow the `/api/**` proxy.
6
9
  */
7
10
  export declare function normalizeModuleOptions(input: QelosNestConfig | QelosModuleOptions): QelosModuleOptions;
@@ -1,12 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.normalizeModuleOptions = normalizeModuleOptions;
4
+ function applyProxySkipPaths(config) {
5
+ if (config.disableProxy === true)
6
+ return config;
7
+ const existingSkipPaths = config.skipPaths ?? [];
8
+ const alreadyCovered = existingSkipPaths.some((prefix) => '/api/'.startsWith(prefix));
9
+ if (alreadyCovered)
10
+ return config;
11
+ return { ...config, skipPaths: ['/api/', ...existingSkipPaths] };
12
+ }
4
13
  /**
5
14
  * `forRoot` / `forRootAsync` accept either a full {@link QelosModuleOptions}
6
15
  * object or a shorthand {@link QelosNestConfig} (same shape as Express
7
16
  * `createQelosMiddleware({ config })`).
17
+ *
18
+ * When `disableProxy` is not `true`, `/api/` is prepended to `skipPaths` so
19
+ * the user resolver does not shadow the `/api/**` proxy.
8
20
  */
9
21
  function normalizeModuleOptions(input) {
22
+ let wrapped;
10
23
  if (input !== null &&
11
24
  typeof input === 'object' &&
12
25
  'config' in input &&
@@ -14,8 +27,14 @@ function normalizeModuleOptions(input) {
14
27
  typeof input.config === 'object' &&
15
28
  input.config !== null &&
16
29
  'appUrl' in input.config) {
17
- return input;
30
+ wrapped = input;
31
+ }
32
+ else {
33
+ wrapped = { config: input };
18
34
  }
19
- return { config: input };
35
+ const mergedConfig = applyProxySkipPaths(wrapped.config);
36
+ if (mergedConfig === wrapped.config)
37
+ return wrapped;
38
+ return { ...wrapped, config: mergedConfig };
20
39
  }
21
40
  //# sourceMappingURL=module-options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"module-options.js","sourceRoot":"","sources":["../src/module-options.ts"],"names":[],"mappings":";;AAOA,wDAeC;AApBD;;;;GAIG;AACH,SAAgB,sBAAsB,CACpC,KAA2C;IAE3C,IACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,QAAQ,IAAI,KAAK;QAChB,KAA4B,CAAC,MAAM,KAAK,SAAS;QAClD,OAAQ,KAA4B,CAAC,MAAM,KAAK,QAAQ;QACvD,KAA4B,CAAC,MAAM,KAAK,IAAI;QAC7C,QAAQ,IAAK,KAA4B,CAAC,MAAM,EAChD,CAAC;QACD,OAAO,KAA2B,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAwB,EAAE,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"module-options.js","sourceRoot":"","sources":["../src/module-options.ts"],"names":[],"mappings":";;AAoBA,wDAoBC;AAtCD,SAAS,mBAAmB,CAAC,MAAuB;IAClD,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAChD,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACjD,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACvD,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAC3B,CAAC;IACF,IAAI,cAAc;QAAE,OAAO,MAAM,CAAC;IAClC,OAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,EAAE,CAAC;AACnE,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,sBAAsB,CACpC,KAA2C;IAE3C,IAAI,OAA2B,CAAC;IAChC,IACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,QAAQ,IAAI,KAAK;QAChB,KAA4B,CAAC,MAAM,KAAK,SAAS;QAClD,OAAQ,KAA4B,CAAC,MAAM,KAAK,QAAQ;QACvD,KAA4B,CAAC,MAAM,KAAK,IAAI;QAC7C,QAAQ,IAAK,KAA4B,CAAC,MAAM,EAChD,CAAC;QACD,OAAO,GAAG,KAA2B,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,EAAE,MAAM,EAAE,KAAwB,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,YAAY,KAAK,OAAO,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IACpD,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC9C,CAAC"}
package/dist/module.d.ts CHANGED
@@ -10,6 +10,8 @@ export interface QelosOptionsFactory {
10
10
  createQelosOptions(): Promise<QelosNestConfig | QelosModuleOptions> | QelosNestConfig | QelosModuleOptions;
11
11
  }
12
12
  export declare class QelosModule implements NestModule {
13
+ private readonly moduleOptions;
14
+ constructor(moduleOptions: QelosModuleOptions);
13
15
  private static readonly sdkProvider;
14
16
  /**
15
17
  * Register the module with statically-known options.
@@ -17,9 +19,10 @@ export declare class QelosModule implements NestModule {
17
19
  * Pass either a full {@link QelosModuleOptions} object or a shorthand
18
20
  * {@link QelosNestConfig} (e.g. `{ appUrl, apiToken }`).
19
21
  *
20
- * The middleware is wired to `forRoutes('*')` by default. Override by
21
- * importing the module without `forRoot` and applying `QelosMiddleware`
22
- * directly inside your own `MiddlewareConsumer`.
22
+ * By default, {@link QelosMiddleware} runs on `forRoutes('*')` and
23
+ * {@link QelosProxyMiddleware} on `api/*splat` unless `disableProxy: true`.
24
+ * Override by importing the module without `forRoot` and applying the
25
+ * middlewares yourself in `MiddlewareConsumer`.
23
26
  */
24
27
  static forRoot(config: QelosNestConfig): DynamicModule;
25
28
  static forRoot(options: QelosModuleOptions): DynamicModule;
package/dist/module.js CHANGED
@@ -5,6 +5,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
8
14
  var QelosModule_1;
9
15
  Object.defineProperty(exports, "__esModule", { value: true });
10
16
  exports.QelosModule = void 0;
@@ -13,7 +19,11 @@ const core_1 = require("@nestjs/core");
13
19
  const constants_1 = require("./constants");
14
20
  const module_options_1 = require("./module-options");
15
21
  const middleware_1 = require("./middleware");
22
+ const proxy_middleware_1 = require("./proxy.middleware");
16
23
  let QelosModule = QelosModule_1 = class QelosModule {
24
+ constructor(moduleOptions) {
25
+ this.moduleOptions = moduleOptions;
26
+ }
17
27
  static forRoot(configOrOptions) {
18
28
  const options = (0, module_options_1.normalizeModuleOptions)(configOrOptions);
19
29
  const optionsProvider = {
@@ -22,8 +32,18 @@ let QelosModule = QelosModule_1 = class QelosModule {
22
32
  };
23
33
  return {
24
34
  module: QelosModule_1,
25
- providers: [optionsProvider, middleware_1.QelosMiddleware, QelosModule_1.sdkProvider],
26
- exports: [optionsProvider, middleware_1.QelosMiddleware, constants_1.QELOS_SDK],
35
+ providers: [
36
+ optionsProvider,
37
+ middleware_1.QelosMiddleware,
38
+ proxy_middleware_1.QelosProxyMiddleware,
39
+ QelosModule_1.sdkProvider,
40
+ ],
41
+ exports: [
42
+ optionsProvider,
43
+ middleware_1.QelosMiddleware,
44
+ proxy_middleware_1.QelosProxyMiddleware,
45
+ constants_1.QELOS_SDK,
46
+ ],
27
47
  global: true,
28
48
  };
29
49
  }
@@ -35,13 +55,19 @@ let QelosModule = QelosModule_1 = class QelosModule {
35
55
  const providers = [
36
56
  ...this.createAsyncProviders(options),
37
57
  middleware_1.QelosMiddleware,
58
+ proxy_middleware_1.QelosProxyMiddleware,
38
59
  QelosModule_1.sdkProvider,
39
60
  ];
40
61
  return {
41
62
  module: QelosModule_1,
42
63
  imports: options.imports || [],
43
64
  providers,
44
- exports: [constants_1.QELOS_MODULE_OPTIONS, middleware_1.QelosMiddleware, constants_1.QELOS_SDK],
65
+ exports: [
66
+ constants_1.QELOS_MODULE_OPTIONS,
67
+ middleware_1.QelosMiddleware,
68
+ proxy_middleware_1.QelosProxyMiddleware,
69
+ constants_1.QELOS_SDK,
70
+ ],
45
71
  global: true,
46
72
  };
47
73
  }
@@ -73,6 +99,12 @@ let QelosModule = QelosModule_1 = class QelosModule {
73
99
  }
74
100
  configure(consumer) {
75
101
  consumer.apply(middleware_1.QelosMiddleware).forRoutes('*');
102
+ if (this.moduleOptions.config.disableProxy !== true) {
103
+ consumer.apply(proxy_middleware_1.QelosProxyMiddleware).forRoutes({
104
+ path: 'api/*splat',
105
+ method: common_1.RequestMethod.ALL,
106
+ });
107
+ }
76
108
  }
77
109
  };
78
110
  exports.QelosModule = QelosModule;
@@ -83,6 +115,8 @@ QelosModule.sdkProvider = {
83
115
  inject: [core_1.REQUEST],
84
116
  };
85
117
  exports.QelosModule = QelosModule = QelosModule_1 = __decorate([
86
- (0, common_1.Module)({})
118
+ (0, common_1.Module)({}),
119
+ __param(0, (0, common_1.Inject)(constants_1.QELOS_MODULE_OPTIONS)),
120
+ __metadata("design:paramtypes", [Object])
87
121
  ], QelosModule);
88
122
  //# sourceMappingURL=module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAUwB;AACxB,uCAAuC;AACvC,2CAA8D;AAC9D,qDAA0D;AAC1D,6CAA+C;AAwBxC,IAAM,WAAW,mBAAjB,MAAM,WAAW;IAoBtB,MAAM,CAAC,OAAO,CAAC,eAAqD;QAClE,MAAM,OAAO,GAAG,IAAA,uCAAsB,EAAC,eAAe,CAAC,CAAC;QACxD,MAAM,eAAe,GAAa;YAChC,OAAO,EAAE,gCAAoB;YAC7B,QAAQ,EAAE,OAAO;SAClB,CAAC;QACF,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,SAAS,EAAE,CAAC,eAAe,EAAE,4BAAe,EAAE,aAAW,CAAC,WAAW,CAAC;YACtE,OAAO,EAAE,CAAC,eAAe,EAAE,4BAAe,EAAE,qBAAS,CAAC;YACtD,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,OAAgC;QAClD,MAAM,SAAS,GAAe;YAC5B,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YACrC,4BAAe;YACf,aAAW,CAAC,WAAW;SACxB,CAAC;QACF,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS;YACT,OAAO,EAAE,CAAC,gCAAoB,EAAE,4BAAe,EAAE,qBAAS,CAAC;YAC3D,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,oBAAoB,CACjC,OAAgC;QAEhC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,eAAe,GAAwC;gBAC3D,OAAO,EAAE,gCAAoB;gBAC7B,UAAU,EAAE,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE,CACvC,IAAA,uCAAsB,EAAC,MAAM,OAAO,CAAC,UAAW,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC5D,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;aAC7B,CAAC;YACF,OAAO,CAAC,eAAe,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;QAC7D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,mFAAmF,CACpF,CAAC;QACJ,CAAC;QACD,MAAM,eAAe,GAAwC;YAC3D,OAAO,EAAE,gCAAoB;YAC7B,UAAU,EAAE,KAAK,EAAE,OAA4B,EAAE,EAAE,CACjD,IAAA,uCAAsB,EAAC,MAAM,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC5D,MAAM,EAAE,CAAC,YAAY,CAAC;SACvB,CAAC;QACF,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO;gBACL,eAAe;gBACf,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAc;aAC9D,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,QAA4B;QACpC,QAAQ,CAAC,KAAK,CAAC,4BAAe,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;;AAxFU,kCAAW;AACE,uBAAW,GAAa;IAC9C,OAAO,EAAE,qBAAS;IAClB,KAAK,EAAE,cAAK,CAAC,OAAO;IACpB,UAAU,EAAE,CAAC,OAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;IACvD,MAAM,EAAE,CAAC,cAAO,CAAC;CAClB,AALkC,CAKjC;sBANS,WAAW;IADvB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,WAAW,CAyFvB"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { QelosNestConfig } from './types';
2
+ /**
3
+ * Resolve the origin to which `/api/**` requests are proxied. The managed
4
+ * Qelos app URL (`config.appUrl`) is the proxy target — env vars are only
5
+ * dev-time overrides when the configured `appUrl` is not reachable from
6
+ * the local host.
7
+ *
8
+ * Priority (highest first):
9
+ * 1. `process.env.QELOS_PROXY_TARGET`
10
+ * 2. `process.env.QELOS_IP`
11
+ * 3. `process.env.QELOS_API_IP`
12
+ * 4. `config.appUrl`
13
+ *
14
+ * Empty / whitespace-only values are skipped, and `undefined` is returned when
15
+ * nothing is configured so the caller can surface a clear error.
16
+ */
17
+ export declare function resolveQelosProxyTarget(config: QelosNestConfig): string | undefined;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveQelosProxyTarget = resolveQelosProxyTarget;
4
+ /**
5
+ * Resolve the origin to which `/api/**` requests are proxied. The managed
6
+ * Qelos app URL (`config.appUrl`) is the proxy target — env vars are only
7
+ * dev-time overrides when the configured `appUrl` is not reachable from
8
+ * the local host.
9
+ *
10
+ * Priority (highest first):
11
+ * 1. `process.env.QELOS_PROXY_TARGET`
12
+ * 2. `process.env.QELOS_IP`
13
+ * 3. `process.env.QELOS_API_IP`
14
+ * 4. `config.appUrl`
15
+ *
16
+ * Empty / whitespace-only values are skipped, and `undefined` is returned when
17
+ * nothing is configured so the caller can surface a clear error.
18
+ */
19
+ function resolveQelosProxyTarget(config) {
20
+ const env = process.env;
21
+ const fromEnv = env.QELOS_PROXY_TARGET?.trim() ||
22
+ env.QELOS_IP?.trim() ||
23
+ env.QELOS_API_IP?.trim();
24
+ if (fromEnv)
25
+ return fromEnv;
26
+ const fromAppUrl = config.appUrl?.trim();
27
+ return fromAppUrl || undefined;
28
+ }
29
+ //# sourceMappingURL=proxy-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-target.js","sourceRoot":"","sources":["../src/proxy-target.ts"],"names":[],"mappings":";;AAiBA,0DAYC;AA3BD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,uBAAuB,CACrC,MAAuB;IAEvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,OAAO,GACX,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE;QAC9B,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE;QACpB,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACzC,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};