@shopware-ag/app-server-sdk 1.0.1 → 1.1.0
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/README.md +52 -41
- package/dist/commonjs/context-resolver.test.d.ts +2 -0
- package/dist/commonjs/context-resolver.test.d.ts.map +1 -0
- package/dist/commonjs/context-resolver.test.js +81 -0
- package/dist/commonjs/context-resolver.test.js.map +1 -0
- package/dist/commonjs/helper/app-actions.test.d.ts +2 -0
- package/dist/commonjs/helper/app-actions.test.d.ts.map +1 -0
- package/dist/commonjs/helper/app-actions.test.js +31 -0
- package/dist/commonjs/helper/app-actions.test.js.map +1 -0
- package/dist/commonjs/http-client.test.d.ts +2 -0
- package/dist/commonjs/http-client.test.d.ts.map +1 -0
- package/dist/commonjs/http-client.test.js +71 -0
- package/dist/commonjs/http-client.test.js.map +1 -0
- package/dist/commonjs/integration/bun-sqlite.d.ts +11 -0
- package/dist/commonjs/integration/bun-sqlite.d.ts.map +1 -0
- package/dist/commonjs/integration/bun-sqlite.js +60 -0
- package/dist/commonjs/integration/bun-sqlite.js.map +1 -0
- package/dist/commonjs/integration/bun-sqlite.test.d.ts +2 -0
- package/dist/commonjs/integration/bun-sqlite.test.d.ts.map +1 -0
- package/dist/commonjs/integration/bun-sqlite.test.js +24 -0
- package/dist/commonjs/integration/bun-sqlite.test.js.map +1 -0
- package/dist/commonjs/integration/cloudflare-kv.d.ts +20 -0
- package/dist/commonjs/integration/cloudflare-kv.d.ts.map +1 -0
- package/dist/commonjs/integration/cloudflare-kv.js +49 -0
- package/dist/commonjs/integration/cloudflare-kv.js.map +1 -0
- package/dist/commonjs/integration/cloudflare.test.d.ts +2 -0
- package/dist/commonjs/integration/cloudflare.test.d.ts.map +1 -0
- package/dist/commonjs/integration/cloudflare.test.js +39 -0
- package/dist/commonjs/integration/cloudflare.test.js.map +1 -0
- package/dist/commonjs/integration/deno-kv.d.ts +18 -0
- package/dist/commonjs/integration/deno-kv.d.ts.map +1 -0
- package/dist/commonjs/integration/deno-kv.js +52 -0
- package/dist/commonjs/integration/deno-kv.js.map +1 -0
- package/dist/commonjs/integration/deno.test.d.ts +2 -0
- package/dist/commonjs/integration/deno.test.d.ts.map +1 -0
- package/dist/commonjs/integration/deno.test.js +48 -0
- package/dist/commonjs/integration/deno.test.js.map +1 -0
- package/dist/commonjs/integration/dynamodb.d.ts +13 -0
- package/dist/commonjs/integration/dynamodb.d.ts.map +1 -0
- package/dist/commonjs/integration/dynamodb.js +73 -0
- package/dist/commonjs/integration/dynamodb.js.map +1 -0
- package/dist/commonjs/integration/dynamodb.test.d.ts +2 -0
- package/dist/commonjs/integration/dynamodb.test.d.ts.map +1 -0
- package/dist/commonjs/integration/dynamodb.test.js +132 -0
- package/dist/commonjs/integration/dynamodb.test.js.map +1 -0
- package/dist/commonjs/integration/hono.d.ts +29 -0
- package/dist/commonjs/integration/hono.d.ts.map +1 -0
- package/dist/commonjs/integration/hono.js +105 -0
- package/dist/commonjs/integration/hono.js.map +1 -0
- package/dist/commonjs/integration/hono.test.d.ts +2 -0
- package/dist/commonjs/integration/hono.test.d.ts.map +1 -0
- package/dist/commonjs/integration/hono.test.js +86 -0
- package/dist/commonjs/integration/hono.test.js.map +1 -0
- package/dist/commonjs/registration.test.d.ts +2 -0
- package/dist/commonjs/registration.test.d.ts.map +1 -0
- package/dist/commonjs/registration.test.js +59 -0
- package/dist/commonjs/registration.test.js.map +1 -0
- package/dist/commonjs/repository.test.d.ts +2 -0
- package/dist/commonjs/repository.test.d.ts.map +1 -0
- package/dist/commonjs/repository.test.js +32 -0
- package/dist/commonjs/repository.test.js.map +1 -0
- package/dist/commonjs/signer.test.d.ts +2 -0
- package/dist/commonjs/signer.test.d.ts.map +1 -0
- package/dist/commonjs/signer.test.js +25 -0
- package/dist/commonjs/signer.test.js.map +1 -0
- package/dist/esm/context-resolver.test.d.ts +2 -0
- package/dist/esm/context-resolver.test.d.ts.map +1 -0
- package/dist/esm/context-resolver.test.js +79 -0
- package/dist/esm/context-resolver.test.js.map +1 -0
- package/dist/esm/helper/app-actions.test.d.ts +2 -0
- package/dist/esm/helper/app-actions.test.d.ts.map +1 -0
- package/dist/esm/helper/app-actions.test.js +29 -0
- package/dist/esm/helper/app-actions.test.js.map +1 -0
- package/dist/esm/http-client.test.d.ts +2 -0
- package/dist/esm/http-client.test.d.ts.map +1 -0
- package/dist/esm/http-client.test.js +69 -0
- package/dist/esm/http-client.test.js.map +1 -0
- package/dist/esm/integration/bun-sqlite.d.ts +11 -0
- package/dist/esm/integration/bun-sqlite.d.ts.map +1 -0
- package/dist/esm/integration/bun-sqlite.js +56 -0
- package/dist/esm/integration/bun-sqlite.js.map +1 -0
- package/dist/esm/integration/bun-sqlite.test.d.ts +2 -0
- package/dist/esm/integration/bun-sqlite.test.d.ts.map +1 -0
- package/dist/esm/integration/bun-sqlite.test.js +22 -0
- package/dist/esm/integration/bun-sqlite.test.js.map +1 -0
- package/dist/esm/integration/cloudflare-kv.d.ts +20 -0
- package/dist/esm/integration/cloudflare-kv.d.ts.map +1 -0
- package/dist/esm/integration/cloudflare-kv.js +45 -0
- package/dist/esm/integration/cloudflare-kv.js.map +1 -0
- package/dist/esm/integration/cloudflare.test.d.ts +2 -0
- package/dist/esm/integration/cloudflare.test.d.ts.map +1 -0
- package/dist/esm/integration/cloudflare.test.js +37 -0
- package/dist/esm/integration/cloudflare.test.js.map +1 -0
- package/dist/esm/integration/deno-kv.d.ts +18 -0
- package/dist/esm/integration/deno-kv.d.ts.map +1 -0
- package/dist/esm/integration/deno-kv.js +48 -0
- package/dist/esm/integration/deno-kv.js.map +1 -0
- package/dist/esm/integration/deno.test.d.ts +2 -0
- package/dist/esm/integration/deno.test.d.ts.map +1 -0
- package/dist/esm/integration/deno.test.js +46 -0
- package/dist/esm/integration/deno.test.js.map +1 -0
- package/dist/esm/integration/dynamodb.d.ts +13 -0
- package/dist/esm/integration/dynamodb.d.ts.map +1 -0
- package/dist/esm/integration/dynamodb.js +69 -0
- package/dist/esm/integration/dynamodb.js.map +1 -0
- package/dist/esm/integration/dynamodb.test.d.ts +2 -0
- package/dist/esm/integration/dynamodb.test.d.ts.map +1 -0
- package/dist/esm/integration/dynamodb.test.js +130 -0
- package/dist/esm/integration/dynamodb.test.js.map +1 -0
- package/dist/esm/integration/hono.d.ts +29 -0
- package/dist/esm/integration/hono.d.ts.map +1 -0
- package/dist/esm/integration/hono.js +102 -0
- package/dist/esm/integration/hono.js.map +1 -0
- package/dist/esm/integration/hono.test.d.ts +2 -0
- package/dist/esm/integration/hono.test.d.ts.map +1 -0
- package/dist/esm/integration/hono.test.js +84 -0
- package/dist/esm/integration/hono.test.js.map +1 -0
- package/dist/esm/registration.test.d.ts +2 -0
- package/dist/esm/registration.test.d.ts.map +1 -0
- package/dist/esm/registration.test.js +57 -0
- package/dist/esm/registration.test.js.map +1 -0
- package/dist/esm/repository.test.d.ts +2 -0
- package/dist/esm/repository.test.d.ts.map +1 -0
- package/dist/esm/repository.test.js +30 -0
- package/dist/esm/repository.test.js.map +1 -0
- package/dist/esm/signer.test.d.ts +2 -0
- package/dist/esm/signer.test.d.ts.map +1 -0
- package/dist/esm/signer.test.js +23 -0
- package/dist/esm/signer.test.js.map +1 -0
- package/package.json +142 -63
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.test.js","sourceRoot":"","sources":["../../../src/integration/cloudflare.test.ts"],"names":[],"mappings":";;AAAA,EAAE;AACF,uCAAkD;AAClD,6EAAkF;AAClF,2DAAqD;AAErD,IAAA,mBAAQ,EAAC,YAAY,EAAE,KAAK,IAAI,EAAE;IACjC,IAAA,eAAI,EAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QAC7B,MAAM,IAAI,GAAG,IAAI,2CAAwB,CACxC,IAAI,iBAAiB,EAA4B,CACjD,CAAC;QAEF,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAE9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAA,iBAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAE5B,IAAA,iBAAM,EAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,IAAA,iBAAM,EAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAA,iBAAM,EAAC,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE9B,IAAA,iBAAM,EAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAErD,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,0BAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAE9D,IAAA,iBAAM,EAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,iBAAiB;IACtB,OAAO,CAAsB;IAC7B;QACC,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,GAAG,CACF,GAAW,EACX,OAAmD;QAEnD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;IACvD,CAAC;IACD,GAAG,CACF,GAAW,EACX,KAA8D,EAC9D,OAA+B;QAE/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAe,CAAC,CAAC;QACvC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IACD,MAAM,CAAC,GAAW;QACjB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;CACD","sourcesContent":["//\nimport { describe, expect, test } from \"bun:test\";\nimport { CloudflareShopRepository } from \"../../src/integration/cloudflare-kv.js\";\nimport { SimpleShop } from \"../../src/repository.js\";\n\ndescribe(\"Cloudflare\", async () => {\n\ttest(\"createShop\", async () => {\n\t\tconst repo = new CloudflareShopRepository(\n\t\t\tnew MockedKVNamespace() as unknown as KVNamespace,\n\t\t);\n\n\t\tawait repo.createShop(\"test\", \"test\", \"test\");\n\n\t\tconst shop = await repo.getShopById(\"test\");\n\n\t\texpect(shop).not.toBeNull();\n\n\t\texpect(shop?.getShopId()).toBe(\"test\");\n\t\texpect(shop?.getShopUrl()).toBe(\"test\");\n\t\texpect(shop?.getShopSecret()).toBe(\"test\");\n\n\t\tawait repo.deleteShop(\"test\");\n\n\t\texpect(repo.getShopById(\"test\")).resolves.toBeNull();\n\n\t\tawait repo.updateShop(new SimpleShop(\"test\", \"test\", \"test\"));\n\n\t\texpect(repo.getShopById(\"test\")).resolves.not.toBeNull();\n\t});\n});\n\nclass MockedKVNamespace {\n\tstorage: Map<string, string>;\n\tconstructor() {\n\t\tthis.storage = new Map();\n\t}\n\n\tget(\n\t\tkey: string,\n\t\toptions?: Partial<KVNamespaceGetOptions<undefined>>,\n\t): Promise<string | null> {\n\t\treturn Promise.resolve(this.storage.get(key) || null);\n\t}\n\tput(\n\t\tkey: string,\n\t\tvalue: string | ArrayBuffer | ArrayBufferView | ReadableStream,\n\t\toptions?: KVNamespacePutOptions,\n\t): Promise<void> {\n\t\tthis.storage.set(key, value as string);\n\t\treturn Promise.resolve();\n\t}\n\tdelete(key: string): Promise<void> {\n\t\tthis.storage.delete(key);\n\t\treturn Promise.resolve();\n\t}\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SimpleShop } from "../repository.js";
|
|
2
|
+
import type { ShopRepositoryInterface } from "../repository.js";
|
|
3
|
+
/**
|
|
4
|
+
* Deno KV integration
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* DenoKVRepository is a ShopRepositoryInterface implementation that uses the Deno KV storage to save the shop data
|
|
9
|
+
*/
|
|
10
|
+
export declare class DenoKVRepository implements ShopRepositoryInterface<SimpleShop> {
|
|
11
|
+
private namespace;
|
|
12
|
+
constructor(namespace?: string);
|
|
13
|
+
createShop(id: string, url: string, secret: string): Promise<void>;
|
|
14
|
+
getShopById(id: string): Promise<SimpleShop | null>;
|
|
15
|
+
updateShop(shop: SimpleShop): Promise<void>;
|
|
16
|
+
deleteShop(id: string): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=deno-kv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deno-kv.d.ts","sourceRoot":"","sources":["../../../src/integration/deno-kv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;;GAGG;AAEH;;GAEG;AACH,qBAAa,gBAAiB,YAAW,uBAAuB,CAAC,UAAU,CAAC;IAC/D,OAAO,CAAC,SAAS;gBAAT,SAAS,SAAU;IAEjC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAiCnD,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAM3C"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DenoKVRepository = void 0;
|
|
4
|
+
const repository_js_1 = require("../repository.js");
|
|
5
|
+
/**
|
|
6
|
+
* Deno KV integration
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* DenoKVRepository is a ShopRepositoryInterface implementation that uses the Deno KV storage to save the shop data
|
|
11
|
+
*/
|
|
12
|
+
class DenoKVRepository {
|
|
13
|
+
namespace;
|
|
14
|
+
constructor(namespace = "shops") {
|
|
15
|
+
this.namespace = namespace;
|
|
16
|
+
}
|
|
17
|
+
async createShop(id, url, secret) {
|
|
18
|
+
// @ts-ignore
|
|
19
|
+
const kv = await Deno.openKv();
|
|
20
|
+
await kv.set([this.namespace, id], new repository_js_1.SimpleShop(id, url, secret));
|
|
21
|
+
}
|
|
22
|
+
async getShopById(id) {
|
|
23
|
+
// @ts-ignore
|
|
24
|
+
const kv = await Deno.openKv();
|
|
25
|
+
const result = await kv.get([this.namespace, id]);
|
|
26
|
+
if (result.key === null) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const data = result.value;
|
|
30
|
+
if (data.shopActive === undefined) {
|
|
31
|
+
data.shopActive = true;
|
|
32
|
+
}
|
|
33
|
+
const shop = new repository_js_1.SimpleShop(data.shopId, data.shopUrl, data.shopSecret);
|
|
34
|
+
shop.setShopActive(data.shopActive);
|
|
35
|
+
if (data.shopClientId && data.shopClientSecret) {
|
|
36
|
+
shop.setShopCredentials(data.shopClientId, data.shopClientSecret);
|
|
37
|
+
}
|
|
38
|
+
return shop;
|
|
39
|
+
}
|
|
40
|
+
async updateShop(shop) {
|
|
41
|
+
// @ts-ignore
|
|
42
|
+
const kv = await Deno.openKv();
|
|
43
|
+
await kv.set([this.namespace, shop.getShopId()], shop);
|
|
44
|
+
}
|
|
45
|
+
async deleteShop(id) {
|
|
46
|
+
// @ts-ignore
|
|
47
|
+
const kv = await Deno.openKv();
|
|
48
|
+
await kv.delete([this.namespace, id]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.DenoKVRepository = DenoKVRepository;
|
|
52
|
+
//# sourceMappingURL=deno-kv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deno-kv.js","sourceRoot":"","sources":["../../../src/integration/deno-kv.ts"],"names":[],"mappings":";;;AAAA,oDAA8C;AAG9C;;;GAGG;AAEH;;GAEG;AACH,MAAa,gBAAgB;IACR;IAApB,YAAoB,YAAY,OAAO;QAAnB,cAAS,GAAT,SAAS,CAAU;IAAG,CAAC;IAE3C,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,GAAW,EAAE,MAAc;QACvD,aAAa;QACb,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAE/B,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,IAAI,0BAAU,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC3B,aAAa;QACb,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QAElD,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,KAOnB,CAAC;QAEF,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACxB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,0BAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACxE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEpC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAChD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAgB;QAChC,aAAa;QACb,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAE/B,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU;QAC1B,aAAa;QACb,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAE/B,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;CACD;AAxDD,4CAwDC","sourcesContent":["import { SimpleShop } from \"../repository.js\";\nimport type { ShopRepositoryInterface } from \"../repository.js\";\n\n/**\n * Deno KV integration\n * @module\n */\n\n/**\n * DenoKVRepository is a ShopRepositoryInterface implementation that uses the Deno KV storage to save the shop data\n */\nexport class DenoKVRepository implements ShopRepositoryInterface<SimpleShop> {\n\tconstructor(private namespace = \"shops\") {}\n\n\tasync createShop(id: string, url: string, secret: string): Promise<void> {\n\t\t// @ts-ignore\n\t\tconst kv = await Deno.openKv();\n\n\t\tawait kv.set([this.namespace, id], new SimpleShop(id, url, secret));\n\t}\n\n\tasync getShopById(id: string): Promise<SimpleShop | null> {\n\t\t// @ts-ignore\n\t\tconst kv = await Deno.openKv();\n\n\t\tconst result = await kv.get([this.namespace, id]);\n\n\t\tif (result.key === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst data = result.value as {\n\t\t\tshopId: string;\n\t\t\tshopActive: boolean | undefined;\n\t\t\tshopUrl: string;\n\t\t\tshopSecret: string;\n\t\t\tshopClientId: string | null;\n\t\t\tshopClientSecret: string | null;\n\t\t};\n\n\t\tif (data.shopActive === undefined) {\n\t\t\tdata.shopActive = true;\n\t\t}\n\n\t\tconst shop = new SimpleShop(data.shopId, data.shopUrl, data.shopSecret);\n\t\tshop.setShopActive(data.shopActive);\n\n\t\tif (data.shopClientId && data.shopClientSecret) {\n\t\t\tshop.setShopCredentials(data.shopClientId, data.shopClientSecret);\n\t\t}\n\n\t\treturn shop;\n\t}\n\n\tasync updateShop(shop: SimpleShop): Promise<void> {\n\t\t// @ts-ignore\n\t\tconst kv = await Deno.openKv();\n\n\t\tawait kv.set([this.namespace, shop.getShopId()], shop);\n\t}\n\n\tasync deleteShop(id: string): Promise<void> {\n\t\t// @ts-ignore\n\t\tconst kv = await Deno.openKv();\n\n\t\tawait kv.delete([this.namespace, id]);\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deno.test.d.ts","sourceRoot":"","sources":["../../../src/integration/deno.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const bun_test_1 = require("bun:test");
|
|
4
|
+
const repository_js_1 = require("../repository.js");
|
|
5
|
+
const deno_kv_js_1 = require("./deno-kv.js");
|
|
6
|
+
(0, bun_test_1.describe)("Deno", async () => {
|
|
7
|
+
const kv = {
|
|
8
|
+
storage: new Map(),
|
|
9
|
+
set(key, value) {
|
|
10
|
+
this.storage.set(key.join(""), value);
|
|
11
|
+
},
|
|
12
|
+
get(key) {
|
|
13
|
+
if (!this.storage.has(key.join(""))) {
|
|
14
|
+
return {
|
|
15
|
+
key: null,
|
|
16
|
+
value: null,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return Promise.resolve({
|
|
20
|
+
key: key.join(""),
|
|
21
|
+
value: this.storage.get(key.join("")),
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
delete(key) {
|
|
25
|
+
this.storage.delete(key.join(""));
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
// @ts-ignore
|
|
29
|
+
globalThis.Deno = {
|
|
30
|
+
openKv() {
|
|
31
|
+
return Promise.resolve(kv);
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
(0, bun_test_1.test)("test repository", async () => {
|
|
35
|
+
const repo = new deno_kv_js_1.DenoKVRepository();
|
|
36
|
+
await repo.createShop("test", "test", "test");
|
|
37
|
+
const shop = await repo.getShopById("test");
|
|
38
|
+
(0, bun_test_1.expect)(shop).not.toBeNull();
|
|
39
|
+
(0, bun_test_1.expect)(shop?.getShopId()).toBe("test");
|
|
40
|
+
(0, bun_test_1.expect)(shop?.getShopUrl()).toBe("test");
|
|
41
|
+
(0, bun_test_1.expect)(shop?.getShopSecret()).toBe("test");
|
|
42
|
+
await repo.deleteShop("test");
|
|
43
|
+
(0, bun_test_1.expect)(repo.getShopById("test")).resolves.toBeNull();
|
|
44
|
+
await repo.updateShop(new repository_js_1.SimpleShop("test", "test", "test"));
|
|
45
|
+
(0, bun_test_1.expect)(repo.getShopById("test")).resolves.not.toBeNull();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=deno.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deno.test.js","sourceRoot":"","sources":["../../../src/integration/deno.test.ts"],"names":[],"mappings":";;AAAA,uCAAkD;AAClD,oDAA8C;AAC9C,6CAAgD;AAEhD,IAAA,mBAAQ,EAAC,MAAM,EAAE,KAAK,IAAI,EAAE;IAC3B,MAAM,EAAE,GAAG;QACV,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,GAAG,CAAC,GAAa,EAAE,KAAa;YAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,GAAG,CAAC,GAAa;YAChB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACrC,OAAO;oBACN,GAAG,EAAE,IAAI;oBACT,KAAK,EAAE,IAAI;iBACX,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC,OAAO,CAAC;gBACtB,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACrC,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,GAAa;YACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC;KACD,CAAC;IAEF,aAAa;IACb,UAAU,CAAC,IAAI,GAAG;QACjB,MAAM;YACL,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;KACD,CAAC;IAEF,IAAA,eAAI,EAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,IAAI,GAAG,IAAI,6BAAgB,EAAE,CAAC;QAEpC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAE9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAA,iBAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAE5B,IAAA,iBAAM,EAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,IAAA,iBAAM,EAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAA,iBAAM,EAAC,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE9B,IAAA,iBAAM,EAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAErD,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,0BAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAE9D,IAAA,iBAAM,EAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, test } from \"bun:test\";\nimport { SimpleShop } from \"../repository.js\";\nimport { DenoKVRepository } from \"./deno-kv.js\";\n\ndescribe(\"Deno\", async () => {\n\tconst kv = {\n\t\tstorage: new Map(),\n\t\tset(key: string[], value: string) {\n\t\t\tthis.storage.set(key.join(\"\"), value);\n\t\t},\n\n\t\tget(key: string[]) {\n\t\t\tif (!this.storage.has(key.join(\"\"))) {\n\t\t\t\treturn {\n\t\t\t\t\tkey: null,\n\t\t\t\t\tvalue: null,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn Promise.resolve({\n\t\t\t\tkey: key.join(\"\"),\n\t\t\t\tvalue: this.storage.get(key.join(\"\")),\n\t\t\t});\n\t\t},\n\n\t\tdelete(key: string[]) {\n\t\t\tthis.storage.delete(key.join(\"\"));\n\t\t},\n\t};\n\n\t// @ts-ignore\n\tglobalThis.Deno = {\n\t\topenKv() {\n\t\t\treturn Promise.resolve(kv);\n\t\t},\n\t};\n\n\ttest(\"test repository\", async () => {\n\t\tconst repo = new DenoKVRepository();\n\n\t\tawait repo.createShop(\"test\", \"test\", \"test\");\n\n\t\tconst shop = await repo.getShopById(\"test\");\n\n\t\texpect(shop).not.toBeNull();\n\n\t\texpect(shop?.getShopId()).toBe(\"test\");\n\t\texpect(shop?.getShopUrl()).toBe(\"test\");\n\t\texpect(shop?.getShopSecret()).toBe(\"test\");\n\n\t\tawait repo.deleteShop(\"test\");\n\n\t\texpect(repo.getShopById(\"test\")).resolves.toBeNull();\n\n\t\tawait repo.updateShop(new SimpleShop(\"test\", \"test\", \"test\"));\n\n\t\texpect(repo.getShopById(\"test\")).resolves.not.toBeNull();\n\t});\n});\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DynamoDBClient } from "@aws-sdk/client-dynamodb";
|
|
2
|
+
import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";
|
|
3
|
+
import { type ShopRepositoryInterface, SimpleShop } from "../repository.js";
|
|
4
|
+
export declare class DynamoDBRepository implements ShopRepositoryInterface<SimpleShop> {
|
|
5
|
+
docClient: DynamoDBDocumentClient;
|
|
6
|
+
tableName: string;
|
|
7
|
+
constructor(client: DynamoDBClient, tableName: string);
|
|
8
|
+
createShop(id: string, url: string, secret: string): Promise<void>;
|
|
9
|
+
getShopById(id: string): Promise<SimpleShop | null>;
|
|
10
|
+
updateShop(shop: SimpleShop): Promise<void>;
|
|
11
|
+
deleteShop(id: string): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=dynamodb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamodb.d.ts","sourceRoot":"","sources":["../../../src/integration/dynamodb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAEN,sBAAsB,EAGtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,uBAAuB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE5E,qBAAa,kBAAmB,YAAW,uBAAuB,CAAC,UAAU,CAAC;IAC7E,SAAS,EAAE,sBAAsB,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;gBAEN,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM;IAK/C,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAoCnD,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAU3C"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DynamoDBRepository = void 0;
|
|
4
|
+
const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
5
|
+
const repository_js_1 = require("../repository.js");
|
|
6
|
+
class DynamoDBRepository {
|
|
7
|
+
docClient;
|
|
8
|
+
tableName;
|
|
9
|
+
constructor(client, tableName) {
|
|
10
|
+
this.tableName = tableName;
|
|
11
|
+
this.docClient = lib_dynamodb_1.DynamoDBDocumentClient.from(client);
|
|
12
|
+
}
|
|
13
|
+
async createShop(id, url, secret) {
|
|
14
|
+
const cmd = new lib_dynamodb_1.PutCommand({
|
|
15
|
+
TableName: this.tableName,
|
|
16
|
+
Item: {
|
|
17
|
+
id: id,
|
|
18
|
+
active: true,
|
|
19
|
+
url: url,
|
|
20
|
+
secret: secret,
|
|
21
|
+
clientId: null,
|
|
22
|
+
clientSecret: null,
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
await this.docClient.send(cmd);
|
|
26
|
+
}
|
|
27
|
+
async getShopById(id) {
|
|
28
|
+
const cmd = new lib_dynamodb_1.GetCommand({
|
|
29
|
+
TableName: this.tableName,
|
|
30
|
+
Key: {
|
|
31
|
+
id: id,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
const response = await this.docClient.send(cmd);
|
|
35
|
+
if (!response.Item) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const shop = new repository_js_1.SimpleShop(response.Item.id, response.Item.url, response.Item.secret);
|
|
39
|
+
if (response.Item.active === undefined) {
|
|
40
|
+
response.Item.active = true;
|
|
41
|
+
}
|
|
42
|
+
shop.setShopActive(response.Item.active);
|
|
43
|
+
if (response.Item.clientId) {
|
|
44
|
+
shop.setShopCredentials(response.Item.clientId, response.Item.clientSecret);
|
|
45
|
+
}
|
|
46
|
+
return shop;
|
|
47
|
+
}
|
|
48
|
+
async updateShop(shop) {
|
|
49
|
+
const cmd = new lib_dynamodb_1.PutCommand({
|
|
50
|
+
TableName: this.tableName,
|
|
51
|
+
Item: {
|
|
52
|
+
id: shop.getShopId(),
|
|
53
|
+
active: shop.getShopActive(),
|
|
54
|
+
url: shop.getShopUrl(),
|
|
55
|
+
secret: shop.getShopSecret(),
|
|
56
|
+
clientId: shop.getShopClientId(),
|
|
57
|
+
clientSecret: shop.getShopClientSecret(),
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
await this.docClient.send(cmd);
|
|
61
|
+
}
|
|
62
|
+
async deleteShop(id) {
|
|
63
|
+
const cmd = new lib_dynamodb_1.DeleteCommand({
|
|
64
|
+
TableName: this.tableName,
|
|
65
|
+
Key: {
|
|
66
|
+
id: id,
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
await this.docClient.send(cmd);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.DynamoDBRepository = DynamoDBRepository;
|
|
73
|
+
//# sourceMappingURL=dynamodb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamodb.js","sourceRoot":"","sources":["../../../src/integration/dynamodb.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DynamoDBClient } from \"@aws-sdk/client-dynamodb\";\nimport {\n\tDeleteCommand,\n\tDynamoDBDocumentClient,\n\tGetCommand,\n\tPutCommand,\n} from \"@aws-sdk/lib-dynamodb\";\nimport { type ShopRepositoryInterface, SimpleShop } from \"../repository.js\";\n\nexport class DynamoDBRepository implements ShopRepositoryInterface<SimpleShop> {\n\tdocClient: DynamoDBDocumentClient;\n\ttableName: string;\n\n\tconstructor(client: DynamoDBClient, tableName: string) {\n\t\tthis.tableName = tableName;\n\t\tthis.docClient = DynamoDBDocumentClient.from(client);\n\t}\n\n\tasync createShop(id: string, url: string, secret: string): Promise<void> {\n\t\tconst cmd = new PutCommand({\n\t\t\tTableName: this.tableName,\n\t\t\tItem: {\n\t\t\t\tid: id,\n\t\t\t\tactive: true,\n\t\t\t\turl: url,\n\t\t\t\tsecret: secret,\n\t\t\t\tclientId: null,\n\t\t\t\tclientSecret: null,\n\t\t\t},\n\t\t});\n\n\t\tawait this.docClient.send(cmd);\n\t}\n\n\tasync getShopById(id: string): Promise<SimpleShop | null> {\n\t\tconst cmd = new GetCommand({\n\t\t\tTableName: this.tableName,\n\t\t\tKey: {\n\t\t\t\tid: id,\n\t\t\t},\n\t\t});\n\n\t\tconst response = await this.docClient.send(cmd);\n\n\t\tif (!response.Item) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst shop = new SimpleShop(\n\t\t\tresponse.Item.id,\n\t\t\tresponse.Item.url,\n\t\t\tresponse.Item.secret,\n\t\t);\n\n\t\tif (response.Item.active === undefined) {\n\t\t\tresponse.Item.active = true;\n\t\t}\n\n\t\tshop.setShopActive(response.Item.active);\n\n\t\tif (response.Item.clientId) {\n\t\t\tshop.setShopCredentials(\n\t\t\t\tresponse.Item.clientId,\n\t\t\t\tresponse.Item.clientSecret,\n\t\t\t);\n\t\t}\n\n\t\treturn shop;\n\t}\n\n\tasync updateShop(shop: SimpleShop): Promise<void> {\n\t\tconst cmd = new PutCommand({\n\t\t\tTableName: this.tableName,\n\t\t\tItem: {\n\t\t\t\tid: shop.getShopId(),\n\t\t\t\tactive: shop.getShopActive(),\n\t\t\t\turl: shop.getShopUrl(),\n\t\t\t\tsecret: shop.getShopSecret(),\n\t\t\t\tclientId: shop.getShopClientId(),\n\t\t\t\tclientSecret: shop.getShopClientSecret(),\n\t\t\t},\n\t\t});\n\n\t\tawait this.docClient.send(cmd);\n\t}\n\n\tasync deleteShop(id: string): Promise<void> {\n\t\tconst cmd = new DeleteCommand({\n\t\t\tTableName: this.tableName,\n\t\t\tKey: {\n\t\t\t\tid: id,\n\t\t\t},\n\t\t});\n\n\t\tawait this.docClient.send(cmd);\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamodb.test.d.ts","sourceRoot":"","sources":["../../../src/integration/dynamodb.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const bun_test_1 = require("bun:test");
|
|
4
|
+
const dynamodb_js_1 = require("./dynamodb.js");
|
|
5
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
6
|
+
const repository_js_1 = require("../repository.js");
|
|
7
|
+
(0, bun_test_1.describe)("DynamoDB", async () => {
|
|
8
|
+
(0, bun_test_1.test)("getShopById does not exists", async () => {
|
|
9
|
+
bun_test_1.mock.module("@aws-sdk/lib-dynamodb", () => {
|
|
10
|
+
return {
|
|
11
|
+
DynamoDBDocumentClient: {
|
|
12
|
+
from() {
|
|
13
|
+
return {
|
|
14
|
+
async send() {
|
|
15
|
+
return {};
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
const repo = new dynamodb_js_1.DynamoDBRepository(new client_dynamodb_1.DynamoDBClient(), "foo");
|
|
23
|
+
(0, bun_test_1.expect)(repo.getShopById("test")).resolves.toBeNull();
|
|
24
|
+
});
|
|
25
|
+
(0, bun_test_1.test)("getShopById exists", async () => {
|
|
26
|
+
bun_test_1.mock.module("@aws-sdk/lib-dynamodb", () => {
|
|
27
|
+
return {
|
|
28
|
+
DynamoDBDocumentClient: {
|
|
29
|
+
from() {
|
|
30
|
+
return {
|
|
31
|
+
async send() {
|
|
32
|
+
return {
|
|
33
|
+
Item: {
|
|
34
|
+
id: "a",
|
|
35
|
+
url: "b",
|
|
36
|
+
secret: "c",
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
const repo = new dynamodb_js_1.DynamoDBRepository(new client_dynamodb_1.DynamoDBClient(), "foo");
|
|
46
|
+
(0, bun_test_1.expect)(repo.getShopById("test")).resolves.not.toBeNull();
|
|
47
|
+
});
|
|
48
|
+
(0, bun_test_1.test)("createShop", async () => {
|
|
49
|
+
let cmd;
|
|
50
|
+
bun_test_1.mock.module("@aws-sdk/lib-dynamodb", () => {
|
|
51
|
+
return {
|
|
52
|
+
DynamoDBDocumentClient: {
|
|
53
|
+
from() {
|
|
54
|
+
return {
|
|
55
|
+
async send(inner) {
|
|
56
|
+
cmd = inner;
|
|
57
|
+
return {};
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
const repo = new dynamodb_js_1.DynamoDBRepository(new client_dynamodb_1.DynamoDBClient(), "foo");
|
|
65
|
+
await repo.createShop("a", "b", "c");
|
|
66
|
+
// @ts-expect-error
|
|
67
|
+
(0, bun_test_1.expect)(cmd).toBeDefined();
|
|
68
|
+
// @ts-expect-error
|
|
69
|
+
(0, bun_test_1.expect)(cmd.input.Item).toEqual({
|
|
70
|
+
id: "a",
|
|
71
|
+
active: true,
|
|
72
|
+
url: "b",
|
|
73
|
+
secret: "c",
|
|
74
|
+
clientId: null,
|
|
75
|
+
clientSecret: null,
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
(0, bun_test_1.test)("updateShop", async () => {
|
|
79
|
+
let cmd;
|
|
80
|
+
bun_test_1.mock.module("@aws-sdk/lib-dynamodb", () => {
|
|
81
|
+
return {
|
|
82
|
+
DynamoDBDocumentClient: {
|
|
83
|
+
from() {
|
|
84
|
+
return {
|
|
85
|
+
async send(inner) {
|
|
86
|
+
cmd = inner;
|
|
87
|
+
return {};
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
const repo = new dynamodb_js_1.DynamoDBRepository(new client_dynamodb_1.DynamoDBClient(), "foo");
|
|
95
|
+
await repo.updateShop(new repository_js_1.SimpleShop("a", "b", "c"));
|
|
96
|
+
// @ts-expect-error
|
|
97
|
+
(0, bun_test_1.expect)(cmd).toBeDefined();
|
|
98
|
+
// @ts-expect-error
|
|
99
|
+
(0, bun_test_1.expect)(cmd.input.Item).toEqual({
|
|
100
|
+
id: "a",
|
|
101
|
+
active: true,
|
|
102
|
+
url: "b",
|
|
103
|
+
secret: "c",
|
|
104
|
+
clientId: null,
|
|
105
|
+
clientSecret: null,
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
(0, bun_test_1.test)("deleteShop", async () => {
|
|
109
|
+
let cmd;
|
|
110
|
+
bun_test_1.mock.module("@aws-sdk/lib-dynamodb", () => {
|
|
111
|
+
return {
|
|
112
|
+
DynamoDBDocumentClient: {
|
|
113
|
+
from() {
|
|
114
|
+
return {
|
|
115
|
+
async send(inner) {
|
|
116
|
+
cmd = inner;
|
|
117
|
+
return {};
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
});
|
|
124
|
+
const repo = new dynamodb_js_1.DynamoDBRepository(new client_dynamodb_1.DynamoDBClient(), "foo");
|
|
125
|
+
await repo.deleteShop("a");
|
|
126
|
+
// @ts-expect-error
|
|
127
|
+
(0, bun_test_1.expect)(cmd).toBeDefined();
|
|
128
|
+
// @ts-expect-error
|
|
129
|
+
(0, bun_test_1.expect)(cmd.input.Key).toEqual({ id: "a" });
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
//# sourceMappingURL=dynamodb.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamodb.test.js","sourceRoot":"","sources":["../../../src/integration/dynamodb.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, mock, test } from \"bun:test\";\nimport { DynamoDBRepository } from \"./dynamodb.js\";\n\nimport { DynamoDBClient } from \"@aws-sdk/client-dynamodb\";\nimport type { DeleteCommand, PutCommand } from \"@aws-sdk/lib-dynamodb\";\nimport { SimpleShop } from \"../repository.js\";\n\ndescribe(\"DynamoDB\", async () => {\n\ttest(\"getShopById does not exists\", async () => {\n\t\tmock.module(\"@aws-sdk/lib-dynamodb\", () => {\n\t\t\treturn {\n\t\t\t\tDynamoDBDocumentClient: {\n\t\t\t\t\tfrom() {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tasync send() {\n\t\t\t\t\t\t\t\treturn {};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\tconst repo = new DynamoDBRepository(new DynamoDBClient(), \"foo\");\n\n\t\texpect(repo.getShopById(\"test\")).resolves.toBeNull();\n\t});\n\n\ttest(\"getShopById exists\", async () => {\n\t\tmock.module(\"@aws-sdk/lib-dynamodb\", () => {\n\t\t\treturn {\n\t\t\t\tDynamoDBDocumentClient: {\n\t\t\t\t\tfrom() {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tasync send() {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tItem: {\n\t\t\t\t\t\t\t\t\t\tid: \"a\",\n\t\t\t\t\t\t\t\t\t\turl: \"b\",\n\t\t\t\t\t\t\t\t\t\tsecret: \"c\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\tconst repo = new DynamoDBRepository(new DynamoDBClient(), \"foo\");\n\n\t\texpect(repo.getShopById(\"test\")).resolves.not.toBeNull();\n\t});\n\n\ttest(\"createShop\", async () => {\n\t\tlet cmd: PutCommand;\n\n\t\tmock.module(\"@aws-sdk/lib-dynamodb\", () => {\n\t\t\treturn {\n\t\t\t\tDynamoDBDocumentClient: {\n\t\t\t\t\tfrom() {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tasync send(inner: PutCommand) {\n\t\t\t\t\t\t\t\tcmd = inner;\n\t\t\t\t\t\t\t\treturn {};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\tconst repo = new DynamoDBRepository(new DynamoDBClient(), \"foo\");\n\n\t\tawait repo.createShop(\"a\", \"b\", \"c\");\n\n\t\t// @ts-expect-error\n\t\texpect(cmd).toBeDefined();\n\t\t// @ts-expect-error\n\t\texpect(cmd.input.Item).toEqual({\n\t\t\tid: \"a\",\n\t\t\tactive: true,\n\t\t\turl: \"b\",\n\t\t\tsecret: \"c\",\n\t\t\tclientId: null,\n\t\t\tclientSecret: null,\n\t\t});\n\t});\n\n\ttest(\"updateShop\", async () => {\n\t\tlet cmd: PutCommand;\n\n\t\tmock.module(\"@aws-sdk/lib-dynamodb\", () => {\n\t\t\treturn {\n\t\t\t\tDynamoDBDocumentClient: {\n\t\t\t\t\tfrom() {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tasync send(inner: PutCommand) {\n\t\t\t\t\t\t\t\tcmd = inner;\n\t\t\t\t\t\t\t\treturn {};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\tconst repo = new DynamoDBRepository(new DynamoDBClient(), \"foo\");\n\n\t\tawait repo.updateShop(new SimpleShop(\"a\", \"b\", \"c\"));\n\n\t\t// @ts-expect-error\n\t\texpect(cmd).toBeDefined();\n\t\t// @ts-expect-error\n\t\texpect(cmd.input.Item).toEqual({\n\t\t\tid: \"a\",\n\t\t\tactive: true,\n\t\t\turl: \"b\",\n\t\t\tsecret: \"c\",\n\t\t\tclientId: null,\n\t\t\tclientSecret: null,\n\t\t});\n\t});\n\n\ttest(\"deleteShop\", async () => {\n\t\tlet cmd: DeleteCommand;\n\n\t\tmock.module(\"@aws-sdk/lib-dynamodb\", () => {\n\t\t\treturn {\n\t\t\t\tDynamoDBDocumentClient: {\n\t\t\t\t\tfrom() {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tasync send(inner: DeleteCommand) {\n\t\t\t\t\t\t\t\tcmd = inner;\n\t\t\t\t\t\t\t\treturn {};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\tconst repo = new DynamoDBRepository(new DynamoDBClient(), \"foo\");\n\n\t\tawait repo.deleteShop(\"a\");\n\n\t\t// @ts-expect-error\n\t\texpect(cmd).toBeDefined();\n\t\t// @ts-expect-error\n\t\texpect(cmd.input.Key).toEqual({ id: \"a\" });\n\t});\n});\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { AppServer } from "../app.js";
|
|
2
|
+
import type { Context } from "../context-resolver.js";
|
|
3
|
+
import type { ShopInterface, ShopRepositoryInterface } from "../repository.js";
|
|
4
|
+
import type { Hono, Context as HonoContext } from "hono";
|
|
5
|
+
declare module "hono" {
|
|
6
|
+
interface ContextVariableMap {
|
|
7
|
+
app: AppServer<ShopInterface>;
|
|
8
|
+
shop: ShopInterface;
|
|
9
|
+
context: Context<ShopInterface, unknown>;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
interface MiddlewareConfig {
|
|
13
|
+
appName: string | ((c: HonoContext) => string);
|
|
14
|
+
appSecret: string | ((c: HonoContext) => string);
|
|
15
|
+
appUrl?: string | null;
|
|
16
|
+
registrationUrl?: string | null;
|
|
17
|
+
registerConfirmationUrl?: string | null;
|
|
18
|
+
appActivateUrl?: string | null;
|
|
19
|
+
appDeactivateUrl?: string | null;
|
|
20
|
+
appDeleteUrl?: string | null;
|
|
21
|
+
appPath?: string | null;
|
|
22
|
+
shopRepository: ShopRepositoryInterface | ((c: HonoContext) => ShopRepositoryInterface);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Configure the Hono server to handle the app registration and context resolution
|
|
26
|
+
*/
|
|
27
|
+
export declare function configureAppServer(hono: Hono, cfg: MiddlewareConfig): void;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=hono.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../../src/integration/hono.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,MAAM,CAAC;AAEzD,OAAO,QAAQ,MAAM,CAAC;IACrB,UAAU,kBAAkB;QAE3B,GAAG,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;QAC9B,IAAI,EAAE,aAAa,CAAC;QAEpB,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;KACzC;CACD;AAED,UAAU,gBAAgB;IACzB,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC;IAC/C,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EACX,uBAAuB,GACvB,CAAC,CAAC,CAAC,EAAE,WAAW,KAAK,uBAAuB,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,QAqHnE"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configureAppServer = configureAppServer;
|
|
4
|
+
const app_js_1 = require("../app.js");
|
|
5
|
+
/**
|
|
6
|
+
* Configure the Hono server to handle the app registration and context resolution
|
|
7
|
+
*/
|
|
8
|
+
function configureAppServer(hono, cfg) {
|
|
9
|
+
let app = null;
|
|
10
|
+
cfg.registrationUrl = cfg.registrationUrl || "/app/register";
|
|
11
|
+
cfg.registerConfirmationUrl =
|
|
12
|
+
cfg.registerConfirmationUrl || "/app/register/confirm";
|
|
13
|
+
cfg.appActivateUrl = cfg.appActivateUrl || "/app/activate";
|
|
14
|
+
cfg.appDeactivateUrl = cfg.appDeactivateUrl || "/app/deactivate";
|
|
15
|
+
cfg.appDeleteUrl = cfg.appDeleteUrl || "/app/delete";
|
|
16
|
+
cfg.appPath = cfg.appPath || "/app/*";
|
|
17
|
+
hono.use("*", async (ctx, next) => {
|
|
18
|
+
if (app === null) {
|
|
19
|
+
const appUrl = cfg.appUrl || buildBaseUrl(ctx.req.url);
|
|
20
|
+
if (typeof cfg.shopRepository === "function") {
|
|
21
|
+
cfg.shopRepository = cfg.shopRepository(ctx);
|
|
22
|
+
}
|
|
23
|
+
if (typeof cfg.appName === "function") {
|
|
24
|
+
cfg.appName = cfg.appName(ctx);
|
|
25
|
+
}
|
|
26
|
+
if (typeof cfg.appSecret === "function") {
|
|
27
|
+
cfg.appSecret = cfg.appSecret(ctx);
|
|
28
|
+
}
|
|
29
|
+
app = new app_js_1.AppServer({
|
|
30
|
+
appName: cfg.appName,
|
|
31
|
+
appSecret: cfg.appSecret,
|
|
32
|
+
authorizeCallbackUrl: appUrl + cfg.registerConfirmationUrl,
|
|
33
|
+
}, cfg.shopRepository);
|
|
34
|
+
}
|
|
35
|
+
// @ts-ignore
|
|
36
|
+
ctx.set("app", app);
|
|
37
|
+
await next();
|
|
38
|
+
});
|
|
39
|
+
hono.use(cfg.appPath, async (ctx, next) => {
|
|
40
|
+
// @ts-ignore
|
|
41
|
+
const app = ctx.get("app");
|
|
42
|
+
// Don't validate signature for registration
|
|
43
|
+
if (ctx.req.path === cfg.registrationUrl ||
|
|
44
|
+
ctx.req.path === cfg.registerConfirmationUrl ||
|
|
45
|
+
ctx.req.path === cfg.appActivateUrl ||
|
|
46
|
+
ctx.req.path === cfg.appDeactivateUrl ||
|
|
47
|
+
ctx.req.path === cfg.appDeleteUrl) {
|
|
48
|
+
await next();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
let context;
|
|
52
|
+
try {
|
|
53
|
+
context =
|
|
54
|
+
ctx.req.method === "GET"
|
|
55
|
+
? await app.contextResolver.fromBrowser(ctx.req.raw)
|
|
56
|
+
: await app.contextResolver.fromAPI(ctx.req.raw);
|
|
57
|
+
}
|
|
58
|
+
catch (_e) {
|
|
59
|
+
return jsonResponse({ message: "Invalid request" }, 400);
|
|
60
|
+
}
|
|
61
|
+
// @ts-ignore
|
|
62
|
+
ctx.set("shop", context.shop);
|
|
63
|
+
// @ts-ignore
|
|
64
|
+
ctx.set("context", context);
|
|
65
|
+
await next();
|
|
66
|
+
const cloned = ctx.res.clone();
|
|
67
|
+
await ctx
|
|
68
|
+
.get("app")
|
|
69
|
+
.signer.signResponse(cloned, ctx.get("shop").getShopSecret());
|
|
70
|
+
ctx.header("shopware-app-signature", cloned.headers.get("shopware-app-signature"));
|
|
71
|
+
});
|
|
72
|
+
hono.get(cfg.registrationUrl, async (ctx) => {
|
|
73
|
+
const app = ctx.get("app");
|
|
74
|
+
return await app.registration.authorize(ctx.req.raw);
|
|
75
|
+
});
|
|
76
|
+
hono.post(cfg.registerConfirmationUrl, async (ctx) => {
|
|
77
|
+
const app = ctx.get("app");
|
|
78
|
+
return await app.registration.authorizeCallback(ctx.req.raw);
|
|
79
|
+
});
|
|
80
|
+
hono.post(cfg.appActivateUrl, async (ctx) => {
|
|
81
|
+
const app = ctx.get("app");
|
|
82
|
+
return await app.registration.activate(ctx.req.raw);
|
|
83
|
+
});
|
|
84
|
+
hono.post(cfg.appDeactivateUrl, async (ctx) => {
|
|
85
|
+
const app = ctx.get("app");
|
|
86
|
+
return await app.registration.deactivate(ctx.req.raw);
|
|
87
|
+
});
|
|
88
|
+
hono.post(cfg.appDeleteUrl, async (ctx) => {
|
|
89
|
+
const app = ctx.get("app");
|
|
90
|
+
return await app.registration.delete(ctx.req.raw);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function jsonResponse(body, status = 200) {
|
|
94
|
+
return new Response(JSON.stringify(body), {
|
|
95
|
+
status,
|
|
96
|
+
headers: {
|
|
97
|
+
"Content-Type": "application/json",
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function buildBaseUrl(url) {
|
|
102
|
+
const u = new URL(url);
|
|
103
|
+
return `${u.protocol}//${u.host}`;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=hono.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.js","sourceRoot":"","sources":["../../../src/integration/hono.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppServer } from \"../app.js\";\nimport type { Context } from \"../context-resolver.js\";\nimport type { ShopInterface, ShopRepositoryInterface } from \"../repository.js\";\n\nimport type { Hono, Context as HonoContext } from \"hono\";\n\ndeclare module \"hono\" {\n\tinterface ContextVariableMap {\n\t\t// @ts-ignore\n\t\tapp: AppServer<ShopInterface>;\n\t\tshop: ShopInterface;\n\t\t// @ts-ignore\n\t\tcontext: Context<ShopInterface, unknown>;\n\t}\n}\n\ninterface MiddlewareConfig {\n\tappName: string | ((c: HonoContext) => string);\n\tappSecret: string | ((c: HonoContext) => string);\n\tappUrl?: string | null;\n\tregistrationUrl?: string | null;\n\tregisterConfirmationUrl?: string | null;\n\tappActivateUrl?: string | null;\n\tappDeactivateUrl?: string | null;\n\tappDeleteUrl?: string | null;\n\tappPath?: string | null;\n\tshopRepository:\n\t\t| ShopRepositoryInterface\n\t\t| ((c: HonoContext) => ShopRepositoryInterface);\n}\n\n/**\n * Configure the Hono server to handle the app registration and context resolution\n */\nexport function configureAppServer(hono: Hono, cfg: MiddlewareConfig) {\n\tlet app: AppServer | null = null;\n\n\tcfg.registrationUrl = cfg.registrationUrl || \"/app/register\";\n\tcfg.registerConfirmationUrl =\n\t\tcfg.registerConfirmationUrl || \"/app/register/confirm\";\n\tcfg.appActivateUrl = cfg.appActivateUrl || \"/app/activate\";\n\tcfg.appDeactivateUrl = cfg.appDeactivateUrl || \"/app/deactivate\";\n\tcfg.appDeleteUrl = cfg.appDeleteUrl || \"/app/delete\";\n\tcfg.appPath = cfg.appPath || \"/app/*\";\n\n\thono.use(\"*\", async (ctx, next) => {\n\t\tif (app === null) {\n\t\t\tconst appUrl = cfg.appUrl || buildBaseUrl(ctx.req.url);\n\n\t\t\tif (typeof cfg.shopRepository === \"function\") {\n\t\t\t\tcfg.shopRepository = cfg.shopRepository(ctx);\n\t\t\t}\n\n\t\t\tif (typeof cfg.appName === \"function\") {\n\t\t\t\tcfg.appName = cfg.appName(ctx);\n\t\t\t}\n\n\t\t\tif (typeof cfg.appSecret === \"function\") {\n\t\t\t\tcfg.appSecret = cfg.appSecret(ctx);\n\t\t\t}\n\n\t\t\tapp = new AppServer(\n\t\t\t\t{\n\t\t\t\t\tappName: cfg.appName,\n\t\t\t\t\tappSecret: cfg.appSecret,\n\t\t\t\t\tauthorizeCallbackUrl: appUrl + cfg.registerConfirmationUrl,\n\t\t\t\t},\n\t\t\t\tcfg.shopRepository,\n\t\t\t);\n\t\t}\n\n\t\t// @ts-ignore\n\t\tctx.set(\"app\", app);\n\n\t\tawait next();\n\t});\n\n\thono.use(cfg.appPath, async (ctx, next) => {\n\t\t// @ts-ignore\n\t\tconst app = ctx.get(\"app\") as AppServer;\n\n\t\t// Don't validate signature for registration\n\t\tif (\n\t\t\tctx.req.path === cfg.registrationUrl ||\n\t\t\tctx.req.path === cfg.registerConfirmationUrl ||\n\t\t\tctx.req.path === cfg.appActivateUrl ||\n\t\t\tctx.req.path === cfg.appDeactivateUrl ||\n\t\t\tctx.req.path === cfg.appDeleteUrl\n\t\t) {\n\t\t\tawait next();\n\t\t\treturn;\n\t\t}\n\n\t\tlet context: Context<ShopInterface, unknown>;\n\t\ttry {\n\t\t\tcontext =\n\t\t\t\tctx.req.method === \"GET\"\n\t\t\t\t\t? await app.contextResolver.fromBrowser(ctx.req.raw)\n\t\t\t\t\t: await app.contextResolver.fromAPI(ctx.req.raw);\n\t\t} catch (_e) {\n\t\t\treturn jsonResponse({ message: \"Invalid request\" }, 400);\n\t\t}\n\n\t\t// @ts-ignore\n\t\tctx.set(\"shop\", context.shop);\n\t\t// @ts-ignore\n\t\tctx.set(\"context\", context);\n\n\t\tawait next();\n\n\t\tconst cloned = ctx.res.clone();\n\n\t\tawait ctx\n\t\t\t.get(\"app\")\n\t\t\t.signer.signResponse(cloned, ctx.get(\"shop\").getShopSecret());\n\n\t\tctx.header(\n\t\t\t\"shopware-app-signature\",\n\t\t\tcloned.headers.get(\"shopware-app-signature\") as string,\n\t\t);\n\t});\n\n\thono.get(cfg.registrationUrl, async (ctx) => {\n\t\tconst app = ctx.get(\"app\");\n\n\t\treturn await app.registration.authorize(ctx.req.raw);\n\t});\n\n\thono.post(cfg.registerConfirmationUrl, async (ctx) => {\n\t\tconst app = ctx.get(\"app\");\n\n\t\treturn await app.registration.authorizeCallback(ctx.req.raw);\n\t});\n\n\thono.post(cfg.appActivateUrl, async (ctx) => {\n\t\tconst app = ctx.get(\"app\");\n\n\t\treturn await app.registration.activate(ctx.req.raw);\n\t});\n\n\thono.post(cfg.appDeactivateUrl, async (ctx) => {\n\t\tconst app = ctx.get(\"app\");\n\n\t\treturn await app.registration.deactivate(ctx.req.raw);\n\t});\n\n\thono.post(cfg.appDeleteUrl, async (ctx) => {\n\t\tconst app = ctx.get(\"app\");\n\n\t\treturn await app.registration.delete(ctx.req.raw);\n\t});\n}\n\nfunction jsonResponse(body: object, status = 200): Response {\n\treturn new Response(JSON.stringify(body), {\n\t\tstatus,\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t});\n}\n\nfunction buildBaseUrl(url: string): string {\n\tconst u = new URL(url);\n\n\treturn `${u.protocol}//${u.host}`;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.test.d.ts","sourceRoot":"","sources":["../../../src/integration/hono.test.ts"],"names":[],"mappings":""}
|