@wdft/micropayments-sdk 0.0.1 → 0.0.3

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,140 @@
1
+ import { describe, it } from "vitest";
2
+ import { expect } from "vitest";
3
+ import { Client } from "./client.js";
4
+ import { mockFetch } from "./test_utils/mock_fetcher.js";
5
+ describe("client e2e", () => {
6
+ const mock = mockFetch();
7
+ const client = Client.new({
8
+ currency: "PLN",
9
+ tenant_id: "my-tenant",
10
+ endpoint: "http://localhost:8787",
11
+ fetcher: mock.fetcher.bind(mock),
12
+ retry_ms: 100,
13
+ });
14
+ it("initialized -> waiting x2 -> resolved", async () => {
15
+ await new Promise((resolve, reject) => {
16
+ mock.next(200, {
17
+ click_url: "mock_click_url",
18
+ incoming_message_device: "mock_num",
19
+ expires_at: Date.now() + 30000,
20
+ commitment_id: "sample_commitment_id",
21
+ });
22
+ mock.next(200, {
23
+ message: "waiting for sms",
24
+ status: "waiting",
25
+ commitment_id: "sample_commitment_id",
26
+ });
27
+ mock.next(200, {
28
+ message: "waiting for sms",
29
+ status: "waiting",
30
+ commitment_id: "sample_commitment_id",
31
+ });
32
+ mock.next(200, {
33
+ message: "waiting for sms",
34
+ status: "resolved",
35
+ commitment_id: "sample_commitment_id",
36
+ });
37
+ // Sync with Events
38
+ client.create("my-ref", 10, (error, payload) => {
39
+ if (!payload || error) {
40
+ console.log(error);
41
+ reject(error);
42
+ return;
43
+ }
44
+ const { status } = payload;
45
+ switch (status) {
46
+ case "waiting":
47
+ case "created":
48
+ case "duplicated":
49
+ case "expired":
50
+ console.log(payload);
51
+ break;
52
+ case "resolved":
53
+ resolve(status);
54
+ }
55
+ });
56
+ });
57
+ });
58
+ it("initialized -> expired", async () => {
59
+ await expect(new Promise((resolve, reject) => {
60
+ mock.next(200, {
61
+ click_url: "mock_click_url",
62
+ incoming_message_device: "mock_num",
63
+ expires_at: Date.now() + 30000,
64
+ commitment_id: "sample_commitment_id",
65
+ });
66
+ mock.next(200, {
67
+ message: "waiting for sms",
68
+ status: "waiting",
69
+ commitment_id: "sample_commitment_id",
70
+ });
71
+ mock.next(200, {
72
+ message: "waiting for sms",
73
+ status: "waiting",
74
+ commitment_id: "sample_commitment_id",
75
+ });
76
+ mock.next(410, {
77
+ message: "commitment expired",
78
+ status: "expired",
79
+ commitment_id: "sample_commitment_id",
80
+ });
81
+ // Sync with Events
82
+ client.create("my-ref", 10, (error, payload) => {
83
+ if (!payload || error) {
84
+ reject(error);
85
+ return;
86
+ }
87
+ const { status } = payload;
88
+ switch (status) {
89
+ case "waiting":
90
+ case "created":
91
+ case "duplicated":
92
+ break;
93
+ case "expired":
94
+ reject(status);
95
+ break;
96
+ case "resolved":
97
+ resolve(status);
98
+ break;
99
+ }
100
+ });
101
+ })).rejects.toBe("expired");
102
+ });
103
+ it("initialized -> duplicated", async () => {
104
+ await expect(new Promise((resolve, reject) => {
105
+ mock.next(200, {
106
+ click_url: "mock_click_url",
107
+ incoming_message_device: "mock_num",
108
+ expires_at: Date.now() + 30000,
109
+ commitment_id: "sample_commitment_id",
110
+ });
111
+ mock.next(200, {
112
+ message: "waiting for sms",
113
+ status: "duplicated",
114
+ commitment_id: "sample_commitment_id",
115
+ });
116
+ // Sync with Events
117
+ client.create("my-ref", 10, (error, payload) => {
118
+ if (!payload || error) {
119
+ reject(error);
120
+ return;
121
+ }
122
+ const { status } = payload;
123
+ switch (status) {
124
+ case "waiting":
125
+ case "created":
126
+ case "duplicated":
127
+ resolve(status);
128
+ break;
129
+ case "expired":
130
+ reject(status);
131
+ break;
132
+ case "resolved":
133
+ resolve(status);
134
+ break;
135
+ }
136
+ });
137
+ })).resolves.toBe("duplicated");
138
+ });
139
+ });
140
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ICallback } from "./client.js";
2
+ import type { Fetcher } from "./service.js";
3
+ export interface IGetViaMsgInit {
4
+ reference_id: string;
5
+ amount: number;
6
+ currency: "PLN" | "EUR" | "GBP" | "USD" | "CHF" | string;
7
+ tenant_id: string;
8
+ endpoint?: string;
9
+ fetcher?: Fetcher;
10
+ retry_ms?: number;
11
+ }
12
+ export declare function getViaMsg(init: IGetViaMsgInit, callback: ICallback): void;
package/dist/index.js.map CHANGED
@@ -1,7 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/service.ts", "../src/client.ts", "../src/index.ts"],
4
- "sourcesContent": ["interface CustomResponse {\n status: number;\n error: boolean;\n}\n\ninterface SuccessResponse<T> extends CustomResponse {\n error: false;\n message: null;\n data: T;\n}\n\ninterface ErrorResponse extends CustomResponse {\n error: true;\n message: string;\n data: null;\n}\n\ninterface ICommitment {\n click_url: string;\n incoming_message_device: string;\n expires_at: number;\n commitment_id: string;\n}\n\ntype ResponseDTO<T> = SuccessResponse<T> | ErrorResponse;\n\nasync function parseResponse<T = unknown>(\n response: Response,\n): Promise<T> {\n if (response.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n return await response.json() as T;\n } else {\n return await response.text() as T;\n }\n}\n\nexport type Fetcher = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nasync function request<T = unknown>(\n path: string,\n req: RequestInit,\n fetcher: Fetcher,\n): Promise<ResponseDTO<T | null>> {\n try {\n const response = await fetcher(new Request(path, req));\n if (response.ok) {\n return {\n status: response.status,\n error: false,\n data: await parseResponse(response) as T,\n } as ResponseDTO<T>;\n } else {\n const errorPayload = await parseResponse(response);\n return {\n status: response.status,\n error: errorPayload && typeof errorPayload === \"object\" &&\n \"error\" in errorPayload\n ? errorPayload.error\n : true,\n message: errorPayload && typeof errorPayload === \"object\" &&\n \"message\" in errorPayload\n ? errorPayload.message\n : response.statusText,\n data: null,\n } as ResponseDTO<T>;\n }\n } catch (error) {\n return {\n status: 500,\n error: true,\n message: error instanceof Error ? error.message : `${error}`,\n data: null,\n } as ErrorResponse;\n }\n}\n\nfunction buildUrl(endpoint: string, path: string) {\n const validEndpoint = endpoint.endsWith(\"/\")\n ? endpoint.substring(0, endpoint.length - 1)\n : endpoint;\n const validPath = path.startsWith(\"/\") ? path : \"/\".concat(path);\n return validEndpoint + validPath;\n}\n\nexport interface IServiceOptions {\n tenant_id: string;\n endpoint: string;\n fetcher?: Fetcher;\n}\n\nexport interface ICommitmentStatus {\n commitment_id: string;\n status: string;\n message: string;\n}\n\nexport class Service {\n private readonly fetcher: Fetcher;\n\n constructor(private readonly options: IServiceOptions) {\n if (!options.fetcher && !globalThis.fetch) {\n throw new Error(\n 'fetch is not available in environment, pass \"fetcher\" option with satisfies fetch interface',\n );\n }\n\n this.fetcher = this.options.fetcher ?? globalThis.fetch;\n }\n\n async createCommitment(\n reference_id: string,\n amount: number,\n currency: string,\n ): Promise<ICommitment> {\n const response = await request<ICommitment>(\n buildUrl(this.options.endpoint, \"/commitment\"),\n {\n method: \"POST\",\n body: JSON.stringify({\n tenant_id: this.options.tenant_id,\n reference_id,\n currency: currency,\n amount,\n }),\n },\n this.fetcher,\n );\n\n if (response.error) {\n throw new Error(response.message);\n }\n\n if (!response.data) {\n throw new Error(\"Bad response\");\n }\n\n return response.data;\n }\n\n async checkCommitment(\n commitment: string,\n ): Promise<ICommitmentStatus> {\n const response = await request<ICommitmentStatus>(\n buildUrl(this.options.endpoint, `/commitment/${commitment}`),\n {\n method: \"GET\",\n },\n this.fetcher,\n );\n\n switch (response.status) {\n case 410:\n return {\n commitment_id: commitment,\n message: response.message || \"Expired\",\n status: \"expired\",\n };\n }\n\n if (response.error) {\n throw new Error(response.message);\n }\n\n if (!response.data) {\n throw new Error(\"Bad response\");\n }\n\n return response.data;\n }\n}\n", "import { type IServiceOptions, Service } from \"./service.js\";\n\ninterface ICommitmentPayload {\n commitment_id: string;\n amount: number;\n currency: string;\n reference_id: string;\n expires_at: number;\n click_url: string;\n retry_ms: number;\n message: string;\n status: CommitmentStatus;\n}\n\nexport type CommitmentStatus =\n | \"initializing\"\n | \"created\"\n | \"waiting\"\n | \"expired\"\n | \"resolved\"\n | \"duplicated\";\n\nexport type ICommitmentPayloadSimple = Omit<\n ICommitmentPayload,\n \"status\" | \"message\"\n>;\n\nclass Commitment {\n private readonly payload: ICommitmentPayload;\n\n constructor(\n private readonly service: Service,\n payload: ICommitmentPayloadSimple,\n private readonly options: ICommitmentOptions,\n ) {\n this.payload = {\n message: \"Creating...\",\n status: \"initializing\",\n ...payload,\n };\n\n if (this.options.onCreated) {\n this.options.onCreated(this);\n }\n }\n\n isExpired() {\n return Date.now() > this.payload.expires_at;\n }\n\n isResolved() {\n return this.getStatus() === \"resolved\";\n }\n\n getStatus(): CommitmentStatus {\n return this.payload.status;\n }\n\n getClickUrl() {\n return this.payload.click_url;\n }\n\n getAmount() {\n return this.payload.amount;\n }\n\n getCurrency() {\n return this.payload.currency;\n }\n\n getReferenceId() {\n return this.payload.reference_id;\n }\n\n getCommitmentId() {\n return this.payload.commitment_id;\n }\n\n markAsCreated() {\n if (this.payload.status === \"created\") {\n return;\n }\n\n this.payload.status = \"created\";\n\n if (this.options.onCreated) {\n this.options.onCreated(this);\n }\n }\n\n markAsDuplicated() {\n if (this.payload.status === \"duplicated\") {\n this.stopChecking();\n return;\n }\n\n this.payload.status = \"duplicated\";\n\n this.stopChecking();\n if (this.options.onDuplicated) {\n this.options.onDuplicated(this);\n }\n }\n\n markAsWaiting() {\n if (this.payload.status === \"waiting\") {\n return;\n }\n\n this.payload.status = \"waiting\";\n\n if (this.options.onWaiting) {\n this.options.onWaiting(this);\n }\n }\n\n markAsExpired() {\n if (this.payload.status === \"expired\") {\n this.stopChecking();\n return;\n }\n\n this.payload.status = \"expired\";\n\n if (this.options.onExpired) {\n this.options.onExpired(this);\n }\n\n this.stopChecking();\n }\n\n markAsResolved() {\n if (this.payload.status === \"resolved\") {\n this.stopChecking();\n return;\n }\n\n this.payload.status = \"resolved\";\n\n this.stopChecking();\n\n if (this.options.onResolved) {\n this.options.onResolved(this);\n }\n }\n\n private retries = 0;\n private currentTimer: number | null = null;\n\n getNextCallTime() {\n this.retries++;\n return Math.min(\n 5000,\n this.payload.retry_ms + (this.payload.retry_ms * (this.retries / 10)),\n );\n }\n\n startChecking() {\n if (this.currentCheck) {\n return;\n }\n\n this.currentCheck = this.check().then((status) => {\n const nextTime = this.getNextCallTime();\n if (status === \"waiting\") {\n this.currentTimer = setTimeout(\n () => this.startChecking(),\n nextTime,\n ) as unknown as number;\n }\n return status;\n }).finally(() => {\n this.stopChecking(false);\n });\n }\n\n stopChecking(withTimer = true) {\n this.currentCheck = null;\n if (this.currentTimer && withTimer) {\n clearTimeout(this.currentTimer);\n }\n }\n\n private currentCheck: Promise<CommitmentStatus> | null = null;\n\n async check(): Promise<CommitmentStatus> {\n if (this.isExpired()) {\n this.markAsExpired();\n return this.getStatus();\n }\n\n if (this.isResolved()) {\n this.markAsResolved();\n return this.getStatus();\n }\n\n try {\n const status = await this.service.checkCommitment(this.getCommitmentId());\n\n switch (status.status) {\n case \"duplicated\": {\n this.markAsDuplicated();\n break;\n }\n case \"expired\": {\n this.markAsExpired();\n break;\n }\n case \"resolved\": {\n this.markAsResolved();\n break;\n }\n case \"waiting\": {\n this.markAsWaiting();\n break;\n }\n }\n\n if (this.options.onCheck) {\n this.options.onCheck(this);\n }\n } catch (error) {\n if (this.options.onError) {\n this.options.onError(error as Error, this);\n this.stopChecking();\n } else {\n throw error;\n }\n }\n\n return this.getStatus();\n }\n}\n\ninterface IClientOptions {\n currency: string;\n retry_ms?: number;\n}\n\ninterface INewClientOptions extends IClientOptions, IServiceOptions {\n}\n\ninterface ICommitmentOptions {\n currency?: string;\n retry_ms?: number;\n onCreated?: (commitment: Commitment) => void;\n onResolved?: (commitment: Commitment) => void;\n onError?: (error: Error, commitment: Commitment) => void;\n onExpired?: (commitment: Commitment) => void;\n onDuplicated?: (commitment: Commitment) => void;\n onCheck?: (commitment: Commitment) => void;\n onWaiting?: (commitment: Commitment) => void;\n}\n\nexport class Client {\n static new(opts: INewClientOptions) {\n return new Client(new Service(opts), opts);\n }\n\n constructor(\n private readonly svc: Service,\n private readonly options: IClientOptions,\n ) {\n }\n\n async createDirect(\n reference_id: string,\n amount: number,\n options: ICommitmentOptions = {},\n ): Promise<Commitment> {\n const curr = options.currency ?? this.options.currency;\n const response = await this.svc.createCommitment(\n reference_id,\n amount,\n curr,\n );\n\n return new Commitment(\n this.svc,\n {\n commitment_id: response.commitment_id,\n amount: amount,\n currency: curr,\n reference_id: reference_id,\n expires_at: response.expires_at,\n click_url: response.click_url,\n retry_ms: this.options.retry_ms ?? 1000,\n },\n options,\n );\n }\n\n create(\n reference_id: string,\n amount: number,\n on: ICallback,\n ) {\n const builder = this.commitmentBuilder()\n .setAmount(amount)\n .setCurrency(this.options.currency)\n .setReference(reference_id);\n\n if (this.options.retry_ms) {\n builder.setRetryTime(this.options.retry_ms);\n }\n\n builder\n .onCreated((commitment) => {\n commitment.startChecking();\n return on(null, {\n status: commitment.getStatus(),\n reference_id,\n commitment_id: commitment.getCommitmentId(),\n click_url: commitment.getClickUrl(),\n });\n })\n .onWaiting((commitment) =>\n on(null, {\n status: commitment.getStatus(),\n reference_id,\n commitment_id: commitment.getCommitmentId(),\n click_url: commitment.getClickUrl(),\n })\n )\n .onDuplicated((commitment) =>\n on(null, {\n status: commitment.getStatus(),\n reference_id,\n commitment_id: commitment.getCommitmentId(),\n click_url: commitment.getClickUrl(),\n })\n )\n .onExpired((commitment) =>\n on(null, {\n status: commitment.getStatus(),\n reference_id,\n commitment_id: commitment.getCommitmentId(),\n click_url: commitment.getClickUrl(),\n })\n )\n .onResolved((commitment) =>\n on(null, {\n status: commitment.getStatus(),\n reference_id,\n commitment_id: commitment.getCommitmentId(),\n click_url: commitment.getClickUrl(),\n })\n )\n .onError((error, commitment) => {\n commitment?.stopChecking();\n on(error, null);\n })\n .exec();\n }\n\n commitmentBuilder(): CommitmentObservabileBuilder {\n return new CommitmentObservabileBuilder(this);\n }\n}\n\nexport interface CallbackPayload {\n status: CommitmentStatus;\n reference_id: string;\n commitment_id: string;\n click_url: string;\n}\n\ntype OnStatusCallback = (error: null, payload: CallbackPayload) => void;\ntype OnStatusErrorCallback = (error: Error, payload: null) => void;\nexport type ICallback = OnStatusCallback & OnStatusErrorCallback;\n\nclass CommitmentObservabileBuilder {\n private _reference_id: string | undefined;\n private _amount: number | undefined;\n private _retry_ms: number = 1000;\n private _currency: string | undefined;\n\n private _onCreatedFn: (commitment: Commitment) => void = () => {};\n private _onResolvedFn: (commitment: Commitment) => void = () => {};\n private _onErrorFn: (error: Error, commitment?: Commitment) => void =\n () => {};\n private _onExpiredFn: (commitment: Commitment) => void = () => {};\n private _onDuplicatedFn: (commitment: Commitment) => void = () => {};\n private _onCheckFn: (commitment: Commitment) => void = () => {};\n private _onWaitingFn: (commitment: Commitment) => void = () => {};\n\n constructor(private readonly client: Client) {\n }\n\n setRetryTime(retry: number) {\n this._retry_ms = retry;\n return this;\n }\n\n setAmount(amount: number) {\n this._amount = amount;\n return this;\n }\n\n setReference(reference: string) {\n this._reference_id = reference;\n return this;\n }\n\n setCurrency(currency: string) {\n this._currency = currency;\n return this;\n }\n\n onCreated(cb: (commitment: Commitment) => void) {\n this._onCreatedFn = cb;\n return this;\n }\n\n onResolved(cb: (commitment: Commitment) => void) {\n this._onResolvedFn = cb;\n return this;\n }\n\n onExpired(cb: (commitment: Commitment) => void) {\n this._onExpiredFn = cb;\n return this;\n }\n\n onError(cb: (error: Error, commitment?: Commitment) => void) {\n this._onErrorFn = cb;\n return this;\n }\n\n onDuplicated(cb: (commitment: Commitment) => void) {\n this._onDuplicatedFn = cb;\n return this;\n }\n\n onCheck(cb: (commitment: Commitment) => void) {\n this._onCheckFn = cb;\n return this;\n }\n\n onWaiting(cb: (commitment: Commitment) => void) {\n this._onWaitingFn = cb;\n return this;\n }\n\n exec() {\n if (!this._reference_id) {\n throw new Error(\"reference_id must be defined\");\n }\n\n if (!this._amount) {\n throw new Error(\"amount must be defined\");\n }\n\n if (!this._currency) {\n throw new Error(\"currency must be defined\");\n }\n\n this.client.createDirect(this._reference_id, this._amount, {\n retry_ms: this._retry_ms,\n currency: this._currency,\n onCheck: this._onCheckFn,\n onCreated: this._onCreatedFn,\n onDuplicated: this._onDuplicatedFn,\n onError: this._onErrorFn,\n onExpired: this._onExpiredFn,\n onWaiting: this._onWaitingFn,\n onResolved: this._onResolvedFn,\n }).catch((error) => {\n if (this._onErrorFn) {\n this._onErrorFn(error);\n } else {\n throw error;\n }\n });\n }\n}\n\nexport type { Commitment };\n", "import type { Fetcher } from \"./service.js\";\nimport type { ICallback } from \"./client.js\";\n\nimport { Client } from \"./client.js\";\n\nexport interface IGetViaMsgInit {\n reference_id: string;\n amount: number;\n currency: \"PLN\" | \"EUR\" | \"GBP\" | \"USD\" | \"CHF\" | string;\n tenant_id: string;\n endpoint?: string;\n fetcher?: Fetcher;\n retry_ms?: number;\n}\n\nexport function getViaMsg(init: IGetViaMsgInit, callback: ICallback) {\n const client = Client.new({\n currency: init.currency,\n endpoint: init.endpoint ?? \"https://api.micropayments.wdft.ovh/\",\n tenant_id: init.tenant_id,\n fetcher: init.fetcher ?? fetch,\n retry_ms: init.retry_ms ?? 1000,\n });\n\n client.create(init.reference_id, init.amount, callback);\n}\n"],
5
- "mappings": "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",
6
- "names": ["parseResponse", "response", "request", "path", "req", "fetcher", "errorPayload", "error", "buildUrl", "endpoint", "validEndpoint", "validPath", "Service", "options", "reference_id", "amount", "currency", "commitment", "Commitment", "service", "payload", "options", "status", "nextTime", "withTimer", "error", "Client", "_Client", "svc", "opts", "Service", "reference_id", "amount", "curr", "response", "on", "builder", "commitment", "CommitmentObservabileBuilder", "client", "retry", "reference", "currency", "cb", "getViaMsg", "init", "callback", "Client"]
7
- }
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAYrC,MAAM,UAAU,SAAS,CAAC,IAAoB,EAAE,QAAmB;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;QACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,qCAAqC;QAChE,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;QAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;KAC/B,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,56 @@
1
+ import { it } from "vitest";
2
+ import { getViaMsg } from "./index.js";
3
+ import { mockFetch } from "./test_utils/mock_fetcher.js";
4
+ it("getViaMsg", async () => {
5
+ const mock = mockFetch();
6
+ await new Promise((resolve, reject) => {
7
+ mock.next(200, {
8
+ click_url: "mock_click_url",
9
+ incoming_message_device: "mock_num",
10
+ expires_at: Date.now() + 30000,
11
+ commitment_id: "sample_commitment_id",
12
+ });
13
+ mock.next(200, {
14
+ message: "waiting for sms",
15
+ status: "waiting",
16
+ commitment_id: "sample_commitment_id",
17
+ });
18
+ mock.next(200, {
19
+ message: "waiting for sms",
20
+ status: "waiting",
21
+ commitment_id: "sample_commitment_id",
22
+ });
23
+ mock.next(200, {
24
+ message: "waiting for sms",
25
+ status: "resolved",
26
+ commitment_id: "sample_commitment_id",
27
+ });
28
+ getViaMsg({
29
+ amount: 10,
30
+ reference_id: "ref",
31
+ currency: "PLN",
32
+ tenant_id: "my-tenant",
33
+ endpoint: "http://localhost:8787",
34
+ fetcher: mock.fetcher.bind(mock),
35
+ retry_ms: 100,
36
+ }, (error, payload) => {
37
+ if (!payload || error) {
38
+ console.log(error);
39
+ reject(error);
40
+ return;
41
+ }
42
+ const { status } = payload;
43
+ switch (status) {
44
+ case "waiting":
45
+ case "created":
46
+ case "duplicated":
47
+ case "expired":
48
+ console.log(payload);
49
+ break;
50
+ case "resolved":
51
+ resolve(status);
52
+ }
53
+ });
54
+ });
55
+ });
56
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;IAC1B,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACd,SAAS,EAAE,gBAAgB;YAC3B,uBAAuB,EAAE,UAAU;YACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAM;YAC/B,aAAa,EAAE,sBAAsB;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,sBAAsB;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,sBAAsB;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,UAAU;YAClB,aAAa,EAAE,sBAAsB;SACrC,CAAC,CAAC;QAEH,SAAS,CACR;YACC,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,WAAW;YACtB,QAAQ,EAAE,uBAAuB;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAChC,QAAQ,EAAE,GAAG;SACb,EACD,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAClB,IAAI,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACnB,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACR,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YAE3B,QAAQ,MAAM,EAAE,CAAC;gBAChB,KAAK,SAAS,CAAC;gBACf,KAAK,SAAS,CAAC;gBACf,KAAK,YAAY,CAAC;gBAClB,KAAK,SAAS;oBACb,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACrB,MAAM;gBACP,KAAK,UAAU;oBACd,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACF,CAAC,CACD,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ import { it } from "vitest";
2
+ import { expect } from "vitest";
3
+ import { mockFetch } from "./test_utils/mock_fetcher.js";
4
+ it("mocking works", async () => {
5
+ const mock = mockFetch();
6
+ mock.next(200, {
7
+ test: 123,
8
+ });
9
+ const response = await mock.fetcher();
10
+ expect(response.status).toBe(200);
11
+ expect(await response.json()).toMatchObject({
12
+ test: 123,
13
+ });
14
+ });
15
+ //# sourceMappingURL=mock_fetcher.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock_fetcher.test.js","sourceRoot":"","sources":["../src/mock_fetcher.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;IAC9B,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QACd,IAAI,EAAE,GAAG;KACT,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IAEtC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC;QAC3C,IAAI,EAAE,GAAG;KACT,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ interface ICommitment {
2
+ click_url: string;
3
+ incoming_message_device: string;
4
+ expires_at: number;
5
+ commitment_id: string;
6
+ }
7
+ export type Fetcher = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
8
+ export interface IServiceOptions {
9
+ tenant_id: string;
10
+ endpoint: string;
11
+ fetcher?: Fetcher;
12
+ }
13
+ export interface ICommitmentStatus {
14
+ commitment_id: string;
15
+ status: string;
16
+ message: string;
17
+ }
18
+ export declare class Service {
19
+ private readonly options;
20
+ private readonly fetcher;
21
+ constructor(options: IServiceOptions);
22
+ createCommitment(reference_id: string, amount: number, currency: string): Promise<ICommitment>;
23
+ checkCommitment(commitment: string): Promise<ICommitmentStatus>;
24
+ }
25
+ export {};
@@ -1,7 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/service.ts"],
4
- "sourcesContent": ["interface CustomResponse {\n status: number;\n error: boolean;\n}\n\ninterface SuccessResponse<T> extends CustomResponse {\n error: false;\n message: null;\n data: T;\n}\n\ninterface ErrorResponse extends CustomResponse {\n error: true;\n message: string;\n data: null;\n}\n\ninterface ICommitment {\n click_url: string;\n incoming_message_device: string;\n expires_at: number;\n commitment_id: string;\n}\n\ntype ResponseDTO<T> = SuccessResponse<T> | ErrorResponse;\n\nasync function parseResponse<T = unknown>(\n response: Response,\n): Promise<T> {\n if (response.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n return await response.json() as T;\n } else {\n return await response.text() as T;\n }\n}\n\nexport type Fetcher = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nasync function request<T = unknown>(\n path: string,\n req: RequestInit,\n fetcher: Fetcher,\n): Promise<ResponseDTO<T | null>> {\n try {\n const response = await fetcher(new Request(path, req));\n if (response.ok) {\n return {\n status: response.status,\n error: false,\n data: await parseResponse(response) as T,\n } as ResponseDTO<T>;\n } else {\n const errorPayload = await parseResponse(response);\n return {\n status: response.status,\n error: errorPayload && typeof errorPayload === \"object\" &&\n \"error\" in errorPayload\n ? errorPayload.error\n : true,\n message: errorPayload && typeof errorPayload === \"object\" &&\n \"message\" in errorPayload\n ? errorPayload.message\n : response.statusText,\n data: null,\n } as ResponseDTO<T>;\n }\n } catch (error) {\n return {\n status: 500,\n error: true,\n message: error instanceof Error ? error.message : `${error}`,\n data: null,\n } as ErrorResponse;\n }\n}\n\nfunction buildUrl(endpoint: string, path: string) {\n const validEndpoint = endpoint.endsWith(\"/\")\n ? endpoint.substring(0, endpoint.length - 1)\n : endpoint;\n const validPath = path.startsWith(\"/\") ? path : \"/\".concat(path);\n return validEndpoint + validPath;\n}\n\nexport interface IServiceOptions {\n tenant_id: string;\n endpoint: string;\n fetcher?: Fetcher;\n}\n\nexport interface ICommitmentStatus {\n commitment_id: string;\n status: string;\n message: string;\n}\n\nexport class Service {\n private readonly fetcher: Fetcher;\n\n constructor(private readonly options: IServiceOptions) {\n if (!options.fetcher && !globalThis.fetch) {\n throw new Error(\n 'fetch is not available in environment, pass \"fetcher\" option with satisfies fetch interface',\n );\n }\n\n this.fetcher = this.options.fetcher ?? globalThis.fetch;\n }\n\n async createCommitment(\n reference_id: string,\n amount: number,\n currency: string,\n ): Promise<ICommitment> {\n const response = await request<ICommitment>(\n buildUrl(this.options.endpoint, \"/commitment\"),\n {\n method: \"POST\",\n body: JSON.stringify({\n tenant_id: this.options.tenant_id,\n reference_id,\n currency: currency,\n amount,\n }),\n },\n this.fetcher,\n );\n\n if (response.error) {\n throw new Error(response.message);\n }\n\n if (!response.data) {\n throw new Error(\"Bad response\");\n }\n\n return response.data;\n }\n\n async checkCommitment(\n commitment: string,\n ): Promise<ICommitmentStatus> {\n const response = await request<ICommitmentStatus>(\n buildUrl(this.options.endpoint, `/commitment/${commitment}`),\n {\n method: \"GET\",\n },\n this.fetcher,\n );\n\n switch (response.status) {\n case 410:\n return {\n commitment_id: commitment,\n message: response.message || \"Expired\",\n status: \"expired\",\n };\n }\n\n if (response.error) {\n throw new Error(response.message);\n }\n\n if (!response.data) {\n throw new Error(\"Bad response\");\n }\n\n return response.data;\n }\n}\n"],
5
- "mappings": "AA0BA,eAAeA,EACbC,EACY,CACZ,OAAIA,EAAS,QAAQ,IAAI,cAAc,GAAG,SAAS,kBAAkB,EAC5D,MAAMA,EAAS,KAAK,EAEpB,MAAMA,EAAS,KAAK,CAE/B,CAOA,eAAeC,EACbC,EACAC,EACAC,EACgC,CAChC,GAAI,CACF,IAAMJ,EAAW,MAAMI,EAAQ,IAAI,QAAQF,EAAMC,CAAG,CAAC,EACrD,GAAIH,EAAS,GACX,MAAO,CACL,OAAQA,EAAS,OACjB,MAAO,GACP,KAAM,MAAMD,EAAcC,CAAQ,CACpC,EACK,CACL,IAAMK,EAAe,MAAMN,EAAcC,CAAQ,EACjD,MAAO,CACL,OAAQA,EAAS,OACjB,MAAOK,GAAgB,OAAOA,GAAiB,UAC3C,UAAWA,EACXA,EAAa,MACb,GACJ,QAASA,GAAgB,OAAOA,GAAiB,UAC7C,YAAaA,EACbA,EAAa,QACbL,EAAS,WACb,KAAM,IACR,CACF,CACF,OAASM,EAAO,CACd,MAAO,CACL,OAAQ,IACR,MAAO,GACP,QAASA,aAAiB,MAAQA,EAAM,QAAU,GAAGA,CAAK,GAC1D,KAAM,IACR,CACF,CACF,CAEA,SAASC,EAASC,EAAkBN,EAAc,CAChD,IAAMO,EAAgBD,EAAS,SAAS,GAAG,EACvCA,EAAS,UAAU,EAAGA,EAAS,OAAS,CAAC,EACzCA,EACEE,EAAYR,EAAK,WAAW,GAAG,EAAIA,EAAO,IAAI,OAAOA,CAAI,EAC/D,OAAOO,EAAgBC,CACzB,CAcO,IAAMC,EAAN,KAAc,CAGnB,YAA6BC,EAA0B,CAA1B,aAAAA,EAC3B,GAAI,CAACA,EAAQ,SAAW,CAAC,WAAW,MAClC,MAAM,IAAI,MACR,6FACF,EAGF,KAAK,QAAU,KAAK,QAAQ,SAAW,WAAW,KACpD,CAEA,MAAM,iBACJC,EACAC,EACAC,EACsB,CACtB,IAAMf,EAAW,MAAMC,EACrBM,EAAS,KAAK,QAAQ,SAAU,aAAa,EAC7C,CACE,OAAQ,OACR,KAAM,KAAK,UAAU,CACnB,UAAW,KAAK,QAAQ,UACxB,aAAAM,EACA,SAAUE,EACV,OAAAD,CACF,CAAC,CACH,EACA,KAAK,OACP,EAEA,GAAId,EAAS,MACX,MAAM,IAAI,MAAMA,EAAS,OAAO,EAGlC,GAAI,CAACA,EAAS,KACZ,MAAM,IAAI,MAAM,cAAc,EAGhC,OAAOA,EAAS,IAClB,CAEA,MAAM,gBACJgB,EAC4B,CAC5B,IAAMhB,EAAW,MAAMC,EACrBM,EAAS,KAAK,QAAQ,SAAU,eAAeS,CAAU,EAAE,EAC3D,CACE,OAAQ,KACV,EACA,KAAK,OACP,EAEA,OAAQhB,EAAS,OAAQ,CACvB,IAAK,KACH,MAAO,CACL,cAAegB,EACf,QAAShB,EAAS,SAAW,UAC7B,OAAQ,SACV,CACJ,CAEA,GAAIA,EAAS,MACX,MAAM,IAAI,MAAMA,EAAS,OAAO,EAGlC,GAAI,CAACA,EAAS,KACZ,MAAM,IAAI,MAAM,cAAc,EAGhC,OAAOA,EAAS,IAClB,CACF",
6
- "names": ["parseResponse", "response", "request", "path", "req", "fetcher", "errorPayload", "error", "buildUrl", "endpoint", "validEndpoint", "validPath", "Service", "options", "reference_id", "amount", "currency", "commitment"]
7
- }
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,44 @@
1
+ import { it } from "vitest";
2
+ import { expect } from "vitest";
3
+ import { Service } from "./service.js";
4
+ import { mockFetch } from "./test_utils/mock_fetcher.js";
5
+ it("service.createCommitment - 200 - resolved good data", async () => {
6
+ const mock = mockFetch();
7
+ const my = new Service({
8
+ endpoint: "http://localhost:8787",
9
+ tenant_id: "testing-dev-tenant",
10
+ fetcher: () => mock.fetcher(),
11
+ });
12
+ mock.next(200, {
13
+ click_url: "mock_click_url",
14
+ incoming_message_device: "mock_num",
15
+ expires_at: Date.now() + 30000,
16
+ commitment_id: "sample_commitment_id",
17
+ });
18
+ const commitment = await my.createCommitment("sample-content-id", 10, "PLN");
19
+ expect(commitment).toMatchObject({
20
+ click_url: "mock_click_url",
21
+ incoming_message_device: "mock_num",
22
+ commitment_id: "sample_commitment_id",
23
+ });
24
+ });
25
+ it("service.checkCommitment - 200 - resolved good data", async () => {
26
+ const mock = mockFetch();
27
+ const my = new Service({
28
+ endpoint: "http://localhost:8787",
29
+ tenant_id: "testing-dev-tenant",
30
+ fetcher: () => mock.fetcher(),
31
+ });
32
+ mock.next(200, {
33
+ message: "waiting for sms",
34
+ status: "waiting",
35
+ commitment_id: "sample_commitment_id",
36
+ });
37
+ const status = await my.checkCommitment("sample_commitment_id");
38
+ expect(status).toMatchObject({
39
+ message: "waiting for sms",
40
+ status: "waiting",
41
+ commitment_id: "sample_commitment_id",
42
+ });
43
+ });
44
+ //# sourceMappingURL=service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.test.js","sourceRoot":"","sources":["../src/service.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;IACpE,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC;QACtB,QAAQ,EAAE,uBAAuB;QACjC,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;KAC7B,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QACd,SAAS,EAAE,gBAAgB;QAC3B,uBAAuB,EAAE,UAAU;QACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAM;QAC/B,aAAa,EAAE,sBAAsB;KACrC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAE7E,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC;QAChC,SAAS,EAAE,gBAAgB;QAC3B,uBAAuB,EAAE,UAAU;QACnC,aAAa,EAAE,sBAAsB;KACrC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;IACnE,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC;QACtB,QAAQ,EAAE,uBAAuB;QACjC,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;KAC7B,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QACd,OAAO,EAAE,iBAAiB;QAC1B,MAAM,EAAE,SAAS;QACjB,aAAa,EAAE,sBAAsB;KACrC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;IAEhE,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;QAC5B,OAAO,EAAE,iBAAiB;QAC1B,MAAM,EAAE,SAAS;QACjB,aAAa,EAAE,sBAAsB;KACrC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const mockFetch: () => {
2
+ __responses: Response[];
3
+ next(status: number, body: null | string | object, headers?: object): void;
4
+ fetcher(): Promise<Response>;
5
+ };
@@ -1,2 +1,20 @@
1
- var n=()=>({__responses:[],next(e,t,s={}){this.__responses.push(new Response(typeof t=="object"?JSON.stringify(t):t,{status:e,headers:{"Content-Type":typeof t=="object"?"application/json":"plain/text",...s}}))},async fetcher(){let e=this.__responses.shift();if(!e)throw new Error("not found mock item");return e}});export{n as mockFetch};
2
- //# sourceMappingURL=mock_fetcher.js.map
1
+ export const mockFetch = () => ({
2
+ __responses: [],
3
+ next(status, body, headers = {}) {
4
+ this.__responses.push(new Response(typeof body === "object" ? JSON.stringify(body) : body, {
5
+ status,
6
+ headers: {
7
+ "Content-Type": typeof body === "object" ? "application/json" : "plain/text",
8
+ ...headers,
9
+ },
10
+ }));
11
+ },
12
+ async fetcher() {
13
+ const next = this.__responses.shift();
14
+ if (!next) {
15
+ throw new Error("not found mock item");
16
+ }
17
+ return next;
18
+ },
19
+ });
20
+ //# sourceMappingURL=mock_fetcher.js.map
@@ -1,7 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/test_utils/mock_fetcher.ts"],
4
- "sourcesContent": ["export const mockFetch = () => ({\n __responses: [] as Response[],\n next(status: number, body: null | string | object, headers: object = {}) {\n this.__responses.push(\n new Response(typeof body === \"object\" ? JSON.stringify(body) : body, {\n status,\n headers: {\n \"Content-Type\": typeof body === \"object\"\n ? \"application/json\"\n : \"plain/text\",\n ...headers,\n },\n }),\n );\n },\n async fetcher() {\n const next = this.__responses.shift();\n\n if (!next) {\n throw new Error(\"not found mock item\");\n }\n\n return next;\n },\n});\n"],
5
- "mappings": "AAAO,IAAMA,EAAY,KAAO,CAC9B,YAAa,CAAC,EACd,KAAKC,EAAgBC,EAA8BC,EAAkB,CAAC,EAAG,CACvE,KAAK,YAAY,KACf,IAAI,SAAS,OAAOD,GAAS,SAAW,KAAK,UAAUA,CAAI,EAAIA,EAAM,CACnE,OAAAD,EACA,QAAS,CACP,eAAgB,OAAOC,GAAS,SAC5B,mBACA,aACJ,GAAGC,CACL,CACF,CAAC,CACH,CACF,EACA,MAAM,SAAU,CACd,IAAMC,EAAO,KAAK,YAAY,MAAM,EAEpC,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,qBAAqB,EAGvC,OAAOA,CACT,CACF",
6
- "names": ["mockFetch", "status", "body", "headers", "next"]
7
- }
1
+ {"version":3,"file":"mock_fetcher.js","sourceRoot":"","sources":["../../src/test_utils/mock_fetcher.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC;IAC/B,WAAW,EAAE,EAAgB;IAC7B,IAAI,CAAC,MAAc,EAAE,IAA4B,EAAE,UAAkB,EAAE;QACtE,IAAI,CAAC,WAAW,CAAC,IAAI,CACpB,IAAI,QAAQ,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACpE,MAAM;YACN,OAAO,EAAE;gBACR,cAAc,EACb,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,YAAY;gBAC7D,GAAG,OAAO;aACV;SACD,CAAC,CACF,CAAC;IACH,CAAC;IACD,KAAK,CAAC,OAAO;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAEtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,13 +1,18 @@
1
1
  {
2
2
  "name": "@wdft/micropayments-sdk",
3
- "type": "module",
4
3
  "description": "wdft - we do fintech - micropayments sdk",
5
- "version": "0.0.1",
4
+ "version": "0.0.3",
5
+ "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "files": [
9
- "dist/**/*"
9
+ "dist/**/*",
10
+ "src/**/*"
10
11
  ],
12
+ "exports": {
13
+ ".": "./dist/index.js",
14
+ "./*": "./dist/*.js"
15
+ },
11
16
  "author": "Mateusz Worotyński <mateusz@wdft.ovh>",
12
17
  "license": "MIT",
13
18
  "devDependencies": {
@@ -21,7 +26,9 @@
21
26
  "vitest": "^3.2.4"
22
27
  },
23
28
  "scripts": {
24
- "build": "pnpm exec esbuild $(find src -path 'src/test_utils' -prune -o -name '*.ts' ! -name '*.test.ts' -print) --bundle --outdir=dist --minify --format=esm",
29
+ "build:types": "tsc -p tsconfig.json",
30
+ "build:js": "pnpm exec esbuild $(find src -path 'src/test_utils' -prune -o -name '*.ts' ! -name '*.test.ts' -print) --bundle --outdir=dist --minify --format=esm",
31
+ "build": "pnpm run build:types && pnpm run build:js",
25
32
  "fmt": "biome check --write ./src",
26
33
  "test": "vitest run",
27
34
  "release": "pnpm run build && changeset publish"
package/src/browser.ts ADDED
@@ -0,0 +1,5 @@
1
+ import QRCode from "qrcode";
2
+
3
+ export async function generateQRCode(text: string) {
4
+ return await QRCode.toDataURL(text, { errorCorrectionLevel: "L" });
5
+ }