From bf0b602b81de847200cacab7f930658e477cf855 Mon Sep 17 00:00:00 2001 From: mcasimir Date: Wed, 25 Aug 2021 16:45:44 +0200 Subject: [PATCH] lint --- .eslintrc | 15 - .eslintrc.js | 44 ++ .gitignore | 3 +- .prettierrc.json | 3 + README.md | 20 +- docker/community/README.md | 5 +- docker/community/config.ts | 8 +- docker/community/docker-compose.yaml | 4 +- docker/enterprise/README.md | 19 +- docker/enterprise/config.ts | 8 +- docker/enterprise/docker-compose.yaml | 6 +- docker/kerberos/README.md | 32 +- docker/kerberos/config.ts | 44 +- docker/kerberos/docker-compose.yaml | 68 +-- docker/kerberos/initdb/init.js | 40 +- docker/ldap/README.md | 5 +- docker/ldap/config.ts | 16 +- docker/ldap/docker-compose.yaml | 14 +- docker/ldap/initdb/init.js | 4 +- docker/replica-set/README.md | 8 +- docker/replica-set/config.ts | 14 +- docker/replica-set/docker-compose.yaml | 112 ++-- docker/scram/config.ts | 42 +- docker/scram/docker-compose.yaml | 6 +- docker/scram/initdb/init.js | 82 +-- docker/sharded/config.ts | 8 +- docker/sharded/docker-compose.yaml | 2 +- docker/srv-no-ssl/README.md | 11 +- docker/ssh/config.ts | 34 +- docker/ssh/docker-compose.yaml | 56 +- docker/tls/config.ts | 68 +-- docker/tls/docker-compose.yaml | 30 +- docker/tls/initdb-x509/init.js | 19 +- package-lock.json | 725 ++++++++++++++++++++++++- package.json | 14 +- src/fixtures/config.ts | 10 +- src/fixtures/docker-compose.yaml | 4 +- src/index.ts | 28 +- src/test-environment.spec.ts | 18 +- src/test-environment.ts | 48 +- src/test-environments.ts | 8 +- tsconfig-lint.json | 5 + 42 files changed, 1241 insertions(+), 469 deletions(-) delete mode 100644 .eslintrc create mode 100644 .eslintrc.js create mode 100644 .prettierrc.json create mode 100644 tsconfig-lint.json diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 9418730..0000000 --- a/.eslintrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": ["eslint:recommended", "plugin:mocha/recommended"], - "parserOptions": { - "ecmaVersion": 2018 - }, - "env": { - "node": true, - "es6": true, - "mocha": true - }, - "rules": { - "semi": "error", - "quotes": ["error", "single"] - } -} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..1fdd6d4 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,44 @@ +const jsConfigurations = ['eslint:recommended']; + +const tsConfigurations = [ + ...jsConfigurations, + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', +]; +const tsRules = { + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-return': 'off', +}; + +const testConfigurations = ['plugin:mocha/recommended']; + +module.exports = { + parserOptions: { + project: ['./tsconfig-lint.json'], + }, + plugins: ['@typescript-eslint', 'mocha'], + env: { node: true }, + overrides: [ + { + parserOptions: { + ecmaVersion: 2018, + }, + files: ['**/*.js'], + env: { node: true, es6: true }, + extends: [...jsConfigurations, 'prettier'], + }, + { + parser: '@typescript-eslint/parser', + files: ['**/*.ts'], + extends: [...tsConfigurations, 'prettier'], + rules: { ...tsRules }, + }, + { + files: ['**/*.spec.js', '**/*.spec.ts'], + env: { mocha: true }, + extends: [...testConfigurations], + }, + ], +}; diff --git a/.gitignore b/.gitignore index 8ffe057..3b8e6c0 100644 --- a/.gitignore +++ b/.gitignore @@ -192,4 +192,5 @@ lib **/*.js **/*.js.map !**/initdb/*.js -*.tgz \ No newline at end of file +!.eslintrc.js +*.tgz diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..544138b --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "singleQuote": true +} diff --git a/README.md b/README.md index 36a4496..b39bdd6 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ This README is generated from the `README.tmpl.md` and all the `README.md` in th 1. Start a testing environment defined in a directory by running: - ``` sh - docker-compose -f docker//docker-compose.yaml up - ``` +```sh +docker-compose -f docker//docker-compose.yaml up +``` 2. Connect using the instructions specific for that testing environment as specified in the readme of each folder @@ -51,7 +51,7 @@ You can either run `docker-compose up` from the subfolder containing the `docker For example this will start a sharded cluster: -``` sh +```sh docker-compose -f sharded/docker-compose.yaml up ``` @@ -61,16 +61,12 @@ Please also refer to the official documentation ([Getting Started](https://docs. #### Programmatically -``` js +```js const createTestEnvironments = require('@mongodb-js/devtools-docker-test-envs'); -const testEnvironments = createTestEnvironments([ - '...', - 'sharded', - '...' -]); +const testEnvironments = createTestEnvironments(['...', 'sharded', '...']); -before(async() => { +before(async () => { await testEnvironments.start(); }); @@ -79,7 +75,7 @@ it('can connect to sharded cluster', () => { await MongoClient.connect(connectionString); }); -after(async() => { +after(async () => { await testEnvironments.stop(); }); ``` diff --git a/docker/community/README.md b/docker/community/README.md index 1e5ef01..51c9b70 100644 --- a/docker/community/README.md +++ b/docker/community/README.md @@ -1,13 +1,12 @@ - ### Standalone community server (no auth) -``` sh +```sh docker-compose -f community/docker-compose.yaml up ``` #### How to connect -``` sh +```sh mongo \ --host localhost \ --port 27020 diff --git a/docker/community/config.ts b/docker/community/config.ts index 28f3ab4..f53d98e 100644 --- a/docker/community/config.ts +++ b/docker/community/config.ts @@ -1,14 +1,14 @@ -const path = require("path"); +import path from 'path'; export default { dockerCompose: { projectName: path.basename(__dirname), - yamlPath: path.resolve(__dirname, "docker-compose.yaml"), + yamlPath: path.resolve(__dirname, 'docker-compose.yaml'), }, - waitOn: ["tcp:27020"], + waitOn: ['tcp:27020'], connections: { community: { - connectionString: "mongodb://localhost:27020/test", + connectionString: 'mongodb://localhost:27020/test', }, }, }; diff --git a/docker/community/docker-compose.yaml b/docker/community/docker-compose.yaml index 68b5515..43db2a8 100644 --- a/docker/community/docker-compose.yaml +++ b/docker/community/docker-compose.yaml @@ -2,6 +2,6 @@ version: '3' services: mongodb: - image: "mongo:${MONGODB_VERSION:-4.4}" + image: 'mongo:${MONGODB_VERSION:-4.4}' ports: - - "27020:27017" + - '27020:27017' diff --git a/docker/enterprise/README.md b/docker/enterprise/README.md index 3b963d4..0dc7f1d 100644 --- a/docker/enterprise/README.md +++ b/docker/enterprise/README.md @@ -1,13 +1,12 @@ - ### Enterprise server -``` sh +```sh docker-compose -f enterprise/docker-compose.yaml up ``` #### How to connect -``` sh +```sh mongo \ --host localhost \ --port 27021 @@ -40,11 +39,11 @@ Additional dependencies for kerberos and LDAP are automatically added in a `RUN` Enterprise images can be referenced by other testing environments that requires the enterprise server. It can be done pointing the build context to one of the image directory and setting the right build arguments. -``` yaml - build: - image: devtools-mongodb-enterprise: - context: "../enterprise/" - args: - MONGO_PACKAGE: "mongodb-enterprise" - MONGO_REPO: repo.mongodb.com +```yaml +build: + image: devtools-mongodb-enterprise: + context: '../enterprise/' + args: + MONGO_PACKAGE: 'mongodb-enterprise' + MONGO_REPO: repo.mongodb.com ``` diff --git a/docker/enterprise/config.ts b/docker/enterprise/config.ts index b6ce55a..ba0fb9b 100644 --- a/docker/enterprise/config.ts +++ b/docker/enterprise/config.ts @@ -1,14 +1,14 @@ -const path = require("path"); +import path from 'path'; export default { dockerCompose: { projectName: path.basename(__dirname), - yamlPath: path.resolve(__dirname, "docker-compose.yaml"), + yamlPath: path.resolve(__dirname, 'docker-compose.yaml'), }, - waitOn: ["tcp:27021"], + waitOn: ['tcp:27021'], connections: { enterprise: { - connectionString: "mongodb://localhost:27021/test", + connectionString: 'mongodb://localhost:27021/test', }, }, }; diff --git a/docker/enterprise/docker-compose.yaml b/docker/enterprise/docker-compose.yaml index a6f80bb..55c90bc 100644 --- a/docker/enterprise/docker-compose.yaml +++ b/docker/enterprise/docker-compose.yaml @@ -4,9 +4,9 @@ services: mongodb: image: devtools-mongodb-enterprise:${MONGODB_VERSION:-4.4} build: - context: "${MONGODB_VERSION:-4.4}" + context: '${MONGODB_VERSION:-4.4}' args: - MONGO_PACKAGE: "mongodb-enterprise" + MONGO_PACKAGE: 'mongodb-enterprise' MONGO_REPO: repo.mongodb.com ports: - - "27021:27017" + - '27021:27017' diff --git a/docker/kerberos/README.md b/docker/kerberos/README.md index f3c02dd..81c7267 100644 --- a/docker/kerberos/README.md +++ b/docker/kerberos/README.md @@ -4,13 +4,13 @@ Make sure you have this line in your `/etc/hosts`: -``` conf +```conf 127.0.0.1 mongodb-kerberos-1.example.com mongodb-kerberos-2.example.com mongodb-kerberos-3.examplecrossrealm.com ``` Make sure you have this in `/etc/krb5.conf` (note the `domain_realm` section to configure cross-realm): -``` conf +```conf [realms] EXAMPLE.COM = { kdc = localhost @@ -28,26 +28,26 @@ Make sure you have this in `/etc/krb5.conf` (note the `domain_realm` section to Start the docker environment: -``` sh +```sh docker-compose -f kerberos/docker-compose.yaml up ``` Authenticate with kdc (the password is `password`): -``` sh +```sh kinit mongodb.user@EXAMPLE.COM ``` **Important:** To stop the environment, make sure to use the `-v` flag: -``` sh +```sh docker-compose -f kerberos/docker-compose.yaml down -v ``` - #### How to connect ##### Kerberos Setup + There are two Kerberos _Key Distribution Centers_ (KDCs) setup: `kdc-admin` and `kdc-admin2`. These two cover the `EXAMPLE.COM` and `EXAMPLE2.COM` realm respectively. All users listed below are registered in the `EXAMPLE.COM` realm. The service principals for `mongodb-kerberos-1` and `mongodb-kerberos-2` are also registered in the `EXAMPLE.COM` realm. The service principal for `mongodb-kerberos-3` is registered in the `EXAMPLE2.COM` realm. The two Kerberos installations have cross-realm authentication enabled so that `kdc-admin2` (realm `EXAMPLE2.COM`) **trusts** `kdc-admin` (realm `EXAMPLE.COM`). For details on how this cross-realm trust is configured refer to [Setting up Cross-Realm Kerberos Trusts](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system-level_authentication_guide/using_trusts). @@ -68,7 +68,7 @@ The server `mongodb-kerberos-3.examplecrossrealm.com` has the default `gssapiSer ##### Compass -``` yaml +```yaml hostname: mongodb-kerberos-1.example.com port: 29017 principal: mongodb.user@EXAMPLE.COM @@ -78,28 +78,32 @@ gssapiServiceName: mongodb ##### Connection string With as few properties as possible (`gssapiServiceName`, `authSource` will be inferred automatically) - does not work in the _old shell_: -``` sh + +```sh mongodb://mongodb.user%40EXAMPLE.COM@mongodb-kerberos-1.example.com:29017/?authMechanism=GSSAPI ``` With `authSource` for the old shell: -``` sh + +```sh mongodb://mongodb.user%40EXAMPLE.COM@mongodb-kerberos-1.example.com:29017/?authMechanism=GSSAPI&authSource=%24external ``` -With an alternate service name using official `SERVICE_NAME` auth - does not work in the _old shell_: -``` sh +With an alternate service name using official `SERVICE_NAME` auth - does not work in the _old shell_: + +```sh mongodb://mongodb.user%40EXAMPLE.COM@mongodb-kerberos-2.example.com:29018/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:alternate ``` With an alternate service name for the old shell: -``` sh + +```sh mongodb://mongodb.user%40EXAMPLE.COM@mongodb-kerberos-2.example.com:29018/?gssapiServiceName=alternate&authMechanism=GSSAPI&authSource=%24external ``` ##### Shell (enterprise) -``` sh +```sh mongo \ --host mongodb-kerberos-1.example.com \ --port 29017 \ @@ -108,7 +112,7 @@ mongo \ -u mongodb.user@EXAMPLE.COM ``` -``` sh +```sh mongo \ --host mongodb-kerberos-2.example.com \ --port 29018 \ diff --git a/docker/kerberos/config.ts b/docker/kerberos/config.ts index a3a1779..9202839 100644 --- a/docker/kerberos/config.ts +++ b/docker/kerberos/config.ts @@ -1,53 +1,53 @@ -const path = require("path"); -const execa = require("execa"); +import path from 'path'; +import execa from 'execa'; -const { default: ConnectionString } = require("mongodb-connection-string-url"); +import { default as ConnectionString } from 'mongodb-connection-string-url'; -const principal = "mongodb.user"; +const principal = 'mongodb.user'; const simple = new ConnectionString( - "mongodb://mongodb-kerberos-1.example.com:29017" + 'mongodb://mongodb-kerberos-1.example.com:29017' ); simple.username = principal; -simple.searchParams.set("authMechanism", "GSSAPI"); +simple.searchParams.set('authMechanism', 'GSSAPI'); const alternate = new ConnectionString( - "mongodb://mongodb-kerberos-2.example.com:29018" + 'mongodb://mongodb-kerberos-2.example.com:29018' ); alternate.username = principal; -alternate.searchParams.set("authMechanism", "GSSAPI"); -alternate.searchParams.set("authMechanismProperties", "SERVICE_NAME:alternate"); +alternate.searchParams.set('authMechanism', 'GSSAPI'); +alternate.searchParams.set('authMechanismProperties', 'SERVICE_NAME:alternate'); const crossRealm = new ConnectionString( - "mongodb://mongodb-kerberos-3.examplecrossrealm.com:29019" + 'mongodb://mongodb-kerberos-3.examplecrossrealm.com:29019' ); crossRealm.username = principal; -crossRealm.searchParams.set("authMechanism", "GSSAPI"); +crossRealm.searchParams.set('authMechanism', 'GSSAPI'); export default { dockerCompose: { projectName: path.basename(__dirname), - yamlPath: path.resolve(__dirname, "docker-compose.yaml"), + yamlPath: path.resolve(__dirname, 'docker-compose.yaml'), }, - waitOn: ["tcp:29017", "tcp:29018", "tcp:29019"], + waitOn: ['tcp:29017', 'tcp:29018', 'tcp:29019'], hosts: [ - "mongodb-kerberos-1.example.com", - "mongodb-kerberos-2.example.com", - "mongodb-kerberos-3.examplecrossrealm.com", + 'mongodb-kerberos-1.example.com', + 'mongodb-kerberos-2.example.com', + 'mongodb-kerberos-3.examplecrossrealm.com', ], - setup: async () => { + setup: async (): Promise => { try { // hemdal - await execa("kinit", ["--password-file=STDIN", principal], { - input: "password", + await execa('kinit', ['--password-file=STDIN', principal], { + input: 'password', }); } catch (e) { // mit - await execa("kinit", [principal], { input: "password" }); + await execa('kinit', [principal], { input: 'password' }); } }, - teardown: async () => { + teardown: async (): Promise => { try { - await execa("kdestroy", ["-p", principal]); + await execa('kdestroy', ['-p', principal]); } catch (e) { // } diff --git a/docker/kerberos/docker-compose.yaml b/docker/kerberos/docker-compose.yaml index 3d559ef..ce81746 100644 --- a/docker/kerberos/docker-compose.yaml +++ b/docker/kerberos/docker-compose.yaml @@ -1,4 +1,4 @@ -version: "3" +version: '3' services: kdc-kadmin: image: kdc-kadmin:example @@ -15,10 +15,10 @@ services: - /dev/urandom:/dev/random - krb5-keytabs:/etc/krb5-keytabs ports: - - "88:88" # kdc - - "88:88/udp" - - "750:750" - - "749:749" # kadmind + - '88:88' # kdc + - '88:88/udp' + - '750:750' + - '749:749' # kadmind kdc-kadmin2: image: kdc-kadmin:example2 @@ -35,97 +35,97 @@ services: - /dev/urandom:/dev/random - krb5_2-keytabs:/etc/krb5-keytabs ports: - - "89:88" # kdc - - "89:88/udp" - - "850:750" - - "849:749" # kadmind + - '89:88' # kdc + - '89:88/udp' + - '850:750' + - '849:749' # kadmind mongodb1: image: devtools-mongodb-enterprise:4.4 build: - context: "../enterprise/4.4" + context: '../enterprise/4.4' args: - MONGO_PACKAGE: "mongodb-enterprise" + MONGO_PACKAGE: 'mongodb-enterprise' MONGO_REPO: repo.mongodb.com environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: root MONGO_INITDB_DATABASE: admin - KRB5_KTNAME: "/etc/krb5-keytabs/mongodb.keytab" + KRB5_KTNAME: '/etc/krb5-keytabs/mongodb.keytab' hostname: mongodb-kerberos-1.example.com depends_on: - kdc-kadmin ports: - - "29017:27017" + - '29017:27017' volumes: - krb5-keytabs:/etc/krb5-keytabs:ro - ./etc/krb5-example.conf:/etc/krb5.conf:ro - ./initdb:/docker-entrypoint-initdb.d/:ro command: - - "mongod" - - "--setParameter" - - "authenticationMechanisms=GSSAPI,SCRAM-SHA-256" # Note SCRAM-SHA-256 is required to create the users + - 'mongod' + - '--setParameter' + - 'authenticationMechanisms=GSSAPI,SCRAM-SHA-256' # Note SCRAM-SHA-256 is required to create the users mongodb2: image: devtools-mongodb-enterprise:4.4 build: - context: "../enterprise/4.4" + context: '../enterprise/4.4' args: - MONGO_PACKAGE: "mongodb-enterprise" + MONGO_PACKAGE: 'mongodb-enterprise' MONGO_REPO: repo.mongodb.com environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: root MONGO_INITDB_DATABASE: admin - KRB5_KTNAME: "/etc/krb5-keytabs/mongodb.keytab" + KRB5_KTNAME: '/etc/krb5-keytabs/mongodb.keytab' hostname: mongodb-kerberos-2.example.com depends_on: - kdc-kadmin ports: - - "29018:27017" + - '29018:27017' volumes: - krb5-keytabs:/etc/krb5-keytabs:ro - ./etc/krb5-example.conf:/etc/krb5.conf:ro - ./initdb:/docker-entrypoint-initdb.d/:ro command: - - "mongod" - - "--setParameter" - - "authenticationMechanisms=GSSAPI,SCRAM-SHA-256" # Note SCRAM-SHA-256 is required to create the users - - "--setParameter" - - "saslServiceName=alternate" + - 'mongod' + - '--setParameter' + - 'authenticationMechanisms=GSSAPI,SCRAM-SHA-256' # Note SCRAM-SHA-256 is required to create the users + - '--setParameter' + - 'saslServiceName=alternate' mongodb3: image: devtools-mongodb-enterprise:4.4 build: - context: "../enterprise/4.4" + context: '../enterprise/4.4' args: - MONGO_PACKAGE: "mongodb-enterprise" + MONGO_PACKAGE: 'mongodb-enterprise' MONGO_REPO: repo.mongodb.com environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: root MONGO_INITDB_DATABASE: admin - KRB5_KTNAME: "/etc/krb5-keytabs/mongodb.keytab" + KRB5_KTNAME: '/etc/krb5-keytabs/mongodb.keytab' hostname: mongodb-kerberos-3.examplecrossrealm.com depends_on: - kdc-kadmin2 ports: - - "29019:27017" + - '29019:27017' volumes: - krb5_2-keytabs:/etc/krb5-keytabs:ro - ./etc/krb5-example2.conf:/etc/krb5.conf:ro - ./initdb:/docker-entrypoint-initdb.d/:ro command: - - "mongod" - - "--setParameter" - - "authenticationMechanisms=GSSAPI,SCRAM-SHA-256" # Note SCRAM-SHA-256 is required to create the users + - 'mongod' + - '--setParameter' + - 'authenticationMechanisms=GSSAPI,SCRAM-SHA-256' # Note SCRAM-SHA-256 is required to create the users client: image: devtools-mongodb-enterprise:4.4 build: - context: "../enterprise/4.4" + context: '../enterprise/4.4' args: - MONGO_PACKAGE: "mongodb-enterprise" + MONGO_PACKAGE: 'mongodb-enterprise' MONGO_REPO: repo.mongodb.com environment: {} depends_on: diff --git a/docker/kerberos/initdb/init.js b/docker/kerberos/initdb/init.js index 49755d6..1c7dba7 100644 --- a/docker/kerberos/initdb/init.js +++ b/docker/kerberos/initdb/init.js @@ -4,28 +4,22 @@ db.auth('root', 'root'); db = db.getSiblingDB('$external'); -db.createUser( - { - user: 'encoded!user@EXAMPLE.COM', - roles: [ { role: 'readWriteAnyDatabase', db: 'admin' } ] - } -) +db.createUser({ + user: 'encoded!user@EXAMPLE.COM', + roles: [{ role: 'readWriteAnyDatabase', db: 'admin' }], +}); -db.createUser( - { - user: 'mongodb.user@EXAMPLE.COM', - roles: [ { role: 'readWriteAnyDatabase', db: 'admin' } ] - } -) +db.createUser({ + user: 'mongodb.user@EXAMPLE.COM', + roles: [{ role: 'readWriteAnyDatabase', db: 'admin' }], +}); -db.createUser( - { - user: 'application/reporting@EXAMPLE.COM', - roles: [ - { role: 'read', db: 'db1' }, - { role: 'readWrite', db: 'db2' }, - { role: 'dbAdmin', db: 'db3' }, - { role: 'dbOwner', db: 'db4' } - ] - } -) +db.createUser({ + user: 'application/reporting@EXAMPLE.COM', + roles: [ + { role: 'read', db: 'db1' }, + { role: 'readWrite', db: 'db2' }, + { role: 'dbAdmin', db: 'db3' }, + { role: 'dbOwner', db: 'db4' }, + ], +}); diff --git a/docker/ldap/README.md b/docker/ldap/README.md index f3dd513..c0102cf 100644 --- a/docker/ldap/README.md +++ b/docker/ldap/README.md @@ -1,17 +1,18 @@ ### LDAP -``` sh +```sh docker-compose -f ldap/docker-compose.yaml up ``` By default this will use the server in version `4.4`. If you want to use `4.2` you can use the `MONGODB_SERVER` environment variable to override: + ```sh MONGODB_SERVER=4.2 docker-compose -f ldap/docker-compose.yaml up ``` #### How to connect -``` sh +```sh # With enterprise shell: mongo \ --host localhost \ diff --git a/docker/ldap/config.ts b/docker/ldap/config.ts index d76f3c2..fc82d24 100644 --- a/docker/ldap/config.ts +++ b/docker/ldap/config.ts @@ -1,18 +1,18 @@ -const path = require("path"); +import path from 'path'; -const { default: ConnectionString } = require("mongodb-connection-string-url"); +import ConnectionString from 'mongodb-connection-string-url'; -const connectionString = new ConnectionString("mongodb://localhost:30017"); -connectionString.username = "writer"; -connectionString.password = "Password1!"; -connectionString.searchParams.set("authMechanism", "PLAIN"); +const connectionString = new ConnectionString('mongodb://localhost:30017'); +connectionString.username = 'writer'; +connectionString.password = 'Password1!'; +connectionString.searchParams.set('authMechanism', 'PLAIN'); export default { dockerCompose: { projectName: path.basename(__dirname), - yamlPath: path.resolve(__dirname, "docker-compose.yaml"), + yamlPath: path.resolve(__dirname, 'docker-compose.yaml'), }, - waitOn: ["tcp:30017"], + waitOn: ['tcp:30017'], connections: { ldap: { connectionString: connectionString.href, diff --git a/docker/ldap/docker-compose.yaml b/docker/ldap/docker-compose.yaml index 5447933..92d6997 100644 --- a/docker/ldap/docker-compose.yaml +++ b/docker/ldap/docker-compose.yaml @@ -1,4 +1,4 @@ -version: "3" +version: '3' services: ldap-server: build: ./ldap @@ -6,9 +6,9 @@ services: mongodb: image: devtools-mongodb-enterprise:${MONGODB_VERSION:-4.4} build: - context: "../enterprise/${MONGODB_VERSION:-4.4}" + context: '../enterprise/${MONGODB_VERSION:-4.4}' args: - MONGO_PACKAGE: "mongodb-enterprise" + MONGO_PACKAGE: 'mongodb-enterprise' MONGO_REPO: repo.mongodb.com environment: MONGO_INITDB_ROOT_USERNAME: root @@ -17,11 +17,11 @@ services: depends_on: - ldap-server ports: - - "30017:27017" + - '30017:27017' volumes: - ./etc/mongod.conf:/etc/mongod.conf:ro - ./initdb:/docker-entrypoint-initdb.d/:ro command: - - "mongod" - - "--config" - - "/etc/mongod.conf" + - 'mongod' + - '--config' + - '/etc/mongod.conf' diff --git a/docker/ldap/initdb/init.js b/docker/ldap/initdb/init.js index 4d7c171..903c98a 100644 --- a/docker/ldap/initdb/init.js +++ b/docker/ldap/initdb/init.js @@ -5,10 +5,10 @@ db.auth('root', 'root'); db.getSiblingDB('admin').createRole({ role: 'cn=readWriteAnyDatabase,ou=dbRoles,dc=example,dc=com', privileges: [], - roles: [ 'readWriteAnyDatabase' ] + roles: ['readWriteAnyDatabase'], }); db.getSiblingDB('$external').createUser({ user: 'writer@EXAMPLE.COM', - roles: [ { role: 'readWriteAnyDatabase', db: 'admin' } ] + roles: [{ role: 'readWriteAnyDatabase', db: 'admin' }], }); diff --git a/docker/replica-set/README.md b/docker/replica-set/README.md index 686b72a..03e05cc 100644 --- a/docker/replica-set/README.md +++ b/docker/replica-set/README.md @@ -1,6 +1,6 @@ ### ReplicaSet -``` sh +```sh docker-compose -f replica-set/docker-compose.yaml up ``` @@ -20,7 +20,7 @@ Add this line to your `/etc/host`: Connection string: -``` sh +```sh mongo 'mongodb://root:password123@mongodb-rs-1:28001,mongodb-rs-2:28002,mongodb-rs-3:28003/db1?authSource=admin&replicaSet=replicaset' ``` @@ -28,12 +28,12 @@ mongo 'mongodb://root:password123@mongodb-rs-1:28001,mongodb-rs-2:28002,mongodb- The replica set has a secondary node tagged with `nodeType:ANALYTICS`. -``` sh +```sh mongo 'mongodb://root:password123@mongodb-rs-1:28001,mongodb-rs-2:28002,mongodb-rs-3:28003/db1?authSource=admin&replicaSet=replicaset&readPreference=secondary&readPreferenceTags=nodeType:ANALYTICS' ``` #### Direct connection to a private RS node -``` sh +```sh mongo 'mongodb://root:password123@localhost:28004/db1?authSource=admin' ``` diff --git a/docker/replica-set/config.ts b/docker/replica-set/config.ts index d901266..420fa48 100644 --- a/docker/replica-set/config.ts +++ b/docker/replica-set/config.ts @@ -1,24 +1,24 @@ -const path = require("path"); +import path from 'path'; export default { dockerCompose: { projectName: path.basename(__dirname), - yamlPath: path.resolve(__dirname, "docker-compose.yaml"), + yamlPath: path.resolve(__dirname, 'docker-compose.yaml'), }, - waitOn: ["tcp:28001", "tcp:28002", "tcp:28003", "tcp:28004"], - hosts: ["mongodb-rs-1", "mongodb-rs-2", "mongodb-rs-3"], + waitOn: ['tcp:28001', 'tcp:28002', 'tcp:28003', 'tcp:28004'], + hosts: ['mongodb-rs-1', 'mongodb-rs-2', 'mongodb-rs-3'], connections: { replicaSet: { connectionString: - "mongodb://root:password123@mongodb-rs-1:28001,mongodb-rs-2:28002,mongodb-rs-3:28003/db1?authSource=admin&replicaSet=replicaset", + 'mongodb://root:password123@mongodb-rs-1:28001,mongodb-rs-2:28002,mongodb-rs-3:28003/db1?authSource=admin&replicaSet=replicaset', }, replicaSetAnaylticsNode: { connectionString: - "mongodb://root:password123@mongodb-rs-1:28001,mongodb-rs-2:28002,mongodb-rs-3:28003/db1?authSource=admin&replicaSet=replicaset&readPreference=secondary&readPreferenceTags=nodeType:ANALYTICS", + 'mongodb://root:password123@mongodb-rs-1:28001,mongodb-rs-2:28002,mongodb-rs-3:28003/db1?authSource=admin&replicaSet=replicaset&readPreference=secondary&readPreferenceTags=nodeType:ANALYTICS', }, replicaSetPrivateNode: { connectionString: - "mongodb://root:password123@localhost:28004/db1?authSource=admin", + 'mongodb://root:password123@localhost:28004/db1?authSource=admin', }, }, }; diff --git a/docker/replica-set/docker-compose.yaml b/docker/replica-set/docker-compose.yaml index fb62b67..637d2e5 100644 --- a/docker/replica-set/docker-compose.yaml +++ b/docker/replica-set/docker-compose.yaml @@ -1,83 +1,83 @@ version: '2' services: - "mongodb-rs-1": - image: "docker.io/bitnami/mongodb" + 'mongodb-rs-1': + image: 'docker.io/bitnami/mongodb' environment: - MONGODB_ADVERTISED_HOSTNAME: "mongodb-rs-1" - MONGODB_REPLICA_SET_MODE: "primary" - MONGODB_ROOT_PASSWORD: "password123" - MONGODB_REPLICA_SET_KEY: "replicasetkey123" - MONGODB_PORT_NUMBER: "28001" + MONGODB_ADVERTISED_HOSTNAME: 'mongodb-rs-1' + MONGODB_REPLICA_SET_MODE: 'primary' + MONGODB_ROOT_PASSWORD: 'password123' + MONGODB_REPLICA_SET_KEY: 'replicasetkey123' + MONGODB_PORT_NUMBER: '28001' ports: - - "28001:28001" + - '28001:28001' - "mongodb-rs-2": - image: "docker.io/bitnami/mongodb" + 'mongodb-rs-2': + image: 'docker.io/bitnami/mongodb' environment: - MONGODB_ADVERTISED_HOSTNAME: "mongodb-rs-2" - MONGODB_REPLICA_SET_MODE: "secondary" - MONGODB_REPLICA_SET_KEY: "replicasetkey123" - MONGODB_PORT_NUMBER: "28002" - MONGODB_INITIAL_PRIMARY_HOST: "mongodb-rs-1" - MONGODB_INITIAL_PRIMARY_PORT_NUMBER: "28001" - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD: "password123" + MONGODB_ADVERTISED_HOSTNAME: 'mongodb-rs-2' + MONGODB_REPLICA_SET_MODE: 'secondary' + MONGODB_REPLICA_SET_KEY: 'replicasetkey123' + MONGODB_PORT_NUMBER: '28002' + MONGODB_INITIAL_PRIMARY_HOST: 'mongodb-rs-1' + MONGODB_INITIAL_PRIMARY_PORT_NUMBER: '28001' + MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD: 'password123' ports: - - "28002:28002" + - '28002:28002' - "mongodb-rs-3": - image: "docker.io/bitnami/mongodb" + 'mongodb-rs-3': + image: 'docker.io/bitnami/mongodb' environment: - MONGODB_ADVERTISED_HOSTNAME: "mongodb-rs-3" - MONGODB_REPLICA_SET_MODE: "secondary" - MONGODB_REPLICA_SET_KEY: "replicasetkey123" - MONGODB_PORT_NUMBER: "28003" - MONGODB_INITIAL_PRIMARY_HOST: "mongodb-rs-1" - MONGODB_INITIAL_PRIMARY_PORT_NUMBER: "28001" - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD: "password123" + MONGODB_ADVERTISED_HOSTNAME: 'mongodb-rs-3' + MONGODB_REPLICA_SET_MODE: 'secondary' + MONGODB_REPLICA_SET_KEY: 'replicasetkey123' + MONGODB_PORT_NUMBER: '28003' + MONGODB_INITIAL_PRIMARY_HOST: 'mongodb-rs-1' + MONGODB_INITIAL_PRIMARY_PORT_NUMBER: '28001' + MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD: 'password123' ports: - - "28003:28003" + - '28003:28003' - "setup": + 'setup': image: mongo depends_on: - mongodb-rs-1 - mongodb-rs-2 - mongodb-rs-3 entrypoint: [] - command: ["bash", "/setup-tags.sh"] + command: ['bash', '/setup-tags.sh'] volumes: - ./setup-tags.sh:/setup-tags.sh - "mongodb-rs-private-net-1": - image: "docker.io/bitnami/mongodb" + 'mongodb-rs-private-net-1': + image: 'docker.io/bitnami/mongodb' environment: - MONGODB_ADVERTISED_HOSTNAME: "mongodb-rs-private-net-1" - MONGODB_REPLICA_SET_MODE: "primary" - MONGODB_ROOT_PASSWORD: "password123" - MONGODB_REPLICA_SET_KEY: "replicasetkeyprivate" - MONGODB_PORT_NUMBER: "28004" + MONGODB_ADVERTISED_HOSTNAME: 'mongodb-rs-private-net-1' + MONGODB_REPLICA_SET_MODE: 'primary' + MONGODB_ROOT_PASSWORD: 'password123' + MONGODB_REPLICA_SET_KEY: 'replicasetkeyprivate' + MONGODB_PORT_NUMBER: '28004' ports: - - "28004:28004" + - '28004:28004' - "mongodb-rs-private-net-2": - image: "docker.io/bitnami/mongodb" + 'mongodb-rs-private-net-2': + image: 'docker.io/bitnami/mongodb' environment: - MONGODB_ADVERTISED_HOSTNAME: "mongodb-rs-private-net-2" - MONGODB_REPLICA_SET_MODE: "secondary" - MONGODB_REPLICA_SET_KEY: "replicasetkeyprivate" - MONGODB_PORT_NUMBER: "28002" - MONGODB_INITIAL_PRIMARY_HOST: "mongodb-rs-private-net-1" - MONGODB_INITIAL_PRIMARY_PORT_NUMBER: "28004" - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD: "password123" + MONGODB_ADVERTISED_HOSTNAME: 'mongodb-rs-private-net-2' + MONGODB_REPLICA_SET_MODE: 'secondary' + MONGODB_REPLICA_SET_KEY: 'replicasetkeyprivate' + MONGODB_PORT_NUMBER: '28002' + MONGODB_INITIAL_PRIMARY_HOST: 'mongodb-rs-private-net-1' + MONGODB_INITIAL_PRIMARY_PORT_NUMBER: '28004' + MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD: 'password123' - "mongodb-rs-private-net-3": - image: "docker.io/bitnami/mongodb" + 'mongodb-rs-private-net-3': + image: 'docker.io/bitnami/mongodb' environment: - MONGODB_ADVERTISED_HOSTNAME: "mongodb-rs-private-net-3" - MONGODB_REPLICA_SET_MODE: "secondary" - MONGODB_REPLICA_SET_KEY: "replicasetkeyprivate" - MONGODB_PORT_NUMBER: "28003" - MONGODB_INITIAL_PRIMARY_HOST: "mongodb-rs-private-net-1" - MONGODB_INITIAL_PRIMARY_PORT_NUMBER: "28004" - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD: "password123" + MONGODB_ADVERTISED_HOSTNAME: 'mongodb-rs-private-net-3' + MONGODB_REPLICA_SET_MODE: 'secondary' + MONGODB_REPLICA_SET_KEY: 'replicasetkeyprivate' + MONGODB_PORT_NUMBER: '28003' + MONGODB_INITIAL_PRIMARY_HOST: 'mongodb-rs-private-net-1' + MONGODB_INITIAL_PRIMARY_PORT_NUMBER: '28004' + MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD: 'password123' diff --git a/docker/scram/config.ts b/docker/scram/config.ts index 024d33c..86e679e 100644 --- a/docker/scram/config.ts +++ b/docker/scram/config.ts @@ -1,4 +1,4 @@ -const path = require("path"); +import path from 'path'; function buildConnectionString( auth: string, @@ -16,55 +16,55 @@ function buildConnectionString( export default { dockerCompose: { projectName: path.basename(__dirname), - yamlPath: path.resolve(__dirname, "docker-compose.yaml"), + yamlPath: path.resolve(__dirname, 'docker-compose.yaml'), }, - waitOn: ["tcp:28006"], + waitOn: ['tcp:28006'], connections: { scramReadWriteAnyDatabase: { - connectionString: buildConnectionString("user1:password", "admin"), + connectionString: buildConnectionString('user1:password', 'admin'), }, scramReadWriteAnyDatabaseScramSha1: { connectionString: buildConnectionString( - "user1:password", - "admin", - "SCRAM-SHA-1" + 'user1:password', + 'admin', + 'SCRAM-SHA-1' ), }, scramReadWriteAnyDatabaseScramSha256: { connectionString: buildConnectionString( - "user1:password", - "admin", - "SCRAM-SHA-256" + 'user1:password', + 'admin', + 'SCRAM-SHA-256' ), }, scramOnlyScramSha1: { connectionString: buildConnectionString( - "scramSha1:password", - "admin", - "SCRAM-SHA-1" + 'scramSha1:password', + 'admin', + 'SCRAM-SHA-1' ), }, scramOnlyScramSha256: { connectionString: buildConnectionString( - "scramSha256:password", - "admin", - "SCRAM-SHA-256" + 'scramSha256:password', + 'admin', + 'SCRAM-SHA-256' ), }, scramEncodedPassword: { connectionString: buildConnectionString( - "randomPassword:C;Ib86n5b8{AnExew[TU%XZy,)E6G!dk", - "admin" + 'randomPassword:C;Ib86n5b8{AnExew[TU%XZy,)E6G!dk', + 'admin' ), }, scramPrivilegesOnNonExistingDatabases: { - connectionString: buildConnectionString("user2:password", "admin"), + connectionString: buildConnectionString('user2:password', 'admin'), }, scramPrivilegesOnNonExistingCollections: { - connectionString: buildConnectionString("customRole:password", "admin"), + connectionString: buildConnectionString('customRole:password', 'admin'), }, scramAlternateAuthDb: { - connectionString: buildConnectionString("authDb:password", "authDb"), + connectionString: buildConnectionString('authDb:password', 'authDb'), }, }, }; diff --git a/docker/scram/docker-compose.yaml b/docker/scram/docker-compose.yaml index 85d1fa8..684102b 100644 --- a/docker/scram/docker-compose.yaml +++ b/docker/scram/docker-compose.yaml @@ -2,12 +2,12 @@ version: '3' services: mongodb: - image: "mongo" + image: 'mongo' environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: root MONGO_INITDB_DATABASE: admin ports: - - "28006:27017" + - '28006:27017' volumes: - - "./initdb:/docker-entrypoint-initdb.d/:ro" + - './initdb:/docker-entrypoint-initdb.d/:ro' diff --git a/docker/scram/initdb/init.js b/docker/scram/initdb/init.js index 30136b4..3445d50 100644 --- a/docker/scram/initdb/init.js +++ b/docker/scram/initdb/init.js @@ -10,52 +10,51 @@ db.createCollection('coll3'); db = db.getSiblingDB('admin'); -db.createUser( // readWriteAnyDatabase both SCRAM-SHA-1 and SCRAM-SHA-256 +db.createUser( + // readWriteAnyDatabase both SCRAM-SHA-1 and SCRAM-SHA-256 { user: 'user1', pwd: 'password', - roles: ['readWriteAnyDatabase'] + roles: ['readWriteAnyDatabase'], } ); -db.createUser( - { - user: 'randomPassword', - pwd: 'C;Ib86n5b8{AnExew[TU%XZy,)E6G!dk', - roles: ['readWriteAnyDatabase'] - } -) +db.createUser({ + user: 'randomPassword', + pwd: 'C;Ib86n5b8{AnExew[TU%XZy,)E6G!dk', + roles: ['readWriteAnyDatabase'], +}); -db.createUser( // readWriteAnyDatabase only SCRAM-SHA-1 +db.createUser( + // readWriteAnyDatabase only SCRAM-SHA-1 { user: 'scramSha1', pwd: 'password', roles: ['readWriteAnyDatabase'], - mechanisms: ['SCRAM-SHA-1'] + mechanisms: ['SCRAM-SHA-1'], } ); -db.createUser( // readWriteAnyDatabase only SCRAM-SHA-256 +db.createUser( + // readWriteAnyDatabase only SCRAM-SHA-256 { user: 'scramSha256', pwd: 'password', roles: ['readWriteAnyDatabase'], - mechanisms: ['SCRAM-SHA-256'] + mechanisms: ['SCRAM-SHA-256'], } ); -db.createUser( - { - user: 'user2', - pwd: 'password', - roles: [ - { role: 'read', db: 'db1' }, - { role: 'readWrite', db: 'db2' }, - { role: 'dbAdmin', db: 'db3' }, - { role: 'dbOwner', db: 'db4' } - ] - } -); +db.createUser({ + user: 'user2', + pwd: 'password', + roles: [ + { role: 'read', db: 'db1' }, + { role: 'readWrite', db: 'db2' }, + { role: 'dbAdmin', db: 'db3' }, + { role: 'dbOwner', db: 'db4' }, + ], +}); db = db.getSiblingDB('sandbox'); @@ -63,35 +62,44 @@ db.createRole( { role: 'role1', privileges: [ - { resource: { db: 'sandbox', collection: 'coll1' }, actions: ['find', 'update', 'insert', 'remove'] }, - { resource: { db: 'sandbox', collection: 'coll2' }, actions: ['update', 'insert', 'remove'] } + { + resource: { db: 'sandbox', collection: 'coll1' }, + actions: ['find', 'update', 'insert', 'remove'], + }, + { + resource: { db: 'sandbox', collection: 'coll2' }, + actions: ['update', 'insert', 'remove'], + }, ], - roles: [] + roles: [], }, { w: 'majority', wtimeout: 5000 } ); db = db.getSiblingDB('admin'); -db.createUser( // custom role with privileges on non-existing collections +db.createUser( + // custom role with privileges on non-existing collections { user: 'customRole', pwd: 'password', - roles: [{ - role: 'role1', db: 'sandbox' - }], - mechanisms: ['SCRAM-SHA-256'] + roles: [ + { + role: 'role1', + db: 'sandbox', + }, + ], + mechanisms: ['SCRAM-SHA-256'], } ); db = db.getSiblingDB('authDb'); -db.createUser( // different auth db +db.createUser( + // different auth db { user: 'authDb', pwd: 'password', - roles: [ - { role: 'dbOwner', db: 'authDb' } - ] + roles: [{ role: 'dbOwner', db: 'authDb' }], } ); diff --git a/docker/sharded/config.ts b/docker/sharded/config.ts index 7e9b6b4..5a8bdba 100644 --- a/docker/sharded/config.ts +++ b/docker/sharded/config.ts @@ -1,15 +1,15 @@ -const path = require("path"); +import path from 'path'; export default { dockerCompose: { projectName: path.basename(__dirname), - yamlPath: path.resolve(__dirname, "docker-compose.yaml"), + yamlPath: path.resolve(__dirname, 'docker-compose.yaml'), }, - waitOn: ["tcp:28004"], + waitOn: ['tcp:28004'], connections: { sharded: { connectionString: - "mongodb://root:password123@localhost:28004/db1?authSource=admin", + 'mongodb://root:password123@localhost:28004/db1?authSource=admin', }, }, }; diff --git a/docker/sharded/docker-compose.yaml b/docker/sharded/docker-compose.yaml index 5c93d74..bc4b1e6 100644 --- a/docker/sharded/docker-compose.yaml +++ b/docker/sharded/docker-compose.yaml @@ -11,7 +11,7 @@ services: - MONGODB_REPLICA_SET_KEY=replicasetkey123 - MONGODB_ROOT_PASSWORD=password123 ports: - - "28004:27017" + - '28004:27017' mongodb-shard0: image: 'docker.io/bitnami/mongodb-sharded' diff --git a/docker/srv-no-ssl/README.md b/docker/srv-no-ssl/README.md index 6bf7511..a8becd2 100644 --- a/docker/srv-no-ssl/README.md +++ b/docker/srv-no-ssl/README.md @@ -1,28 +1,27 @@ - ### Srv no ssl 1. disable the Umbrella roaming client, on mac os it can be done with: -``` sh +```sh sudo launchctl unload /Library/LaunchDaemons/com.opendns.osx.RoamingClientConfigUpdater.plist ``` You can re-enable afterwards with: -``` sh +```sh sudo launchctl load /Library/LaunchDaemons/com.opendns.osx.RoamingClientConfigUpdater.p ``` 2. Start replica set and dnsmasq: -``` sh +```sh docker-compose -f replica-set/docker-compose.yaml up docker-compose -f srv-no-ssl/docker-compose.yaml up ``` 3. Add an host entry to `/etc/hosts` -``` sh +```sh 127.0.0.1 srv-test.mongodb.dev ``` @@ -30,6 +29,6 @@ docker-compose -f srv-no-ssl/docker-compose.yaml up #### How to connect -``` sh +```sh mongodb+srv://root:password123@srv-test.mongodb.dev/db1?ssl=false ``` diff --git a/docker/ssh/config.ts b/docker/ssh/config.ts index 4fc3831..19ff445 100644 --- a/docker/ssh/config.ts +++ b/docker/ssh/config.ts @@ -1,42 +1,42 @@ -const path = require("path"); +import path from 'path'; export default { dockerCompose: { projectName: path.basename(__dirname), - yamlPath: path.resolve(__dirname, "docker-compose.yaml"), + yamlPath: path.resolve(__dirname, 'docker-compose.yaml'), }, - waitOn: ["tcp:28006"], + waitOn: ['tcp:28006'], connections: { sshPassword: { - connectionString: "mongodb://mongo:27017", + connectionString: 'mongodb://mongo:27017', sshTunnel: { - host: "localhost", + host: 'localhost', port: 22222, - username: "root", - password: "password", + username: 'root', + password: 'password', }, }, sshIdentityKey: { - connectionString: "mongodb://mongo:27017", + connectionString: 'mongodb://mongo:27017', sshTunnel: { - host: "localhost", + host: 'localhost', port: 22222, - username: "root", + username: 'root', identityKeyFile: path.resolve( __dirname, - "keys", - "key-without-passphrase" + 'keys', + 'key-without-passphrase' ), }, }, sshIdentityKeyWithPassphrase: { - connectionString: "mongodb://mongo:27017", + connectionString: 'mongodb://mongo:27017', sshTunnel: { - host: "localhost", + host: 'localhost', port: 22222, - username: "root", - identityKeyFile: path.resolve(__dirname, "keys", "key-with-passphrase"), - identityKeyPassphrase: "passphrase", + username: 'root', + identityKeyFile: path.resolve(__dirname, 'keys', 'key-with-passphrase'), + identityKeyPassphrase: 'passphrase', }, }, }, diff --git a/docker/ssh/docker-compose.yaml b/docker/ssh/docker-compose.yaml index 31b911d..6c7fe3b 100644 --- a/docker/ssh/docker-compose.yaml +++ b/docker/ssh/docker-compose.yaml @@ -1,36 +1,36 @@ -version: "3" +version: '3' services: mongo: image: mongo - "mongodb-rs-ssh-1": - image: "docker.io/bitnami/mongodb" + 'mongodb-rs-ssh-1': + image: 'docker.io/bitnami/mongodb' environment: - MONGODB_ADVERTISED_HOSTNAME: "mongodb-rs-ssh-1" - MONGODB_REPLICA_SET_MODE: "primary" - MONGODB_ROOT_PASSWORD: "password123" - MONGODB_REPLICA_SET_KEY: "replicasetkey123" - MONGODB_PORT_NUMBER: "28001" - "mongodb-rs-ssh-2": - image: "docker.io/bitnami/mongodb" + MONGODB_ADVERTISED_HOSTNAME: 'mongodb-rs-ssh-1' + MONGODB_REPLICA_SET_MODE: 'primary' + MONGODB_ROOT_PASSWORD: 'password123' + MONGODB_REPLICA_SET_KEY: 'replicasetkey123' + MONGODB_PORT_NUMBER: '28001' + 'mongodb-rs-ssh-2': + image: 'docker.io/bitnami/mongodb' environment: - MONGODB_ADVERTISED_HOSTNAME: "mongodb-rs-ssh-2" - MONGODB_REPLICA_SET_MODE: "secondary" - MONGODB_REPLICA_SET_KEY: "replicasetkey123" - MONGODB_PORT_NUMBER: "28002" - MONGODB_INITIAL_PRIMARY_HOST: "mongodb-rs-ssh-1" - MONGODB_INITIAL_PRIMARY_PORT_NUMBER: "28001" - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD: "password123" - "mongodb-rs-ssh-3": - image: "docker.io/bitnami/mongodb" + MONGODB_ADVERTISED_HOSTNAME: 'mongodb-rs-ssh-2' + MONGODB_REPLICA_SET_MODE: 'secondary' + MONGODB_REPLICA_SET_KEY: 'replicasetkey123' + MONGODB_PORT_NUMBER: '28002' + MONGODB_INITIAL_PRIMARY_HOST: 'mongodb-rs-ssh-1' + MONGODB_INITIAL_PRIMARY_PORT_NUMBER: '28001' + MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD: 'password123' + 'mongodb-rs-ssh-3': + image: 'docker.io/bitnami/mongodb' environment: - MONGODB_ADVERTISED_HOSTNAME: "mongodb-rs-ssh-3" - MONGODB_REPLICA_SET_MODE: "secondary" - MONGODB_REPLICA_SET_KEY: "replicasetkey123" - MONGODB_PORT_NUMBER: "28003" - MONGODB_INITIAL_PRIMARY_HOST: "mongodb-rs-ssh-1" - MONGODB_INITIAL_PRIMARY_PORT_NUMBER: "28001" - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD: "password123" + MONGODB_ADVERTISED_HOSTNAME: 'mongodb-rs-ssh-3' + MONGODB_REPLICA_SET_MODE: 'secondary' + MONGODB_REPLICA_SET_KEY: 'replicasetkey123' + MONGODB_PORT_NUMBER: '28003' + MONGODB_INITIAL_PRIMARY_HOST: 'mongodb-rs-ssh-1' + MONGODB_INITIAL_PRIMARY_PORT_NUMBER: '28001' + MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD: 'password123' jumphost: - build: "." + build: '.' ports: - - "22222:22" + - '22222:22' diff --git a/docker/tls/config.ts b/docker/tls/config.ts index 8622a18..27fba0f 100644 --- a/docker/tls/config.ts +++ b/docker/tls/config.ts @@ -1,59 +1,59 @@ -const path = require("path"); +import path from 'path'; -const { default: ConnectionString } = require("mongodb-connection-string-url"); +import { default as ConnectionString } from 'mongodb-connection-string-url'; -const unvalidated = new ConnectionString("mongodb://localhost:27029"); -unvalidated.searchParams.set("tls", "true"); -unvalidated.searchParams.set("tlsInsecure", "true"); +const unvalidated = new ConnectionString('mongodb://localhost:27029'); +unvalidated.searchParams.set('tls', 'true'); +unvalidated.searchParams.set('tlsInsecure', 'true'); -const serverValidation = new ConnectionString("mongodb://localhost:27029"); -serverValidation.searchParams.set("tls", "true"); +const serverValidation = new ConnectionString('mongodb://localhost:27029'); +serverValidation.searchParams.set('tls', 'true'); serverValidation.searchParams.set( - "tlsCAFile", - path.resolve(__dirname, "tls", "ca.pem") + 'tlsCAFile', + path.resolve(__dirname, 'tls', 'ca.pem') ); const serverAndClientValidation = new ConnectionString( - "mongodb://localhost:27030" + 'mongodb://localhost:27030' ); -serverAndClientValidation.searchParams.set("tls", "true"); +serverAndClientValidation.searchParams.set('tls', 'true'); serverAndClientValidation.searchParams.set( - "tlsCAFile", - path.resolve(__dirname, "tls", "ca.pem") + 'tlsCAFile', + path.resolve(__dirname, 'tls', 'ca.pem') ); serverAndClientValidation.searchParams.set( - "tlsCertificateKeyFile", - path.resolve(__dirname, "tls", "client.pem") + 'tlsCertificateKeyFile', + path.resolve(__dirname, 'tls', 'client.pem') ); -const x509 = new ConnectionString("mongodb://localhost:27031"); -x509.searchParams.set("tls", "true"); -x509.searchParams.set("tlsCAFile", path.resolve(__dirname, "tls", "ca.pem")); +const x509 = new ConnectionString('mongodb://localhost:27031'); +x509.searchParams.set('tls', 'true'); +x509.searchParams.set('tlsCAFile', path.resolve(__dirname, 'tls', 'ca.pem')); x509.searchParams.set( - "tlsCertificateKeyFile", - path.resolve(__dirname, "tls", "client.pem") + 'tlsCertificateKeyFile', + path.resolve(__dirname, 'tls', 'client.pem') ); -x509.searchParams.set("authMechanism", "MONGODB-X509"); +x509.searchParams.set('authMechanism', 'MONGODB-X509'); -const x509WithSsh = new ConnectionString("mongodb://mongodb-tls-x509:27017"); -x509WithSsh.searchParams.set("tls", "true"); -x509WithSsh.searchParams.set("tlsAllowInvalidHostnames", "true"); +const x509WithSsh = new ConnectionString('mongodb://mongodb-tls-x509:27017'); +x509WithSsh.searchParams.set('tls', 'true'); +x509WithSsh.searchParams.set('tlsAllowInvalidHostnames', 'true'); x509WithSsh.searchParams.set( - "tlsCAFile", - path.resolve(__dirname, "tls", "ca.pem") + 'tlsCAFile', + path.resolve(__dirname, 'tls', 'ca.pem') ); x509WithSsh.searchParams.set( - "tlsCertificateKeyFile", - path.resolve(__dirname, "tls", "client.pem") + 'tlsCertificateKeyFile', + path.resolve(__dirname, 'tls', 'client.pem') ); -x509WithSsh.searchParams.set("authMechanism", "MONGODB-X509"); +x509WithSsh.searchParams.set('authMechanism', 'MONGODB-X509'); export default { dockerCompose: { projectName: path.basename(__dirname), - yamlPath: path.resolve(__dirname, "docker-compose.yaml"), + yamlPath: path.resolve(__dirname, 'docker-compose.yaml'), }, - waitOn: ["tcp:27029", "tcp:27030", "tcp:27031", "tcp:22223"], + waitOn: ['tcp:27029', 'tcp:27030', 'tcp:27031', 'tcp:22223'], connections: { tlsUnvalidated: { connectionString: unvalidated.href, @@ -70,10 +70,10 @@ export default { tlsX509WithSsh: { connectionString: x509WithSsh.href, sshTunnel: { - host: "localhost", + host: 'localhost', port: 22223, - username: "root", - password: "password", + username: 'root', + password: 'password', }, }, }, diff --git a/docker/tls/docker-compose.yaml b/docker/tls/docker-compose.yaml index 05baddd..c09e6ea 100644 --- a/docker/tls/docker-compose.yaml +++ b/docker/tls/docker-compose.yaml @@ -4,20 +4,20 @@ services: mongodb-tls-server: image: mongo ports: - - "27029:27017" + - '27029:27017' volumes: - - "./mongod-server.conf:/etc/mongod.conf:ro" - - "./tls:/etc/mongod/tls:ro" - command: [ "mongod", "--bind_ip_all", "--config", "/etc/mongod.conf" ] + - './mongod-server.conf:/etc/mongod.conf:ro' + - './tls:/etc/mongod/tls:ro' + command: ['mongod', '--bind_ip_all', '--config', '/etc/mongod.conf'] mongodb-tls-server-client: image: mongo ports: - - "27030:27017" + - '27030:27017' volumes: - - "./mongod-server-client.conf:/etc/mongod.conf:ro" - - "./tls:/etc/mongod/tls:ro" - command: [ "mongod", "--bind_ip_all", "--config", "/etc/mongod.conf" ] + - './mongod-server-client.conf:/etc/mongod.conf:ro' + - './tls:/etc/mongod/tls:ro' + command: ['mongod', '--bind_ip_all', '--config', '/etc/mongod.conf'] mongodb-tls-x509: image: mongo @@ -26,14 +26,14 @@ services: MONGO_INITDB_ROOT_PASSWORD: root MONGO_INITDB_DATABASE: admin ports: - - "27031:27017" + - '27031:27017' volumes: - - "./mongod-x509.conf:/etc/mongod.conf:ro" - - "./tls:/etc/mongod/tls:ro" - - "./initdb-x509:/docker-entrypoint-initdb.d/" - command: [ "mongod", "--bind_ip_all", "--config", "/etc/mongod.conf" ] + - './mongod-x509.conf:/etc/mongod.conf:ro' + - './tls:/etc/mongod/tls:ro' + - './initdb-x509:/docker-entrypoint-initdb.d/' + command: ['mongod', '--bind_ip_all', '--config', '/etc/mongod.conf'] jumphost: - build: "../ssh" + build: '../ssh' ports: - - "22223:22" \ No newline at end of file + - '22223:22' diff --git a/docker/tls/initdb-x509/init.js b/docker/tls/initdb-x509/init.js index a95d306..c9babc9 100644 --- a/docker/tls/initdb-x509/init.js +++ b/docker/tls/initdb-x509/init.js @@ -4,13 +4,12 @@ db.auth('root', 'root'); db = db.getSiblingDB('$external'); -db.runCommand( - { - createUser: 'emailAddress=user@domain.com,CN=client1,OU=clients,O=Organisation,ST=NSW,C=AU', - roles: [ - { role: 'readWrite', db: 'test' }, - { role: 'userAdminAnyDatabase', db: 'admin' } - ], - writeConcern: { w: 'majority', wtimeout: 5000 } - } -); +db.runCommand({ + createUser: + 'emailAddress=user@domain.com,CN=client1,OU=clients,O=Organisation,ST=NSW,C=AU', + roles: [ + { role: 'readWrite', db: 'test' }, + { role: 'userAdminAnyDatabase', db: 'admin' }, + ], + writeConcern: { w: 'majority', wtimeout: 5000 }, +}); diff --git a/package-lock.json b/package-lock.json index 7a57d35..c1cca52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,12 +17,20 @@ "wait-on": "^6.0.0" }, "devDependencies": { + "@types/hostile": "^1.3.0", "@types/mocha": "^9.0.0", + "@types/uuid": "^8.3.1", + "@types/wait-on": "^5.3.1", + "@typescript-eslint/eslint-plugin": "^4.29.3", + "@typescript-eslint/parser": "^4.29.3", "depcheck": "^1.4.2", "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", "mocha": "^9.0.3", + "prettier": "^2.3.2", "ts-node": "^10.2.1", - "typescript": "^4.3.5" + "typescript": "^4.3.5", + "typescript-eslint": "^0.0.1-alpha.0" } }, "node_modules/@babel/code-frame": { @@ -354,6 +362,41 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@sideway/address": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", @@ -402,6 +445,18 @@ "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==", "dev": true }, + "node_modules/@types/hostile": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/hostile/-/hostile-1.3.0.tgz", + "integrity": "sha512-HayfH8m3sHCHPT4LBNr+MnuFIuoU13NKXXj82b+Q4rXaqN/XeNYGrb5dQKIkbNUJR8Q2Rx1xGBV61VXLn1zeDA==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "node_modules/@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", @@ -425,6 +480,21 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "node_modules/@types/uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", + "dev": true + }, + "node_modules/@types/wait-on": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.1.tgz", + "integrity": "sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/webidl-conversions": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", @@ -439,6 +509,180 @@ "@types/webidl-conversions": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.3.tgz", + "integrity": "sha512-tBgfA3K/3TsZY46ROGvoRxQr1wBkclbVqRQep97MjVHJzcRBURRY3sNFqLk0/Xr//BY5hM9H2p/kp+6qim85SA==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.29.3", + "@typescript-eslint/scope-manager": "4.29.3", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.3.tgz", + "integrity": "sha512-ffIvbytTVWz+3keg+Sy94FG1QeOvmV9dP2YSdLFHw/ieLXWCa3U1TYu8IRCOpMv2/SPS8XqhM1+ou1YHsdzKrg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.29.3", + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/typescript-estree": "4.29.3", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.3.tgz", + "integrity": "sha512-jrHOV5g2u8ROghmspKoW7pN8T/qUzk0+DITun0MELptvngtMrwUJ1tv5zMI04CYVEUsSrN4jV7AKSv+I0y0EfQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.29.3", + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/typescript-estree": "4.29.3", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.3.tgz", + "integrity": "sha512-x+w8BLXO7iWPkG5mEy9bA1iFRnk36p/goVlYobVWHyDw69YmaH9q6eA+Fgl7kYHmFvWlebUTUfhtIg4zbbl8PA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/visitor-keys": "4.29.3" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.3.tgz", + "integrity": "sha512-s1eV1lKNgoIYLAl1JUba8NhULmf+jOmmeFO1G5MN/RBCyyzg4TIOfIOICVNC06lor+Xmy4FypIIhFiJXOknhIg==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.3.tgz", + "integrity": "sha512-45oQJA0bxna4O5TMwz55/TpgjX1YrAPOI/rb6kPgmdnemRZx/dB0rsx+Ku8jpDvqTxcE1C/qEbVHbS3h0hflag==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/visitor-keys": "4.29.3", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.3.tgz", + "integrity": "sha512-MGGfJvXT4asUTeVs0Q2m+sY63UsfnA+C/FDgBKV3itLBmM9H0u+URcneePtkd0at1YELmZK6HSolCqM4Fzs6yA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.29.3", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -1043,6 +1287,18 @@ "node": ">=0.3.1" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1164,6 +1420,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-plugin-mocha": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", @@ -1377,6 +1645,22 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1387,6 +1671,15 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "node_modules/fastq": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", + "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1562,6 +1855,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -2035,6 +2357,28 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -2473,6 +2817,18 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -2498,6 +2854,26 @@ "invariant": "2.2.4" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ramda": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", @@ -2579,6 +2955,16 @@ "node": ">=4" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -2593,6 +2979,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", @@ -2687,6 +3096,15 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -3013,6 +3431,27 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3048,6 +3487,12 @@ "node": ">=4.2.0" } }, + "node_modules/typescript-eslint": { + "version": "0.0.1-alpha.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-0.0.1-alpha.0.tgz", + "integrity": "sha512-1hNKM37dAWML/2ltRXupOq2uqcdRQyDFphl+341NTPXFLLLiDhErXx8VtaSLh3xP7SyHZdcCgpt9boYYVb3fQg==", + "dev": true + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3610,6 +4055,32 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@sideway/address": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", @@ -3658,6 +4129,18 @@ "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==", "dev": true }, + "@types/hostile": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/hostile/-/hostile-1.3.0.tgz", + "integrity": "sha512-HayfH8m3sHCHPT4LBNr+MnuFIuoU13NKXXj82b+Q4rXaqN/XeNYGrb5dQKIkbNUJR8Q2Rx1xGBV61VXLn1zeDA==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", @@ -3681,6 +4164,21 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", + "dev": true + }, + "@types/wait-on": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.1.tgz", + "integrity": "sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/webidl-conversions": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", @@ -3695,6 +4193,99 @@ "@types/webidl-conversions": "*" } }, + "@typescript-eslint/eslint-plugin": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.3.tgz", + "integrity": "sha512-tBgfA3K/3TsZY46ROGvoRxQr1wBkclbVqRQep97MjVHJzcRBURRY3sNFqLk0/Xr//BY5hM9H2p/kp+6qim85SA==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.29.3", + "@typescript-eslint/scope-manager": "4.29.3", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.3.tgz", + "integrity": "sha512-ffIvbytTVWz+3keg+Sy94FG1QeOvmV9dP2YSdLFHw/ieLXWCa3U1TYu8IRCOpMv2/SPS8XqhM1+ou1YHsdzKrg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.29.3", + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/typescript-estree": "4.29.3", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.3.tgz", + "integrity": "sha512-jrHOV5g2u8ROghmspKoW7pN8T/qUzk0+DITun0MELptvngtMrwUJ1tv5zMI04CYVEUsSrN4jV7AKSv+I0y0EfQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.29.3", + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/typescript-estree": "4.29.3", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.3.tgz", + "integrity": "sha512-x+w8BLXO7iWPkG5mEy9bA1iFRnk36p/goVlYobVWHyDw69YmaH9q6eA+Fgl7kYHmFvWlebUTUfhtIg4zbbl8PA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/visitor-keys": "4.29.3" + } + }, + "@typescript-eslint/types": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.3.tgz", + "integrity": "sha512-s1eV1lKNgoIYLAl1JUba8NhULmf+jOmmeFO1G5MN/RBCyyzg4TIOfIOICVNC06lor+Xmy4FypIIhFiJXOknhIg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.3.tgz", + "integrity": "sha512-45oQJA0bxna4O5TMwz55/TpgjX1YrAPOI/rb6kPgmdnemRZx/dB0rsx+Ku8jpDvqTxcE1C/qEbVHbS3h0hflag==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.3", + "@typescript-eslint/visitor-keys": "4.29.3", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.3.tgz", + "integrity": "sha512-MGGfJvXT4asUTeVs0Q2m+sY63UsfnA+C/FDgBKV3itLBmM9H0u+URcneePtkd0at1YELmZK6HSolCqM4Fzs6yA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.3", + "eslint-visitor-keys": "^2.0.0" + } + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -4178,6 +4769,15 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4287,6 +4887,13 @@ } } }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "requires": {} + }, "eslint-plugin-mocha": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", @@ -4424,6 +5031,19 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4434,6 +5054,15 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "fastq": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", + "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -4549,6 +5178,28 @@ "type-fest": "^0.20.2" } }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -4903,6 +5554,22 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -5218,6 +5885,12 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, + "prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "dev": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -5237,6 +5910,12 @@ "invariant": "2.2.4" } }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "ramda": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", @@ -5297,6 +5976,12 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -5305,6 +5990,15 @@ "glob": "^7.1.3" } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "rxjs": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", @@ -5378,6 +6072,12 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -5609,6 +6309,23 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -5628,6 +6345,12 @@ "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", "dev": true }, + "typescript-eslint": { + "version": "0.0.1-alpha.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-0.0.1-alpha.0.tgz", + "integrity": "sha512-1hNKM37dAWML/2ltRXupOq2uqcdRQyDFphl+341NTPXFLLLiDhErXx8VtaSLh3xP7SyHZdcCgpt9boYYVb3fQg==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index e42668b..8e9b23d 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,9 @@ "types": "src/index.d.ts", "scripts": { "test": "mocha --timeout 60000 -r ts-node/register src/**/*.spec.ts", - "lint": "eslint .", + "prettier": "prettier", + "lint": "eslint . && npm run prettier -- --check .", + "reformat": "npm run prettier -- --write .", "depcheck": "depcheck .", "check": "npm run lint && npm run depcheck", "clean": "git clean --force -X --exclude node_modules", @@ -24,12 +26,20 @@ }, "homepage": "https://github.com/mongodb-js/devtools-docker-test-envs#readme", "devDependencies": { + "@types/hostile": "^1.3.0", "@types/mocha": "^9.0.0", + "@types/uuid": "^8.3.1", + "@types/wait-on": "^5.3.1", + "@typescript-eslint/eslint-plugin": "^4.29.3", + "@typescript-eslint/parser": "^4.29.3", "depcheck": "^1.4.2", "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", "mocha": "^9.0.3", + "prettier": "^2.3.2", "ts-node": "^10.2.1", - "typescript": "^4.3.5" + "typescript": "^4.3.5", + "typescript-eslint": "^0.0.1-alpha.0" }, "dependencies": { "debug": "^4.3.1", diff --git a/src/fixtures/config.ts b/src/fixtures/config.ts index 21e9edc..3251601 100644 --- a/src/fixtures/config.ts +++ b/src/fixtures/config.ts @@ -1,14 +1,14 @@ -const path = require("path"); +import path from 'path'; export default { dockerCompose: { - projectName: "community", - yamlPath: path.resolve(__dirname, "docker-compose.yaml"), + projectName: 'community', + yamlPath: path.resolve(__dirname, 'docker-compose.yaml'), }, - waitOn: ["tcp:27099"], + waitOn: ['tcp:27099'], connections: { community: { - connectionString: "mongodb://localhost:27099/test", + connectionString: 'mongodb://localhost:27099/test', }, }, }; diff --git a/src/fixtures/docker-compose.yaml b/src/fixtures/docker-compose.yaml index d2040c1..0745028 100644 --- a/src/fixtures/docker-compose.yaml +++ b/src/fixtures/docker-compose.yaml @@ -2,6 +2,6 @@ version: '3' services: mongodb: - image: "mongo:4.4" + image: 'mongo:4.4' ports: - - "27099:27017" + - '27099:27017' diff --git a/src/index.ts b/src/index.ts index 1955827..5069ef9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,16 +1,16 @@ -import TestEnvironment from "./test-environment"; -import TestEnvironments from "./test-environments"; -import { TestEnvironmentConfiguration } from "./test-environment-configuration"; +import TestEnvironment from './test-environment'; +import TestEnvironments from './test-environments'; +import { TestEnvironmentConfiguration } from './test-environment-configuration'; -import community from "../docker/community/config"; -import enterprise from "../docker/enterprise/config"; -import kerberos from "../docker/kerberos/config"; -import ldap from "../docker/ldap/config"; -import replicaSet from "../docker/replica-set/config"; -import scram from "../docker/scram/config"; -import sharded from "../docker/sharded/config"; -import ssh from "../docker/ssh/config"; -import tls from "../docker/tls/config"; +import community from '../docker/community/config'; +import enterprise from '../docker/enterprise/config'; +import kerberos from '../docker/kerberos/config'; +import ldap from '../docker/ldap/config'; +import replicaSet from '../docker/replica-set/config'; +import scram from '../docker/scram/config'; +import sharded from '../docker/sharded/config'; +import ssh from '../docker/ssh/config'; +import tls from '../docker/tls/config'; const CONFIGS: Record = { community, @@ -24,7 +24,9 @@ const CONFIGS: Record = { tls, }; -export default function createTestEnvironments(filter: string[]) { +export default function createTestEnvironments( + filter: string[] +): TestEnvironments { const envs: Record = {}; for (const environmentName of filter) { envs[environmentName] = new TestEnvironment(CONFIGS[environmentName]); diff --git a/src/test-environment.spec.ts b/src/test-environment.spec.ts index 1619189..4ea5734 100644 --- a/src/test-environment.spec.ts +++ b/src/test-environment.spec.ts @@ -1,27 +1,27 @@ -import assert from "assert"; -import execa from "execa"; +import assert from 'assert'; +import execa from 'execa'; -import TestEnvironment from "./test-environment"; -import config from "./fixtures/config"; +import TestEnvironment from './test-environment'; +import config from './fixtures/config'; -describe("TestEnvironment", function () { +describe('TestEnvironment', function () { let testEnvironment; beforeEach(function () { testEnvironment = new TestEnvironment(config); }); - describe("start/stop", function () { - it("starts and stops an environment", async function () { + describe('start/stop', function () { + it('starts and stops an environment', async function () { try { await testEnvironment.start(); - const { stdout } = await execa("docker", ["ps"]); + const { stdout } = await execa('docker', ['ps']); assert.ok( stdout.includes(testEnvironment.config.dockerCompose.projectName) ); } finally { await testEnvironment.stop(); - const { stdout } = await execa("docker", ["ps"]); + const { stdout } = await execa('docker', ['ps']); assert.ok( !stdout.includes(testEnvironment.config.dockerCompose.projectName) ); diff --git a/src/test-environment.ts b/src/test-environment.ts index c2a8e6a..40cdd72 100644 --- a/src/test-environment.ts +++ b/src/test-environment.ts @@ -1,11 +1,11 @@ -import { TestEnvironmentConfiguration } from "./test-environment-configuration"; +import { TestEnvironmentConfiguration } from './test-environment-configuration'; -const uuid = require("uuid"); -const execa = require("execa"); -const waitOn = require("wait-on"); -const hostile = require("hostile"); -const util = require("util"); -const path = require("path"); +import uuid from 'uuid'; +import execa from 'execa'; +import waitOn from 'wait-on'; +import hostile from 'hostile'; +import util from 'util'; +import path from 'path'; const setHostEntry = util.promisify(hostile.set.bind(hostile)); const removeHostEntry = util.promisify(hostile.remove.bind(hostile)); @@ -24,31 +24,31 @@ export default class TestEnvironment { }-${uuid.v4()}`; this._dockerComposeArgs = [ - "-p", + '-p', dockerComposeProjectName, - "-f", + '-f', path.basename(dockerComposeYaml), ]; this._dockerComposeCwd = path.dirname(dockerComposeYaml); } - async start() { + async start(): Promise { const args = [ ...this._dockerComposeArgs, - "up", - "-d", - "--force-recreate", - "--remove-orphans", + 'up', + '-d', + '--force-recreate', + '--remove-orphans', ]; for (const host of this.config.hosts || []) { - await setHostEntry("127.0.0.1", host); + await setHostEntry('127.0.0.1', host); } - await execa("docker-compose", args, { + await execa('docker-compose', args, { cwd: this._dockerComposeCwd, - stdio: "inherit", + stdio: 'inherit', }); await waitOn({ @@ -61,27 +61,27 @@ export default class TestEnvironment { } } - async stop() { + async stop(): Promise { try { for (const host of this.config.hosts || []) { - await removeHostEntry("127.0.0.1", host); + await removeHostEntry('127.0.0.1', host); } } catch (error) { console.error( - "failed to remove host entries, skipping. Caused by:", + 'failed to remove host entries, skipping. Caused by:', error ); } try { - await (this.config.teardown || (() => {}))(); + await (this.config.teardown || (() => Promise.resolve()))(); } catch (error) { - console.error("failed config teardown, skipping. Caused by:", error); + console.error('failed config teardown, skipping. Caused by:', error); } await execa( - "docker-compose", - [...this._dockerComposeArgs, "down", "-v", "--remove-orphans"], + 'docker-compose', + [...this._dockerComposeArgs, 'down', '-v', '--remove-orphans'], { cwd: this._dockerComposeCwd } ); } diff --git a/src/test-environments.ts b/src/test-environments.ts index da33947..a5503e2 100644 --- a/src/test-environments.ts +++ b/src/test-environments.ts @@ -1,5 +1,5 @@ -import TestEnvironment from "./test-environment"; -import { ConnectionOptions } from "./test-environment-configuration"; +import TestEnvironment from './test-environment'; +import { ConnectionOptions } from './test-environment-configuration'; export default class TestEnvironments { private _envs: Record; @@ -25,11 +25,11 @@ export default class TestEnvironments { return connectionOptions; } - async setup() { + async setup(): Promise { await Promise.all(Object.values(this._envs).map((env) => env.start())); } - async teardown() { + async teardown(): Promise { await Promise.all(Object.values(this._envs).map((env) => env.stop())); } } diff --git a/tsconfig-lint.json b/tsconfig-lint.json new file mode 100644 index 0000000..ec81a33 --- /dev/null +++ b/tsconfig-lint.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.json", + "include": ["**/*.ts"], + "exclude": ["node_modules", "**/*.d.ts"] +}