From 9f422fc86c0138c437d4466d948363b5c4844da7 Mon Sep 17 00:00:00 2001 From: Alexander Streltsov Date: Fri, 13 May 2022 12:46:01 +0300 Subject: [PATCH] refactor: improve code quality --- .github/workflows/chore.yml | 9 +- .github/workflows/publish.yml | 21 - README.md | 6 +- package.json | 30 +- pnpm-lock.yaml | 628 +---------------------------- src/api.ts | 43 +- src/app.ts | 8 +- src/ctx/log.ts | 6 +- src/ctx/request.ts | 3 +- src/errors.ts | 11 +- src/graceful-shutdown.ts | 44 +- src/healthcheck.ts | 147 ++++--- src/index.ts | 3 +- src/types.ts | 23 ++ test/app.js | 60 --- test/dispatch.js | 38 -- src/tsconfig.json => tsconfig.json | 9 +- 17 files changed, 230 insertions(+), 859 deletions(-) delete mode 100644 .github/workflows/publish.yml delete mode 100644 test/app.js delete mode 100644 test/dispatch.js rename src/tsconfig.json => tsconfig.json (93%) diff --git a/.github/workflows/chore.yml b/.github/workflows/chore.yml index b33d92f..10ca30c 100644 --- a/.github/workflows/chore.yml +++ b/.github/workflows/chore.yml @@ -12,9 +12,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2.0.1 + with: + version: 7.0.0 - uses: actions/setup-node@v2 with: - node-version: 14 - - run: npm ci + node-version: 16 + cache: 'pnpm' + - run: pnpm install - run: npm run build - - run: npm test diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index db4e06a..0000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Publish v2 - -on: - push: - tags: - - v* - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - with: - node-version: 14 - registry-url: https://registry.npmjs.org/ - - run: npm ci - - run: npm run build - - run: npm pub - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/README.md b/README.md index 5bec687..3a31ddc 100644 --- a/README.md +++ b/README.md @@ -18,4 +18,8 @@ npm install @aidbox/node-server-sdk or ```npm yarn add @aidbox/node-server-sdk -``` \ No newline at end of file +``` + + +## Example +Please check [example](./example) folder. \ No newline at end of file diff --git a/package.json b/package.json index 50d0c60..659d869 100644 --- a/package.json +++ b/package.json @@ -1,34 +1,28 @@ { "name": "@aidbox/node-server-sdk", - "version": "2.0.19", - "main": "build/src/index.js", + "version": "2.1.1", + "main": "build/index.js", "scripts": { - "build": "tsc -b src", - "watch": "tsc -b -w src", + "build": "tsc", "fix": "npm run fix:src && npm run fix:example", "fix:src": "find src -name *.ts | xargs prettier -w", - "fix:example": "find example/src -name *.ts | xargs prettier -w", - "test": "mocha" + "fix:example": "find example/src -name *.ts | xargs prettier -w" }, "engines": { "node": ">=16" }, "keywords": [], "author": "", - "license": "ISC", + "license": "MIT", "devDependencies": { "@types/debug": "^4.1.6", "@types/koa": "^2.13.4", "@types/koa-bodyparser": "^4.3.2", "@types/koa-router": "^7.4.4", "@types/node": "^16.10.2", - "@types/ramda": "^0.27.44", - "@types/superagent": "^4.1.12", - "mocha": "^9.0.3", "prettier": "^2.3.2", - "sinon": "^11.1.2", - "source-map-support": "^0.5.19", "supertest": "^6.1.4", + "tslib": "^2.4.0", "typescript": "^4.3.5" }, "dependencies": { @@ -38,14 +32,13 @@ "dotenv": "^16.0.1", "koa": "^2.13.4", "koa-bodyparser": "4.3.0", - "koa-router": "^10.1.1", - "remeda": "0.0.32" + "koa-router": "^10.1.1" }, "directories": { "example": "example" }, "files": [ - "build/src" + "build" ], "repository": { "type": "git", @@ -55,10 +48,5 @@ "url": "https://github.com/Aidbox/node-server-sdk/issues" }, "homepage": "https://github.com/Aidbox/node-server-sdk#readme", - "description": "", - "mocha": { - "require": [ - "source-map-support/register" - ] - } + "description": "" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db10bf5..eca8ca2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: 5.3 +lockfileVersion: 5.4 specifiers: '@cloudnative/health': ^2.1.2 @@ -7,20 +7,15 @@ specifiers: '@types/koa-bodyparser': ^4.3.2 '@types/koa-router': ^7.4.4 '@types/node': ^16.10.2 - '@types/ramda': ^0.27.44 - '@types/superagent': ^4.1.12 axios: ^0.21.1 debug: ^4.3.2 dotenv: ^16.0.1 koa: ^2.13.4 koa-bodyparser: 4.3.0 koa-router: ^10.1.1 - mocha: ^9.0.3 prettier: ^2.3.2 - remeda: 0.0.32 - sinon: ^11.1.2 - source-map-support: ^0.5.19 supertest: ^6.1.4 + tslib: ^2.4.0 typescript: ^4.3.5 dependencies: @@ -31,7 +26,6 @@ dependencies: koa: 2.13.4 koa-bodyparser: 4.3.0 koa-router: 10.1.1 - remeda: 0.0.32 devDependencies: '@types/debug': 4.1.7 @@ -39,13 +33,9 @@ devDependencies: '@types/koa-bodyparser': 4.3.7 '@types/koa-router': 7.4.4 '@types/node': 16.11.34 - '@types/ramda': 0.27.66 - '@types/superagent': 4.1.15 - mocha: 9.2.2 prettier: 2.6.2 - sinon: 11.1.2 - source-map-support: 0.5.21 supertest: 6.2.3 + tslib: 2.4.0 typescript: 4.6.4 packages: @@ -54,30 +44,6 @@ packages: resolution: {integrity: sha512-mEQdbj9dM4KMClS358MCzbqXUmj+Vw5snjDb5bXdaf1sZvVu7+3UqR4HaG4RoNkNUwe1yjfIuengdyWp9quF1A==} dev: false - /@sinonjs/commons/1.8.3: - resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers/7.1.2: - resolution: {integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==} - dependencies: - '@sinonjs/commons': 1.8.3 - dev: true - - /@sinonjs/samsam/6.1.1: - resolution: {integrity: sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==} - dependencies: - '@sinonjs/commons': 1.8.3 - lodash.get: 4.4.2 - type-detect: 4.0.8 - dev: true - - /@sinonjs/text-encoding/0.7.1: - resolution: {integrity: sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==} - dev: true - /@types/accepts/1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: @@ -101,10 +67,6 @@ packages: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} dev: true - /@types/cookiejar/2.1.2: - resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} - dev: true - /@types/cookies/0.7.7: resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} dependencies: @@ -196,12 +158,6 @@ packages: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true - /@types/ramda/0.27.66: - resolution: {integrity: sha512-i2YW+E2U6NfMt3dp0RxNcejox+bxJUNDjB7BpYuRuoHIzv5juPHkJkNgcUOu+YSQEmaWu8cnAo/8r63C0NnuVA==} - dependencies: - ts-toolbelt: 6.15.5 - dev: true - /@types/range-parser/1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: true @@ -213,17 +169,6 @@ packages: '@types/node': 16.11.34 dev: true - /@types/superagent/4.1.15: - resolution: {integrity: sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==} - dependencies: - '@types/cookiejar': 2.1.2 - '@types/node': 16.11.34 - dev: true - - /@ungap/promise-all-settled/1.1.2: - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - dev: true - /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -232,35 +177,6 @@ packages: negotiator: 0.6.3 dev: false - /ansi-colors/4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - dev: true - - /ansi-regex/5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles/4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /anymatch/3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /argparse/2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - /asap/2.0.6: resolution: {integrity: sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=} dev: true @@ -277,37 +193,6 @@ packages: - debug dev: false - /balanced-match/1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /binary-extensions/2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /brace-expansion/1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /braces/3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /browser-stdout/1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - dev: true - - /buffer-from/1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -327,42 +212,6 @@ packages: function-bind: 1.1.1 get-intrinsic: 1.1.1 - /camelcase/6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /chalk/4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chokidar/3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.2 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /cliui/7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - /co-body/6.1.0: resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} dependencies: @@ -377,17 +226,6 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: false - /color-convert/2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name/1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - /combined-stream/1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -399,10 +237,6 @@ packages: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: true - /concat-map/0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - dev: true - /content-disposition/0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -431,19 +265,6 @@ packages: resolution: {integrity: sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=} dev: false - /debug/4.3.3_supports-color@8.1.1: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - dev: true - /debug/4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -455,11 +276,6 @@ packages: dependencies: ms: 2.1.2 - /decamelize/4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - dev: true - /deep-equal/1.0.1: resolution: {integrity: sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=} dev: false @@ -495,11 +311,6 @@ packages: wrappy: 1.0.2 dev: true - /diff/5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - dev: true - /dotenv/16.0.1: resolution: {integrity: sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==} engines: {node: '>=12'} @@ -509,53 +320,19 @@ packages: resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} dev: false - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - /encodeurl/1.0.2: resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} engines: {node: '>= 0.8'} dev: false - /escalade/3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - /escape-html/1.0.3: resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} dev: false - /escape-string-regexp/4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - /fast-safe-stringify/2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: true - /fill-range/7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /find-up/5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat/5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: true - /follow-redirects/1.15.0_debug@4.3.4: resolution: {integrity: sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==} engines: {node: '>=4.0'} @@ -591,26 +368,9 @@ packages: engines: {node: '>= 0.6'} dev: false - /fs.realpath/1.0.0: - resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} - dev: true - - /fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /get-caller-file/2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - /get-intrinsic/1.1.1: resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} dependencies: @@ -618,34 +378,6 @@ packages: has: 1.0.3 has-symbols: 1.0.3 - /glob-parent/5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob/7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /growl/1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - dev: true - - /has-flag/4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} @@ -663,11 +395,6 @@ packages: dependencies: function-bind: 1.1.1 - /he/1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true - /hexoid/1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} engines: {node: '>=8'} @@ -715,33 +442,9 @@ packages: engines: {node: '>= 0.8.0'} dev: false - /inflight/1.0.6: - resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /is-binary-path/2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-extglob/2.1.1: - resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point/3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - /is-generator-function/1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -749,47 +452,6 @@ packages: has-tostringtag: 1.0.0 dev: false - /is-glob/4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-number/7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-plain-obj/2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - dev: true - - /is-unicode-supported/0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true - - /isarray/0.0.1: - resolution: {integrity: sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=} - dev: true - - /isexe/2.0.0: - resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} - dev: true - - /js-yaml/4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /just-extend/4.2.1: - resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} - dev: true - /keygrip/1.1.0: resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} engines: {node: '>= 0.6'} @@ -861,25 +523,6 @@ packages: - supports-color dev: false - /locate-path/6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.get/4.4.2: - resolution: {integrity: sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=} - dev: true - - /log-symbols/4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -912,83 +555,14 @@ packages: hasBin: true dev: true - /minimatch/3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch/4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /mocha/9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3_supports-color@8.1.1 - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - dev: true - /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /ms/2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /nanoid/3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - /negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} dev: false - /nise/5.1.1: - resolution: {integrity: sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==} - dependencies: - '@sinonjs/commons': 1.8.3 - '@sinonjs/fake-timers': 7.1.2 - '@sinonjs/text-encoding': 0.7.1 - just-extend: 4.2.1 - path-to-regexp: 1.8.0 - dev: true - - /normalize-path/3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - /object-inspect/1.12.0: resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} @@ -1009,50 +583,15 @@ packages: resolution: {integrity: sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=} dev: false - /p-limit/3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate/5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: false - /path-exists/4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute/1.0.1: - resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} - engines: {node: '>=0.10.0'} - dev: true - - /path-to-regexp/1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} - dependencies: - isarray: 0.0.1 - dev: true - /path-to-regexp/6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: false - /picomatch/2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - /prettier/2.6.2: resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==} engines: {node: '>=10.13.0'} @@ -1070,12 +609,6 @@ packages: engines: {node: '>=0.6'} dev: true - /randombytes/2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - /raw-body/2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} @@ -1095,22 +628,6 @@ packages: util-deprecate: 1.0.2 dev: true - /readdirp/3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /remeda/0.0.32: - resolution: {integrity: sha512-FEdl8ONpqY7AvvMHG5WYdomc0mGf2khHPUDu6QvNkOq4Wjkw5BvzWM4QyksAQ/US1sFIIRG8TVBn6iJx6HbRrA==} - dev: false - - /require-directory/2.1.1: - resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} - engines: {node: '>=0.10.0'} - dev: true - /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -1126,12 +643,6 @@ packages: lru-cache: 6.0.0 dev: true - /serialize-javascript/6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - dependencies: - randombytes: 2.1.0 - dev: true - /setprototypeof/1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false @@ -1143,29 +654,6 @@ packages: get-intrinsic: 1.1.1 object-inspect: 1.12.0 - /sinon/11.1.2: - resolution: {integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==} - dependencies: - '@sinonjs/commons': 1.8.3 - '@sinonjs/fake-timers': 7.1.2 - '@sinonjs/samsam': 6.1.1 - diff: 5.0.0 - nise: 5.1.1 - supports-color: 7.2.0 - dev: true - - /source-map-support/0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map/0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - /statuses/1.5.0: resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=} engines: {node: '>= 0.6'} @@ -1176,33 +664,12 @@ packages: engines: {node: '>= 0.8'} dev: false - /string-width/4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - /string_decoder/1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 dev: true - /strip-ansi/6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-json-comments/3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - /superagent/7.1.3: resolution: {integrity: sha512-WA6et4nAvgBCS73lJvv1D0ssI5uk5Gh+TGN/kNe+B608EtcVs/yzfl+OLXTzDs7tOBDIpvgh/WUs1K2OK1zTeQ==} engines: {node: '>=6.4.0 <13 || >=14'} @@ -1232,34 +699,13 @@ packages: - supports-color dev: true - /supports-color/7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color/8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /to-regex-range/5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - /toidentifier/1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} dev: false - /ts-toolbelt/6.15.5: - resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + /tslib/2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: true /tsscmp/1.0.6: @@ -1267,11 +713,6 @@ packages: engines: {node: '>=0.6.x'} dev: false - /type-detect/4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -1300,74 +741,15 @@ packages: engines: {node: '>= 0.8'} dev: false - /which/2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /workerpool/6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - dev: true - - /wrap-ansi/7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - /wrappy/1.0.2: resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} dev: true - /y18n/5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yargs-parser/20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - dev: true - - /yargs-unparser/2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - dev: true - - /yargs/16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - dev: true - /ylru/1.3.2: resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} engines: {node: '>= 4.0.0'} dev: false - - /yocto-queue/0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true diff --git a/src/api.ts b/src/api.ts index 9ef331b..fb4c9be 100644 --- a/src/api.ts +++ b/src/api.ts @@ -1,11 +1,10 @@ -import { Api, Client } from './types'; - +import { Api, Client } from "./types"; export const createApi = (client: Client): Api => ({ createResource: async (resourceType, data) => { const { data: resource } = await client.request({ url: `/${resourceType}`, - method: 'POST', + method: "POST", data, }); return resource; @@ -13,7 +12,7 @@ export const createApi = (client: Client): Api => ({ patchResource: async (resourceType, resourceId, data) => { const { data: resource } = await client.request({ url: `/${resourceType}/${resourceId}`, - method: 'PATCH', + method: "PATCH", data, }); return resource; @@ -21,7 +20,7 @@ export const createApi = (client: Client): Api => ({ deleteResource: async (resourceType, resourceId) => { const { data: resource } = await client.request({ url: `/${resourceType}/${resourceId}`, - method: "DELETE" + method: "DELETE", }); return resource; }, @@ -38,16 +37,26 @@ export const createApi = (client: Client): Api => ({ url: `/${resourceType}`, params, }); - return { resources: entry?.map((e: any) => e.resource) || [], total }; + return { resources: entry?.map((e) => e.resource) || [], total }; + }, + createBundle: async (type, data) => { + const { data: result } = await client.request({ + method: "POST", + url: "/", + data: { + type, + entry: data, + }, + }); + return result; }, }); - export const createFHIRApi = (client: Client): Api => ({ createResource: async (resourceType, data) => { const { data: resource } = await client.request({ url: `/fhir/${resourceType}`, - method: 'POST', + method: "POST", data, }); return resource; @@ -55,7 +64,7 @@ export const createFHIRApi = (client: Client): Api => ({ patchResource: async (resourceType, resourceId, data) => { const { data: resource } = await client.request({ url: `/fhir/${resourceType}/${resourceId}`, - method: 'PATCH', + method: "PATCH", data, }); return resource; @@ -63,7 +72,7 @@ export const createFHIRApi = (client: Client): Api => ({ deleteResource: async (resourceType, resourceId) => { const { data: resource } = await client.request({ url: `/fhir/${resourceType}/${resourceId}`, - method: "DELETE" + method: "DELETE", }); return resource; }, @@ -80,7 +89,17 @@ export const createFHIRApi = (client: Client): Api => ({ url: `/fhir/${resourceType}`, params, }); - return { resources: entry?.map((e: any) => e.resource) || [], total }; + return { resources: entry?.map((e) => e.resource) || [], total }; + }, + createBundle: async (type, data) => { + const { data: result } = await client.request({ + method: "POST", + url: "/fhir/", + data: { + type, + entry: data, + }, + }); + return result; }, }); - diff --git a/src/app.ts b/src/app.ts index 8740f58..0ff9457 100644 --- a/src/app.ts +++ b/src/app.ts @@ -5,6 +5,7 @@ import { parseError } from "./errors"; import { Server } from "http"; import { App, + BaseConfig, BundledApp, Ctx, DispatchProps, @@ -24,14 +25,17 @@ import * as http from "http"; const debug = require("debug")("@aidbox/node-app:app"); -export const createApp = (dispatchProps: DispatchProps): BundledApp => { +export const createApp = ( + dispatchProps: DispatchProps, + config: BaseConfig +): BundledApp => { const app: App = new Koa(); const server = http.createServer(app.callback()); app.context.ctx = dispatchProps.ctx; const router = new Router(); - app.use(bodyParser({ jsonLimit: "25mb" })); + app.use(bodyParser({ jsonLimit: config.app.maxBodySize })); const healthcheck = new HealthChecker(); diff --git a/src/ctx/log.ts b/src/ctx/log.ts index 5b6bd14..125cfc2 100644 --- a/src/ctx/log.ts +++ b/src/ctx/log.ts @@ -1,7 +1,9 @@ -import { Client, LogHandler } from '../types'; +import { Client, LogHandler } from "../types"; export const createLog = (client: Client): LogHandler => (data) => { - client.request({ url: `/$loggy`, method: "POST", data }).catch(e => console.error("Log message not send")); + client + .request({ url: `/$loggy`, method: "POST", data }) + .catch((e) => console.error("Log message not send")); }; diff --git a/src/ctx/request.ts b/src/ctx/request.ts index 81e263a..3d26fd4 100644 --- a/src/ctx/request.ts +++ b/src/ctx/request.ts @@ -1,5 +1,4 @@ -import { Client, ClientRequestProps, RequestHandler } from '../types'; - +import { Client, ClientRequestProps, RequestHandler } from "../types"; export const createRequest = (client: Client): RequestHandler => diff --git a/src/errors.ts b/src/errors.ts index ea5a51c..f154051 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -1,5 +1,4 @@ import { AxiosError } from "axios"; -import R from "ramda"; export abstract class AidboxError extends Error { type?: string; @@ -26,7 +25,7 @@ export const isAxiosError = (err: Error): err is AxiosError => { return (err as AxiosError).isAxiosError; }; -export type TParsedError = { +export type ParsedError = { status: number; error: { message: string; @@ -35,11 +34,15 @@ export type TParsedError = { }; }; -export const parseError = (err: Error): TParsedError => { +export const parseError = (err: Error): ParsedError => { if (isAidboxError(err)) { return { status: 422, - error: R.pick(["type", "message", "data"], err), + error: { + type: err?.type, + message: err?.message, + data: err?.data, + }, }; } if (isAxiosError(err)) { diff --git a/src/graceful-shutdown.ts b/src/graceful-shutdown.ts index 5ecf83e..8a66acc 100644 --- a/src/graceful-shutdown.ts +++ b/src/graceful-shutdown.ts @@ -1,18 +1,22 @@ -import { Server } from 'http'; -import { Middleware } from 'koa'; +import { Server } from "http"; +import { Middleware } from "koa"; type GracefulShutdownOpts = { logger?: any; forceTimeout?: number; -} +}; -export const shutdownMiddleware = (server:Server, opts:GracefulShutdownOpts = {}): Middleware=> { +export const shutdownMiddleware = ( + server: Server, + opts: GracefulShutdownOpts = {} +): Middleware => { const logger = opts.logger || console; // Defaults to console - const forceTimeout = typeof opts.forceTimeout === 'number' ? opts.forceTimeout : (30 * 1000); // Defaults to 30s + const forceTimeout = + typeof opts.forceTimeout === "number" ? opts.forceTimeout : 30 * 1000; // Defaults to 30s let shuttingDown = false; - process.on('SIGTERM', function gracefulExit() { + process.on("SIGTERM", function gracefulExit() { if (shuttingDown) { // We already know we're shutting down, don't continue this function return; @@ -20,24 +24,26 @@ export const shutdownMiddleware = (server:Server, opts:GracefulShutdownOpts = {} shuttingDown = true; } - if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') { + if (!process.env.NODE_ENV || process.env.NODE_ENV === "development") { return process.exit(0); } - logger.warn('Received kill signal (SIGTERM), shutting down...'); + logger.warn("Received kill signal (SIGTERM), shutting down..."); setTimeout(() => { - logger.error('Could not close connections in time, forcefully shutting down'); + logger.error( + "Could not close connections in time, forcefully shutting down" + ); process.exit(1); }, forceTimeout); server.close(() => { - logger.info('Closed out remaining connections'); + logger.info("Closed out remaining connections"); process.exit(0); }); }); - process.on('SIGINT', function gracefulExit() { + process.on("SIGINT", function gracefulExit() { if (shuttingDown) { // We already know we're shutting down, don't continue this function return; @@ -45,19 +51,21 @@ export const shutdownMiddleware = (server:Server, opts:GracefulShutdownOpts = {} shuttingDown = true; } - if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') { + if (!process.env.NODE_ENV || process.env.NODE_ENV === "development") { return process.exit(0); } - logger.warn('Received kill signal (SIGINT), shutting down...'); + logger.warn("Received kill signal (SIGINT), shutting down..."); setTimeout(() => { - logger.error('Could not close connections in time, forcefully shutting down'); + logger.error( + "Could not close connections in time, forcefully shutting down" + ); process.exit(1); }, forceTimeout); server.close(() => { - logger.info('Closed out remaining connections'); + logger.info("Closed out remaining connections"); process.exit(0); }); }); @@ -65,10 +73,10 @@ export const shutdownMiddleware = (server:Server, opts:GracefulShutdownOpts = {} return function shutdown(ctx, next) { if (shuttingDown) { ctx.status = 503; - ctx.set('Connection', 'close'); - ctx.body = 'Server is in the process of shutting down'; + ctx.set("Connection", "close"); + ctx.body = "Server is in the process of shutting down"; } else { return next(); } }; -}; \ No newline at end of file +}; diff --git a/src/healthcheck.ts b/src/healthcheck.ts index 5756638..a3755e0 100644 --- a/src/healthcheck.ts +++ b/src/healthcheck.ts @@ -1,64 +1,117 @@ -import { HealthChecker, State } from '@cloudnative/health'; -import { Context } from 'koa'; +import { HealthChecker, State } from "@cloudnative/health"; +import { Context } from "koa"; enum StateCode { OK = 200, DOWN = 503, - ERRORED = 500 + ERRORED = 500, } -export const HealthEndpoint = (checker: HealthChecker): (ctx: Context, next: () => void) => void => { +export const HealthEndpoint = ( + checker: HealthChecker +): ((ctx: Context, next: () => void) => void) => { return async (ctx: Context, next: () => void) => { - return checker.getStatus().then(async (status: { status: any; }) => { - switch (status.status) { - case State.STARTING: ctx.status = StateCode.DOWN; break; - case State.UP: ctx.status = StateCode.OK; break; - case State.DOWN: ctx.status = StateCode.DOWN; break; - case State.STOPPING: ctx.status = StateCode.DOWN; break; - case State.STOPPED: ctx.status = StateCode.DOWN; break; - default: ctx.status = StateCode.ERRORED; break; - } - ctx.type = 'application/json'; - ctx.body = JSON.stringify(status); - await next(); - }).catch(async () => { await next(); }); + return checker + .getStatus() + .then(async (status: { status: any }) => { + switch (status.status) { + case State.STARTING: + ctx.status = StateCode.DOWN; + break; + case State.UP: + ctx.status = StateCode.OK; + break; + case State.DOWN: + ctx.status = StateCode.DOWN; + break; + case State.STOPPING: + ctx.status = StateCode.DOWN; + break; + case State.STOPPED: + ctx.status = StateCode.DOWN; + break; + default: + ctx.status = StateCode.ERRORED; + break; + } + ctx.type = "application/json"; + ctx.body = JSON.stringify(status); + await next(); + }) + .catch(async () => { + await next(); + }); }; }; - -export const LivenessEndpoint = (checker: HealthChecker): (ctx: Context, next: () => void) => void => { +export const LivenessEndpoint = ( + checker: HealthChecker +): ((ctx: Context, next: () => void) => void) => { return async (ctx: Context, next: () => void) => { - return checker.getLivenessStatus().then(async (status: { status: any; }) => { - switch (status.status) { - case State.STARTING: ctx.status = StateCode.OK; break; - case State.UP: ctx.status = StateCode.OK; break; - case State.DOWN: ctx.status = StateCode.DOWN; break; - case State.STOPPING: ctx.status = StateCode.DOWN; break; - case State.STOPPED: ctx.status = StateCode.DOWN; break; - default: ctx.status = StateCode.ERRORED; break; - } - ctx.type = 'application/json'; - ctx.body = JSON.stringify(status); - await next(); - }).catch(async () => { await next(); }); + return checker + .getLivenessStatus() + .then(async (status: { status: any }) => { + switch (status.status) { + case State.STARTING: + ctx.status = StateCode.OK; + break; + case State.UP: + ctx.status = StateCode.OK; + break; + case State.DOWN: + ctx.status = StateCode.DOWN; + break; + case State.STOPPING: + ctx.status = StateCode.DOWN; + break; + case State.STOPPED: + ctx.status = StateCode.DOWN; + break; + default: + ctx.status = StateCode.ERRORED; + break; + } + ctx.type = "application/json"; + ctx.body = JSON.stringify(status); + await next(); + }) + .catch(async () => { + await next(); + }); }; }; - -export const ReadinessEndpoint = (checker: HealthChecker): (ctx: Context, next: () => void) => void => { +export const ReadinessEndpoint = ( + checker: HealthChecker +): ((ctx: Context, next: () => void) => void) => { return async (ctx: Context, next: () => void) => { - return checker.getReadinessStatus().then(async (status: { status: any; }) => { - ctx.status = StateCode.OK; // Default - switch (status.status) { - case State.STARTING: ctx.status = StateCode.DOWN; break; - case State.UP: ctx.status = StateCode.OK; break; - case State.DOWN: ctx.status = StateCode.DOWN; break; - case State.STOPPING: ctx.status = StateCode.DOWN; break; - case State.STOPPED: ctx.status = StateCode.DOWN; break; - } - ctx.type = 'application/json'; - ctx.body = JSON.stringify(status); - await next(); - }).catch(async () => { await next(); }); + return checker + .getReadinessStatus() + .then(async (status: { status: any }) => { + ctx.status = StateCode.OK; // Default + switch (status.status) { + case State.STARTING: + ctx.status = StateCode.DOWN; + break; + case State.UP: + ctx.status = StateCode.OK; + break; + case State.DOWN: + ctx.status = StateCode.DOWN; + break; + case State.STOPPING: + ctx.status = StateCode.DOWN; + break; + case State.STOPPED: + ctx.status = StateCode.DOWN; + break; + } + ctx.type = "application/json"; + ctx.body = JSON.stringify(status); + await next(); + }) + .catch(async () => { + await next(); + }); }; }; diff --git a/src/index.ts b/src/index.ts index 3846645..742b92f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,4 +3,5 @@ export * from "./ctx"; export * from "./errors"; export * from "./manifest"; export * from "./dispatch"; -export * from "./types"; \ No newline at end of file +export * from "./types"; +export * from "./config"; diff --git a/src/types.ts b/src/types.ts index 4ea8f05..a6487c6 100644 --- a/src/types.ts +++ b/src/types.ts @@ -164,6 +164,25 @@ export type Ctx = { psql: (query: string) => Promise; }; +export type Bundle = { + resourceType: "Bundle"; + type: "batch" | "transaction" | "collection"; + entry: Array<{ + request: { + method: "PUT" | "POST" | "PATCH" | "DELETE"; + url: string; + }; + resource: Partial; + }>; +}; + +export type BundleResponse = { + id: string; + type: "batch-response" | "transaction-response"; + resourceType: "Bundle"; + resource: Array; +}; + export type Api = { createResource(resourceType: string, data: Partial): Promise; patchResource( @@ -177,6 +196,10 @@ export type Api = { resourceType: string, params?: any ): Promise<{ resources: T[]; total: number }>; + createBundle: ( + type: Bundle["type"], + data: Bundle["entry"] + ) => Promise; }; export type RequestHandler = ClientRequest; diff --git a/test/app.js b/test/app.js deleted file mode 100644 index 8848002..0000000 --- a/test/app.js +++ /dev/null @@ -1,60 +0,0 @@ -const sinon = require('sinon'); -const supertest = require('supertest'); -const { createApp, startApp } = require('..'); - -const appId = 'xxx'; -const appSecret = 'yyy'; -const manifest = { - id: appId, - endpoint: { secret: appSecret }, - operations: { - xxx: { - method: 'POST', - path: ['xxx'], - }, - }, -}; - -beforeEach(() => { - sinon.restore(); -}); - -describe('app', () => { - describe('createApp', () => { - it('Applies auth/dispatch middleware', async () => { - const handlerSpy = sinon.spy(() => ({ resource: 'xxx' })); - const operations = { - xxx: { - method: 'POST', - path: ['xxx'], - handlerFn: handlerSpy, - }, - }; - const ctx = { manifest: { ...manifest, operations } }; - const app = createApp({ ctx }); - const req = supertest(app.callback()); - const message = { type: 'operation', operation: { id: 'xxx' } }; - - // Without token - await req.post('/aidbox').send(message).expect(401); - sinon.assert.notCalled(handlerSpy); - - // With invalid token - await req - .post('/aidbox') - .set('Authorization', `Bearer xxx`) - .send(message) - .expect(401); - sinon.assert.notCalled(handlerSpy); - - // With valid token - const token = Buffer.from(`${appId}:${appSecret}`).toString('base64'); - await req - .post('/aidbox') - .set('Authorization', `Bearer ${token}`) - .send(message) - .expect(200, 'xxx'); - sinon.assert.calledOnce(handlerSpy); - }); - }); -}); diff --git a/test/dispatch.js b/test/dispatch.js deleted file mode 100644 index 18cfcee..0000000 --- a/test/dispatch.js +++ /dev/null @@ -1,38 +0,0 @@ -const { dispatch } = require(".."); -const sinon = require("sinon"); - -beforeEach(() => { - sinon.restore(); -}); - -describe("dispatch", () => { - it("Passes request & dispatchProps to operation handler", async () => { - const handlerFnSpy = sinon.spy(); - const dispatchProps = { - ctx: { manifest: { operations: { xxx: { handlerFn: handlerFnSpy } } } }, - }; - const request = { - resource: { xxx: "xxx" }, - }; - await dispatch( - { type: "operation", operation: { id: "xxx" }, request }, - dispatchProps - ); - sinon.assert.calledWith(handlerFnSpy, request, dispatchProps); - }); - - it("Passes event & dispatchProps to subscription handler", async () => { - const handlerFnSpy = sinon.spy(); - const dispatchProps = { - ctx: { - manifest: { subscriptions: { xxx: { handlerFn: handlerFnSpy } } }, - }, - }; - const event = { resource: "xxx", previous: "xxx", action: "create" }; - await dispatch( - { type: "subscription", handler: "xxx", event }, - dispatchProps - ); - sinon.assert.calledWith(handlerFnSpy, event, dispatchProps); - }); -}); diff --git a/src/tsconfig.json b/tsconfig.json similarity index 93% rename from src/tsconfig.json rename to tsconfig.json index 16bc6a7..f7cafd8 100644 --- a/src/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,6 @@ /* Visit https://aka.ms/tsconfig.json to read more about this file */ /* Basic Options */ - "incremental": true, /* Enable incremental compilation */ "target": "ES2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ // "lib": [], /* Specify library files to be included in the compilation. */ @@ -14,8 +13,9 @@ "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "../build/src", /* Redirect output structure to the directory. */ + "outDir": "./build", /* Redirect output structure to the directory. */ "strict": true, /* Enable all strict type-checking options. */ + "importHelpers": true, // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ @@ -40,7 +40,7 @@ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "typeRoots": [], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ @@ -57,5 +57,6 @@ /* Advanced Options */ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ - } + }, + "exclude": ["./example"] }