diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml deleted file mode 100644 index 162827c..0000000 --- a/.github/workflows/ci.yaml +++ /dev/null @@ -1,161 +0,0 @@ -name: ci -on: - push: - branches: - - main - pull_request: - branches: - - main - -jobs: - - test_node: - runs-on: ${{ matrix.os }} - strategy: - matrix: - node: [ '18' ] - os: [ windows-latest, ubuntu-latest ] - name: Test with Node v${{ matrix.node }} on ${{ matrix.os }} - steps: - - uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2 - with: - version: 8 - - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node }} - cache: 'pnpm' - - run: pnpm install --frozen-lockfile - - run: pnpm build - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - run: pnpm test - - test_deno: - runs-on: ubuntu-latest - name: test with Deno - steps: - - uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2 - with: - version: 8 - - uses: actions/setup-node@v3 - with: - node-version: '18' - cache: 'pnpm' - - 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 - - run: pnpm install --frozen-lockfile - - run: pnpm build:deno - 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 }} - - uses: pnpm/action-setup@v2 - with: - version: 8 - - 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/ - cache: 'pnpm' - - run: pnpm install --frozen-lockfile - - run: pnpm 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/axios/createAxiosSharedClient.d.ts b/axios/createAxiosSharedClient.d.ts new file mode 100644 index 0000000..30237a7 --- /dev/null +++ b/axios/createAxiosSharedClient.d.ts @@ -0,0 +1,6 @@ +import type { AxiosInstance } from "axios"; +import type { UnknownSharedRoute } from ".."; +import { HandlerCreator } from ".."; +import { ValidationOptions } from "../validations"; +export declare const createAxiosHandlerCreator: >(axios: AxiosInstance, options?: ValidationOptions) => HandlerCreator; +export declare const createAxiosSharedClient: >(sharedRouters: SharedRoutes, axios: AxiosInstance, validationOptions?: ValidationOptions) => import("..").HttpClient; diff --git a/axios/createAxiosSharedClient.js b/axios/createAxiosSharedClient.js new file mode 100644 index 0000000..11907cf --- /dev/null +++ b/axios/createAxiosSharedClient.js @@ -0,0 +1,116 @@ +"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 validations_1 = require("../validations"); +var toAxiosResponseType = { + arrayBuffer: "arraybuffer", + blob: "blob", + json: "json", + text: "text", +}; +var createAxiosHandlerCreator = function (axios, options) { + return function (routeName, routes, replaceParamsInUrl) { + return function (_a) { + if (_a === void 0) { _a = {}; } + return __awaiter(void 0, void 0, void 0, function () { + var route, _b, body, headers, queryParams, _c, data, status, rest, responseBody; + var urlParams = _a.urlParams, params = __rest(_a, ["urlParams"]); + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + route = routes[routeName]; + _b = (options === null || options === void 0 ? void 0 : options.skipInputValidation) + ? params + : (0, validations_1.validateInputParams)(route, params, "axios", { withIssuesInMessage: true }), body = _b.body, headers = _b.headers, queryParams = _b.queryParams; + return [4 /*yield*/, axios.request({ + method: route.method, + url: replaceParamsInUrl(route.url, urlParams), + data: body, + params: queryParams, + responseType: toAxiosResponseType[route.responseType], + headers: __assign(__assign({}, axios.defaults.headers), (headers !== null && headers !== void 0 ? headers : {})), + })]; + case 1: + _c = _d.sent(), data = _c.data, status = _c.status, rest = __rest(_c, ["data", "status"]); + responseBody = (options === null || options === void 0 ? void 0 : options.skipResponseValidation) + ? data + : (0, validations_1.validateSchemaWithExplicitError)({ + adapterName: "axios", + checkedSchema: "responses", + responseStatus: status, + params: data, + route: route, + withIssuesInMessage: true, + }); + return [2 /*return*/, __assign(__assign({}, rest), { status: status, body: responseBody })]; + } + }); + }); + }; + }; +}; +exports.createAxiosHandlerCreator = createAxiosHandlerCreator; +var createAxiosSharedClient = function (sharedRouters, axios, validationOptions) { + return (0, __1.configureCreateHttpClient)((0, exports.createAxiosHandlerCreator)(axios, validationOptions))(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..99bcb77 --- /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;AAE/D,8CAIwB;AAExB,IAAM,mBAAmB,GAA4C;IACnE,WAAW,EAAE,aAAa;IAC1B,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACb,CAAC;AAEK,IAAM,yBAAyB,GACpC,UACE,KAAoB,EACpB,OAA2B;IAE7B,OAAA,UAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB;QACtC,OAAA,UAAO,EAA6B;YAA7B,mBAAA,EAAA,OAA6B;;;gBAA3B,IAAA,SAAS,eAAA,EAAK,MAAM,cAAtB,aAAwB,CAAF;;;;4BACrB,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;4BAE1B,KAAiC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB;gCACjE,CAAC,CAAC,MAAM;gCACR,CAAC,CAAC,IAAA,iCAAmB,EAAC,KAAK,EAAE,MAAa,EAAE,OAAO,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,EAF7E,IAAI,UAAA,EAAE,OAAO,aAAA,EAAE,WAAW,iBAAA,CAEoD;4BAEpD,qBAAM,KAAK,CAAC,OAAO,CAAC;oCACpD,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,YAAY,EAAE,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC;oCACrD,OAAO,wBACF,KAAK,CAAC,QAAQ,CAAC,OAAO,GACtB,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAK,EAAU,CAAC,CAC5B;iCACF,CAAC,EAAA;;4BAVI,KAA4B,SAUhC,EAVM,IAAI,UAAA,EAAE,MAAM,YAAA,EAAK,IAAI,cAAvB,kBAAyB,CAAF;4BAYvB,YAAY,GAAG,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,sBAAsB;gCAClD,CAAC,CAAC,IAAI;gCACN,CAAC,CAAC,IAAA,6CAA+B,EAAC;oCAC9B,WAAW,EAAE,OAAO;oCACpB,aAAa,EAAE,WAAW;oCAC1B,cAAc,EAAE,MAAa;oCAC7B,MAAM,EAAE,IAAI;oCACZ,KAAK,OAAA;oCACL,mBAAmB,EAAE,IAAI;iCAC1B,CAAC,CAAC;4BAEP,4CAAY,IAAI,KAAE,MAAM,QAAA,EAAE,IAAI,EAAE,YAAY,KAAG;;;;SAChD;IA/BD,CA+BC;AAhCD,CAgCC,CAAC;AArCS,QAAA,yBAAyB,6BAqClC;AAEG,IAAM,uBAAuB,GAAG,UAGrC,aAA2B,EAC3B,KAAoB,EACpB,iBAAqC;IAErC,OAAA,IAAA,6BAAyB,EAAC,IAAA,iCAAyB,EAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAC5E,aAAa,CACd;AAFD,CAEC,CAAC;AATS,QAAA,uBAAuB,2BAShC"} \ No newline at end of file diff --git a/axios/index.d.ts b/axios/index.d.ts new file mode 100644 index 0000000..5a59bf2 --- /dev/null +++ b/axios/index.d.ts @@ -0,0 +1 @@ +export { createAxiosSharedClient } from "./createAxiosSharedClient"; diff --git a/axios/index.js b/axios/index.js new file mode 100644 index 0000000..ce08009 --- /dev/null +++ b/axios/index.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createAxiosSharedClient = void 0; +var createAxiosSharedClient_1 = require("./createAxiosSharedClient"); +Object.defineProperty(exports, "createAxiosSharedClient", { enumerable: true, get: function () { return createAxiosSharedClient_1.createAxiosSharedClient; } }); +//# 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..bf17877 --- /dev/null +++ b/axios/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/axios/index.ts"],"names":[],"mappings":";;;AAAA,qEAAoE;AAA3D,kIAAA,uBAAuB,OAAA"} \ No newline at end of file diff --git a/configureCreateHttpClient.d.ts b/configureCreateHttpClient.d.ts new file mode 100644 index 0000000..f7250f7 --- /dev/null +++ b/configureCreateHttpClient.d.ts @@ -0,0 +1,25 @@ +import { z } from "zod"; +import type { ResponsesToHttpResponse, SharedRoute, UnknownResponses, UnknownSharedRoute } from "./defineRoutes"; +import { PathParameters, ReplaceParamsInUrl, Url } from "./pathParameters"; +type EmptyObj = Record; +type AnyObj = Record; +export type HttpResponse = { + status: Status; + body: ResponseBody; +}; +export 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..5bf7ac1 --- /dev/null +++ b/configureCreateHttpClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"configureCreateHttpClient.js","sourceRoot":"","sources":["src/configureCreateHttpClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAOA,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..6a70010 --- /dev/null +++ b/defineRoutes.d.ts @@ -0,0 +1,35 @@ +import { z, ZodVoid } from "zod"; +import type { Url } from "./pathParameters"; +export type UnknownResponses = { + [K: number]: z.ZodSchema; +}; +export type ValueOf = T[keyof T]; +export type ResponsesToHttpResponse = ValueOf<{ + [K in keyof Responses]: { + status: K; + body: z.infer; + }; +}>; +export type ResponseType = 'json' | 'arrayBuffer' | 'blob' | 'text'; +type OptionalFields = { + requestBodySchema?: z.Schema; + queryParamsSchema?: z.Schema; + responses?: Responses; + headersSchema?: z.Schema; + responseType?: ResponseType; +}; +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..f59962a --- /dev/null +++ b/defineRoutes.js @@ -0,0 +1,62 @@ +"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) { + var _a; + return (__assign(__assign({ requestBodySchema: zod_1.z.object({}).strict(), queryParamsSchema: zod_1.z.object({}).strict(), responses: { 201: zod_1.z.void().or(zod_1.z.string().max(0)) }, headersSchema: zod_1.z.object({}) }, route), { responseType: (_a = route.responseType) !== null && _a !== void 0 ? _a : "json" })); +}; +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); + 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..2a76968 --- /dev/null +++ b/defineRoutes.js.map @@ -0,0 +1 @@ +{"version":3,"file":"defineRoutes.js","sourceRoot":"","sources":["src/defineRoutes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2BAAiC;AA4E1B,IAAM,WAAW,GAAG,UAOzB,KAAyE;;IACd,OAAA,qBAC3D,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,SAAS,EAAE,EAAE,GAAG,EAAE,OAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAS,EACzD,aAAa,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAQ,IAC/B,KAAK,KACR,YAAY,EAAE,MAAA,KAAK,CAAC,YAAY,mCAAI,MAAM,IAC1C,CAAA;CAAA,CAAC;AAfU,QAAA,WAAW,eAerB;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,CAAE,CAAC;YAC1D,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/esm/axios/createAxiosSharedClient.d.ts b/esm/axios/createAxiosSharedClient.d.ts new file mode 100644 index 0000000..5dcc408 --- /dev/null +++ b/esm/axios/createAxiosSharedClient.d.ts @@ -0,0 +1,6 @@ +import type { AxiosInstance } from "axios"; +import type { UnknownSharedRoute } from "../index.mjs"; +import { HandlerCreator } from "../index.mjs"; +import { ValidationOptions } from "../validations.mjs"; +export declare const createAxiosHandlerCreator: >(axios: AxiosInstance, options?: ValidationOptions) => HandlerCreator; +export declare const createAxiosSharedClient: >(sharedRouters: SharedRoutes, axios: AxiosInstance, validationOptions?: ValidationOptions) => import("../index.mjs").HttpClient; diff --git a/esm/axios/createAxiosSharedClient.mjs b/esm/axios/createAxiosSharedClient.mjs new file mode 100644 index 0000000..e249a29 --- /dev/null +++ b/esm/axios/createAxiosSharedClient.mjs @@ -0,0 +1,111 @@ +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"; +import { validateInputParams, validateSchemaWithExplicitError, } from "../validations.mjs"; +var toAxiosResponseType = { + arrayBuffer: "arraybuffer", + blob: "blob", + json: "json", + text: "text", +}; +export var createAxiosHandlerCreator = function (axios, options) { + return function (routeName, routes, replaceParamsInUrl) { + return function (_a) { + if (_a === void 0) { _a = {}; } + return __awaiter(void 0, void 0, void 0, function () { + var route, _b, body, headers, queryParams, _c, data, status, rest, responseBody; + var urlParams = _a.urlParams, params = __rest(_a, ["urlParams"]); + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + route = routes[routeName]; + _b = (options === null || options === void 0 ? void 0 : options.skipInputValidation) + ? params + : validateInputParams(route, params, "axios", { withIssuesInMessage: true }), body = _b.body, headers = _b.headers, queryParams = _b.queryParams; + return [4 /*yield*/, axios.request({ + method: route.method, + url: replaceParamsInUrl(route.url, urlParams), + data: body, + params: queryParams, + responseType: toAxiosResponseType[route.responseType], + headers: __assign(__assign({}, axios.defaults.headers), (headers !== null && headers !== void 0 ? headers : {})), + })]; + case 1: + _c = _d.sent(), data = _c.data, status = _c.status, rest = __rest(_c, ["data", "status"]); + responseBody = (options === null || options === void 0 ? void 0 : options.skipResponseValidation) + ? data + : validateSchemaWithExplicitError({ + adapterName: "axios", + checkedSchema: "responses", + responseStatus: status, + params: data, + route: route, + withIssuesInMessage: true, + }); + return [2 /*return*/, __assign(__assign({}, rest), { status: status, body: responseBody })]; + } + }); + }); + }; + }; +}; +export var createAxiosSharedClient = function (sharedRouters, axios, validationOptions) { + return configureCreateHttpClient(createAxiosHandlerCreator(axios, validationOptions))(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..20a7f75 --- /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,OAAO,EAEL,mBAAmB,EACnB,+BAA+B,GAChC,MAAM,gBAAgB,CAAC;AAExB,IAAM,mBAAmB,GAA4C;IACnE,WAAW,EAAE,aAAa;IAC1B,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,CAAC,IAAM,yBAAyB,GACpC,UACE,KAAoB,EACpB,OAA2B;IAE7B,OAAA,UAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB;QACtC,OAAA,UAAO,EAA6B;YAA7B,mBAAA,EAAA,OAA6B;;;gBAA3B,IAAA,SAAS,eAAA,EAAK,MAAM,cAAtB,aAAwB,CAAF;;;;4BACrB,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;4BAE1B,KAAiC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB;gCACjE,CAAC,CAAC,MAAM;gCACR,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAa,EAAE,OAAO,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,EAF7E,IAAI,UAAA,EAAE,OAAO,aAAA,EAAE,WAAW,iBAAA,CAEoD;4BAEpD,qBAAM,KAAK,CAAC,OAAO,CAAC;oCACpD,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,YAAY,EAAE,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC;oCACrD,OAAO,wBACF,KAAK,CAAC,QAAQ,CAAC,OAAO,GACtB,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAK,EAAU,CAAC,CAC5B;iCACF,CAAC,EAAA;;4BAVI,KAA4B,SAUhC,EAVM,IAAI,UAAA,EAAE,MAAM,YAAA,EAAK,IAAI,cAAvB,kBAAyB,CAAF;4BAYvB,YAAY,GAAG,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,sBAAsB;gCAClD,CAAC,CAAC,IAAI;gCACN,CAAC,CAAC,+BAA+B,CAAC;oCAC9B,WAAW,EAAE,OAAO;oCACpB,aAAa,EAAE,WAAW;oCAC1B,cAAc,EAAE,MAAa;oCAC7B,MAAM,EAAE,IAAI;oCACZ,KAAK,OAAA;oCACL,mBAAmB,EAAE,IAAI;iCAC1B,CAAC,CAAC;4BAEP,4CAAY,IAAI,KAAE,MAAM,QAAA,EAAE,IAAI,EAAE,YAAY,KAAG;;;;SAChD;IA/BD,CA+BC;AAhCD,CAgCC,CAAC;AAEJ,MAAM,CAAC,IAAM,uBAAuB,GAAG,UAGrC,aAA2B,EAC3B,KAAoB,EACpB,iBAAqC;IAErC,OAAA,yBAAyB,CAAC,yBAAyB,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAC5E,aAAa,CACd;AAFD,CAEC,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..293b236 --- /dev/null +++ b/esm/axios/index.d.ts @@ -0,0 +1 @@ +export { createAxiosSharedClient } from "./createAxiosSharedClient.mjs"; diff --git a/esm/axios/index.mjs b/esm/axios/index.mjs new file mode 100644 index 0000000..399f9b7 --- /dev/null +++ b/esm/axios/index.mjs @@ -0,0 +1,2 @@ +export { createAxiosSharedClient } 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..4d6c8d0 --- /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,EAAE,uBAAuB,EAAE,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..9b37656 --- /dev/null +++ b/esm/configureCreateHttpClient.d.ts @@ -0,0 +1,25 @@ +import { z } from "zod"; +import type { ResponsesToHttpResponse, SharedRoute, UnknownResponses, UnknownSharedRoute } from "./defineRoutes.mjs"; +import { PathParameters, ReplaceParamsInUrl, Url } from "./pathParameters.mjs"; +type EmptyObj = Record; +type AnyObj = Record; +export type HttpResponse = { + status: Status; + body: ResponseBody; +}; +export 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..b21009a --- /dev/null +++ b/esm/configureCreateHttpClient.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"configureCreateHttpClient.mjs","sourceRoot":"","sources":["../src/configureCreateHttpClient.ts"],"names":[],"mappings":";;;;;;;;;;;AAOA,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..0e4020b --- /dev/null +++ b/esm/defineRoutes.d.ts @@ -0,0 +1,35 @@ +import { z, ZodVoid } from "zod"; +import type { Url } from "./pathParameters.mjs"; +export type UnknownResponses = { + [K: number]: z.ZodSchema; +}; +export type ValueOf = T[keyof T]; +export type ResponsesToHttpResponse = ValueOf<{ + [K in keyof Responses]: { + status: K; + body: z.infer; + }; +}>; +export type ResponseType = 'json' | 'arrayBuffer' | 'blob' | 'text'; +type OptionalFields = { + requestBodySchema?: z.Schema; + queryParamsSchema?: z.Schema; + responses?: Responses; + headersSchema?: z.Schema; + responseType?: ResponseType; +}; +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..aaf2e9b --- /dev/null +++ b/esm/defineRoutes.mjs @@ -0,0 +1,56 @@ +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) { + var _a; + return (__assign(__assign({ requestBodySchema: z.object({}).strict(), queryParamsSchema: z.object({}).strict(), responses: { 201: z.void().or(z.string().max(0)) }, headersSchema: z.object({}) }, route), { responseType: (_a = route.responseType) !== null && _a !== void 0 ? _a : "json" })); +}; +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); + 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..4f2960f --- /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,EAAW,MAAM,KAAK,CAAC;AA4EjC,MAAM,CAAC,IAAM,WAAW,GAAG,UAOzB,KAAyE;;IACd,OAAA,qBAC3D,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,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAS,EACzD,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAQ,IAC/B,KAAK,KACR,YAAY,EAAE,MAAA,KAAK,CAAC,YAAY,mCAAI,MAAM,IAC1C,CAAA;CAAA,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,CAAE,CAAC;YAC1D,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..916bce7 --- /dev/null +++ b/esm/express/createExpressSharedRouter.d.ts @@ -0,0 +1,8 @@ +import type { IRoute, RequestHandler, Router } from "express"; +import type { PathParameters, UnknownSharedRoute } from "../index.mjs"; +import { z } from "zod"; +import { ValidationOptions } from "../validations.mjs"; +import { ValueOf } from "../defineRoutes.mjs"; +type ExpressSharedRouterOptions = Pick; +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; +export {}; diff --git a/esm/express/createExpressSharedRouter.mjs b/esm/express/createExpressSharedRouter.mjs new file mode 100644 index 0000000..c5bd7b7 --- /dev/null +++ b/esm/express/createExpressSharedRouter.mjs @@ -0,0 +1,68 @@ +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"; +import { validateInputParams } from "../validations.mjs"; +var makeValidationMiddleware = function (route, options) { + return function (req, res, next) { + try { + if (!options.skipInputValidation) { + var validatedParams = validateInputParams(route, { body: req.body, headers: req.headers, queryParams: req.query }, "express"); + req.body = validatedParams.body; + req.query = validatedParams.queryParams; + req.headers = validatedParams.headers; + } + next(); + } + catch (error) { + var zodError = error.cause; + res.status(400); + res.json({ + status: 400, + message: error.message, + issues: Array.from(new Set(zodIssuesToStrings(zodError.issues))), + }); + } + }; +}; +var zodIssuesToStrings = function (zodIssues) { + return zodIssues.flatMap(function (zodIssue) { + if (zodIssue.code === "invalid_union") { + return zodIssue.unionErrors.flatMap(function (_a) { + var issues = _a.issues; + return zodIssuesToStrings(issues); + }); + } + var message = zodIssue.message, path = zodIssue.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; +}; +//# 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..a97b4a3 --- /dev/null +++ b/esm/express/createExpressSharedRouter.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"createExpressSharedRouter.mjs","sourceRoot":"","sources":["../../src/express/createExpressSharedRouter.ts"],"names":[],"mappings":"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"} \ 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..89f76e8 --- /dev/null +++ b/esm/fetch/createFetchSharedClient.d.ts @@ -0,0 +1,13 @@ +import type { UnknownSharedRoute, Url } from "../index.mjs"; +import { HandlerCreator } from "../index.mjs"; +import type nodeFetch from "node-fetch"; +import type { Response as FetchResponse } from "node-fetch"; +import { ValidationOptions } from "../validations.mjs"; +declare function browserFetch(input: RequestInfo | URL, init?: RequestInit): Promise; +type Fetch = typeof browserFetch | typeof nodeFetch; +type FetchConfig = RequestInit & { + baseURL?: Url; +} & ValidationOptions; +export declare const createFetchHandlerCreator: >(fetch: Fetch, options?: FetchConfig) => HandlerCreator; +export declare const createFetchSharedClient: >(sharedRouters: SharedRoutes, fetch: Fetch, config?: FetchConfig) => import("../index.mjs").HttpClient; +export {}; diff --git a/esm/fetch/createFetchSharedClient.mjs b/esm/fetch/createFetchSharedClient.mjs new file mode 100644 index 0000000..04a52b8 --- /dev/null +++ b/esm/fetch/createFetchSharedClient.mjs @@ -0,0 +1,127 @@ +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"; +import { queryParamsToString } from "./queryParamsToString.mjs"; +import { validateInputParams, validateSchemaWithExplicitError, } from "../validations.mjs"; +export var createFetchHandlerCreator = function (fetch, options) { + if (options === void 0) { options = {}; } + return function (routeName, routes, replaceParamsInUrl) { + return function (_a) { + if (_a === void 0) { _a = {}; } + return __awaiter(void 0, void 0, void 0, function () { + var route, _b, body, headers, queryParams, bodyAsString, stringQueryParams, baseURL, defaultInit, res, processedBody, responseBody; + var urlParams = _a.urlParams, params = __rest(_a, ["urlParams"]); + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + route = routes[routeName]; + _b = options.skipInputValidation + ? params + : validateInputParams(route, params, "fetch", { withIssuesInMessage: true }), body = _b.body, headers = _b.headers, queryParams = _b.queryParams; + bodyAsString = JSON.stringify(body); + stringQueryParams = queryParams && Object.keys(queryParams).length > 0 + ? "?" + queryParamsToString(queryParams) + : ""; + baseURL = options.baseURL, defaultInit = __rest(options, ["baseURL"]); + return [4 /*yield*/, fetch((baseURL ? baseURL : "") + + replaceParamsInUrl(route.url, urlParams) + + stringQueryParams, __assign(__assign(__assign(__assign({}, defaultInit), { method: route.method }), (bodyAsString !== "{}" ? { body: bodyAsString } : {})), { headers: __assign(__assign({ "Content-Type": "application/json" }, defaultInit === null || defaultInit === void 0 ? void 0 : defaultInit.headers), (headers !== null && headers !== void 0 ? headers : {})) }))]; + case 1: + res = _c.sent(); + return [4 /*yield*/, responseTypeToResponseBody(res, route.responseType)]; + case 2: + processedBody = _c.sent(); + responseBody = options.skipResponseValidation + ? processedBody + : validateSchemaWithExplicitError({ + adapterName: "fetch", + checkedSchema: "responses", + responseStatus: res.status, + params: processedBody, + route: route, + withIssuesInMessage: true, + }); + return [2 /*return*/, { body: responseBody, status: res.status }]; + } + }); + }); + }; + }; +}; +var responseTypeToResponseBody = function (res, responseType) { + switch (responseType) { + case "json": + return res.json(); + case "text": + return res.text(); + case "blob": + return res.blob(); + case "arrayBuffer": + return res.arrayBuffer(); + default: { + var exhaustiveCheck = responseType; + return exhaustiveCheck; + } + } +}; +export var createFetchSharedClient = function (sharedRouters, fetch, config) { + if (config === void 0) { config = {}; } + return configureCreateHttpClient(createFetchHandlerCreator(fetch, config))(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..62737e5 --- /dev/null +++ b/esm/fetch/createFetchSharedClient.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"createFetchSharedClient.mjs","sourceRoot":"","sources":["../../src/fetch/createFetchSharedClient.ts"],"names":[],"mappings":"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"} \ 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..64accb7 --- /dev/null +++ b/esm/fetch/index.d.ts @@ -0,0 +1 @@ +export { createFetchSharedClient } from "./createFetchSharedClient.mjs"; diff --git a/esm/fetch/index.mjs b/esm/fetch/index.mjs new file mode 100644 index 0000000..2036063 --- /dev/null +++ b/esm/fetch/index.mjs @@ -0,0 +1,2 @@ +export { createFetchSharedClient } 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..10a91b8 --- /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,EAAE,uBAAuB,EAAE,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..8c68c6e --- /dev/null +++ b/esm/openapi/createOpenApiGenerator.d.ts @@ -0,0 +1,49 @@ +import { OpenAPIV3_1 as OpenAPI } from "openapi-types"; +import { z } from "zod"; +import { PathParameters, UnknownSharedRoute } from "../index.mjs"; +type OmitFromExisting = Omit; +type Examples = { + [media: string]: OpenAPI.ExampleObject & { + value?: T; + }; +}; +type WithExampleOrExamples = { + example?: T; + examples?: never; +} | { + example?: never; + examples?: Examples; +}; +type OpenApiBody = Pick & { + example?: T; + examples?: Examples; +}; +type ExtraDocParameter = Partial> & WithExampleOrExamples; +type CreateOpenApiGenerator = ; +}, SecuritySchemeName extends string>(sharedRoutesByTag: SharedRoutesByTag, openApiRootDoc: Omit & { + components?: OmitFromExisting & { + securitySchemes?: Record; + }; +}) => (extraDataByRoute: Partial<{ + [Tag in keyof SharedRoutesByTag]: { + [R in keyof SharedRoutesByTag[Tag]]: OmitFromExisting & { + extraDocs: { + securitySchemeToApply?: SecuritySchemeName[]; + urlParams?: PathParameters extends Record ? never : Record, ExtraDocParameter>; + body?: z.infer extends void ? never : OpenApiBody>; + queryParams?: z.infer extends void ? never : { + [K in keyof z.infer]: ExtraDocParameter[K]>; + }; + headerParams?: z.infer extends void ? never : { + [K in keyof z.infer]: ExtraDocParameter[K]>; + }; + responses: { + [S in keyof SharedRoutesByTag[Tag][R]["responses"]]: OpenAPI.ResponseObject & WithExampleOrExamples>; + }; + }; + }; + }; +}>) => 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..1838cf7 --- /dev/null +++ b/esm/openapi/createOpenApiGenerator.mjs @@ -0,0 +1,147 @@ +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 { zodToJsonSchema } from "zod-to-json-schema"; +import { keys } from "../index.mjs"; +var extractFromOpenApiBody = function (openApiRequestBody) { + if (openApiRequestBody === void 0) { openApiRequestBody = {}; } + var examples = openApiRequestBody.examples, example = openApiRequestBody.example, rest = __rest(openApiRequestBody, ["examples", "example"]); + return { + withRequestBodyExemple: __assign(__assign({}, (example && { example: example })), (examples && { examples: examples })), + requestBodyDocs: rest, + }; +}; +export var createOpenApiGenerator = function (sharedRoutesByTag, openApiRootDoc) { return function (extraDataByRoute) { return (__assign(__assign({}, openApiRootDoc), { paths: keys(sharedRoutesByTag).reduce(function (rootAcc, tag) { + var sharedRoutes = sharedRoutesByTag[tag]; + return __assign(__assign({}, rootAcc), keys(sharedRoutes).reduce(function (acc, routeName) { + var _a, _b; + var _c, _d; + var route = sharedRoutes[routeName]; + var _e = (_d = (_c = extraDataByRoute[tag]) === null || _c === void 0 ? void 0 : _c[routeName]) !== null && _d !== void 0 ? _d : {}, extraDocs = _e.extraDocs, extraDataForRoute = __rest(_e, ["extraDocs"]); + var _f = extractFromUrl(route.url, extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.urlParams), formattedUrl = _f.formattedUrl, pathParams = _f.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); + var _g = extractFromOpenApiBody(extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.body), withRequestBodyExemple = _g.withRequestBodyExemple, requestBodyDocs = _g.requestBodyDocs; + return __assign(__assign({}, acc), (_a = {}, _a[formattedUrl] = __assign(__assign({}, acc[formattedUrl]), (_b = {}, _b[route.method] = __assign(__assign(__assign(__assign(__assign(__assign({}, extraDataForRoute), { tags: [tag] }), ((extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.securitySchemeToApply) && + securitySchemeNamesToSecurity(extraDocs.securitySchemeToApply))), (parameters.length > 0 && { + parameters: parameters, + })), (!isShapeObjectEmpty(route.requestBodySchema) && { + requestBody: { + required: true, + content: { + "application/json": __assign(__assign({}, withRequestBodyExemple), { schema: __assign(__assign({}, requestBodyDocs), zodToOpenApi(route.requestBodySchema)) }), + }, + }, + })), { responses: keys(route.responses).reduce(function (acc, status) { + var _a; + var _b, _c; + var responseSchema = zodToOpenApi(route.responses[status]); + var responseSchemaType = responseSchema.type; + var _d = (_c = (_b = extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.responses) === null || _b === void 0 ? void 0 : _b[status]) !== null && _c !== void 0 ? _c : {}, example = _d.example, examples = _d.examples, responseDoc = __rest(_d, ["example", "examples"]); + return __assign(__assign({}, acc), (_a = {}, _a[status.toString()] = __assign(__assign({}, responseDoc), (responseSchemaType !== undefined && { + content: { + "application/json": __assign(__assign(__assign({}, (example && { example: example })), (examples && { examples: examples })), { schema: responseSchema }), + }, + })), _a)); + }, {}) }), _b)), _a)); + }, {})); + }, {}) })); }; }; +var extractFromUrl = function (url, extraUrlParameters) { + var pathParams = []; + var formattedUrl = url.replace(/:(.*?)(\/|$)/g, function (_match, group1, group2) { + var _a; + var extraDocForParam = extraUrlParameters === null || extraUrlParameters === void 0 ? void 0 : extraUrlParameters[group1]; + pathParams.push(__assign(__assign({}, extraDocForParam), { 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, { + $refStrategy: "none", + }), $schema = _a.$schema, additionalProperties = _a.additionalProperties, rest = __rest(_a, ["$schema", "additionalProperties"]); + 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 securitySchemeNamesToSecurity = function (securitySchemeToApply) { return ({ + security: securitySchemeToApply.reduce(function (securityAcc, securitySchemeName) { + var _a; + return __spreadArray(__spreadArray([], __read(securityAcc), false), [(_a = {}, _a[securitySchemeName] = [], _a)], false); + }, []), +}); }; +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..37cad00 --- /dev/null +++ b/esm/openapi/createOpenApiGenerator.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"createOpenApiGenerator.mjs","sourceRoot":"","sources":["../../src/openapi/createOpenApiGenerator.ts"],"names":[],"mappings":"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"} \ 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..dbc4219 --- /dev/null +++ b/esm/supertest/createSupertestSharedClient.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"; +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 () { + var result; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: return [4 /*yield*/, supertestRequestToCorrectHttpMethod(supertestRequest, route.method)(replaceParamsInUrl(route.url, urlParams)) + .send(body) + .set(headers !== null && headers !== void 0 ? headers : {}) + .query(queryParams)]; + case 1: + result = _c.sent(); + return [2 /*return*/, __assign({ status: result.status, body: result.body }, (!Object.keys(route.responses).includes(result.status.toString()) && { + text: result.text, + }))]; + } + }); + }); + }; + }; +}; +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..8bd0b14 --- /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;;;;;gCACpC,qBAAM,mCAAmC,CACtD,gBAAgB,EAChB,KAAK,CAAC,MAAM,CACb,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;iCACxC,IAAI,CAAC,IAAI,CAAC;iCACV,GAAG,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;iCAClB,KAAK,CAAC,WAAW,CAAC,EAAA;;4BANf,MAAM,GAAG,SAMM;4BAErB,iCACE,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,IAAI,EAAE,MAAM,CAAC,IAAI,IACd,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI;oCACtE,IAAI,EAAE,MAAM,CAAC,IAAI;iCAClB,CAAC,GACF;;;;SACH,CAAC;IACJ,CAAC;AAnBD,CAmBC,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..e13ca74 --- /dev/null +++ b/esm/tsconfig.esm.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/helpers/typeAliases.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/helpers/util.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/ZodError.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/locales/en.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/errors.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/helpers/parseUtil.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/helpers/enumUtil.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/helpers/errorUtil.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/helpers/partialUtil.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/types.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/external.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/index.d.ts","../../node_modules/.pnpm/zod@3.21.4/node_modules/zod/index.d.ts","../../src/pathParameters.ts","../../src/defineRoutes.ts","../../src/configureCreateHttpClient.ts","../../src/createCustomSharedClient.ts","../../src/index.ts","../../src/validations.ts","../../node_modules/.pnpm/axios@1.4.0/node_modules/axios/index.d.ts","../../src/axios/createAxiosSharedClient.ts","../../src/axios/index.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/dom-events.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/globals.global.d.ts","../../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/index.d.ts","../../node_modules/.pnpm/@types+mime@1.3.2/node_modules/@types/mime/index.d.ts","../../node_modules/.pnpm/@types+send@0.17.1/node_modules/@types/send/index.d.ts","../../node_modules/.pnpm/@types+range-parser@1.2.4/node_modules/@types/range-parser/index.d.ts","../../node_modules/.pnpm/@types+qs@6.9.7/node_modules/@types/qs/index.d.ts","../../node_modules/.pnpm/@types+express-serve-static-core@4.17.35/node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/.pnpm/@types+mime@3.0.1/node_modules/@types/mime/Mime.d.ts","../../node_modules/.pnpm/@types+mime@3.0.1/node_modules/@types/mime/index.d.ts","../../node_modules/.pnpm/@types+http-errors@2.0.1/node_modules/@types/http-errors/index.d.ts","../../node_modules/.pnpm/@types+serve-static@1.15.2/node_modules/@types/serve-static/index.d.ts","../../node_modules/.pnpm/@types+connect@3.4.35/node_modules/@types/connect/index.d.ts","../../node_modules/.pnpm/@types+body-parser@1.19.2/node_modules/@types/body-parser/index.d.ts","../../node_modules/.pnpm/@types+express@4.17.17/node_modules/@types/express/index.d.ts","../../src/express/createExpressSharedRouter.ts","../../src/express/index.ts","../../src/fetch/queryParamsToString.ts","../../node_modules/.pnpm/formdata-polyfill@4.0.10/node_modules/formdata-polyfill/esm.min.d.ts","../../node_modules/.pnpm/fetch-blob@3.2.0/node_modules/fetch-blob/file.d.ts","../../node_modules/.pnpm/fetch-blob@3.2.0/node_modules/fetch-blob/index.d.ts","../../node_modules/.pnpm/fetch-blob@3.2.0/node_modules/fetch-blob/from.d.ts","../../node_modules/.pnpm/node-fetch@3.3.1/node_modules/node-fetch/@types/index.d.ts","../../src/fetch/createFetchSharedClient.ts","../../src/fetch/index.ts","../../node_modules/.pnpm/openapi-types@12.1.0/node_modules/openapi-types/dist/index.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/Options.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/any.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/Refs.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/errorMessages.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/array.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/bigint.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/boolean.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/date.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/enum.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/intersection.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/literal.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/map.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/nativeEnum.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/never.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/null.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/nullable.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/number.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/object.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/string.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/record.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/set.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/tuple.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/undefined.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/union.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/unknown.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parseDef.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/zodToJsonSchema.d.ts","../../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/index.d.ts","../../src/openapi/createOpenApiGenerator.ts","../../src/openapi/index.ts","../../node_modules/.pnpm/@types+cookiejar@2.1.2/node_modules/@types/cookiejar/index.d.ts","../../node_modules/.pnpm/@types+superagent@4.1.18/node_modules/@types/superagent/index.d.ts","../../node_modules/.pnpm/@types+supertest@2.0.12/node_modules/@types/supertest/index.d.ts","../../src/supertest/createSupertestSharedClient.ts","../../src/supertest/index.ts"],"fileInfos":[{"version":"f59215c5f1d886b05395ee7aca73e0ac69ddfad2843aa88530e797879d511bad","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","27147504487dc1159369da4f4da8a26406364624fa9bc3db632f7d94a5bae2c3","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"3dda5344576193a4ae48b8d03f105c86f20b2f2aff0a1d1fd7935f5d68649654","affectsGlobalScope":true},{"version":"9d9885c728913c1d16e0d2831b40341d6ad9a0ceecaabc55209b306ad9c736a5","affectsGlobalScope":true},{"version":"17bea081b9c0541f39dd1ae9bc8c78bdd561879a682e60e2f25f688c0ecab248","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":"f06948deb2a51aae25184561c9640fb66afeddb34531a9212d011792b1d19e0a","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":"a33b0928d741f3cc2d9d375350cb6d57d074323ba282d424d3aa0c89fd764eb6","signature":"a01ce36a4fa79bb209996f311b56369233c709c1ff49c056f768751b69ddab09"},{"version":"fc5f108e945ccda3f5ccf6f05ce84f9aaf0d51f8988a2994abe1af71c88524fa","signature":"44a17461f4133206989c5b56a7ed0d77d485f866c43afa5b144a2a1587fe0150"},{"version":"454671610b0389f294e74f0ffbf4d72c926d9e11da889d359674ae4e3224ef6b","signature":"70aad179112a492efbeed445504038ea12e90db5f6ecf452bd13b606e9263cd9"},{"version":"76c0556d36524e5a16ef84d239fb3992c7cdef0a5535f5f63349917cca1c414c","signature":"c4acec2b887b9279da570a4f056c51a61988231afabbd200590fff738e71e422"},{"version":"090107203b8abddb313ebf8e0791259ba3994cd9848e05bafd1e1eb8eac23311","signature":"e00cdcf103ee17e7f881640c0de60250dbbe5201452a786177992420d03955e7"},"1d729ea435a93e1a70519d06a6f13fa418c4c39a52b69e6db86750ebfcdf5554",{"version":"cc5a216ec084184c7888e53c94bcf6e6c01f1b069e879ca8cb1c4ed91eb9bd88","signature":"002ace4931001d9ea1f3717a109a41bf16dcfbb33fe8d9e848d8f2b791034eaf"},"2aa4a640d2afabc591928da1d45c45eedb060a69c17a90fa5e7fa0828aa15e27","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":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true},"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","f463d61cf39c3a6a5f96cdf7adfdb72a0b1d663f7b5d5b6dd042adba835430c2","f7a9cb83c8fbc081a8b605880d191e0d0527cde2c1b2b2b623beca8f0203a2cd","6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84",{"version":"740da0b5f25141d6fd70b215899faea3108db0e61ace8c2636fe3ad129a5182a","signature":"1ebb58c3210e488446f87753fe1998eeab336feaea8aeb1fae67e173a42a03da"},"fa00eede2b2640bcfec133440377a75fc7d4647affa0aa68d1dad3626ec441db",{"version":"69571e322ffb287ea739ba2a674369b3790974f717e8a47d969f84543cde2da2","signature":"4714df73aa332341fd02da657beb85950e4c60eed5c7520b203e5b52b15ed992"},"d782e571cb7d6ec0f0645957ed843d00e3f8577e08cc2940f400c931bc47a8df","9167246623f181441e6116605221268d94e33a1ebd88075e2dc80133c928ae7e","dc1a838d8a514b6de9fbce3bd5e6feb9ccfe56311e9338bb908eb4d0d966ecaf","186f09ed4b1bc1d5a5af5b1d9f42e2d798f776418e82599b3de16423a349d184","d692ae73951775d2448df535ce8bc8abf162dc343911fedda2c37b8de3b20d8e",{"version":"8a804c372ae43a1e5c4a36b6acfbff9beb8e61a31db60f4bbddb12054a98244e","signature":"e3e111e077027bc3f8ed326df065b482b1a23d9fc67df36c3abb14876acea721"},"8b3b10df45a1ec07333e61a4b2ed7c01a2ca295688db942bc1220d328c86eb72","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":"4cbf318f7c1f298841bf4c5458869bb69e4b8dc8b18250af718bca02d232f3b8","signature":"c20dcccad05651d65e749c164c2cd88a3fb35d46a4595a6633bfaa00bf9e35de"},"5379bd2adb109cb6c15e7f0367c2eb1986d837f9977f50915afe4fc1759522ba","8d48b8f8a377ade8dd1f000625bc276eea067f2529cc9cafdf082d17142107d6","214f291323316651737db8ca0db4c14ae568a429e59fc5b4f364dd80fe72d5f6","76232dbb982272b182a76ad8745a9b02724dc9896e2328ce360e2c56c64c9778",{"version":"59f881f3204250aa6778e81a5e81e777f4684b92160b78a127a91f7016bde8c6","signature":"a03049a303d95f933af688a1c541867127a1226a4a200325369c02a39320bab7"},"c16631ce27bbed5b2fe93a3b5a9b76c22b64c909633e9f9a2cca997bc890ac51"],"root":[[58,63],65,66,[133,135],141,142,172,173,177,178],"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":[[86,113,120,130],[86,113,120],[113],[83,86,113,120,122,123,124],[113,124,125,129,131],[113,127],[113,126],[67,113],[70,113],[71,76,104,113],[72,83,84,91,101,112,113],[72,73,83,91,113],[74,113],[75,76,84,92,113],[76,101,109,113],[77,79,83,91,113],[78,113],[79,80,113],[83,113],[81,83,113],[83,84,85,101,112,113],[83,84,85,98,101,104,113],[113,117],[79,86,91,101,112,113],[83,84,86,87,91,101,109,112,113],[86,88,101,109,112,113],[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,119],[83,89,113],[90,112,113],[79,83,91,101,113],[92,113],[93,113],[70,94,113],[95,111,113,117],[96,113],[97,113],[83,98,99,113],[98,100,113,115],[71,83,101,102,103,104,113],[71,101,103,113],[101,102,113],[104,113],[105,113],[83,107,108,113],[107,108,113],[76,91,101,109,113],[110,113],[91,111,113],[71,86,97,112,113],[76,113],[101,113,114],[113,115],[113,116],[71,76,83,85,94,101,112,113,115,117],[101,113,118],[84,101,113,120,121],[86,113,120,127,128],[71,84,86,101,113,120,174],[113,175],[113,137,138],[86,113,120,136,139],[113,170],[57,113],[57,113,144,169],[113,146,169],[57,113,145,146,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168],[57,113,146,147,169],[57,113,146,147],[57,113,146,169],[57,113,146],[113,146],[57,113,146,158,169],[57,113,146,152,162,169],[56,113],[45,46,56,113],[47,48,113],[45,46,47,49,50,54,113],[46,47,113],[55,113],[47,113],[45,46,47,50,51,52,53,113],[59,62,63,64,113],[65,113],[57,58,59,113],[59,60,113],[57,58,113],[57,59,62,63,113,132],[113,133],[59,62,63,113,135,140],[113,141],[58,59,60,61,113],[57,62,113,143,171],[113,172],[62,113,176],[113,177],[57,59,60,113],[62,63,64],[57,58,59],[59,60],[57,58],[57,59,62,63,132],[62,63,140],[58,59,60,61],[57,62,143],[62,176]],"referencedMap":[[131,1],[130,2],[174,3],[125,4],[132,5],[128,3],[121,3],[126,6],[127,7],[67,8],[68,8],[70,9],[71,10],[72,11],[73,12],[74,13],[75,14],[76,15],[77,16],[78,17],[79,18],[80,18],[82,19],[81,20],[83,19],[84,21],[85,22],[69,23],[119,3],[86,24],[87,25],[88,26],[120,27],[89,28],[90,29],[91,30],[92,31],[93,32],[94,33],[95,34],[96,35],[97,36],[98,37],[99,37],[100,38],[101,39],[103,40],[102,41],[104,42],[105,43],[106,3],[107,44],[108,45],[109,46],[110,47],[111,48],[112,49],[113,50],[114,51],[115,52],[116,53],[117,54],[118,55],[124,3],[123,3],[122,56],[129,57],[175,58],[176,59],[64,3],[137,3],[139,60],[138,3],[136,3],[140,61],[143,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],[171,62],[144,63],[146,64],[147,65],[169,66],[145,3],[148,67],[149,68],[150,3],[151,3],[152,63],[153,69],[154,70],[155,69],[156,63],[157,3],[158,71],[159,72],[160,68],[161,69],[163,73],[164,67],[162,68],[165,69],[166,3],[167,69],[168,3],[170,64],[57,74],[47,75],[49,76],[55,77],[51,3],[52,3],[50,78],[53,74],[45,3],[46,3],[56,79],[48,80],[54,81],[65,82],[66,83],[60,84],[61,85],[59,86],[133,87],[134,88],[141,89],[142,90],[135,3],[62,91],[172,92],[173,93],[58,3],[177,94],[178,95],[63,96]],"exportedModulesMap":[[131,1],[130,2],[174,3],[125,4],[132,5],[128,3],[121,3],[126,6],[127,7],[67,8],[68,8],[70,9],[71,10],[72,11],[73,12],[74,13],[75,14],[76,15],[77,16],[78,17],[79,18],[80,18],[82,19],[81,20],[83,19],[84,21],[85,22],[69,23],[119,3],[86,24],[87,25],[88,26],[120,27],[89,28],[90,29],[91,30],[92,31],[93,32],[94,33],[95,34],[96,35],[97,36],[98,37],[99,37],[100,38],[101,39],[103,40],[102,41],[104,42],[105,43],[106,3],[107,44],[108,45],[109,46],[110,47],[111,48],[112,49],[113,50],[114,51],[115,52],[116,53],[117,54],[118,55],[124,3],[123,3],[122,56],[129,57],[175,58],[176,59],[64,3],[137,3],[139,60],[138,3],[136,3],[140,61],[143,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],[171,62],[144,63],[146,64],[147,65],[169,66],[145,3],[148,67],[149,68],[150,3],[151,3],[152,63],[153,69],[154,70],[155,69],[156,63],[157,3],[158,71],[159,72],[160,68],[161,69],[163,73],[164,67],[162,68],[165,69],[166,3],[167,69],[168,3],[170,64],[57,74],[47,75],[49,76],[55,77],[51,3],[52,3],[50,78],[53,74],[45,3],[46,3],[56,79],[48,80],[54,81],[65,97],[66,83],[60,98],[61,99],[59,100],[133,101],[134,88],[141,102],[142,90],[62,103],[172,104],[173,93],[177,105],[178,95],[63,99]],"semanticDiagnosticsPerFile":[131,130,174,125,132,128,121,126,127,67,68,70,71,72,73,74,75,76,77,78,79,80,82,81,83,84,85,69,119,86,87,88,120,89,90,91,92,93,94,95,96,97,98,99,100,101,103,102,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,124,123,122,129,175,176,64,137,139,138,136,140,143,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,171,144,146,147,169,145,148,149,150,151,152,153,154,155,156,157,158,159,160,161,163,164,162,165,166,167,168,170,57,47,49,55,51,52,50,53,45,46,56,48,54,65,66,60,61,59,133,134,141,142,135,62,172,173,58,177,178,63]},"version":"5.1.3"} \ No newline at end of file diff --git a/esm/validations.d.ts b/esm/validations.d.ts new file mode 100644 index 0000000..ff09c5f --- /dev/null +++ b/esm/validations.d.ts @@ -0,0 +1,24 @@ +import type { HandlerParams } from "./configureCreateHttpClient.mjs"; +import type { UnknownSharedRoute } from "./defineRoutes.mjs"; +export type ValidationOptions = { + skipInputValidation?: boolean; + skipResponseValidation?: boolean; +}; +type ExtractFromExisting = Extract; +type CheckedSchema = ExtractFromExisting; +export declare const validateSchemaWithExplicitError: ({ checkedSchema, params, route, adapterName, responseStatus, withIssuesInMessage, }: { + checkedSchema: ExtractFromExisting; + params: unknown; + route: R; + adapterName: string; + responseStatus?: undefined; + withIssuesInMessage?: boolean | undefined; +}) => unknown; +export declare const validateInputParams: (route: UnknownSharedRoute, params: HandlerParams, adapterName: string, options?: { + withIssuesInMessage: boolean; +}) => { + queryParams: unknown; + body: unknown; + headers: unknown; +}; +export {}; diff --git a/esm/validations.mjs b/esm/validations.mjs new file mode 100644 index 0000000..0c97437 --- /dev/null +++ b/esm/validations.mjs @@ -0,0 +1,100 @@ +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)); +}; +var explicitError = function (_a) { + var _b; + var route = _a.route, error = _a.error, adapterName = _a.adapterName, checkedSchema = _a.checkedSchema, statusCode = _a.statusCode, withIssuesInMessage = _a.withIssuesInMessage; + var newError = new Error(__spreadArray([ + "Shared-route schema '".concat(checkedSchema, "' was not respected in adapter '").concat(adapterName, "'."), + checkedSchema === "responses" && + "Received status: ".concat(statusCode, ". Handled statuses: ").concat(Object.keys(route.responses).join(", "), "."), + "Route: ".concat(route.method.toUpperCase(), " ").concat(route.url) + ], __read((withIssuesInMessage && ((_b = error === null || error === void 0 ? void 0 : error.issues) === null || _b === void 0 ? void 0 : _b.length) + ? ["Issues: " + issuesToString(error === null || error === void 0 ? void 0 : error.issues)] + : [])), false).filter(Boolean) + .join("\n")); + newError.cause = error; + return newError; +}; +export var validateSchemaWithExplicitError = function (_a) { + var checkedSchema = _a.checkedSchema, _b = _a.params, params = _b === void 0 ? {} : _b, route = _a.route, adapterName = _a.adapterName, responseStatus = _a.responseStatus, _c = _a.withIssuesInMessage, withIssuesInMessage = _c === void 0 ? false : _c; + try { + if (checkedSchema === "responses") { + if (!responseStatus) + throw new Error("a response status is required when validating responses"); + var schema = route[checkedSchema][responseStatus]; + if (!schema) + throw new Error("No schema found for this status."); + return schema.parse(params); + } + return route[checkedSchema].parse(params); + } + catch (error) { + throw explicitError({ + route: route, + error: error, + adapterName: adapterName, + checkedSchema: checkedSchema, + statusCode: responseStatus, + withIssuesInMessage: withIssuesInMessage, + }); + } +}; +export var validateInputParams = function (route, params, adapterName, options) { + if (options === void 0) { options = { + withIssuesInMessage: false, + }; } + var withIssuesInMessage = options.withIssuesInMessage; + var queryParams = validateSchemaWithExplicitError({ + adapterName: adapterName, + checkedSchema: "queryParamsSchema", + params: params.queryParams, + route: route, + withIssuesInMessage: withIssuesInMessage, + }); + var body = validateSchemaWithExplicitError({ + adapterName: adapterName, + checkedSchema: "requestBodySchema", + params: params.body, + route: route, + withIssuesInMessage: withIssuesInMessage, + }); + // we validate headers separately because we don't want to re-affect req.headers parsed value + // because we don't want to lose all other headers + validateSchemaWithExplicitError({ + adapterName: adapterName, + checkedSchema: "headersSchema", + params: params.headers, + route: route, + }); + return { queryParams: queryParams, body: body, headers: params.headers }; +}; +var issuesToString = function (issues) { + return issues.map(function (_a) { + var message = _a.message, path = _a.path; + return "".concat(path.join("."), ": ").concat(message); + }).join(" | "); +}; +//# sourceMappingURL=validations.mjs.map \ No newline at end of file diff --git a/esm/validations.mjs.map b/esm/validations.mjs.map new file mode 100644 index 0000000..69382ff --- /dev/null +++ b/esm/validations.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"validations.mjs","sourceRoot":"","sources":["../src/validations.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,IAAM,aAAa,GAAG,UAAC,EActB;;QAbC,KAAK,WAAA,EACL,KAAK,WAAA,EACL,WAAW,iBAAA,EACX,aAAa,mBAAA,EACb,UAAU,gBAAA,EACV,mBAAmB,yBAAA;IASnB,IAAM,QAAQ,GAAG,IAAI,KAAK,CACxB;QACE,+BAAwB,aAAa,6CAAmC,WAAW,OAAI;QACvF,aAAa,KAAK,WAAW;YAC3B,2BAAoB,UAAU,iCAAuB,MAAM,CAAC,IAAI,CAC9D,KAAK,CAAC,SAAS,CAChB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAG;QACjB,iBAAU,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,cAAI,KAAK,CAAC,GAAG,CAAE;cAChD,CAAC,mBAAmB,KAAI,MAAC,KAAa,aAAb,KAAK,uBAAL,KAAK,CAAU,MAAM,0CAAE,MAAM,CAAA;QACvD,CAAC,CAAC,CAAC,UAAU,GAAG,cAAc,CAAE,KAAa,aAAb,KAAK,uBAAL,KAAK,CAAU,MAAM,CAAC,CAAC;QACvD,CAAC,CAAC,EAAE,CAAC,UAEN,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;IACD,QAAgB,CAAC,KAAK,GAAG,KAAK,CAAC;IAChC,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,+BAA+B,GAAG,UAA+B,EAiB7E;QAhBC,aAAa,mBAAA,EACb,cAAW,EAAX,MAAM,mBAAG,EAAE,KAAA,EACX,KAAK,WAAA,EACL,WAAW,iBAAA,EACX,cAAc,oBAAA,EACd,2BAA2B,EAA3B,mBAAmB,mBAAG,KAAK,KAAA;IAY3B,IAAI;QACF,IAAI,aAAa,KAAK,WAAW,EAAE;YACjC,IAAI,CAAC,cAAc;gBACjB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC7E,IAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,cAAc,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACjE,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAC7B;QACD,OAAO,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KAC3C;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,aAAa,CAAC;YAClB,KAAK,OAAA;YACL,KAAK,OAAA;YACL,WAAW,aAAA;YACX,aAAa,eAAA;YACb,UAAU,EAAE,cAAc;YAC1B,mBAAmB,qBAAA;SACpB,CAAC,CAAC;KACJ;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,mBAAmB,GAAG,UACjC,KAAyB,EACzB,MAAyC,EACzC,WAAmB,EACnB,OAEC;IAFD,wBAAA,EAAA;QACE,mBAAmB,EAAE,KAAK;KAC3B;IAEO,IAAA,mBAAmB,GAAK,OAAO,oBAAZ,CAAa;IACxC,IAAM,WAAW,GAAG,+BAA+B,CAAC;QAClD,WAAW,aAAA;QACX,aAAa,EAAE,mBAAmB;QAClC,MAAM,EAAE,MAAM,CAAC,WAAW;QAC1B,KAAK,OAAA;QACL,mBAAmB,qBAAA;KACpB,CAAC,CAAC;IAEH,IAAM,IAAI,GAAG,+BAA+B,CAAC;QAC3C,WAAW,aAAA;QACX,aAAa,EAAE,mBAAmB;QAClC,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,KAAK,OAAA;QACL,mBAAmB,qBAAA;KACpB,CAAC,CAAC;IAEH,6FAA6F;IAC7F,kDAAkD;IAClD,+BAA+B,CAAC;QAC9B,WAAW,aAAA;QACX,aAAa,EAAE,eAAe;QAC9B,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,KAAK,OAAA;KACN,CAAC,CAAC;IAEH,OAAO,EAAE,WAAW,aAAA,EAAE,IAAI,MAAA,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AACxD,CAAC,CAAC;AAEF,IAAM,cAAc,GAAG,UAAC,MAAkB;IACxC,OAAA,MAAM,CAAC,GAAG,CAAC,UAAC,EAAiB;YAAf,OAAO,aAAA,EAAE,IAAI,UAAA;QAAO,OAAA,UAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,eAAK,OAAO,CAAE;IAA/B,CAA+B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AAA9E,CAA8E,CAAC"} \ No newline at end of file diff --git a/express/createExpressSharedRouter.d.ts b/express/createExpressSharedRouter.d.ts new file mode 100644 index 0000000..659deae --- /dev/null +++ b/express/createExpressSharedRouter.d.ts @@ -0,0 +1,8 @@ +import type { IRoute, RequestHandler, Router } from "express"; +import type { PathParameters, UnknownSharedRoute } from ".."; +import { z } from "zod"; +import { ValidationOptions } from "../validations"; +import { ValueOf } from "../defineRoutes"; +type ExpressSharedRouterOptions = Pick; +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; +export {}; diff --git a/express/createExpressSharedRouter.js b/express/createExpressSharedRouter.js new file mode 100644 index 0000000..c6d9c0c --- /dev/null +++ b/express/createExpressSharedRouter.js @@ -0,0 +1,72 @@ +"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 validations_1 = require("../validations"); +var makeValidationMiddleware = function (route, options) { + return function (req, res, next) { + try { + if (!options.skipInputValidation) { + var validatedParams = (0, validations_1.validateInputParams)(route, { body: req.body, headers: req.headers, queryParams: req.query }, "express"); + req.body = validatedParams.body; + req.query = validatedParams.queryParams; + req.headers = validatedParams.headers; + } + next(); + } + catch (error) { + var zodError = error.cause; + res.status(400); + res.json({ + status: 400, + message: error.message, + issues: Array.from(new Set(zodIssuesToStrings(zodError.issues))), + }); + } + }; +}; +var zodIssuesToStrings = function (zodIssues) { + return zodIssues.flatMap(function (zodIssue) { + if (zodIssue.code === "invalid_union") { + return zodIssue.unionErrors.flatMap(function (_a) { + var issues = _a.issues; + return zodIssuesToStrings(issues); + }); + } + var message = zodIssue.message, path = zodIssue.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; +}; +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..51a0c8b --- /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;AAE1B,8CAAwE;AAKxE,IAAM,wBAAwB,GAC5B,UAAC,KAAyB,EAAE,OAAmC;IAC/D,OAAA,UAAC,GAAG,EAAE,GAAG,EAAE,IAAI;QACb,IAAI;YACF,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;gBAChC,IAAM,eAAe,GAAG,IAAA,iCAAmB,EACzC,KAAK,EACL,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,KAAK,EAAE,EAChE,SAAS,CACV,CAAC;gBACF,GAAG,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC;gBAChC,GAAG,CAAC,KAAK,GAAG,eAAe,CAAC,WAAkB,CAAC;gBAC/C,GAAG,CAAC,OAAO,GAAG,eAAe,CAAC,OAAc,CAAC;aAC9C;YACD,IAAI,EAAE,CAAC;SACR;QAAC,OAAO,KAAU,EAAE;YACnB,IAAM,QAAQ,GAAG,KAAK,CAAC,KAAiB,CAAC;YACzC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;aACjE,CAAC,CAAC;SACJ;IACH,CAAC;AAtBD,CAsBC,CAAC;AAEJ,IAAM,kBAAkB,GAAG,UAAC,SAAqB;IAC/C,OAAO,SAAS,CAAC,OAAO,CAAC,UAAC,QAAQ;QAChC,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,EAAE;YACrC,OAAO,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,UAAC,EAAU;oBAAR,MAAM,YAAA;gBAAO,OAAA,kBAAkB,CAAC,MAAM,CAAC;YAA1B,CAA0B,CAAC,CAAC;SACjF;QAEO,IAAA,OAAO,GAAW,QAAQ,QAAnB,EAAE,IAAI,GAAK,QAAQ,KAAb,CAAc;QACnC,OAAO,UAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAM,OAAO,CAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,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;IAEpC,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,mBAAmB,CAAC;AAC7B,CAAC,CAAC;AA3BW,QAAA,yBAAyB,6BA2BpC"} \ 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..6d2f5ed --- /dev/null +++ b/fetch/createFetchSharedClient.d.ts @@ -0,0 +1,13 @@ +import type { UnknownSharedRoute, Url } from ".."; +import { HandlerCreator } from ".."; +import type nodeFetch from "node-fetch"; +import type { Response as FetchResponse } from "node-fetch"; +import { ValidationOptions } from "../validations"; +declare function browserFetch(input: RequestInfo | URL, init?: RequestInit): Promise; +type Fetch = typeof browserFetch | typeof nodeFetch; +type FetchConfig = RequestInit & { + baseURL?: Url; +} & ValidationOptions; +export declare const createFetchHandlerCreator: >(fetch: Fetch, options?: FetchConfig) => HandlerCreator; +export declare const createFetchSharedClient: >(sharedRouters: SharedRoutes, fetch: Fetch, config?: FetchConfig) => import("..").HttpClient; +export {}; diff --git a/fetch/createFetchSharedClient.js b/fetch/createFetchSharedClient.js new file mode 100644 index 0000000..ef0f85f --- /dev/null +++ b/fetch/createFetchSharedClient.js @@ -0,0 +1,132 @@ +"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.createFetchSharedClient = exports.createFetchHandlerCreator = void 0; +var __1 = require(".."); +var queryParamsToString_1 = require("./queryParamsToString"); +var validations_1 = require("../validations"); +var createFetchHandlerCreator = function (fetch, options) { + if (options === void 0) { options = {}; } + return function (routeName, routes, replaceParamsInUrl) { + return function (_a) { + if (_a === void 0) { _a = {}; } + return __awaiter(void 0, void 0, void 0, function () { + var route, _b, body, headers, queryParams, bodyAsString, stringQueryParams, baseURL, defaultInit, res, processedBody, responseBody; + var urlParams = _a.urlParams, params = __rest(_a, ["urlParams"]); + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + route = routes[routeName]; + _b = options.skipInputValidation + ? params + : (0, validations_1.validateInputParams)(route, params, "fetch", { withIssuesInMessage: true }), body = _b.body, headers = _b.headers, queryParams = _b.queryParams; + bodyAsString = JSON.stringify(body); + stringQueryParams = queryParams && Object.keys(queryParams).length > 0 + ? "?" + (0, queryParamsToString_1.queryParamsToString)(queryParams) + : ""; + baseURL = options.baseURL, defaultInit = __rest(options, ["baseURL"]); + return [4 /*yield*/, fetch((baseURL ? baseURL : "") + + replaceParamsInUrl(route.url, urlParams) + + stringQueryParams, __assign(__assign(__assign(__assign({}, defaultInit), { method: route.method }), (bodyAsString !== "{}" ? { body: bodyAsString } : {})), { headers: __assign(__assign({ "Content-Type": "application/json" }, defaultInit === null || defaultInit === void 0 ? void 0 : defaultInit.headers), (headers !== null && headers !== void 0 ? headers : {})) }))]; + case 1: + res = _c.sent(); + return [4 /*yield*/, responseTypeToResponseBody(res, route.responseType)]; + case 2: + processedBody = _c.sent(); + responseBody = options.skipResponseValidation + ? processedBody + : (0, validations_1.validateSchemaWithExplicitError)({ + adapterName: "fetch", + checkedSchema: "responses", + responseStatus: res.status, + params: processedBody, + route: route, + withIssuesInMessage: true, + }); + return [2 /*return*/, { body: responseBody, status: res.status }]; + } + }); + }); + }; + }; +}; +exports.createFetchHandlerCreator = createFetchHandlerCreator; +var responseTypeToResponseBody = function (res, responseType) { + switch (responseType) { + case "json": + return res.json(); + case "text": + return res.text(); + case "blob": + return res.blob(); + case "arrayBuffer": + return res.arrayBuffer(); + default: { + var exhaustiveCheck = responseType; + return exhaustiveCheck; + } + } +}; +var createFetchSharedClient = function (sharedRouters, fetch, config) { + if (config === void 0) { config = {}; } + return (0, __1.configureCreateHttpClient)((0, exports.createFetchHandlerCreator)(fetch, config))(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..2e9b572 --- /dev/null +++ b/fetch/createFetchSharedClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createFetchSharedClient.js","sourceRoot":"","sources":["../src/fetch/createFetchSharedClient.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/fetch/index.d.ts b/fetch/index.d.ts new file mode 100644 index 0000000..01dec98 --- /dev/null +++ b/fetch/index.d.ts @@ -0,0 +1 @@ +export { createFetchSharedClient } from "./createFetchSharedClient"; diff --git a/fetch/index.js b/fetch/index.js new file mode 100644 index 0000000..8588604 --- /dev/null +++ b/fetch/index.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createFetchSharedClient = void 0; +var createFetchSharedClient_1 = require("./createFetchSharedClient"); +Object.defineProperty(exports, "createFetchSharedClient", { enumerable: true, get: function () { return createFetchSharedClient_1.createFetchSharedClient; } }); +//# 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..84b3586 --- /dev/null +++ b/fetch/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/fetch/index.ts"],"names":[],"mappings":";;;AAAA,qEAAoE;AAA3D,kIAAA,uBAAuB,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..f062b87 --- /dev/null +++ b/openapi/createOpenApiGenerator.d.ts @@ -0,0 +1,49 @@ +import { OpenAPIV3_1 as OpenAPI } from "openapi-types"; +import { z } from "zod"; +import { PathParameters, UnknownSharedRoute } from ".."; +type OmitFromExisting = Omit; +type Examples = { + [media: string]: OpenAPI.ExampleObject & { + value?: T; + }; +}; +type WithExampleOrExamples = { + example?: T; + examples?: never; +} | { + example?: never; + examples?: Examples; +}; +type OpenApiBody = Pick & { + example?: T; + examples?: Examples; +}; +type ExtraDocParameter = Partial> & WithExampleOrExamples; +type CreateOpenApiGenerator = ; +}, SecuritySchemeName extends string>(sharedRoutesByTag: SharedRoutesByTag, openApiRootDoc: Omit & { + components?: OmitFromExisting & { + securitySchemes?: Record; + }; +}) => (extraDataByRoute: Partial<{ + [Tag in keyof SharedRoutesByTag]: { + [R in keyof SharedRoutesByTag[Tag]]: OmitFromExisting & { + extraDocs: { + securitySchemeToApply?: SecuritySchemeName[]; + urlParams?: PathParameters extends Record ? never : Record, ExtraDocParameter>; + body?: z.infer extends void ? never : OpenApiBody>; + queryParams?: z.infer extends void ? never : { + [K in keyof z.infer]: ExtraDocParameter[K]>; + }; + headerParams?: z.infer extends void ? never : { + [K in keyof z.infer]: ExtraDocParameter[K]>; + }; + responses: { + [S in keyof SharedRoutesByTag[Tag][R]["responses"]]: OpenAPI.ResponseObject & WithExampleOrExamples>; + }; + }; + }; + }; +}>) => OpenAPI.Document; +export declare const createOpenApiGenerator: CreateOpenApiGenerator; +export {}; diff --git a/openapi/createOpenApiGenerator.js b/openapi/createOpenApiGenerator.js new file mode 100644 index 0000000..3ee11f8 --- /dev/null +++ b/openapi/createOpenApiGenerator.js @@ -0,0 +1,151 @@ +"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 zod_to_json_schema_1 = require("zod-to-json-schema"); +var __1 = require(".."); +var extractFromOpenApiBody = function (openApiRequestBody) { + if (openApiRequestBody === void 0) { openApiRequestBody = {}; } + var examples = openApiRequestBody.examples, example = openApiRequestBody.example, rest = __rest(openApiRequestBody, ["examples", "example"]); + return { + withRequestBodyExemple: __assign(__assign({}, (example && { example: example })), (examples && { examples: examples })), + requestBodyDocs: rest, + }; +}; +var createOpenApiGenerator = function (sharedRoutesByTag, openApiRootDoc) { return function (extraDataByRoute) { return (__assign(__assign({}, openApiRootDoc), { paths: (0, __1.keys)(sharedRoutesByTag).reduce(function (rootAcc, tag) { + var sharedRoutes = sharedRoutesByTag[tag]; + return __assign(__assign({}, rootAcc), (0, __1.keys)(sharedRoutes).reduce(function (acc, routeName) { + var _a, _b; + var _c, _d; + var route = sharedRoutes[routeName]; + var _e = (_d = (_c = extraDataByRoute[tag]) === null || _c === void 0 ? void 0 : _c[routeName]) !== null && _d !== void 0 ? _d : {}, extraDocs = _e.extraDocs, extraDataForRoute = __rest(_e, ["extraDocs"]); + var _f = extractFromUrl(route.url, extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.urlParams), formattedUrl = _f.formattedUrl, pathParams = _f.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); + var _g = extractFromOpenApiBody(extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.body), withRequestBodyExemple = _g.withRequestBodyExemple, requestBodyDocs = _g.requestBodyDocs; + return __assign(__assign({}, acc), (_a = {}, _a[formattedUrl] = __assign(__assign({}, acc[formattedUrl]), (_b = {}, _b[route.method] = __assign(__assign(__assign(__assign(__assign(__assign({}, extraDataForRoute), { tags: [tag] }), ((extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.securitySchemeToApply) && + securitySchemeNamesToSecurity(extraDocs.securitySchemeToApply))), (parameters.length > 0 && { + parameters: parameters, + })), (!isShapeObjectEmpty(route.requestBodySchema) && { + requestBody: { + required: true, + content: { + "application/json": __assign(__assign({}, withRequestBodyExemple), { schema: __assign(__assign({}, requestBodyDocs), zodToOpenApi(route.requestBodySchema)) }), + }, + }, + })), { responses: (0, __1.keys)(route.responses).reduce(function (acc, status) { + var _a; + var _b, _c; + var responseSchema = zodToOpenApi(route.responses[status]); + var responseSchemaType = responseSchema.type; + var _d = (_c = (_b = extraDocs === null || extraDocs === void 0 ? void 0 : extraDocs.responses) === null || _b === void 0 ? void 0 : _b[status]) !== null && _c !== void 0 ? _c : {}, example = _d.example, examples = _d.examples, responseDoc = __rest(_d, ["example", "examples"]); + return __assign(__assign({}, acc), (_a = {}, _a[status.toString()] = __assign(__assign({}, responseDoc), (responseSchemaType !== undefined && { + content: { + "application/json": __assign(__assign(__assign({}, (example && { example: example })), (examples && { examples: examples })), { schema: responseSchema }), + }, + })), _a)); + }, {}) }), _b)), _a)); + }, {})); + }, {}) })); }; }; +exports.createOpenApiGenerator = createOpenApiGenerator; +var extractFromUrl = function (url, extraUrlParameters) { + var pathParams = []; + var formattedUrl = url.replace(/:(.*?)(\/|$)/g, function (_match, group1, group2) { + var _a; + var extraDocForParam = extraUrlParameters === null || extraUrlParameters === void 0 ? void 0 : extraUrlParameters[group1]; + pathParams.push(__assign(__assign({}, extraDocForParam), { 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, { + $refStrategy: "none", + }), $schema = _a.$schema, additionalProperties = _a.additionalProperties, rest = __rest(_a, ["$schema", "additionalProperties"]); + 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 securitySchemeNamesToSecurity = function (securitySchemeToApply) { return ({ + security: securitySchemeToApply.reduce(function (securityAcc, securitySchemeName) { + var _a; + return __spreadArray(__spreadArray([], __read(securityAcc), false), [(_a = {}, _a[securitySchemeName] = [], _a)], false); + }, []), +}); }; +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..5e5c97a --- /dev/null +++ b/openapi/createOpenApiGenerator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createOpenApiGenerator.js","sourceRoot":"","sources":["../src/openapi/createOpenApiGenerator.ts"],"names":[],"mappings":"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"} \ 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 b86e228..f76044c 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 -p test", - "build": "pnpm build:cjs && pnpm build:esm # && pnpm 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", - "make-lib-linkable": "pnpm build:cjs && pnpm build:esm && ts-node --skipProject scripts/make-dist-linkable.ts", - "prepare": "husky install" - }, "lint-staged": { "*.{ts,tsx}": [ "eslint --fix" @@ -38,9 +22,126 @@ "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", + "src/validations.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", + "esm/validations.d.ts", + "esm/validations.mjs", + "esm/validations.mjs.map", + "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", + "validations.d.ts", + "validations.js", + "validations.js.map" ], "keywords": [], "homepage": "https://jeromebu.gitbook.io/shared-routes", @@ -75,39 +176,39 @@ "zod": "^3.21.4", "zod-to-json-schema": "^3.21.0" }, - "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..2844bf8 --- /dev/null +++ b/supertest/createSupertestSharedClient.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.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 () { + var result; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: return [4 /*yield*/, supertestRequestToCorrectHttpMethod(supertestRequest, route.method)(replaceParamsInUrl(route.url, urlParams)) + .send(body) + .set(headers !== null && headers !== void 0 ? headers : {}) + .query(queryParams)]; + case 1: + result = _c.sent(); + return [2 /*return*/, __assign({ status: result.status, body: result.body }, (!Object.keys(route.responses).includes(result.status.toString()) && { + text: result.text, + }))]; + } + }); + }); + }; + }; +}; +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..7769b09 --- /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;;;;;gCACpC,qBAAM,mCAAmC,CACtD,gBAAgB,EAChB,KAAK,CAAC,MAAM,CACb,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;iCACxC,IAAI,CAAC,IAAI,CAAC;iCACV,GAAG,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;iCAClB,KAAK,CAAC,WAAW,CAAC,EAAA;;4BANf,MAAM,GAAG,SAMM;4BAErB,iCACE,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,IAAI,EAAE,MAAM,CAAC,IAAI,IACd,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI;oCACtE,IAAI,EAAE,MAAM,CAAC,IAAI;iCAClB,CAAC,GACF;;;;SACH,CAAC;IACJ,CAAC;AAnBD,CAmBC,CAAC;AArBS,QAAA,6BAA6B,iCAqBtC;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..a6a68bb --- /dev/null +++ b/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es5.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.dom.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/.pnpm/typescript@5.1.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/helpers/typeAliases.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/helpers/util.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/ZodError.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/locales/en.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/errors.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/helpers/parseUtil.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/helpers/enumUtil.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/helpers/errorUtil.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/helpers/partialUtil.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/types.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/external.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/lib/index.d.ts","../node_modules/.pnpm/zod@3.21.4/node_modules/zod/index.d.ts","../src/pathParameters.ts","../src/defineRoutes.ts","../src/configureCreateHttpClient.ts","../src/createCustomSharedClient.ts","../src/index.ts","../src/validations.ts","../node_modules/.pnpm/axios@1.4.0/node_modules/axios/index.d.ts","../src/axios/createAxiosSharedClient.ts","../src/axios/index.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/assert.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/assert/strict.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/globals.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/async_hooks.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/buffer.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/child_process.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/cluster.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/console.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/constants.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/crypto.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/dgram.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/dns.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/dns/promises.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/domain.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/dom-events.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/events.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/fs.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/fs/promises.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/http.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/http2.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/https.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/inspector.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/module.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/net.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/os.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/path.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/perf_hooks.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/process.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/punycode.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/querystring.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/readline.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/readline/promises.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/repl.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/stream.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/stream/promises.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/stream/consumers.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/stream/web.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/string_decoder.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/test.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/timers.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/timers/promises.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/tls.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/trace_events.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/tty.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/url.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/util.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/v8.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/vm.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/wasi.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/worker_threads.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/zlib.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/globals.global.d.ts","../node_modules/.pnpm/@types+node@18.14.0/node_modules/@types/node/index.d.ts","../node_modules/.pnpm/@types+mime@1.3.2/node_modules/@types/mime/index.d.ts","../node_modules/.pnpm/@types+send@0.17.1/node_modules/@types/send/index.d.ts","../node_modules/.pnpm/@types+range-parser@1.2.4/node_modules/@types/range-parser/index.d.ts","../node_modules/.pnpm/@types+qs@6.9.7/node_modules/@types/qs/index.d.ts","../node_modules/.pnpm/@types+express-serve-static-core@4.17.35/node_modules/@types/express-serve-static-core/index.d.ts","../node_modules/.pnpm/@types+mime@3.0.1/node_modules/@types/mime/Mime.d.ts","../node_modules/.pnpm/@types+mime@3.0.1/node_modules/@types/mime/index.d.ts","../node_modules/.pnpm/@types+http-errors@2.0.1/node_modules/@types/http-errors/index.d.ts","../node_modules/.pnpm/@types+serve-static@1.15.2/node_modules/@types/serve-static/index.d.ts","../node_modules/.pnpm/@types+connect@3.4.35/node_modules/@types/connect/index.d.ts","../node_modules/.pnpm/@types+body-parser@1.19.2/node_modules/@types/body-parser/index.d.ts","../node_modules/.pnpm/@types+express@4.17.17/node_modules/@types/express/index.d.ts","../src/express/createExpressSharedRouter.ts","../src/express/index.ts","../src/fetch/queryParamsToString.ts","../node_modules/.pnpm/formdata-polyfill@4.0.10/node_modules/formdata-polyfill/esm.min.d.ts","../node_modules/.pnpm/fetch-blob@3.2.0/node_modules/fetch-blob/file.d.ts","../node_modules/.pnpm/fetch-blob@3.2.0/node_modules/fetch-blob/index.d.ts","../node_modules/.pnpm/fetch-blob@3.2.0/node_modules/fetch-blob/from.d.ts","../node_modules/.pnpm/node-fetch@3.3.1/node_modules/node-fetch/@types/index.d.ts","../src/fetch/createFetchSharedClient.ts","../src/fetch/index.ts","../node_modules/.pnpm/openapi-types@12.1.0/node_modules/openapi-types/dist/index.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/Options.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/any.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/Refs.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/errorMessages.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/array.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/bigint.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/boolean.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/date.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/enum.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/intersection.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/literal.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/map.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/nativeEnum.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/never.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/null.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/nullable.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/number.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/object.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/string.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/record.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/set.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/tuple.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/undefined.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/union.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parsers/unknown.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/parseDef.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/src/zodToJsonSchema.d.ts","../node_modules/.pnpm/zod-to-json-schema@3.21.0_zod@3.21.4/node_modules/zod-to-json-schema/index.d.ts","../src/openapi/createOpenApiGenerator.ts","../src/openapi/index.ts","../node_modules/.pnpm/@types+cookiejar@2.1.2/node_modules/@types/cookiejar/index.d.ts","../node_modules/.pnpm/@types+superagent@4.1.18/node_modules/@types/superagent/index.d.ts","../node_modules/.pnpm/@types+supertest@2.0.12/node_modules/@types/supertest/index.d.ts","../src/supertest/createSupertestSharedClient.ts","../src/supertest/index.ts"],"fileInfos":[{"version":"f59215c5f1d886b05395ee7aca73e0ac69ddfad2843aa88530e797879d511bad","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","27147504487dc1159369da4f4da8a26406364624fa9bc3db632f7d94a5bae2c3","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"3dda5344576193a4ae48b8d03f105c86f20b2f2aff0a1d1fd7935f5d68649654","affectsGlobalScope":true},{"version":"9d9885c728913c1d16e0d2831b40341d6ad9a0ceecaabc55209b306ad9c736a5","affectsGlobalScope":true},{"version":"17bea081b9c0541f39dd1ae9bc8c78bdd561879a682e60e2f25f688c0ecab248","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":"f06948deb2a51aae25184561c9640fb66afeddb34531a9212d011792b1d19e0a","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":"a33b0928d741f3cc2d9d375350cb6d57d074323ba282d424d3aa0c89fd764eb6","signature":"a01ce36a4fa79bb209996f311b56369233c709c1ff49c056f768751b69ddab09"},{"version":"fc5f108e945ccda3f5ccf6f05ce84f9aaf0d51f8988a2994abe1af71c88524fa","signature":"44a17461f4133206989c5b56a7ed0d77d485f866c43afa5b144a2a1587fe0150"},{"version":"454671610b0389f294e74f0ffbf4d72c926d9e11da889d359674ae4e3224ef6b","signature":"70aad179112a492efbeed445504038ea12e90db5f6ecf452bd13b606e9263cd9"},{"version":"76c0556d36524e5a16ef84d239fb3992c7cdef0a5535f5f63349917cca1c414c","signature":"c4acec2b887b9279da570a4f056c51a61988231afabbd200590fff738e71e422"},{"version":"090107203b8abddb313ebf8e0791259ba3994cd9848e05bafd1e1eb8eac23311","signature":"e00cdcf103ee17e7f881640c0de60250dbbe5201452a786177992420d03955e7"},"1d729ea435a93e1a70519d06a6f13fa418c4c39a52b69e6db86750ebfcdf5554",{"version":"cc5a216ec084184c7888e53c94bcf6e6c01f1b069e879ca8cb1c4ed91eb9bd88","signature":"002ace4931001d9ea1f3717a109a41bf16dcfbb33fe8d9e848d8f2b791034eaf"},"2aa4a640d2afabc591928da1d45c45eedb060a69c17a90fa5e7fa0828aa15e27","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":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true},"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","f463d61cf39c3a6a5f96cdf7adfdb72a0b1d663f7b5d5b6dd042adba835430c2","f7a9cb83c8fbc081a8b605880d191e0d0527cde2c1b2b2b623beca8f0203a2cd","6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84",{"version":"740da0b5f25141d6fd70b215899faea3108db0e61ace8c2636fe3ad129a5182a","signature":"1ebb58c3210e488446f87753fe1998eeab336feaea8aeb1fae67e173a42a03da"},"fa00eede2b2640bcfec133440377a75fc7d4647affa0aa68d1dad3626ec441db",{"version":"69571e322ffb287ea739ba2a674369b3790974f717e8a47d969f84543cde2da2","signature":"4714df73aa332341fd02da657beb85950e4c60eed5c7520b203e5b52b15ed992"},"d782e571cb7d6ec0f0645957ed843d00e3f8577e08cc2940f400c931bc47a8df","9167246623f181441e6116605221268d94e33a1ebd88075e2dc80133c928ae7e","dc1a838d8a514b6de9fbce3bd5e6feb9ccfe56311e9338bb908eb4d0d966ecaf","186f09ed4b1bc1d5a5af5b1d9f42e2d798f776418e82599b3de16423a349d184","d692ae73951775d2448df535ce8bc8abf162dc343911fedda2c37b8de3b20d8e",{"version":"8a804c372ae43a1e5c4a36b6acfbff9beb8e61a31db60f4bbddb12054a98244e","signature":"e3e111e077027bc3f8ed326df065b482b1a23d9fc67df36c3abb14876acea721"},"8b3b10df45a1ec07333e61a4b2ed7c01a2ca295688db942bc1220d328c86eb72","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":"4cbf318f7c1f298841bf4c5458869bb69e4b8dc8b18250af718bca02d232f3b8","signature":"c20dcccad05651d65e749c164c2cd88a3fb35d46a4595a6633bfaa00bf9e35de"},"5379bd2adb109cb6c15e7f0367c2eb1986d837f9977f50915afe4fc1759522ba","8d48b8f8a377ade8dd1f000625bc276eea067f2529cc9cafdf082d17142107d6","214f291323316651737db8ca0db4c14ae568a429e59fc5b4f364dd80fe72d5f6","76232dbb982272b182a76ad8745a9b02724dc9896e2328ce360e2c56c64c9778",{"version":"59f881f3204250aa6778e81a5e81e777f4684b92160b78a127a91f7016bde8c6","signature":"a03049a303d95f933af688a1c541867127a1226a4a200325369c02a39320bab7"},"c16631ce27bbed5b2fe93a3b5a9b76c22b64c909633e9f9a2cca997bc890ac51"],"root":[[58,63],65,66,[133,135],141,142,172,173,177,178],"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":[[86,113,120,130],[86,113,120],[113],[83,86,113,120,122,123,124],[113,124,125,129,131],[113,127],[113,126],[67,113],[70,113],[71,76,104,113],[72,83,84,91,101,112,113],[72,73,83,91,113],[74,113],[75,76,84,92,113],[76,101,109,113],[77,79,83,91,113],[78,113],[79,80,113],[83,113],[81,83,113],[83,84,85,101,112,113],[83,84,85,98,101,104,113],[113,117],[79,86,91,101,112,113],[83,84,86,87,91,101,109,112,113],[86,88,101,109,112,113],[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,119],[83,89,113],[90,112,113],[79,83,91,101,113],[92,113],[93,113],[70,94,113],[95,111,113,117],[96,113],[97,113],[83,98,99,113],[98,100,113,115],[71,83,101,102,103,104,113],[71,101,103,113],[101,102,113],[104,113],[105,113],[83,107,108,113],[107,108,113],[76,91,101,109,113],[110,113],[91,111,113],[71,86,97,112,113],[76,113],[101,113,114],[113,115],[113,116],[71,76,83,85,94,101,112,113,115,117],[101,113,118],[84,101,113,120,121],[86,113,120,127,128],[71,84,86,101,113,120,174],[113,175],[113,137,138],[86,113,120,136,139],[113,170],[57,113],[57,113,144,169],[113,146,169],[57,113,145,146,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168],[57,113,146,147,169],[57,113,146,147],[57,113,146,169],[57,113,146],[113,146],[57,113,146,158,169],[57,113,146,152,162,169],[56,113],[45,46,56,113],[47,48,113],[45,46,47,49,50,54,113],[46,47,113],[55,113],[47,113],[45,46,47,50,51,52,53,113],[59,62,63,64,113],[65,113],[57,58,59,113],[59,60,113],[57,58,113],[57,59,62,63,113,132],[113,133],[59,62,63,113,135,140],[113,141],[58,59,60,61,113],[57,62,113,143,171],[113,172],[62,113,176],[113,177],[57,59,60,113],[62,63,64],[57,58,59],[59,60],[57,58],[57,59,62,63,132],[62,63,140],[58,59,60,61],[57,62,143],[62,176]],"referencedMap":[[131,1],[130,2],[174,3],[125,4],[132,5],[128,3],[121,3],[126,6],[127,7],[67,8],[68,8],[70,9],[71,10],[72,11],[73,12],[74,13],[75,14],[76,15],[77,16],[78,17],[79,18],[80,18],[82,19],[81,20],[83,19],[84,21],[85,22],[69,23],[119,3],[86,24],[87,25],[88,26],[120,27],[89,28],[90,29],[91,30],[92,31],[93,32],[94,33],[95,34],[96,35],[97,36],[98,37],[99,37],[100,38],[101,39],[103,40],[102,41],[104,42],[105,43],[106,3],[107,44],[108,45],[109,46],[110,47],[111,48],[112,49],[113,50],[114,51],[115,52],[116,53],[117,54],[118,55],[124,3],[123,3],[122,56],[129,57],[175,58],[176,59],[64,3],[137,3],[139,60],[138,3],[136,3],[140,61],[143,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],[171,62],[144,63],[146,64],[147,65],[169,66],[145,3],[148,67],[149,68],[150,3],[151,3],[152,63],[153,69],[154,70],[155,69],[156,63],[157,3],[158,71],[159,72],[160,68],[161,69],[163,73],[164,67],[162,68],[165,69],[166,3],[167,69],[168,3],[170,64],[57,74],[47,75],[49,76],[55,77],[51,3],[52,3],[50,78],[53,74],[45,3],[46,3],[56,79],[48,80],[54,81],[65,82],[66,83],[60,84],[61,85],[59,86],[133,87],[134,88],[141,89],[142,90],[135,3],[62,91],[172,92],[173,93],[58,3],[177,94],[178,95],[63,96]],"exportedModulesMap":[[131,1],[130,2],[174,3],[125,4],[132,5],[128,3],[121,3],[126,6],[127,7],[67,8],[68,8],[70,9],[71,10],[72,11],[73,12],[74,13],[75,14],[76,15],[77,16],[78,17],[79,18],[80,18],[82,19],[81,20],[83,19],[84,21],[85,22],[69,23],[119,3],[86,24],[87,25],[88,26],[120,27],[89,28],[90,29],[91,30],[92,31],[93,32],[94,33],[95,34],[96,35],[97,36],[98,37],[99,37],[100,38],[101,39],[103,40],[102,41],[104,42],[105,43],[106,3],[107,44],[108,45],[109,46],[110,47],[111,48],[112,49],[113,50],[114,51],[115,52],[116,53],[117,54],[118,55],[124,3],[123,3],[122,56],[129,57],[175,58],[176,59],[64,3],[137,3],[139,60],[138,3],[136,3],[140,61],[143,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],[171,62],[144,63],[146,64],[147,65],[169,66],[145,3],[148,67],[149,68],[150,3],[151,3],[152,63],[153,69],[154,70],[155,69],[156,63],[157,3],[158,71],[159,72],[160,68],[161,69],[163,73],[164,67],[162,68],[165,69],[166,3],[167,69],[168,3],[170,64],[57,74],[47,75],[49,76],[55,77],[51,3],[52,3],[50,78],[53,74],[45,3],[46,3],[56,79],[48,80],[54,81],[65,97],[66,83],[60,98],[61,99],[59,100],[133,101],[134,88],[141,102],[142,90],[62,103],[172,104],[173,93],[177,105],[178,95],[63,99]],"semanticDiagnosticsPerFile":[131,130,174,125,132,128,121,126,127,67,68,70,71,72,73,74,75,76,77,78,79,80,82,81,83,84,85,69,119,86,87,88,120,89,90,91,92,93,94,95,96,97,98,99,100,101,103,102,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,124,123,122,129,175,176,64,137,139,138,136,140,143,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,171,144,146,147,169,145,148,149,150,151,152,153,154,155,156,157,158,159,160,161,163,164,162,165,166,167,168,170,57,47,49,55,51,52,50,53,45,46,56,48,54,65,66,60,61,59,133,134,141,142,135,62,172,173,58,177,178,63]},"version":"5.1.3"} \ No newline at end of file diff --git a/validations.d.ts b/validations.d.ts new file mode 100644 index 0000000..1d0b8a0 --- /dev/null +++ b/validations.d.ts @@ -0,0 +1,24 @@ +import type { HandlerParams } from "./configureCreateHttpClient"; +import type { UnknownSharedRoute } from "./defineRoutes"; +export type ValidationOptions = { + skipInputValidation?: boolean; + skipResponseValidation?: boolean; +}; +type ExtractFromExisting = Extract; +type CheckedSchema = ExtractFromExisting; +export declare const validateSchemaWithExplicitError: ({ checkedSchema, params, route, adapterName, responseStatus, withIssuesInMessage, }: { + checkedSchema: ExtractFromExisting; + params: unknown; + route: R; + adapterName: string; + responseStatus?: undefined; + withIssuesInMessage?: boolean | undefined; +}) => unknown; +export declare const validateInputParams: (route: UnknownSharedRoute, params: HandlerParams, adapterName: string, options?: { + withIssuesInMessage: boolean; +}) => { + queryParams: unknown; + body: unknown; + headers: unknown; +}; +export {}; diff --git a/validations.js b/validations.js new file mode 100644 index 0000000..4e215bb --- /dev/null +++ b/validations.js @@ -0,0 +1,105 @@ +"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.validateInputParams = exports.validateSchemaWithExplicitError = void 0; +var explicitError = function (_a) { + var _b; + var route = _a.route, error = _a.error, adapterName = _a.adapterName, checkedSchema = _a.checkedSchema, statusCode = _a.statusCode, withIssuesInMessage = _a.withIssuesInMessage; + var newError = new Error(__spreadArray([ + "Shared-route schema '".concat(checkedSchema, "' was not respected in adapter '").concat(adapterName, "'."), + checkedSchema === "responses" && + "Received status: ".concat(statusCode, ". Handled statuses: ").concat(Object.keys(route.responses).join(", "), "."), + "Route: ".concat(route.method.toUpperCase(), " ").concat(route.url) + ], __read((withIssuesInMessage && ((_b = error === null || error === void 0 ? void 0 : error.issues) === null || _b === void 0 ? void 0 : _b.length) + ? ["Issues: " + issuesToString(error === null || error === void 0 ? void 0 : error.issues)] + : [])), false).filter(Boolean) + .join("\n")); + newError.cause = error; + return newError; +}; +var validateSchemaWithExplicitError = function (_a) { + var checkedSchema = _a.checkedSchema, _b = _a.params, params = _b === void 0 ? {} : _b, route = _a.route, adapterName = _a.adapterName, responseStatus = _a.responseStatus, _c = _a.withIssuesInMessage, withIssuesInMessage = _c === void 0 ? false : _c; + try { + if (checkedSchema === "responses") { + if (!responseStatus) + throw new Error("a response status is required when validating responses"); + var schema = route[checkedSchema][responseStatus]; + if (!schema) + throw new Error("No schema found for this status."); + return schema.parse(params); + } + return route[checkedSchema].parse(params); + } + catch (error) { + throw explicitError({ + route: route, + error: error, + adapterName: adapterName, + checkedSchema: checkedSchema, + statusCode: responseStatus, + withIssuesInMessage: withIssuesInMessage, + }); + } +}; +exports.validateSchemaWithExplicitError = validateSchemaWithExplicitError; +var validateInputParams = function (route, params, adapterName, options) { + if (options === void 0) { options = { + withIssuesInMessage: false, + }; } + var withIssuesInMessage = options.withIssuesInMessage; + var queryParams = (0, exports.validateSchemaWithExplicitError)({ + adapterName: adapterName, + checkedSchema: "queryParamsSchema", + params: params.queryParams, + route: route, + withIssuesInMessage: withIssuesInMessage, + }); + var body = (0, exports.validateSchemaWithExplicitError)({ + adapterName: adapterName, + checkedSchema: "requestBodySchema", + params: params.body, + route: route, + withIssuesInMessage: withIssuesInMessage, + }); + // we validate headers separately because we don't want to re-affect req.headers parsed value + // because we don't want to lose all other headers + (0, exports.validateSchemaWithExplicitError)({ + adapterName: adapterName, + checkedSchema: "headersSchema", + params: params.headers, + route: route, + }); + return { queryParams: queryParams, body: body, headers: params.headers }; +}; +exports.validateInputParams = validateInputParams; +var issuesToString = function (issues) { + return issues.map(function (_a) { + var message = _a.message, path = _a.path; + return "".concat(path.join("."), ": ").concat(message); + }).join(" | "); +}; +//# sourceMappingURL=validations.js.map \ No newline at end of file diff --git a/validations.js.map b/validations.js.map new file mode 100644 index 0000000..08ce6d3 --- /dev/null +++ b/validations.js.map @@ -0,0 +1 @@ +{"version":3,"file":"validations.js","sourceRoot":"","sources":["src/validations.ts"],"names":[],"mappings":"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"} \ No newline at end of file