@qelos/sdk 4.2.0 → 4.2.2
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/.gitignore +4 -0
- package/.npmignore +3 -0
- package/README.md +81 -0
- package/dist/administrator/integrations.d.ts +2 -0
- package/dist/administrator/integrations.js.map +1 -1
- package/dist/administrator/payments.d.ts +7 -1
- package/dist/administrator/payments.js.map +1 -1
- package/dist/authentication.d.ts +5 -0
- package/dist/authentication.js +39 -0
- package/dist/authentication.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-auth.d.ts +76 -0
- package/dist/mcp-auth.js +216 -0
- package/dist/mcp-auth.js.map +1 -0
- package/dist/payments.d.ts +7 -1
- package/dist/payments.js.map +1 -1
- package/package.json +2 -2
- package/src/administrator/integrations.ts +2 -0
- package/src/administrator/payments.ts +7 -1
- package/src/authentication.ts +64 -0
- package/src/index.ts +20 -0
- package/src/mcp-auth.ts +293 -0
- package/src/payments.ts +7 -1
- package/test/mcp-auth.test.ts +255 -0
- package/test/payments.test.ts +65 -0
package/.gitignore
ADDED
package/.npmignore
ADDED
package/README.md
CHANGED
|
@@ -117,4 +117,85 @@ expired cookie-only sessions and the rotated cookie is written back to the
|
|
|
117
117
|
outbound response. Call it directly only when you need to refresh
|
|
118
118
|
proactively — e.g. before handing the session off to another service.
|
|
119
119
|
|
|
120
|
+
#### MCP client OAuth (Cursor, Claude, remote MCP)
|
|
121
|
+
|
|
122
|
+
External MCP clients use Qelos as an OAuth authorization server. The SDK
|
|
123
|
+
helpers build authorize URLs, parse callback query parameters, exchange
|
|
124
|
+
PKCE authorization codes, and wire login/consent pages in custom frontends —
|
|
125
|
+
without reimplementing URL construction or token requests.
|
|
126
|
+
|
|
127
|
+
Tenant admins must enable MCP OAuth and list client callback URLs in
|
|
128
|
+
`mcp-configuration.metadata.permittedCallbackUrls`.
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
import QelosSDK, {
|
|
132
|
+
appendMcpAccessDeniedRedirect,
|
|
133
|
+
buildMcpAuthorizePath,
|
|
134
|
+
buildMcpAuthorizePathFromQuery,
|
|
135
|
+
buildMcpConsentPageUrl,
|
|
136
|
+
buildMcpLoginRedirectUrl,
|
|
137
|
+
decodeMcpOAuthStatePayload,
|
|
138
|
+
parseMcpCallbackParams,
|
|
139
|
+
resolveMcpLoginRedirect,
|
|
140
|
+
} from '@qelos/sdk';
|
|
141
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
142
|
+
|
|
143
|
+
const sdk = new QelosSDK({ appUrl: 'https://your-tenant.qelos.app' });
|
|
144
|
+
|
|
145
|
+
// PKCE (required for authorization-code delivery to MCP clients)
|
|
146
|
+
const codeVerifier = randomBytes(32).toString('base64url');
|
|
147
|
+
const codeChallenge = createHash('sha256')
|
|
148
|
+
.update(codeVerifier)
|
|
149
|
+
.digest('base64url');
|
|
150
|
+
|
|
151
|
+
const redirectUri = 'cursor://anysphere.cursor-mcp/oauth/callback';
|
|
152
|
+
|
|
153
|
+
// 1) Send the user to Qelos authorize (browser or MCP client opens this URL)
|
|
154
|
+
const authorizeUrl = sdk.authentication.getMcpAuthorizeUrl({
|
|
155
|
+
redirectUri,
|
|
156
|
+
state: 'optional-csrf-state',
|
|
157
|
+
codeChallenge,
|
|
158
|
+
codeChallengeMethod: 'S256',
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// Relative path only (e.g. for login redirect resume):
|
|
162
|
+
const authorizePath = buildMcpAuthorizePath({
|
|
163
|
+
redirectUri,
|
|
164
|
+
codeChallenge,
|
|
165
|
+
codeChallengeMethod: 'S256',
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// Custom login page: resume after sign-in (matches Qelos admin behavior)
|
|
169
|
+
const postLoginTarget = resolveMcpLoginRedirect(req.query);
|
|
170
|
+
// e.g. `/api/auth/mcp/authorize?redirect_uri=…` or `/mcp/authorize?mcp_state=…`
|
|
171
|
+
|
|
172
|
+
// Custom consent page: decode signed state for display (signature not verified)
|
|
173
|
+
const consent = decodeMcpOAuthStatePayload(req.query.mcp_state);
|
|
174
|
+
|
|
175
|
+
// 2) On your callback route, parse ?code=…&state=… (or ?error=…)
|
|
176
|
+
const params = parseMcpCallbackParams(req.url); // Express: req.url; Next.js: req.url
|
|
177
|
+
|
|
178
|
+
if (params.error) {
|
|
179
|
+
throw new Error(params.error);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// 3) Exchange the authorization code for OAuth tokens + user profile
|
|
183
|
+
const { accessToken, refreshToken, user } =
|
|
184
|
+
await sdk.authentication.exchangeMcpAuthorizationCode({
|
|
185
|
+
code: params.code!,
|
|
186
|
+
redirectUri,
|
|
187
|
+
codeVerifier,
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Apps using `@qelos/integrator-express` or `@qelos/integrator-next` with a
|
|
192
|
+
custom frontend should host `/login` and `/mcp/authorize` on the same domain
|
|
193
|
+
that proxies `/api/**` to Qelos. See
|
|
194
|
+
[Integrator MCP OAuth guide](https://docs.qelos.io/auth/mcp-oauth-integrators)
|
|
195
|
+
for the full flow.
|
|
196
|
+
|
|
197
|
+
Claude remote MCP uses `https://claude.ai/api/mcp/auth_callback` as
|
|
198
|
+
`redirectUri`; Cursor uses `cursor://anysphere.cursor-mcp/oauth/callback`.
|
|
199
|
+
Both must appear in the tenant permitted callback list.
|
|
200
|
+
|
|
120
201
|
Enjoy!
|
|
@@ -25,11 +25,13 @@ export default class QlIntegrations extends BaseSDK {
|
|
|
25
25
|
trigger?: any;
|
|
26
26
|
target?: any;
|
|
27
27
|
dataManipulation?: any;
|
|
28
|
+
targetManipulation?: any;
|
|
28
29
|
}): Promise<IIntegration>;
|
|
29
30
|
create(integration: {
|
|
30
31
|
trigger: any;
|
|
31
32
|
target: any;
|
|
32
33
|
dataManipulation?: any;
|
|
34
|
+
targetManipulation?: any;
|
|
33
35
|
active?: boolean;
|
|
34
36
|
}): Promise<IIntegration>;
|
|
35
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/administrator/integrations.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,aAAa,CAAC;AAGlC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IAG7B;IAFZ,YAAY,GAAG,mBAAmB,CAAC;IAE3C,YAAoB,OAAwB;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAA;QADI,YAAO,GAAP,OAAO,CAAiB;IAE5C,CAAC;IAED,cAAc,CAAC,aAAqB,EAAE,KAAoB;QACxD,OAAO,IAAI,CAAC,WAAW,CAAe,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,EAAE,KAAK,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,CAAC,KAYP,EAAE,KAAoB;QACrB,OAAO,IAAI,CAAC,WAAW,CAAiB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,CAAC,aAAqB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,aAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/administrator/integrations.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,aAAa,CAAC;AAGlC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IAG7B;IAFZ,YAAY,GAAG,mBAAmB,CAAC;IAE3C,YAAoB,OAAwB;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAA;QADI,YAAO,GAAP,OAAO,CAAiB;IAE5C,CAAC;IAED,cAAc,CAAC,aAAqB,EAAE,KAAoB;QACxD,OAAO,IAAI,CAAC,WAAW,CAAe,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,EAAE,KAAK,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,CAAC,KAYP,EAAE,KAAoB;QACrB,OAAO,IAAI,CAAC,WAAW,CAAiB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,CAAC,aAAqB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,aAAqB,EAAE,OAM7B;QACC,OAAO,IAAI,CAAC,WAAW,CACrB,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,EACvC;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CACF,CAAA;IACH,CAAC;IAED,MAAM,CAAC,WAMN;QACC,OAAO,IAAI,CAAC,WAAW,CAAe,IAAI,CAAC,YAAY,EAAE;YACvD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;SAClC,CAAC,CAAA;IACJ,CAAC;CAEF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { QelosSDKOptions } from '../types';
|
|
2
2
|
import BaseSDK from '../base-sdk';
|
|
3
|
-
import { IPlan, ISubscription, IInvoice, ICoupon, BillableEntityType, SubscriptionStatus, InvoiceStatus, BillingCycle, IPaymentsConfigurationMetadata } from '@qelos/global-types';
|
|
3
|
+
import { IPlan, ISubscription, IInvoice, ICoupon, BillableEntityType, SubscriptionStatus, InvoiceStatus, BillingCycle, IPaymentsConfigurationMetadata, CheckoutCustomer } from '@qelos/global-types';
|
|
4
4
|
export interface PaymentsConfigurationRecord {
|
|
5
5
|
key: string;
|
|
6
6
|
metadata: IPaymentsConfigurationMetadata;
|
|
@@ -22,6 +22,12 @@ export interface AdminCheckoutRequest {
|
|
|
22
22
|
* use `setSubscriptionDynamicAmount()` + a separate `checkout()` call instead.
|
|
23
23
|
*/
|
|
24
24
|
amount?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Real-world identity of the billable entity. Passed through to the payment
|
|
27
|
+
* provider (e.g. Sumit) so it can create a properly-named customer record
|
|
28
|
+
* instead of falling back to the raw billable entity ID.
|
|
29
|
+
*/
|
|
30
|
+
customer?: CheckoutCustomer;
|
|
25
31
|
}
|
|
26
32
|
export interface CreateSubscriptionData {
|
|
27
33
|
planId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payments.js","sourceRoot":"","sources":["../../src/administrator/payments.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"payments.js","sourceRoot":"","sources":["../../src/administrator/payments.ts"],"names":[],"mappings":"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"}
|
package/dist/authentication.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { QelosSDKOptions } from './types';
|
|
2
2
|
import BaseSDK from './base-sdk';
|
|
3
|
+
import { type McpAuthorizeOptions, type McpTokenExchangeOptions, type McpTokenExchangeResult } from './mcp-auth';
|
|
4
|
+
export type { McpAuthorizeOptions, McpCallbackInput, McpCallbackParams, McpTokenExchangeOptions, McpTokenExchangeResult, DecodedMcpOAuthStatePayload, McpPagePathOptions, } from './mcp-auth';
|
|
5
|
+
export { parseMcpCallbackParams } from './mcp-auth';
|
|
3
6
|
export interface IUser {
|
|
4
7
|
_id: string;
|
|
5
8
|
username: string;
|
|
@@ -158,6 +161,8 @@ export default class QlAuthentication extends BaseSDK {
|
|
|
158
161
|
* callback with `?rt=` (refresh token) after OAuth.
|
|
159
162
|
*/
|
|
160
163
|
socialCallback(input: SocialCallbackInput): Promise<SocialAuthCallbackPayload>;
|
|
164
|
+
getMcpAuthorizeUrl(options: McpAuthorizeOptions): string;
|
|
165
|
+
exchangeMcpAuthorizationCode(options: McpTokenExchangeOptions): Promise<McpTokenExchangeResult>;
|
|
161
166
|
getLoggedInUser(): Promise<IUser>;
|
|
162
167
|
updateLoggedInUser(changes: Partial<IUser & {
|
|
163
168
|
password?: string;
|
package/dist/authentication.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import BaseSDK from './base-sdk';
|
|
2
2
|
import { decodeMeUser } from './services/decode-uri-fields';
|
|
3
|
+
import { buildMcpAuthorizePath, buildMcpTokenExchangeBody, } from './mcp-auth';
|
|
4
|
+
export { parseMcpCallbackParams } from './mcp-auth';
|
|
3
5
|
function collectSetCookieHeaders(res) {
|
|
4
6
|
const h = res.headers;
|
|
5
7
|
if (typeof h.getSetCookie === 'function') {
|
|
@@ -251,6 +253,43 @@ export default class QlAuthentication extends BaseSDK {
|
|
|
251
253
|
}
|
|
252
254
|
return this.exchangeAuthCallback(refreshToken);
|
|
253
255
|
}
|
|
256
|
+
getMcpAuthorizeUrl(options) {
|
|
257
|
+
if (!options.redirectUri) {
|
|
258
|
+
throw new Error('redirectUri is required');
|
|
259
|
+
}
|
|
260
|
+
return this.buildUrl(buildMcpAuthorizePath(options));
|
|
261
|
+
}
|
|
262
|
+
async exchangeMcpAuthorizationCode(options) {
|
|
263
|
+
const { code, redirectUri, codeVerifier } = options;
|
|
264
|
+
if (!code || !redirectUri || !codeVerifier) {
|
|
265
|
+
throw new Error('code, redirectUri, and codeVerifier are required');
|
|
266
|
+
}
|
|
267
|
+
const res = await this.callApi('/api/auth/mcp/token', {
|
|
268
|
+
method: 'post',
|
|
269
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
270
|
+
body: buildMcpTokenExchangeBody(options).toString(),
|
|
271
|
+
});
|
|
272
|
+
if (!res.ok) {
|
|
273
|
+
let detail = '';
|
|
274
|
+
try {
|
|
275
|
+
detail = (await res.text()).slice(0, 512);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
/* ignore */
|
|
279
|
+
}
|
|
280
|
+
throw new Error(`failed to exchange MCP authorization code: HTTP ${res.status}${detail ? ` — ${detail}` : ''}`);
|
|
281
|
+
}
|
|
282
|
+
const body = (await res.json());
|
|
283
|
+
this.#accessToken = body.access_token;
|
|
284
|
+
this.#refreshToken = body.refresh_token;
|
|
285
|
+
const user = await this.getLoggedInUser();
|
|
286
|
+
return {
|
|
287
|
+
accessToken: body.access_token,
|
|
288
|
+
refreshToken: body.refresh_token,
|
|
289
|
+
expiresIn: body.expires_in,
|
|
290
|
+
user,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
254
293
|
getLoggedInUser() {
|
|
255
294
|
return this.callJsonApi('/api/me').then(decodeMeUser);
|
|
256
295
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authentication.js","sourceRoot":"","sources":["../src/authentication.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"authentication.js","sourceRoot":"","sources":["../src/authentication.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,9 +10,10 @@ import QlBlueprintEntities from './blueprints-entities';
|
|
|
10
10
|
import QlAI from './ai';
|
|
11
11
|
import QlLambdas from './lambdas';
|
|
12
12
|
import QlPayments from './payments';
|
|
13
|
-
export type { SocialCallbackInput, SocialAuthCallbackPayload, SocialProvider, SocialLoginOptions, } from './authentication';
|
|
13
|
+
export type { SocialCallbackInput, SocialAuthCallbackPayload, SocialProvider, SocialLoginOptions, McpAuthorizeOptions, McpCallbackInput, McpCallbackParams, McpTokenExchangeOptions, McpTokenExchangeResult, DecodedMcpOAuthStatePayload, McpPagePathOptions, } from './authentication';
|
|
14
14
|
export type { BlueprintEntitiesRegistry } from './blueprints';
|
|
15
|
-
export { parseSocialCallbackRefreshToken, getSocialAuthSetCookieParts, applySocialAuthCookiesToServerResponse, } from './authentication';
|
|
15
|
+
export { parseSocialCallbackRefreshToken, getSocialAuthSetCookieParts, applySocialAuthCookiesToServerResponse, parseMcpCallbackParams, } from './authentication';
|
|
16
|
+
export { buildMcpAuthorizePath, buildMcpAuthorizePathFromQuery, buildMcpLoginRedirectUrl, buildMcpConsentPageUrl, resolveMcpLoginRedirect, appendMcpAccessDeniedRedirect, decodeMcpOAuthStatePayload, buildMcpTokenExchangeBody, } from './mcp-auth';
|
|
16
17
|
export default class QelosSDK extends BaseSDK {
|
|
17
18
|
#private;
|
|
18
19
|
private options;
|
package/dist/index.js
CHANGED
|
@@ -13,8 +13,10 @@ const noExtraHeadersUrls = new Set([
|
|
|
13
13
|
'/api/signin',
|
|
14
14
|
'/api/signup',
|
|
15
15
|
'/api/auth/callback',
|
|
16
|
+
'/api/auth/mcp/token',
|
|
16
17
|
]);
|
|
17
|
-
export { parseSocialCallbackRefreshToken, getSocialAuthSetCookieParts, applySocialAuthCookiesToServerResponse, } from './authentication';
|
|
18
|
+
export { parseSocialCallbackRefreshToken, getSocialAuthSetCookieParts, applySocialAuthCookiesToServerResponse, parseMcpCallbackParams, } from './authentication';
|
|
19
|
+
export { buildMcpAuthorizePath, buildMcpAuthorizePathFromQuery, buildMcpLoginRedirectUrl, buildMcpConsentPageUrl, resolveMcpLoginRedirect, appendMcpAccessDeniedRedirect, decodeMcpOAuthStatePayload, buildMcpTokenExchangeBody, } from './mcp-auth';
|
|
18
20
|
export default class QelosSDK extends BaseSDK {
|
|
19
21
|
options;
|
|
20
22
|
#customHeaders = {};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;AACnD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,gBAAgB,MAAM,kBAAkB,CAAC;AAChD,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,YAAY,MAAM,cAAc,CAAC;AAExC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,oBAAoB;IACpB,aAAa;IACb,aAAa;IACb,oBAAoB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;AACnD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,gBAAgB,MAAM,kBAAkB,CAAC;AAChD,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,YAAY,MAAM,cAAc,CAAC;AAExC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,oBAAoB;IACpB,aAAa;IACb,aAAa;IACb,oBAAoB;IACpB,qBAAqB;CACtB,CAAC,CAAA;AAkBF,OAAO,EACL,+BAA+B,EAC/B,2BAA2B,EAC3B,sCAAsC,EACtC,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,qBAAqB,EACrB,8BAA8B,EAC9B,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,6BAA6B,EAC7B,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAavB;IAZpB,cAAc,GAAG,EAAE,CAAA;IAEnB,MAAM,CAAW;IACjB,iBAAiB,CAAsB;IACvC,cAAc,CAAmB;IACjC,UAAU,CAAe;IACzB,OAAO,CAAY;IACnB,UAAU,CAAe;IACzB,EAAE,CAAO;IACT,OAAO,CAAY;IACnB,QAAQ,CAAa;IAErB,YAAoB,OAAwB;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QADG,YAAO,GAAP,OAAO,CAAiB;QAE1C,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,iBAAiB,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,CAAC,cAAc,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7C,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAA;QAElF,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;YAC3B,OAAO,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;SAChE;QAED,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YACzB,OAAO,CAAC,YAAY,GAAG,KAAK,EAAE,WAAmB,EAAE,YAAsB,EAAE,EAAE;gBAC3E,IAAI,OAAO,CAAC,QAAQ,EAAE;oBACpB,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;iBAClE;gBACD,IAAI,SAAS,IAAI,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;oBACpD,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;iBACnC;gBACD,IAAI,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;gBACzD,IAAI,CAAC,KAAK,EAAE;oBACV,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;oBACzC,KAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;iBAClC;gBACD,IAAI,KAAK,EAAE;oBACT,OAAO,EAAE,aAAa,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;iBACpE;gBACD,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;YACnC,CAAC,CAAA;SACF;IACH,CAAC;IAED,QAAQ,CAAU,YAAoB;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAI,YAAY,CAAC,CAAC;IACrD,CAAC;IAED,eAAe,CAAC,GAAW,EAAE,KAAa;QACxC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnC,CAAC;IAED,kBAAkB,CAAC,GAAW;QAC5B,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { IUser } from './authentication';
|
|
2
|
+
export interface McpAuthorizeOptions {
|
|
3
|
+
redirectUri: string;
|
|
4
|
+
state?: string;
|
|
5
|
+
codeChallenge?: string;
|
|
6
|
+
codeChallengeMethod?: string;
|
|
7
|
+
clientId?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface McpTokenExchangeOptions {
|
|
10
|
+
code: string;
|
|
11
|
+
redirectUri: string;
|
|
12
|
+
codeVerifier: string;
|
|
13
|
+
}
|
|
14
|
+
export interface McpTokenExchangeResult {
|
|
15
|
+
accessToken: string;
|
|
16
|
+
refreshToken: string;
|
|
17
|
+
expiresIn: number;
|
|
18
|
+
user: IUser;
|
|
19
|
+
}
|
|
20
|
+
/** Callback URL or query bag from an MCP OAuth redirect. */
|
|
21
|
+
export type McpCallbackInput = string | URL | URLSearchParams | Record<string, string | string[] | undefined>;
|
|
22
|
+
export interface McpCallbackParams {
|
|
23
|
+
code?: string;
|
|
24
|
+
state?: string;
|
|
25
|
+
error?: string;
|
|
26
|
+
errorDescription?: string;
|
|
27
|
+
}
|
|
28
|
+
/** Decoded MCP OAuth state JWT payload (display only — not verified). */
|
|
29
|
+
export interface DecodedMcpOAuthStatePayload {
|
|
30
|
+
redirectUri?: string;
|
|
31
|
+
state?: string;
|
|
32
|
+
codeChallenge?: string;
|
|
33
|
+
codeChallengeMethod?: string;
|
|
34
|
+
tenant?: string;
|
|
35
|
+
clientId?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface McpPagePathOptions {
|
|
38
|
+
loginPath?: string;
|
|
39
|
+
consentPath?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse authorization callback parameters from an MCP OAuth redirect.
|
|
43
|
+
* Accepts a full URL, {@link URL}, `URLSearchParams`, a query/fragment string,
|
|
44
|
+
* or a query object such as `req.query` from Next.js or Express.
|
|
45
|
+
*/
|
|
46
|
+
export declare function parseMcpCallbackParams(input: McpCallbackInput): McpCallbackParams;
|
|
47
|
+
/** Relative authorize path with query string for {@link QlAuthentication.getMcpAuthorizeUrl}. */
|
|
48
|
+
export declare function buildMcpAuthorizePath(options: McpAuthorizeOptions): string;
|
|
49
|
+
/**
|
|
50
|
+
* Build `/api/auth/mcp/authorize?…` from OAuth authorize query params
|
|
51
|
+
* (e.g. when `/mcp/authorize` receives a direct client redirect).
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildMcpAuthorizePathFromQuery(query: Record<string, string | string[] | undefined>): string | null;
|
|
54
|
+
/** Login redirect used by Qelos after an unauthenticated MCP authorize request. */
|
|
55
|
+
export declare function buildMcpLoginRedirectUrl(authorizePath: string, options?: Pick<McpPagePathOptions, 'loginPath'>): string;
|
|
56
|
+
/** Consent page URL issued after the user signs in during MCP OAuth. */
|
|
57
|
+
export declare function buildMcpConsentPageUrl(mcpState: string, options?: Pick<McpPagePathOptions, 'consentPath'>): string;
|
|
58
|
+
/**
|
|
59
|
+
* Resolve the post-login redirect target from login-page query params.
|
|
60
|
+
* Matches the resume logic used by the Qelos admin login flow.
|
|
61
|
+
*/
|
|
62
|
+
export declare function resolveMcpLoginRedirect(query: Record<string, string | string[] | undefined>, options?: McpPagePathOptions): string | null;
|
|
63
|
+
/** Redirect URI with `error=access_denied` for MCP consent denial. */
|
|
64
|
+
export declare function appendMcpAccessDeniedRedirect(redirectUri: string, oauthState?: string | null): string;
|
|
65
|
+
/**
|
|
66
|
+
* Decode the signed `mcp_state` JWT payload for display on a consent page.
|
|
67
|
+
* Does not verify the signature — use only for UI labels, not authorization.
|
|
68
|
+
*/
|
|
69
|
+
export declare function decodeMcpOAuthStatePayload(mcpState: string): DecodedMcpOAuthStatePayload | null;
|
|
70
|
+
export interface McpOAuthTokenResponse {
|
|
71
|
+
access_token: string;
|
|
72
|
+
refresh_token: string;
|
|
73
|
+
token_type: string;
|
|
74
|
+
expires_in: number;
|
|
75
|
+
}
|
|
76
|
+
export declare function buildMcpTokenExchangeBody(options: McpTokenExchangeOptions): URLSearchParams;
|
package/dist/mcp-auth.js
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
function readQueryValue(input, key) {
|
|
2
|
+
const raw = input[key];
|
|
3
|
+
if (Array.isArray(raw)) {
|
|
4
|
+
return raw[0] && typeof raw[0] === 'string' ? raw[0] : undefined;
|
|
5
|
+
}
|
|
6
|
+
return typeof raw === 'string' ? raw : undefined;
|
|
7
|
+
}
|
|
8
|
+
function searchParamsFromString(input) {
|
|
9
|
+
try {
|
|
10
|
+
const url = new URL(input);
|
|
11
|
+
if (url.search) {
|
|
12
|
+
return url.searchParams;
|
|
13
|
+
}
|
|
14
|
+
if (url.hash.length > 1) {
|
|
15
|
+
return new URLSearchParams(url.hash.slice(1));
|
|
16
|
+
}
|
|
17
|
+
return url.searchParams;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
const trimmed = input.trim();
|
|
21
|
+
if (!trimmed) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
const queryPart = trimmed.startsWith('?')
|
|
25
|
+
? trimmed.slice(1)
|
|
26
|
+
: trimmed.startsWith('#')
|
|
27
|
+
? trimmed.slice(1)
|
|
28
|
+
: trimmed.includes('=')
|
|
29
|
+
? trimmed
|
|
30
|
+
: undefined;
|
|
31
|
+
return queryPart ? new URLSearchParams(queryPart) : undefined;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function searchParamsFromInput(input) {
|
|
35
|
+
if (input instanceof URLSearchParams) {
|
|
36
|
+
return input;
|
|
37
|
+
}
|
|
38
|
+
if (input instanceof URL) {
|
|
39
|
+
if (input.search.length > 1) {
|
|
40
|
+
return input.searchParams;
|
|
41
|
+
}
|
|
42
|
+
if (input.hash.length > 1) {
|
|
43
|
+
return new URLSearchParams(input.hash.slice(1));
|
|
44
|
+
}
|
|
45
|
+
return input.searchParams;
|
|
46
|
+
}
|
|
47
|
+
if (typeof input === 'string') {
|
|
48
|
+
return searchParamsFromString(input);
|
|
49
|
+
}
|
|
50
|
+
const params = new URLSearchParams();
|
|
51
|
+
const code = readQueryValue(input, 'code');
|
|
52
|
+
const state = readQueryValue(input, 'state');
|
|
53
|
+
const error = readQueryValue(input, 'error');
|
|
54
|
+
const errorDescription = readQueryValue(input, 'error_description');
|
|
55
|
+
if (code)
|
|
56
|
+
params.set('code', code);
|
|
57
|
+
if (state)
|
|
58
|
+
params.set('state', state);
|
|
59
|
+
if (error)
|
|
60
|
+
params.set('error', error);
|
|
61
|
+
if (errorDescription)
|
|
62
|
+
params.set('error_description', errorDescription);
|
|
63
|
+
return params.toString() ? params : undefined;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parse authorization callback parameters from an MCP OAuth redirect.
|
|
67
|
+
* Accepts a full URL, {@link URL}, `URLSearchParams`, a query/fragment string,
|
|
68
|
+
* or a query object such as `req.query` from Next.js or Express.
|
|
69
|
+
*/
|
|
70
|
+
export function parseMcpCallbackParams(input) {
|
|
71
|
+
const params = searchParamsFromInput(input);
|
|
72
|
+
if (!params) {
|
|
73
|
+
return {};
|
|
74
|
+
}
|
|
75
|
+
const result = {};
|
|
76
|
+
const code = params.get('code');
|
|
77
|
+
const state = params.get('state');
|
|
78
|
+
const error = params.get('error');
|
|
79
|
+
const errorDescription = params.get('error_description');
|
|
80
|
+
if (code)
|
|
81
|
+
result.code = code;
|
|
82
|
+
if (state)
|
|
83
|
+
result.state = state;
|
|
84
|
+
if (error)
|
|
85
|
+
result.error = error;
|
|
86
|
+
if (errorDescription)
|
|
87
|
+
result.errorDescription = errorDescription;
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
/** Relative authorize path with query string for {@link QlAuthentication.getMcpAuthorizeUrl}. */
|
|
91
|
+
export function buildMcpAuthorizePath(options) {
|
|
92
|
+
const search = new URLSearchParams({ redirect_uri: options.redirectUri });
|
|
93
|
+
if (options.state)
|
|
94
|
+
search.set('state', options.state);
|
|
95
|
+
if (options.codeChallenge)
|
|
96
|
+
search.set('code_challenge', options.codeChallenge);
|
|
97
|
+
if (options.codeChallengeMethod)
|
|
98
|
+
search.set('code_challenge_method', options.codeChallengeMethod);
|
|
99
|
+
if (options.clientId)
|
|
100
|
+
search.set('client_id', options.clientId);
|
|
101
|
+
return `/api/auth/mcp/authorize?${search.toString()}`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Build `/api/auth/mcp/authorize?…` from OAuth authorize query params
|
|
105
|
+
* (e.g. when `/mcp/authorize` receives a direct client redirect).
|
|
106
|
+
*/
|
|
107
|
+
export function buildMcpAuthorizePathFromQuery(query) {
|
|
108
|
+
const redirectUri = readQueryValue(query, 'redirect_uri');
|
|
109
|
+
if (!redirectUri) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const options = { redirectUri };
|
|
113
|
+
const state = readQueryValue(query, 'state');
|
|
114
|
+
const codeChallenge = readQueryValue(query, 'code_challenge');
|
|
115
|
+
const codeChallengeMethod = readQueryValue(query, 'code_challenge_method');
|
|
116
|
+
const clientId = readQueryValue(query, 'client_id');
|
|
117
|
+
if (state)
|
|
118
|
+
options.state = state;
|
|
119
|
+
if (codeChallenge)
|
|
120
|
+
options.codeChallenge = codeChallenge;
|
|
121
|
+
if (codeChallengeMethod)
|
|
122
|
+
options.codeChallengeMethod = codeChallengeMethod;
|
|
123
|
+
if (clientId)
|
|
124
|
+
options.clientId = clientId;
|
|
125
|
+
return buildMcpAuthorizePath(options);
|
|
126
|
+
}
|
|
127
|
+
/** Login redirect used by Qelos after an unauthenticated MCP authorize request. */
|
|
128
|
+
export function buildMcpLoginRedirectUrl(authorizePath, options) {
|
|
129
|
+
const loginPath = options?.loginPath ?? '/login';
|
|
130
|
+
return `${loginPath}?redirect=${encodeURIComponent(authorizePath)}`;
|
|
131
|
+
}
|
|
132
|
+
/** Consent page URL issued after the user signs in during MCP OAuth. */
|
|
133
|
+
export function buildMcpConsentPageUrl(mcpState, options) {
|
|
134
|
+
const consentPath = options?.consentPath ?? '/mcp/authorize';
|
|
135
|
+
return `${consentPath}?mcp_state=${encodeURIComponent(mcpState)}`;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Resolve the post-login redirect target from login-page query params.
|
|
139
|
+
* Matches the resume logic used by the Qelos admin login flow.
|
|
140
|
+
*/
|
|
141
|
+
export function resolveMcpLoginRedirect(query, options) {
|
|
142
|
+
const redirect = readQueryValue(query, 'redirect');
|
|
143
|
+
if (redirect) {
|
|
144
|
+
return redirect;
|
|
145
|
+
}
|
|
146
|
+
const mcpState = readQueryValue(query, 'mcp_state');
|
|
147
|
+
if (mcpState) {
|
|
148
|
+
return buildMcpConsentPageUrl(mcpState, options);
|
|
149
|
+
}
|
|
150
|
+
return buildMcpAuthorizePathFromQuery(query);
|
|
151
|
+
}
|
|
152
|
+
/** Redirect URI with `error=access_denied` for MCP consent denial. */
|
|
153
|
+
export function appendMcpAccessDeniedRedirect(redirectUri, oauthState) {
|
|
154
|
+
try {
|
|
155
|
+
const url = new URL(redirectUri);
|
|
156
|
+
url.searchParams.set('error', 'access_denied');
|
|
157
|
+
if (oauthState) {
|
|
158
|
+
url.searchParams.set('state', oauthState);
|
|
159
|
+
}
|
|
160
|
+
return url.toString();
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
const separator = redirectUri.includes('?') ? '&' : '?';
|
|
164
|
+
let result = `${redirectUri}${separator}error=access_denied`;
|
|
165
|
+
if (oauthState) {
|
|
166
|
+
result += `&state=${encodeURIComponent(oauthState)}`;
|
|
167
|
+
}
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Decode the signed `mcp_state` JWT payload for display on a consent page.
|
|
173
|
+
* Does not verify the signature — use only for UI labels, not authorization.
|
|
174
|
+
*/
|
|
175
|
+
export function decodeMcpOAuthStatePayload(mcpState) {
|
|
176
|
+
if (!mcpState) {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
try {
|
|
180
|
+
const parts = mcpState.split('.');
|
|
181
|
+
if (parts.length !== 3 || !parts[1]) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
const base64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');
|
|
185
|
+
const json = typeof globalThis.atob === 'function'
|
|
186
|
+
? globalThis.atob(base64)
|
|
187
|
+
: Buffer.from(base64, 'base64').toString('utf8');
|
|
188
|
+
const decoded = JSON.parse(json);
|
|
189
|
+
const payload = {};
|
|
190
|
+
if (decoded.ru)
|
|
191
|
+
payload.redirectUri = decoded.ru;
|
|
192
|
+
if (decoded.s)
|
|
193
|
+
payload.state = decoded.s;
|
|
194
|
+
if (decoded.cc)
|
|
195
|
+
payload.codeChallenge = decoded.cc;
|
|
196
|
+
if (decoded.ccm)
|
|
197
|
+
payload.codeChallengeMethod = decoded.ccm;
|
|
198
|
+
if (decoded.t)
|
|
199
|
+
payload.tenant = decoded.t;
|
|
200
|
+
if (decoded.cid)
|
|
201
|
+
payload.clientId = decoded.cid;
|
|
202
|
+
return payload.redirectUri ? payload : null;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
export function buildMcpTokenExchangeBody(options) {
|
|
209
|
+
return new URLSearchParams({
|
|
210
|
+
grant_type: 'authorization_code',
|
|
211
|
+
code: options.code,
|
|
212
|
+
redirect_uri: options.redirectUri,
|
|
213
|
+
code_verifier: options.codeVerifier,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=mcp-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-auth.js","sourceRoot":"","sources":["../src/mcp-auth.ts"],"names":[],"mappings":"AAoDA,SAAS,cAAc,CACrB,KAAoD,EACpD,GAAW;IAEX,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACtB,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;KAClE;IACD,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACnD,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IAC3C,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,GAAG,CAAC,MAAM,EAAE;YACd,OAAO,GAAG,CAAC,YAAY,CAAC;SACzB;QACD,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,OAAO,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/C;QACD,OAAO,GAAG,CAAC,YAAY,CAAC;KACzB;IAAC,MAAM;QACN,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,SAAS,CAAC;SAClB;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YACvC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;gBACvB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBAClB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;oBACrB,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,SAAS,CAAC;QAClB,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;KAC/D;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAuB;IACpD,IAAI,KAAK,YAAY,eAAe,EAAE;QACpC,OAAO,KAAK,CAAC;KACd;IACD,IAAI,KAAK,YAAY,GAAG,EAAE;QACxB,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,OAAO,KAAK,CAAC,YAAY,CAAC;SAC3B;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACzB,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACjD;QACD,OAAO,KAAK,CAAC,YAAY,CAAC;KAC3B;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC7B,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;KACtC;IAED,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;IACpE,IAAI,IAAI;QAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACtC,IAAI,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACtC,IAAI,gBAAgB;QAAE,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAuB;IAC5D,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,EAAE,CAAC;KACX;IAED,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACzD,IAAI,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IAC7B,IAAI,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IAChC,IAAI,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IAChC,IAAI,gBAAgB;QAAE,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IACjE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,qBAAqB,CAAC,OAA4B;IAChE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,OAAO,CAAC,aAAa;QAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/E,IAAI,OAAO,CAAC,mBAAmB;QAAE,MAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClG,IAAI,OAAO,CAAC,QAAQ;QAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChE,OAAO,2BAA2B,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAC5C,KAAoD;IAEpD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,IAAI,CAAC;KACb;IAED,MAAM,OAAO,GAAwB,EAAE,WAAW,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAC9D,MAAM,mBAAmB,GAAG,cAAc,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,KAAK;QAAE,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;IACjC,IAAI,aAAa;QAAE,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;IACzD,IAAI,mBAAmB;QAAE,OAAO,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;IAC3E,IAAI,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1C,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,wBAAwB,CACtC,aAAqB,EACrB,OAA+C;IAE/C,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,QAAQ,CAAC;IACjD,OAAO,GAAG,SAAS,aAAa,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,sBAAsB,CACpC,QAAgB,EAChB,OAAiD;IAEjD,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,gBAAgB,CAAC;IAC7D,OAAO,GAAG,WAAW,cAAc,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAoD,EACpD,OAA4B;IAE5B,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACnD,IAAI,QAAQ,EAAE;QACZ,OAAO,QAAQ,CAAC;KACjB;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,QAAQ,EAAE;QACZ,OAAO,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;KAClD;IAED,OAAO,8BAA8B,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,6BAA6B,CAC3C,WAAmB,EACnB,UAA0B;IAE1B,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QACjC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAC/C,IAAI,UAAU,EAAE;YACd,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;SAC3C;QACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;KACvB;IAAC,MAAM;QACN,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACxD,IAAI,MAAM,GAAG,GAAG,WAAW,GAAG,SAAS,qBAAqB,CAAC;QAC7D,IAAI,UAAU,EAAE;YACd,MAAM,IAAI,UAAU,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;SACtD;QACD,OAAO,MAAM,CAAC;KACf;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAAgB;IACzD,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,IAAI,CAAC;KACb;IAED,IAAI;QACF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACnC,OAAO,IAAI,CAAC;SACb;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,IAAI,GACR,OAAO,UAAU,CAAC,IAAI,KAAK,UAAU;YACnC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;YACzB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAO9B,CAAC;QAEF,MAAM,OAAO,GAAgC,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,CAAC;YAAE,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,OAAO,CAAC,GAAG;YAAE,OAAO,CAAC,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC;QAC3D,IAAI,OAAO,CAAC,CAAC;YAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,GAAG;YAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;QAChD,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;KAC7C;IAAC,MAAM;QACN,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AASD,MAAM,UAAU,yBAAyB,CAAC,OAAgC;IACxE,OAAO,IAAI,eAAe,CAAC;QACzB,UAAU,EAAE,oBAAoB;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,YAAY,EAAE,OAAO,CAAC,WAAW;QACjC,aAAa,EAAE,OAAO,CAAC,YAAY;KACpC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/payments.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { QelosSDKOptions } from './types';
|
|
2
2
|
import BaseSDK from './base-sdk';
|
|
3
|
-
import { IPlan, ISubscription, IInvoice, ICoupon, BillingCycle } from '@qelos/global-types';
|
|
3
|
+
import { IPlan, ISubscription, IInvoice, ICoupon, BillingCycle, CheckoutCustomer } from '@qelos/global-types';
|
|
4
4
|
export interface CheckoutRequest {
|
|
5
5
|
/** Required when not providing `subscriptionId`. Must be a non-dynamic plan. */
|
|
6
6
|
planId?: string;
|
|
@@ -9,6 +9,12 @@ export interface CheckoutRequest {
|
|
|
9
9
|
couponCode?: string;
|
|
10
10
|
successUrl?: string;
|
|
11
11
|
cancelUrl?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Real-world identity of the billable entity. Passed through to the payment
|
|
14
|
+
* provider (e.g. Sumit) so it can create a properly-named customer record
|
|
15
|
+
* instead of falling back to the raw billable entity ID.
|
|
16
|
+
*/
|
|
17
|
+
customer?: CheckoutCustomer;
|
|
12
18
|
/**
|
|
13
19
|
* When true, cancels any existing active or trialing subscription for the
|
|
14
20
|
* authenticated billable entity before starting checkout (e.g. plan change).
|