diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml deleted file mode 100644 index 713a1ca..0000000 --- a/.github/workflows/ci.yaml +++ /dev/null @@ -1,149 +0,0 @@ -name: ci -on: - push: - branches: - - main - pull_request: - branches: - - main - -jobs: - - test_node: - runs-on: ${{ matrix.os }} - strategy: - matrix: - node: [ '16', '17', '18' ] - os: [ windows-latest, ubuntu-latest ] - name: Test with Node v${{ matrix.node }} on ${{ matrix.os }} - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node }} - - uses: bahmutov/npm-install@v1 - - run: yarn build - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - run: yarn test - - test_deno: - runs-on: ubuntu-latest - name: test with Deno - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: '18' - - name: Cache - uses: actions/cache@v3 - with: - path: ~/.cache/deno - key: deno-${{ runner.os }}-${{ hashFiles('deno-lock.json') }} - restore-keys: | - deno-${{ runner.os }}-${{ hashFiles('deno-lock.json') }} - deno-${{ runner.os }}- - deno- - - uses: denoland/setup-deno@v1 - with: - deno-version: v1.x - - run: deno --version - - uses: bahmutov/npm-install@v1 - - run: yarn build - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - run: deno run --unstable --reload --allow-read --allow-env --allow-net deno_dist/mod.ts - - check_if_version_upgraded: - name: Check if version upgrade - # We run this only if it's a push on the default branch or if it's a PR from a - # branch (meaning not a PR from a fork). It would be more straightforward to test if secrets.NPM_TOKEN is - # defined but GitHub Action don't allow it yet. - if: | - github.event_name == 'push' || - github.event.pull_request.head.repo.owner.login == github.event.pull_request.base.repo.owner.login - runs-on: ubuntu-latest - needs: - - test_node - - test_deno - outputs: - from_version: ${{ steps.step1.outputs.from_version }} - to_version: ${{ steps.step1.outputs.to_version }} - is_upgraded_version: ${{ steps.step1.outputs.is_upgraded_version }} - is_pre_release: ${{steps.step1.outputs.is_pre_release }} - steps: - - uses: garronej/ts-ci@v2.1.0 - id: step1 - with: - action_name: is_package_json_version_upgraded - branch: ${{ github.head_ref || github.ref }} - - publish: - runs-on: ubuntu-latest - needs: - - check_if_version_upgraded - # We create a release only if the version have been upgraded and we are on the main branch - # or if we are on a branch of the repo that has an PR open on main. - if: | - needs.check_if_version_upgraded.outputs.is_upgraded_version == 'true' && - ( - github.event_name == 'push' || - needs.check_if_version_upgraded.outputs.is_pre_release == 'true' - ) - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ref: ${{ github.ref }} - - run: rm -r .github - - name: Remove tmp_branch if it exists - run: git push origin :tmp_branch || true - - run: git checkout -b tmp_branch - - uses: actions/setup-node@v3 - with: - registry-url: https://registry.npmjs.org/ - - uses: bahmutov/npm-install@v1 - - run: yarn build - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - run: | - npx -y -p denoify@1.4.8 enable_short_npm_import_path - npx -y -p denoify@1.4.8 remove_deno_dist_from_gitignore - env: - DRY_RUN: "0" - - run: | - if [ "$(npm show . version)" = "$VERSION" ]; then - echo "This version is already published" - exit 0 - fi - if [ "$NODE_AUTH_TOKEN" = "" ]; then - echo "Can't publish on NPM, You must first create a secret called NPM_TOKEN that contains your NPM auth token. https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets" - false - fi - EXTRA_ARGS="" - if [ "$IS_PRE_RELEASE" = "true" ]; then - EXTRA_ARGS="--tag next" - fi - npm publish $EXTRA_ARGS - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - VERSION: ${{ needs.check_if_version_upgraded.outputs.to_version }} - IS_PRE_RELEASE: ${{ needs.check_if_version_upgraded.outputs.is_pre_release }} - - run: | - git config --global user.name "actions" - git config --global user.email actions@github.com - git add -A - git commit -am "Adding deno distribution files and moving files from /dist to /" - git push origin tmp_branch - - uses: softprops/action-gh-release@v1 - with: - name: Release v${{ needs.check_if_version_upgraded.outputs.to_version }} - tag_name: v${{ needs.check_if_version_upgraded.outputs.to_version }} - target_commitish: tmp_branch - generate_release_notes: false - draft: false - prerelease: ${{ needs.check_if_version_upgraded.outputs.is_pre_release == 'true' }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Remove tmp_branch - run: git push origin :tmp_branch \ No newline at end of file diff --git a/.gitignore b/.gitignore index c9ad228..13be271 100644 --- a/.gitignore +++ b/.gitignore @@ -1,45 +1,2 @@ -# Logs -logs -*.log -npm-debug.log* - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules -jspm_packages - -# Optional npm cache directory -.npm - -# Optional REPL history -.node_repl_history - -.vscode - -.DS_Store - -/.yarn_home -/dist -/deno_dist + +/node_modules diff --git a/axios/createAxiosSharedClient.d.ts b/axios/createAxiosSharedClient.d.ts new file mode 100644 index 0000000..c671120 --- /dev/null +++ b/axios/createAxiosSharedClient.d.ts @@ -0,0 +1,5 @@ +import type { AxiosInstance } from "axios"; +import type { UnknownSharedRoute } from ".."; +import { HandlerCreator } from ".."; +export declare const createAxiosHandlerCreator: >(axios: AxiosInstance) => HandlerCreator; +export declare const createAxiosSharedClient: >(sharedRouters: SharedRoutes, axios: AxiosInstance) => import("..").HttpClient; diff --git a/axios/createAxiosSharedClient.js b/axios/createAxiosSharedClient.js new file mode 100644 index 0000000..49f60e8 --- /dev/null +++ b/axios/createAxiosSharedClient.js @@ -0,0 +1,92 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createAxiosSharedClient = exports.createAxiosHandlerCreator = void 0; +var __1 = require(".."); +var createAxiosHandlerCreator = function (axios) { + return function (routeName, routes, replaceParamsInUrl) { + return function (_a) { + var _b = _a === void 0 ? {} : _a, body = _b.body, urlParams = _b.urlParams, queryParams = _b.queryParams, headers = _b.headers; + return __awaiter(void 0, void 0, void 0, function () { + var route, _c, data, rest; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + route = routes[routeName]; + return [4 /*yield*/, axios.request({ + method: route.method, + url: replaceParamsInUrl(route.url, urlParams), + data: body, + params: queryParams, + headers: __assign(__assign({}, axios.defaults.headers), (headers !== null && headers !== void 0 ? headers : {})), + })]; + case 1: + _c = _d.sent(), data = _c.data, rest = __rest(_c, ["data"]); + return [2 /*return*/, __assign(__assign({}, rest), { body: data })]; + } + }); + }); + }; + }; +}; +exports.createAxiosHandlerCreator = createAxiosHandlerCreator; +var createAxiosSharedClient = function (sharedRouters, axios) { return (0, __1.configureCreateHttpClient)((0, exports.createAxiosHandlerCreator)(axios))(sharedRouters); }; +exports.createAxiosSharedClient = createAxiosSharedClient; +//# sourceMappingURL=createAxiosSharedClient.js.map \ No newline at end of file diff --git a/axios/createAxiosSharedClient.js.map b/axios/createAxiosSharedClient.js.map new file mode 100644 index 0000000..a121266 --- /dev/null +++ b/axios/createAxiosSharedClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createAxiosSharedClient.js","sourceRoot":"","sources":["../src/axios/createAxiosSharedClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,wBAA+D;AAExD,IAAM,yBAAyB,GACpC,UACE,KAAoB;IAEtB,OAAA,UAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB;QACtC,OAAA,UAAO,EAA8C;gBAA9C,qBAA4C,EAAE,KAAA,EAA5C,IAAI,UAAA,EAAE,SAAS,eAAA,EAAE,WAAW,iBAAA,EAAE,OAAO,aAAA;;;;;;4BACtC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;4BAEN,qBAAM,KAAK,CAAC,OAAO,CAAC;oCAC5C,MAAM,EAAE,KAAK,CAAC,MAAM;oCACpB,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,SAAgB,CAAC;oCACpD,IAAI,EAAE,IAAI;oCACV,MAAM,EAAE,WAAW;oCACnB,OAAO,wBACF,KAAK,CAAC,QAAQ,CAAC,OAAO,GACtB,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAK,EAAU,CAAC,CAC5B;iCACF,CAAC,EAAA;;4BATI,KAAoB,SASxB,EATM,IAAI,UAAA,EAAK,IAAI,cAAf,QAAiB,CAAF;4BAWrB,4CAAY,IAAI,KAAE,IAAI,EAAE,IAAI,KAAG;;;;SAChC;IAfD,CAeC;AAhBD,CAgBC,CAAC;AApBS,QAAA,yBAAyB,6BAoBlC;AAEG,IAAM,uBAAuB,GAAG,UAGrC,aAA2B,EAC3B,KAAoB,IACjB,OAAA,IAAA,6BAAyB,EAAC,IAAA,iCAAyB,EAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,EAA1E,CAA0E,CAAC;AALnE,QAAA,uBAAuB,2BAK4C"} \ No newline at end of file diff --git a/axios/index.d.ts b/axios/index.d.ts new file mode 100644 index 0000000..c9ed2d8 --- /dev/null +++ b/axios/index.d.ts @@ -0,0 +1 @@ +export { createAxiosSharedClient, createAxiosHandlerCreator, } from "./createAxiosSharedClient"; diff --git a/axios/index.js b/axios/index.js new file mode 100644 index 0000000..74b6fdd --- /dev/null +++ b/axios/index.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createAxiosHandlerCreator = exports.createAxiosSharedClient = void 0; +var createAxiosSharedClient_1 = require("./createAxiosSharedClient"); +Object.defineProperty(exports, "createAxiosSharedClient", { enumerable: true, get: function () { return createAxiosSharedClient_1.createAxiosSharedClient; } }); +Object.defineProperty(exports, "createAxiosHandlerCreator", { enumerable: true, get: function () { return createAxiosSharedClient_1.createAxiosHandlerCreator; } }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/axios/index.js.map b/axios/index.js.map new file mode 100644 index 0000000..8cf56a6 --- /dev/null +++ b/axios/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/axios/index.ts"],"names":[],"mappings":";;;AAAA,qEAGmC;AAFjC,kIAAA,uBAAuB,OAAA;AACvB,oIAAA,yBAAyB,OAAA"} \ No newline at end of file diff --git a/configureCreateHttpClient.d.ts b/configureCreateHttpClient.d.ts new file mode 100644 index 0000000..f41e161 --- /dev/null +++ b/configureCreateHttpClient.d.ts @@ -0,0 +1,25 @@ +import { z } from "zod"; +import type { SharedRoute, UnknownSharedRoute } from "./defineRoutes"; +import { PathParameters, ReplaceParamsInUrl, Url } from "./pathParameters"; +type AnyObj = Record; +type EmptyObj = Record; +export type HttpResponse = { + status: number; + body: ResponseBody; +}; +type HandlerParams = (PathParameters extends EmptyObj ? AnyObj : { + urlParams: PathParameters; +}) & (z.infer extends void ? AnyObj : { + body: z.infer; +}) & (z.infer extends void ? AnyObj : { + queryParams: z.infer; +}) & (z.infer extends void ? AnyObj : { + headers: z.infer; +}); +export type Handler = (params: HandlerParams | EmptyObj) => Promise>>; +export type HttpClient> = { + [RouteName in keyof SharedRoutes]: (...params: [SharedRoutes[RouteName], PathParameters] extends [SharedRoute, EmptyObj] ? [] : [HandlerParams]) => Promise>>; +}; +export type HandlerCreator> = (routeName: R, routes: SharedRoutes, replaceParamsInUrl: ReplaceParamsInUrl) => Handler; +export declare const configureCreateHttpClient: >(handlerCreator: HandlerCreator) => >(routes: SharedRoutes) => HttpClient; +export {}; diff --git a/configureCreateHttpClient.js b/configureCreateHttpClient.js new file mode 100644 index 0000000..a46bcbc --- /dev/null +++ b/configureCreateHttpClient.js @@ -0,0 +1,25 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.configureCreateHttpClient = void 0; +var pathParameters_1 = require("./pathParameters"); +var configureCreateHttpClient = function (handlerCreator) { + return function (routes) { + return (0, pathParameters_1.keys)(routes).reduce(function (acc, routeName) { + var _a; + return (__assign(__assign({}, acc), (_a = {}, _a[routeName] = handlerCreator(routeName, routes, pathParameters_1.replaceParamsInUrl), _a))); + }, {}); + }; +}; +exports.configureCreateHttpClient = configureCreateHttpClient; +//# sourceMappingURL=configureCreateHttpClient.js.map \ No newline at end of file diff --git a/configureCreateHttpClient.js.map b/configureCreateHttpClient.js.map new file mode 100644 index 0000000..2c7f174 --- /dev/null +++ b/configureCreateHttpClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"configureCreateHttpClient.js","sourceRoot":"","sources":["src/configureCreateHttpClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA,mDAM0B;AAsCnB,IAAM,yBAAyB,GACpC,UAA+C,cAAiC;IAChF,OAAA,UACE,MAAoB;QAEpB,OAAA,IAAA,qBAAI,EAAC,MAAM,CAAC,CAAC,MAAM,CACjB,UAAC,GAAG,EAAE,SAAS;;YAAK,OAAA,uBACf,GAAG,gBACL,SAAS,IAAG,cAAc,CACzB,SAAmB,EACnB,MAAsB,EACtB,mCAAkB,CACnB,OACD;QAPkB,CAOlB,EACF,EAA8B,CAC/B;IAVD,CAUC;AAbH,CAaG,CAAC;AAfO,QAAA,yBAAyB,6BAehC"} \ No newline at end of file diff --git a/createCustomSharedClient.d.ts b/createCustomSharedClient.d.ts new file mode 100644 index 0000000..a985682 --- /dev/null +++ b/createCustomSharedClient.d.ts @@ -0,0 +1,3 @@ +import { Handler, HttpClient } from "./configureCreateHttpClient"; +import { UnknownSharedRoute } from "./defineRoutes"; +export declare const createCustomSharedClient: >(sharedRoutes: SharedRoutes, customHandlers: { [K in keyof SharedRoutes]: Handler; }) => HttpClient; diff --git a/createCustomSharedClient.js b/createCustomSharedClient.js new file mode 100644 index 0000000..8d202a0 --- /dev/null +++ b/createCustomSharedClient.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createCustomSharedClient = void 0; +var configureCreateHttpClient_1 = require("./configureCreateHttpClient"); +var createCustomSharedClient = function (sharedRoutes, customHandlers) { + var createHttpClient = (0, configureCreateHttpClient_1.configureCreateHttpClient)(function (routeName) { + return customHandlers[routeName]; + }); + return createHttpClient(sharedRoutes); +}; +exports.createCustomSharedClient = createCustomSharedClient; +//# sourceMappingURL=createCustomSharedClient.js.map \ No newline at end of file diff --git a/createCustomSharedClient.js.map b/createCustomSharedClient.js.map new file mode 100644 index 0000000..69905d4 --- /dev/null +++ b/createCustomSharedClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createCustomSharedClient.js","sourceRoot":"","sources":["src/createCustomSharedClient.ts"],"names":[],"mappings":";;;AAAA,yEAAwE;AAIjE,IAAM,wBAAwB,GAAG,UAGtC,YAA0B,EAC1B,cAEC;IAED,IAAM,gBAAgB,GAAG,IAAA,qDAAyB,EAAC,UAAC,SAAS;QAC3D,OAAO,cAAc,CAAC,SAAS,CAAQ,CAAC;IAC1C,CAAC,CAAQ,CAAC;IAEV,OAAO,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACxC,CAAC,CAAC;AAbW,QAAA,wBAAwB,4BAanC"} \ No newline at end of file diff --git a/defineRoutes.d.ts b/defineRoutes.d.ts new file mode 100644 index 0000000..bb0d7cd --- /dev/null +++ b/defineRoutes.d.ts @@ -0,0 +1,21 @@ +import { z } from "zod"; +import type { Url } from "./pathParameters"; +type OptionalFields = { + requestBodySchema?: z.Schema; + queryParamsSchema?: z.Schema; + responseBodySchema?: z.Schema; + headersSchema?: z.Schema; +}; +export type HttpMethod = "get" | "post" | "put" | "patch" | "delete"; +type MethodAndUrl = { + method: HttpMethod; + url: U; +}; +type SharedRouteWithOptional = MethodAndUrl & OptionalFields; +export type SharedRoute = MethodAndUrl & Required>; +export type UnknownSharedRoute = SharedRoute; +export type UnknownSharedRouteWithUrl = SharedRoute; +export declare const defineRoute: (route: SharedRouteWithOptional) => SharedRoute; +export declare const defineRoutes: >(routes: { [K in keyof T]: T[K]; }) => { [K in keyof T]: T[K]; }; +export declare const listRoutes: >(routes: { [K in keyof T]: T[K]; }) => string[]; +export {}; diff --git a/defineRoutes.js b/defineRoutes.js new file mode 100644 index 0000000..def5157 --- /dev/null +++ b/defineRoutes.js @@ -0,0 +1,59 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.listRoutes = exports.defineRoutes = exports.defineRoute = void 0; +var zod_1 = require("zod"); +var defineRoute = function (route) { return (__assign({ requestBodySchema: zod_1.z.object({}).strict(), queryParamsSchema: zod_1.z.object({}).strict(), responseBodySchema: zod_1.z.void(), headersSchema: zod_1.z.object({}) }, route)); }; +exports.defineRoute = defineRoute; +var verifyRoutesUniqAndListRoutes = function (routes) { + var e_1, _a; + var _b; + var occurrencesByMethodAndUrl = {}; + try { + for (var _c = __values(Object.values(routes)), _d = _c.next(); !_d.done; _d = _c.next()) { + var route = _d.value; + var name_1 = "".concat(route.method.toUpperCase(), " ").concat(route.url.toLowerCase()); + var occurrence = ((_b = occurrencesByMethodAndUrl[name_1]) !== null && _b !== void 0 ? _b : 0) + 1; + if (occurrence > 1) + throw new Error("You cannot have several routes with same http method and url, got: ".concat(name_1, " twice (at least)")); + occurrencesByMethodAndUrl[name_1] = occurrence; + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_d && !_d.done && (_a = _c.return)) _a.call(_c); + } + finally { if (e_1) throw e_1.error; } + } + return Object.keys(occurrencesByMethodAndUrl); +}; +var defineRoutes = function (routes) { + verifyRoutesUniqAndListRoutes(routes); + return routes; +}; +exports.defineRoutes = defineRoutes; +var listRoutes = function (routes) { return verifyRoutesUniqAndListRoutes(routes); }; +exports.listRoutes = listRoutes; +//# sourceMappingURL=defineRoutes.js.map \ No newline at end of file diff --git a/defineRoutes.js.map b/defineRoutes.js.map new file mode 100644 index 0000000..6f3b99b --- /dev/null +++ b/defineRoutes.js.map @@ -0,0 +1 @@ +{"version":3,"file":"defineRoutes.js","sourceRoot":"","sources":["src/defineRoutes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2BAAwB;AAyCjB,IAAM,WAAW,GAAG,UAOzB,KAA4E,IACd,OAAA,YAC9D,iBAAiB,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAS,EAC/C,iBAAiB,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAS,EAC/C,kBAAkB,EAAE,OAAC,CAAC,IAAI,EAAS,EACnC,aAAa,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAQ,IAC/B,KAAK,EACR,EAN8D,CAM9D,CAAC;AAdU,QAAA,WAAW,eAcrB;AAEH,IAAM,6BAA6B,GAAG,UACpC,MAEC;;;IAED,IAAM,yBAAyB,GAA2B,EAAE,CAAC;;QAE7D,KAAoB,IAAA,KAAA,SAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAyB,CAAA,gBAAA,4BAAE;YAA9D,IAAM,KAAK,WAAA;YACd,IAAM,MAAI,GAAG,UAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,cAAI,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAE,CAAC;YACxE,IAAM,UAAU,GAAG,CAAC,MAAA,yBAAyB,CAAC,MAAI,CAAC,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9D,IAAI,UAAU,GAAG,CAAC;gBAChB,MAAM,IAAI,KAAK,CACb,6EAAsE,MAAI,sBAAmB,CAC9F,CAAC;YACJ,yBAAyB,CAAC,MAAI,CAAC,GAAG,UAAU,CAAC;SAC9C;;;;;;;;;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;AAChD,CAAC,CAAC;AAEK,IAAM,YAAY,GAAG,UAC1B,MAEC;IAED,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAPW,QAAA,YAAY,gBAOvB;AACK,IAAM,UAAU,GAAG,UACxB,MAEC,IACY,OAAA,6BAA6B,CAAC,MAAM,CAAC,EAArC,CAAqC,CAAC;AAJxC,QAAA,UAAU,cAI8B"} \ No newline at end of file diff --git a/deno_dist/LICENSE b/deno_dist/LICENSE new file mode 100644 index 0000000..f3e49d5 --- /dev/null +++ b/deno_dist/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 GitHub user u/jeromebu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/deno_dist/README.md b/deno_dist/README.md new file mode 100644 index 0000000..7370aac --- /dev/null +++ b/deno_dist/README.md @@ -0,0 +1,92 @@ +

+ +

+

+ The shared-routes library +
+
+ + + + + + + + + + + + +

+

+ Home + - + Documentation +

