diff --git a/.travis.yml b/.travis.yml index c34fa74..88493a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,12 @@ language: node_js node_js: + - "15" - "14" - "12" - - "11" - "10" install: - - npm ci + - npm i script: - npm run lint:ci diff --git a/__tests__/ethers.module.spec.ts b/__tests__/ethers.module.spec.ts new file mode 100644 index 0000000..bf46a5a --- /dev/null +++ b/__tests__/ethers.module.spec.ts @@ -0,0 +1,27 @@ +import { NestFactory } from '@nestjs/core'; +import { Module } from '@nestjs/common'; +import { EthersModule } from '../src'; +import { platforms } from './utils/platforms'; +import { extraWait } from './utils/extraWait'; + +describe('Ethers Module Initialization', () => { + for (const PlatformAdapter of platforms) { + describe(PlatformAdapter.name, () => { + describe('forRoot', () => { + it('should compile without options', async () => { + @Module({ + imports: [EthersModule.forRoot()], + }) + class TestModule {} + + const app = await NestFactory.create( + TestModule, + new PlatformAdapter(), + ); + await app.init(); + await extraWait(PlatformAdapter, app); + }); + }); + }); + } +}); diff --git a/__tests__/utils/extraWait.ts b/__tests__/utils/extraWait.ts new file mode 100644 index 0000000..9efa6ef --- /dev/null +++ b/__tests__/utils/extraWait.ts @@ -0,0 +1,12 @@ +import { Adapter } from './platforms'; +import { INestApplication } from '@nestjs/common'; +import { FastifyAdapter } from '@nestjs/platform-fastify'; + +export async function extraWait(adapter: Adapter, app: INestApplication) { + if (adapter === FastifyAdapter) { + const instance = app.getHttpAdapter().getInstance(); + if (instance && typeof instance.ready === 'function') { + await instance.ready(); + } + } +} diff --git a/__tests__/utils/platforms.ts b/__tests__/utils/platforms.ts new file mode 100644 index 0000000..577626d --- /dev/null +++ b/__tests__/utils/platforms.ts @@ -0,0 +1,8 @@ +import { AbstractHttpAdapter } from '@nestjs/core'; +import { Type } from '@nestjs/common'; +import { FastifyAdapter } from '@nestjs/platform-fastify'; +import { ExpressAdapter } from '@nestjs/platform-express'; + +export type Adapter = Type>; + +export const platforms: Adapter[] = [ExpressAdapter, FastifyAdapter]; diff --git a/package-lock.json b/package-lock.json index 408be6a..5a8646a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -942,6 +942,30 @@ "@ethersproject/strings": "^5.1.0" } }, + "@fastify/forwarded": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-1.0.0.tgz", + "integrity": "sha512-VoO+6WD0aRz8bwgJZ8pkkxjq7o/782cQ1j945HWg0obZMgIadYW3Pew0+an+k1QL7IPZHM3db5WF6OP6x4ymMA==", + "dev": true + }, + "@fastify/proxy-addr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-3.0.0.tgz", + "integrity": "sha512-ty7wnUd/GeSqKTC2Jozsl5xGbnxUnEFC0On2/zPv/8ixywipQmVZwuWvNGnBoitJ2wixwVqofwXNua8j6Y62lQ==", + "dev": true, + "requires": { + "@fastify/forwarded": "^1.0.0", + "ipaddr.js": "^2.0.0" + }, + "dependencies": { + "ipaddr.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.0.tgz", + "integrity": "sha512-S54H9mIj0rbxRIyrDMEuuER86LdlgUg9FSeZ8duQb6CUG2iRrA36MYVQBSprTF/ZeAwvyQ5mDGuNvIPM0BIl3w==", + "dev": true + } + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1201,6 +1225,21 @@ "tslib": "2.1.0" } }, + "@nestjs/platform-fastify": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@nestjs/platform-fastify/-/platform-fastify-7.6.15.tgz", + "integrity": "sha512-WwtVaIKw3+5zSCANr3oquPbwwd1yEhpSMwPzLj9TZLwQ0KusqT+dH6xNYOQV9Gk8M/ZjubPxZCeIIuTRirHwBg==", + "dev": true, + "requires": { + "fastify": "3.14.0", + "fastify-cors": "5.2.0", + "fastify-formbody": "5.0.0", + "light-my-request": "4.4.1", + "middie": "5.2.0", + "path-to-regexp": "3.2.0", + "tslib": "2.1.0" + } + }, "@nestjs/testing": { "version": "7.6.15", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-7.6.15.tgz", @@ -1636,6 +1675,12 @@ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, + "abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "dev": true + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1745,6 +1790,12 @@ "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=", "dev": true }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -1835,6 +1886,41 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "dev": true + }, + "avvio": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-7.2.1.tgz", + "integrity": "sha512-b+gox68dqD6c3S3t+bZBKN6rYbVWdwpN12sHQLFTiacDT2rcq7fm07Ww+IKt/AvAkyCIe1f5ArP1bC/vAlx97A==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.1", + "queue-microtask": "^1.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -3310,6 +3396,12 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, + "fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "dev": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3342,18 +3434,136 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-json-stringify": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.5.4.tgz", + "integrity": "sha512-fu74X0fRzQqADX6LFJ+5lSal1+j/QmX4oWrDnrfVAXV4qT6PwyymZmhGa/1SWgouOmf0tBJzZrHZPLymO00Lxg==", + "dev": true, + "requires": { + "ajv": "^6.11.0", + "deepmerge": "^4.2.2", + "rfdc": "^1.2.0", + "string-similarity": "^4.0.1" + } + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-redact": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.0.tgz", + "integrity": "sha512-a/S/Hp6aoIjx7EmugtzLqXmcNsyFszqbt6qQ99BdG61QjBZF6shNis0BYR6TsZOQ1twYc0FN2Xdhwwbv6+KD0w==", + "dev": true + }, "fast-safe-stringify": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", "dev": true }, + "fastify": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-3.14.0.tgz", + "integrity": "sha512-a6W2iVPJMOaULqCykJ5nFRtnoknqt9K3b6rqAQcGjT/O2Hy+vvo+9/+cL2907KN0iF/91Ke+XQluKrVNF6+Z7w==", + "dev": true, + "requires": { + "@fastify/proxy-addr": "^3.0.0", + "abstract-logging": "^2.0.0", + "ajv": "^6.12.2", + "avvio": "^7.1.2", + "fast-json-stringify": "^2.5.0", + "fastify-error": "^0.3.0", + "fastify-warning": "^0.2.0", + "find-my-way": "^4.0.0", + "flatstr": "^1.0.12", + "light-my-request": "^4.2.0", + "pino": "^6.2.1", + "readable-stream": "^3.4.0", + "rfdc": "^1.1.4", + "secure-json-parse": "^2.0.0", + "semver": "^7.3.2", + "tiny-lru": "^7.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "fastify-cors": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/fastify-cors/-/fastify-cors-5.2.0.tgz", + "integrity": "sha512-Lde71qT23M3Ip3pmny3uN6q6lQ4J5J0/YWoqe2stL4sMT99R5LEtTJ2La2zijFOR5OFhxvxqGgR7BIc2x3amPg==", + "dev": true, + "requires": { + "fastify-plugin": "^3.0.0", + "vary": "^1.1.2" + } + }, + "fastify-error": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fastify-error/-/fastify-error-0.3.0.tgz", + "integrity": "sha512-Jm2LMTB5rsJqlS1+cmgqqM9tTs0UrlgYR7TvDT3ZgXsUI5ib1NjQlqZHf+tDK5tVPdFGwyq02wAoJtyYIRSiFA==", + "dev": true + }, + "fastify-formbody": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fastify-formbody/-/fastify-formbody-5.0.0.tgz", + "integrity": "sha512-W79/hq6xGyV4lFsgt+qgKHPorGu4RzAhFQ5GKXI0T8DbkEMx+7gjFAD2y+q194vMMiIvMhuE7j6JyCEZVMOHYw==", + "dev": true, + "requires": { + "fastify-plugin": "^2.3.2" + }, + "dependencies": { + "fastify-plugin": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-2.3.4.tgz", + "integrity": "sha512-I+Oaj6p9oiRozbam30sh39BiuiqBda7yK2nmSPVwDCfIBlKnT8YB3MY+pRQc2Fcd07bf6KPGklHJaQ2Qu81TYQ==", + "dev": true, + "requires": { + "semver": "^7.3.2" + } + } + } + }, + "fastify-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-3.0.0.tgz", + "integrity": "sha512-ZdCvKEEd92DNLps5n0v231Bha8bkz1DjnPP/aEz37rz/q42Z5JVLmgnqR4DYuNn3NXAO3IDCPyRvgvxtJ4Ym4w==", + "dev": true + }, + "fastify-warning": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/fastify-warning/-/fastify-warning-0.2.0.tgz", + "integrity": "sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw==", + "dev": true + }, "fastq": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", @@ -3405,6 +3615,18 @@ "unpipe": "~1.0.0" } }, + "find-my-way": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-4.1.0.tgz", + "integrity": "sha512-UBD94MdO6cBi6E97XA0fBA9nwqw+xG5x1TYIPHats33gEi/kNqy7BWHAWx8QHCQQRSU5Txc0JiD8nzba39gvMQ==", + "dev": true, + "requires": { + "fast-decode-uri-component": "^1.0.1", + "fast-deep-equal": "^3.1.3", + "safe-regex2": "^2.0.0", + "semver-store": "^0.3.0" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -3425,6 +3647,12 @@ "rimraf": "^3.0.2" } }, + "flatstr": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", + "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==", + "dev": true + }, "flatted": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", @@ -4677,9 +4905,9 @@ "dev": true }, "jsdom": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.2.tgz", - "integrity": "sha512-JxNtPt9C1ut85boCbJmffaQ06NBnzkQY/MWO3YxPW8IWS38A26z+B1oBvA9LwKrytewdfymnhi4UNH3/RAgZrg==", + "version": "16.5.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz", + "integrity": "sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA==", "dev": true, "requires": { "abab": "^2.0.5", @@ -4809,6 +5037,47 @@ "type-check": "~0.4.0" } }, + "light-my-request": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-4.4.1.tgz", + "integrity": "sha512-FDNRF2mYjthIRWE7O8d/X7AzDx4otQHl4/QXbu3Q/FRwBFcgb+ZoDaUd5HwN53uQXLAiw76osN+Va0NEaOW6rQ==", + "dev": true, + "requires": { + "ajv": "^6.12.2", + "cookie": "^0.4.0", + "fastify-warning": "^0.2.0", + "readable-stream": "^3.6.0", + "set-cookie-parser": "^2.4.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -4950,6 +5219,25 @@ "picomatch": "^2.2.3" } }, + "middie": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/middie/-/middie-5.2.0.tgz", + "integrity": "sha512-QSrtYKyeGfdrsUzpwo6/NtPeac56CkPJpsVbGRaPE+7ekfrcfbdobjFiUFELYtDCUJpmLsXlOZtM4JE8YPvCcQ==", + "dev": true, + "requires": { + "fastify-plugin": "^3.0.0", + "path-to-regexp": "^6.1.0", + "reusify": "^1.0.4" + }, + "dependencies": { + "path-to-regexp": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", + "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==", + "dev": true + } + } + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -5437,6 +5725,26 @@ "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", "dev": true }, + "pino": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.11.2.tgz", + "integrity": "sha512-bmzxwbrIPxQUlAuMkF4PWVErUGERU4z37HazlhflKFg08crsNE3fACGN6gPwg5xtKOK47Ux5cZm8YCuLV4wWJg==", + "dev": true, + "requires": { + "fast-redact": "^3.0.0", + "fast-safe-stringify": "^2.0.7", + "flatstr": "^1.0.12", + "pino-std-serializers": "^3.1.0", + "quick-format-unescaped": "4.0.1", + "sonic-boom": "^1.0.2" + } + }, + "pino-std-serializers": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", + "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==", + "dev": true + }, "pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", @@ -5569,6 +5877,12 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-format-unescaped": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz", + "integrity": "sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A==", + "dev": true + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -5636,6 +5950,12 @@ "string_decoder": "~0.10.x" } }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -5812,9 +6132,9 @@ "dev": true }, "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", "dev": true }, "reusify": { @@ -5823,6 +6143,12 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -5847,6 +6173,23 @@ "queue-microtask": "^1.2.2" } }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -5860,6 +6203,23 @@ "dev": true, "requires": { "ret": "~0.1.10" + }, + "dependencies": { + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + } + } + }, + "safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "dev": true, + "requires": { + "ret": "~0.2.0" } }, "safer-buffer": { @@ -6023,6 +6383,12 @@ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, + "secure-json-parse": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz", + "integrity": "sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg==", + "dev": true + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -6032,6 +6398,12 @@ "lru-cache": "^6.0.0" } }, + "semver-store": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", + "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==", + "dev": true + }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -6079,6 +6451,12 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-cookie-parser": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", + "integrity": "sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==", + "dev": true + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -6283,6 +6661,16 @@ } } }, + "sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "dev": true, + "requires": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6472,6 +6860,12 @@ "strip-ansi": "^6.0.0" } }, + "string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==", + "dev": true + }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -6663,9 +7057,9 @@ }, "dependencies": { "ajv": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.0.5.tgz", - "integrity": "sha512-RkiLa/AeJx7+9OvniQ/qeWu0w74A8DiPPBclQ6ji3ZQkv5KamO+QGpqmi7O4JIw3rHGUXZ6CoP9tsAkn3gyazg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz", + "integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -6721,6 +7115,12 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "tiny-lru": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-7.0.6.tgz", + "integrity": "sha512-zNYO0Kvgn5rXzWpL0y3RS09sMK67eGaQj9805jlK9G6pSadfriTczzLHFXa/xcW4mIRfmlB9HyQ/+SgL0V1uow==", + "dev": true + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", diff --git a/package.json b/package.json index 0b35848..15a220e 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ ], "engineStrict": false, "engines": { - "node": "^8.17 || >=10.24 || >=12.22 || >=14.16.1" + "node": "^10.24 || >=12.22 || >=14.16 || >=15.14" }, "scripts": { "start:dev": "tsc -w", @@ -20,7 +20,7 @@ "prepare": "npm run build", "format": "prettier --write \"src/**/*.ts\"", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", - "lint:ci": "eslint \"{src,apps,libs,test}/**/*.ts\"", + "lint:ci": "eslint \"{src,apps,libs,test}/**/*.ts\"", "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", @@ -51,23 +51,26 @@ "@nestjs/common": "^7.6.15", "@nestjs/core": "^7.6.15", "@nestjs/platform-express": "^7.6.15", + "@nestjs/platform-fastify": "^7.6.15", "@nestjs/testing": "^7.6.15", "@types/express": "^4.17.11", "@types/jest": "^26.0.22", "@types/node": "^14.14.37", "@types/supertest": "^2.0.11", + "@typescript-eslint/eslint-plugin": "^4.19.0", + "@typescript-eslint/parser": "^4.19.0", + "eslint": "^7.24.0", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-prettier": "^3.3.1", "jest": "^26.6.3", "prettier": "^2.2.1", + "reflect-metadata": "^0.1.13", + "rxjs": "^6.6.7", "supertest": "^6.1.3", "ts-jest": "^26.5.4", "ts-node": "^9.1.1", "tsc-watch": "^4.2.9", "tsconfig-paths": "^3.9.0", - "@typescript-eslint/eslint-plugin": "^4.19.0", - "@typescript-eslint/parser": "^4.19.0", - "eslint": "^7.24.0", - "eslint-config-prettier": "^8.1.0", - "eslint-plugin-prettier": "^3.3.1", "typescript": "^4.2.4" }, "jest": { @@ -76,12 +79,14 @@ "json", "ts" ], - "rootDir": "src", "testRegex": ".spec.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, - "coverageDirectory": "../coverage", + "coverageDirectory": "./coverage", + "collectCoverageFrom": [ + "src/**/*.ts" + ], "testEnvironment": "node" } } diff --git a/src/ethers-core.module.ts b/src/ethers-core.module.ts new file mode 100644 index 0000000..35ded61 --- /dev/null +++ b/src/ethers-core.module.ts @@ -0,0 +1,39 @@ +import { + DynamicModule, + Global, + Module, + OnApplicationShutdown, +} from '@nestjs/common'; +import { Networkish } from '@ethersproject/providers'; +import { + EthersModuleOptions, + EthersModuleAsyncOptions, +} from './interfaces/ethers-options.interface'; + +@Global() +@Module({}) +export class EthersCoreModule implements OnApplicationShutdown { + static forRoot( + network: Networkish = 'homestead', + options: EthersModuleOptions = {}, + ): DynamicModule { + return { + module: EthersCoreModule, + providers: [], + exports: [], + }; + } + + static forRootAsync(options: EthersModuleAsyncOptions): DynamicModule { + return { + module: EthersCoreModule, + imports: options.imports, + providers: [], + exports: [], + }; + } + + async onApplicationShutdown(signal?: string) { + throw new Error('Method not implemented.'); + } +} diff --git a/src/ethers.module.ts b/src/ethers.module.ts new file mode 100644 index 0000000..a3b6034 --- /dev/null +++ b/src/ethers.module.ts @@ -0,0 +1,27 @@ +import { Module, DynamicModule } from '@nestjs/common'; +import { Networkish } from '@ethersproject/providers'; +import { EthersCoreModule } from './ethers-core.module'; +import { + EthersModuleOptions, + EthersModuleAsyncOptions, +} from './interfaces/ethers-options.interface'; + +@Module({}) +export class EthersModule { + static forRoot( + network: Networkish = 'homestead', + options: EthersModuleOptions = {}, + ): DynamicModule { + return { + module: EthersModule, + imports: [EthersCoreModule.forRoot(network, options)], + }; + } + + static forRootAsync(options: EthersModuleAsyncOptions): DynamicModule { + return { + module: EthersModule, + imports: [EthersCoreModule.forRootAsync(options)], + }; + } +} diff --git a/src/index.ts b/src/index.ts index 462c161..05bd810 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,2 @@ -// export public api from here -// for example: -// export * from './decorators'; -export * from './test'; +export * from './interfaces'; +export * from './ethers.module'; diff --git a/src/interfaces/ethers-options.interface.ts b/src/interfaces/ethers-options.interface.ts new file mode 100644 index 0000000..d881ce2 --- /dev/null +++ b/src/interfaces/ethers-options.interface.ts @@ -0,0 +1,33 @@ +import { ModuleMetadata } from '@nestjs/common/interfaces'; +import { Networkish } from '@ethersproject/providers'; + +interface InfuraProviderOptions { + projectId: string; + projectSecret: string; +} + +interface PocketProviderOptions { + applicationId: string; + applicationSecretKey: string; +} + +interface DefaultProviderOptions { + alchemy?: string; + etherscan?: string; + infura?: InfuraProviderOptions | string; + pocket?: PocketProviderOptions | string; + quorum?: number; +} + +export interface EthersModuleOptions extends Record { + network?: Networkish; + options?: DefaultProviderOptions; +} + +export interface EthersModuleAsyncOptions + extends Pick { + useFactory: ( + ...args: any[] + ) => EthersModuleOptions | Promise; + inject?: any[]; +} diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts new file mode 100644 index 0000000..5015b90 --- /dev/null +++ b/src/interfaces/index.ts @@ -0,0 +1 @@ +export * from './ethers-options.interface'; diff --git a/src/test.ts b/src/test.ts deleted file mode 100644 index 7c48054..0000000 --- a/src/test.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function getHello(): string { - return 'Hello from the new package!'; -} diff --git a/tsconfig.json b/tsconfig.json index 724f30f..8447877 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,6 @@ "target": "es2017", "sourceMap": true, "outDir": "./dist", - "rootDir": "./src", "baseUrl": "./", "incremental": true, "strict": true,