Commit f537b6b3 authored by Marco Wettstein's avatar Marco Wettstein
Browse files

feat: extract values from mr

parent 400e9094
Pipeline #110503 passed with stages
in 10 minutes and 56 seconds
node_modules
......@@ -5,6 +5,8 @@ include:
- /includes/docker-build.yml
- /semantic-release-for-gitlab-ci-includes.yml
variables:
APP_PATH: $CI_PROJECT_DIR/$APP_DIR
# build the two gitlab-ci pipeline docker images
docker-build-pipeline:
stage: docker-build
......@@ -29,7 +31,14 @@ docker-build-docker-in-docker:
extends:
- .docker-build-app-base
test:
extends:
- .before-script-yarn
script:
- yarn test
stage: test
stages:
- test
- docker-build
- release
......
......@@ -138,6 +138,37 @@ This guarantees that multiple review-apps do not collide in the namespace if use
`application.hostCanonical`: A hostname for the app that is always defined. If you use our helm-charts this will guarantee that the app is always reachable with this hostname.
### Overriding values and env vars in a MR (experimental)
You can override values just for one merge request. This is useful if your MR
depends on another project's MR, e.g. you can change some API_ENDPOINT env var to point to the other MR's environment url.
You can do this by adding a comment-block in your MR description:
```
\`\`\`yaml
$values:
application:
replicas: 3 # you can override any value
host: www.foo.bar
env:
public:
API_URL: https://foo.bar
\`\`\`
```
There is also a shortcut if you just want to override env vars:
```
\`\`\`
$env:
API_URL: https://foo.bar
SOME_OTHER_ENV: foo
\`\`\`
```
(also the `yaml` syntax indicator after the backticks is optional)
## Post deploy stages
you can implement `verify-<env>` stages that will run after deployment. You can e.g. run test against the deployed version.
......
......@@ -58,6 +58,8 @@ RUN /root/.nvm/nvm.sh install 13
RUN /root/.nvm/nvm.sh install 14
RUN /root/.nvm/nvm.sh install 15
RUN /root/.nvm/nvm.sh install 16
RUN yarn global add ts-node typescript
# ENV NVM_DIR=/root/.nvm
# RUN bash -c 'source /root/.nvm/nvm.sh'
# RUN echo '. /root/.nvm/nvm.sh' >> /root/.bashrc
......@@ -68,4 +70,9 @@ RUN mkdir p /scripts
COPY ./scripts/* /scripts/
RUN chmod +x /scripts/*
COPY package.json /scripts/
COPY yarn.lock /scripts/
WORKDIR /scripts
RUN yarn
ENV PATH="/scripts:${PATH}"
{
"name": "pipeline",
"version": "1.0.0",
"devDependencies": {
"@types/lodash": "^4.14.172",
"@types/node": "^16.6.1"
},
"dependencies": {
"lodash": "^4.17.21",
"@gitbeaker/node": "^32.1.2",
"yaml": "^1.10.2"
}
}
#!/usr/bin/env ts-node
import { Gitlab } from "@gitbeaker/node"; // Just the Project Resource
import { parse } from "yaml";
import { merge } from "lodash";
const { GL_TOKEN, CI_SERVER_URL, CI_PROJECT_ID, CI_MERGE_REQUEST_IID } =
process.env;
const gitlabApi = new Gitlab({
token: GL_TOKEN,
host: CI_SERVER_URL,
});
const getMRInfo = async (projectId: string, mrId: number) => {
return await gitlabApi.MergeRequests.show(projectId, mrId);
};
export const extractValuesFromMRMessage = (mrMessage: string) => {
const codeBlocks = Array.from(mrMessage.matchAll(/```.*([^`]+)```/gm)).map(
(match) => match[1]
);
return codeBlocks.reduce((values = {}, block) => {
if (block.includes("$env") || block.includes("$values"))
try {
const { $values, $env } = parse(block);
if ($values) merge(values, $values);
if ($env) merge(values, { env: { public: $env } });
return values;
} catch (e) {
console.warn(e);
}
}, {});
};
if (CI_PROJECT_ID && CI_MERGE_REQUEST_IID) {
getMRInfo(CI_PROJECT_ID, Number(CI_MERGE_REQUEST_IID)).then(async (r) => {
const values = extractValuesFromMRMessage(r.description);
console.log(JSON.stringify(values, null, 2) ?? "");
});
}
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
......@@ -17,7 +17,15 @@ readarray -t helmArgsArray <<<"$helmArgsEvaluated"
if [[ ${ENV_SHORT} == "review" ]]; then echo "NOTE - This deployment will stop itself after 2 weeks"; fi
# find all values files and generate an array out of it
files=(values.yml values-$ENV_SHORT.yml values-$CI_ENVIRONMENT_SLUG.yml)
if [ -z "$CI_MERGE_REQUEST_IID" ]; then
echo "extra values from mr:"
extractValuesFromMr.ts
extractValuesFromMr.ts >values-from-mr.yml
echo "----------------------"
fi
files=(values.yml values-$ENV_SHORT.yml values-$CI_ENVIRONMENT_SLUG.yml values-from-mr.yml)
values=()
for i in "${files[@]}"; do if [ -f $VALUES_PATH/$i ]; then values+=(--values $VALUES_PATH/$i); fi; done
echo "reading values files from $VALUES_PATH. found ${values[@]}"
......
File mode changed from 100644 to 100755
import { extractValuesFromMRMessage } from "../scripts/extractValuesFromMr";
describe("extractValuesFromMr", () => {
describe("extractValuesFromMRMessage", () => {
it("can extract $values yaml", () => {
const result = extractValuesFromMRMessage(`
blabla
test
\`\`\`
$values:
application:
host: www.foo.com
env:
public:
API_KEY: fooooxxx
BLA: "blubb"
\`\`\`
`);
expect(result).toEqual({
application: {
host: "www.foo.com",
},
env: {
public: {
API_KEY: "fooooxxx",
BLA: "blubb",
},
},
});
});
it("can handle $env as shortcut", () => {
const result = extractValuesFromMRMessage(`
blabla
test
\`\`\`
$env:
API_KEY: fooooxxx
BLA: "blubb"
\`\`\`
`);
expect(result).toEqual({
env: {
public: {
API_KEY: "fooooxxx",
BLA: "blubb",
},
},
});
});
it("ignores language in backticks", () => {
const result = extractValuesFromMRMessage(`
blabla
test
\`\`\`yaml
$env:
API_KEY: fooooxxx
BLA: "blubb"
\`\`\`
`);
expect(result).toEqual({
env: {
public: {
API_KEY: "fooooxxx",
BLA: "blubb",
},
},
});
});
it("can handle mixed blocks", () => {
const result = extractValuesFromMRMessage(`
blabla
test
\`\`\`
$values:
env:
public:
FOO: "bar"
$env:
API_KEY: fooooxxx
BLA: "blubb"
\`\`\`
`);
expect(result).toEqual({
env: {
public: {
FOO: "bar",
API_KEY: "fooooxxx",
BLA: "blubb",
},
},
});
});
it("can handle multiple blocks", () => {
const result = extractValuesFromMRMessage(`
blabla
test
\`\`\`
$values:
env:
public:
FOO: "bar"
$env:
API_KEY: fooooxxx
BLA: "blubb"
\`\`\`
fooo
\`\`\`
$values:
env:
public:
FOO: "blubb"
$env:
TEST: test
\`\`\`
`);
expect(result).toEqual({
env: {
public: {
FOO: "blubb",
API_KEY: "fooooxxx",
BLA: "blubb",
TEST: "test",
},
},
});
});
});
});
{
"compilerOptions": {
"lib": ["es2020"],
"strict": true,
"downlevelIteration": true
}
}
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@gitbeaker/core@^32.1.2":
version "32.1.2"
resolved "https://registry.yarnpkg.com/@gitbeaker/core/-/core-32.1.2.tgz#b27e506557d28a53ec9a35c8532f48b77b7577ba"
integrity sha512-xeTqY6x8wvrY+aC+300xgJmvRdsOu5ZiAqMvrhY3wEyTedOxLolsFV2VbWlpyq2IVTiwDAbImpz1wi8xhr7PUw==
dependencies:
"@gitbeaker/requester-utils" "^32.1.2"
form-data "^4.0.0"
li "^1.3.0"
mime-types "^2.1.32"
query-string "^7.0.0"
xcase "^2.0.1"
"@gitbeaker/node@^32.1.2":
version "32.1.2"
resolved "https://registry.yarnpkg.com/@gitbeaker/node/-/node-32.1.2.tgz#201bd1d568508416740c5e53992571979c65b9bd"
integrity sha512-dVeJG3AE30WaRLPi6y0fSg2d9SNMuOlxukdnZBGBQuKh2S4anqj+0HXmrA4SEu+u0QniDkHKjCEoG9Re1+8NMA==
dependencies:
"@gitbeaker/core" "^32.1.2"
"@gitbeaker/requester-utils" "^32.1.2"
delay "^5.0.0"
got "^11.8.2"
xcase "^2.0.1"
"@gitbeaker/requester-utils@^32.1.2":
version "32.1.2"
resolved "https://registry.yarnpkg.com/@gitbeaker/requester-utils/-/requester-utils-32.1.2.tgz#cdb2b7c8fd6b705b7ba265397b3ab05d2b378a97"
integrity sha512-uhZ2gKbpXcAyf1vT3U4v5wO+Fh0BJYJVfEBmNglilcoGAQFnkC6cVkxV3TZrXePud+lTshMdAEJlSO7cv8ETlg==
dependencies:
form-data "^4.0.0"
query-string "^7.0.0"
xcase "^2.0.1"
"@sindresorhus/is@^4.0.0":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.1.tgz#d26729db850fa327b7cacc5522252194404226f5"
integrity sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==
"@szmarczak/http-timer@^4.0.5":
version "4.0.6"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==
dependencies:
defer-to-connect "^2.0.0"
"@types/cacheable-request@^6.0.1":
version "6.0.2"
resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9"
integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==
dependencies:
"@types/http-cache-semantics" "*"
"@types/keyv" "*"
"@types/node" "*"
"@types/responselike" "*"
"@types/http-cache-semantics@*":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812"
integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==
"@types/keyv@*":
version "3.1.2"
resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.2.tgz#5d97bb65526c20b6e0845f6b0d2ade4f28604ee5"
integrity sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg==
dependencies:
"@types/node" "*"
"@types/lodash@^4.14.172":
version "4.14.172"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.172.tgz#aad774c28e7bfd7a67de25408e03ee5a8c3d028a"
integrity sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw==
"@types/node@*", "@types/node@^16.6.1":
version "16.6.1"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.1.tgz#aee62c7b966f55fc66c7b6dfa1d58db2a616da61"
integrity sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw==
"@types/responselike@*", "@types/responselike@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==
dependencies:
"@types/node" "*"
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
cacheable-lookup@^5.0.3:
version "5.0.4"
resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
cacheable-request@^7.0.1:
version "7.0.2"
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27"
integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==
dependencies:
clone-response "^1.0.2"
get-stream "^5.1.0"
http-cache-semantics "^4.0.0"
keyv "^4.0.0"
lowercase-keys "^2.0.0"
normalize-url "^6.0.1"
responselike "^2.0.0"
clone-response@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
dependencies:
mimic-response "^1.0.0"
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
decode-uri-component@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
decompress-response@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
dependencies:
mimic-response "^3.1.0"
defer-to-connect@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587"
integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
delay@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d"
integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
dependencies:
once "^1.4.0"
filter-obj@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b"
integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs=
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
get-stream@^5.1.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
dependencies:
pump "^3.0.0"
got@^11.8.2:
version "11.8.2"
resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599"
integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==
dependencies:
"@sindresorhus/is" "^4.0.0"
"@szmarczak/http-timer" "^4.0.5"
"@types/cacheable-request" "^6.0.1"
"@types/responselike" "^1.0.0"
cacheable-lookup "^5.0.3"
cacheable-request "^7.0.1"
decompress-response "^6.0.0"
http2-wrapper "^1.0.0-beta.5.2"
lowercase-keys "^2.0.0"
p-cancelable "^2.0.0"
responselike "^2.0.0"
http-cache-semantics@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
http2-wrapper@^1.0.0-beta.5.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==
dependencies:
quick-lru "^5.1.1"
resolve-alpn "^1.0.0"
json-buffer@3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
keyv@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254"
integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==
dependencies:
json-buffer "3.0.1"
li@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/li/-/li-1.3.0.tgz#22c59bcaefaa9a8ef359cf759784e4bf106aea1b"
integrity sha1-IsWbyu+qmo7zWc91l4TkvxBq6hs=
lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
lowercase-keys@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
mime-db@1.49.0:
version "1.49.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed"
integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==
mime-types@^2.1.12, mime-types@^2.1.32:
version "2.1.32"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5"
integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==
dependencies:
mime-db "1.49.0"
mimic-response@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
mimic-response@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
normalize-url@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
dependencies:
wrappy "1"
p-cancelable@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
query-string@^7.0.0:
version "7.0.1"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.0.1.tgz#45bd149cf586aaa582dffc7ec7a8ad97dd02f75d"
integrity sha512-uIw3iRvHnk9to1blJCG3BTc+Ro56CBowJXKmNNAm3RulvPBzWLRqKSiiDk+IplJhsydwtuNMHi8UGQFcCLVfkA==
dependencies:
decode-uri-component "^0.2.0"
filter-obj "^1.1.0"
split-on-first "^1.0.0"
strict-uri-encode "^2.0.0"