+ +# Install / Import + +```bash +$ npm install --save shared-routes +``` + +```typescript +import { myFunction, myObject } from "shared-routes"; +``` + +Specific imports: + +```typescript +import { myFunction } from "shared-routes/myFunction"; +import { myObject } from "shared-routes/myObject"; +``` + +# Contributing + +## Testing your changes in an external app + +You have made some changes to the code and you want to test them +in your app before submitting a pull request? + +Assuming `you/my-app` have `shared-routes` as a dependency. + +```bash +cd ~/github +git clone https://github.com/you/my-app +cd my-app +yarn + +cd ~/github +git clone https://github.com/JeromeBu/shared-routes +cd shared-routes +yarn +yarn build +yarn link-in-app my-app +npx tsc -w + +# Open another terminal + +cd ~/github/my-app +rm -rf node_modules/.cache +yarn start # Or whatever my-app is using for starting the project +``` + +You don't have to use `~/github` as reference path. Just make sure `my-app` and `shared-routes` +are in the same directory. + +> Note for the maintainer: You might run into issues if you do not list all your singleton dependencies in +> `src/link-in-app.js -> singletonDependencies`. A singleton dependency is a dependency that can +> only be present once in an App. Singleton dependencies are usually listed as peerDependencies example `react`, `@emotion/*`. + +## Releasing + +For releasing a new version on GitHub and NPM you don't need to create a tag. +Just update the `package.json` version number and push. + +For publishing a release candidate update your `package.json` with `1.3.4-rc.0` (`.1`, `.2`, ...). +It also work if you do it from a branch that have an open PR on main. + +> Make sure your have defined the `NPM_TOKEN` repository secret or NPM publishing will fail. + +The lib was originaly build on this repository : https://github.com/JeromeBu/shared-routes-legacy +The organisation has been changed and improve in this repo. diff --git a/deno_dist/axios/createAxiosSharedClient.ts b/deno_dist/axios/createAxiosSharedClient.ts new file mode 100644 index 0000000..ec02056 --- /dev/null +++ b/deno_dist/axios/createAxiosSharedClient.ts @@ -0,0 +1,32 @@ +import type { AxiosInstance } from "npm:axios@0.26.1"; +import type { UnknownSharedRoute, Url } from "../index.ts"; +import { configureCreateHttpClient, HandlerCreator } from "../index.ts"; + +export const createAxiosHandlerCreator = + >( + axios: AxiosInstance, + ): HandlerCreator => + (routeName, routes, replaceParamsInUrl) => + async ({ body, urlParams, queryParams, headers } = {}) => { + const route = routes[routeName]; + + const { data, ...rest } = await axios.request({ + method: route.method, + url: replaceParamsInUrl(route.url, urlParams as Url), + data: body, + params: queryParams, + headers: { + ...axios.defaults.headers, + ...(headers ?? ({} as any)), + }, + }); + + return { ...rest, body: data }; + }; + +export const createAxiosSharedClient = < + SharedRoutes extends Record, +>( + sharedRouters: SharedRoutes, + axios: AxiosInstance, +) => configureCreateHttpClient(createAxiosHandlerCreator(axios))(sharedRouters); diff --git a/deno_dist/axios/index.ts b/deno_dist/axios/index.ts new file mode 100644 index 0000000..43f2df4 --- /dev/null +++ b/deno_dist/axios/index.ts @@ -0,0 +1,4 @@ +export { + createAxiosSharedClient, + createAxiosHandlerCreator, +} from "./createAxiosSharedClient.ts"; diff --git a/deno_dist/configureCreateHttpClient.ts b/deno_dist/configureCreateHttpClient.ts new file mode 100644 index 0000000..7ee54e4 --- /dev/null +++ b/deno_dist/configureCreateHttpClient.ts @@ -0,0 +1,62 @@ +import { z } from "npm:zod@3.21.4"; +import type { SharedRoute, UnknownSharedRoute } from "./defineRoutes.ts"; +import { + PathParameters, + replaceParamsInUrl, + ReplaceParamsInUrl, + keys, + Url, +} from "./pathParameters.ts"; + +type AnyObj = Record; +type EmptyObj = Record; + +export type HttpResponse = { + status: number; + body: ResponseBody; +}; + +// prettier-ignore +type HandlerParams = + (PathParameters extends EmptyObj ? AnyObj : { urlParams: PathParameters}) + & (z.infer extends void ? AnyObj : { body: z.infer }) + & (z.infer extends void ? AnyObj : { queryParams: z.infer }) + & (z.infer extends void ? AnyObj : { headers: z.infer }) + +export type Handler = ( + params: HandlerParams | EmptyObj, +) => Promise>>; + +export type HttpClient> = { + [RouteName in keyof SharedRoutes]: ( + // prettier-ignore + ...params: [SharedRoutes[RouteName], PathParameters] extends [SharedRoute, EmptyObj] + ? [] + : [HandlerParams] + ) => Promise>>; +}; + +export type HandlerCreator> = < + R extends keyof SharedRoutes, +>( + routeName: R, + routes: SharedRoutes, + replaceParamsInUrl: ReplaceParamsInUrl, +) => Handler; + +export const configureCreateHttpClient = + >(handlerCreator: HandlerCreator) => + >( + routes: SharedRoutes, + ): HttpClient => + keys(routes).reduce( + (acc, routeName) => ({ + ...acc, + [routeName]: handlerCreator( + routeName as string, + routes as unknown as S, + replaceParamsInUrl, + ), + }), + {} as HttpClient, + ); diff --git a/deno_dist/createCustomSharedClient.ts b/deno_dist/createCustomSharedClient.ts new file mode 100644 index 0000000..4ea12c8 --- /dev/null +++ b/deno_dist/createCustomSharedClient.ts @@ -0,0 +1,18 @@ +import { configureCreateHttpClient } from "./configureCreateHttpClient.ts"; +import { Handler, HttpClient } from "./configureCreateHttpClient.ts"; +import { UnknownSharedRoute } from "./defineRoutes.ts"; + +export const createCustomSharedClient = < + SharedRoutes extends Record, +>( + sharedRoutes: SharedRoutes, + customHandlers: { + [K in keyof SharedRoutes]: Handler; + }, +): HttpClient => { + const createHttpClient = configureCreateHttpClient((routeName) => { + return customHandlers[routeName] as any; + }) as any; + + return createHttpClient(sharedRoutes); +}; diff --git a/deno_dist/defineRoutes.ts b/deno_dist/defineRoutes.ts new file mode 100644 index 0000000..5e1d646 --- /dev/null +++ b/deno_dist/defineRoutes.ts @@ -0,0 +1,89 @@ +import { z } from "npm:zod@3.21.4"; +import type { Url } from "./pathParameters.ts"; + +type OptionalFields = { + requestBodySchema?: z.Schema; + queryParamsSchema?: z.Schema; + responseBodySchema?: z.Schema; + headersSchema?: z.Schema; +}; + +export type HttpMethod = "get" | "post" | "put" | "patch" | "delete"; +type MethodAndUrl = { + method: HttpMethod; + url: U; +}; + +type SharedRouteWithOptional< + U extends Url, + RequestBody, + Query, + ResponseBody, + Headers, +> = MethodAndUrl & OptionalFields; + +export type SharedRoute< + U extends Url, + RequestBody, + Query, + ResponseBody, + Headers, +> = MethodAndUrl & Required>; + +export type UnknownSharedRoute = SharedRoute; +export type UnknownSharedRouteWithUrl = SharedRoute< + U, + unknown, + unknown, + unknown, + unknown +>; + +export const defineRoute = < + U extends Url, + RequestBody = void, + Query = void, + ResponseBody = void, + Headers = void, +>( + route: SharedRouteWithOptional, +): SharedRoute => ({ + requestBodySchema: z.object({}).strict() as any, + queryParamsSchema: z.object({}).strict() as any, + responseBodySchema: z.void() as any, + headersSchema: z.object({}) as any, + ...route, +}); + +const verifyRoutesUniqAndListRoutes = >( + routes: { + [K in keyof T]: T[K]; + }, +): string[] => { + const occurrencesByMethodAndUrl: Record = {}; + + for (const route of Object.values(routes) as UnknownSharedRoute[]) { + const name = `${route.method.toUpperCase()} ${route.url.toLowerCase()}`; + const occurrence = (occurrencesByMethodAndUrl[name] ?? 0) + 1; + if (occurrence > 1) + throw new Error( + `You cannot have several routes with same http method and url, got: ${name} twice (at least)`, + ); + occurrencesByMethodAndUrl[name] = occurrence; + } + return Object.keys(occurrencesByMethodAndUrl); +}; + +export const defineRoutes = >( + routes: { + [K in keyof T]: T[K]; + }, +) => { + verifyRoutesUniqAndListRoutes(routes); + return routes; +}; +export const listRoutes = >( + routes: { + [K in keyof T]: T[K]; + }, +): string[] => verifyRoutesUniqAndListRoutes(routes); diff --git a/deno_dist/express/createExpressSharedRouter.ts b/deno_dist/express/createExpressSharedRouter.ts new file mode 100644 index 0000000..ff50dba --- /dev/null +++ b/deno_dist/express/createExpressSharedRouter.ts @@ -0,0 +1,70 @@ +import type { IRoute, RequestHandler, Router } from "npm:express@4.18.2"; +import type { PathParameters, UnknownSharedRoute } from "../index.ts"; +import { keys } from "../index.ts"; +import { z, ZodError } from "npm:zod@3.21.4"; + +type ExpressSharedRouterOptions = { + skipRequestValidation?: boolean; +}; + +const makeValidationMiddleware = + (route: UnknownSharedRoute, options: ExpressSharedRouterOptions): RequestHandler => + (req, res, next) => { + try { + if (!options.skipRequestValidation) { + req.body = route.requestBodySchema.parse(req.body) as any; + req.query = route.queryParamsSchema.parse(req.query) as any; + route.headersSchema.parse(req.headers); // we don't want to re-affect req.headers parsed value because we don't want to lose all other headers + } + next(); + } catch (e) { + const error = e as ZodError; + res.status(400); + res.json(error.issues.map(({ message, path }) => `${path.join(".")} : ${message}`)); + } + }; + +const assignHandlersToExpressRouter = ( + expressRouter: Router, + route: UnknownSharedRoute, + options: ExpressSharedRouterOptions = {}, +): ((...handlers: RequestHandler[]) => IRoute) => { + const validationMiddleware = makeValidationMiddleware(route, options); + const url = route.url as string; + + return (...handlers: RequestHandler[]) => + expressRouter.route(url)[route.method](validationMiddleware, handlers); +}; + +export const createExpressSharedRouter = < + SharedRoutes extends Record, + ExpressSharedRouter extends { + [Route in keyof SharedRoutes]: ( + ...handlers: RequestHandler< + PathParameters, + z.infer, + z.infer, + z.infer, + any + >[] + ) => IRoute; + }, +>( + sharedRoutes: SharedRoutes, + expressRouter: Router, + options?: ExpressSharedRouterOptions, +): { + expressSharedRouter: ExpressSharedRouter; +} => { + const expressSharedRouter = keys(sharedRoutes).reduce((acc, routeName) => { + const route = sharedRoutes[routeName]; + return { + ...acc, + [routeName]: assignHandlersToExpressRouter(expressRouter, route, options), + }; + }, {} as ExpressSharedRouter); + + return { + expressSharedRouter, + }; +}; diff --git a/deno_dist/express/index.ts b/deno_dist/express/index.ts new file mode 100644 index 0000000..e4c5a3a --- /dev/null +++ b/deno_dist/express/index.ts @@ -0,0 +1 @@ +export { createExpressSharedRouter } from "./createExpressSharedRouter.ts"; diff --git a/deno_dist/fetch/createFetchSharedClient.ts b/deno_dist/fetch/createFetchSharedClient.ts new file mode 100644 index 0000000..798bb04 --- /dev/null +++ b/deno_dist/fetch/createFetchSharedClient.ts @@ -0,0 +1,39 @@ +import type { RequestInfo, RequestInit, Response } from "npm:node-fetch@3.3.1"; +import type { HttpResponse, UnknownSharedRoute, Url } from "../index.ts"; +import { configureCreateHttpClient, HandlerCreator } from "../index.ts"; +import { queryParamsToString } from "./queryParamsToString.ts"; + +type Fetch = (url: URL | RequestInfo, init?: RequestInit) => Promise; + +export const createFetchHandlerCreator = + >( + fetch: Fetch, + ): HandlerCreator => + (routeName, routes, replaceParamsInUrl) => + async ({ body, urlParams, queryParams, headers } = {}): Promise> => { + const route = routes[routeName]; + + const stringQueryParams = + queryParams && Object.keys(queryParams).length > 0 + ? "?" + queryParamsToString(queryParams as any) + : ""; + + const res = await fetch( + replaceParamsInUrl(route.url, urlParams as Url) + stringQueryParams, + { + method: route.method, + ...(body ? { body: JSON.stringify(body) } : {}), + headers: headers ?? ({} as any), + }, + ); + const json = await res.json(); + + return { body: json, status: res.status }; + }; + +export const createFetchSharedClient = < + SharedRoutes extends Record, +>( + sharedRouters: SharedRoutes, + fetch: Fetch, +) => configureCreateHttpClient(createFetchHandlerCreator(fetch))(sharedRouters); diff --git a/deno_dist/fetch/index.ts b/deno_dist/fetch/index.ts new file mode 100644 index 0000000..4dca935 --- /dev/null +++ b/deno_dist/fetch/index.ts @@ -0,0 +1,4 @@ +export { + createFetchSharedClient, + createFetchHandlerCreator, +} from "./createFetchSharedClient.ts"; diff --git a/deno_dist/fetch/queryParamsToString.ts b/deno_dist/fetch/queryParamsToString.ts new file mode 100644 index 0000000..588a798 --- /dev/null +++ b/deno_dist/fetch/queryParamsToString.ts @@ -0,0 +1,20 @@ +type RawQueryParams = { [key: string]: string | boolean | number }; + +export type QueryParams = { + [K in keyof T]: T[K]; +}; + +export const queryParamsToString = >( + queryParams: Q, +): string => + (Object.keys(queryParams) as Array) + .reduce( + (acc: string[], param) => [ + ...acc, + ...(typeof queryParams[param] !== "undefined" + ? [`${param.toString()}=${encodeURI(queryParams[param].toString())}`] + : []), + ], + [], + ) + .join("&"); diff --git a/deno_dist/index.ts b/deno_dist/index.ts new file mode 100644 index 0000000..8c55e65 --- /dev/null +++ b/deno_dist/index.ts @@ -0,0 +1,16 @@ +export { createCustomSharedClient } from "./createCustomSharedClient.ts"; +export { configureCreateHttpClient } from "./configureCreateHttpClient.ts"; +export type { + HandlerCreator, + HttpClient, + HttpResponse, +} from "./configureCreateHttpClient.ts"; +export { defineRoutes, defineRoute, listRoutes } from "./defineRoutes.ts"; +export type { + HttpMethod, + SharedRoute, + UnknownSharedRoute, + UnknownSharedRouteWithUrl, +} from "./defineRoutes.ts"; +export type { PathParameters, Url } from "./pathParameters.ts"; +export { keys } from "./pathParameters.ts"; diff --git a/deno_dist/mod.ts b/deno_dist/mod.ts new file mode 100644 index 0000000..da5ee32 --- /dev/null +++ b/deno_dist/mod.ts @@ -0,0 +1 @@ +export * from "./index.ts"; \ No newline at end of file diff --git a/deno_dist/openapi/createOpenApiGenerator.ts b/deno_dist/openapi/createOpenApiGenerator.ts new file mode 100644 index 0000000..e32998b --- /dev/null +++ b/deno_dist/openapi/createOpenApiGenerator.ts @@ -0,0 +1,214 @@ +import { OpenAPIV3 as OpenAPI } from "npm:openapi-types@12.1.0"; +import { keys, UnknownSharedRoute } from "../index.ts"; +import { z } from "npm:zod@3.21.4"; +import type { ZodFirstPartyTypeKind, ZodRawShape } from "npm:zod@3.21.4"; +import { zodToJsonSchema } from "npm:zod-to-json-schema@3.21.0"; + +type TypedTag = { + name: T; +}; + +type CreateOpenApiGenerator = < + SharedRoutes extends Record, + TagName extends string, +>( + sharedRoutes: SharedRoutes, + openApiRootDoc: Omit & { + tags?: TypedTag[]; + }, +) => ( + extraDataByRoute: Partial< + { + [R in keyof SharedRoutes]: Omit & { + tags?: TagName[]; + extraDocs?: { + body?: OpenAPI.BaseSchemaObject & { + properties?: Partial< + Record< + keyof z.infer, + OpenAPI.BaseSchemaObject + > + >; + }; + queryParams?: Partial< + Record< + keyof z.infer, + Partial + > + >; + headerParams?: Partial< + Record< + keyof z.infer, + Partial + > + >; + + responseBody?: OpenAPI.BaseSchemaObject & { + properties?: Partial< + Record< + keyof z.infer, + OpenAPI.BaseSchemaObject + > + >; + }; + + successStatusCode?: number; + responses?: OpenAPI.ResponsesObject; + }; + }; + } + >, +) => OpenAPI.Document; + +export const createOpenApiGenerator: CreateOpenApiGenerator = + (sharedRoutes, openApiRootDoc) => (extraDataByRoute) => ({ + ...openApiRootDoc, + paths: keys(sharedRoutes).reduce((acc, routeName) => { + const route = sharedRoutes[routeName]; + const { extraDocs, ...extraDataForRoute } = extraDataByRoute[routeName] ?? {}; + const responseSchema = zodToOpenApi(route.responseBodySchema); + const responseSchemaType: + | OpenAPI.NonArraySchemaObjectType + | OpenAPI.ArraySchemaObjectType + | undefined = (responseSchema as any).type; + + const { formattedUrl, pathParams } = extractFromUrl(route.url); + + const parameters = [ + ...(pathParams.length > 0 ? pathParams : []), + ...(!isShapeObjectEmpty(route.queryParamsSchema) + ? zodObjectToParameters( + route.queryParamsSchema, + "query", + extraDocs?.queryParams, + ) + : []), + ...(!isShapeObjectEmpty(route.headersSchema) + ? zodObjectToParameters(route.headersSchema, "header", extraDocs?.headerParams) + : []), + ]; + + return { + ...acc, + [formattedUrl]: { + ...acc[formattedUrl], + [route.method]: { + ...extraDataForRoute, + ...(parameters.length > 0 && { + parameters, + }), + + ...(!isShapeObjectEmpty(route.requestBodySchema) && { + requestBody: { + required: true, + content: { + "application/json": { + schema: { + ...extraDocs?.body, + ...zodToOpenApi(route.requestBodySchema), + }, + }, + }, + }, + }), + + responses: { + [extraDocs?.successStatusCode ?? 200]: { + description: + responseSchemaType !== undefined + ? "Success" + : "Success, with void response", + ...(responseSchemaType !== undefined && { + content: { + "application/json": { + schema: responseSchema, + }, + }, + }), + ...extraDocs?.responseBody, + }, + ...extraDocs?.responses, + }, + }, + }, + }; + }, {} as any), + }); + +type ParamKind = "path" | "query" | "header"; + +type Param = { + name: string; + required: boolean; + schema: { type: string }; + in: ParamKind; +}; + +const extractFromUrl = (url: string): { pathParams: Param[]; formattedUrl: string } => { + const pathParams: Param[] = []; + + const formattedUrl = url.replace(/:(.*?)(\/|$)/g, (_match, group1, group2) => { + pathParams.push({ + name: group1, + required: true, + schema: { type: "string" }, + in: "path", + }); + return `{${group1}}` + group2 ?? ""; + }); + + return { + formattedUrl, + pathParams, + }; +}; + +const zodToOpenApi = (schema: Parameters[0]) => { + const { $schema, ...rest } = zodToJsonSchema(schema); + return rest; +}; + +const isShapeObjectEmpty = (schema: z.Schema): boolean => { + const typeName = getTypeName(schema); + if (typeName === "ZodObject") { + const shape = getShape(schema); + return Object.keys(shape).length === 0; + } + + return typeName === undefined; +}; + +const zodObjectToParameters = ( + schema: z.Schema, + paramKind: ParamKind, + extraDocumentation: Partial>> = {}, +): Param[] => { + const shape = getShape(schema); + + return Object.keys(shape).reduce((acc, paramName): Param[] => { + const paramSchema = shape[paramName]; + const extraDoc = extraDocumentation[paramName as keyof T]; + const initialTypeName = getTypeName(paramSchema); + const required = initialTypeName !== "ZodOptional"; + + const schema = zodToOpenApi( + required ? paramSchema : paramSchema._def.innerType, + ) as any; + + return [ + ...acc, + { + ...extraDoc, + in: paramKind, + name: paramName, + required, + schema, + }, + ]; + }, [] as Param[]); +}; + +const getTypeName = (schema: z.Schema): ZodFirstPartyTypeKind | undefined => + (schema._def as any).typeName; + +const getShape = (schema: z.Schema): ZodRawShape => (schema._def as any).shape(); diff --git a/deno_dist/openapi/index.ts b/deno_dist/openapi/index.ts new file mode 100644 index 0000000..6e665c9 --- /dev/null +++ b/deno_dist/openapi/index.ts @@ -0,0 +1 @@ +export { createOpenApiGenerator } from "./createOpenApiGenerator.ts"; diff --git a/deno_dist/pathParameters.ts b/deno_dist/pathParameters.ts new file mode 100644 index 0000000..43e9938 --- /dev/null +++ b/deno_dist/pathParameters.ts @@ -0,0 +1,61 @@ +type Http = "http://" | "https://"; +type AbsoluteUrl = `${Http}${string}`; +type RelativeUrl = `/${string}`; +export type Url = AbsoluteUrl | RelativeUrl; + +// mostly from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/ef87ee53bc501c0f0e79797add156fd8fa904ede/types/express-serve-static-core/index.d.ts#L98-L121 + +interface ParamsDictionary { + [key: string]: string; +} + +// prettier-ignore +type RemoveDomain = S extends RelativeUrl + ? S + : S extends `${Http}${string}${"/"}${infer P}` + ? `/${P}` + : "/"; + +// prettier-ignore +type RemoveTail = S extends `${infer P}${Tail}` ? P : S; + +type GetRouteParameter = RemoveTail< + RemoveTail, `-${string}`>, + `.${string}` +>; + +// prettier-ignore +export type PathParameters = string extends Route + ? ParamsDictionary + : RemoveDomain extends `${string}:${infer Rest}` + ? ( + GetRouteParameter extends never + ? ParamsDictionary + : GetRouteParameter extends `${infer ParamName}?` + ? { [P in ParamName]?: string } + : { [P in GetRouteParameter]: string } + ) & + (Rest extends `${GetRouteParameter}${infer Next}` + ? PathParameters : unknown) + // eslint-disable-next-line @typescript-eslint/ban-types + : {}; + +export type ReplaceParamsInUrl = ( + path: U, + params: PathParameters, +) => Url; + +export const replaceParamsInUrl: ReplaceParamsInUrl = ( + url, + params = {} as PathParameters, +): Url => { + const paramNames = keys(params); + if (paramNames.length === 0) return url; + return paramNames.reduce( + (acc, paramName) => acc.replace(`:${paramName.toString()}`, params[paramName]), + url as any, + ); +}; + +export const keys = >(obj: Obj): (keyof Obj)[] => + Object.keys(obj) as (keyof Obj)[]; diff --git a/deno_dist/supertest/createSupertestSharedClient.ts b/deno_dist/supertest/createSupertestSharedClient.ts new file mode 100644 index 0000000..b81457f --- /dev/null +++ b/deno_dist/supertest/createSupertestSharedClient.ts @@ -0,0 +1,33 @@ +import type { HttpMethod, UnknownSharedRoute, Url } from "../index.ts"; +import { configureCreateHttpClient, HandlerCreator } from "../index.ts"; + +import type { SuperTest, Test } from "npm:supertest@6.3.3"; + +const supertestRequestToCorrectHttpMethod = ( + supertestRequest: SuperTest, + method: HttpMethod, +): ((url: Url) => Test) => supertestRequest[method]; + +export const createSupertestHandlerCreator = + (supertestRequest: SuperTest): HandlerCreator => + (routeName, routes, replaceParamsInUrl) => { + const route = routes[routeName]; + return async ({ headers, body, queryParams, urlParams } = {}) => + supertestRequestToCorrectHttpMethod( + supertestRequest, + route.method, + )(replaceParamsInUrl(route.url, urlParams)) + .send(body) + .set(headers ?? {}) + .query(queryParams); + }; + +export const createSupertestSharedClient = < + SharedRoutes extends Record, +>( + sharedRoutes: SharedRoutes, + supertestRequest: SuperTest, +) => + configureCreateHttpClient(createSupertestHandlerCreator(supertestRequest))( + sharedRoutes, + ); diff --git a/deno_dist/supertest/index.ts b/deno_dist/supertest/index.ts new file mode 100644 index 0000000..3643678 --- /dev/null +++ b/deno_dist/supertest/index.ts @@ -0,0 +1 @@ +export { createSupertestSharedClient } from "./createSupertestSharedClient.ts"; diff --git a/esm/axios/createAxiosSharedClient.d.ts b/esm/axios/createAxiosSharedClient.d.ts new file mode 100644 index 0000000..5a96610 --- /dev/null +++ b/esm/axios/createAxiosSharedClient.d.ts @@ -0,0 +1,5 @@ +import type { AxiosInstance } from "axios"; +import type { UnknownSharedRoute } from "../index.mjs"; +import { HandlerCreator } from "../index.mjs"; +export declare const createAxiosHandlerCreator: >(axios: AxiosInstance) => HandlerCreator; +export declare const createAxiosSharedClient: >(sharedRouters: SharedRoutes, axios: AxiosInstance) => import("../index.mjs").HttpClient; diff --git a/esm/axios/createAxiosSharedClient.mjs b/esm/axios/createAxiosSharedClient.mjs new file mode 100644 index 0000000..c401837 --- /dev/null +++ b/esm/axios/createAxiosSharedClient.mjs @@ -0,0 +1,87 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +import { configureCreateHttpClient } from "../index.mjs"; +export var createAxiosHandlerCreator = function (axios) { + return function (routeName, routes, replaceParamsInUrl) { + return function (_a) { + var _b = _a === void 0 ? {} : _a, body = _b.body, urlParams = _b.urlParams, queryParams = _b.queryParams, headers = _b.headers; + return __awaiter(void 0, void 0, void 0, function () { + var route, _c, data, rest; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + route = routes[routeName]; + return [4 /*yield*/, axios.request({ + method: route.method, + url: replaceParamsInUrl(route.url, urlParams), + data: body, + params: queryParams, + headers: __assign(__assign({}, axios.defaults.headers), (headers !== null && headers !== void 0 ? headers : {})), + })]; + case 1: + _c = _d.sent(), data = _c.data, rest = __rest(_c, ["data"]); + return [2 /*return*/, __assign(__assign({}, rest), { body: data })]; + } + }); + }); + }; + }; +}; +export var createAxiosSharedClient = function (sharedRouters, axios) { return configureCreateHttpClient(createAxiosHandlerCreator(axios))(sharedRouters); }; +//# sourceMappingURL=createAxiosSharedClient.mjs.map \ No newline at end of file diff --git a/esm/axios/createAxiosSharedClient.mjs.map b/esm/axios/createAxiosSharedClient.mjs.map new file mode 100644 index 0000000..8ec5a31 --- /dev/null +++ b/esm/axios/createAxiosSharedClient.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"createAxiosSharedClient.mjs","sourceRoot":"","sources":["../../src/axios/createAxiosSharedClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,OAAO,EAAE,yBAAyB,EAAkB,MAAM,IAAI,CAAC;AAE/D,MAAM,CAAC,IAAM,yBAAyB,GACpC,UACE,KAAoB;IAEtB,OAAA,UAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB;QACtC,OAAA,UAAO,EAA8C;gBAA9C,qBAA4C,EAAE,KAAA,EAA5C,IAAI,UAAA,EAAE,SAAS,eAAA,EAAE,WAAW,iBAAA,EAAE,OAAO,aAAA;;;;;;4BACtC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;4BAEN,qBAAM,KAAK,CAAC,OAAO,CAAC;oCAC5C,MAAM,EAAE,KAAK,CAAC,MAAM;oCACpB,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,SAAgB,CAAC;oCACpD,IAAI,EAAE,IAAI;oCACV,MAAM,EAAE,WAAW;oCACnB,OAAO,wBACF,KAAK,CAAC,QAAQ,CAAC,OAAO,GACtB,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAK,EAAU,CAAC,CAC5B;iCACF,CAAC,EAAA;;4BATI,KAAoB,SASxB,EATM,IAAI,UAAA,EAAK,IAAI,cAAf,QAAiB,CAAF;4BAWrB,4CAAY,IAAI,KAAE,IAAI,EAAE,IAAI,KAAG;;;;SAChC;IAfD,CAeC;AAhBD,CAgBC,CAAC;AAEJ,MAAM,CAAC,IAAM,uBAAuB,GAAG,UAGrC,aAA2B,EAC3B,KAAoB,IACjB,OAAA,yBAAyB,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,EAA1E,CAA0E,CAAC"} \ No newline at end of file diff --git a/esm/axios/index.d.ts b/esm/axios/index.d.ts new file mode 100644 index 0000000..ba42013 --- /dev/null +++ b/esm/axios/index.d.ts @@ -0,0 +1 @@ +export { createAxiosSharedClient, createAxiosHandlerCreator, } from "./createAxiosSharedClient.mjs"; diff --git a/esm/axios/index.mjs b/esm/axios/index.mjs new file mode 100644 index 0000000..b615d2d --- /dev/null +++ b/esm/axios/index.mjs @@ -0,0 +1,2 @@ +export { createAxiosSharedClient, createAxiosHandlerCreator, } from "./createAxiosSharedClient.mjs"; +//# sourceMappingURL=index.mjs.map \ No newline at end of file diff --git a/esm/axios/index.mjs.map b/esm/axios/index.mjs.map new file mode 100644 index 0000000..116420f --- /dev/null +++ b/esm/axios/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/axios/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC"} \ No newline at end of file diff --git a/esm/configureCreateHttpClient.d.ts b/esm/configureCreateHttpClient.d.ts new file mode 100644 index 0000000..763a8c7 --- /dev/null +++ b/esm/configureCreateHttpClient.d.ts @@ -0,0 +1,25 @@ +import { z } from "zod"; +import type { SharedRoute, UnknownSharedRoute } from "./defineRoutes.mjs"; +import { PathParameters, ReplaceParamsInUrl, Url } from "./pathParameters.mjs"; +type AnyObj = Record; +type EmptyObj = Record; +export type HttpResponse = { + status: number; + body: ResponseBody; +}; +type HandlerParams = (PathParameters extends EmptyObj ? AnyObj : { + urlParams: PathParameters; +}) & (z.infer extends void ? AnyObj : { + body: z.infer; +}) & (z.infer extends void ? AnyObj : { + queryParams: z.infer; +}) & (z.infer extends void ? AnyObj : { + headers: z.infer; +}); +export type Handler = (params: HandlerParams | EmptyObj) => Promise>>; +export type HttpClient> = { + [RouteName in keyof SharedRoutes]: (...params: [SharedRoutes[RouteName], PathParameters] extends [SharedRoute, EmptyObj] ? [] : [HandlerParams]) => Promise>>; +}; +export type HandlerCreator> = (routeName: R, routes: SharedRoutes, replaceParamsInUrl: ReplaceParamsInUrl) => Handler; +export declare const configureCreateHttpClient: >(handlerCreator: HandlerCreator) => >(routes: SharedRoutes) => HttpClient; +export {}; diff --git a/esm/configureCreateHttpClient.mjs b/esm/configureCreateHttpClient.mjs new file mode 100644 index 0000000..4cdb348 --- /dev/null +++ b/esm/configureCreateHttpClient.mjs @@ -0,0 +1,21 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { replaceParamsInUrl, keys, } from "./pathParameters.mjs"; +export var configureCreateHttpClient = function (handlerCreator) { + return function (routes) { + return keys(routes).reduce(function (acc, routeName) { + var _a; + return (__assign(__assign({}, acc), (_a = {}, _a[routeName] = handlerCreator(routeName, routes, replaceParamsInUrl), _a))); + }, {}); + }; +}; +//# sourceMappingURL=configureCreateHttpClient.mjs.map \ No newline at end of file diff --git a/esm/configureCreateHttpClient.mjs.map b/esm/configureCreateHttpClient.mjs.map new file mode 100644 index 0000000..c8de07d --- /dev/null +++ b/esm/configureCreateHttpClient.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"configureCreateHttpClient.mjs","sourceRoot":"","sources":["../src/configureCreateHttpClient.ts"],"names":[],"mappings":";;;;;;;;;;;AAEA,OAAO,EAEL,kBAAkB,EAElB,IAAI,GAEL,MAAM,kBAAkB,CAAC;AAsC1B,MAAM,CAAC,IAAM,yBAAyB,GACpC,UAA+C,cAAiC;IAChF,OAAA,UACE,MAAoB;QAEpB,OAAA,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CACjB,UAAC,GAAG,EAAE,SAAS;;YAAK,OAAA,uBACf,GAAG,gBACL,SAAS,IAAG,cAAc,CACzB,SAAmB,EACnB,MAAsB,EACtB,kBAAkB,CACnB,OACD;QAPkB,CAOlB,EACF,EAA8B,CAC/B;IAVD,CAUC;AAbH,CAaG,CAAC"} \ No newline at end of file diff --git a/esm/createCustomSharedClient.d.ts b/esm/createCustomSharedClient.d.ts new file mode 100644 index 0000000..4aa2f43 --- /dev/null +++ b/esm/createCustomSharedClient.d.ts @@ -0,0 +1,3 @@ +import { Handler, HttpClient } from "./configureCreateHttpClient.mjs"; +import { UnknownSharedRoute } from "./defineRoutes.mjs"; +export declare const createCustomSharedClient: >(sharedRoutes: SharedRoutes, customHandlers: { [K in keyof SharedRoutes]: Handler; }) => HttpClient; diff --git a/esm/createCustomSharedClient.mjs b/esm/createCustomSharedClient.mjs new file mode 100644 index 0000000..036ec45 --- /dev/null +++ b/esm/createCustomSharedClient.mjs @@ -0,0 +1,8 @@ +import { configureCreateHttpClient } from "./configureCreateHttpClient.mjs"; +export var createCustomSharedClient = function (sharedRoutes, customHandlers) { + var createHttpClient = configureCreateHttpClient(function (routeName) { + return customHandlers[routeName]; + }); + return createHttpClient(sharedRoutes); +}; +//# sourceMappingURL=createCustomSharedClient.mjs.map \ No newline at end of file diff --git a/esm/createCustomSharedClient.mjs.map b/esm/createCustomSharedClient.mjs.map new file mode 100644 index 0000000..6ed4931 --- /dev/null +++ b/esm/createCustomSharedClient.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"createCustomSharedClient.mjs","sourceRoot":"","sources":["../src/createCustomSharedClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAIxE,MAAM,CAAC,IAAM,wBAAwB,GAAG,UAGtC,YAA0B,EAC1B,cAEC;IAED,IAAM,gBAAgB,GAAG,yBAAyB,CAAC,UAAC,SAAS;QAC3D,OAAO,cAAc,CAAC,SAAS,CAAQ,CAAC;IAC1C,CAAC,CAAQ,CAAC;IAEV,OAAO,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACxC,CAAC,CAAC"} \ No newline at end of file diff --git a/esm/defineRoutes.d.ts b/esm/defineRoutes.d.ts new file mode 100644 index 0000000..4dcaef6 --- /dev/null +++ b/esm/defineRoutes.d.ts @@ -0,0 +1,21 @@ +import { z } from "zod"; +import type { Url } from "./pathParameters.mjs"; +type OptionalFields = { + requestBodySchema?: z.Schema; + queryParamsSchema?: z.Schema; + responseBodySchema?: z.Schema; + headersSchema?: z.Schema; +}; +export type HttpMethod = "get" | "post" | "put" | "patch" | "delete"; +type MethodAndUrl = { + method: HttpMethod; + url: U; +}; +type SharedRouteWithOptional = MethodAndUrl & OptionalFields; +export type SharedRoute = MethodAndUrl & Required>; +export type UnknownSharedRoute = SharedRoute; +export type UnknownSharedRouteWithUrl = SharedRoute; +export declare const defineRoute: (route: SharedRouteWithOptional) => SharedRoute; +export declare const defineRoutes: >(routes: { [K in keyof T]: T[K]; }) => { [K in keyof T]: T[K]; }; +export declare const listRoutes: >(routes: { [K in keyof T]: T[K]; }) => string[]; +export {}; diff --git a/esm/defineRoutes.mjs b/esm/defineRoutes.mjs new file mode 100644 index 0000000..0a46be8 --- /dev/null +++ b/esm/defineRoutes.mjs @@ -0,0 +1,53 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +import { z } from "zod"; +export var defineRoute = function (route) { return (__assign({ requestBodySchema: z.object({}).strict(), queryParamsSchema: z.object({}).strict(), responseBodySchema: z.void(), headersSchema: z.object({}) }, route)); }; +var verifyRoutesUniqAndListRoutes = function (routes) { + var e_1, _a; + var _b; + var occurrencesByMethodAndUrl = {}; + try { + for (var _c = __values(Object.values(routes)), _d = _c.next(); !_d.done; _d = _c.next()) { + var route = _d.value; + var name_1 = "".concat(route.method.toUpperCase(), " ").concat(route.url.toLowerCase()); + var occurrence = ((_b = occurrencesByMethodAndUrl[name_1]) !== null && _b !== void 0 ? _b : 0) + 1; + if (occurrence > 1) + throw new Error("You cannot have several routes with same http method and url, got: ".concat(name_1, " twice (at least)")); + occurrencesByMethodAndUrl[name_1] = occurrence; + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_d && !_d.done && (_a = _c.return)) _a.call(_c); + } + finally { if (e_1) throw e_1.error; } + } + return Object.keys(occurrencesByMethodAndUrl); +}; +export var defineRoutes = function (routes) { + verifyRoutesUniqAndListRoutes(routes); + return routes; +}; +export var listRoutes = function (routes) { return verifyRoutesUniqAndListRoutes(routes); }; +//# sourceMappingURL=defineRoutes.mjs.map \ No newline at end of file diff --git a/esm/defineRoutes.mjs.map b/esm/defineRoutes.mjs.map new file mode 100644 index 0000000..ef245b3 --- /dev/null +++ b/esm/defineRoutes.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"defineRoutes.mjs","sourceRoot":"","sources":["../src/defineRoutes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAyCxB,MAAM,CAAC,IAAM,WAAW,GAAG,UAOzB,KAA4E,IACd,OAAA,YAC9D,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAS,EAC/C,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAS,EAC/C,kBAAkB,EAAE,CAAC,CAAC,IAAI,EAAS,EACnC,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAQ,IAC/B,KAAK,EACR,EAN8D,CAM9D,CAAC;AAEH,IAAM,6BAA6B,GAAG,UACpC,MAEC;;;IAED,IAAM,yBAAyB,GAA2B,EAAE,CAAC;;QAE7D,KAAoB,IAAA,KAAA,SAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAyB,CAAA,gBAAA,4BAAE;YAA9D,IAAM,KAAK,WAAA;YACd,IAAM,MAAI,GAAG,UAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,cAAI,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAE,CAAC;YACxE,IAAM,UAAU,GAAG,CAAC,MAAA,yBAAyB,CAAC,MAAI,CAAC,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9D,IAAI,UAAU,GAAG,CAAC;gBAChB,MAAM,IAAI,KAAK,CACb,6EAAsE,MAAI,sBAAmB,CAC9F,CAAC;YACJ,yBAAyB,CAAC,MAAI,CAAC,GAAG,UAAU,CAAC;SAC9C;;;;;;;;;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,YAAY,GAAG,UAC1B,MAEC;IAED,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AACF,MAAM,CAAC,IAAM,UAAU,GAAG,UACxB,MAEC,IACY,OAAA,6BAA6B,CAAC,MAAM,CAAC,EAArC,CAAqC,CAAC"} \ No newline at end of file diff --git a/esm/express/createExpressSharedRouter.d.ts b/esm/express/createExpressSharedRouter.d.ts new file mode 100644 index 0000000..4270415 --- /dev/null +++ b/esm/express/createExpressSharedRouter.d.ts @@ -0,0 +1,10 @@ +import type { IRoute, RequestHandler, Router } from "express"; +import type { PathParameters, UnknownSharedRoute } from "../index.mjs"; +import { z } from "zod"; +type ExpressSharedRouterOptions = { + skipRequestValidation?: boolean; +}; +export declare const createExpressSharedRouter: , ExpressSharedRouter extends { [Route in keyof SharedRoutes]: (...handlers: RequestHandler, z.TypeOf, z.TypeOf, z.TypeOf, any>[]) => IRoute; }>(sharedRoutes: SharedRoutes, expressRouter: Router, options?: ExpressSharedRouterOptions) => { + expressSharedRouter: ExpressSharedRouter; +}; +export {}; diff --git a/esm/express/createExpressSharedRouter.mjs b/esm/express/createExpressSharedRouter.mjs new file mode 100644 index 0000000..3834478 --- /dev/null +++ b/esm/express/createExpressSharedRouter.mjs @@ -0,0 +1,55 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { keys } from "../index.mjs"; +var makeValidationMiddleware = function (route, options) { + return function (req, res, next) { + try { + if (!options.skipRequestValidation) { + req.body = route.requestBodySchema.parse(req.body); + req.query = route.queryParamsSchema.parse(req.query); + route.headersSchema.parse(req.headers); // we don't want to re-affect req.headers parsed value because we don't want to lose all other headers + } + next(); + } + catch (e) { + var error = e; + res.status(400); + res.json(error.issues.map(function (_a) { + var message = _a.message, path = _a.path; + return "".concat(path.join("."), " : ").concat(message); + })); + } + }; +}; +var assignHandlersToExpressRouter = function (expressRouter, route, options) { + if (options === void 0) { options = {}; } + var validationMiddleware = makeValidationMiddleware(route, options); + var url = route.url; + return function () { + var handlers = []; + for (var _i = 0; _i < arguments.length; _i++) { + handlers[_i] = arguments[_i]; + } + return expressRouter.route(url)[route.method](validationMiddleware, handlers); + }; +}; +export var createExpressSharedRouter = function (sharedRoutes, expressRouter, options) { + var expressSharedRouter = keys(sharedRoutes).reduce(function (acc, routeName) { + var _a; + var route = sharedRoutes[routeName]; + return __assign(__assign({}, acc), (_a = {}, _a[routeName] = assignHandlersToExpressRouter(expressRouter, route, options), _a)); + }, {}); + return { + expressSharedRouter: expressSharedRouter, + }; +}; +//# sourceMappingURL=createExpressSharedRouter.mjs.map \ No newline at end of file diff --git a/esm/express/createExpressSharedRouter.mjs.map b/esm/express/createExpressSharedRouter.mjs.map new file mode 100644 index 0000000..8070f8c --- /dev/null +++ b/esm/express/createExpressSharedRouter.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"createExpressSharedRouter.mjs","sourceRoot":"","sources":["../../src/express/createExpressSharedRouter.ts"],"names":[],"mappings":";;;;;;;;;;;AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAO1B,IAAM,wBAAwB,GAC5B,UAAC,KAAyB,EAAE,OAAmC;IAC/D,OAAA,UAAC,GAAG,EAAE,GAAG,EAAE,IAAI;QACb,IAAI;YACF,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE;gBAClC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAQ,CAAC;gBAC1D,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAQ,CAAC;gBAC5D,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,sGAAsG;aAC/I;YACD,IAAI,EAAE,CAAC;SACR;QAAC,OAAO,CAAC,EAAE;YACV,IAAM,KAAK,GAAG,CAAa,CAAC;YAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAC,EAAiB;oBAAf,OAAO,aAAA,EAAE,IAAI,UAAA;gBAAO,OAAA,UAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAM,OAAO,CAAE;YAAhC,CAAgC,CAAC,CAAC,CAAC;SACrF;IACH,CAAC;AAbD,CAaC,CAAC;AAEJ,IAAM,6BAA6B,GAAG,UACpC,aAAqB,EACrB,KAAyB,EACzB,OAAwC;IAAxC,wBAAA,EAAA,YAAwC;IAExC,IAAM,oBAAoB,GAAG,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtE,IAAM,GAAG,GAAG,KAAK,CAAC,GAAa,CAAC;IAEhC,OAAO;QAAC,kBAA6B;aAA7B,UAA6B,EAA7B,qBAA6B,EAA7B,IAA6B;YAA7B,6BAA6B;;QACnC,OAAA,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,QAAQ,CAAC;IAAtE,CAAsE,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,yBAAyB,GAAG,UAcvC,YAA0B,EAC1B,aAAqB,EACrB,OAAoC;IAIpC,IAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,SAAS;;QACnE,IAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACtC,6BACK,GAAG,gBACL,SAAS,IAAG,6BAA6B,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,OACzE;IACJ,CAAC,EAAE,EAAyB,CAAC,CAAC;IAE9B,OAAO;QACL,mBAAmB,qBAAA;KACpB,CAAC;AACJ,CAAC,CAAC"} \ No newline at end of file diff --git a/esm/express/index.d.ts b/esm/express/index.d.ts new file mode 100644 index 0000000..d924974 --- /dev/null +++ b/esm/express/index.d.ts @@ -0,0 +1 @@ +export { createExpressSharedRouter } from "./createExpressSharedRouter.mjs"; diff --git a/esm/express/index.mjs b/esm/express/index.mjs new file mode 100644 index 0000000..883a08b --- /dev/null +++ b/esm/express/index.mjs @@ -0,0 +1,2 @@ +export { createExpressSharedRouter } from "./createExpressSharedRouter.mjs"; +//# sourceMappingURL=index.mjs.map \ No newline at end of file diff --git a/esm/express/index.mjs.map b/esm/express/index.mjs.map new file mode 100644 index 0000000..b646f37 --- /dev/null +++ b/esm/express/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/express/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC"} \ No newline at end of file diff --git a/esm/fetch/createFetchSharedClient.d.ts b/esm/fetch/createFetchSharedClient.d.ts new file mode 100644 index 0000000..58c4a56 --- /dev/null +++ b/esm/fetch/createFetchSharedClient.d.ts @@ -0,0 +1,7 @@ +import type { RequestInfo, RequestInit, Response } from "node-fetch"; +import type { UnknownSharedRoute } from "../index.mjs"; +import { HandlerCreator } from "../index.mjs"; +type Fetch = (url: URL | RequestInfo, init?: RequestInit) => Promise; +export declare const createFetchHandlerCreator: >(fetch: Fetch) => HandlerCreator; +export declare const createFetchSharedClient: >(sharedRouters: SharedRoutes, fetch: Fetch) => import("../index.mjs").HttpClient; +export {}; diff --git a/esm/fetch/createFetchSharedClient.mjs b/esm/fetch/createFetchSharedClient.mjs new file mode 100644 index 0000000..616acbe --- /dev/null +++ b/esm/fetch/createFetchSharedClient.mjs @@ -0,0 +1,77 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +import { configureCreateHttpClient } from "../index.mjs"; +import { queryParamsToString } from "./queryParamsToString.mjs"; +export var createFetchHandlerCreator = function (fetch) { + return function (routeName, routes, replaceParamsInUrl) { + return function (_a) { + var _b = _a === void 0 ? {} : _a, body = _b.body, urlParams = _b.urlParams, queryParams = _b.queryParams, headers = _b.headers; + return __awaiter(void 0, void 0, void 0, function () { + var route, stringQueryParams, res, json; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + route = routes[routeName]; + stringQueryParams = queryParams && Object.keys(queryParams).length > 0 + ? "?" + queryParamsToString(queryParams) + : ""; + return [4 /*yield*/, fetch(replaceParamsInUrl(route.url, urlParams) + stringQueryParams, __assign(__assign({ method: route.method }, (body ? { body: JSON.stringify(body) } : {})), { headers: headers !== null && headers !== void 0 ? headers : {} }))]; + case 1: + res = _c.sent(); + return [4 /*yield*/, res.json()]; + case 2: + json = _c.sent(); + return [2 /*return*/, { body: json, status: res.status }]; + } + }); + }); + }; + }; +}; +export var createFetchSharedClient = function (sharedRouters, fetch) { return configureCreateHttpClient(createFetchHandlerCreator(fetch))(sharedRouters); }; +//# sourceMappingURL=createFetchSharedClient.mjs.map \ No newline at end of file diff --git a/esm/fetch/createFetchSharedClient.mjs.map b/esm/fetch/createFetchSharedClient.mjs.map new file mode 100644 index 0000000..873a716 --- /dev/null +++ b/esm/fetch/createFetchSharedClient.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"createFetchSharedClient.mjs","sourceRoot":"","sources":["../../src/fetch/createFetchSharedClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,OAAO,EAAE,yBAAyB,EAAkB,MAAM,IAAI,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAI5D,MAAM,CAAC,IAAM,yBAAyB,GACpC,UACE,KAAY;IAEd,OAAA,UAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB;QACtC,OAAA,UAAO,EAA8C;gBAA9C,qBAA4C,EAAE,KAAA,EAA5C,IAAI,UAAA,EAAE,SAAS,eAAA,EAAE,WAAW,iBAAA,EAAE,OAAO,aAAA;;;;;;4BACtC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;4BAE1B,iBAAiB,GACrB,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC;gCAChD,CAAC,CAAC,GAAG,GAAG,mBAAmB,CAAC,WAAkB,CAAC;gCAC/C,CAAC,CAAC,EAAE,CAAC;4BAEG,qBAAM,KAAK,CACrB,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,SAAgB,CAAC,GAAG,iBAAiB,sBAEjE,MAAM,EAAE,KAAK,CAAC,MAAM,IACjB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAC/C,OAAO,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAK,EAAU,IAElC,EAAA;;4BAPK,GAAG,GAAG,SAOX;4BACY,qBAAM,GAAG,CAAC,IAAI,EAAE,EAAA;;4BAAvB,IAAI,GAAG,SAAgB;4BAE7B,sBAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAC;;;;SAC3C;IAnBD,CAmBC;AApBD,CAoBC,CAAC;AAEJ,MAAM,CAAC,IAAM,uBAAuB,GAAG,UAGrC,aAA2B,EAC3B,KAAY,IACT,OAAA,yBAAyB,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,EAA1E,CAA0E,CAAC"} \ No newline at end of file diff --git a/esm/fetch/index.d.ts b/esm/fetch/index.d.ts new file mode 100644 index 0000000..ccc4bce --- /dev/null +++ b/esm/fetch/index.d.ts @@ -0,0 +1 @@ +export { createFetchSharedClient, createFetchHandlerCreator, } from "./createFetchSharedClient.mjs"; diff --git a/esm/fetch/index.mjs b/esm/fetch/index.mjs new file mode 100644 index 0000000..ca90a5d --- /dev/null +++ b/esm/fetch/index.mjs @@ -0,0 +1,2 @@ +export { createFetchSharedClient, createFetchHandlerCreator, } from "./createFetchSharedClient.mjs"; +//# sourceMappingURL=index.mjs.map \ No newline at end of file diff --git a/esm/fetch/index.mjs.map b/esm/fetch/index.mjs.map new file mode 100644 index 0000000..d7b1af4 --- /dev/null +++ b/esm/fetch/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/fetch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC"} \ No newline at end of file diff --git a/esm/fetch/queryParamsToString.d.ts b/esm/fetch/queryParamsToString.d.ts new file mode 100644 index 0000000..af4d3de --- /dev/null +++ b/esm/fetch/queryParamsToString.d.ts @@ -0,0 +1,8 @@ +type RawQueryParams = { + [key: string]: string | boolean | number; +}; +export type QueryParams = { + [K in keyof T]: T[K]; +}; +export declare const queryParamsToString: >(queryParams: Q) => string; +export {}; diff --git a/esm/fetch/queryParamsToString.mjs b/esm/fetch/queryParamsToString.mjs new file mode 100644 index 0000000..0c822e7 --- /dev/null +++ b/esm/fetch/queryParamsToString.mjs @@ -0,0 +1,33 @@ +var __read = (this && this.__read) || function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +export var queryParamsToString = function (queryParams) { + return Object.keys(queryParams) + .reduce(function (acc, param) { return __spreadArray(__spreadArray([], __read(acc), false), __read((typeof queryParams[param] !== "undefined" + ? ["".concat(param.toString(), "=").concat(encodeURI(queryParams[param].toString()))] + : [])), false); }, []) + .join("&"); +}; +//# sourceMappingURL=queryParamsToString.mjs.map \ No newline at end of file diff --git a/esm/fetch/queryParamsToString.mjs.map b/esm/fetch/queryParamsToString.mjs.map new file mode 100644 index 0000000..f4a2f86 --- /dev/null +++ b/esm/fetch/queryParamsToString.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"queryParamsToString.mjs","sourceRoot":"","sources":["../../src/fetch/queryParamsToString.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAMA,MAAM,CAAC,IAAM,mBAAmB,GAAG,UACjC,WAAc;IAEd,OAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAoB;SACzC,MAAM,CACL,UAAC,GAAa,EAAE,KAAK,IAAK,8CACrB,GAAG,kBACH,CAAC,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,WAAW;QAC3C,CAAC,CAAC,CAAC,UAAG,KAAK,CAAC,QAAQ,EAAE,cAAI,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAE,CAAC;QACrE,CAAC,CAAC,EAAE,CAAC,WAJiB,CAKzB,EACD,EAAE,CACH;SACA,IAAI,CAAC,GAAG,CAAC;AAVZ,CAUY,CAAC"} \ No newline at end of file diff --git a/esm/index.d.ts b/esm/index.d.ts new file mode 100644 index 0000000..20feac7 --- /dev/null +++ b/esm/index.d.ts @@ -0,0 +1,7 @@ +export { createCustomSharedClient } from "./createCustomSharedClient.mjs"; +export { configureCreateHttpClient } from "./configureCreateHttpClient.mjs"; +export type { HandlerCreator, HttpClient, HttpResponse, } from "./configureCreateHttpClient.mjs"; +export { defineRoutes, defineRoute, listRoutes } from "./defineRoutes.mjs"; +export type { HttpMethod, SharedRoute, UnknownSharedRoute, UnknownSharedRouteWithUrl, } from "./defineRoutes.mjs"; +export type { PathParameters, Url } from "./pathParameters.mjs"; +export { keys } from "./pathParameters.mjs"; diff --git a/esm/index.mjs b/esm/index.mjs new file mode 100644 index 0000000..7b218a4 --- /dev/null +++ b/esm/index.mjs @@ -0,0 +1,5 @@ +export { createCustomSharedClient } from "./createCustomSharedClient.mjs"; +export { configureCreateHttpClient } from "./configureCreateHttpClient.mjs"; +export { defineRoutes, defineRoute, listRoutes } from "./defineRoutes.mjs"; +export { keys } from "./pathParameters.mjs"; +//# sourceMappingURL=index.mjs.map \ No newline at end of file diff --git a/esm/index.mjs.map b/esm/index.mjs.map new file mode 100644 index 0000000..8afdb18 --- /dev/null +++ b/esm/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAMxE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAQvE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC"} \ No newline at end of file diff --git a/esm/openapi/createOpenApiGenerator.d.ts b/esm/openapi/createOpenApiGenerator.d.ts new file mode 100644 index 0000000..00f4c3d --- /dev/null +++ b/esm/openapi/createOpenApiGenerator.d.ts @@ -0,0 +1,27 @@ +import { OpenAPIV3 as OpenAPI } from "openapi-types"; +import { UnknownSharedRoute } from "../index.mjs"; +import { z } from "zod"; +type TypedTag = { + name: T; +}; +type CreateOpenApiGenerator = , TagName extends string>(sharedRoutes: SharedRoutes, openApiRootDoc: Omit & { + tags?: TypedTag[]; +}) => (extraDataByRoute: Partial<{ + [R in keyof SharedRoutes]: Omit & { + tags?: TagName[]; + extraDocs?: { + body?: OpenAPI.BaseSchemaObject & { + properties?: Partial, OpenAPI.BaseSchemaObject>>; + }; + queryParams?: Partial, Partial>>; + headerParams?: Partial, Partial>>; + responseBody?: OpenAPI.BaseSchemaObject & { + properties?: Partial, OpenAPI.BaseSchemaObject>>; + }; + successStatusCode?: number; + responses?: OpenAPI.ResponsesObject; + }; + }; +}>) => OpenAPI.Document; +export declare const createOpenApiGenerator: CreateOpenApiGenerator; +export {}; diff --git a/esm/openapi/createOpenApiGenerator.mjs b/esm/openapi/createOpenApiGenerator.mjs new file mode 100644 index 0000000..eb9b013 --- /dev/null +++ b/esm/openapi/createOpenApiGenerator.mjs @@ -0,0 +1,131 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +var __read = (this && this.__read) || function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +import { keys } from "../index.mjs"; +import { zodToJsonSchema } from "zod-to-json-schema"; +export var createOpenApiGenerator = function (sharedRoutes, openApiRootDoc) { return function (extraDataByRoute) { return (__assign(__assign({}, openApiRootDoc), { paths: keys(sharedRoutes).reduce(function (acc, routeName) { + var _a, _b, _c; + var _d, _e; + var route = sharedRoutes[routeName]; + var _f = (_d = extraDataByRoute[routeName]) !== null && _d !== void 0 ? _d : {}, extraDocs = _f.extraDocs, extraDataForRoute = __rest(_f, ["extraDocs"]); + var responseSchema = zodToOpenApi(route.responseBodySchema); + var responseSchemaType = responseSchema.type; + var _g = extractFromUrl(route.url), formattedUrl = _g.formattedUrl, pathParams = _g.pathParams; + var parameters = __spreadArray(__spreadArray(__spreadArray([], __read((pathParams.length > 0 ? pathParams : [])), false), __read((!isShapeObjectEmpty(route.queryParamsSchema) + ? zodObjectToParameters(route.queryParamsSchema, "query", extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.queryParams) + : [])), false), __read((!isShapeObjectEmpty(route.headersSchema) + ? zodObjectToParameters(route.headersSchema, "header", extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.headerParams) + : [])), false); + return __assign(__assign({}, acc), (_a = {}, _a[formattedUrl] = __assign(__assign({}, acc[formattedUrl]), (_b = {}, _b[route.method] = __assign(__assign(__assign(__assign({}, extraDataForRoute), (parameters.length > 0 && { + parameters: parameters, + })), (!isShapeObjectEmpty(route.requestBodySchema) && { + requestBody: { + required: true, + content: { + "application/json": { + schema: __assign(__assign({}, extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.body), zodToOpenApi(route.requestBodySchema)), + }, + }, + }, + })), { responses: __assign((_c = {}, _c[(_e = extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.successStatusCode) !== null && _e !== void 0 ? _e : 200] = __assign(__assign({ description: responseSchemaType !== undefined + ? "Success" + : "Success, with void response" }, (responseSchemaType !== undefined && { + content: { + "application/json": { + schema: responseSchema, + }, + }, + })), extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.responseBody), _c), extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.responses) }), _b)), _a)); + }, {}) })); }; }; +var extractFromUrl = function (url) { + var pathParams = []; + var formattedUrl = url.replace(/:(.*?)(\/|$)/g, function (_match, group1, group2) { + var _a; + pathParams.push({ + name: group1, + required: true, + schema: { type: "string" }, + in: "path", + }); + return (_a = "{".concat(group1, "}") + group2) !== null && _a !== void 0 ? _a : ""; + }); + return { + formattedUrl: formattedUrl, + pathParams: pathParams, + }; +}; +var zodToOpenApi = function (schema) { + var _a = zodToJsonSchema(schema), $schema = _a.$schema, rest = __rest(_a, ["$schema"]); + return rest; +}; +var isShapeObjectEmpty = function (schema) { + var typeName = getTypeName(schema); + if (typeName === "ZodObject") { + var shape = getShape(schema); + return Object.keys(shape).length === 0; + } + return typeName === undefined; +}; +var zodObjectToParameters = function (schema, paramKind, extraDocumentation) { + if (extraDocumentation === void 0) { extraDocumentation = {}; } + var shape = getShape(schema); + return Object.keys(shape).reduce(function (acc, paramName) { + var paramSchema = shape[paramName]; + var extraDoc = extraDocumentation[paramName]; + var initialTypeName = getTypeName(paramSchema); + var required = initialTypeName !== "ZodOptional"; + var schema = zodToOpenApi(required ? paramSchema : paramSchema._def.innerType); + return __spreadArray(__spreadArray([], __read(acc), false), [ + __assign(__assign({}, extraDoc), { in: paramKind, name: paramName, required: required, schema: schema }), + ], false); + }, []); +}; +var getTypeName = function (schema) { + return schema._def.typeName; +}; +var getShape = function (schema) { return schema._def.shape(); }; +//# sourceMappingURL=createOpenApiGenerator.mjs.map \ No newline at end of file diff --git a/esm/openapi/createOpenApiGenerator.mjs.map b/esm/openapi/createOpenApiGenerator.mjs.map new file mode 100644 index 0000000..dbea2b9 --- /dev/null +++ b/esm/openapi/createOpenApiGenerator.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"createOpenApiGenerator.mjs","sourceRoot":"","sources":["../../src/openapi/createOpenApiGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,EAAE,IAAI,EAAsB,MAAM,IAAI,CAAC;AAG9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AA0DrD,MAAM,CAAC,IAAM,sBAAsB,GACjC,UAAC,YAAY,EAAE,cAAc,IAAK,OAAA,UAAC,gBAAgB,IAAK,OAAA,uBACnD,cAAc,KACjB,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,SAAS;;;QAC9C,IAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACtC,IAAM,KAAsC,MAAA,gBAAgB,CAAC,SAAS,CAAC,mCAAI,EAAE,EAArE,SAAS,eAAA,EAAK,iBAAiB,cAAjC,aAAmC,CAAoC,CAAC;QAC9E,IAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC9D,IAAM,kBAAkB,GAGP,cAAsB,CAAC,IAAI,CAAC;QAEvC,IAAA,KAA+B,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,EAAtD,YAAY,kBAAA,EAAE,UAAU,gBAA8B,CAAC;QAE/D,IAAM,UAAU,wDACX,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,kBACzC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAC9C,CAAC,CAAC,qBAAqB,CACnB,KAAK,CAAC,iBAAiB,EACvB,OAAO,EACP,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,CACvB;YACH,CAAC,CAAC,EAAE,CAAC,kBACJ,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,aAAa,CAAC;YAC1C,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,YAAY,CAAC;YAC/E,CAAC,CAAC,EAAE,CAAC,SACR,CAAC;QAEF,6BACK,GAAG,gBACL,YAAY,0BACR,GAAG,CAAC,YAAY,CAAC,gBACnB,KAAK,CAAC,MAAM,4CACR,iBAAiB,GACjB,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI;YAC3B,UAAU,YAAA;SACX,CAAC,GAEC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI;YAClD,WAAW,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE;oBACP,kBAAkB,EAAE;wBAClB,MAAM,wBACD,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,GACf,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CACzC;qBACF;iBACF;aACF;SACF,CAAC,KAEF,SAAS,wBACN,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,iBAAiB,mCAAI,GAAG,wBAClC,WAAW,EACT,kBAAkB,KAAK,SAAS;oBAC9B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,6BAA6B,IAChC,CAAC,kBAAkB,KAAK,SAAS,IAAI;gBACtC,OAAO,EAAE;oBACP,kBAAkB,EAAE;wBAClB,MAAM,EAAE,cAAc;qBACvB;iBACF;aACF,CAAC,GACC,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,YAAY,QAEzB,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,iBAI7B;IACJ,CAAC,EAAE,EAAS,CAAC,IACb,EAxEsD,CAwEtD,EAxEgC,CAwEhC,CAAC;AAWL,IAAM,cAAc,GAAG,UAAC,GAAW;IACjC,IAAM,UAAU,GAAY,EAAE,CAAC;IAE/B,IAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,UAAC,MAAM,EAAE,MAAM,EAAE,MAAM;;QACvE,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,EAAE,EAAE,MAAM;SACX,CAAC,CAAC;QACH,OAAO,MAAA,WAAI,MAAM,MAAG,GAAG,MAAM,mCAAI,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,YAAY,cAAA;QACZ,UAAU,YAAA;KACX,CAAC;AACJ,CAAC,CAAC;AAEF,IAAM,YAAY,GAAG,UAAC,MAA6C;IACjE,IAAM,KAAuB,eAAe,CAAC,MAAM,CAAC,EAA5C,OAAO,aAAA,EAAK,IAAI,cAAlB,WAAoB,CAA0B,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,IAAM,kBAAkB,GAAG,UAAI,MAAmB;IAChD,IAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,QAAQ,KAAK,WAAW,EAAE;QAC5B,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;KACxC;IAED,OAAO,QAAQ,KAAK,SAAS,CAAC;AAChC,CAAC,CAAC;AAEF,IAAM,qBAAqB,GAAG,UAC5B,MAAmB,EACnB,SAAoB,EACpB,kBAAmF;IAAnF,mCAAA,EAAA,uBAAmF;IAEnF,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE/B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,SAAS;QAC9C,IAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,IAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAoB,CAAC,CAAC;QAC1D,IAAM,eAAe,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACjD,IAAM,QAAQ,GAAG,eAAe,KAAK,aAAa,CAAC;QAEnD,IAAM,MAAM,GAAG,YAAY,CACzB,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAC7C,CAAC;QAET,8CACK,GAAG;kCAED,QAAQ,KACX,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,SAAS,EACf,QAAQ,UAAA,EACR,MAAM,QAAA;kBAER;IACJ,CAAC,EAAE,EAAa,CAAC,CAAC;AACpB,CAAC,CAAC;AAEF,IAAM,WAAW,GAAG,UAAI,MAAmB;IACzC,OAAC,MAAM,CAAC,IAAY,CAAC,QAAQ;AAA7B,CAA6B,CAAC;AAEhC,IAAM,QAAQ,GAAG,UAAI,MAAmB,IAAkB,OAAC,MAAM,CAAC,IAAY,CAAC,KAAK,EAAE,EAA5B,CAA4B,CAAC"} \ No newline at end of file diff --git a/esm/openapi/index.d.ts b/esm/openapi/index.d.ts new file mode 100644 index 0000000..2f7b227 --- /dev/null +++ b/esm/openapi/index.d.ts @@ -0,0 +1 @@ +export { createOpenApiGenerator } from "./createOpenApiGenerator.mjs"; diff --git a/esm/openapi/index.mjs b/esm/openapi/index.mjs new file mode 100644 index 0000000..3ff5f58 --- /dev/null +++ b/esm/openapi/index.mjs @@ -0,0 +1,2 @@ +export { createOpenApiGenerator } from "./createOpenApiGenerator.mjs"; +//# sourceMappingURL=index.mjs.map \ No newline at end of file diff --git a/esm/openapi/index.mjs.map b/esm/openapi/index.mjs.map new file mode 100644 index 0000000..97240a3 --- /dev/null +++ b/esm/openapi/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/openapi/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"} \ No newline at end of file diff --git a/esm/pathParameters.d.ts b/esm/pathParameters.d.ts new file mode 100644 index 0000000..c40384b --- /dev/null +++ b/esm/pathParameters.d.ts @@ -0,0 +1,19 @@ +type Http = "http://" | "https://"; +type AbsoluteUrl = `${Http}${string}`; +type RelativeUrl = `/${string}`; +export type Url = AbsoluteUrl | RelativeUrl; +interface ParamsDictionary { + [key: string]: string; +} +type RemoveDomain = S extends RelativeUrl ? S : S extends `${Http}${string}${"/"}${infer P}` ? `/${P}` : "/"; +type RemoveTail = S extends `${infer P}${Tail}` ? P : S; +type GetRouteParameter = RemoveTail, `-${string}`>, `.${string}`>; +export type PathParameters = string extends Route ? ParamsDictionary : RemoveDomain extends `${string}:${infer Rest}` ? (GetRouteParameter extends never ? ParamsDictionary : GetRouteParameter extends `${infer ParamName}?` ? { + [P in ParamName]?: string; +} : { + [P in GetRouteParameter]: string; +}) & (Rest extends `${GetRouteParameter}${infer Next}` ? PathParameters : unknown) : {}; +export type ReplaceParamsInUrl = (path: U, params: PathParameters) => Url; +export declare const replaceParamsInUrl: ReplaceParamsInUrl; +export declare const keys: >(obj: Obj) => (keyof Obj)[]; +export {}; diff --git a/esm/pathParameters.mjs b/esm/pathParameters.mjs new file mode 100644 index 0000000..7afc705 --- /dev/null +++ b/esm/pathParameters.mjs @@ -0,0 +1,11 @@ +export var replaceParamsInUrl = function (url, params) { + if (params === void 0) { params = {}; } + var paramNames = keys(params); + if (paramNames.length === 0) + return url; + return paramNames.reduce(function (acc, paramName) { return acc.replace(":".concat(paramName.toString()), params[paramName]); }, url); +}; +export var keys = function (obj) { + return Object.keys(obj); +}; +//# sourceMappingURL=pathParameters.mjs.map \ No newline at end of file diff --git a/esm/pathParameters.mjs.map b/esm/pathParameters.mjs.map new file mode 100644 index 0000000..5f97b68 --- /dev/null +++ b/esm/pathParameters.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"pathParameters.mjs","sourceRoot":"","sources":["../src/pathParameters.ts"],"names":[],"mappings":"AA+CA,MAAM,CAAC,IAAM,kBAAkB,GAAuB,UACpD,GAAG,EACH,MAAyC;IAAzC,uBAAA,EAAA,SAAS,EAAgC;IAEzC,IAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACxC,OAAO,UAAU,CAAC,MAAM,CACtB,UAAC,GAAG,EAAE,SAAS,IAAK,OAAA,GAAG,CAAC,OAAO,CAAC,WAAI,SAAS,CAAC,QAAQ,EAAE,CAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAA1D,CAA0D,EAC9E,GAAU,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,IAAI,GAAG,UAAsC,GAAQ;IAChE,OAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAkB;AAAjC,CAAiC,CAAC"} \ No newline at end of file diff --git a/esm/supertest/createSupertestSharedClient.d.ts b/esm/supertest/createSupertestSharedClient.d.ts new file mode 100644 index 0000000..be46c3b --- /dev/null +++ b/esm/supertest/createSupertestSharedClient.d.ts @@ -0,0 +1,5 @@ +import type { UnknownSharedRoute } from "../index.mjs"; +import { HandlerCreator } from "../index.mjs"; +import type { SuperTest, Test } from "supertest"; +export declare const createSupertestHandlerCreator: (supertestRequest: SuperTest) => HandlerCreator; +export declare const createSupertestSharedClient: >(sharedRoutes: SharedRoutes, supertestRequest: SuperTest) => import("../index.mjs").HttpClient; diff --git a/esm/supertest/createSupertestSharedClient.mjs b/esm/supertest/createSupertestSharedClient.mjs new file mode 100644 index 0000000..89fcf61 --- /dev/null +++ b/esm/supertest/createSupertestSharedClient.mjs @@ -0,0 +1,58 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +import { configureCreateHttpClient } from "../index.mjs"; +var supertestRequestToCorrectHttpMethod = function (supertestRequest, method) { return supertestRequest[method]; }; +export var createSupertestHandlerCreator = function (supertestRequest) { + return function (routeName, routes, replaceParamsInUrl) { + var route = routes[routeName]; + return function (_a) { + var _b = _a === void 0 ? {} : _a, headers = _b.headers, body = _b.body, queryParams = _b.queryParams, urlParams = _b.urlParams; + return __awaiter(void 0, void 0, void 0, function () { + return __generator(this, function (_c) { + return [2 /*return*/, supertestRequestToCorrectHttpMethod(supertestRequest, route.method)(replaceParamsInUrl(route.url, urlParams)) + .send(body) + .set(headers !== null && headers !== void 0 ? headers : {}) + .query(queryParams)]; + }); + }); + }; + }; +}; +export var createSupertestSharedClient = function (sharedRoutes, supertestRequest) { + return configureCreateHttpClient(createSupertestHandlerCreator(supertestRequest))(sharedRoutes); +}; +//# sourceMappingURL=createSupertestSharedClient.mjs.map \ No newline at end of file diff --git a/esm/supertest/createSupertestSharedClient.mjs.map b/esm/supertest/createSupertestSharedClient.mjs.map new file mode 100644 index 0000000..0a2445b --- /dev/null +++ b/esm/supertest/createSupertestSharedClient.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"createSupertestSharedClient.mjs","sourceRoot":"","sources":["../../src/supertest/createSupertestSharedClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,EAAE,yBAAyB,EAAkB,MAAM,IAAI,CAAC;AAI/D,IAAM,mCAAmC,GAAG,UAC1C,gBAAiC,EACjC,MAAkB,IACO,OAAA,gBAAgB,CAAC,MAAM,CAAC,EAAxB,CAAwB,CAAC;AAEpD,MAAM,CAAC,IAAM,6BAA6B,GACxC,UAAC,gBAAiC;IAClC,OAAA,UAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB;QACpC,IAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,UAAO,EAA8C;gBAA9C,qBAA4C,EAAE,KAAA,EAA5C,OAAO,aAAA,EAAE,IAAI,UAAA,EAAE,WAAW,iBAAA,EAAE,SAAS,eAAA;;;oBACnD,sBAAA,mCAAmC,CACjC,gBAAgB,EAChB,KAAK,CAAC,MAAM,CACb,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;6BACxC,IAAI,CAAC,IAAI,CAAC;6BACV,GAAG,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;6BAClB,KAAK,CAAC,WAAW,CAAC,EAAA;;;SAAA,CAAC;IAC1B,CAAC;AAVD,CAUC,CAAC;AAEJ,MAAM,CAAC,IAAM,2BAA2B,GAAG,UAGzC,YAA0B,EAC1B,gBAAiC;IAEjC,OAAA,yBAAyB,CAAC,6BAA6B,CAAC,gBAAgB,CAAC,CAAC,CACxE,YAAY,CACb;AAFD,CAEC,CAAC"} \ No newline at end of file diff --git a/esm/supertest/index.d.ts b/esm/supertest/index.d.ts new file mode 100644 index 0000000..353d901 --- /dev/null +++ b/esm/supertest/index.d.ts @@ -0,0 +1 @@ +export { createSupertestSharedClient } from "./createSupertestSharedClient.mjs"; diff --git a/esm/supertest/index.mjs b/esm/supertest/index.mjs new file mode 100644 index 0000000..3052989 --- /dev/null +++ b/esm/supertest/index.mjs @@ -0,0 +1,2 @@ +export { createSupertestSharedClient } from "./createSupertestSharedClient.mjs"; +//# sourceMappingURL=index.mjs.map \ No newline at end of file diff --git a/esm/supertest/index.mjs.map b/esm/supertest/index.mjs.map new file mode 100644 index 0000000..fe9c405 --- /dev/null +++ b/esm/supertest/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/supertest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC"} \ No newline at end of file diff --git a/esm/tsconfig.esm.tsbuildinfo b/esm/tsconfig.esm.tsbuildinfo new file mode 100644 index 0000000..2c99247 --- /dev/null +++ b/esm/tsconfig.esm.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/zod/lib/helpers/typeAliases.d.ts","../../node_modules/zod/lib/helpers/util.d.ts","../../node_modules/zod/lib/ZodError.d.ts","../../node_modules/zod/lib/locales/en.d.ts","../../node_modules/zod/lib/errors.d.ts","../../node_modules/zod/lib/helpers/parseUtil.d.ts","../../node_modules/zod/lib/helpers/enumUtil.d.ts","../../node_modules/zod/lib/helpers/errorUtil.d.ts","../../node_modules/zod/lib/helpers/partialUtil.d.ts","../../node_modules/zod/lib/types.d.ts","../../node_modules/zod/lib/external.d.ts","../../node_modules/zod/lib/index.d.ts","../../node_modules/zod/index.d.ts","../../src/pathParameters.ts","../../src/defineRoutes.ts","../../src/configureCreateHttpClient.ts","../../src/createCustomSharedClient.ts","../../src/index.ts","../../node_modules/axios/index.d.ts","../../src/axios/createAxiosSharedClient.ts","../../src/axios/index.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/send/node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/express/index.d.ts","../../src/express/createExpressSharedRouter.ts","../../src/express/index.ts","../../node_modules/formdata-polyfill/esm.min.d.ts","../../node_modules/fetch-blob/file.d.ts","../../node_modules/fetch-blob/index.d.ts","../../node_modules/fetch-blob/from.d.ts","../../node_modules/node-fetch/@types/index.d.ts","../../src/fetch/queryParamsToString.ts","../../src/fetch/createFetchSharedClient.ts","../../src/fetch/index.ts","../../node_modules/openapi-types/dist/index.d.ts","../../node_modules/zod-to-json-schema/src/Options.d.ts","../../node_modules/zod-to-json-schema/src/parsers/any.d.ts","../../node_modules/zod-to-json-schema/src/Refs.d.ts","../../node_modules/zod-to-json-schema/src/errorMessages.d.ts","../../node_modules/zod-to-json-schema/src/parsers/array.d.ts","../../node_modules/zod-to-json-schema/src/parsers/bigint.d.ts","../../node_modules/zod-to-json-schema/src/parsers/boolean.d.ts","../../node_modules/zod-to-json-schema/src/parsers/date.d.ts","../../node_modules/zod-to-json-schema/src/parsers/enum.d.ts","../../node_modules/zod-to-json-schema/src/parsers/intersection.d.ts","../../node_modules/zod-to-json-schema/src/parsers/literal.d.ts","../../node_modules/zod-to-json-schema/src/parsers/map.d.ts","../../node_modules/zod-to-json-schema/src/parsers/nativeEnum.d.ts","../../node_modules/zod-to-json-schema/src/parsers/never.d.ts","../../node_modules/zod-to-json-schema/src/parsers/null.d.ts","../../node_modules/zod-to-json-schema/src/parsers/nullable.d.ts","../../node_modules/zod-to-json-schema/src/parsers/number.d.ts","../../node_modules/zod-to-json-schema/src/parsers/object.d.ts","../../node_modules/zod-to-json-schema/src/parsers/string.d.ts","../../node_modules/zod-to-json-schema/src/parsers/record.d.ts","../../node_modules/zod-to-json-schema/src/parsers/set.d.ts","../../node_modules/zod-to-json-schema/src/parsers/tuple.d.ts","../../node_modules/zod-to-json-schema/src/parsers/undefined.d.ts","../../node_modules/zod-to-json-schema/src/parsers/union.d.ts","../../node_modules/zod-to-json-schema/src/parsers/unknown.d.ts","../../node_modules/zod-to-json-schema/src/parseDef.d.ts","../../node_modules/zod-to-json-schema/src/zodToJsonSchema.d.ts","../../node_modules/zod-to-json-schema/index.d.ts","../../src/openapi/createOpenApiGenerator.ts","../../src/openapi/index.ts","../../node_modules/@types/cookiejar/index.d.ts","../../node_modules/@types/superagent/index.d.ts","../../node_modules/@types/supertest/index.d.ts","../../src/supertest/createSupertestSharedClient.ts","../../src/supertest/index.ts","../../node_modules/@types/chai/index.d.ts","../../node_modules/@types/chai-subset/index.d.ts","../../node_modules/@types/comment-json/index.d.ts","../../node_modules/@types/istanbul-lib-coverage/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/parse-json/index.d.ts"],"fileInfos":[{"version":"6a6b471e7e43e15ef6f8fe617a22ce4ecb0e34efa6c3dfcfe7cebd392bcca9d2","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","27147504487dc1159369da4f4da8a26406364624fa9bc3db632f7d94a5bae2c3","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"fcd3ecc9f764f06f4d5c467677f4f117f6abf49dee6716283aa204ff1162498b","affectsGlobalScope":true},{"version":"f296963760430fb65b4e5d91f0ed770a91c6e77455bacf8fa23a1501654ede0e","affectsGlobalScope":true},{"version":"5114a95689b63f96b957e00216bc04baf9e1a1782aa4d8ee7e5e9acbf768e301","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"ab22100fdd0d24cfc2cc59d0a00fc8cf449830d9c4030dc54390a46bd562e929","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"36ae84ccc0633f7c0787bc6108386c8b773e95d3b052d9464a99cd9b8795fbec","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"b7e9f95a7387e3f66be0ed6db43600c49cec33a3900437ce2fd350d9b7cb16f2","affectsGlobalScope":true},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true},{"version":"189c0703923150aa30673fa3de411346d727cc44a11c75d05d7cf9ef095daa22","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"5487b97cfa28b26b4a9ef0770f872bdbebd4c46124858de00f242c3eed7519f4","7a01f546ace66019156e4232a1bee2fabc2f8eabeb052473d926ee1693956265","fb53b1c6a6c799b7e3cc2de3fb5c9a1c04a1c60d4380a37792d84c5f8b33933b","8485b6da53ec35637d072e516631d25dae53984500de70a6989058f24354666f","ebe80346928736532e4a822154eb77f57ef3389dbe2b3ba4e571366a15448ef2","c2cb3c8ff388781258ea9ddbcd8a947f751bddd6886e1d3b3ea09ddaa895df80","f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","98a9cc18f661d28e6bd31c436e1984f3980f35e0f0aa9cf795c54f8ccb667ffe","c76b0c5727302341d0bdfa2cc2cee4b19ff185b554edb6e8543f0661d8487116","19903057d0249e45c579bef2b771c37609e4853a8b88adbb0b6b63f9e1d1f372","f5ef066942e4f0bd98200aa6a6694b831e73200c9b3ade77ad0aa2409e8fe1b1","b9e99cd94f4166a245f5158f7286c05406e2a4c694619bceb7a4f3519d1d768e","5568d7c32e5cf5f35e092649f4e5e168c3114c800b1d7545b7ae5e0415704802",{"version":"be139d52709c57e683b367f8e3118a064130c670cd6814e7e5b927adaf2fbb21","signature":"c7c176a5a8a12c6b3d5b28c95320448f17c7d5438485c53a086dea69ed2e6801"},{"version":"5926ff04adf89aa4c2150c89edc7eab64f1c994744375e980a4721b18dd2aa87","signature":"4194740cc3d0f6cdeb5e7864e013d3525e18cf47a956c5f4751fb31130f4d734"},{"version":"c1b54bfa83d46c863ed16012203437401af66e31f07a8f8772a1f070b52204df","signature":"d154e25161ae14a78d0f690c0689d47af27082a25e07000024c6febb0b512f6b"},{"version":"454671610b0389f294e74f0ffbf4d72c926d9e11da889d359674ae4e3224ef6b","signature":"70aad179112a492efbeed445504038ea12e90db5f6ecf452bd13b606e9263cd9"},{"version":"76c0556d36524e5a16ef84d239fb3992c7cdef0a5535f5f63349917cca1c414c","signature":"c4acec2b887b9279da570a4f056c51a61988231afabbd200590fff738e71e422"},"2808645b990069e5f8b5ff14c9f1e6077eb642583c3f7854012d60757f23c70e",{"version":"eb67e9332d227f5e74141b84947759d3f04573c9430e4f7ef52ad8668ac5e2b2","signature":"9d796126561c18da6556ccc866ea162c0be34dfa82ddbd275080aa2c33402da5"},{"version":"ac0a1002f8b4eddd32b1bbc5a9be001df44e556fbe2463b167b8203c8076962b","signature":"81c36a85d6c190ce4b6d0a2d01ea8c8c6c4ccf4190466597e099d28d39420074"},"7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"ca72190df0eb9b09d4b600821c8c7b6c9747b75a1c700c4d57dc0bb72abc074c","affectsGlobalScope":true},"11e2d554398d2bd460e7d06b2fa5827a297c8acfbe00b4f894a224ac0862857f",{"version":"17a1140b90821c2c8d7064c9fc7598797c385714e6aa88b85e30b1159af8dc9b","affectsGlobalScope":true},"374ca798f244e464346f14301dc2a8b4b111af1a83b49fffef5906c338a1f922","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","dab86d9604fe40854ef3c0a6f9e8948873dc3509213418e5e457f410fd11200f","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","489532ff54b714f0e0939947a1c560e516d3ae93d51d639ab02e907a0e950114","f30bb836526d930a74593f7b0f5c1c46d10856415a8f69e5e2fc3db80371e362","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"816ad2e607a96de5bcac7d437f843f5afd8957f1fa5eefa6bba8e4ed7ca8fd84","affectsGlobalScope":true},"cec36af22f514322f870e81d30675c78df82ae8bf4863f5fd4e4424c040c678d","d903fafe96674bc0b2ac38a5be4a8fc07b14c2548d1cdb165a80ea24c44c0c54","5eec82ac21f84d83586c59a16b9b8502d34505d1393393556682fe7e7fde9ef2","04eb6578a588d6a46f50299b55f30e3a04ef27d0c5a46c57d8fcc211cd530faa","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true},"2c45b35f4850881ab132f80d3cb51e8a359a4d8fafdc5ff2401d260dc27862f4","7c013aa892414a7fdcfd861ae524a668eaa3ede8c7c0acafaf611948122c8d93","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"b3624aed92dab6da8484280d3cb3e2f4130ec3f4ef3f8201c95144ae9e898bb6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","fd93cee2621ff42dabe57b7be402783fd1aa69ece755bcba1e0290547ae60513","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","a15eb098ed86a4135cba05d77e792d6189fa8607a00c9b1b381c0e9550c04ba5",{"version":"970a90f76d4d219ad60819d61f5994514087ba94c985647a3474a5a3d12714ed","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","c4577fb855ca259bdbf3ea663ca73988ce5f84251a92b4aef80a1f4122b6f98e","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"f0900cd5d00fe1263ff41201fb8073dbeb984397e4af3b8002a5c207a30bdc33","affectsGlobalScope":true},{"version":"ff07a9a03c65732ccc59b3c65bc584173da093bd563a6565411c01f5703bd3cb","affectsGlobalScope":true},"06d7c42d256f0ce6afe1b2b6cfbc97ab391f29dadb00dd0ae8e8f23f5bc916c3","ec4bd1b200670fb567920db572d6701ed42a9641d09c4ff6869768c8f81b404c","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"da26af7362f53d122283bc69fed862b9a9fe27e01bc6a69d1d682e0e5a4df3e6","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"ed2a670a77a1b80653c5bde2d813b0ab2e92872cc9b2b611ce11050b95139be6","84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc",{"version":"76e9656e6ab408f2d3baefc6d2aa8969c768e426dd577f4abae4cf0d2fce1cbb","affectsGlobalScope":true},"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84",{"version":"5f569b2d1c9e7be110124184a723b34db4312ce4b54680460037209c13280087","signature":"d0be3ab1af6bb4bf9f7f9a2958456a604f1814fa32f613a34691758e40e4793d"},"fa00eede2b2640bcfec133440377a75fc7d4647affa0aa68d1dad3626ec441db","d782e571cb7d6ec0f0645957ed843d00e3f8577e08cc2940f400c931bc47a8df","9167246623f181441e6116605221268d94e33a1ebd88075e2dc80133c928ae7e","dc1a838d8a514b6de9fbce3bd5e6feb9ccfe56311e9338bb908eb4d0d966ecaf","186f09ed4b1bc1d5a5af5b1d9f42e2d798f776418e82599b3de16423a349d184","d692ae73951775d2448df535ce8bc8abf162dc343911fedda2c37b8de3b20d8e",{"version":"69571e322ffb287ea739ba2a674369b3790974f717e8a47d969f84543cde2da2","signature":"4714df73aa332341fd02da657beb85950e4c60eed5c7520b203e5b52b15ed992"},{"version":"756da88c45539dd4359a1f7785b52caf8c820c519493b169a7335eaf365d5413","signature":"92436d2cdb2bc0d9a630782f1511ed290ebf3b07a4cd57369bb169f1d8651fff"},{"version":"0776b08ea328dfd0ea47ea98c15a55d3c64cedd1912ec0ac1470a583fd969205","signature":"bd585a2f8f072b16b0b061716702219c6faed04778f3fa447ec65c9162d60b00"},"cc3e30832aff12a575919d59eb3d680ca7cc999e1041bb0fc489dbe0276b066b","dd804b99db086f2f0e24bb373d2a1e9d9177f32f5c8f2c7b37c99accdf835e0c","e70f03e85bc8a2385e538a2db0c9ee532f6a9b346872aa809f173a26df7caee1","264808a845721a9f3df608a5e7ed12537f976d1645f20cbb448b106068f82332","8d484f5d6fd888f53e7cc21957ec2370461c73d230efb3467b9fb1822901535b","df73b0c2aa1ffa4a9aebd72baee78edf77ce5023d4476c04eadadbcdeb2964dc","065cbd81319d18ffc3b81100fbc60da26daf7fa090b26edf7dd3cc8c1a6cfbc5","771c436459c7a2ac2604ffa55a3abd76ffe8cae6aeae700d749f0fa5e8869ff6","7d4a2dae1a1ee3b99563747fa815076956911a833954deed5a4aa2d9207df167","45f6cd001ba50294b3e9a43800b22e0798cdcdc20c214cafd55d4d7d1914c331","b81b383239d2f4f14515331d7017febcb23786d90c5acc9688a891010fe25d4c","c60f24b4fd55376e4e095914d8f5345f63b7028d50fc8a0b7ec930f82777cacf","5754e79fbbfbb921b60ca1ad35cfbb5940733d93110bb1a935584f90cedb1c68","f7fcb70b90e9664b1ff1fb8566d3af99ca1a057d0dcfb94fb69b430463acba27","fb3af1e7369a6a52e0382612036ddcea2d089cdb0cccadc968a975043621e5fa","51353ffcc4bec12870c1435205dcaedab91ef108123017fd50fe8c3aed2bec04","e26befbe9607e9915734929db869fd83943f66e08c8e59d7308c14f6b6e755a3","4f596be4c3cb6ab63476dfa81bfe5f2a75768b6fd966d4c716411b4daa98df11","6d0e44cb89017602b13264823b15ada2a38e2ccb2a831c3e57680a0eb57d4bed","5e3f90d8fbf438ecb335d40e7a830f8deba1f045a2c3a27a8f5a4cdf8f499422","3a98713a36fe040df4d7e10a9e57a983f814f5cac42d3fe7919a342a6b9c103f","5dbaf247d7887721b20d8cf0a127460782ebbdc4285868f831a2f48104f034b5","b44d4ecd18d153d893eb38bfd827c0d624ed6f8fed4d9622489d76b3e4847067","23a12ab68ec3b350709bc4c15ddd34d8afa5e94dfccb1346f663f2c4bdb4334a","c9dfb06ca7c62fc5a95d33362f66c2bf5bf78d61ab433e62ec44190ea4012910","8d8b8fea19a532864502cbe5b298aadc194b970d511998342e38e4b9dea98c48","97479d4a4ddc4f4db849e5d6daadda8d986f5a7c580a0d79b3763a536a62268f","7efebf1092b8e7dfd08b0e54ec7d86dfabfd505f820d89351d957bfbc0bb3db2","032ccc910e4f1baf0355a2e43bc535caec36b1e916e64491ec2cabea5593593b",{"version":"c509fe39c0fdf2c28de8f1e14f8e115a26ba1026b2404a9f69858720f3b4ca3b","signature":"0cdd77d7b0f422be43875a362ea1509ad2f65cbf7578bbe0e3789c77bcc1a123"},"5379bd2adb109cb6c15e7f0367c2eb1986d837f9977f50915afe4fc1759522ba","8d48b8f8a377ade8dd1f000625bc276eea067f2529cc9cafdf082d17142107d6","5df73c1f18e7e58a7ce2c9ec072ef7cc75f4841c8723f0d36eafd9fb5c1a90d4","76232dbb982272b182a76ad8745a9b02724dc9896e2328ce360e2c56c64c9778",{"version":"b3d08e5f9da8ffa45950f5260d8d6e067b3804e8694e5e01509bb51292f9cc9c","signature":"a03049a303d95f933af688a1c541867127a1226a4a200325369c02a39320bab7"},"c16631ce27bbed5b2fe93a3b5a9b76c22b64c909633e9f9a2cca997bc890ac51",{"version":"c3bc5d095c3c22fd20b5a6550b9c9a6d56c3ffbb87ef057ccce7764b6bed4428","affectsGlobalScope":true},{"version":"f4c0db3a49cea9babd5d224ba14243a6a6119bf65a65198994033aaea3a60a71","affectsGlobalScope":true},"c401118ea6c6daa9f196013b0622c602d4faec565bb1cc6ca751d2a8fc295498","8b06ac3faeacb8484d84ddb44571d8f410697f98d7bfa86c0fda60373a9f5215","a185ebc69c9f6798ebd67bfdfd72a37457dc67c23459784783c7128ae9bd5250","2b8264b2fefd7367e0f20e2c04eed5d3038831fe00f5efbc110ff0131aab899b"],"root":[[58,62],64,65,131,132,[138,140],170,171,175,176],"options":{"declaration":true,"downlevelIteration":true,"esModuleInterop":true,"jsx":4,"module":5,"newLine":1,"noFallthroughCasesInSwitch":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","sourceMap":true,"strict":true,"target":1},"fileIdsList":[[85,112,119,128],[112,177],[112],[85,112,119],[82,85,112,119,121,122,123],[112,123,124,127,129],[112,126],[112,125],[66,112],[69,112],[70,75,103,112],[71,82,83,90,100,111,112],[71,72,82,90,112],[73,112],[74,75,83,91,112],[75,100,108,112],[76,78,82,90,112],[77,112],[78,79,112],[82,112],[80,82,112],[82,83,84,100,111,112],[82,83,84,97,100,103,112],[112,116],[78,85,90,100,111,112],[82,83,85,86,90,100,108,111,112],[85,87,100,108,111,112],[66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118],[82,88,112],[89,111,112],[78,82,90,100,112],[91,112],[92,112],[69,93,112],[94,110,112,116],[95,112],[96,112],[82,97,98,112],[97,99,112,114],[70,82,100,101,102,103,112],[70,100,102,112],[100,101,112],[103,112],[104,112],[82,106,107,112],[106,107,112],[75,90,100,108,112],[109,112],[90,110,112],[70,85,96,111,112],[75,112],[100,112,113],[112,114],[112,115],[70,75,82,84,93,100,111,112,114,116],[100,112,117],[83,100,112,119,120],[85,112,119,126],[70,83,85,100,112,119,172],[112,173],[112,134,135],[85,112,119,133,136],[112,168],[57,112],[57,112,142,167],[112,144,167],[57,112,143,144,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166],[57,112,144,145,167],[57,112,144,145],[57,112,144,167],[57,112,144],[112,144],[57,112,144,156,167],[57,112,144,150,160,167],[56,112],[45,46,56,112],[47,48,112],[45,46,47,49,50,54,112],[46,47,112],[55,112],[47,112],[45,46,47,50,51,52,53,112],[62,63,112],[64,112],[57,58,59,112],[59,60,112],[57,58,112],[57,62,112,130],[112,131],[62,112,137,138],[112,139],[58,59,60,61,112],[57,62,112,141,169],[112,170],[62,112,174],[112,175],[62,63],[64],[57,58,59],[59,60],[57,58],[57,62,130],[62,137],[139],[58,59,60,61],[57,62,141],[62,174]],"referencedMap":[[129,1],[178,2],[177,3],[179,3],[128,4],[172,3],[124,5],[130,6],[180,3],[181,3],[125,7],[126,8],[66,9],[67,9],[69,10],[70,11],[71,12],[72,13],[73,14],[74,15],[75,16],[76,17],[77,18],[78,19],[79,19],[81,20],[80,21],[82,20],[83,22],[84,23],[68,24],[118,3],[85,25],[86,26],[87,27],[119,28],[88,29],[89,30],[90,31],[91,32],[92,33],[93,34],[94,35],[95,36],[96,37],[97,38],[98,38],[99,39],[100,40],[102,41],[101,42],[103,43],[104,44],[105,3],[106,45],[107,46],[108,47],[109,48],[110,49],[111,50],[112,51],[113,52],[114,53],[115,54],[116,55],[117,56],[182,3],[123,3],[122,3],[121,57],[120,3],[127,58],[173,59],[174,60],[63,3],[134,3],[136,61],[135,3],[133,3],[137,62],[141,3],[43,3],[44,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[4,3],[22,3],[19,3],[20,3],[21,3],[23,3],[24,3],[25,3],[5,3],[26,3],[27,3],[28,3],[29,3],[6,3],[33,3],[30,3],[31,3],[32,3],[34,3],[7,3],[35,3],[40,3],[41,3],[36,3],[37,3],[38,3],[39,3],[1,3],[42,3],[169,63],[142,64],[144,65],[145,66],[167,67],[143,3],[146,68],[147,69],[148,3],[149,3],[150,64],[151,70],[152,71],[153,70],[154,64],[155,3],[156,72],[157,73],[158,69],[159,70],[161,74],[162,68],[160,69],[163,70],[164,3],[165,70],[166,3],[168,65],[57,75],[47,76],[49,77],[55,78],[51,3],[52,3],[50,79],[53,75],[45,3],[46,3],[56,80],[48,81],[54,82],[64,83],[65,84],[60,85],[61,86],[59,87],[131,88],[132,89],[139,90],[140,91],[138,3],[62,92],[170,93],[171,94],[58,3],[175,95],[176,96]],"exportedModulesMap":[[129,1],[178,2],[177,3],[179,3],[128,4],[172,3],[124,5],[130,6],[180,3],[181,3],[125,7],[126,8],[66,9],[67,9],[69,10],[70,11],[71,12],[72,13],[73,14],[74,15],[75,16],[76,17],[77,18],[78,19],[79,19],[81,20],[80,21],[82,20],[83,22],[84,23],[68,24],[118,3],[85,25],[86,26],[87,27],[119,28],[88,29],[89,30],[90,31],[91,32],[92,33],[93,34],[94,35],[95,36],[96,37],[97,38],[98,38],[99,39],[100,40],[102,41],[101,42],[103,43],[104,44],[105,3],[106,45],[107,46],[108,47],[109,48],[110,49],[111,50],[112,51],[113,52],[114,53],[115,54],[116,55],[117,56],[182,3],[123,3],[122,3],[121,57],[120,3],[127,58],[173,59],[174,60],[63,3],[134,3],[136,61],[135,3],[133,3],[137,62],[141,3],[43,3],[44,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[4,3],[22,3],[19,3],[20,3],[21,3],[23,3],[24,3],[25,3],[5,3],[26,3],[27,3],[28,3],[29,3],[6,3],[33,3],[30,3],[31,3],[32,3],[34,3],[7,3],[35,3],[40,3],[41,3],[36,3],[37,3],[38,3],[39,3],[1,3],[42,3],[169,63],[142,64],[144,65],[145,66],[167,67],[143,3],[146,68],[147,69],[148,3],[149,3],[150,64],[151,70],[152,71],[153,70],[154,64],[155,3],[156,72],[157,73],[158,69],[159,70],[161,74],[162,68],[160,69],[163,70],[164,3],[165,70],[166,3],[168,65],[57,75],[47,76],[49,77],[55,78],[51,3],[52,3],[50,79],[53,75],[45,3],[46,3],[56,80],[48,81],[54,82],[64,97],[65,98],[60,99],[61,100],[59,101],[131,102],[132,89],[139,103],[140,104],[62,105],[170,106],[171,94],[175,107],[176,96]],"semanticDiagnosticsPerFile":[129,178,177,179,128,172,124,130,180,181,125,126,66,67,69,70,71,72,73,74,75,76,77,78,79,81,80,82,83,84,68,118,85,86,87,119,88,89,90,91,92,93,94,95,96,97,98,99,100,102,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,182,123,122,121,120,127,173,174,63,134,136,135,133,137,141,43,44,8,10,9,2,11,12,13,14,15,16,17,18,3,4,22,19,20,21,23,24,25,5,26,27,28,29,6,33,30,31,32,34,7,35,40,41,36,37,38,39,1,42,169,142,144,145,167,143,146,147,148,149,150,151,152,153,154,155,156,157,158,159,161,162,160,163,164,165,166,168,57,47,49,55,51,52,50,53,45,46,56,48,54,64,65,60,61,59,131,132,139,140,138,62,170,171,58,175,176]},"version":"5.0.4"} \ No newline at end of file diff --git a/express/createExpressSharedRouter.d.ts b/express/createExpressSharedRouter.d.ts new file mode 100644 index 0000000..5613ad5 --- /dev/null +++ b/express/createExpressSharedRouter.d.ts @@ -0,0 +1,10 @@ +import type { IRoute, RequestHandler, Router } from "express"; +import type { PathParameters, UnknownSharedRoute } from ".."; +import { z } from "zod"; +type ExpressSharedRouterOptions = { + skipRequestValidation?: boolean; +}; +export declare const createExpressSharedRouter: , ExpressSharedRouter extends { [Route in keyof SharedRoutes]: (...handlers: RequestHandler, z.TypeOf, z.TypeOf, z.TypeOf, any>[]) => IRoute; }>(sharedRoutes: SharedRoutes, expressRouter: Router, options?: ExpressSharedRouterOptions) => { + expressSharedRouter: ExpressSharedRouter; +}; +export {}; diff --git a/express/createExpressSharedRouter.js b/express/createExpressSharedRouter.js new file mode 100644 index 0000000..d287bb4 --- /dev/null +++ b/express/createExpressSharedRouter.js @@ -0,0 +1,59 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createExpressSharedRouter = void 0; +var __1 = require(".."); +var makeValidationMiddleware = function (route, options) { + return function (req, res, next) { + try { + if (!options.skipRequestValidation) { + req.body = route.requestBodySchema.parse(req.body); + req.query = route.queryParamsSchema.parse(req.query); + route.headersSchema.parse(req.headers); // we don't want to re-affect req.headers parsed value because we don't want to lose all other headers + } + next(); + } + catch (e) { + var error = e; + res.status(400); + res.json(error.issues.map(function (_a) { + var message = _a.message, path = _a.path; + return "".concat(path.join("."), " : ").concat(message); + })); + } + }; +}; +var assignHandlersToExpressRouter = function (expressRouter, route, options) { + if (options === void 0) { options = {}; } + var validationMiddleware = makeValidationMiddleware(route, options); + var url = route.url; + return function () { + var handlers = []; + for (var _i = 0; _i < arguments.length; _i++) { + handlers[_i] = arguments[_i]; + } + return expressRouter.route(url)[route.method](validationMiddleware, handlers); + }; +}; +var createExpressSharedRouter = function (sharedRoutes, expressRouter, options) { + var expressSharedRouter = (0, __1.keys)(sharedRoutes).reduce(function (acc, routeName) { + var _a; + var route = sharedRoutes[routeName]; + return __assign(__assign({}, acc), (_a = {}, _a[routeName] = assignHandlersToExpressRouter(expressRouter, route, options), _a)); + }, {}); + return { + expressSharedRouter: expressSharedRouter, + }; +}; +exports.createExpressSharedRouter = createExpressSharedRouter; +//# sourceMappingURL=createExpressSharedRouter.js.map \ No newline at end of file diff --git a/express/createExpressSharedRouter.js.map b/express/createExpressSharedRouter.js.map new file mode 100644 index 0000000..514e10b --- /dev/null +++ b/express/createExpressSharedRouter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createExpressSharedRouter.js","sourceRoot":"","sources":["../src/express/createExpressSharedRouter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA,wBAA0B;AAO1B,IAAM,wBAAwB,GAC5B,UAAC,KAAyB,EAAE,OAAmC;IAC/D,OAAA,UAAC,GAAG,EAAE,GAAG,EAAE,IAAI;QACb,IAAI;YACF,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE;gBAClC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAQ,CAAC;gBAC1D,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAQ,CAAC;gBAC5D,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,sGAAsG;aAC/I;YACD,IAAI,EAAE,CAAC;SACR;QAAC,OAAO,CAAC,EAAE;YACV,IAAM,KAAK,GAAG,CAAa,CAAC;YAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAC,EAAiB;oBAAf,OAAO,aAAA,EAAE,IAAI,UAAA;gBAAO,OAAA,UAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAM,OAAO,CAAE;YAAhC,CAAgC,CAAC,CAAC,CAAC;SACrF;IACH,CAAC;AAbD,CAaC,CAAC;AAEJ,IAAM,6BAA6B,GAAG,UACpC,aAAqB,EACrB,KAAyB,EACzB,OAAwC;IAAxC,wBAAA,EAAA,YAAwC;IAExC,IAAM,oBAAoB,GAAG,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtE,IAAM,GAAG,GAAG,KAAK,CAAC,GAAa,CAAC;IAEhC,OAAO;QAAC,kBAA6B;aAA7B,UAA6B,EAA7B,qBAA6B,EAA7B,IAA6B;YAA7B,6BAA6B;;QACnC,OAAA,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,QAAQ,CAAC;IAAtE,CAAsE,CAAC;AAC3E,CAAC,CAAC;AAEK,IAAM,yBAAyB,GAAG,UAcvC,YAA0B,EAC1B,aAAqB,EACrB,OAAoC;IAIpC,IAAM,mBAAmB,GAAG,IAAA,QAAI,EAAC,YAAY,CAAC,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,SAAS;;QACnE,IAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACtC,6BACK,GAAG,gBACL,SAAS,IAAG,6BAA6B,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,OACzE;IACJ,CAAC,EAAE,EAAyB,CAAC,CAAC;IAE9B,OAAO;QACL,mBAAmB,qBAAA;KACpB,CAAC;AACJ,CAAC,CAAC;AA/BW,QAAA,yBAAyB,6BA+BpC"} \ No newline at end of file diff --git a/express/index.d.ts b/express/index.d.ts new file mode 100644 index 0000000..8f6a6a7 --- /dev/null +++ b/express/index.d.ts @@ -0,0 +1 @@ +export { createExpressSharedRouter } from "./createExpressSharedRouter"; diff --git a/express/index.js b/express/index.js new file mode 100644 index 0000000..ab63c8d --- /dev/null +++ b/express/index.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createExpressSharedRouter = void 0; +var createExpressSharedRouter_1 = require("./createExpressSharedRouter"); +Object.defineProperty(exports, "createExpressSharedRouter", { enumerable: true, get: function () { return createExpressSharedRouter_1.createExpressSharedRouter; } }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/express/index.js.map b/express/index.js.map new file mode 100644 index 0000000..572dc0c --- /dev/null +++ b/express/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/express/index.ts"],"names":[],"mappings":";;;AAAA,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA"} \ No newline at end of file diff --git a/fetch/createFetchSharedClient.d.ts b/fetch/createFetchSharedClient.d.ts new file mode 100644 index 0000000..58fb6a6 --- /dev/null +++ b/fetch/createFetchSharedClient.d.ts @@ -0,0 +1,7 @@ +import type { RequestInfo, RequestInit, Response } from "node-fetch"; +import type { UnknownSharedRoute } from ".."; +import { HandlerCreator } from ".."; +type Fetch = (url: URL | RequestInfo, init?: RequestInit) => Promise; +export declare const createFetchHandlerCreator: >(fetch: Fetch) => HandlerCreator; +export declare const createFetchSharedClient: >(sharedRouters: SharedRoutes, fetch: Fetch) => import("..").HttpClient; +export {}; diff --git a/fetch/createFetchSharedClient.js b/fetch/createFetchSharedClient.js new file mode 100644 index 0000000..5bc590d --- /dev/null +++ b/fetch/createFetchSharedClient.js @@ -0,0 +1,82 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createFetchSharedClient = exports.createFetchHandlerCreator = void 0; +var __1 = require(".."); +var queryParamsToString_1 = require("./queryParamsToString"); +var createFetchHandlerCreator = function (fetch) { + return function (routeName, routes, replaceParamsInUrl) { + return function (_a) { + var _b = _a === void 0 ? {} : _a, body = _b.body, urlParams = _b.urlParams, queryParams = _b.queryParams, headers = _b.headers; + return __awaiter(void 0, void 0, void 0, function () { + var route, stringQueryParams, res, json; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + route = routes[routeName]; + stringQueryParams = queryParams && Object.keys(queryParams).length > 0 + ? "?" + (0, queryParamsToString_1.queryParamsToString)(queryParams) + : ""; + return [4 /*yield*/, fetch(replaceParamsInUrl(route.url, urlParams) + stringQueryParams, __assign(__assign({ method: route.method }, (body ? { body: JSON.stringify(body) } : {})), { headers: headers !== null && headers !== void 0 ? headers : {} }))]; + case 1: + res = _c.sent(); + return [4 /*yield*/, res.json()]; + case 2: + json = _c.sent(); + return [2 /*return*/, { body: json, status: res.status }]; + } + }); + }); + }; + }; +}; +exports.createFetchHandlerCreator = createFetchHandlerCreator; +var createFetchSharedClient = function (sharedRouters, fetch) { return (0, __1.configureCreateHttpClient)((0, exports.createFetchHandlerCreator)(fetch))(sharedRouters); }; +exports.createFetchSharedClient = createFetchSharedClient; +//# sourceMappingURL=createFetchSharedClient.js.map \ No newline at end of file diff --git a/fetch/createFetchSharedClient.js.map b/fetch/createFetchSharedClient.js.map new file mode 100644 index 0000000..46ff5d2 --- /dev/null +++ b/fetch/createFetchSharedClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createFetchSharedClient.js","sourceRoot":"","sources":["../src/fetch/createFetchSharedClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,wBAA+D;AAC/D,6DAA4D;AAIrD,IAAM,yBAAyB,GACpC,UACE,KAAY;IAEd,OAAA,UAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB;QACtC,OAAA,UAAO,EAA8C;gBAA9C,qBAA4C,EAAE,KAAA,EAA5C,IAAI,UAAA,EAAE,SAAS,eAAA,EAAE,WAAW,iBAAA,EAAE,OAAO,aAAA;;;;;;4BACtC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;4BAE1B,iBAAiB,GACrB,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC;gCAChD,CAAC,CAAC,GAAG,GAAG,IAAA,yCAAmB,EAAC,WAAkB,CAAC;gCAC/C,CAAC,CAAC,EAAE,CAAC;4BAEG,qBAAM,KAAK,CACrB,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,SAAgB,CAAC,GAAG,iBAAiB,sBAEjE,MAAM,EAAE,KAAK,CAAC,MAAM,IACjB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAC/C,OAAO,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAK,EAAU,IAElC,EAAA;;4BAPK,GAAG,GAAG,SAOX;4BACY,qBAAM,GAAG,CAAC,IAAI,EAAE,EAAA;;4BAAvB,IAAI,GAAG,SAAgB;4BAE7B,sBAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAC;;;;SAC3C;IAnBD,CAmBC;AApBD,CAoBC,CAAC;AAxBS,QAAA,yBAAyB,6BAwBlC;AAEG,IAAM,uBAAuB,GAAG,UAGrC,aAA2B,EAC3B,KAAY,IACT,OAAA,IAAA,6BAAyB,EAAC,IAAA,iCAAyB,EAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,EAA1E,CAA0E,CAAC;AALnE,QAAA,uBAAuB,2BAK4C"} \ No newline at end of file diff --git a/fetch/index.d.ts b/fetch/index.d.ts new file mode 100644 index 0000000..efb93bd --- /dev/null +++ b/fetch/index.d.ts @@ -0,0 +1 @@ +export { createFetchSharedClient, createFetchHandlerCreator, } from "./createFetchSharedClient"; diff --git a/fetch/index.js b/fetch/index.js new file mode 100644 index 0000000..6364c67 --- /dev/null +++ b/fetch/index.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createFetchHandlerCreator = exports.createFetchSharedClient = void 0; +var createFetchSharedClient_1 = require("./createFetchSharedClient"); +Object.defineProperty(exports, "createFetchSharedClient", { enumerable: true, get: function () { return createFetchSharedClient_1.createFetchSharedClient; } }); +Object.defineProperty(exports, "createFetchHandlerCreator", { enumerable: true, get: function () { return createFetchSharedClient_1.createFetchHandlerCreator; } }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/fetch/index.js.map b/fetch/index.js.map new file mode 100644 index 0000000..5fe7e9b --- /dev/null +++ b/fetch/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/fetch/index.ts"],"names":[],"mappings":";;;AAAA,qEAGmC;AAFjC,kIAAA,uBAAuB,OAAA;AACvB,oIAAA,yBAAyB,OAAA"} \ No newline at end of file diff --git a/fetch/queryParamsToString.d.ts b/fetch/queryParamsToString.d.ts new file mode 100644 index 0000000..af4d3de --- /dev/null +++ b/fetch/queryParamsToString.d.ts @@ -0,0 +1,8 @@ +type RawQueryParams = { + [key: string]: string | boolean | number; +}; +export type QueryParams = { + [K in keyof T]: T[K]; +}; +export declare const queryParamsToString: >(queryParams: Q) => string; +export {}; diff --git a/fetch/queryParamsToString.js b/fetch/queryParamsToString.js new file mode 100644 index 0000000..d45b588 --- /dev/null +++ b/fetch/queryParamsToString.js @@ -0,0 +1,37 @@ +"use strict"; +var __read = (this && this.__read) || function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.queryParamsToString = void 0; +var queryParamsToString = function (queryParams) { + return Object.keys(queryParams) + .reduce(function (acc, param) { return __spreadArray(__spreadArray([], __read(acc), false), __read((typeof queryParams[param] !== "undefined" + ? ["".concat(param.toString(), "=").concat(encodeURI(queryParams[param].toString()))] + : [])), false); }, []) + .join("&"); +}; +exports.queryParamsToString = queryParamsToString; +//# sourceMappingURL=queryParamsToString.js.map \ No newline at end of file diff --git a/fetch/queryParamsToString.js.map b/fetch/queryParamsToString.js.map new file mode 100644 index 0000000..23cacc0 --- /dev/null +++ b/fetch/queryParamsToString.js.map @@ -0,0 +1 @@ +{"version":3,"file":"queryParamsToString.js","sourceRoot":"","sources":["../src/fetch/queryParamsToString.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAM,mBAAmB,GAAG,UACjC,WAAc;IAEd,OAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAoB;SACzC,MAAM,CACL,UAAC,GAAa,EAAE,KAAK,IAAK,8CACrB,GAAG,kBACH,CAAC,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,WAAW;QAC3C,CAAC,CAAC,CAAC,UAAG,KAAK,CAAC,QAAQ,EAAE,cAAI,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAE,CAAC;QACrE,CAAC,CAAC,EAAE,CAAC,WAJiB,CAKzB,EACD,EAAE,CACH;SACA,IAAI,CAAC,GAAG,CAAC;AAVZ,CAUY,CAAC;AAbF,QAAA,mBAAmB,uBAajB"} \ No newline at end of file diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..abc702d --- /dev/null +++ b/index.d.ts @@ -0,0 +1,7 @@ +export { createCustomSharedClient } from "./createCustomSharedClient"; +export { configureCreateHttpClient } from "./configureCreateHttpClient"; +export type { HandlerCreator, HttpClient, HttpResponse, } from "./configureCreateHttpClient"; +export { defineRoutes, defineRoute, listRoutes } from "./defineRoutes"; +export type { HttpMethod, SharedRoute, UnknownSharedRoute, UnknownSharedRouteWithUrl, } from "./defineRoutes"; +export type { PathParameters, Url } from "./pathParameters"; +export { keys } from "./pathParameters"; diff --git a/index.js b/index.js new file mode 100644 index 0000000..601e71f --- /dev/null +++ b/index.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.keys = exports.listRoutes = exports.defineRoute = exports.defineRoutes = exports.configureCreateHttpClient = exports.createCustomSharedClient = void 0; +var createCustomSharedClient_1 = require("./createCustomSharedClient"); +Object.defineProperty(exports, "createCustomSharedClient", { enumerable: true, get: function () { return createCustomSharedClient_1.createCustomSharedClient; } }); +var configureCreateHttpClient_1 = require("./configureCreateHttpClient"); +Object.defineProperty(exports, "configureCreateHttpClient", { enumerable: true, get: function () { return configureCreateHttpClient_1.configureCreateHttpClient; } }); +var defineRoutes_1 = require("./defineRoutes"); +Object.defineProperty(exports, "defineRoutes", { enumerable: true, get: function () { return defineRoutes_1.defineRoutes; } }); +Object.defineProperty(exports, "defineRoute", { enumerable: true, get: function () { return defineRoutes_1.defineRoute; } }); +Object.defineProperty(exports, "listRoutes", { enumerable: true, get: function () { return defineRoutes_1.listRoutes; } }); +var pathParameters_1 = require("./pathParameters"); +Object.defineProperty(exports, "keys", { enumerable: true, get: function () { return pathParameters_1.keys; } }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/index.js.map b/index.js.map new file mode 100644 index 0000000..98e7fc4 --- /dev/null +++ b/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":";;;AAAA,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA;AAMlC,+CAAuE;AAA9D,4GAAA,YAAY,OAAA;AAAE,2GAAA,WAAW,OAAA;AAAE,0GAAA,UAAU,OAAA;AAQ9C,mDAAwC;AAA/B,sGAAA,IAAI,OAAA"} \ No newline at end of file diff --git a/openapi/createOpenApiGenerator.d.ts b/openapi/createOpenApiGenerator.d.ts new file mode 100644 index 0000000..d0d93bb --- /dev/null +++ b/openapi/createOpenApiGenerator.d.ts @@ -0,0 +1,27 @@ +import { OpenAPIV3 as OpenAPI } from "openapi-types"; +import { UnknownSharedRoute } from ".."; +import { z } from "zod"; +type TypedTag = { + name: T; +}; +type CreateOpenApiGenerator = , TagName extends string>(sharedRoutes: SharedRoutes, openApiRootDoc: Omit & { + tags?: TypedTag[]; +}) => (extraDataByRoute: Partial<{ + [R in keyof SharedRoutes]: Omit & { + tags?: TagName[]; + extraDocs?: { + body?: OpenAPI.BaseSchemaObject & { + properties?: Partial, OpenAPI.BaseSchemaObject>>; + }; + queryParams?: Partial, Partial>>; + headerParams?: Partial, Partial>>; + responseBody?: OpenAPI.BaseSchemaObject & { + properties?: Partial, OpenAPI.BaseSchemaObject>>; + }; + successStatusCode?: number; + responses?: OpenAPI.ResponsesObject; + }; + }; +}>) => OpenAPI.Document; +export declare const createOpenApiGenerator: CreateOpenApiGenerator; +export {}; diff --git a/openapi/createOpenApiGenerator.js b/openapi/createOpenApiGenerator.js new file mode 100644 index 0000000..9de7383 --- /dev/null +++ b/openapi/createOpenApiGenerator.js @@ -0,0 +1,135 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +var __read = (this && this.__read) || function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createOpenApiGenerator = void 0; +var __1 = require(".."); +var zod_to_json_schema_1 = require("zod-to-json-schema"); +var createOpenApiGenerator = function (sharedRoutes, openApiRootDoc) { return function (extraDataByRoute) { return (__assign(__assign({}, openApiRootDoc), { paths: (0, __1.keys)(sharedRoutes).reduce(function (acc, routeName) { + var _a, _b, _c; + var _d, _e; + var route = sharedRoutes[routeName]; + var _f = (_d = extraDataByRoute[routeName]) !== null && _d !== void 0 ? _d : {}, extraDocs = _f.extraDocs, extraDataForRoute = __rest(_f, ["extraDocs"]); + var responseSchema = zodToOpenApi(route.responseBodySchema); + var responseSchemaType = responseSchema.type; + var _g = extractFromUrl(route.url), formattedUrl = _g.formattedUrl, pathParams = _g.pathParams; + var parameters = __spreadArray(__spreadArray(__spreadArray([], __read((pathParams.length > 0 ? pathParams : [])), false), __read((!isShapeObjectEmpty(route.queryParamsSchema) + ? zodObjectToParameters(route.queryParamsSchema, "query", extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.queryParams) + : [])), false), __read((!isShapeObjectEmpty(route.headersSchema) + ? zodObjectToParameters(route.headersSchema, "header", extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.headerParams) + : [])), false); + return __assign(__assign({}, acc), (_a = {}, _a[formattedUrl] = __assign(__assign({}, acc[formattedUrl]), (_b = {}, _b[route.method] = __assign(__assign(__assign(__assign({}, extraDataForRoute), (parameters.length > 0 && { + parameters: parameters, + })), (!isShapeObjectEmpty(route.requestBodySchema) && { + requestBody: { + required: true, + content: { + "application/json": { + schema: __assign(__assign({}, extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.body), zodToOpenApi(route.requestBodySchema)), + }, + }, + }, + })), { responses: __assign((_c = {}, _c[(_e = extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.successStatusCode) !== null && _e !== void 0 ? _e : 200] = __assign(__assign({ description: responseSchemaType !== undefined + ? "Success" + : "Success, with void response" }, (responseSchemaType !== undefined && { + content: { + "application/json": { + schema: responseSchema, + }, + }, + })), extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.responseBody), _c), extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.responses) }), _b)), _a)); + }, {}) })); }; }; +exports.createOpenApiGenerator = createOpenApiGenerator; +var extractFromUrl = function (url) { + var pathParams = []; + var formattedUrl = url.replace(/:(.*?)(\/|$)/g, function (_match, group1, group2) { + var _a; + pathParams.push({ + name: group1, + required: true, + schema: { type: "string" }, + in: "path", + }); + return (_a = "{".concat(group1, "}") + group2) !== null && _a !== void 0 ? _a : ""; + }); + return { + formattedUrl: formattedUrl, + pathParams: pathParams, + }; +}; +var zodToOpenApi = function (schema) { + var _a = (0, zod_to_json_schema_1.zodToJsonSchema)(schema), $schema = _a.$schema, rest = __rest(_a, ["$schema"]); + return rest; +}; +var isShapeObjectEmpty = function (schema) { + var typeName = getTypeName(schema); + if (typeName === "ZodObject") { + var shape = getShape(schema); + return Object.keys(shape).length === 0; + } + return typeName === undefined; +}; +var zodObjectToParameters = function (schema, paramKind, extraDocumentation) { + if (extraDocumentation === void 0) { extraDocumentation = {}; } + var shape = getShape(schema); + return Object.keys(shape).reduce(function (acc, paramName) { + var paramSchema = shape[paramName]; + var extraDoc = extraDocumentation[paramName]; + var initialTypeName = getTypeName(paramSchema); + var required = initialTypeName !== "ZodOptional"; + var schema = zodToOpenApi(required ? paramSchema : paramSchema._def.innerType); + return __spreadArray(__spreadArray([], __read(acc), false), [ + __assign(__assign({}, extraDoc), { in: paramKind, name: paramName, required: required, schema: schema }), + ], false); + }, []); +}; +var getTypeName = function (schema) { + return schema._def.typeName; +}; +var getShape = function (schema) { return schema._def.shape(); }; +//# sourceMappingURL=createOpenApiGenerator.js.map \ No newline at end of file diff --git a/openapi/createOpenApiGenerator.js.map b/openapi/createOpenApiGenerator.js.map new file mode 100644 index 0000000..d918990 --- /dev/null +++ b/openapi/createOpenApiGenerator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createOpenApiGenerator.js","sourceRoot":"","sources":["../src/openapi/createOpenApiGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,wBAA8C;AAG9C,yDAAqD;AA0D9C,IAAM,sBAAsB,GACjC,UAAC,YAAY,EAAE,cAAc,IAAK,OAAA,UAAC,gBAAgB,IAAK,OAAA,uBACnD,cAAc,KACjB,KAAK,EAAE,IAAA,QAAI,EAAC,YAAY,CAAC,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,SAAS;;;QAC9C,IAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACtC,IAAM,KAAsC,MAAA,gBAAgB,CAAC,SAAS,CAAC,mCAAI,EAAE,EAArE,SAAS,eAAA,EAAK,iBAAiB,cAAjC,aAAmC,CAAoC,CAAC;QAC9E,IAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC9D,IAAM,kBAAkB,GAGP,cAAsB,CAAC,IAAI,CAAC;QAEvC,IAAA,KAA+B,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,EAAtD,YAAY,kBAAA,EAAE,UAAU,gBAA8B,CAAC;QAE/D,IAAM,UAAU,wDACX,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,kBACzC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAC9C,CAAC,CAAC,qBAAqB,CACnB,KAAK,CAAC,iBAAiB,EACvB,OAAO,EACP,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,CACvB;YACH,CAAC,CAAC,EAAE,CAAC,kBACJ,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,aAAa,CAAC;YAC1C,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,YAAY,CAAC;YAC/E,CAAC,CAAC,EAAE,CAAC,SACR,CAAC;QAEF,6BACK,GAAG,gBACL,YAAY,0BACR,GAAG,CAAC,YAAY,CAAC,gBACnB,KAAK,CAAC,MAAM,4CACR,iBAAiB,GACjB,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI;YAC3B,UAAU,YAAA;SACX,CAAC,GAEC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI;YAClD,WAAW,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE;oBACP,kBAAkB,EAAE;wBAClB,MAAM,wBACD,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,GACf,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CACzC;qBACF;iBACF;aACF;SACF,CAAC,KAEF,SAAS,wBACN,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,iBAAiB,mCAAI,GAAG,wBAClC,WAAW,EACT,kBAAkB,KAAK,SAAS;oBAC9B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,6BAA6B,IAChC,CAAC,kBAAkB,KAAK,SAAS,IAAI;gBACtC,OAAO,EAAE;oBACP,kBAAkB,EAAE;wBAClB,MAAM,EAAE,cAAc;qBACvB;iBACF;aACF,CAAC,GACC,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,YAAY,QAEzB,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,iBAI7B;IACJ,CAAC,EAAE,EAAS,CAAC,IACb,EAxEsD,CAwEtD,EAxEgC,CAwEhC,CAAC;AAzEQ,QAAA,sBAAsB,0BAyE9B;AAWL,IAAM,cAAc,GAAG,UAAC,GAAW;IACjC,IAAM,UAAU,GAAY,EAAE,CAAC;IAE/B,IAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,UAAC,MAAM,EAAE,MAAM,EAAE,MAAM;;QACvE,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,EAAE,EAAE,MAAM;SACX,CAAC,CAAC;QACH,OAAO,MAAA,WAAI,MAAM,MAAG,GAAG,MAAM,mCAAI,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,YAAY,cAAA;QACZ,UAAU,YAAA;KACX,CAAC;AACJ,CAAC,CAAC;AAEF,IAAM,YAAY,GAAG,UAAC,MAA6C;IACjE,IAAM,KAAuB,IAAA,oCAAe,EAAC,MAAM,CAAC,EAA5C,OAAO,aAAA,EAAK,IAAI,cAAlB,WAAoB,CAA0B,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,IAAM,kBAAkB,GAAG,UAAI,MAAmB;IAChD,IAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,QAAQ,KAAK,WAAW,EAAE;QAC5B,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;KACxC;IAED,OAAO,QAAQ,KAAK,SAAS,CAAC;AAChC,CAAC,CAAC;AAEF,IAAM,qBAAqB,GAAG,UAC5B,MAAmB,EACnB,SAAoB,EACpB,kBAAmF;IAAnF,mCAAA,EAAA,uBAAmF;IAEnF,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE/B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,SAAS;QAC9C,IAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,IAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAoB,CAAC,CAAC;QAC1D,IAAM,eAAe,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACjD,IAAM,QAAQ,GAAG,eAAe,KAAK,aAAa,CAAC;QAEnD,IAAM,MAAM,GAAG,YAAY,CACzB,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAC7C,CAAC;QAET,8CACK,GAAG;kCAED,QAAQ,KACX,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,SAAS,EACf,QAAQ,UAAA,EACR,MAAM,QAAA;kBAER;IACJ,CAAC,EAAE,EAAa,CAAC,CAAC;AACpB,CAAC,CAAC;AAEF,IAAM,WAAW,GAAG,UAAI,MAAmB;IACzC,OAAC,MAAM,CAAC,IAAY,CAAC,QAAQ;AAA7B,CAA6B,CAAC;AAEhC,IAAM,QAAQ,GAAG,UAAI,MAAmB,IAAkB,OAAC,MAAM,CAAC,IAAY,CAAC,KAAK,EAAE,EAA5B,CAA4B,CAAC"} \ No newline at end of file diff --git a/openapi/index.d.ts b/openapi/index.d.ts new file mode 100644 index 0000000..015624c --- /dev/null +++ b/openapi/index.d.ts @@ -0,0 +1 @@ +export { createOpenApiGenerator } from "./createOpenApiGenerator"; diff --git a/openapi/index.js b/openapi/index.js new file mode 100644 index 0000000..e86a5ba --- /dev/null +++ b/openapi/index.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createOpenApiGenerator = void 0; +var createOpenApiGenerator_1 = require("./createOpenApiGenerator"); +Object.defineProperty(exports, "createOpenApiGenerator", { enumerable: true, get: function () { return createOpenApiGenerator_1.createOpenApiGenerator; } }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/openapi/index.js.map b/openapi/index.js.map new file mode 100644 index 0000000..07ca7a2 --- /dev/null +++ b/openapi/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/openapi/index.ts"],"names":[],"mappings":";;;AAAA,mEAAkE;AAAzD,gIAAA,sBAAsB,OAAA"} \ No newline at end of file diff --git a/package.json b/package.json index eb59315..48f1966 100755 --- a/package.json +++ b/package.json @@ -6,22 +6,6 @@ "type": "git", "url": "git@github.com:JeromeBu/shared-routes.git" }, - "scripts": { - "typecheck": "tsc --noEmit && tsc --noEmit -p test", - "build": "yarn build:cjs && yarn build:esm && yarn build:deno", - "watch": "tsc -w & tsc -p tsconfig.esm.json -w", - "build:cjs": "tsc", - "build:esm": "rm -rf dist/esm && tsc -p tsconfig.esm.json && js2mjs dist/esm", - "build:deno": "denoify", - "test": "vitest", - "lint:check": "eslint . --ext .ts,.tsx", - "lint": "npm run lint:check -- --fix", - "_format": "prettier '**/*.{ts,tsx,json,md}'", - "format": "npm run _format -- --write", - "format:check": "npm run _format -- --list-different", - "link-in-app": "ts-node --skipProject scripts/link-in-app.ts", - "link-in-demo": "yarn link-in-app shared-routes-demo" - }, "lint-staged": { "*.{ts,tsx}": [ "eslint --fix" @@ -38,9 +22,119 @@ "author": "u/jeromebu", "license": "MIT", "files": [ - "src/", - "dist/", - "!dist/tsconfig.tsbuildinfo" + "src/axios/createAxiosSharedClient.ts", + "src/axios/index.ts", + "src/configureCreateHttpClient.ts", + "src/createCustomSharedClient.ts", + "src/defineRoutes.ts", + "src/express/createExpressSharedRouter.ts", + "src/express/index.ts", + "src/fetch/createFetchSharedClient.ts", + "src/fetch/index.ts", + "src/fetch/queryParamsToString.ts", + "src/index.ts", + "src/openapi/createOpenApiGenerator.ts", + "src/openapi/index.ts", + "src/pathParameters.ts", + "src/supertest/createSupertestSharedClient.ts", + "src/supertest/index.ts", + "axios/createAxiosSharedClient.d.ts", + "axios/createAxiosSharedClient.js", + "axios/createAxiosSharedClient.js.map", + "axios/index.d.ts", + "axios/index.js", + "axios/index.js.map", + "configureCreateHttpClient.d.ts", + "configureCreateHttpClient.js", + "configureCreateHttpClient.js.map", + "createCustomSharedClient.d.ts", + "createCustomSharedClient.js", + "createCustomSharedClient.js.map", + "defineRoutes.d.ts", + "defineRoutes.js", + "defineRoutes.js.map", + "esm/axios/createAxiosSharedClient.d.ts", + "esm/axios/createAxiosSharedClient.mjs", + "esm/axios/createAxiosSharedClient.mjs.map", + "esm/axios/index.d.ts", + "esm/axios/index.mjs", + "esm/axios/index.mjs.map", + "esm/configureCreateHttpClient.d.ts", + "esm/configureCreateHttpClient.mjs", + "esm/configureCreateHttpClient.mjs.map", + "esm/createCustomSharedClient.d.ts", + "esm/createCustomSharedClient.mjs", + "esm/createCustomSharedClient.mjs.map", + "esm/defineRoutes.d.ts", + "esm/defineRoutes.mjs", + "esm/defineRoutes.mjs.map", + "esm/express/createExpressSharedRouter.d.ts", + "esm/express/createExpressSharedRouter.mjs", + "esm/express/createExpressSharedRouter.mjs.map", + "esm/express/index.d.ts", + "esm/express/index.mjs", + "esm/express/index.mjs.map", + "esm/fetch/createFetchSharedClient.d.ts", + "esm/fetch/createFetchSharedClient.mjs", + "esm/fetch/createFetchSharedClient.mjs.map", + "esm/fetch/index.d.ts", + "esm/fetch/index.mjs", + "esm/fetch/index.mjs.map", + "esm/fetch/queryParamsToString.d.ts", + "esm/fetch/queryParamsToString.mjs", + "esm/fetch/queryParamsToString.mjs.map", + "esm/index.d.ts", + "esm/index.mjs", + "esm/index.mjs.map", + "esm/openapi/createOpenApiGenerator.d.ts", + "esm/openapi/createOpenApiGenerator.mjs", + "esm/openapi/createOpenApiGenerator.mjs.map", + "esm/openapi/index.d.ts", + "esm/openapi/index.mjs", + "esm/openapi/index.mjs.map", + "esm/pathParameters.d.ts", + "esm/pathParameters.mjs", + "esm/pathParameters.mjs.map", + "esm/supertest/createSupertestSharedClient.d.ts", + "esm/supertest/createSupertestSharedClient.mjs", + "esm/supertest/createSupertestSharedClient.mjs.map", + "esm/supertest/index.d.ts", + "esm/supertest/index.mjs", + "esm/supertest/index.mjs.map", + "esm/tsconfig.esm.tsbuildinfo", + "express/createExpressSharedRouter.d.ts", + "express/createExpressSharedRouter.js", + "express/createExpressSharedRouter.js.map", + "express/index.d.ts", + "express/index.js", + "express/index.js.map", + "fetch/createFetchSharedClient.d.ts", + "fetch/createFetchSharedClient.js", + "fetch/createFetchSharedClient.js.map", + "fetch/index.d.ts", + "fetch/index.js", + "fetch/index.js.map", + "fetch/queryParamsToString.d.ts", + "fetch/queryParamsToString.js", + "fetch/queryParamsToString.js.map", + "index.d.ts", + "index.js", + "index.js.map", + "openapi/createOpenApiGenerator.d.ts", + "openapi/createOpenApiGenerator.js", + "openapi/createOpenApiGenerator.js.map", + "openapi/index.d.ts", + "openapi/index.js", + "openapi/index.js.map", + "pathParameters.d.ts", + "pathParameters.js", + "pathParameters.js.map", + "supertest/createSupertestSharedClient.d.ts", + "supertest/createSupertestSharedClient.js", + "supertest/createSupertestSharedClient.js.map", + "supertest/index.d.ts", + "supertest/index.js", + "supertest/index.js.map" ], "keywords": [], "homepage": "https://github.com/JeromeBu/shared-routes", @@ -73,39 +167,39 @@ "zod-to-json-schema": "^3.21.0" }, "dependencies": {}, - "main": "dist/index.js", - "types": "dist/index.d.ts", - "module": "dist/esm/index.mjs", + "main": "index.js", + "types": "index.d.ts", + "module": "esm/index.mjs", "exports": { ".": { - "require": "./dist/index.js", - "import": "./dist/esm/index.mjs", - "types": "./dist/index.d.ts" + "require": "./index.js", + "import": "./esm/index.mjs", + "types": "./index.d.ts" }, "./axios": { - "require": "./dist/axios/index.js", - "import": "./dist/esm/axios/index.mjs", - "types": "./dist/axios/index.d.ts" + "require": "./axios/index.js", + "import": "./esm/axios/index.mjs", + "types": "./axios/index.d.ts" }, "./fetch": { - "require": "./dist/fetch/index.js", - "import": "./dist/esm/fetch/index.mjs", - "types": "./dist/fetch/index.d.ts" + "require": "./fetch/index.js", + "import": "./esm/fetch/index.mjs", + "types": "./fetch/index.d.ts" }, "./express": { - "require": "./dist/express/index.js", - "import": "./dist/esm/express/index.mjs", - "types": "./dist/express/index.d.ts" + "require": "./express/index.js", + "import": "./esm/express/index.mjs", + "types": "./express/index.d.ts" }, "./supertest": { - "require": "./dist/supertest/index.js", - "import": "./dist/esm/supertest/index.mjs", - "types": "./dist/supertest/index.d.ts" + "require": "./supertest/index.js", + "import": "./esm/supertest/index.mjs", + "types": "./supertest/index.d.ts" }, "./openapi": { - "require": "./dist/openapi/index.js", - "import": "./dist/esm/openapi/index.mjs", - "types": "./dist/openapi/index.d.ts" + "require": "./openapi/index.js", + "import": "./esm/openapi/index.mjs", + "types": "./openapi/index.d.ts" } } } diff --git a/pathParameters.d.ts b/pathParameters.d.ts new file mode 100644 index 0000000..c40384b --- /dev/null +++ b/pathParameters.d.ts @@ -0,0 +1,19 @@ +type Http = "http://" | "https://"; +type AbsoluteUrl = `${Http}${string}`; +type RelativeUrl = `/${string}`; +export type Url = AbsoluteUrl | RelativeUrl; +interface ParamsDictionary { + [key: string]: string; +} +type RemoveDomain = S extends RelativeUrl ? S : S extends `${Http}${string}${"/"}${infer P}` ? `/${P}` : "/"; +type RemoveTail = S extends `${infer P}${Tail}` ? P : S; +type GetRouteParameter = RemoveTail, `-${string}`>, `.${string}`>; +export type PathParameters = string extends Route ? ParamsDictionary : RemoveDomain extends `${string}:${infer Rest}` ? (GetRouteParameter extends never ? ParamsDictionary : GetRouteParameter extends `${infer ParamName}?` ? { + [P in ParamName]?: string; +} : { + [P in GetRouteParameter]: string; +}) & (Rest extends `${GetRouteParameter}${infer Next}` ? PathParameters : unknown) : {}; +export type ReplaceParamsInUrl = (path: U, params: PathParameters) => Url; +export declare const replaceParamsInUrl: ReplaceParamsInUrl; +export declare const keys: >(obj: Obj) => (keyof Obj)[]; +export {}; diff --git a/pathParameters.js b/pathParameters.js new file mode 100644 index 0000000..653d9ab --- /dev/null +++ b/pathParameters.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.keys = exports.replaceParamsInUrl = void 0; +var replaceParamsInUrl = function (url, params) { + if (params === void 0) { params = {}; } + var paramNames = (0, exports.keys)(params); + if (paramNames.length === 0) + return url; + return paramNames.reduce(function (acc, paramName) { return acc.replace(":".concat(paramName.toString()), params[paramName]); }, url); +}; +exports.replaceParamsInUrl = replaceParamsInUrl; +var keys = function (obj) { + return Object.keys(obj); +}; +exports.keys = keys; +//# sourceMappingURL=pathParameters.js.map \ No newline at end of file diff --git a/pathParameters.js.map b/pathParameters.js.map new file mode 100644 index 0000000..8a59e2d --- /dev/null +++ b/pathParameters.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pathParameters.js","sourceRoot":"","sources":["src/pathParameters.ts"],"names":[],"mappings":";;;AA+CO,IAAM,kBAAkB,GAAuB,UACpD,GAAG,EACH,MAAyC;IAAzC,uBAAA,EAAA,SAAS,EAAgC;IAEzC,IAAM,UAAU,GAAG,IAAA,YAAI,EAAC,MAAM,CAAC,CAAC;IAChC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACxC,OAAO,UAAU,CAAC,MAAM,CACtB,UAAC,GAAG,EAAE,SAAS,IAAK,OAAA,GAAG,CAAC,OAAO,CAAC,WAAI,SAAS,CAAC,QAAQ,EAAE,CAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAA1D,CAA0D,EAC9E,GAAU,CACX,CAAC;AACJ,CAAC,CAAC;AAVW,QAAA,kBAAkB,sBAU7B;AAEK,IAAM,IAAI,GAAG,UAAsC,GAAQ;IAChE,OAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAkB;AAAjC,CAAiC,CAAC;AADvB,QAAA,IAAI,QACmB"} \ No newline at end of file diff --git a/supertest/createSupertestSharedClient.d.ts b/supertest/createSupertestSharedClient.d.ts new file mode 100644 index 0000000..b77e0ad --- /dev/null +++ b/supertest/createSupertestSharedClient.d.ts @@ -0,0 +1,5 @@ +import type { UnknownSharedRoute } from ".."; +import { HandlerCreator } from ".."; +import type { SuperTest, Test } from "supertest"; +export declare const createSupertestHandlerCreator: (supertestRequest: SuperTest) => HandlerCreator; +export declare const createSupertestSharedClient: >(sharedRoutes: SharedRoutes, supertestRequest: SuperTest) => import("..").HttpClient; diff --git a/supertest/createSupertestSharedClient.js b/supertest/createSupertestSharedClient.js new file mode 100644 index 0000000..5225cb0 --- /dev/null +++ b/supertest/createSupertestSharedClient.js @@ -0,0 +1,63 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createSupertestSharedClient = exports.createSupertestHandlerCreator = void 0; +var __1 = require(".."); +var supertestRequestToCorrectHttpMethod = function (supertestRequest, method) { return supertestRequest[method]; }; +var createSupertestHandlerCreator = function (supertestRequest) { + return function (routeName, routes, replaceParamsInUrl) { + var route = routes[routeName]; + return function (_a) { + var _b = _a === void 0 ? {} : _a, headers = _b.headers, body = _b.body, queryParams = _b.queryParams, urlParams = _b.urlParams; + return __awaiter(void 0, void 0, void 0, function () { + return __generator(this, function (_c) { + return [2 /*return*/, supertestRequestToCorrectHttpMethod(supertestRequest, route.method)(replaceParamsInUrl(route.url, urlParams)) + .send(body) + .set(headers !== null && headers !== void 0 ? headers : {}) + .query(queryParams)]; + }); + }); + }; + }; +}; +exports.createSupertestHandlerCreator = createSupertestHandlerCreator; +var createSupertestSharedClient = function (sharedRoutes, supertestRequest) { + return (0, __1.configureCreateHttpClient)((0, exports.createSupertestHandlerCreator)(supertestRequest))(sharedRoutes); +}; +exports.createSupertestSharedClient = createSupertestSharedClient; +//# sourceMappingURL=createSupertestSharedClient.js.map \ No newline at end of file diff --git a/supertest/createSupertestSharedClient.js.map b/supertest/createSupertestSharedClient.js.map new file mode 100644 index 0000000..29033df --- /dev/null +++ b/supertest/createSupertestSharedClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createSupertestSharedClient.js","sourceRoot":"","sources":["../src/supertest/createSupertestSharedClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,wBAA+D;AAI/D,IAAM,mCAAmC,GAAG,UAC1C,gBAAiC,EACjC,MAAkB,IACO,OAAA,gBAAgB,CAAC,MAAM,CAAC,EAAxB,CAAwB,CAAC;AAE7C,IAAM,6BAA6B,GACxC,UAAC,gBAAiC;IAClC,OAAA,UAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB;QACpC,IAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,UAAO,EAA8C;gBAA9C,qBAA4C,EAAE,KAAA,EAA5C,OAAO,aAAA,EAAE,IAAI,UAAA,EAAE,WAAW,iBAAA,EAAE,SAAS,eAAA;;;oBACnD,sBAAA,mCAAmC,CACjC,gBAAgB,EAChB,KAAK,CAAC,MAAM,CACb,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;6BACxC,IAAI,CAAC,IAAI,CAAC;6BACV,GAAG,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;6BAClB,KAAK,CAAC,WAAW,CAAC,EAAA;;;SAAA,CAAC;IAC1B,CAAC;AAVD,CAUC,CAAC;AAZS,QAAA,6BAA6B,iCAYtC;AAEG,IAAM,2BAA2B,GAAG,UAGzC,YAA0B,EAC1B,gBAAiC;IAEjC,OAAA,IAAA,6BAAyB,EAAC,IAAA,qCAA6B,EAAC,gBAAgB,CAAC,CAAC,CACxE,YAAY,CACb;AAFD,CAEC,CAAC;AARS,QAAA,2BAA2B,+BAQpC"} \ No newline at end of file diff --git a/supertest/index.d.ts b/supertest/index.d.ts new file mode 100644 index 0000000..8854d2a --- /dev/null +++ b/supertest/index.d.ts @@ -0,0 +1 @@ +export { createSupertestSharedClient } from "./createSupertestSharedClient"; diff --git a/supertest/index.js b/supertest/index.js new file mode 100644 index 0000000..5ab31f3 --- /dev/null +++ b/supertest/index.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createSupertestSharedClient = void 0; +var createSupertestSharedClient_1 = require("./createSupertestSharedClient"); +Object.defineProperty(exports, "createSupertestSharedClient", { enumerable: true, get: function () { return createSupertestSharedClient_1.createSupertestSharedClient; } }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/supertest/index.js.map b/supertest/index.js.map new file mode 100644 index 0000000..221632d --- /dev/null +++ b/supertest/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/supertest/index.ts"],"names":[],"mappings":";;;AAAA,6EAA4E;AAAnE,0IAAA,2BAA2B,OAAA"} \ No newline at end of file diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo new file mode 100644 index 0000000..2f2a581 --- /dev/null +++ b/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.esnext.intl.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/zod/lib/helpers/typeAliases.d.ts","../node_modules/zod/lib/helpers/util.d.ts","../node_modules/zod/lib/ZodError.d.ts","../node_modules/zod/lib/locales/en.d.ts","../node_modules/zod/lib/errors.d.ts","../node_modules/zod/lib/helpers/parseUtil.d.ts","../node_modules/zod/lib/helpers/enumUtil.d.ts","../node_modules/zod/lib/helpers/errorUtil.d.ts","../node_modules/zod/lib/helpers/partialUtil.d.ts","../node_modules/zod/lib/types.d.ts","../node_modules/zod/lib/external.d.ts","../node_modules/zod/lib/index.d.ts","../node_modules/zod/index.d.ts","../src/pathParameters.ts","../src/defineRoutes.ts","../src/configureCreateHttpClient.ts","../src/createCustomSharedClient.ts","../src/index.ts","../node_modules/axios/index.d.ts","../src/axios/createAxiosSharedClient.ts","../src/axios/index.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/globals.global.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/send/node_modules/@types/mime/index.d.ts","../node_modules/@types/send/index.d.ts","../node_modules/@types/range-parser/index.d.ts","../node_modules/@types/qs/index.d.ts","../node_modules/@types/express-serve-static-core/index.d.ts","../node_modules/@types/mime/Mime.d.ts","../node_modules/@types/mime/index.d.ts","../node_modules/@types/serve-static/index.d.ts","../node_modules/@types/connect/index.d.ts","../node_modules/@types/body-parser/index.d.ts","../node_modules/@types/express/index.d.ts","../src/express/createExpressSharedRouter.ts","../src/express/index.ts","../node_modules/formdata-polyfill/esm.min.d.ts","../node_modules/fetch-blob/file.d.ts","../node_modules/fetch-blob/index.d.ts","../node_modules/fetch-blob/from.d.ts","../node_modules/node-fetch/@types/index.d.ts","../src/fetch/queryParamsToString.ts","../src/fetch/createFetchSharedClient.ts","../src/fetch/index.ts","../node_modules/openapi-types/dist/index.d.ts","../node_modules/zod-to-json-schema/src/Options.d.ts","../node_modules/zod-to-json-schema/src/parsers/any.d.ts","../node_modules/zod-to-json-schema/src/Refs.d.ts","../node_modules/zod-to-json-schema/src/errorMessages.d.ts","../node_modules/zod-to-json-schema/src/parsers/array.d.ts","../node_modules/zod-to-json-schema/src/parsers/bigint.d.ts","../node_modules/zod-to-json-schema/src/parsers/boolean.d.ts","../node_modules/zod-to-json-schema/src/parsers/date.d.ts","../node_modules/zod-to-json-schema/src/parsers/enum.d.ts","../node_modules/zod-to-json-schema/src/parsers/intersection.d.ts","../node_modules/zod-to-json-schema/src/parsers/literal.d.ts","../node_modules/zod-to-json-schema/src/parsers/map.d.ts","../node_modules/zod-to-json-schema/src/parsers/nativeEnum.d.ts","../node_modules/zod-to-json-schema/src/parsers/never.d.ts","../node_modules/zod-to-json-schema/src/parsers/null.d.ts","../node_modules/zod-to-json-schema/src/parsers/nullable.d.ts","../node_modules/zod-to-json-schema/src/parsers/number.d.ts","../node_modules/zod-to-json-schema/src/parsers/object.d.ts","../node_modules/zod-to-json-schema/src/parsers/string.d.ts","../node_modules/zod-to-json-schema/src/parsers/record.d.ts","../node_modules/zod-to-json-schema/src/parsers/set.d.ts","../node_modules/zod-to-json-schema/src/parsers/tuple.d.ts","../node_modules/zod-to-json-schema/src/parsers/undefined.d.ts","../node_modules/zod-to-json-schema/src/parsers/union.d.ts","../node_modules/zod-to-json-schema/src/parsers/unknown.d.ts","../node_modules/zod-to-json-schema/src/parseDef.d.ts","../node_modules/zod-to-json-schema/src/zodToJsonSchema.d.ts","../node_modules/zod-to-json-schema/index.d.ts","../src/openapi/createOpenApiGenerator.ts","../src/openapi/index.ts","../node_modules/@types/cookiejar/index.d.ts","../node_modules/@types/superagent/index.d.ts","../node_modules/@types/supertest/index.d.ts","../src/supertest/createSupertestSharedClient.ts","../src/supertest/index.ts","../node_modules/@types/chai/index.d.ts","../node_modules/@types/chai-subset/index.d.ts","../node_modules/@types/comment-json/index.d.ts","../node_modules/@types/istanbul-lib-coverage/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/parse-json/index.d.ts"],"fileInfos":[{"version":"6a6b471e7e43e15ef6f8fe617a22ce4ecb0e34efa6c3dfcfe7cebd392bcca9d2","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","27147504487dc1159369da4f4da8a26406364624fa9bc3db632f7d94a5bae2c3","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"fcd3ecc9f764f06f4d5c467677f4f117f6abf49dee6716283aa204ff1162498b","affectsGlobalScope":true},{"version":"f296963760430fb65b4e5d91f0ed770a91c6e77455bacf8fa23a1501654ede0e","affectsGlobalScope":true},{"version":"5114a95689b63f96b957e00216bc04baf9e1a1782aa4d8ee7e5e9acbf768e301","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"ab22100fdd0d24cfc2cc59d0a00fc8cf449830d9c4030dc54390a46bd562e929","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"36ae84ccc0633f7c0787bc6108386c8b773e95d3b052d9464a99cd9b8795fbec","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"b7e9f95a7387e3f66be0ed6db43600c49cec33a3900437ce2fd350d9b7cb16f2","affectsGlobalScope":true},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true},{"version":"189c0703923150aa30673fa3de411346d727cc44a11c75d05d7cf9ef095daa22","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"5487b97cfa28b26b4a9ef0770f872bdbebd4c46124858de00f242c3eed7519f4","7a01f546ace66019156e4232a1bee2fabc2f8eabeb052473d926ee1693956265","fb53b1c6a6c799b7e3cc2de3fb5c9a1c04a1c60d4380a37792d84c5f8b33933b","8485b6da53ec35637d072e516631d25dae53984500de70a6989058f24354666f","ebe80346928736532e4a822154eb77f57ef3389dbe2b3ba4e571366a15448ef2","c2cb3c8ff388781258ea9ddbcd8a947f751bddd6886e1d3b3ea09ddaa895df80","f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","98a9cc18f661d28e6bd31c436e1984f3980f35e0f0aa9cf795c54f8ccb667ffe","c76b0c5727302341d0bdfa2cc2cee4b19ff185b554edb6e8543f0661d8487116","19903057d0249e45c579bef2b771c37609e4853a8b88adbb0b6b63f9e1d1f372","f5ef066942e4f0bd98200aa6a6694b831e73200c9b3ade77ad0aa2409e8fe1b1","b9e99cd94f4166a245f5158f7286c05406e2a4c694619bceb7a4f3519d1d768e","5568d7c32e5cf5f35e092649f4e5e168c3114c800b1d7545b7ae5e0415704802",{"version":"be139d52709c57e683b367f8e3118a064130c670cd6814e7e5b927adaf2fbb21","signature":"c7c176a5a8a12c6b3d5b28c95320448f17c7d5438485c53a086dea69ed2e6801"},{"version":"5926ff04adf89aa4c2150c89edc7eab64f1c994744375e980a4721b18dd2aa87","signature":"4194740cc3d0f6cdeb5e7864e013d3525e18cf47a956c5f4751fb31130f4d734"},{"version":"c1b54bfa83d46c863ed16012203437401af66e31f07a8f8772a1f070b52204df","signature":"d154e25161ae14a78d0f690c0689d47af27082a25e07000024c6febb0b512f6b"},{"version":"454671610b0389f294e74f0ffbf4d72c926d9e11da889d359674ae4e3224ef6b","signature":"70aad179112a492efbeed445504038ea12e90db5f6ecf452bd13b606e9263cd9"},{"version":"76c0556d36524e5a16ef84d239fb3992c7cdef0a5535f5f63349917cca1c414c","signature":"c4acec2b887b9279da570a4f056c51a61988231afabbd200590fff738e71e422"},"2808645b990069e5f8b5ff14c9f1e6077eb642583c3f7854012d60757f23c70e",{"version":"eb67e9332d227f5e74141b84947759d3f04573c9430e4f7ef52ad8668ac5e2b2","signature":"9d796126561c18da6556ccc866ea162c0be34dfa82ddbd275080aa2c33402da5"},{"version":"ac0a1002f8b4eddd32b1bbc5a9be001df44e556fbe2463b167b8203c8076962b","signature":"81c36a85d6c190ce4b6d0a2d01ea8c8c6c4ccf4190466597e099d28d39420074"},"7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"ca72190df0eb9b09d4b600821c8c7b6c9747b75a1c700c4d57dc0bb72abc074c","affectsGlobalScope":true},"11e2d554398d2bd460e7d06b2fa5827a297c8acfbe00b4f894a224ac0862857f",{"version":"17a1140b90821c2c8d7064c9fc7598797c385714e6aa88b85e30b1159af8dc9b","affectsGlobalScope":true},"374ca798f244e464346f14301dc2a8b4b111af1a83b49fffef5906c338a1f922","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","dab86d9604fe40854ef3c0a6f9e8948873dc3509213418e5e457f410fd11200f","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","489532ff54b714f0e0939947a1c560e516d3ae93d51d639ab02e907a0e950114","f30bb836526d930a74593f7b0f5c1c46d10856415a8f69e5e2fc3db80371e362","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"816ad2e607a96de5bcac7d437f843f5afd8957f1fa5eefa6bba8e4ed7ca8fd84","affectsGlobalScope":true},"cec36af22f514322f870e81d30675c78df82ae8bf4863f5fd4e4424c040c678d","d903fafe96674bc0b2ac38a5be4a8fc07b14c2548d1cdb165a80ea24c44c0c54","5eec82ac21f84d83586c59a16b9b8502d34505d1393393556682fe7e7fde9ef2","04eb6578a588d6a46f50299b55f30e3a04ef27d0c5a46c57d8fcc211cd530faa","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true},"2c45b35f4850881ab132f80d3cb51e8a359a4d8fafdc5ff2401d260dc27862f4","7c013aa892414a7fdcfd861ae524a668eaa3ede8c7c0acafaf611948122c8d93","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"b3624aed92dab6da8484280d3cb3e2f4130ec3f4ef3f8201c95144ae9e898bb6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","fd93cee2621ff42dabe57b7be402783fd1aa69ece755bcba1e0290547ae60513","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","a15eb098ed86a4135cba05d77e792d6189fa8607a00c9b1b381c0e9550c04ba5",{"version":"970a90f76d4d219ad60819d61f5994514087ba94c985647a3474a5a3d12714ed","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","c4577fb855ca259bdbf3ea663ca73988ce5f84251a92b4aef80a1f4122b6f98e","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"f0900cd5d00fe1263ff41201fb8073dbeb984397e4af3b8002a5c207a30bdc33","affectsGlobalScope":true},{"version":"ff07a9a03c65732ccc59b3c65bc584173da093bd563a6565411c01f5703bd3cb","affectsGlobalScope":true},"06d7c42d256f0ce6afe1b2b6cfbc97ab391f29dadb00dd0ae8e8f23f5bc916c3","ec4bd1b200670fb567920db572d6701ed42a9641d09c4ff6869768c8f81b404c","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"da26af7362f53d122283bc69fed862b9a9fe27e01bc6a69d1d682e0e5a4df3e6","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"ed2a670a77a1b80653c5bde2d813b0ab2e92872cc9b2b611ce11050b95139be6","84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc",{"version":"76e9656e6ab408f2d3baefc6d2aa8969c768e426dd577f4abae4cf0d2fce1cbb","affectsGlobalScope":true},"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84",{"version":"5f569b2d1c9e7be110124184a723b34db4312ce4b54680460037209c13280087","signature":"d0be3ab1af6bb4bf9f7f9a2958456a604f1814fa32f613a34691758e40e4793d"},"fa00eede2b2640bcfec133440377a75fc7d4647affa0aa68d1dad3626ec441db","d782e571cb7d6ec0f0645957ed843d00e3f8577e08cc2940f400c931bc47a8df","9167246623f181441e6116605221268d94e33a1ebd88075e2dc80133c928ae7e","dc1a838d8a514b6de9fbce3bd5e6feb9ccfe56311e9338bb908eb4d0d966ecaf","186f09ed4b1bc1d5a5af5b1d9f42e2d798f776418e82599b3de16423a349d184","d692ae73951775d2448df535ce8bc8abf162dc343911fedda2c37b8de3b20d8e",{"version":"69571e322ffb287ea739ba2a674369b3790974f717e8a47d969f84543cde2da2","signature":"4714df73aa332341fd02da657beb85950e4c60eed5c7520b203e5b52b15ed992"},{"version":"756da88c45539dd4359a1f7785b52caf8c820c519493b169a7335eaf365d5413","signature":"92436d2cdb2bc0d9a630782f1511ed290ebf3b07a4cd57369bb169f1d8651fff"},{"version":"0776b08ea328dfd0ea47ea98c15a55d3c64cedd1912ec0ac1470a583fd969205","signature":"bd585a2f8f072b16b0b061716702219c6faed04778f3fa447ec65c9162d60b00"},"cc3e30832aff12a575919d59eb3d680ca7cc999e1041bb0fc489dbe0276b066b","dd804b99db086f2f0e24bb373d2a1e9d9177f32f5c8f2c7b37c99accdf835e0c","e70f03e85bc8a2385e538a2db0c9ee532f6a9b346872aa809f173a26df7caee1","264808a845721a9f3df608a5e7ed12537f976d1645f20cbb448b106068f82332","8d484f5d6fd888f53e7cc21957ec2370461c73d230efb3467b9fb1822901535b","df73b0c2aa1ffa4a9aebd72baee78edf77ce5023d4476c04eadadbcdeb2964dc","065cbd81319d18ffc3b81100fbc60da26daf7fa090b26edf7dd3cc8c1a6cfbc5","771c436459c7a2ac2604ffa55a3abd76ffe8cae6aeae700d749f0fa5e8869ff6","7d4a2dae1a1ee3b99563747fa815076956911a833954deed5a4aa2d9207df167","45f6cd001ba50294b3e9a43800b22e0798cdcdc20c214cafd55d4d7d1914c331","b81b383239d2f4f14515331d7017febcb23786d90c5acc9688a891010fe25d4c","c60f24b4fd55376e4e095914d8f5345f63b7028d50fc8a0b7ec930f82777cacf","5754e79fbbfbb921b60ca1ad35cfbb5940733d93110bb1a935584f90cedb1c68","f7fcb70b90e9664b1ff1fb8566d3af99ca1a057d0dcfb94fb69b430463acba27","fb3af1e7369a6a52e0382612036ddcea2d089cdb0cccadc968a975043621e5fa","51353ffcc4bec12870c1435205dcaedab91ef108123017fd50fe8c3aed2bec04","e26befbe9607e9915734929db869fd83943f66e08c8e59d7308c14f6b6e755a3","4f596be4c3cb6ab63476dfa81bfe5f2a75768b6fd966d4c716411b4daa98df11","6d0e44cb89017602b13264823b15ada2a38e2ccb2a831c3e57680a0eb57d4bed","5e3f90d8fbf438ecb335d40e7a830f8deba1f045a2c3a27a8f5a4cdf8f499422","3a98713a36fe040df4d7e10a9e57a983f814f5cac42d3fe7919a342a6b9c103f","5dbaf247d7887721b20d8cf0a127460782ebbdc4285868f831a2f48104f034b5","b44d4ecd18d153d893eb38bfd827c0d624ed6f8fed4d9622489d76b3e4847067","23a12ab68ec3b350709bc4c15ddd34d8afa5e94dfccb1346f663f2c4bdb4334a","c9dfb06ca7c62fc5a95d33362f66c2bf5bf78d61ab433e62ec44190ea4012910","8d8b8fea19a532864502cbe5b298aadc194b970d511998342e38e4b9dea98c48","97479d4a4ddc4f4db849e5d6daadda8d986f5a7c580a0d79b3763a536a62268f","7efebf1092b8e7dfd08b0e54ec7d86dfabfd505f820d89351d957bfbc0bb3db2","032ccc910e4f1baf0355a2e43bc535caec36b1e916e64491ec2cabea5593593b",{"version":"c509fe39c0fdf2c28de8f1e14f8e115a26ba1026b2404a9f69858720f3b4ca3b","signature":"0cdd77d7b0f422be43875a362ea1509ad2f65cbf7578bbe0e3789c77bcc1a123"},"5379bd2adb109cb6c15e7f0367c2eb1986d837f9977f50915afe4fc1759522ba","8d48b8f8a377ade8dd1f000625bc276eea067f2529cc9cafdf082d17142107d6","5df73c1f18e7e58a7ce2c9ec072ef7cc75f4841c8723f0d36eafd9fb5c1a90d4","76232dbb982272b182a76ad8745a9b02724dc9896e2328ce360e2c56c64c9778",{"version":"b3d08e5f9da8ffa45950f5260d8d6e067b3804e8694e5e01509bb51292f9cc9c","signature":"a03049a303d95f933af688a1c541867127a1226a4a200325369c02a39320bab7"},"c16631ce27bbed5b2fe93a3b5a9b76c22b64c909633e9f9a2cca997bc890ac51",{"version":"c3bc5d095c3c22fd20b5a6550b9c9a6d56c3ffbb87ef057ccce7764b6bed4428","affectsGlobalScope":true},{"version":"f4c0db3a49cea9babd5d224ba14243a6a6119bf65a65198994033aaea3a60a71","affectsGlobalScope":true},"c401118ea6c6daa9f196013b0622c602d4faec565bb1cc6ca751d2a8fc295498","8b06ac3faeacb8484d84ddb44571d8f410697f98d7bfa86c0fda60373a9f5215","a185ebc69c9f6798ebd67bfdfd72a37457dc67c23459784783c7128ae9bd5250","2b8264b2fefd7367e0f20e2c04eed5d3038831fe00f5efbc110ff0131aab899b"],"root":[[58,62],64,65,131,132,[138,140],170,171,175,176],"options":{"declaration":true,"downlevelIteration":true,"esModuleInterop":true,"jsx":4,"module":1,"newLine":1,"noFallthroughCasesInSwitch":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","sourceMap":true,"strict":true,"target":1},"fileIdsList":[[85,112,119,128],[112,177],[112],[85,112,119],[82,85,112,119,121,122,123],[112,123,124,127,129],[112,126],[112,125],[66,112],[69,112],[70,75,103,112],[71,82,83,90,100,111,112],[71,72,82,90,112],[73,112],[74,75,83,91,112],[75,100,108,112],[76,78,82,90,112],[77,112],[78,79,112],[82,112],[80,82,112],[82,83,84,100,111,112],[82,83,84,97,100,103,112],[112,116],[78,85,90,100,111,112],[82,83,85,86,90,100,108,111,112],[85,87,100,108,111,112],[66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118],[82,88,112],[89,111,112],[78,82,90,100,112],[91,112],[92,112],[69,93,112],[94,110,112,116],[95,112],[96,112],[82,97,98,112],[97,99,112,114],[70,82,100,101,102,103,112],[70,100,102,112],[100,101,112],[103,112],[104,112],[82,106,107,112],[106,107,112],[75,90,100,108,112],[109,112],[90,110,112],[70,85,96,111,112],[75,112],[100,112,113],[112,114],[112,115],[70,75,82,84,93,100,111,112,114,116],[100,112,117],[83,100,112,119,120],[85,112,119,126],[70,83,85,100,112,119,172],[112,173],[112,134,135],[85,112,119,133,136],[112,168],[57,112],[57,112,142,167],[112,144,167],[57,112,143,144,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166],[57,112,144,145,167],[57,112,144,145],[57,112,144,167],[57,112,144],[112,144],[57,112,144,156,167],[57,112,144,150,160,167],[56,112],[45,46,56,112],[47,48,112],[45,46,47,49,50,54,112],[46,47,112],[55,112],[47,112],[45,46,47,50,51,52,53,112],[62,63,112],[64,112],[57,58,59,112],[59,60,112],[57,58,112],[57,62,112,130],[112,131],[62,112,137,138],[112,139],[58,59,60,61,112],[57,62,112,141,169],[112,170],[62,112,174],[112,175],[62,63],[64],[57,58,59],[59,60],[57,58],[57,62,130],[62,137],[139],[58,59,60,61],[57,62,141],[62,174]],"referencedMap":[[129,1],[178,2],[177,3],[179,3],[128,4],[172,3],[124,5],[130,6],[180,3],[181,3],[125,7],[126,8],[66,9],[67,9],[69,10],[70,11],[71,12],[72,13],[73,14],[74,15],[75,16],[76,17],[77,18],[78,19],[79,19],[81,20],[80,21],[82,20],[83,22],[84,23],[68,24],[118,3],[85,25],[86,26],[87,27],[119,28],[88,29],[89,30],[90,31],[91,32],[92,33],[93,34],[94,35],[95,36],[96,37],[97,38],[98,38],[99,39],[100,40],[102,41],[101,42],[103,43],[104,44],[105,3],[106,45],[107,46],[108,47],[109,48],[110,49],[111,50],[112,51],[113,52],[114,53],[115,54],[116,55],[117,56],[182,3],[123,3],[122,3],[121,57],[120,3],[127,58],[173,59],[174,60],[63,3],[134,3],[136,61],[135,3],[133,3],[137,62],[141,3],[43,3],[44,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[4,3],[22,3],[19,3],[20,3],[21,3],[23,3],[24,3],[25,3],[5,3],[26,3],[27,3],[28,3],[29,3],[6,3],[33,3],[30,3],[31,3],[32,3],[34,3],[7,3],[35,3],[40,3],[41,3],[36,3],[37,3],[38,3],[39,3],[1,3],[42,3],[169,63],[142,64],[144,65],[145,66],[167,67],[143,3],[146,68],[147,69],[148,3],[149,3],[150,64],[151,70],[152,71],[153,70],[154,64],[155,3],[156,72],[157,73],[158,69],[159,70],[161,74],[162,68],[160,69],[163,70],[164,3],[165,70],[166,3],[168,65],[57,75],[47,76],[49,77],[55,78],[51,3],[52,3],[50,79],[53,75],[45,3],[46,3],[56,80],[48,81],[54,82],[64,83],[65,84],[60,85],[61,86],[59,87],[131,88],[132,89],[139,90],[140,91],[138,3],[62,92],[170,93],[171,94],[58,3],[175,95],[176,96]],"exportedModulesMap":[[129,1],[178,2],[177,3],[179,3],[128,4],[172,3],[124,5],[130,6],[180,3],[181,3],[125,7],[126,8],[66,9],[67,9],[69,10],[70,11],[71,12],[72,13],[73,14],[74,15],[75,16],[76,17],[77,18],[78,19],[79,19],[81,20],[80,21],[82,20],[83,22],[84,23],[68,24],[118,3],[85,25],[86,26],[87,27],[119,28],[88,29],[89,30],[90,31],[91,32],[92,33],[93,34],[94,35],[95,36],[96,37],[97,38],[98,38],[99,39],[100,40],[102,41],[101,42],[103,43],[104,44],[105,3],[106,45],[107,46],[108,47],[109,48],[110,49],[111,50],[112,51],[113,52],[114,53],[115,54],[116,55],[117,56],[182,3],[123,3],[122,3],[121,57],[120,3],[127,58],[173,59],[174,60],[63,3],[134,3],[136,61],[135,3],[133,3],[137,62],[141,3],[43,3],[44,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[4,3],[22,3],[19,3],[20,3],[21,3],[23,3],[24,3],[25,3],[5,3],[26,3],[27,3],[28,3],[29,3],[6,3],[33,3],[30,3],[31,3],[32,3],[34,3],[7,3],[35,3],[40,3],[41,3],[36,3],[37,3],[38,3],[39,3],[1,3],[42,3],[169,63],[142,64],[144,65],[145,66],[167,67],[143,3],[146,68],[147,69],[148,3],[149,3],[150,64],[151,70],[152,71],[153,70],[154,64],[155,3],[156,72],[157,73],[158,69],[159,70],[161,74],[162,68],[160,69],[163,70],[164,3],[165,70],[166,3],[168,65],[57,75],[47,76],[49,77],[55,78],[51,3],[52,3],[50,79],[53,75],[45,3],[46,3],[56,80],[48,81],[54,82],[64,97],[65,98],[60,99],[61,100],[59,101],[131,102],[132,89],[139,103],[140,104],[62,105],[170,106],[171,94],[175,107],[176,96]],"semanticDiagnosticsPerFile":[129,178,177,179,128,172,124,130,180,181,125,126,66,67,69,70,71,72,73,74,75,76,77,78,79,81,80,82,83,84,68,118,85,86,87,119,88,89,90,91,92,93,94,95,96,97,98,99,100,102,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,182,123,122,121,120,127,173,174,63,134,136,135,133,137,141,43,44,8,10,9,2,11,12,13,14,15,16,17,18,3,4,22,19,20,21,23,24,25,5,26,27,28,29,6,33,30,31,32,34,7,35,40,41,36,37,38,39,1,42,169,142,144,145,167,143,146,147,148,149,150,151,152,153,154,155,156,157,158,159,161,162,160,163,164,165,166,168,57,47,49,55,51,52,50,53,45,46,56,48,54,64,65,60,61,59,131,132,139,140,138,62,170,171,58,175,176]},"version":"5.0.4"} \ No newline at end of file