@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.
@@ -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"}
@@ -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
@@ -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"}
@@ -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"}
@@ -0,0 +1,3 @@
1
+ import type { BillFnConfig } from './types.js';
2
+ export declare function createBillFnRouter(config: BillFnConfig): import("@superfunctions/http").Router<any>;
3
+ //# sourceMappingURL=router.d.ts.map
@@ -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"}