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

+ +

+

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

+

+ Home + - + Documentation +

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