diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml new file mode 100644 index 0000000..c09b83b --- /dev/null +++ b/.github/workflows/build_and_test.yml @@ -0,0 +1,16 @@ +name: build-and-test +run-name: Build and Test run by @${{ github.actor }} + +on: [push] + +jobs: + build_and_test: + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v5 + - name: Build, start services, and run tests with Docker Compose + run: docker compose -f docker-compose-test.yml up --build --abort-on-container-exit + + diff --git a/.nvmrc b/.nvmrc index d0d4616..bd0878c 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.4 +20.5 diff --git a/Dockerfile b/Dockerfile index c2ddae2..aae51de 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20.4-alpine3.18 +FROM node:20.5-alpine3.18 MAINTAINER info@vizzuality.com ENV NAME authorization @@ -12,22 +12,19 @@ RUN addgroup $USER && adduser -s /bin/bash -D -G $USER $USER RUN yarn global add --unsafe-perm bunyan RUN mkdir -p /opt/$NAME -COPY package.json /opt/$NAME/package.json -COPY yarn.lock /opt/$NAME/yarn.lock -RUN cd /opt/$NAME && yarn - -COPY entrypoint.sh /opt/$NAME/entrypoint.sh -COPY tsconfig.json /opt/$NAME/tsconfig.json -COPY config /opt/$NAME/config -COPY ./src /opt/$NAME/src -COPY ./test opt/$NAME/test - +RUN chown -R $USER:$USER /opt/$NAME +USER $USER WORKDIR /opt/$NAME -RUN chown -R $USER:$USER /opt/$NAME +COPY package.json yarn.lock ./ +RUN yarn --pure-lockfile + +COPY entrypoint.sh tsconfig.json ./ +COPY config ./config +COPY test ./test +COPY src ./src # Tell Docker we are going to use this ports EXPOSE 9000 -USER $USER ENTRYPOINT ["./entrypoint.sh"] diff --git a/authorization.sh b/authorization.sh index b0be5f0..467520c 100755 --- a/authorization.sh +++ b/authorization.sh @@ -6,14 +6,18 @@ case "$1" in ;; develop) type docker-compose >/dev/null 2>&1 || { echo >&2 "docker-compose is required but it's not installed. Aborting."; exit 1; } - docker-compose -f docker-compose-develop.yml build && docker-compose -f docker-compose-develop.yml up + docker-compose -f docker-compose-develop.yml up --build ;; test) type docker-compose >/dev/null 2>&1 || { echo >&2 "docker-compose is required but it's not installed. Aborting."; exit 1; } - docker-compose -f docker-compose-test.yml build && docker-compose -f docker-compose-test.yml up --abort-on-container-exit + docker-compose -f docker-compose-test.yml up --build --abort-on-container-exit + ;; + debug) + type docker-compose >/dev/null 2>&1 || { echo >&2 "docker-compose is required but it's not installed. Aborting."; exit 1; } + docker-compose -f docker-compose-debug.yml up --build ;; *) - echo "Usage: authorization.sh {start|test}" >&2 + echo "Usage: authorization.sh {start|develop|test|debug}" >&2 exit 1 ;; esac diff --git a/config/default.json b/config/default.json index 72dc2d5..3b263c7 100644 --- a/config/default.json +++ b/config/default.json @@ -3,7 +3,7 @@ "name": "authorization" }, "redis": { - "url": "redis://localhost:6379", + "url": "redis://redis:6379", "defaultTTL": 86400 }, "logger": { @@ -23,7 +23,7 @@ }, "mongodb": { "database": "authorization", - "host": "localhost", + "host": "mongo", "port": 27017 }, "application": { @@ -35,7 +35,7 @@ "token": "" }, "okta": { - "url": "https://wri.okta.com", + "url": "https://www.okta.com/", "apiKey": null, "clientId": null, "clientSecret": null, diff --git a/docker-compose-debug.yml b/docker-compose-debug.yml new file mode 100644 index 0000000..994eab4 --- /dev/null +++ b/docker-compose-debug.yml @@ -0,0 +1,26 @@ +version: "3" +services: + debug: + build: . + ports: + - "9000:9000" + - "9229:9229" + container_name: authorization + env_file: + - dev.env + command: debug + depends_on: + - redis + volumes: + - /var/run/docker.sock:/var/run/docker.sock + redis: + image: redis + container_name: authorization-redis + ports: + - "6379:6379" + restart: always + mongo: + image: mongo:3.6 + conatiner_name: authorization-mongo + ports: + - "27017" \ No newline at end of file diff --git a/docker-compose-develop.yml b/docker-compose-develop.yml index d16bead..d9b9606 100644 --- a/docker-compose-develop.yml +++ b/docker-compose-develop.yml @@ -3,7 +3,7 @@ services: develop: build: . ports: - - "30505:30505" + - "9000:9000" container_name: authorization env_file: - dev.env @@ -12,9 +12,15 @@ services: - redis volumes: - /var/run/docker.sock:/var/run/docker.sock + - ./src:/opt/authorization/src redis: image: redis container_name: authorization-redis ports: - - "16379:6379" + - "6379:6379" restart: always + mongo: + image: mongo:3.6 + container_name: authorization-mongo + ports: + - "27017" \ No newline at end of file diff --git a/docker-compose-test.yml b/docker-compose-test.yml index 737de41..056a46f 100644 --- a/docker-compose-test.yml +++ b/docker-compose-test.yml @@ -15,7 +15,7 @@ services: PUBLIC_URL: http://127.0.0.1:9000 REDIS_URL: redis://redis:6379 ALLOW_CONFIG_MUTATIONS: "true" - GATEWAY_URL: http://mymachine:8000 + GATEWAY_URL: http://127.0.0.1:8000 MICROSERVICE_TOKEN: cttoken LOCAL_URL: http://127.0.0.1:9000 HOST_IP: 127.0.0.1 @@ -41,5 +41,6 @@ services: mongo: image: mongo:3.6 + container_name: authorization-mongo ports: - "27017" diff --git a/entrypoint.sh b/entrypoint.sh index de748f0..53d4e63 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -2,9 +2,13 @@ set -e case "$1" in + debug) + echo "Running Development Server in Debug mode" + exec yarn run debug + ;; develop) echo "Running Development Server" - exec yarn run start + exec yarn run watch ;; test) echo "Running Test" diff --git a/package.json b/package.json index 440a9d6..d536510 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,11 @@ "coverage": "nyc ts-mocha -b --project tsconfig.json -r tsconfig-paths/register --timeout 20000 'test/**/*.ts' --exit", "test": "ts-mocha -b --project tsconfig.json -r tsconfig-paths/register --timeout 20000 'test/**/*.ts' --exit", "start": "ts-node --files --project tsconfig.json -r tsconfig-paths/register src/index.ts", - "watch": "ts-node-dev --respawn --transpile-only --files --project tsconfig.json -r tsconfig-paths/register src/index.ts", + "watch": "nodemon -r tsconfig-paths/register -L src/index.ts", "build": "tsc", "lint": "eslint \"{src,test}/**/*.ts\" --fix", - "prepare": "husky install" + "prepare": "husky install", + "debug": "node --inspect=0.0.0.0:9229 -r ts-node/register -r tsconfig-paths/register src/index.ts" }, "keywords": [ "authorization", @@ -27,7 +28,7 @@ }, "license": "MIT", "engines": { - "node": "~20.4" + "node": "~20.5" }, "lint-staged": { "*.ts": [ @@ -105,7 +106,8 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.1", "ts-node-dev": "^2.0.0", - "tsconfig-paths": "^4.1.0" + "tsconfig-paths": "^4.1.0", + "nodemon": "^3.1.0" }, "dependencies": { "@aws-sdk/client-api-gateway": "^3.218.0", diff --git a/src/app.ts b/src/app.ts index 2d7ef3a..3483bf3 100644 --- a/src/app.ts +++ b/src/app.ts @@ -105,13 +105,13 @@ const init: () => Promise = async (): Promise => { app.use(RWAPIMicroservice.bootstrap({ logger, - gatewayURL: process.env.GATEWAY_URL, - microserviceToken: process.env.MICROSERVICE_TOKEN, - fastlyEnabled: process.env.FASTLY_ENABLED as boolean | 'true' | 'false', + gatewayURL: process.env.GATEWAY_URL || "http://localhost", + microserviceToken: process.env.MICROSERVICE_TOKEN || "XXXX", + fastlyEnabled: process.env.FASTLY_ENABLED as boolean | 'true' | 'false' || false, fastlyServiceId: process.env.FASTLY_SERVICEID, fastlyAPIKey: process.env.FASTLY_APIKEY, requireAPIKey: process.env.REQUIRE_API_KEY as boolean | 'true' | 'false' || true, - awsRegion: process.env.AWS_REGION, + awsRegion: process.env.AWS_REGION || "us-east-1", awsCloudWatchLogStreamName: config.get('service.name'), awsCloudWatchLoggingEnabled: process.env.AWS_CLOUD_WATCH_LOGGING_ENABLED as boolean | 'true' | 'false' || true, skipAPIKeyRequirementEndpoints: [ @@ -141,6 +141,8 @@ const init: () => Promise = async (): Promise => { { method: 'GET', pathRegex: '^/auth/generate-token$' }, { method: 'GET', pathRegex: '^/auth/authorization-code/callback$' }, { method: 'GET', pathRegex: '^/auth/sign-up-redirect$' }, + //{ method: 'GET', pathRegex: '^/auth/user$' }, + //{ method: 'GET', pathRegex: '^/auth/user/me$' }, { method: 'GET', pathRegex: '^/api/v1/application$' }, { method: 'GET', pathRegex: '^/api/v1/application/(.*)$' }, { method: 'POST', pathRegex: '^/api/v1/application$' }, @@ -164,8 +166,8 @@ const init: () => Promise = async (): Promise => { resolve({ app, server }); }).catch((mongoConnectionError: CallbackError) => { - logger.error('MongoURI', mongoUri); - logger.error(mongoConnectionError); + logger.error('MongoURI:', mongoUri); + logger.error('Mongo Connection Error:', mongoConnectionError); reject(new Error(mongoConnectionError.message)); }); }); diff --git a/src/providers/okta.facebook.provider.ts b/src/providers/okta.facebook.provider.ts index 5941c27..693c4e7 100644 --- a/src/providers/okta.facebook.provider.ts +++ b/src/providers/okta.facebook.provider.ts @@ -54,7 +54,7 @@ export class OktaFacebookProvider { user = OktaService.convertOktaUserToIUser(oktaUser); } catch (err) { // User not found, let's create him/her - logger.info(`[OktaFacebookProvider] User with email ${email} does not exist`); + logger.info(`[OktaFacebookProvider] User with email ${email} does not exist, creating new user.`); user = await OktaService.createUserWithoutPassword({ name: profile?.displayName, email, @@ -92,7 +92,14 @@ export class OktaFacebookProvider { static async facebookToken(ctx: Context, next: Next): Promise { const app: string = Utils.getOriginApp(ctx); - await passport.authenticate(`facebook-token:${app}`)((ctx as Context & RouterContext), next); + try { + await passport.authenticate(`facebook-token:${app}`)((ctx as Context & RouterContext), next); + } catch (err) { + if (err.oauthError) { + logger.error('[OktaFacebookProvider] Error detail:', JSON.parse(err.oauthError.data)); + } + throw err; + } } static async facebookCallback(ctx: Context, next: Next): Promise { diff --git a/src/services/cache.service.ts b/src/services/cache.service.ts index f635810..acdfb19 100644 --- a/src/services/cache.service.ts +++ b/src/services/cache.service.ts @@ -8,9 +8,9 @@ class CacheService { private client: RedisClient; constructor() { - logger.debug('[CacheService] Initializing cache service'); - - this.client = redis.createClient({ url: config.get('redis.url') as string }); + const redis_url = config.get('redis.url') as string; + logger.debug('[CacheService] Initializing cache service, connecting to', redis_url); + this.client = redis.createClient({ url: redis_url }); } async get(key: string): Promise { diff --git a/src/services/settings.service.ts b/src/services/settings.service.ts index f006749..bf4e3d7 100644 --- a/src/services/settings.service.ts +++ b/src/services/settings.service.ts @@ -84,6 +84,11 @@ export default class Settings { name: 'Forest Atlas', logo: 'https://wriorg.s3.amazonaws.com/s3fs-public/styles/large/public/forest-atlases-logo-1.png?itok=BV_4QvsM', principalColor: '#008d6a', + }, + gnw: { + name: 'Global Nature Watch', + logo: 'data:image/png;base64,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', + principalColor: '#0141B1', } }, jwt: { @@ -209,7 +214,42 @@ export default class Settings { config.get('settings.thirdParty.prep.twitter.consumerKey') ) } - } + }, + gnw: { + facebook: { + scope: ['email'], + clientSecret: config.get('settings.thirdParty.prep.facebook.clientSecret'), + clientID: config.get('settings.thirdParty.prep.facebook.clientID'), + active: ( + config.get('settings.thirdParty.prep.facebook.active') && + config.get('settings.thirdParty.prep.facebook.clientSecret') && + config.get('settings.thirdParty.prep.facebook.clientID') + + ) + }, + google: { + scope: [ + 'https://www.googleapis.com/auth/plus.me', + 'https://www.googleapis.com/auth/userinfo.email' + ], + clientSecret: config.get('settings.thirdParty.prep.google.clientSecret'), + clientID: config.get('settings.thirdParty.prep.google.clientID'), + active: ( + config.get('settings.thirdParty.prep.google.active') && + config.get('settings.thirdParty.prep.google.clientSecret') && + config.get('settings.thirdParty.prep.google.clientID') + ) + }, + twitter: { + consumerSecret: config.get('settings.thirdParty.prep.twitter.consumerSecret'), + consumerKey: config.get('settings.thirdParty.prep.twitter.consumerKey'), + active: ( + config.get('settings.thirdParty.prep.twitter.active') && + config.get('settings.thirdParty.prep.twitter.consumerSecret') && + config.get('settings.thirdParty.prep.twitter.consumerKey') + ) + } + } } }; diff --git a/src/views/login.ejs b/src/views/login.ejs index ce3a3e4..6a0ec07 100644 --- a/src/views/login.ejs +++ b/src/views/login.ejs @@ -1,16 +1,16 @@ - - - - - <%= generalConfig.application.name %> - Login - - + + + + + <%= generalConfig.application.name %> - Login + + + media="all"> - - - -
-
-
-
- +
+
+
+
+ + + + diff --git a/yarn.lock b/yarn.lock index 9847b07..759ac3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2935,6 +2935,21 @@ chokidar@^3.5.1: optionalDependencies: fsevents "~2.3.1" +chokidar@^3.5.2: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -3209,6 +3224,13 @@ debug@^3.1.0: dependencies: ms "^2.1.1" +debug@^4: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -4033,6 +4055,11 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" @@ -5106,7 +5133,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1, ms@^2.1.2: +ms@2.1.3, ms@^2.1.1, ms@^2.1.2, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -5197,6 +5224,22 @@ node-releases@^1.1.70: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +nodemon@^3.1.0: + version "3.1.10" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.10.tgz#5015c5eb4fffcb24d98cf9454df14f4fecec9bc1" + integrity sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw== + dependencies: + chokidar "^3.5.2" + debug "^4" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^7.5.3" + simple-update-notifier "^2.0.0" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + nopt@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" @@ -5625,6 +5668,11 @@ pseudomap@^1.0.1, pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -5829,10 +5877,10 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rw-api-microservice-node@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/rw-api-microservice-node/-/rw-api-microservice-node-5.1.1.tgz#4a8f1855132dc567bc8e4ef65dd97e0122e58260" - integrity sha512-fpqs2Ni83KdTqIGvWbeNNUFsVGMLiN5gR4VxS9lC1x03/4kZ+Arz679tNvCoWfu6T8rSYu4RQhpheNJTQIcVoA== +rw-api-microservice-node@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/rw-api-microservice-node/-/rw-api-microservice-node-5.1.3.tgz#565af66e2ab0e149e28e1acdea7669dedaaaed23" + integrity sha512-f2BNfiUbJvzQfUN+B4PM7PyCtpJiIpEBFJ0rBU2xduTFdJzEpq3lLr1n3vGCCcTwM7BCy0KsWNItyZv0p8DRPg== dependencies: "@aws-sdk/client-cloudwatch-logs" "^3.385.0" "@koa/cors" "^4.0.0" @@ -5893,6 +5941,11 @@ semver@^7.3.7, semver@^7.3.8: dependencies: lru-cache "^6.0.0" +semver@^7.5.3: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -6005,6 +6058,13 @@ signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + sinon@^14.0.2: version "14.0.2" resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.2.tgz#585a81a3c7b22cf950762ac4e7c28eb8b151c46f" @@ -6239,7 +6299,7 @@ supports-color@8.1.1: dependencies: has-flag "^4.0.0" -supports-color@^5.3.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -6308,6 +6368,11 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +touch@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" + integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== + tr46@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" @@ -6522,6 +6587,11 @@ uid2@0.0.x: resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I= +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + unpipe@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"