@billfn/core 0.0.0-stage → 0.0.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.
- package/dist/errors.d.ts +58 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +73 -0
- package/dist/errors.js.map +1 -0
- package/dist/helpers.d.ts +13 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +104 -0
- package/dist/helpers.js.map +1 -0
- package/dist/http.d.ts +5 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +37 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/router.d.ts +3 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +313 -0
- package/dist/router.js.map +1 -0
- package/dist/schema.d.ts +10 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +246 -0
- package/dist/schema.js.map +1 -0
- package/dist/service.d.ts +58 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +2446 -0
- package/dist/service.js.map +1 -0
- package/dist/types.d.ts +607 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -4
- package/README.md +0 -3
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type ErrorRegistry, type SuperfunctionError } from '@superfunctions/errors';
|
|
2
|
+
declare const definitions: readonly [{
|
|
3
|
+
readonly code: "BILLFN_VALIDATION_ERROR";
|
|
4
|
+
readonly httpStatus: 400;
|
|
5
|
+
readonly retryable: false;
|
|
6
|
+
}, {
|
|
7
|
+
readonly code: "BILLFN_NOT_FOUND";
|
|
8
|
+
readonly httpStatus: 404;
|
|
9
|
+
readonly retryable: false;
|
|
10
|
+
}, {
|
|
11
|
+
readonly code: "BILLFN_CONFLICT";
|
|
12
|
+
readonly httpStatus: 409;
|
|
13
|
+
readonly retryable: false;
|
|
14
|
+
}, {
|
|
15
|
+
readonly code: "BILLFN_UNAUTHORIZED";
|
|
16
|
+
readonly httpStatus: 403;
|
|
17
|
+
readonly retryable: false;
|
|
18
|
+
}, {
|
|
19
|
+
readonly code: "BILLFN_PROVIDER_ERROR";
|
|
20
|
+
readonly httpStatus: 502;
|
|
21
|
+
readonly retryable: true;
|
|
22
|
+
}, {
|
|
23
|
+
readonly code: "BILLFN_PROVIDER_UNSUPPORTED";
|
|
24
|
+
readonly httpStatus: 501;
|
|
25
|
+
readonly retryable: false;
|
|
26
|
+
}, {
|
|
27
|
+
readonly code: "BILLFN_WEBHOOK_SIGNATURE_INVALID";
|
|
28
|
+
readonly httpStatus: 401;
|
|
29
|
+
readonly retryable: false;
|
|
30
|
+
}, {
|
|
31
|
+
readonly code: "BILLFN_SUBSCRIPTION_INACTIVE";
|
|
32
|
+
readonly httpStatus: 402;
|
|
33
|
+
readonly retryable: false;
|
|
34
|
+
}, {
|
|
35
|
+
readonly code: "BILLFN_QUOTA_EXCEEDED";
|
|
36
|
+
readonly httpStatus: 403;
|
|
37
|
+
readonly retryable: false;
|
|
38
|
+
}, {
|
|
39
|
+
readonly code: "BILLFN_FEATURE_UNAVAILABLE";
|
|
40
|
+
readonly httpStatus: 403;
|
|
41
|
+
readonly retryable: false;
|
|
42
|
+
}, {
|
|
43
|
+
readonly code: "BILLFN_CATALOG_PRICE_NOT_FOUND";
|
|
44
|
+
readonly httpStatus: 404;
|
|
45
|
+
readonly retryable: false;
|
|
46
|
+
}, {
|
|
47
|
+
readonly code: "BILLFN_INTERNAL_ERROR";
|
|
48
|
+
readonly httpStatus: 500;
|
|
49
|
+
readonly retryable: false;
|
|
50
|
+
}];
|
|
51
|
+
export declare const billFnErrorRegistry: ErrorRegistry;
|
|
52
|
+
export declare function createBillFnError(input: {
|
|
53
|
+
code: (typeof definitions)[number]['code'];
|
|
54
|
+
message?: string;
|
|
55
|
+
details?: Record<string, unknown>;
|
|
56
|
+
}): SuperfunctionError;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,wBAAwB,CAAC;AAEhC,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6DP,CAAC;AAEX,eAAO,MAAM,mBAAmB,EAAE,aAAqD,CAAC;AAExF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,GAAG,kBAAkB,CAOrB"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { createErrorRegistry, createTypedError } from '@superfunctions/errors';
|
|
2
|
+
const definitions = [
|
|
3
|
+
{
|
|
4
|
+
code: 'BILLFN_VALIDATION_ERROR',
|
|
5
|
+
httpStatus: 400,
|
|
6
|
+
retryable: false
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
code: 'BILLFN_NOT_FOUND',
|
|
10
|
+
httpStatus: 404,
|
|
11
|
+
retryable: false
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
code: 'BILLFN_CONFLICT',
|
|
15
|
+
httpStatus: 409,
|
|
16
|
+
retryable: false
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
code: 'BILLFN_UNAUTHORIZED',
|
|
20
|
+
httpStatus: 403,
|
|
21
|
+
retryable: false
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
code: 'BILLFN_PROVIDER_ERROR',
|
|
25
|
+
httpStatus: 502,
|
|
26
|
+
retryable: true
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
code: 'BILLFN_PROVIDER_UNSUPPORTED',
|
|
30
|
+
httpStatus: 501,
|
|
31
|
+
retryable: false
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
code: 'BILLFN_WEBHOOK_SIGNATURE_INVALID',
|
|
35
|
+
httpStatus: 401,
|
|
36
|
+
retryable: false
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
code: 'BILLFN_SUBSCRIPTION_INACTIVE',
|
|
40
|
+
httpStatus: 402,
|
|
41
|
+
retryable: false
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
code: 'BILLFN_QUOTA_EXCEEDED',
|
|
45
|
+
httpStatus: 403,
|
|
46
|
+
retryable: false
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
code: 'BILLFN_FEATURE_UNAVAILABLE',
|
|
50
|
+
httpStatus: 403,
|
|
51
|
+
retryable: false
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
code: 'BILLFN_CATALOG_PRICE_NOT_FOUND',
|
|
55
|
+
httpStatus: 404,
|
|
56
|
+
retryable: false
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
code: 'BILLFN_INTERNAL_ERROR',
|
|
60
|
+
httpStatus: 500,
|
|
61
|
+
retryable: false
|
|
62
|
+
}
|
|
63
|
+
];
|
|
64
|
+
export const billFnErrorRegistry = createErrorRegistry([...definitions]);
|
|
65
|
+
export function createBillFnError(input) {
|
|
66
|
+
return createTypedError({
|
|
67
|
+
code: input.code,
|
|
68
|
+
message: input.message,
|
|
69
|
+
details: input.details,
|
|
70
|
+
registry: billFnErrorRegistry
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAGjB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,GAAG;IAClB;QACE,IAAI,EAAE,yBAAyB;QAC/B,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK;KACjB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK;KACjB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK;KACjB;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK;KACjB;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,IAAI;KAChB;IACD;QACE,IAAI,EAAE,6BAA6B;QACnC,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK;KACjB;IACD;QACE,IAAI,EAAE,kCAAkC;QACxC,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK;KACjB;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK;KACjB;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK;KACjB;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK;KACjB;IACD;QACE,IAAI,EAAE,gCAAgC;QACtC,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK;KACjB;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,KAAK;KACjB;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAkB,mBAAmB,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;AAExF,MAAM,UAAU,iBAAiB,CAAC,KAIjC;IACC,OAAO,gBAAgB,CAAC;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,mBAAmB;KAC9B,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BillFnCatalog, BillFnPlanDefinition, BillFnPriceDefinition, BillableSubject, BillingAccountResolver, BillingOwnerType } from './types.js';
|
|
2
|
+
export declare function normalizeBasePath(basePath: string | undefined, fallback: string): string;
|
|
3
|
+
export declare function toIsoString(value: Date): string;
|
|
4
|
+
export declare function defaultIdFactory(prefix: string): string;
|
|
5
|
+
export declare function createDefaultBillingAccountResolver(): BillingAccountResolver;
|
|
6
|
+
export declare function buildBillingAccountId(ownerType: BillingOwnerType, ownerId: string): string;
|
|
7
|
+
export declare function resolvePlan(catalog: BillFnCatalog, planKey: string): BillFnPlanDefinition | undefined;
|
|
8
|
+
export declare function resolvePrice(plan: BillFnPlanDefinition, provider: BillFnPriceDefinition['provider'], interval: BillFnPriceDefinition['interval'] | undefined): BillFnPriceDefinition | undefined;
|
|
9
|
+
export declare function getSubjectFromQuery(url: URL): BillableSubject;
|
|
10
|
+
export declare function resolveRequestSubject(request: Request, configResolver?: (request: Request) => Promise<BillableSubject | null> | BillableSubject | null, bodySubject?: BillableSubject): Promise<BillableSubject>;
|
|
11
|
+
export declare function hasSomeSubjectField(subject: BillableSubject): boolean;
|
|
12
|
+
export declare function decodeJwtPayload<T extends Record<string, unknown>>(token: string): T | null;
|
|
13
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMxF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAE/C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,mCAAmC,IAAI,sBAAsB,CAwB5E;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1F;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAErG;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,qBAAqB,CAAC,UAAU,CAAC,EAC3C,QAAQ,EAAE,qBAAqB,CAAC,UAAU,CAAC,GAAG,SAAS,GACtD,qBAAqB,GAAG,SAAS,CAMnC;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,eAAe,CAc7D;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,eAAe,GAAG,IAAI,EAC/F,WAAW,CAAC,EAAE,eAAe,GAC5B,OAAO,CAAC,eAAe,CAAC,CAmB1B;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAOrE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAgB3F"}
|
package/dist/helpers.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
export function normalizeBasePath(basePath, fallback) {
|
|
3
|
+
const raw = (basePath ?? fallback).trim();
|
|
4
|
+
if (!raw) {
|
|
5
|
+
return fallback;
|
|
6
|
+
}
|
|
7
|
+
return raw.startsWith('/') ? raw.replace(/\/$/, '') : `/${raw.replace(/\/$/, '')}`;
|
|
8
|
+
}
|
|
9
|
+
export function toIsoString(value) {
|
|
10
|
+
return value.toISOString();
|
|
11
|
+
}
|
|
12
|
+
export function defaultIdFactory(prefix) {
|
|
13
|
+
return `${prefix}_${randomBytes(16).toString('base64url')}`;
|
|
14
|
+
}
|
|
15
|
+
export function createDefaultBillingAccountResolver() {
|
|
16
|
+
return {
|
|
17
|
+
async resolve(input) {
|
|
18
|
+
const organizationId = input.organizationId ?? input.tenantId;
|
|
19
|
+
if (organizationId) {
|
|
20
|
+
return {
|
|
21
|
+
billingAccountId: buildBillingAccountId('organization', organizationId),
|
|
22
|
+
ownerType: 'organization',
|
|
23
|
+
ownerId: organizationId
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const userId = input.principalId ?? input.actorId;
|
|
27
|
+
if (!userId) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
billingAccountId: buildBillingAccountId('user', userId),
|
|
32
|
+
ownerType: 'user',
|
|
33
|
+
ownerId: userId
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function buildBillingAccountId(ownerType, ownerId) {
|
|
39
|
+
return `ba_${ownerType}_${ownerId}`;
|
|
40
|
+
}
|
|
41
|
+
export function resolvePlan(catalog, planKey) {
|
|
42
|
+
return catalog.plans.find((plan) => plan.planKey === planKey);
|
|
43
|
+
}
|
|
44
|
+
export function resolvePrice(plan, provider, interval) {
|
|
45
|
+
if (interval) {
|
|
46
|
+
return plan.prices.find((price) => price.provider === provider && price.interval === interval);
|
|
47
|
+
}
|
|
48
|
+
return plan.prices.find((price) => price.provider === provider);
|
|
49
|
+
}
|
|
50
|
+
export function getSubjectFromQuery(url) {
|
|
51
|
+
const actorId = url.searchParams.get('actorId') ?? undefined;
|
|
52
|
+
const principalId = url.searchParams.get('principalId') ?? undefined;
|
|
53
|
+
const tenantId = url.searchParams.get('tenantId') ?? undefined;
|
|
54
|
+
const organizationId = url.searchParams.get('organizationId') ?? undefined;
|
|
55
|
+
const actorType = url.searchParams.get('actorType');
|
|
56
|
+
return {
|
|
57
|
+
actorId,
|
|
58
|
+
actorType: actorType ?? undefined,
|
|
59
|
+
principalId,
|
|
60
|
+
tenantId,
|
|
61
|
+
organizationId
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export async function resolveRequestSubject(request, configResolver, bodySubject) {
|
|
65
|
+
if (configResolver) {
|
|
66
|
+
const resolved = await configResolver(request);
|
|
67
|
+
if (resolved && hasSomeSubjectField(resolved)) {
|
|
68
|
+
return resolved;
|
|
69
|
+
}
|
|
70
|
+
return {};
|
|
71
|
+
}
|
|
72
|
+
if (bodySubject && hasSomeSubjectField(bodySubject)) {
|
|
73
|
+
return bodySubject;
|
|
74
|
+
}
|
|
75
|
+
const fromQuery = getSubjectFromQuery(new URL(request.url));
|
|
76
|
+
if (hasSomeSubjectField(fromQuery)) {
|
|
77
|
+
return fromQuery;
|
|
78
|
+
}
|
|
79
|
+
return {};
|
|
80
|
+
}
|
|
81
|
+
export function hasSomeSubjectField(subject) {
|
|
82
|
+
return Boolean(subject.actorId ||
|
|
83
|
+
subject.principalId ||
|
|
84
|
+
subject.organizationId ||
|
|
85
|
+
subject.tenantId);
|
|
86
|
+
}
|
|
87
|
+
export function decodeJwtPayload(token) {
|
|
88
|
+
const parts = token.split('.');
|
|
89
|
+
if (parts.length < 2) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const payload = parts[1]
|
|
94
|
+
.replace(/-/g, '+')
|
|
95
|
+
.replace(/_/g, '/');
|
|
96
|
+
const padded = payload.padEnd(Math.ceil(payload.length / 4) * 4, '=');
|
|
97
|
+
const decoded = Buffer.from(padded, 'base64').toString('utf8');
|
|
98
|
+
return JSON.parse(decoded);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Envelope } from '@superfunctions/envelope';
|
|
2
|
+
export declare function jsonResponse<T>(body: Envelope<T>, status?: number): Response;
|
|
3
|
+
export declare function successResponse<T>(data: T, status?: number): Response;
|
|
4
|
+
export declare function errorResponse(error: Error): Response;
|
|
5
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGlE,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,GAAE,MAAY,GAAG,QAAQ,CAOjF;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAE,MAAY,GAAG,QAAQ,CAE1E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAuBpD"}
|
package/dist/http.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { err, ok } from '@superfunctions/envelope';
|
|
2
|
+
export function jsonResponse(body, status = 200) {
|
|
3
|
+
return new Response(JSON.stringify(body), {
|
|
4
|
+
status,
|
|
5
|
+
headers: {
|
|
6
|
+
'content-type': 'application/json'
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export function successResponse(data, status = 200) {
|
|
11
|
+
return jsonResponse(ok(data), status);
|
|
12
|
+
}
|
|
13
|
+
export function errorResponse(error) {
|
|
14
|
+
if (isSuperfunctionError(error)) {
|
|
15
|
+
return jsonResponse(err({
|
|
16
|
+
code: error.code,
|
|
17
|
+
message: error.message,
|
|
18
|
+
status: error.status,
|
|
19
|
+
retryable: error.retryable,
|
|
20
|
+
details: error.details
|
|
21
|
+
}), error.status);
|
|
22
|
+
}
|
|
23
|
+
return jsonResponse(err({
|
|
24
|
+
code: 'BILLFN_INTERNAL_ERROR',
|
|
25
|
+
message: 'Unexpected billfn error',
|
|
26
|
+
status: 500,
|
|
27
|
+
retryable: false
|
|
28
|
+
}), 500);
|
|
29
|
+
}
|
|
30
|
+
function isSuperfunctionError(value) {
|
|
31
|
+
return (typeof value === 'object' &&
|
|
32
|
+
value !== null &&
|
|
33
|
+
typeof value.code === 'string' &&
|
|
34
|
+
typeof value.status === 'number' &&
|
|
35
|
+
typeof value.retryable === 'boolean');
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAiB,MAAM,0BAA0B,CAAC;AAGlE,MAAM,UAAU,YAAY,CAAI,IAAiB,EAAE,SAAiB,GAAG;IACrE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAAI,IAAO,EAAE,SAAiB,GAAG;IAC9D,OAAO,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAY;IACxC,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,YAAY,CACjB,GAAG,CAAC;YACF,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,EACF,KAAK,CAAC,MAAM,CACb,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CACjB,GAAG,CAAC;QACF,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,yBAAyB;QAClC,MAAM,EAAE,GAAG;QACX,SAAS,EAAE,KAAK;KACjB,CAAC,EACF,GAAG,CACJ,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAY;IACxC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ;QACtD,OAAQ,KAA8B,CAAC,MAAM,KAAK,QAAQ;QAC1D,OAAQ,KAAiC,CAAC,SAAS,KAAK,SAAS,CAClE,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { BillFnConfig, BillFnInstance } from './types.js';
|
|
2
|
+
export type * from './types.js';
|
|
3
|
+
export { getSchema, getSchemaMap } from './schema.js';
|
|
4
|
+
export { createBillFnError, billFnErrorRegistry } from './errors.js';
|
|
5
|
+
export { createBillFnReconciliationWorker } from './service.js';
|
|
6
|
+
export declare function createBillFn(config: BillFnConfig): BillFnInstance;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,mBAAmB,YAAY,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,gCAAgC,EAAE,MAAM,cAAc,CAAC;AAEhE,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAyBjE"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createBillFnRouter } from './router.js';
|
|
2
|
+
import { getSchema } from './schema.js';
|
|
3
|
+
import { createBillFnService } from './service.js';
|
|
4
|
+
export { getSchema, getSchemaMap } from './schema.js';
|
|
5
|
+
export { createBillFnError, billFnErrorRegistry } from './errors.js';
|
|
6
|
+
export { createBillFnReconciliationWorker } from './service.js';
|
|
7
|
+
export function createBillFn(config) {
|
|
8
|
+
const service = createBillFnService(config);
|
|
9
|
+
const router = createBillFnRouter(config);
|
|
10
|
+
return {
|
|
11
|
+
router,
|
|
12
|
+
getSchema: () => getSchema(),
|
|
13
|
+
getCatalog: service.getCatalog,
|
|
14
|
+
createCheckout: service.createCheckout,
|
|
15
|
+
verifyCheckout: service.verifyCheckout,
|
|
16
|
+
cancelSubscription: service.cancelSubscription,
|
|
17
|
+
changeSubscription: service.changeSubscription,
|
|
18
|
+
resumeSubscription: service.resumeSubscription,
|
|
19
|
+
refundCharge: service.refundCharge,
|
|
20
|
+
syncSubscription: service.syncSubscription,
|
|
21
|
+
restorePurchases: service.restorePurchases,
|
|
22
|
+
getEntitlements: service.getEntitlements,
|
|
23
|
+
getUsage: service.getUsage,
|
|
24
|
+
handleWebhook: service.handleWebhook,
|
|
25
|
+
enqueueReconciliationJob: service.enqueueReconciliationJob,
|
|
26
|
+
getReconciliationJob: service.getReconciliationJob,
|
|
27
|
+
runReconciliationJob: service.runReconciliationJob,
|
|
28
|
+
subscriptionProvider: service.subscriptionProvider,
|
|
29
|
+
quotaProvider: service.quotaProvider
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAInD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,gCAAgC,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO;QACL,MAAM;QACN,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,wBAAwB,EAAE,OAAO,CAAC,wBAAwB;QAC1D,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;QAClD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;QAClD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;QAClD,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC;AACJ,CAAC"}
|
package/dist/router.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,YAAY,CAAC;AAuBhE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,8CA0VtD"}
|