From faea6a6c931553412863e3fd20c864b23f79d47f Mon Sep 17 00:00:00 2001 From: Marco Montalbano Date: Thu, 14 Mar 2024 22:44:19 +0100 Subject: [PATCH 1/7] docs: update README.md --- packages/js-auth/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/js-auth/README.md b/packages/js-auth/README.md index 0a8baf4..dcb63cf 100644 --- a/packages/js-auth/README.md +++ b/packages/js-auth/README.md @@ -10,7 +10,6 @@ A JavaScript Library wrapper that helps you use the Commerce Layer API for [Auth - [Getting started](#getting-started) - [Installation](#installation) - - [Using E6 import](#using-es6-import) - [Authorization flows](#authorization-flows) - [Use cases](#use-cases) - [Sales channel application with client credentials flow](#sales-channel-client-credentials) From 87cfd9d8d1e92f472389d7a65e7eff30d3cce9d9 Mon Sep 17 00:00:00 2001 From: Marco Montalbano Date: Mon, 18 Mar 2024 09:37:15 +0100 Subject: [PATCH 2/7] docs: add readme to 'esm' and 'cjs' --- examples/cjs/readme.md | 13 +++++++++++++ examples/esm/readme.md | 19 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 examples/cjs/readme.md create mode 100644 examples/esm/readme.md diff --git a/examples/cjs/readme.md b/examples/cjs/readme.md new file mode 100644 index 0000000..ee646d3 --- /dev/null +++ b/examples/cjs/readme.md @@ -0,0 +1,13 @@ +# "CommonJS" example + +## Get started + +First of all you need to install [Node.js](https://nodejs.org/en) on your machine. + +```sh +node index.js + +# or + +npm start +``` \ No newline at end of file diff --git a/examples/esm/readme.md b/examples/esm/readme.md new file mode 100644 index 0000000..ede7ec4 --- /dev/null +++ b/examples/esm/readme.md @@ -0,0 +1,19 @@ +# "ECMAScript module" example + +## Get started + +First of all you need to install [Node.js](https://nodejs.org/en) on your machine. + +```sh +node index.js + +# or + +npm start +``` + +You can also test this example directly in your browser: + +```sh +npm run serve +``` \ No newline at end of file From e56fb6d06c46c344633e73129dc28c3c817d577a Mon Sep 17 00:00:00 2001 From: Marco Montalbano Date: Mon, 18 Mar 2024 09:37:48 +0100 Subject: [PATCH 3/7] docs: add 'deno' example --- examples/deno/deno.json | 5 +++++ examples/deno/deno.lock | 10 ++++++++++ examples/deno/index.ts | 9 +++++++++ examples/deno/readme.md | 13 +++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 examples/deno/deno.json create mode 100644 examples/deno/deno.lock create mode 100644 examples/deno/index.ts create mode 100644 examples/deno/readme.md diff --git a/examples/deno/deno.json b/examples/deno/deno.json new file mode 100644 index 0000000..99e1fb2 --- /dev/null +++ b/examples/deno/deno.json @@ -0,0 +1,5 @@ +{ + "tasks": { + "start": "deno run --allow-net index.ts" + } +} diff --git a/examples/deno/deno.lock b/examples/deno/deno.lock new file mode 100644 index 0000000..01e2474 --- /dev/null +++ b/examples/deno/deno.lock @@ -0,0 +1,10 @@ +{ + "version": "3", + "redirects": { + "https://esm.sh/@commercelayer/js-auth": "https://esm.sh/@commercelayer/js-auth@5.2.0" + }, + "remote": { + "https://esm.sh/@commercelayer/js-auth@5.2.0": "8f609d55ba1a1ecc0eebdf01a84f88ffbd472aff2c6b547c5f6fd3a1f0b9f0d0", + "https://esm.sh/v135/@commercelayer/js-auth@5.2.0/denonext/js-auth.mjs": "35d87bc27c81a23b2a4d3949f5d536874b46236fb3c74fb09052feb114d212b0" + } +} diff --git a/examples/deno/index.ts b/examples/deno/index.ts new file mode 100644 index 0000000..abfd25e --- /dev/null +++ b/examples/deno/index.ts @@ -0,0 +1,9 @@ +import { core } from 'https://esm.sh/@commercelayer/js-auth' + +const auth = await core.authentication('client_credentials', { + clientId: 'BISG8bb3GWpC8_D7Nt1SuWWdieS5bJq831A50LgB_Ig', + slug: 'demo-store', + scope: 'market:11279' +}) + +console.log(auth) diff --git a/examples/deno/readme.md b/examples/deno/readme.md new file mode 100644 index 0000000..3045023 --- /dev/null +++ b/examples/deno/readme.md @@ -0,0 +1,13 @@ +# "Deno" example + +## Get started + +First of all you need to install [Deno](https://docs.deno.com/runtime/manual) on your machine. + +```sh +deno run --allow-net index.ts + +# or + +deno task start +``` \ No newline at end of file From a75d3feba3814c40a214f084eb98f28430e5dc85 Mon Sep 17 00:00:00 2001 From: Marco Montalbano Date: Mon, 18 Mar 2024 09:41:24 +0100 Subject: [PATCH 4/7] Add 'bun' example --- examples/bun/bun.lockb | Bin 0 -> 1259 bytes examples/bun/index.ts | 9 +++++++++ examples/bun/package.json | 12 ++++++++++++ examples/bun/readme.md | 13 +++++++++++++ 4 files changed, 34 insertions(+) create mode 100755 examples/bun/bun.lockb create mode 100644 examples/bun/index.ts create mode 100644 examples/bun/package.json create mode 100644 examples/bun/readme.md diff --git a/examples/bun/bun.lockb b/examples/bun/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..2bf4a427bf5a058058505635f4d00493260013d2 GIT binary patch literal 1259 zcmY#Z)GsYA(of3F(@)JSQ%EY!;{sycoc!eMw9K4T-L(9o+{6;yG6OCq1_p+-t09cy zuPo)+mFF)Hx4dh=cB!7R17Cw(`DO8$C*Mt+8_fb#1Oy97pg4}@Y4pja> z{(s1l#2SiE9nd^R28g-HMziEqhS@)TCZD{n?|{J8j`XA73-)P-7c5-1F!}Q`?rCvL z8h5;&JTKYe?z4Li$EWR8cvSB7PB8B7qkXw4GnDrJ6)ZdMfzn(yrN%~fK#e$zFo3EvAwoUK{0ykNCb;@&BeU323!pR2;C2{dI1`+{VdybZ#i_YvsYQCO6(y-fd5Jl}B}JKe>2?Z+2#YM>7X5&l6b#LU zKz{?>WQf&C4$1ksxv53TsX2+2sYUu(#kz^5B^endB?ZM+`uatw>6yhPMU{Ga1-V(p edih1^`q(w->%z3^n(7$=Jyeoj1quAYM*;v?2Fv~c literal 0 HcmV?d00001 diff --git a/examples/bun/index.ts b/examples/bun/index.ts new file mode 100644 index 0000000..9443a47 --- /dev/null +++ b/examples/bun/index.ts @@ -0,0 +1,9 @@ +import { core } from '@commercelayer/js-auth' + +const auth = await core.authentication('client_credentials', { + clientId: 'BISG8bb3GWpC8_D7Nt1SuWWdieS5bJq831A50LgB_Ig', + slug: 'demo-store', + scope: 'market:11279' +}) + +console.log(auth) diff --git a/examples/bun/package.json b/examples/bun/package.json new file mode 100644 index 0000000..cf7eef2 --- /dev/null +++ b/examples/bun/package.json @@ -0,0 +1,12 @@ +{ + "private": true, + "name": "bun", + "type": "module", + "main": "index.ts", + "scripts": { + "start": "bun run index.ts" + }, + "dependencies": { + "@commercelayer/js-auth": "^5.2.0" + } +} diff --git a/examples/bun/readme.md b/examples/bun/readme.md new file mode 100644 index 0000000..90a158b --- /dev/null +++ b/examples/bun/readme.md @@ -0,0 +1,13 @@ +# "Bun" example + +## Get started + +First of all you need to install [Bun](https://bun.sh/) on your machine. + +```sh +bun run index.ts + +# or + +bun start +``` \ No newline at end of file From c8579ec18c04ca3f0ba345f9f65e423ef345d583 Mon Sep 17 00:00:00 2001 From: Marco Montalbano Date: Mon, 18 Mar 2024 09:41:24 +0100 Subject: [PATCH 5/7] docs: add 'bun' example --- .../tmp/bundle-z6vT4C/checked-fetch.js | 30 ++ .../middleware-insertion-facade.js | 27 ++ .../bundle-z6vT4C/middleware-loader.entry.ts | 136 +++++++++ .../.wrangler/tmp/dev-9wNxY1/index.js | 259 ++++++++++++++++++ .../.wrangler/tmp/dev-9wNxY1/index.js.map | 8 + 5 files changed, 460 insertions(+) create mode 100644 examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/checked-fetch.js create mode 100644 examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js create mode 100644 examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-loader.entry.ts create mode 100644 examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js create mode 100644 examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js.map diff --git a/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/checked-fetch.js b/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/checked-fetch.js new file mode 100644 index 0000000..cf630c0 --- /dev/null +++ b/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/checked-fetch.js @@ -0,0 +1,30 @@ +const urls = new Set(); + +function checkURL(request, init) { + const url = + request instanceof URL + ? request + : new URL( + (typeof request === "string" + ? new Request(request, init) + : request + ).url + ); + if (url.port && url.port !== "443" && url.protocol === "https:") { + if (!urls.has(url.toString())) { + urls.add(url.toString()); + console.warn( + `WARNING: known issue with \`fetch()\` requests to custom HTTPS ports in published Workers:\n` + + ` - ${url.toString()} - the custom port will be ignored when the Worker is published using the \`wrangler deploy\` command.\n` + ); + } + } +} + +globalThis.fetch = new Proxy(globalThis.fetch, { + apply(target, thisArg, argArray) { + const [request, init] = argArray; + checkURL(request, init); + return Reflect.apply(target, thisArg, argArray); + }, +}); diff --git a/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js b/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js new file mode 100644 index 0000000..7a8b2d7 --- /dev/null +++ b/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js @@ -0,0 +1,27 @@ + import worker, * as OTHER_EXPORTS from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/src/index.ts"; + import * as __MIDDLEWARE_0__ from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts"; +import * as __MIDDLEWARE_1__ from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-miniflare3-json-error.ts"; + const envWrappers = [__MIDDLEWARE_0__.wrap,__MIDDLEWARE_1__.wrap].filter(Boolean); + const facade = { + ...worker, + envWrappers, + middleware: [ + __MIDDLEWARE_0__.default,__MIDDLEWARE_1__.default, + ...(worker.middleware ? worker.middleware : []), + ].filter(Boolean) + } + export * from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/src/index.ts"; + + const maskDurableObjectDefinition = (cls) => + class extends cls { + constructor(state, env) { + let wrappedEnv = env + for (const wrapFn of envWrappers) { + wrappedEnv = wrapFn(wrappedEnv) + } + super(state, wrappedEnv); + } + }; + + + export default facade; \ No newline at end of file diff --git a/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-loader.entry.ts b/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-loader.entry.ts new file mode 100644 index 0000000..ed3f6b3 --- /dev/null +++ b/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-loader.entry.ts @@ -0,0 +1,136 @@ +// // This loads all middlewares exposed on the middleware object +// // and then starts the invocation chain. +// // The big idea is that we can add these to the middleware export dynamically +// // through wrangler, or we can potentially let users directly add them as a sort +// // of "plugin" system. + +import worker from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js"; +import { + __facade_invoke__, + __facade_register__, + Dispatcher, + Middleware, +} from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/common.ts"; + +// We need to preserve all of the exports from the worker +export * from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js"; + +class __Facade_ScheduledController__ implements ScheduledController { + #noRetry: ScheduledController["noRetry"]; + + constructor( + readonly scheduledTime: number, + readonly cron: string, + noRetry: ScheduledController["noRetry"] + ) { + this.#noRetry = noRetry; + } + + noRetry() { + if (!(this instanceof __Facade_ScheduledController__)) { + throw new TypeError("Illegal invocation"); + } + // Need to call native method immediately in case uncaught error thrown + this.#noRetry(); + } +} + +const __facade_modules_fetch__: ExportedHandlerFetchHandler = function ( + request, + env, + ctx +) { + if (worker.fetch === undefined) + throw new Error("Handler does not export a fetch() function."); + return worker.fetch(request, env, ctx); +}; + +function getMaskedEnv(rawEnv: unknown) { + let env = rawEnv as Record; + if (worker.envWrappers && worker.envWrappers.length > 0) { + for (const wrapFn of worker.envWrappers) { + env = wrapFn(env); + } + } + return env; +} + +/** + * This type is here to cause a type error if a new export handler is added to + * `ExportHandler` without it being included in the `facade` below. + */ +type MissingExportHandlers = Omit< + Required, + "tail" | "trace" | "scheduled" | "queue" | "test" | "email" | "fetch" +>; + +let registeredMiddleware = false; + +const facade: ExportedHandler & MissingExportHandlers = { + ...(worker.tail && { + tail: maskHandlerEnv(worker.tail), + }), + ...(worker.trace && { + trace: maskHandlerEnv(worker.trace), + }), + ...(worker.scheduled && { + scheduled: maskHandlerEnv(worker.scheduled), + }), + ...(worker.queue && { + queue: maskHandlerEnv(worker.queue), + }), + ...(worker.test && { + test: maskHandlerEnv(worker.test), + }), + ...(worker.email && { + email: maskHandlerEnv(worker.email), + }), + + fetch(request, rawEnv, ctx) { + const env = getMaskedEnv(rawEnv); + // Get the chain of middleware from the worker object + if (worker.middleware && worker.middleware.length > 0) { + // Make sure we only register middleware once: + // https://github.com/cloudflare/workers-sdk/issues/2386#issuecomment-1614715911 + if (!registeredMiddleware) { + registeredMiddleware = true; + for (const middleware of worker.middleware) { + __facade_register__(middleware); + } + } + + const __facade_modules_dispatch__: Dispatcher = function (type, init) { + if (type === "scheduled" && worker.scheduled !== undefined) { + const controller = new __Facade_ScheduledController__( + Date.now(), + init.cron ?? "", + () => {} + ); + return worker.scheduled(controller, env, ctx); + } + }; + + return __facade_invoke__( + request, + env, + ctx, + __facade_modules_dispatch__, + __facade_modules_fetch__ + ); + } else { + // We didn't have any middleware so we can skip the invocation chain, + // and just call the fetch handler directly + + // We "don't care" if this is undefined as we want to have the same behavior + // as if the worker completely bypassed middleware. + return __facade_modules_fetch__(request, env, ctx); + } + }, +}; + +type HandlerFn = (data: D, env: unknown, ctx: ExecutionContext) => R; +function maskHandlerEnv(handler: HandlerFn): HandlerFn { + return (data, env, ctx) => handler(data, getMaskedEnv(env), ctx); +} + +export default facade; diff --git a/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js b/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js new file mode 100644 index 0000000..b996aaf --- /dev/null +++ b/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js @@ -0,0 +1,259 @@ +// .wrangler/tmp/bundle-z6vT4C/checked-fetch.js +var urls = /* @__PURE__ */ new Set(); +function checkURL(request, init) { + const url = request instanceof URL ? request : new URL( + (typeof request === "string" ? new Request(request, init) : request).url + ); + if (url.port && url.port !== "443" && url.protocol === "https:") { + if (!urls.has(url.toString())) { + urls.add(url.toString()); + console.warn( + `WARNING: known issue with \`fetch()\` requests to custom HTTPS ports in published Workers: + - ${url.toString()} - the custom port will be ignored when the Worker is published using the \`wrangler deploy\` command. +` + ); + } + } +} +globalThis.fetch = new Proxy(globalThis.fetch, { + apply(target, thisArg, argArray) { + const [request, init] = argArray; + checkURL(request, init); + return Reflect.apply(target, thisArg, argArray); + } +}); + +// ../../packages/js-auth/dist/index.js +function camelCaseToSnake(str) { + return str.replace(/[A-Z]/g, function(letter) { + return "_" + letter.toLowerCase(); + }); +} +function snakeToCamelCase(str) { + return str.replace( + /([-_][a-z])/g, + (group) => group.toUpperCase().replace("-", "").replace("_", "") + ); +} +async function doRequest({ + attributes, + headers, + endpoint +}) { + const body = Object.keys(attributes).reduce((acc, key) => { + const camelKey = camelCaseToSnake(key); + acc[camelKey] = attributes[key]; + return acc; + }, {}); + return await fetch(endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + ...headers + }, + body: JSON.stringify(body) + }).then(async (response) => { + const json = await response.json(); + json.expires = new Date(Date.now() + json.expires_in * 1e3); + return Object.keys(json).reduce((acc, key) => { + const camelKey = snakeToCamelCase(key); + acc[camelKey] = json[key]; + return acc; + }, {}); + }); +} +async function authentication(grantType, { domain = "commercelayer.io", slug, headers, ...options }) { + return await doRequest({ + attributes: { + grant_type: grantType, + ...options + }, + endpoint: `https://${slug}.${domain}/oauth/token`, + headers + }); +} +var core = { + authentication +}; + +// src/index.ts +var src_default = { + async fetch(request, env, ctx) { + const auth = await core.authentication("client_credentials", { + clientId: "BISG8bb3GWpC8_D7Nt1SuWWdieS5bJq831A50LgB_Ig", + slug: "demo-store", + scope: "market:11279" + }); + return new Response(`Hello World! + +This is your token: ${auth.accessToken}`); + } +}; + +// ../../node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts +var drainBody = async (request, env, _ctx, middlewareCtx) => { + try { + return await middlewareCtx.next(request, env); + } finally { + try { + if (request.body !== null && !request.bodyUsed) { + const reader = request.body.getReader(); + while (!(await reader.read()).done) { + } + } + } catch (e) { + console.error("Failed to drain the unused request body.", e); + } + } +}; +var middleware_ensure_req_body_drained_default = drainBody; +var wrap = void 0; + +// ../../node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-miniflare3-json-error.ts +function reduceError(e) { + return { + name: e?.name, + message: e?.message ?? String(e), + stack: e?.stack, + cause: e?.cause === void 0 ? void 0 : reduceError(e.cause) + }; +} +var jsonError = async (request, env, _ctx, middlewareCtx) => { + try { + return await middlewareCtx.next(request, env); + } catch (e) { + const error = reduceError(e); + return Response.json(error, { + status: 500, + headers: { "MF-Experimental-Error-Stack": "true" } + }); + } +}; +var middleware_miniflare3_json_error_default = jsonError; +var wrap2 = void 0; + +// .wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js +var envWrappers = [wrap, wrap2].filter(Boolean); +var facade = { + ...src_default, + envWrappers, + middleware: [ + middleware_ensure_req_body_drained_default, + middleware_miniflare3_json_error_default, + ...src_default.middleware ? src_default.middleware : [] + ].filter(Boolean) +}; +var middleware_insertion_facade_default = facade; + +// ../../node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/common.ts +var __facade_middleware__ = []; +function __facade_register__(...args) { + __facade_middleware__.push(...args.flat()); +} +function __facade_invokeChain__(request, env, ctx, dispatch, middlewareChain) { + const [head, ...tail] = middlewareChain; + const middlewareCtx = { + dispatch, + next(newRequest, newEnv) { + return __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail); + } + }; + return head(request, env, ctx, middlewareCtx); +} +function __facade_invoke__(request, env, ctx, dispatch, finalMiddleware) { + return __facade_invokeChain__(request, env, ctx, dispatch, [ + ...__facade_middleware__, + finalMiddleware + ]); +} + +// .wrangler/tmp/bundle-z6vT4C/middleware-loader.entry.ts +var __Facade_ScheduledController__ = class { + constructor(scheduledTime, cron, noRetry) { + this.scheduledTime = scheduledTime; + this.cron = cron; + this.#noRetry = noRetry; + } + #noRetry; + noRetry() { + if (!(this instanceof __Facade_ScheduledController__)) { + throw new TypeError("Illegal invocation"); + } + this.#noRetry(); + } +}; +var __facade_modules_fetch__ = function(request, env, ctx) { + if (middleware_insertion_facade_default.fetch === void 0) + throw new Error("Handler does not export a fetch() function."); + return middleware_insertion_facade_default.fetch(request, env, ctx); +}; +function getMaskedEnv(rawEnv) { + let env = rawEnv; + if (middleware_insertion_facade_default.envWrappers && middleware_insertion_facade_default.envWrappers.length > 0) { + for (const wrapFn of middleware_insertion_facade_default.envWrappers) { + env = wrapFn(env); + } + } + return env; +} +var registeredMiddleware = false; +var facade2 = { + ...middleware_insertion_facade_default.tail && { + tail: maskHandlerEnv(middleware_insertion_facade_default.tail) + }, + ...middleware_insertion_facade_default.trace && { + trace: maskHandlerEnv(middleware_insertion_facade_default.trace) + }, + ...middleware_insertion_facade_default.scheduled && { + scheduled: maskHandlerEnv(middleware_insertion_facade_default.scheduled) + }, + ...middleware_insertion_facade_default.queue && { + queue: maskHandlerEnv(middleware_insertion_facade_default.queue) + }, + ...middleware_insertion_facade_default.test && { + test: maskHandlerEnv(middleware_insertion_facade_default.test) + }, + ...middleware_insertion_facade_default.email && { + email: maskHandlerEnv(middleware_insertion_facade_default.email) + }, + fetch(request, rawEnv, ctx) { + const env = getMaskedEnv(rawEnv); + if (middleware_insertion_facade_default.middleware && middleware_insertion_facade_default.middleware.length > 0) { + if (!registeredMiddleware) { + registeredMiddleware = true; + for (const middleware of middleware_insertion_facade_default.middleware) { + __facade_register__(middleware); + } + } + const __facade_modules_dispatch__ = function(type, init) { + if (type === "scheduled" && middleware_insertion_facade_default.scheduled !== void 0) { + const controller = new __Facade_ScheduledController__( + Date.now(), + init.cron ?? "", + () => { + } + ); + return middleware_insertion_facade_default.scheduled(controller, env, ctx); + } + }; + return __facade_invoke__( + request, + env, + ctx, + __facade_modules_dispatch__, + __facade_modules_fetch__ + ); + } else { + return __facade_modules_fetch__(request, env, ctx); + } + } +}; +function maskHandlerEnv(handler) { + return (data, env, ctx) => handler(data, getMaskedEnv(env), ctx); +} +var middleware_loader_entry_default = facade2; +export { + middleware_loader_entry_default as default +}; +//# sourceMappingURL=index.js.map diff --git a/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js.map b/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js.map new file mode 100644 index 0000000..3871974 --- /dev/null +++ b/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": ["../bundle-z6vT4C/checked-fetch.js", "../../../../../packages/js-auth/dist/index.js", "../../../src/index.ts", "../../../../../node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts", "../../../../../node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-miniflare3-json-error.ts", "../bundle-z6vT4C/middleware-insertion-facade.js", "../../../../../node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/common.ts", "../bundle-z6vT4C/middleware-loader.entry.ts"], + "sourceRoot": "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1", + "sourcesContent": ["const urls = new Set();\n\nfunction checkURL(request, init) {\n\tconst url =\n\t\trequest instanceof URL\n\t\t\t? request\n\t\t\t: new URL(\n\t\t\t\t\t(typeof request === \"string\"\n\t\t\t\t\t\t? new Request(request, init)\n\t\t\t\t\t\t: request\n\t\t\t\t\t).url\n\t\t\t );\n\tif (url.port && url.port !== \"443\" && url.protocol === \"https:\") {\n\t\tif (!urls.has(url.toString())) {\n\t\t\turls.add(url.toString());\n\t\t\tconsole.warn(\n\t\t\t\t`WARNING: known issue with \\`fetch()\\` requests to custom HTTPS ports in published Workers:\\n` +\n\t\t\t\t\t` - ${url.toString()} - the custom port will be ignored when the Worker is published using the \\`wrangler deploy\\` command.\\n`\n\t\t\t);\n\t\t}\n\t}\n}\n\nglobalThis.fetch = new Proxy(globalThis.fetch, {\n\tapply(target, thisArg, argArray) {\n\t\tconst [request, init] = argArray;\n\t\tcheckURL(request, init);\n\t\treturn Reflect.apply(target, thisArg, argArray);\n\t},\n});\n", "// src/utils/camelCaseToSnake.ts\nfunction camelCaseToSnake(str) {\n return str.replace(/[A-Z]/g, function(letter) {\n return \"_\" + letter.toLowerCase();\n });\n}\n\n// src/utils/snakeToCamelCase.ts\nfunction snakeToCamelCase(str) {\n return str.replace(\n /([-_][a-z])/g,\n (group) => group.toUpperCase().replace(\"-\", \"\").replace(\"_\", \"\")\n );\n}\n\n// src/utils/doRequest.ts\nasync function doRequest({\n attributes,\n headers,\n endpoint\n}) {\n const body = Object.keys(attributes).reduce((acc, key) => {\n const camelKey = camelCaseToSnake(key);\n acc[camelKey] = attributes[key];\n return acc;\n }, {});\n return await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...headers\n },\n body: JSON.stringify(body)\n }).then(async (response) => {\n const json = await response.json();\n json.expires = new Date(Date.now() + json.expires_in * 1e3);\n return Object.keys(json).reduce((acc, key) => {\n const camelKey = snakeToCamelCase(key);\n acc[camelKey] = json[key];\n return acc;\n }, {});\n });\n}\n\n// src/core.ts\nasync function authentication(grantType, { domain = \"commercelayer.io\", slug, headers, ...options }) {\n return await doRequest({\n attributes: {\n grant_type: grantType,\n ...options\n },\n endpoint: `https://${slug}.${domain}/oauth/token`,\n headers\n });\n}\nvar core = {\n authentication\n};\n\n// src/provisioning.ts\nasync function authentication2({\n domain = \"commercelayer.io\",\n headers,\n ...options\n}) {\n return await doRequest({\n attributes: {\n grant_type: \"client_credentials\",\n scope: \"provisioning-api\",\n ...options\n },\n endpoint: `https://auth.${domain}/oauth/token`,\n headers\n });\n}\nvar provisioning = {\n authentication: authentication2\n};\nexport {\n core,\n provisioning\n};\n", "/**\n * Welcome to Cloudflare Workers! This is your first worker.\n *\n * - Run `npm run dev` in your terminal to start a development server\n * - Open a browser tab at http://localhost:8787/ to see your worker in action\n * - Run `npm run deploy` to publish your worker\n *\n * Learn more at https://developers.cloudflare.com/workers/\n */\n\nimport { core } from '@commercelayer/js-auth'\n\nexport interface Env {\n // Example binding to KV. Learn more at https://developers.cloudflare.com/workers/runtime-apis/kv/\n // MY_KV_NAMESPACE: KVNamespace;\n //\n // Example binding to Durable Object. Learn more at https://developers.cloudflare.com/workers/runtime-apis/durable-objects/\n // MY_DURABLE_OBJECT: DurableObjectNamespace;\n //\n // Example binding to R2. Learn more at https://developers.cloudflare.com/workers/runtime-apis/r2/\n // MY_BUCKET: R2Bucket;\n //\n // Example binding to a Service. Learn more at https://developers.cloudflare.com/workers/runtime-apis/service-bindings/\n // MY_SERVICE: Fetcher;\n //\n // Example binding to a Queue. Learn more at https://developers.cloudflare.com/queues/javascript-apis/\n // MY_QUEUE: Queue;\n}\n\nexport default {\n async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise {\n const auth = await core.authentication('client_credentials', {\n clientId: 'BISG8bb3GWpC8_D7Nt1SuWWdieS5bJq831A50LgB_Ig',\n slug: 'demo-store',\n scope: 'market:11279'\n })\n\n return new Response(`Hello World!\\n\\nThis is your token: ${auth.accessToken}`);\n },\n};", "import type { Middleware } from \"./common\";\n\nconst drainBody: Middleware = async (request, env, _ctx, middlewareCtx) => {\n\ttry {\n\t\treturn await middlewareCtx.next(request, env);\n\t} finally {\n\t\ttry {\n\t\t\tif (request.body !== null && !request.bodyUsed) {\n\t\t\t\tconst reader = request.body.getReader();\n\t\t\t\twhile (!(await reader.read()).done) {}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Failed to drain the unused request body.\", e);\n\t\t}\n\t}\n};\n\nexport default drainBody;\nexport const wrap = undefined;\n", "import type { Middleware } from \"./common\";\n\ninterface JsonError {\n\tmessage?: string;\n\tname?: string;\n\tstack?: string;\n\tcause?: JsonError;\n}\n\nfunction reduceError(e: any): JsonError {\n\treturn {\n\t\tname: e?.name,\n\t\tmessage: e?.message ?? String(e),\n\t\tstack: e?.stack,\n\t\tcause: e?.cause === undefined ? undefined : reduceError(e.cause),\n\t};\n}\n\n// See comment in `bundle.ts` for details on why this is needed\nconst jsonError: Middleware = async (request, env, _ctx, middlewareCtx) => {\n\ttry {\n\t\treturn await middlewareCtx.next(request, env);\n\t} catch (e: any) {\n\t\tconst error = reduceError(e);\n\t\treturn Response.json(error, {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"MF-Experimental-Error-Stack\": \"true\" },\n\t\t});\n\t}\n};\n\nexport default jsonError;\nexport const wrap = undefined;\n", "\t\t\t\timport worker, * as OTHER_EXPORTS from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/src/index.ts\";\n\t\t\t\timport * as __MIDDLEWARE_0__ from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts\";\nimport * as __MIDDLEWARE_1__ from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-miniflare3-json-error.ts\";\n\t\t\t\tconst envWrappers = [__MIDDLEWARE_0__.wrap,__MIDDLEWARE_1__.wrap].filter(Boolean);\n\t\t\t\tconst facade = {\n\t\t\t\t\t...worker,\n\t\t\t\t\tenvWrappers,\n\t\t\t\t\tmiddleware: [\n\t\t\t\t\t\t__MIDDLEWARE_0__.default,__MIDDLEWARE_1__.default,\n ...(worker.middleware ? worker.middleware : []),\n\t\t\t\t\t].filter(Boolean)\n\t\t\t\t}\n\t\t\t\texport * from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/src/index.ts\";\n\n\t\t\t\tconst maskDurableObjectDefinition = (cls) =>\n\t\t\t\t\tclass extends cls {\n\t\t\t\t\t\tconstructor(state, env) {\n\t\t\t\t\t\t\tlet wrappedEnv = env\n\t\t\t\t\t\t\tfor (const wrapFn of envWrappers) {\n\t\t\t\t\t\t\t\twrappedEnv = wrapFn(wrappedEnv)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsuper(state, wrappedEnv);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\n\n\t\t\t\texport default facade;", "export type Awaitable = T | Promise;\n// TODO: allow dispatching more events?\nexport type Dispatcher = (\n\ttype: \"scheduled\",\n\tinit: { cron?: string }\n) => Awaitable;\n\nexport type IncomingRequest = Request<\n\tunknown,\n\tIncomingRequestCfProperties\n>;\n\nexport interface MiddlewareContext {\n\tdispatch: Dispatcher;\n\tnext(request: IncomingRequest, env: any): Awaitable;\n}\n\nexport type Middleware = (\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tmiddlewareCtx: MiddlewareContext\n) => Awaitable;\n\nconst __facade_middleware__: Middleware[] = [];\n\n// The register functions allow for the insertion of one or many middleware,\n// We register internal middleware first in the stack, but have no way of controlling\n// the order that addMiddleware is run in service workers so need an internal function.\nexport function __facade_register__(...args: (Middleware | Middleware[])[]) {\n\t__facade_middleware__.push(...args.flat());\n}\nexport function __facade_registerInternal__(\n\t...args: (Middleware | Middleware[])[]\n) {\n\t__facade_middleware__.unshift(...args.flat());\n}\n\nfunction __facade_invokeChain__(\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tdispatch: Dispatcher,\n\tmiddlewareChain: Middleware[]\n): Awaitable {\n\tconst [head, ...tail] = middlewareChain;\n\tconst middlewareCtx: MiddlewareContext = {\n\t\tdispatch,\n\t\tnext(newRequest, newEnv) {\n\t\t\treturn __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail);\n\t\t},\n\t};\n\treturn head(request, env, ctx, middlewareCtx);\n}\n\nexport function __facade_invoke__(\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tdispatch: Dispatcher,\n\tfinalMiddleware: Middleware\n): Awaitable {\n\treturn __facade_invokeChain__(request, env, ctx, dispatch, [\n\t\t...__facade_middleware__,\n\t\tfinalMiddleware,\n\t]);\n}\n", "// // This loads all middlewares exposed on the middleware object\n// // and then starts the invocation chain.\n// // The big idea is that we can add these to the middleware export dynamically\n// // through wrangler, or we can potentially let users directly add them as a sort\n// // of \"plugin\" system.\n\nimport worker from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js\";\nimport {\n\t__facade_invoke__,\n\t__facade_register__,\n\tDispatcher,\n\tMiddleware,\n} from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/common.ts\";\n\n// We need to preserve all of the exports from the worker\nexport * from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js\";\n\nclass __Facade_ScheduledController__ implements ScheduledController {\n\t#noRetry: ScheduledController[\"noRetry\"];\n\n\tconstructor(\n\t\treadonly scheduledTime: number,\n\t\treadonly cron: string,\n\t\tnoRetry: ScheduledController[\"noRetry\"]\n\t) {\n\t\tthis.#noRetry = noRetry;\n\t}\n\n\tnoRetry() {\n\t\tif (!(this instanceof __Facade_ScheduledController__)) {\n\t\t\tthrow new TypeError(\"Illegal invocation\");\n\t\t}\n\t\t// Need to call native method immediately in case uncaught error thrown\n\t\tthis.#noRetry();\n\t}\n}\n\nconst __facade_modules_fetch__: ExportedHandlerFetchHandler = function (\n\trequest,\n\tenv,\n\tctx\n) {\n\tif (worker.fetch === undefined)\n\t\tthrow new Error(\"Handler does not export a fetch() function.\");\n\treturn worker.fetch(request, env, ctx);\n};\n\nfunction getMaskedEnv(rawEnv: unknown) {\n\tlet env = rawEnv as Record;\n\tif (worker.envWrappers && worker.envWrappers.length > 0) {\n\t\tfor (const wrapFn of worker.envWrappers) {\n\t\t\tenv = wrapFn(env);\n\t\t}\n\t}\n\treturn env;\n}\n\n/**\n * This type is here to cause a type error if a new export handler is added to\n * `ExportHandler` without it being included in the `facade` below.\n */\ntype MissingExportHandlers = Omit<\n\tRequired,\n\t\"tail\" | \"trace\" | \"scheduled\" | \"queue\" | \"test\" | \"email\" | \"fetch\"\n>;\n\nlet registeredMiddleware = false;\n\nconst facade: ExportedHandler & MissingExportHandlers = {\n\t...(worker.tail && {\n\t\ttail: maskHandlerEnv(worker.tail),\n\t}),\n\t...(worker.trace && {\n\t\ttrace: maskHandlerEnv(worker.trace),\n\t}),\n\t...(worker.scheduled && {\n\t\tscheduled: maskHandlerEnv(worker.scheduled),\n\t}),\n\t...(worker.queue && {\n\t\tqueue: maskHandlerEnv(worker.queue),\n\t}),\n\t...(worker.test && {\n\t\ttest: maskHandlerEnv(worker.test),\n\t}),\n\t...(worker.email && {\n\t\temail: maskHandlerEnv(worker.email),\n\t}),\n\n\tfetch(request, rawEnv, ctx) {\n\t\tconst env = getMaskedEnv(rawEnv);\n\t\t// Get the chain of middleware from the worker object\n\t\tif (worker.middleware && worker.middleware.length > 0) {\n\t\t\t// Make sure we only register middleware once:\n\t\t\t// https://github.com/cloudflare/workers-sdk/issues/2386#issuecomment-1614715911\n\t\t\tif (!registeredMiddleware) {\n\t\t\t\tregisteredMiddleware = true;\n\t\t\t\tfor (const middleware of worker.middleware) {\n\t\t\t\t\t__facade_register__(middleware);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst __facade_modules_dispatch__: Dispatcher = function (type, init) {\n\t\t\t\tif (type === \"scheduled\" && worker.scheduled !== undefined) {\n\t\t\t\t\tconst controller = new __Facade_ScheduledController__(\n\t\t\t\t\t\tDate.now(),\n\t\t\t\t\t\tinit.cron ?? \"\",\n\t\t\t\t\t\t() => {}\n\t\t\t\t\t);\n\t\t\t\t\treturn worker.scheduled(controller, env, ctx);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn __facade_invoke__(\n\t\t\t\trequest,\n\t\t\t\tenv,\n\t\t\t\tctx,\n\t\t\t\t__facade_modules_dispatch__,\n\t\t\t\t__facade_modules_fetch__\n\t\t\t);\n\t\t} else {\n\t\t\t// We didn't have any middleware so we can skip the invocation chain,\n\t\t\t// and just call the fetch handler directly\n\n\t\t\t// We \"don't care\" if this is undefined as we want to have the same behavior\n\t\t\t// as if the worker completely bypassed middleware.\n\t\t\treturn __facade_modules_fetch__(request, env, ctx);\n\t\t}\n\t},\n};\n\ntype HandlerFn = (data: D, env: unknown, ctx: ExecutionContext) => R;\nfunction maskHandlerEnv(handler: HandlerFn): HandlerFn {\n\treturn (data, env, ctx) => handler(data, getMaskedEnv(env), ctx);\n}\n\nexport default facade;\n"], + "mappings": "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", + "names": ["wrap", "wrap", "facade"] +} From d3b58003033c4f865117f0971c75dc29d52857ea Mon Sep 17 00:00:00 2001 From: Marco Montalbano Date: Mon, 18 Mar 2024 09:46:48 +0100 Subject: [PATCH 6/7] docs: add 'cloudflare-workers' example (skeleton) --- examples/cloudflare-workers/.editorconfig | 12 + examples/cloudflare-workers/.gitignore | 172 ++++ examples/cloudflare-workers/.prettierrc | 6 + .../tmp/bundle-z6vT4C/checked-fetch.js | 30 - .../middleware-insertion-facade.js | 27 - .../bundle-z6vT4C/middleware-loader.entry.ts | 136 ---- .../.wrangler/tmp/dev-9wNxY1/index.js | 259 ------ .../.wrangler/tmp/dev-9wNxY1/index.js.map | 8 - examples/cloudflare-workers/package.json | 18 + examples/cloudflare-workers/readme.md | 47 ++ examples/cloudflare-workers/src/index.ts | 32 + .../cloudflare-workers/test/index.spec.ts | 25 + .../cloudflare-workers/test/tsconfig.json | 11 + examples/cloudflare-workers/tsconfig.json | 104 +++ examples/cloudflare-workers/vitest.config.ts | 11 + examples/cloudflare-workers/wrangler.toml | 52 ++ pnpm-lock.yaml | 735 ++++++++++++++++++ 17 files changed, 1225 insertions(+), 460 deletions(-) create mode 100644 examples/cloudflare-workers/.editorconfig create mode 100644 examples/cloudflare-workers/.gitignore create mode 100644 examples/cloudflare-workers/.prettierrc delete mode 100644 examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/checked-fetch.js delete mode 100644 examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js delete mode 100644 examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-loader.entry.ts delete mode 100644 examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js delete mode 100644 examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js.map create mode 100644 examples/cloudflare-workers/package.json create mode 100644 examples/cloudflare-workers/readme.md create mode 100644 examples/cloudflare-workers/src/index.ts create mode 100644 examples/cloudflare-workers/test/index.spec.ts create mode 100644 examples/cloudflare-workers/test/tsconfig.json create mode 100644 examples/cloudflare-workers/tsconfig.json create mode 100644 examples/cloudflare-workers/vitest.config.ts create mode 100644 examples/cloudflare-workers/wrangler.toml diff --git a/examples/cloudflare-workers/.editorconfig b/examples/cloudflare-workers/.editorconfig new file mode 100644 index 0000000..a727df3 --- /dev/null +++ b/examples/cloudflare-workers/.editorconfig @@ -0,0 +1,12 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = tab +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.yml] +indent_style = space diff --git a/examples/cloudflare-workers/.gitignore b/examples/cloudflare-workers/.gitignore new file mode 100644 index 0000000..3b0fe33 --- /dev/null +++ b/examples/cloudflare-workers/.gitignore @@ -0,0 +1,172 @@ +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# wrangler project + +.dev.vars +.wrangler/ diff --git a/examples/cloudflare-workers/.prettierrc b/examples/cloudflare-workers/.prettierrc new file mode 100644 index 0000000..5c7b5d3 --- /dev/null +++ b/examples/cloudflare-workers/.prettierrc @@ -0,0 +1,6 @@ +{ + "printWidth": 140, + "singleQuote": true, + "semi": true, + "useTabs": true +} diff --git a/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/checked-fetch.js b/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/checked-fetch.js deleted file mode 100644 index cf630c0..0000000 --- a/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/checked-fetch.js +++ /dev/null @@ -1,30 +0,0 @@ -const urls = new Set(); - -function checkURL(request, init) { - const url = - request instanceof URL - ? request - : new URL( - (typeof request === "string" - ? new Request(request, init) - : request - ).url - ); - if (url.port && url.port !== "443" && url.protocol === "https:") { - if (!urls.has(url.toString())) { - urls.add(url.toString()); - console.warn( - `WARNING: known issue with \`fetch()\` requests to custom HTTPS ports in published Workers:\n` + - ` - ${url.toString()} - the custom port will be ignored when the Worker is published using the \`wrangler deploy\` command.\n` - ); - } - } -} - -globalThis.fetch = new Proxy(globalThis.fetch, { - apply(target, thisArg, argArray) { - const [request, init] = argArray; - checkURL(request, init); - return Reflect.apply(target, thisArg, argArray); - }, -}); diff --git a/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js b/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js deleted file mode 100644 index 7a8b2d7..0000000 --- a/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js +++ /dev/null @@ -1,27 +0,0 @@ - import worker, * as OTHER_EXPORTS from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/src/index.ts"; - import * as __MIDDLEWARE_0__ from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts"; -import * as __MIDDLEWARE_1__ from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-miniflare3-json-error.ts"; - const envWrappers = [__MIDDLEWARE_0__.wrap,__MIDDLEWARE_1__.wrap].filter(Boolean); - const facade = { - ...worker, - envWrappers, - middleware: [ - __MIDDLEWARE_0__.default,__MIDDLEWARE_1__.default, - ...(worker.middleware ? worker.middleware : []), - ].filter(Boolean) - } - export * from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/src/index.ts"; - - const maskDurableObjectDefinition = (cls) => - class extends cls { - constructor(state, env) { - let wrappedEnv = env - for (const wrapFn of envWrappers) { - wrappedEnv = wrapFn(wrappedEnv) - } - super(state, wrappedEnv); - } - }; - - - export default facade; \ No newline at end of file diff --git a/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-loader.entry.ts b/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-loader.entry.ts deleted file mode 100644 index ed3f6b3..0000000 --- a/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-loader.entry.ts +++ /dev/null @@ -1,136 +0,0 @@ -// // This loads all middlewares exposed on the middleware object -// // and then starts the invocation chain. -// // The big idea is that we can add these to the middleware export dynamically -// // through wrangler, or we can potentially let users directly add them as a sort -// // of "plugin" system. - -import worker from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js"; -import { - __facade_invoke__, - __facade_register__, - Dispatcher, - Middleware, -} from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/common.ts"; - -// We need to preserve all of the exports from the worker -export * from "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js"; - -class __Facade_ScheduledController__ implements ScheduledController { - #noRetry: ScheduledController["noRetry"]; - - constructor( - readonly scheduledTime: number, - readonly cron: string, - noRetry: ScheduledController["noRetry"] - ) { - this.#noRetry = noRetry; - } - - noRetry() { - if (!(this instanceof __Facade_ScheduledController__)) { - throw new TypeError("Illegal invocation"); - } - // Need to call native method immediately in case uncaught error thrown - this.#noRetry(); - } -} - -const __facade_modules_fetch__: ExportedHandlerFetchHandler = function ( - request, - env, - ctx -) { - if (worker.fetch === undefined) - throw new Error("Handler does not export a fetch() function."); - return worker.fetch(request, env, ctx); -}; - -function getMaskedEnv(rawEnv: unknown) { - let env = rawEnv as Record; - if (worker.envWrappers && worker.envWrappers.length > 0) { - for (const wrapFn of worker.envWrappers) { - env = wrapFn(env); - } - } - return env; -} - -/** - * This type is here to cause a type error if a new export handler is added to - * `ExportHandler` without it being included in the `facade` below. - */ -type MissingExportHandlers = Omit< - Required, - "tail" | "trace" | "scheduled" | "queue" | "test" | "email" | "fetch" ->; - -let registeredMiddleware = false; - -const facade: ExportedHandler & MissingExportHandlers = { - ...(worker.tail && { - tail: maskHandlerEnv(worker.tail), - }), - ...(worker.trace && { - trace: maskHandlerEnv(worker.trace), - }), - ...(worker.scheduled && { - scheduled: maskHandlerEnv(worker.scheduled), - }), - ...(worker.queue && { - queue: maskHandlerEnv(worker.queue), - }), - ...(worker.test && { - test: maskHandlerEnv(worker.test), - }), - ...(worker.email && { - email: maskHandlerEnv(worker.email), - }), - - fetch(request, rawEnv, ctx) { - const env = getMaskedEnv(rawEnv); - // Get the chain of middleware from the worker object - if (worker.middleware && worker.middleware.length > 0) { - // Make sure we only register middleware once: - // https://github.com/cloudflare/workers-sdk/issues/2386#issuecomment-1614715911 - if (!registeredMiddleware) { - registeredMiddleware = true; - for (const middleware of worker.middleware) { - __facade_register__(middleware); - } - } - - const __facade_modules_dispatch__: Dispatcher = function (type, init) { - if (type === "scheduled" && worker.scheduled !== undefined) { - const controller = new __Facade_ScheduledController__( - Date.now(), - init.cron ?? "", - () => {} - ); - return worker.scheduled(controller, env, ctx); - } - }; - - return __facade_invoke__( - request, - env, - ctx, - __facade_modules_dispatch__, - __facade_modules_fetch__ - ); - } else { - // We didn't have any middleware so we can skip the invocation chain, - // and just call the fetch handler directly - - // We "don't care" if this is undefined as we want to have the same behavior - // as if the worker completely bypassed middleware. - return __facade_modules_fetch__(request, env, ctx); - } - }, -}; - -type HandlerFn = (data: D, env: unknown, ctx: ExecutionContext) => R; -function maskHandlerEnv(handler: HandlerFn): HandlerFn { - return (data, env, ctx) => handler(data, getMaskedEnv(env), ctx); -} - -export default facade; diff --git a/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js b/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js deleted file mode 100644 index b996aaf..0000000 --- a/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js +++ /dev/null @@ -1,259 +0,0 @@ -// .wrangler/tmp/bundle-z6vT4C/checked-fetch.js -var urls = /* @__PURE__ */ new Set(); -function checkURL(request, init) { - const url = request instanceof URL ? request : new URL( - (typeof request === "string" ? new Request(request, init) : request).url - ); - if (url.port && url.port !== "443" && url.protocol === "https:") { - if (!urls.has(url.toString())) { - urls.add(url.toString()); - console.warn( - `WARNING: known issue with \`fetch()\` requests to custom HTTPS ports in published Workers: - - ${url.toString()} - the custom port will be ignored when the Worker is published using the \`wrangler deploy\` command. -` - ); - } - } -} -globalThis.fetch = new Proxy(globalThis.fetch, { - apply(target, thisArg, argArray) { - const [request, init] = argArray; - checkURL(request, init); - return Reflect.apply(target, thisArg, argArray); - } -}); - -// ../../packages/js-auth/dist/index.js -function camelCaseToSnake(str) { - return str.replace(/[A-Z]/g, function(letter) { - return "_" + letter.toLowerCase(); - }); -} -function snakeToCamelCase(str) { - return str.replace( - /([-_][a-z])/g, - (group) => group.toUpperCase().replace("-", "").replace("_", "") - ); -} -async function doRequest({ - attributes, - headers, - endpoint -}) { - const body = Object.keys(attributes).reduce((acc, key) => { - const camelKey = camelCaseToSnake(key); - acc[camelKey] = attributes[key]; - return acc; - }, {}); - return await fetch(endpoint, { - method: "POST", - headers: { - "Content-Type": "application/json", - Accept: "application/json", - ...headers - }, - body: JSON.stringify(body) - }).then(async (response) => { - const json = await response.json(); - json.expires = new Date(Date.now() + json.expires_in * 1e3); - return Object.keys(json).reduce((acc, key) => { - const camelKey = snakeToCamelCase(key); - acc[camelKey] = json[key]; - return acc; - }, {}); - }); -} -async function authentication(grantType, { domain = "commercelayer.io", slug, headers, ...options }) { - return await doRequest({ - attributes: { - grant_type: grantType, - ...options - }, - endpoint: `https://${slug}.${domain}/oauth/token`, - headers - }); -} -var core = { - authentication -}; - -// src/index.ts -var src_default = { - async fetch(request, env, ctx) { - const auth = await core.authentication("client_credentials", { - clientId: "BISG8bb3GWpC8_D7Nt1SuWWdieS5bJq831A50LgB_Ig", - slug: "demo-store", - scope: "market:11279" - }); - return new Response(`Hello World! - -This is your token: ${auth.accessToken}`); - } -}; - -// ../../node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts -var drainBody = async (request, env, _ctx, middlewareCtx) => { - try { - return await middlewareCtx.next(request, env); - } finally { - try { - if (request.body !== null && !request.bodyUsed) { - const reader = request.body.getReader(); - while (!(await reader.read()).done) { - } - } - } catch (e) { - console.error("Failed to drain the unused request body.", e); - } - } -}; -var middleware_ensure_req_body_drained_default = drainBody; -var wrap = void 0; - -// ../../node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-miniflare3-json-error.ts -function reduceError(e) { - return { - name: e?.name, - message: e?.message ?? String(e), - stack: e?.stack, - cause: e?.cause === void 0 ? void 0 : reduceError(e.cause) - }; -} -var jsonError = async (request, env, _ctx, middlewareCtx) => { - try { - return await middlewareCtx.next(request, env); - } catch (e) { - const error = reduceError(e); - return Response.json(error, { - status: 500, - headers: { "MF-Experimental-Error-Stack": "true" } - }); - } -}; -var middleware_miniflare3_json_error_default = jsonError; -var wrap2 = void 0; - -// .wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js -var envWrappers = [wrap, wrap2].filter(Boolean); -var facade = { - ...src_default, - envWrappers, - middleware: [ - middleware_ensure_req_body_drained_default, - middleware_miniflare3_json_error_default, - ...src_default.middleware ? src_default.middleware : [] - ].filter(Boolean) -}; -var middleware_insertion_facade_default = facade; - -// ../../node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/common.ts -var __facade_middleware__ = []; -function __facade_register__(...args) { - __facade_middleware__.push(...args.flat()); -} -function __facade_invokeChain__(request, env, ctx, dispatch, middlewareChain) { - const [head, ...tail] = middlewareChain; - const middlewareCtx = { - dispatch, - next(newRequest, newEnv) { - return __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail); - } - }; - return head(request, env, ctx, middlewareCtx); -} -function __facade_invoke__(request, env, ctx, dispatch, finalMiddleware) { - return __facade_invokeChain__(request, env, ctx, dispatch, [ - ...__facade_middleware__, - finalMiddleware - ]); -} - -// .wrangler/tmp/bundle-z6vT4C/middleware-loader.entry.ts -var __Facade_ScheduledController__ = class { - constructor(scheduledTime, cron, noRetry) { - this.scheduledTime = scheduledTime; - this.cron = cron; - this.#noRetry = noRetry; - } - #noRetry; - noRetry() { - if (!(this instanceof __Facade_ScheduledController__)) { - throw new TypeError("Illegal invocation"); - } - this.#noRetry(); - } -}; -var __facade_modules_fetch__ = function(request, env, ctx) { - if (middleware_insertion_facade_default.fetch === void 0) - throw new Error("Handler does not export a fetch() function."); - return middleware_insertion_facade_default.fetch(request, env, ctx); -}; -function getMaskedEnv(rawEnv) { - let env = rawEnv; - if (middleware_insertion_facade_default.envWrappers && middleware_insertion_facade_default.envWrappers.length > 0) { - for (const wrapFn of middleware_insertion_facade_default.envWrappers) { - env = wrapFn(env); - } - } - return env; -} -var registeredMiddleware = false; -var facade2 = { - ...middleware_insertion_facade_default.tail && { - tail: maskHandlerEnv(middleware_insertion_facade_default.tail) - }, - ...middleware_insertion_facade_default.trace && { - trace: maskHandlerEnv(middleware_insertion_facade_default.trace) - }, - ...middleware_insertion_facade_default.scheduled && { - scheduled: maskHandlerEnv(middleware_insertion_facade_default.scheduled) - }, - ...middleware_insertion_facade_default.queue && { - queue: maskHandlerEnv(middleware_insertion_facade_default.queue) - }, - ...middleware_insertion_facade_default.test && { - test: maskHandlerEnv(middleware_insertion_facade_default.test) - }, - ...middleware_insertion_facade_default.email && { - email: maskHandlerEnv(middleware_insertion_facade_default.email) - }, - fetch(request, rawEnv, ctx) { - const env = getMaskedEnv(rawEnv); - if (middleware_insertion_facade_default.middleware && middleware_insertion_facade_default.middleware.length > 0) { - if (!registeredMiddleware) { - registeredMiddleware = true; - for (const middleware of middleware_insertion_facade_default.middleware) { - __facade_register__(middleware); - } - } - const __facade_modules_dispatch__ = function(type, init) { - if (type === "scheduled" && middleware_insertion_facade_default.scheduled !== void 0) { - const controller = new __Facade_ScheduledController__( - Date.now(), - init.cron ?? "", - () => { - } - ); - return middleware_insertion_facade_default.scheduled(controller, env, ctx); - } - }; - return __facade_invoke__( - request, - env, - ctx, - __facade_modules_dispatch__, - __facade_modules_fetch__ - ); - } else { - return __facade_modules_fetch__(request, env, ctx); - } - } -}; -function maskHandlerEnv(handler) { - return (data, env, ctx) => handler(data, getMaskedEnv(env), ctx); -} -var middleware_loader_entry_default = facade2; -export { - middleware_loader_entry_default as default -}; -//# sourceMappingURL=index.js.map diff --git a/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js.map b/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js.map deleted file mode 100644 index 3871974..0000000 --- a/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1/index.js.map +++ /dev/null @@ -1,8 +0,0 @@ -{ - "version": 3, - "sources": ["../bundle-z6vT4C/checked-fetch.js", "../../../../../packages/js-auth/dist/index.js", "../../../src/index.ts", "../../../../../node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts", "../../../../../node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-miniflare3-json-error.ts", "../bundle-z6vT4C/middleware-insertion-facade.js", "../../../../../node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/common.ts", "../bundle-z6vT4C/middleware-loader.entry.ts"], - "sourceRoot": "/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/.wrangler/tmp/dev-9wNxY1", - "sourcesContent": ["const urls = new Set();\n\nfunction checkURL(request, init) {\n\tconst url =\n\t\trequest instanceof URL\n\t\t\t? request\n\t\t\t: new URL(\n\t\t\t\t\t(typeof request === \"string\"\n\t\t\t\t\t\t? new Request(request, init)\n\t\t\t\t\t\t: request\n\t\t\t\t\t).url\n\t\t\t );\n\tif (url.port && url.port !== \"443\" && url.protocol === \"https:\") {\n\t\tif (!urls.has(url.toString())) {\n\t\t\turls.add(url.toString());\n\t\t\tconsole.warn(\n\t\t\t\t`WARNING: known issue with \\`fetch()\\` requests to custom HTTPS ports in published Workers:\\n` +\n\t\t\t\t\t` - ${url.toString()} - the custom port will be ignored when the Worker is published using the \\`wrangler deploy\\` command.\\n`\n\t\t\t);\n\t\t}\n\t}\n}\n\nglobalThis.fetch = new Proxy(globalThis.fetch, {\n\tapply(target, thisArg, argArray) {\n\t\tconst [request, init] = argArray;\n\t\tcheckURL(request, init);\n\t\treturn Reflect.apply(target, thisArg, argArray);\n\t},\n});\n", "// src/utils/camelCaseToSnake.ts\nfunction camelCaseToSnake(str) {\n return str.replace(/[A-Z]/g, function(letter) {\n return \"_\" + letter.toLowerCase();\n });\n}\n\n// src/utils/snakeToCamelCase.ts\nfunction snakeToCamelCase(str) {\n return str.replace(\n /([-_][a-z])/g,\n (group) => group.toUpperCase().replace(\"-\", \"\").replace(\"_\", \"\")\n );\n}\n\n// src/utils/doRequest.ts\nasync function doRequest({\n attributes,\n headers,\n endpoint\n}) {\n const body = Object.keys(attributes).reduce((acc, key) => {\n const camelKey = camelCaseToSnake(key);\n acc[camelKey] = attributes[key];\n return acc;\n }, {});\n return await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...headers\n },\n body: JSON.stringify(body)\n }).then(async (response) => {\n const json = await response.json();\n json.expires = new Date(Date.now() + json.expires_in * 1e3);\n return Object.keys(json).reduce((acc, key) => {\n const camelKey = snakeToCamelCase(key);\n acc[camelKey] = json[key];\n return acc;\n }, {});\n });\n}\n\n// src/core.ts\nasync function authentication(grantType, { domain = \"commercelayer.io\", slug, headers, ...options }) {\n return await doRequest({\n attributes: {\n grant_type: grantType,\n ...options\n },\n endpoint: `https://${slug}.${domain}/oauth/token`,\n headers\n });\n}\nvar core = {\n authentication\n};\n\n// src/provisioning.ts\nasync function authentication2({\n domain = \"commercelayer.io\",\n headers,\n ...options\n}) {\n return await doRequest({\n attributes: {\n grant_type: \"client_credentials\",\n scope: \"provisioning-api\",\n ...options\n },\n endpoint: `https://auth.${domain}/oauth/token`,\n headers\n });\n}\nvar provisioning = {\n authentication: authentication2\n};\nexport {\n core,\n provisioning\n};\n", "/**\n * Welcome to Cloudflare Workers! This is your first worker.\n *\n * - Run `npm run dev` in your terminal to start a development server\n * - Open a browser tab at http://localhost:8787/ to see your worker in action\n * - Run `npm run deploy` to publish your worker\n *\n * Learn more at https://developers.cloudflare.com/workers/\n */\n\nimport { core } from '@commercelayer/js-auth'\n\nexport interface Env {\n // Example binding to KV. Learn more at https://developers.cloudflare.com/workers/runtime-apis/kv/\n // MY_KV_NAMESPACE: KVNamespace;\n //\n // Example binding to Durable Object. Learn more at https://developers.cloudflare.com/workers/runtime-apis/durable-objects/\n // MY_DURABLE_OBJECT: DurableObjectNamespace;\n //\n // Example binding to R2. Learn more at https://developers.cloudflare.com/workers/runtime-apis/r2/\n // MY_BUCKET: R2Bucket;\n //\n // Example binding to a Service. Learn more at https://developers.cloudflare.com/workers/runtime-apis/service-bindings/\n // MY_SERVICE: Fetcher;\n //\n // Example binding to a Queue. Learn more at https://developers.cloudflare.com/queues/javascript-apis/\n // MY_QUEUE: Queue;\n}\n\nexport default {\n async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise {\n const auth = await core.authentication('client_credentials', {\n clientId: 'BISG8bb3GWpC8_D7Nt1SuWWdieS5bJq831A50LgB_Ig',\n slug: 'demo-store',\n scope: 'market:11279'\n })\n\n return new Response(`Hello World!\\n\\nThis is your token: ${auth.accessToken}`);\n },\n};", "import type { Middleware } from \"./common\";\n\nconst drainBody: Middleware = async (request, env, _ctx, middlewareCtx) => {\n\ttry {\n\t\treturn await middlewareCtx.next(request, env);\n\t} finally {\n\t\ttry {\n\t\t\tif (request.body !== null && !request.bodyUsed) {\n\t\t\t\tconst reader = request.body.getReader();\n\t\t\t\twhile (!(await reader.read()).done) {}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Failed to drain the unused request body.\", e);\n\t\t}\n\t}\n};\n\nexport default drainBody;\nexport const wrap = undefined;\n", "import type { Middleware } from \"./common\";\n\ninterface JsonError {\n\tmessage?: string;\n\tname?: string;\n\tstack?: string;\n\tcause?: JsonError;\n}\n\nfunction reduceError(e: any): JsonError {\n\treturn {\n\t\tname: e?.name,\n\t\tmessage: e?.message ?? String(e),\n\t\tstack: e?.stack,\n\t\tcause: e?.cause === undefined ? undefined : reduceError(e.cause),\n\t};\n}\n\n// See comment in `bundle.ts` for details on why this is needed\nconst jsonError: Middleware = async (request, env, _ctx, middlewareCtx) => {\n\ttry {\n\t\treturn await middlewareCtx.next(request, env);\n\t} catch (e: any) {\n\t\tconst error = reduceError(e);\n\t\treturn Response.json(error, {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"MF-Experimental-Error-Stack\": \"true\" },\n\t\t});\n\t}\n};\n\nexport default jsonError;\nexport const wrap = undefined;\n", "\t\t\t\timport worker, * as OTHER_EXPORTS from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/src/index.ts\";\n\t\t\t\timport * as __MIDDLEWARE_0__ from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts\";\nimport * as __MIDDLEWARE_1__ from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/middleware-miniflare3-json-error.ts\";\n\t\t\t\tconst envWrappers = [__MIDDLEWARE_0__.wrap,__MIDDLEWARE_1__.wrap].filter(Boolean);\n\t\t\t\tconst facade = {\n\t\t\t\t\t...worker,\n\t\t\t\t\tenvWrappers,\n\t\t\t\t\tmiddleware: [\n\t\t\t\t\t\t__MIDDLEWARE_0__.default,__MIDDLEWARE_1__.default,\n ...(worker.middleware ? worker.middleware : []),\n\t\t\t\t\t].filter(Boolean)\n\t\t\t\t}\n\t\t\t\texport * from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/src/index.ts\";\n\n\t\t\t\tconst maskDurableObjectDefinition = (cls) =>\n\t\t\t\t\tclass extends cls {\n\t\t\t\t\t\tconstructor(state, env) {\n\t\t\t\t\t\t\tlet wrappedEnv = env\n\t\t\t\t\t\t\tfor (const wrapFn of envWrappers) {\n\t\t\t\t\t\t\t\twrappedEnv = wrapFn(wrappedEnv)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsuper(state, wrappedEnv);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\n\n\t\t\t\texport default facade;", "export type Awaitable = T | Promise;\n// TODO: allow dispatching more events?\nexport type Dispatcher = (\n\ttype: \"scheduled\",\n\tinit: { cron?: string }\n) => Awaitable;\n\nexport type IncomingRequest = Request<\n\tunknown,\n\tIncomingRequestCfProperties\n>;\n\nexport interface MiddlewareContext {\n\tdispatch: Dispatcher;\n\tnext(request: IncomingRequest, env: any): Awaitable;\n}\n\nexport type Middleware = (\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tmiddlewareCtx: MiddlewareContext\n) => Awaitable;\n\nconst __facade_middleware__: Middleware[] = [];\n\n// The register functions allow for the insertion of one or many middleware,\n// We register internal middleware first in the stack, but have no way of controlling\n// the order that addMiddleware is run in service workers so need an internal function.\nexport function __facade_register__(...args: (Middleware | Middleware[])[]) {\n\t__facade_middleware__.push(...args.flat());\n}\nexport function __facade_registerInternal__(\n\t...args: (Middleware | Middleware[])[]\n) {\n\t__facade_middleware__.unshift(...args.flat());\n}\n\nfunction __facade_invokeChain__(\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tdispatch: Dispatcher,\n\tmiddlewareChain: Middleware[]\n): Awaitable {\n\tconst [head, ...tail] = middlewareChain;\n\tconst middlewareCtx: MiddlewareContext = {\n\t\tdispatch,\n\t\tnext(newRequest, newEnv) {\n\t\t\treturn __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail);\n\t\t},\n\t};\n\treturn head(request, env, ctx, middlewareCtx);\n}\n\nexport function __facade_invoke__(\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tdispatch: Dispatcher,\n\tfinalMiddleware: Middleware\n): Awaitable {\n\treturn __facade_invokeChain__(request, env, ctx, dispatch, [\n\t\t...__facade_middleware__,\n\t\tfinalMiddleware,\n\t]);\n}\n", "// // This loads all middlewares exposed on the middleware object\n// // and then starts the invocation chain.\n// // The big idea is that we can add these to the middleware export dynamically\n// // through wrangler, or we can potentially let users directly add them as a sort\n// // of \"plugin\" system.\n\nimport worker from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js\";\nimport {\n\t__facade_invoke__,\n\t__facade_register__,\n\tDispatcher,\n\tMiddleware,\n} from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/node_modules/.pnpm/wrangler@3.34.2_@cloudflare+workers-types@4.20240314.0/node_modules/wrangler/templates/middleware/common.ts\";\n\n// We need to preserve all of the exports from the worker\nexport * from \"/Users/marcomontalbano/Projects/cl/commercelayer-js-auth/examples/cloudflare-workers/.wrangler/tmp/bundle-z6vT4C/middleware-insertion-facade.js\";\n\nclass __Facade_ScheduledController__ implements ScheduledController {\n\t#noRetry: ScheduledController[\"noRetry\"];\n\n\tconstructor(\n\t\treadonly scheduledTime: number,\n\t\treadonly cron: string,\n\t\tnoRetry: ScheduledController[\"noRetry\"]\n\t) {\n\t\tthis.#noRetry = noRetry;\n\t}\n\n\tnoRetry() {\n\t\tif (!(this instanceof __Facade_ScheduledController__)) {\n\t\t\tthrow new TypeError(\"Illegal invocation\");\n\t\t}\n\t\t// Need to call native method immediately in case uncaught error thrown\n\t\tthis.#noRetry();\n\t}\n}\n\nconst __facade_modules_fetch__: ExportedHandlerFetchHandler = function (\n\trequest,\n\tenv,\n\tctx\n) {\n\tif (worker.fetch === undefined)\n\t\tthrow new Error(\"Handler does not export a fetch() function.\");\n\treturn worker.fetch(request, env, ctx);\n};\n\nfunction getMaskedEnv(rawEnv: unknown) {\n\tlet env = rawEnv as Record;\n\tif (worker.envWrappers && worker.envWrappers.length > 0) {\n\t\tfor (const wrapFn of worker.envWrappers) {\n\t\t\tenv = wrapFn(env);\n\t\t}\n\t}\n\treturn env;\n}\n\n/**\n * This type is here to cause a type error if a new export handler is added to\n * `ExportHandler` without it being included in the `facade` below.\n */\ntype MissingExportHandlers = Omit<\n\tRequired,\n\t\"tail\" | \"trace\" | \"scheduled\" | \"queue\" | \"test\" | \"email\" | \"fetch\"\n>;\n\nlet registeredMiddleware = false;\n\nconst facade: ExportedHandler & MissingExportHandlers = {\n\t...(worker.tail && {\n\t\ttail: maskHandlerEnv(worker.tail),\n\t}),\n\t...(worker.trace && {\n\t\ttrace: maskHandlerEnv(worker.trace),\n\t}),\n\t...(worker.scheduled && {\n\t\tscheduled: maskHandlerEnv(worker.scheduled),\n\t}),\n\t...(worker.queue && {\n\t\tqueue: maskHandlerEnv(worker.queue),\n\t}),\n\t...(worker.test && {\n\t\ttest: maskHandlerEnv(worker.test),\n\t}),\n\t...(worker.email && {\n\t\temail: maskHandlerEnv(worker.email),\n\t}),\n\n\tfetch(request, rawEnv, ctx) {\n\t\tconst env = getMaskedEnv(rawEnv);\n\t\t// Get the chain of middleware from the worker object\n\t\tif (worker.middleware && worker.middleware.length > 0) {\n\t\t\t// Make sure we only register middleware once:\n\t\t\t// https://github.com/cloudflare/workers-sdk/issues/2386#issuecomment-1614715911\n\t\t\tif (!registeredMiddleware) {\n\t\t\t\tregisteredMiddleware = true;\n\t\t\t\tfor (const middleware of worker.middleware) {\n\t\t\t\t\t__facade_register__(middleware);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst __facade_modules_dispatch__: Dispatcher = function (type, init) {\n\t\t\t\tif (type === \"scheduled\" && worker.scheduled !== undefined) {\n\t\t\t\t\tconst controller = new __Facade_ScheduledController__(\n\t\t\t\t\t\tDate.now(),\n\t\t\t\t\t\tinit.cron ?? \"\",\n\t\t\t\t\t\t() => {}\n\t\t\t\t\t);\n\t\t\t\t\treturn worker.scheduled(controller, env, ctx);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn __facade_invoke__(\n\t\t\t\trequest,\n\t\t\t\tenv,\n\t\t\t\tctx,\n\t\t\t\t__facade_modules_dispatch__,\n\t\t\t\t__facade_modules_fetch__\n\t\t\t);\n\t\t} else {\n\t\t\t// We didn't have any middleware so we can skip the invocation chain,\n\t\t\t// and just call the fetch handler directly\n\n\t\t\t// We \"don't care\" if this is undefined as we want to have the same behavior\n\t\t\t// as if the worker completely bypassed middleware.\n\t\t\treturn __facade_modules_fetch__(request, env, ctx);\n\t\t}\n\t},\n};\n\ntype HandlerFn = (data: D, env: unknown, ctx: ExecutionContext) => R;\nfunction maskHandlerEnv(handler: HandlerFn): HandlerFn {\n\treturn (data, env, ctx) => handler(data, getMaskedEnv(env), ctx);\n}\n\nexport default facade;\n"], - "mappings": ";AAAA,IAAM,OAAO,oBAAI,IAAI;AAErB,SAAS,SAAS,SAAS,MAAM;AAChC,QAAM,MACL,mBAAmB,MAChB,UACA,IAAI;AAAA,KACH,OAAO,YAAY,WACjB,IAAI,QAAQ,SAAS,IAAI,IACzB,SACD;AAAA,EACF;AACJ,MAAI,IAAI,QAAQ,IAAI,SAAS,SAAS,IAAI,aAAa,UAAU;AAChE,QAAI,CAAC,KAAK,IAAI,IAAI,SAAS,CAAC,GAAG;AAC9B,WAAK,IAAI,IAAI,SAAS,CAAC;AACvB,cAAQ;AAAA,QACP;AAAA,KACO,IAAI,SAAS;AAAA;AAAA,MACrB;AAAA,IACD;AAAA,EACD;AACD;AAEA,WAAW,QAAQ,IAAI,MAAM,WAAW,OAAO;AAAA,EAC9C,MAAM,QAAQ,SAAS,UAAU;AAChC,UAAM,CAAC,SAAS,IAAI,IAAI;AACxB,aAAS,SAAS,IAAI;AACtB,WAAO,QAAQ,MAAM,QAAQ,SAAS,QAAQ;AAAA,EAC/C;AACD,CAAC;;;AC5BD,SAAS,iBAAiB,KAAK;AAC7B,SAAO,IAAI,QAAQ,UAAU,SAAS,QAAQ;AAC5C,WAAO,MAAM,OAAO,YAAY;AAAA,EAClC,CAAC;AACH;AAGA,SAAS,iBAAiB,KAAK;AAC7B,SAAO,IAAI;AAAA,IACT;AAAA,IACA,CAAC,UAAU,MAAM,YAAY,EAAE,QAAQ,KAAK,EAAE,EAAE,QAAQ,KAAK,EAAE;AAAA,EACjE;AACF;AAGA,eAAe,UAAU;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,GAAG;AACD,QAAM,OAAO,OAAO,KAAK,UAAU,EAAE,OAAO,CAAC,KAAK,QAAQ;AACxD,UAAM,WAAW,iBAAiB,GAAG;AACrC,QAAI,QAAQ,IAAI,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACL,SAAO,MAAM,MAAM,UAAU;AAAA,IAC3B,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,GAAG;AAAA,IACL;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC,EAAE,KAAK,OAAO,aAAa;AAC1B,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAK,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,aAAa,GAAG;AAC1D,WAAO,OAAO,KAAK,IAAI,EAAE,OAAO,CAAC,KAAK,QAAQ;AAC5C,YAAM,WAAW,iBAAiB,GAAG;AACrC,UAAI,QAAQ,IAAI,KAAK,GAAG;AACxB,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP,CAAC;AACH;AAGA,eAAe,eAAe,WAAW,EAAE,SAAS,oBAAoB,MAAM,SAAS,GAAG,QAAQ,GAAG;AACnG,SAAO,MAAM,UAAU;AAAA,IACrB,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,GAAG;AAAA,IACL;AAAA,IACA,UAAU,WAAW,QAAQ;AAAA,IAC7B;AAAA,EACF,CAAC;AACH;AACA,IAAI,OAAO;AAAA,EACT;AACF;;;AC7BA,IAAO,cAAQ;AAAA,EACb,MAAM,MAAM,SAAkB,KAAU,KAA0C;AAChF,UAAM,OAAO,MAAM,KAAK,eAAe,sBAAsB;AAAA,MAC3D,UAAU;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAED,WAAO,IAAI,SAAS;AAAA;AAAA,sBAAuC,KAAK,aAAa;AAAA,EAC/E;AACF;;;ACrCA,IAAM,YAAwB,OAAO,SAAS,KAAK,MAAM,kBAAkB;AAC1E,MAAI;AACH,WAAO,MAAM,cAAc,KAAK,SAAS,GAAG;AAAA,EAC7C,UAAE;AACD,QAAI;AACH,UAAI,QAAQ,SAAS,QAAQ,CAAC,QAAQ,UAAU;AAC/C,cAAM,SAAS,QAAQ,KAAK,UAAU;AACtC,eAAO,EAAE,MAAM,OAAO,KAAK,GAAG,MAAM;AAAA,QAAC;AAAA,MACtC;AAAA,IACD,SAAS,GAAP;AACD,cAAQ,MAAM,4CAA4C,CAAC;AAAA,IAC5D;AAAA,EACD;AACD;AAEA,IAAO,6CAAQ;AACR,IAAM,OAAO;;;ACTpB,SAAS,YAAY,GAAmB;AACvC,SAAO;AAAA,IACN,MAAM,GAAG;AAAA,IACT,SAAS,GAAG,WAAW,OAAO,CAAC;AAAA,IAC/B,OAAO,GAAG;AAAA,IACV,OAAO,GAAG,UAAU,SAAY,SAAY,YAAY,EAAE,KAAK;AAAA,EAChE;AACD;AAGA,IAAM,YAAwB,OAAO,SAAS,KAAK,MAAM,kBAAkB;AAC1E,MAAI;AACH,WAAO,MAAM,cAAc,KAAK,SAAS,GAAG;AAAA,EAC7C,SAAS,GAAP;AACD,UAAM,QAAQ,YAAY,CAAC;AAC3B,WAAO,SAAS,KAAK,OAAO;AAAA,MAC3B,QAAQ;AAAA,MACR,SAAS,EAAE,+BAA+B,OAAO;AAAA,IAClD,CAAC;AAAA,EACF;AACD;AAEA,IAAO,2CAAQ;AACR,IAAMA,QAAO;;;AC7BhB,IAAM,cAAc,CAAkB,MAAsBC,KAAI,EAAE,OAAO,OAAO;AAChF,IAAM,SAAS;AAAA,EACd,GAAG;AAAA,EACH;AAAA,EACA,YAAY;AAAA,IACM;AAAA,IAAyB;AAAA,IACpC,GAAI,YAAO,aAAa,YAAO,aAAa,CAAC;AAAA,EACpD,EAAE,OAAO,OAAO;AACjB;AAeA,IAAO,sCAAQ;;;ACFnB,IAAM,wBAAsC,CAAC;AAKtC,SAAS,uBAAuB,MAAqC;AAC3E,wBAAsB,KAAK,GAAG,KAAK,KAAK,CAAC;AAC1C;AAOA,SAAS,uBACR,SACA,KACA,KACA,UACA,iBACsB;AACtB,QAAM,CAAC,MAAM,GAAG,IAAI,IAAI;AACxB,QAAM,gBAAmC;AAAA,IACxC;AAAA,IACA,KAAK,YAAY,QAAQ;AACxB,aAAO,uBAAuB,YAAY,QAAQ,KAAK,UAAU,IAAI;AAAA,IACtE;AAAA,EACD;AACA,SAAO,KAAK,SAAS,KAAK,KAAK,aAAa;AAC7C;AAEO,SAAS,kBACf,SACA,KACA,KACA,UACA,iBACsB;AACtB,SAAO,uBAAuB,SAAS,KAAK,KAAK,UAAU;AAAA,IAC1D,GAAG;AAAA,IACH;AAAA,EACD,CAAC;AACF;;;ACjDA,IAAM,iCAAN,MAAoE;AAAA,EAGnE,YACU,eACA,MACT,SACC;AAHQ;AACA;AAGT,SAAK,WAAW;AAAA,EACjB;AAAA,EARA;AAAA,EAUA,UAAU;AACT,QAAI,EAAE,gBAAgB,iCAAiC;AACtD,YAAM,IAAI,UAAU,oBAAoB;AAAA,IACzC;AAEA,SAAK,SAAS;AAAA,EACf;AACD;AAEA,IAAM,2BAAwD,SAC7D,SACA,KACA,KACC;AACD,MAAI,oCAAO,UAAU;AACpB,UAAM,IAAI,MAAM,6CAA6C;AAC9D,SAAO,oCAAO,MAAM,SAAS,KAAK,GAAG;AACtC;AAEA,SAAS,aAAa,QAAiB;AACtC,MAAI,MAAM;AACV,MAAI,oCAAO,eAAe,oCAAO,YAAY,SAAS,GAAG;AACxD,eAAW,UAAU,oCAAO,aAAa;AACxC,YAAM,OAAO,GAAG;AAAA,IACjB;AAAA,EACD;AACA,SAAO;AACR;AAWA,IAAI,uBAAuB;AAE3B,IAAMC,UAA2D;AAAA,EAChE,GAAI,oCAAO,QAAQ;AAAA,IAClB,MAAM,eAAe,oCAAO,IAAI;AAAA,EACjC;AAAA,EACA,GAAI,oCAAO,SAAS;AAAA,IACnB,OAAO,eAAe,oCAAO,KAAK;AAAA,EACnC;AAAA,EACA,GAAI,oCAAO,aAAa;AAAA,IACvB,WAAW,eAAe,oCAAO,SAAS;AAAA,EAC3C;AAAA,EACA,GAAI,oCAAO,SAAS;AAAA,IACnB,OAAO,eAAe,oCAAO,KAAK;AAAA,EACnC;AAAA,EACA,GAAI,oCAAO,QAAQ;AAAA,IAClB,MAAM,eAAe,oCAAO,IAAI;AAAA,EACjC;AAAA,EACA,GAAI,oCAAO,SAAS;AAAA,IACnB,OAAO,eAAe,oCAAO,KAAK;AAAA,EACnC;AAAA,EAEA,MAAM,SAAS,QAAQ,KAAK;AAC3B,UAAM,MAAM,aAAa,MAAM;AAE/B,QAAI,oCAAO,cAAc,oCAAO,WAAW,SAAS,GAAG;AAGtD,UAAI,CAAC,sBAAsB;AAC1B,+BAAuB;AACvB,mBAAW,cAAc,oCAAO,YAAY;AAC3C,8BAAoB,UAAU;AAAA,QAC/B;AAAA,MACD;AAEA,YAAM,8BAA0C,SAAU,MAAM,MAAM;AACrE,YAAI,SAAS,eAAe,oCAAO,cAAc,QAAW;AAC3D,gBAAM,aAAa,IAAI;AAAA,YACtB,KAAK,IAAI;AAAA,YACT,KAAK,QAAQ;AAAA,YACb,MAAM;AAAA,YAAC;AAAA,UACR;AACA,iBAAO,oCAAO,UAAU,YAAY,KAAK,GAAG;AAAA,QAC7C;AAAA,MACD;AAEA,aAAO;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IACD,OAAO;AAMN,aAAO,yBAAyB,SAAS,KAAK,GAAG;AAAA,IAClD;AAAA,EACD;AACD;AAGA,SAAS,eAAqB,SAA2C;AACxE,SAAO,CAAC,MAAM,KAAK,QAAQ,QAAQ,MAAM,aAAa,GAAG,GAAG,GAAG;AAChE;AAEA,IAAO,kCAAQA;", - "names": ["wrap", "wrap", "facade"] -} diff --git a/examples/cloudflare-workers/package.json b/examples/cloudflare-workers/package.json new file mode 100644 index 0000000..5bebcdb --- /dev/null +++ b/examples/cloudflare-workers/package.json @@ -0,0 +1,18 @@ +{ + "name": "cloudflare-workers", + "version": "0.0.0", + "private": true, + "scripts": { + "deploy": "wrangler deploy", + "dev": "wrangler dev", + "start": "wrangler dev", + "test": "vitest" + }, + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.1.0", + "@cloudflare/workers-types": "^4.20240314.0", + "typescript": "^5.0.4", + "vitest": "1.3.0", + "wrangler": "^3.0.0" + } +} \ No newline at end of file diff --git a/examples/cloudflare-workers/readme.md b/examples/cloudflare-workers/readme.md new file mode 100644 index 0000000..c8ad996 --- /dev/null +++ b/examples/cloudflare-workers/readme.md @@ -0,0 +1,47 @@ +# CloudFlare Workers + +## Example from scratch + +To create this example from scratch you can just follow the official documentation at [developers.cloudflare.com](https://developers.cloudflare.com/workers/get-started/guide/). + +```sh +pnpm create cloudflare@latest + +# using create-cloudflare version 2.14.2 +#  +# ╭ Create an application with Cloudflare +# │ +# ├ In which directory do you want to create your application? +# │ dir ./commercelayer-js-auth +# │ +# ├ What type of application do you want to create? +# │ type "Hello World" Worker +# │ +# ├ Do you want to use TypeScript? +# │ yes typescript +# │ +# │ ... +# │ +# ╰ Application created +# +# ╭ Deploy with Cloudflare +# │ +# ├ Do you want to deploy your application? +# │ yes deploy via `pnpm run deploy` +# │ +# │ ... +# │ +# ├ SUCCESS - View your deployed application at https://commercelayer-js-auth.marcomontalbano.workers.dev +# │ +# │ Navigate to the new directory `cd commercelayer-js-auth` +# │ Run the development server `pnpm run start` +# │ Deploy your application `pnpm run deploy` +# │ Read the documentation https://developers.cloudflare.com/workers +# │ Stuck? Join us at https://discord.gg/cloudflaredev +# │ +# ╰ See you again soon! +``` + +```sh +pnpm start +``` diff --git a/examples/cloudflare-workers/src/index.ts b/examples/cloudflare-workers/src/index.ts new file mode 100644 index 0000000..ac26dce --- /dev/null +++ b/examples/cloudflare-workers/src/index.ts @@ -0,0 +1,32 @@ +/** + * Welcome to Cloudflare Workers! This is your first worker. + * + * - Run `npm run dev` in your terminal to start a development server + * - Open a browser tab at http://localhost:8787/ to see your worker in action + * - Run `npm run deploy` to publish your worker + * + * Learn more at https://developers.cloudflare.com/workers/ + */ + +export interface Env { + // Example binding to KV. Learn more at https://developers.cloudflare.com/workers/runtime-apis/kv/ + // MY_KV_NAMESPACE: KVNamespace; + // + // Example binding to Durable Object. Learn more at https://developers.cloudflare.com/workers/runtime-apis/durable-objects/ + // MY_DURABLE_OBJECT: DurableObjectNamespace; + // + // Example binding to R2. Learn more at https://developers.cloudflare.com/workers/runtime-apis/r2/ + // MY_BUCKET: R2Bucket; + // + // Example binding to a Service. Learn more at https://developers.cloudflare.com/workers/runtime-apis/service-bindings/ + // MY_SERVICE: Fetcher; + // + // Example binding to a Queue. Learn more at https://developers.cloudflare.com/queues/javascript-apis/ + // MY_QUEUE: Queue; +} + +export default { + async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { + return new Response('Hello World!'); + }, +}; diff --git a/examples/cloudflare-workers/test/index.spec.ts b/examples/cloudflare-workers/test/index.spec.ts new file mode 100644 index 0000000..d31c7a1 --- /dev/null +++ b/examples/cloudflare-workers/test/index.spec.ts @@ -0,0 +1,25 @@ +// test/index.spec.ts +import { env, createExecutionContext, waitOnExecutionContext, SELF } from "cloudflare:test"; +import { describe, it, expect } from "vitest"; +import worker from "../src/index"; + +// For now, you'll need to do something like this to get a correctly-typed +// `Request` to pass to `worker.fetch()`. +const IncomingRequest = Request; + +describe("Hello World worker", () => { + it("responds with Hello World! (unit style)", async () => { + const request = new IncomingRequest("http://example.com"); + // Create an empty context to pass to `worker.fetch()`. + const ctx = createExecutionContext(); + const response = await worker.fetch(request, env, ctx); + // Wait for all `Promise`s passed to `ctx.waitUntil()` to settle before running test assertions + await waitOnExecutionContext(ctx); + expect(await response.text()).toMatchInlineSnapshot(`"Hello World!"`); + }); + + it("responds with Hello World! (integration style)", async () => { + const response = await SELF.fetch("https://example.com"); + expect(await response.text()).toMatchInlineSnapshot(`"Hello World!"`); + }); +}); diff --git a/examples/cloudflare-workers/test/tsconfig.json b/examples/cloudflare-workers/test/tsconfig.json new file mode 100644 index 0000000..509425f --- /dev/null +++ b/examples/cloudflare-workers/test/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "types": [ + "@cloudflare/workers-types/experimental", + "@cloudflare/vitest-pool-workers" + ] + }, + "include": ["./**/*.ts", "../src/env.d.ts"], + "exclude": [] +} diff --git a/examples/cloudflare-workers/tsconfig.json b/examples/cloudflare-workers/tsconfig.json new file mode 100644 index 0000000..9192490 --- /dev/null +++ b/examples/cloudflare-workers/tsconfig.json @@ -0,0 +1,104 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2021" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "lib": ["es2021"] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, + "jsx": "react" /* Specify what JSX code is generated. */, + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "es2022" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "Bundler" /* Specify how TypeScript looks up a file from a given module specifier. */, + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + "types": [ + "@cloudflare/workers-types/2023-07-01" + ] /* Specify type package names to be included without being referenced in a source file. */, + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + "resolveJsonModule": true /* Enable importing .json files */, + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */, + "checkJs": false /* Enable error reporting in type-checked JavaScript files. */, + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + "noEmit": true /* Disable emitting files from a compilation. */, + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + "isolatedModules": true /* Ensure that each file can be safely transpiled without relying on other imports. */, + "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, + // "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "exclude": ["test"] +} diff --git a/examples/cloudflare-workers/vitest.config.ts b/examples/cloudflare-workers/vitest.config.ts new file mode 100644 index 0000000..973627c --- /dev/null +++ b/examples/cloudflare-workers/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config"; + +export default defineWorkersConfig({ + test: { + poolOptions: { + workers: { + wrangler: { configPath: "./wrangler.toml" }, + }, + }, + }, +}); diff --git a/examples/cloudflare-workers/wrangler.toml b/examples/cloudflare-workers/wrangler.toml new file mode 100644 index 0000000..f0278cb --- /dev/null +++ b/examples/cloudflare-workers/wrangler.toml @@ -0,0 +1,52 @@ +name = "commercelayer-js-auth" +main = "src/index.ts" +compatibility_date = "2024-03-14" +compatibility_flags = ["nodejs_compat"] + +# Variable bindings. These are arbitrary, plaintext strings (similar to environment variables) +# Note: Use secrets to store sensitive data. +# Docs: https://developers.cloudflare.com/workers/platform/environment-variables +# [vars] +# MY_VARIABLE = "production_value" + +# Bind a KV Namespace. Use KV as persistent storage for small key-value pairs. +# Docs: https://developers.cloudflare.com/workers/runtime-apis/kv +# [[kv_namespaces]] +# binding = "MY_KV_NAMESPACE" +# id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + +# Bind an R2 Bucket. Use R2 to store arbitrarily large blobs of data, such as files. +# Docs: https://developers.cloudflare.com/r2/api/workers/workers-api-usage/ +# [[r2_buckets]] +# binding = "MY_BUCKET" +# bucket_name = "my-bucket" + +# Bind a Queue producer. Use this binding to schedule an arbitrary task that may be processed later by a Queue consumer. +# Docs: https://developers.cloudflare.com/queues/get-started +# [[queues.producers]] +# binding = "MY_QUEUE" +# queue = "my-queue" + +# Bind a Queue consumer. Queue Consumers can retrieve tasks scheduled by Producers to act on them. +# Docs: https://developers.cloudflare.com/queues/get-started +# [[queues.consumers]] +# queue = "my-queue" + +# Bind another Worker service. Use this binding to call another Worker without network overhead. +# Docs: https://developers.cloudflare.com/workers/platform/services +# [[services]] +# binding = "MY_SERVICE" +# service = "my-service" + +# Bind a Durable Object. Durable objects are a scale-to-zero compute primitive based on the actor model. +# Durable Objects can live for as long as needed. Use these when you need a long-running "server", such as in realtime apps. +# Docs: https://developers.cloudflare.com/workers/runtime-apis/durable-objects +# [[durable_objects.bindings]] +# name = "MY_DURABLE_OBJECT" +# class_name = "MyDurableObject" + +# Durable Object migrations. +# Docs: https://developers.cloudflare.com/workers/learning/using-durable-objects#configure-durable-object-classes-with-migrations +# [[migrations]] +# tag = "v1" +# new_classes = ["MyDurableObject"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1fe2f22..3ab2ece 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,12 +21,36 @@ importers: specifier: ^5.4.2 version: 5.4.2 + examples/bun: + dependencies: + '@commercelayer/js-auth': + specifier: ^5.2.0 + version: link:../../packages/js-auth + examples/cjs: dependencies: '@commercelayer/js-auth': specifier: workspace:^5.0.0 version: link:../../packages/js-auth + examples/cloudflare-workers: + devDependencies: + '@cloudflare/vitest-pool-workers': + specifier: ^0.1.0 + version: 0.1.2(@cloudflare/workers-types@4.20240314.0)(@vitest/runner@1.3.0)(@vitest/snapshot@1.3.0)(vitest@1.3.0) + '@cloudflare/workers-types': + specifier: ^4.20240314.0 + version: 4.20240314.0 + typescript: + specifier: ^5.0.4 + version: 5.4.2 + vitest: + specifier: 1.3.0 + version: 1.3.0 + wrangler: + specifier: ^3.0.0 + version: 3.34.2(@cloudflare/workers-types@4.20240314.0) + examples/esm: dependencies: '@commercelayer/js-auth': @@ -80,6 +104,85 @@ packages: js-tokens: 4.0.0 dev: true + /@cloudflare/kv-asset-handler@0.3.1: + resolution: {integrity: sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==} + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/vitest-pool-workers@0.1.2(@cloudflare/workers-types@4.20240314.0)(@vitest/runner@1.3.0)(@vitest/snapshot@1.3.0)(vitest@1.3.0): + resolution: {integrity: sha512-scoOJJfGbo3Z0W3dYkEMjXoq4ZamyGb4ctA3pYg5Aeqc/26Fu0ow0iupOGWi8qkek+2FVKDio2d/J+4DH70bqw==} + peerDependencies: + '@vitest/runner': 1.3.0 + '@vitest/snapshot': 1.3.0 + vitest: 1.3.0 + dependencies: + '@vitest/runner': 1.3.0 + '@vitest/snapshot': 1.3.0 + birpc: 0.2.14 + cjs-module-lexer: 1.2.3 + devalue: 4.3.2 + esbuild: 0.17.19 + miniflare: 3.20240304.2 + vitest: 1.3.0 + wrangler: 3.34.2(@cloudflare/workers-types@4.20240314.0) + zod: 3.22.4 + transitivePeerDependencies: + - '@cloudflare/workers-types' + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /@cloudflare/workerd-darwin-64@1.20240304.0: + resolution: {integrity: sha512-rfHlvsWzkqEEQNvm14AOE/BYHYzB9wxQHCaZZEgwOuTl5KpDcs9La0N0LaDTR78ESumIWOcifVmko2VTrZb7TQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-darwin-arm64@1.20240304.0: + resolution: {integrity: sha512-IXGOxHsPdRYfAzcY6IroI1PDvx3hhXf18qFCloHp8Iw5bzLgq/PTjcp10Z/2xedZ2hVlfpHy1eEptsTmi9YeNw==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-64@1.20240304.0: + resolution: {integrity: sha512-G1BEzbw9TFIeMvc425F145IetC7fuH4KOkGhseLq9y/mt5PfDWkghwmXSK+q0BiMwm0XAobtzVlHcEr2u4WlRQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-arm64@1.20240304.0: + resolution: {integrity: sha512-LLk/d/y77TRu6QOG3CJUI2cD3Ff2lSg0ts6G83bsm9ZK+WKObWFFSPBy9l81m3EnlKFh7RZCzxN4J10kuDaO8w==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-windows-64@1.20240304.0: + resolution: {integrity: sha512-I/j6nVpM+WDPg+bYUAiKLkwQsjrXFjpOGHvwYmcM44hnDjgODzk7AbVssEIXnhEO3oupBeuKvffr0lvX0Ngmpw==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workers-types@4.20240314.0: + resolution: {integrity: sha512-eg2dK/tYSiFvQu3sexjB32WEGi3GEmY6pLRF4nrV9Rwi2F2965o6f6604jQY8whhrmNdEoWErSjhuuUld6xgKQ==} + dev: true + /@commercelayer/eslint-config-ts@1.3.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-N0ADyBWf2oPD4q0xVA7T18C+sYfAGmxiLPU8c99k3Mn9nN++gKJxXOL16zClokmfdEYn481nvmQHcmUaKOJYZw==} peerDependencies: @@ -104,6 +207,31 @@ packages: - supports-color dev: true + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19): + resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} + peerDependencies: + esbuild: '*' + dependencies: + esbuild: 0.17.19 + dev: true + + /@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19): + resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} + peerDependencies: + esbuild: '*' + dependencies: + esbuild: 0.17.19 + escape-string-regexp: 4.0.0 + rollup-plugin-node-polyfills: 0.2.1 + dev: true + /@esbuild/aix-ppc64@0.19.12: resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} @@ -113,6 +241,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64@0.19.12: resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} @@ -122,6 +259,15 @@ packages: dev: true optional: true + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm@0.19.12: resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} @@ -131,6 +277,15 @@ packages: dev: true optional: true + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.19.12: resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} @@ -140,6 +295,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64@0.19.12: resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} @@ -149,6 +313,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64@0.19.12: resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} @@ -158,6 +331,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64@0.19.12: resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} @@ -167,6 +349,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64@0.19.12: resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} @@ -176,6 +367,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.19.12: resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} @@ -185,6 +385,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.19.12: resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} @@ -194,6 +403,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.19.12: resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} @@ -203,6 +421,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64@0.19.12: resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} @@ -212,6 +439,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el@0.19.12: resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} @@ -221,6 +457,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64@0.19.12: resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} @@ -230,6 +475,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64@0.19.12: resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} @@ -239,6 +493,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x@0.19.12: resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} @@ -248,6 +511,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64@0.19.12: resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} @@ -257,6 +529,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64@0.19.12: resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} @@ -266,6 +547,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64@0.19.12: resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} @@ -275,6 +565,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64@0.19.12: resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} @@ -284,6 +583,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64@0.19.12: resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} @@ -293,6 +601,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32@0.19.12: resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} @@ -302,6 +619,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64@0.19.12: resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} @@ -348,6 +674,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + dev: true + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -422,6 +753,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@lerna/create@8.1.2(typescript@5.4.2): resolution: {integrity: sha512-GzScCIkAW3tg3+Yn/MKCH9963bzG+zpjGz2NdfYDlYWI7p0f/SH46v1dqpPpYmZ2E/m3JK8HjTNNNL8eIm8/YQ==} engines: {node: '>=18.0.0'} @@ -1097,6 +1435,12 @@ packages: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: true + /@types/node-forge@1.3.11: + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + dependencies: + '@types/node': 20.11.27 + dev: true + /@types/node@20.11.27: resolution: {integrity: sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg==} dependencies: @@ -1247,6 +1591,14 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true + /@vitest/expect@1.3.0: + resolution: {integrity: sha512-7bWt0vBTZj08B+Ikv70AnLRicohYwFgzNjFqo9SxxqHHxSlUJGSXmCRORhOnRMisiUryKMdvsi1n27Bc6jL9DQ==} + dependencies: + '@vitest/spy': 1.3.0 + '@vitest/utils': 1.3.0 + chai: 4.4.1 + dev: true + /@vitest/expect@1.3.1: resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} dependencies: @@ -1255,6 +1607,14 @@ packages: chai: 4.4.1 dev: true + /@vitest/runner@1.3.0: + resolution: {integrity: sha512-1Jb15Vo/Oy7mwZ5bXi7zbgszsdIBNjc4IqP8Jpr/8RdBC4nF1CTzIAn2dxYvpF1nGSseeL39lfLQ2uvs5u1Y9A==} + dependencies: + '@vitest/utils': 1.3.0 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + /@vitest/runner@1.3.1: resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} dependencies: @@ -1263,6 +1623,14 @@ packages: pathe: 1.1.2 dev: true + /@vitest/snapshot@1.3.0: + resolution: {integrity: sha512-swmktcviVVPYx9U4SEQXLV6AEY51Y6bZ14jA2yo6TgMxQ3h+ZYiO0YhAHGJNp0ohCFbPAis1R9kK0cvN6lDPQA==} + dependencies: + magic-string: 0.30.8 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + /@vitest/snapshot@1.3.1: resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} dependencies: @@ -1271,12 +1639,27 @@ packages: pretty-format: 29.7.0 dev: true + /@vitest/spy@1.3.0: + resolution: {integrity: sha512-AkCU0ThZunMvblDpPKgjIi025UxR8V7MZ/g/EwmAGpjIujLVV2X6rGYGmxE2D4FJbAy0/ijdROHMWa2M/6JVMw==} + dependencies: + tinyspy: 2.2.1 + dev: true + /@vitest/spy@1.3.1: resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} dependencies: tinyspy: 2.2.1 dev: true + /@vitest/utils@1.3.0: + resolution: {integrity: sha512-/LibEY/fkaXQufi4GDlQZhikQsPO2entBKtfuyIpr1jV4DpaeasqkeHjhdOhU24vSHshcSuEyVlWdzvv2XmYCw==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + /@vitest/utils@1.3.1: resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} dependencies: @@ -1562,6 +1945,12 @@ packages: engines: {node: '>=8'} dev: true + /as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + dependencies: + printable-characters: 1.0.42 + dev: true + /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true @@ -1608,6 +1997,10 @@ packages: engines: {node: '>=8'} dev: true + /birpc@0.2.14: + resolution: {integrity: sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==} + dev: true + /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -1616,6 +2009,10 @@ packages: readable-stream: 3.6.2 dev: true + /blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + dev: true + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1748,6 +2145,15 @@ packages: engines: {node: '>=6'} dev: true + /capnp-ts@0.7.0: + resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} + dependencies: + debug: 4.3.4 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + /chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} @@ -1821,6 +2227,10 @@ packages: engines: {node: '>=8'} dev: true + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -2031,6 +2441,11 @@ packages: meow: 8.1.2 dev: true + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true @@ -2065,6 +2480,10 @@ packages: engines: {node: '>=8'} dev: true + /data-uri-to-buffer@2.0.2: + resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} + dev: true + /dateformat@3.0.3: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} dev: true @@ -2167,6 +2586,10 @@ packages: engines: {node: '>=4'} dev: true + /devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + dev: true + /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2363,6 +2786,36 @@ packages: is-symbol: 1.0.4 dev: true + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + dev: true + /esbuild@0.19.12: resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} @@ -2694,6 +3147,10 @@ packages: engines: {node: '>=4.0'} dev: true + /estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + dev: true + /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: @@ -2754,6 +3211,11 @@ packages: strip-final-newline: 3.0.0 dev: true + /exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + dev: true + /exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} dev: true @@ -3008,6 +3470,13 @@ packages: engines: {node: '>=8'} dev: true + /get-source@2.0.12: + resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} + dependencies: + data-uri-to-buffer: 2.0.2 + source-map: 0.6.1 + dev: true + /get-stream@6.0.0: resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} engines: {node: '>=10'} @@ -3098,6 +3567,10 @@ packages: is-glob: 4.0.3 dev: true + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + /glob@10.3.10: resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} @@ -4107,6 +4580,12 @@ packages: engines: {node: '>=12'} dev: true + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + /magic-string@0.30.8: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} @@ -4227,6 +4706,12 @@ packages: mime-db: 1.52.0 dev: true + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: true + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -4242,6 +4727,29 @@ packages: engines: {node: '>=4'} dev: true + /miniflare@3.20240304.2: + resolution: {integrity: sha512-yQ5TBKv7TlvF8khFvvH+1WWk8cBnaLgNzcbJ5DLQOdecxdDxUCVlN38HThd6Nhcz6EY+ckDkww8FkugUbSSpIQ==} + engines: {node: '>=16.13'} + hasBin: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.11.3 + acorn-walk: 8.3.2 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + stoppable: 1.1.0 + undici: 5.28.3 + workerd: 1.20240304.0 + ws: 8.16.0 + youch: 3.3.3 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /minimatch@3.0.5: resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} dependencies: @@ -4410,6 +4918,11 @@ packages: minimatch: 3.0.5 dev: true + /mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: true + /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true @@ -4458,6 +4971,11 @@ packages: whatwg-url: 5.0.0 dev: true + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + /node-gyp@10.0.1: resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==} engines: {node: ^16.14.0 || >=18.0.0} @@ -5072,6 +5590,10 @@ packages: minipass: 7.0.4 dev: true + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: true + /path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -5198,6 +5720,10 @@ packages: react-is: 18.2.0 dev: true + /printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + dev: true + /proc-log@3.0.0: resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -5405,6 +5931,11 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true + /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -5447,6 +5978,27 @@ packages: glob: 9.3.5 dev: true + /rollup-plugin-inject@3.0.2: + resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. + dependencies: + estree-walker: 0.6.1 + magic-string: 0.25.9 + rollup-pluginutils: 2.8.2 + dev: true + + /rollup-plugin-node-polyfills@0.2.1: + resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} + dependencies: + rollup-plugin-inject: 3.0.2 + dev: true + + /rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + dependencies: + estree-walker: 0.6.1 + dev: true + /rollup@4.13.0: resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -5518,6 +6070,14 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + dev: true + /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -5696,6 +6256,11 @@ packages: whatwg-url: 7.1.0 dev: true + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: @@ -5756,10 +6321,22 @@ packages: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true + /stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + dev: true + /std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: true + /stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + dev: true + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -6262,6 +6839,13 @@ packages: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true + /undici@5.28.3: + resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.1 + dev: true + /unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -6325,6 +6909,27 @@ packages: builtins: 5.0.1 dev: true + /vite-node@1.3.0: + resolution: {integrity: sha512-D/oiDVBw75XMnjAXne/4feCkCEwcbr2SU1bjAhCcfI5Bq3VoOHji8/wCPAfUkDIeohJ5nSZ39fNxM3dNZ6OBOA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.1.6(@types/node@20.11.27) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vite-node@1.3.1(@types/node@20.11.27): resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} engines: {node: ^18.0.0 || >=20.0.0} @@ -6398,6 +7003,61 @@ packages: fsevents: 2.3.3 dev: true + /vitest@1.3.0: + resolution: {integrity: sha512-V9qb276J1jjSx9xb75T2VoYXdO1UKi+qfflY7V7w93jzX7oA/+RtYE6TcifxksxsZvygSSMwu2Uw6di7yqDMwg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.3.0 + '@vitest/ui': 1.3.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@vitest/expect': 1.3.0 + '@vitest/runner': 1.3.0 + '@vitest/snapshot': 1.3.0 + '@vitest/spy': 1.3.0 + '@vitest/utils': 1.3.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.8 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.1.6(@types/node@20.11.27) + vite-node: 1.3.0 + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vitest@1.3.1(@types/node@20.11.27): resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -6539,6 +7199,52 @@ packages: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true + /workerd@1.20240304.0: + resolution: {integrity: sha512-/tYxdypPh9NKQje9r7bgBB73vAQfCQZbEPjNlxE/ml7jNKMHnRZv/D+By4xO0IPAifa37D0sJFokvYOahz1Lqw==} + engines: {node: '>=16'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20240304.0 + '@cloudflare/workerd-darwin-arm64': 1.20240304.0 + '@cloudflare/workerd-linux-64': 1.20240304.0 + '@cloudflare/workerd-linux-arm64': 1.20240304.0 + '@cloudflare/workerd-windows-64': 1.20240304.0 + dev: true + + /wrangler@3.34.2(@cloudflare/workers-types@4.20240314.0): + resolution: {integrity: sha512-j580WXlOe0GtYdcREym7FLcaaZq9+RZEBuzOtKXx74KKUlEC8cglgf5WWa2C2OpEtJCcrAieEHsNXe7mhy9knA==} + engines: {node: '>=16.17.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20230914.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + dependencies: + '@cloudflare/kv-asset-handler': 0.3.1 + '@cloudflare/workers-types': 4.20240314.0 + '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) + '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) + blake3-wasm: 2.1.5 + chokidar: 3.6.0 + esbuild: 0.17.19 + miniflare: 3.20240304.2 + nanoid: 3.3.7 + path-to-regexp: 6.2.1 + resolve: 1.22.8 + resolve.exports: 2.0.2 + selfsigned: 2.4.1 + source-map: 0.6.1 + xxhash-wasm: 1.0.2 + optionalDependencies: + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -6607,11 +7313,28 @@ packages: write-json-file: 3.2.0 dev: true + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} dev: true + /xxhash-wasm@1.0.2: + resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} + dev: true + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -6672,3 +7395,15 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} dev: true + + /youch@3.3.3: + resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + dev: true + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: true From e44896282976277ccdef1a309a95e73ff58c6395 Mon Sep 17 00:00:00 2001 From: Marco Montalbano Date: Mon, 18 Mar 2024 09:50:19 +0100 Subject: [PATCH 7/7] docs: complete 'cloudflare-workers' example --- examples/cloudflare-workers/package.json | 4 +++- examples/cloudflare-workers/src/index.ts | 12 ++++++++++-- pnpm-lock.yaml | 4 ++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/examples/cloudflare-workers/package.json b/examples/cloudflare-workers/package.json index 5bebcdb..0831679 100644 --- a/examples/cloudflare-workers/package.json +++ b/examples/cloudflare-workers/package.json @@ -1,6 +1,5 @@ { "name": "cloudflare-workers", - "version": "0.0.0", "private": true, "scripts": { "deploy": "wrangler deploy", @@ -8,6 +7,9 @@ "start": "wrangler dev", "test": "vitest" }, + "dependencies": { + "@commercelayer/js-auth": "workspace:^5.0.0" + }, "devDependencies": { "@cloudflare/vitest-pool-workers": "^0.1.0", "@cloudflare/workers-types": "^4.20240314.0", diff --git a/examples/cloudflare-workers/src/index.ts b/examples/cloudflare-workers/src/index.ts index ac26dce..7ddc06b 100644 --- a/examples/cloudflare-workers/src/index.ts +++ b/examples/cloudflare-workers/src/index.ts @@ -8,6 +8,8 @@ * Learn more at https://developers.cloudflare.com/workers/ */ +import { core } from '@commercelayer/js-auth' + export interface Env { // Example binding to KV. Learn more at https://developers.cloudflare.com/workers/runtime-apis/kv/ // MY_KV_NAMESPACE: KVNamespace; @@ -27,6 +29,12 @@ export interface Env { export default { async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { - return new Response('Hello World!'); + const auth = await core.authentication('client_credentials', { + clientId: 'BISG8bb3GWpC8_D7Nt1SuWWdieS5bJq831A50LgB_Ig', + slug: 'demo-store', + scope: 'market:11279' + }) + + return new Response(`Hello World!\n\nThis is your token: ${auth.accessToken}`); }, -}; +}; \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ab2ece..b8a5eb6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,6 +34,10 @@ importers: version: link:../../packages/js-auth examples/cloudflare-workers: + dependencies: + '@commercelayer/js-auth': + specifier: workspace:^5.0.0 + version: link:../../packages/js-auth devDependencies: '@cloudflare/vitest-pool-workers': specifier: ^0.1.0