diff --git a/README.md b/README.md index 2494471d883..69ef9bbc26b 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ See the [CLI command line reference](https://cli.netlify.com/commands/) to get s - [dev](#dev) - [env](#env) - [functions](#functions) + - [graph](#graph) - [init](#init) - [link](#link) - [lm](#lm) @@ -152,6 +153,16 @@ Manage netlify functions | [`functions:serve`](/docs/commands/functions.md#functionsserve) | (Beta) Serve functions locally | +### [graph](/docs/commands/graph.md) + +(Beta) Control the Netlify Graph functions for the current site + +| Subcommand | description | +|:--------------------------- |:-----| +| [`graph:edit`](/docs/commands/graph.md#graphedit) | Launch the browser to edit your local graph functions from Netlify | +| [`graph:pull`](/docs/commands/graph.md#graphpull) | Pull down your local Netlify Graph schema, and process pending Graph edit events | + + ### [init](/docs/commands/init.md) Configure continuous deployment for a new or existing site. To create a new site without continuous deployment, use `netlify sites:create` diff --git a/docs/README.md b/docs/README.md index 60c49cc6be6..c5a623f1cb4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -110,6 +110,16 @@ Manage netlify functions | [`functions:serve`](/docs/commands/functions.md#functionsserve) | (Beta) Serve functions locally | +### [graph](/docs/commands/graph.md) + +(Beta) Control the Netlify Graph functions for the current site + +| Subcommand | description | +|:--------------------------- |:-----| +| [`graph:edit`](/docs/commands/graph.md#graphedit) | Launch the browser to edit your local graph functions from Netlify | +| [`graph:pull`](/docs/commands/graph.md#graphpull) | Pull down your local Netlify Graph schema, and process pending Graph edit events | + + ### [init](/docs/commands/init.md) Configure continuous deployment for a new or existing site. To create a new site without continuous deployment, use `netlify sites:create` diff --git a/docs/commands/graph.md b/docs/commands/graph.md new file mode 100644 index 00000000000..476f55c0edd --- /dev/null +++ b/docs/commands/graph.md @@ -0,0 +1,72 @@ +--- +title: Netlify CLI graph command +description: Sync and edit your Netlify Graph library +--- + +# `graph` + + +(Beta) Control the Netlify Graph functions for the current site + +**Usage** + +```bash +netlify graph +``` + +**Flags** + +- `debug` (*boolean*) - Print debugging information +- `httpProxy` (*string*) - Proxy server address to route requests through. +- `httpProxyCertificateFilename` (*string*) - Certificate file to use when connecting using a proxy server + +| Subcommand | description | +|:--------------------------- |:-----| +| [`graph:edit`](/docs/commands/graph.md#graphedit) | Launch the browser to edit your local graph functions from Netlify | +| [`graph:pull`](/docs/commands/graph.md#graphpull) | Pull down your local Netlify Graph schema, and process pending Graph edit events | + + +**Examples** + +```bash +netlify graph:pull +netlify graph:edit +``` + +--- +## `graph:edit` + +Launch the browser to edit your local graph functions from Netlify + +**Usage** + +```bash +netlify graph:edit +``` + +**Flags** + +- `debug` (*boolean*) - Print debugging information +- `httpProxy` (*string*) - Proxy server address to route requests through. +- `httpProxyCertificateFilename` (*string*) - Certificate file to use when connecting using a proxy server + +--- +## `graph:pull` + +Pull down your local Netlify Graph schema, and process pending Graph edit events + +**Usage** + +```bash +netlify graph:pull +``` + +**Flags** + +- `debug` (*boolean*) - Print debugging information +- `httpProxy` (*string*) - Proxy server address to route requests through. +- `httpProxyCertificateFilename` (*string*) - Certificate file to use when connecting using a proxy server + +--- + + diff --git a/docs/commands/index.md b/docs/commands/index.md index 68a5deb7af1..d87829f72d0 100644 --- a/docs/commands/index.md +++ b/docs/commands/index.md @@ -91,6 +91,16 @@ Manage netlify functions | [`functions:serve`](/docs/commands/functions.md#functionsserve) | (Beta) Serve functions locally | +### [graph](/docs/commands/graph.md) + +(Beta) Control the Netlify Graph functions for the current site + +| Subcommand | description | +|:--------------------------- |:-----| +| [`graph:edit`](/docs/commands/graph.md#graphedit) | Launch the browser to edit your local graph functions from Netlify | +| [`graph:pull`](/docs/commands/graph.md#graphpull) | Pull down your local Netlify Graph schema, and process pending Graph edit events | + + ### [init](/docs/commands/init.md) Configure continuous deployment for a new or existing site. To create a new site without continuous deployment, use `netlify sites:create` diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 4e9953c223e..fe732f95f81 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -55,6 +55,7 @@ "gh-release-fetch": "^3.0.0", "git-repo-info": "^2.1.0", "gitconfiglocal": "^2.1.0", + "graphql": "^16.1.0", "hasbin": "^1.2.3", "hasha": "^5.2.2", "http-proxy": "^1.18.0", @@ -78,6 +79,7 @@ "multiparty": "^4.2.1", "netlify": "^10.1.2", "netlify-headers-parser": "^6.0.1", + "netlify-onegraph-internal": "0.0.15", "netlify-redirect-parser": "^13.0.1", "netlify-redirector": "^0.2.1", "node-fetch": "^2.6.0", @@ -171,19 +173,19 @@ } }, "node_modules/@babel/core": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", - "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.10.tgz", + "integrity": "sha512-pbiIdZbCiMx/MM6toR+OfXarYix3uz0oVsnNtfdAGTcCTu3w/JGF8JhirevXLBJUu0WguSZI12qpKnx7EeMyLA==", "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", + "@babel/generator": "^7.16.8", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-module-transforms": "^7.16.7", "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.7", + "@babel/parser": "^7.16.10", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -296,9 +298,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz", - "integrity": "sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -331,9 +333,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", - "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dependencies": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -349,9 +351,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dependencies": { "is-core-module": "^2.8.0", "path-parse": "^1.0.7", @@ -593,9 +595,9 @@ } }, "node_modules/@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -657,9 +659,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", + "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -884,11 +886,11 @@ } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz", - "integrity": "sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.10", "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { @@ -1648,9 +1650,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.8.tgz", - "integrity": "sha512-9rNKgVCdwHb3z1IlbMyft6yIXIeP3xz6vWvGaLHrJThuEIqWfHb0DNBH9VuTgnDfdbUDhkmkvMZS/YMCtP7Elg==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", "dependencies": { "@babel/compat-data": "^7.16.8", "@babel/helper-compilation-targets": "^7.16.7", @@ -1670,7 +1672,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.16.7", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", "@babel/plugin-proposal-private-property-in-object": "^7.16.7", "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -1802,9 +1804,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -1812,7 +1814,7 @@ "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", + "@babel/parser": "^7.16.10", "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" @@ -1840,17 +1842,17 @@ "dev": true }, "node_modules/@bugsnag/browser": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.14.1.tgz", - "integrity": "sha512-xenvisYx6xFNuh7GGR/SCLcRs2H6AXn58Ha/u/Yhk+typ1oE5EFAy15+2vdGMDmZp0GsAEgrOTsEZ30uSKdC1w==", + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.15.1.tgz", + "integrity": "sha512-9JyoadlU4Tj5wnu2NnSfvYX2n31FC7jBdsMF0JdWrrOMFH0htmjUL9JMDv3zXFtOfeez2GMDivwc/dJPXTUEkA==", "dependencies": { - "@bugsnag/core": "^7.14.0" + "@bugsnag/core": "^7.15.1" } }, "node_modules/@bugsnag/core": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.14.0.tgz", - "integrity": "sha512-DKN7hNEA6zEOgnucihgNEiMmx4GVaFHD9dJUYQFiouAIL19R/TLgG6B+pGC+QAqHVYsCUt5XDnG8jD+J+3fKOA==", + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.15.1.tgz", + "integrity": "sha512-fwEYdQEYQhLqFYz8ZoWFCfSVGE5rEhdu/7TtHRDCNs9VwVabb3iAfFwYS8ShLeMPf0K6NaLQ1UC531cI5KEFVA==", "dependencies": { "@bugsnag/cuid": "^3.0.0", "@bugsnag/safe-json-stringify": "^6.0.0", @@ -1865,20 +1867,20 @@ "integrity": "sha512-LOt8aaBI+KvOQGneBtpuCz3YqzyEAehd1f3nC5yr9TIYW1+IzYKa2xWS4EiMz5pPOnRPHkyyS5t/wmSmN51Gjg==" }, "node_modules/@bugsnag/js": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.14.1.tgz", - "integrity": "sha512-ygykhixXByzolFpOsUGr72ENgiL1t4TkvKvka2rhoSHOr5kul9TierjvmwBKNpkPdUpDNkgqw3y349jYzzjk+w==", + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.15.1.tgz", + "integrity": "sha512-+RjoaWFPnN9TO3oiMdFVmrQQS5ywnNGp/4aFr+UNcOgvB9V8AqwQi9yNqnbvqAPwXFvPYI3obq2n0VMiiHAPXA==", "dependencies": { - "@bugsnag/browser": "^7.14.1", - "@bugsnag/node": "^7.14.1" + "@bugsnag/browser": "^7.15.1", + "@bugsnag/node": "^7.15.1" } }, "node_modules/@bugsnag/node": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.14.1.tgz", - "integrity": "sha512-QhdFez60rTlEueg5rA0W6x8UrTcEnssv4XVPgfooGe2fYh6O89RFjI7zVVdw8QXUyqdf7w4WzyAsCir3XEhCqQ==", + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.15.1.tgz", + "integrity": "sha512-8yBXQqQumu35endZToKKEOPWZAGZ6BA1IHNI0ivW4u4sym9KnROED1uxYCyXlOPj6BNIdwUKKLhU8jGzdxppJQ==", "dependencies": { - "@bugsnag/core": "^7.14.0", + "@bugsnag/core": "^7.15.1", "byline": "^5.0.0", "error-stack-parser": "^2.0.2", "iserror": "^0.0.2", @@ -1892,14 +1894,14 @@ "integrity": "sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==" }, "node_modules/@commitlint/cli": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-16.0.2.tgz", - "integrity": "sha512-Jt7iaBjoLGC5Nq4dHPTvTYnqPGkElFPBtTXTvBpTgatZApczyjI2plE0oG4GYWPp1suHIS/VdVDOMpPZjGVusg==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-16.1.0.tgz", + "integrity": "sha512-x5L1knvA3isRWBRVQx+Q6D45pA9139a2aZQYpxkljMG0dj4UHZkCnsYWpnGalxPxASI7nrI0KedKfS2YeQ55cQ==", "dev": true, "dependencies": { "@commitlint/format": "^16.0.0", "@commitlint/lint": "^16.0.0", - "@commitlint/load": "^16.0.0", + "@commitlint/load": "^16.1.0", "@commitlint/read": "^16.0.0", "@commitlint/types": "^16.0.0", "lodash": "^4.17.19", @@ -1914,62 +1916,6 @@ "node": ">=v12" } }, - "node_modules/@commitlint/cli/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/@commitlint/cli/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/@commitlint/cli/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@commitlint/cli/node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@commitlint/cli/node_modules/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/@commitlint/config-conventional": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-16.0.0.tgz", @@ -1983,9 +1929,9 @@ } }, "node_modules/@commitlint/config-validator": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-16.0.0.tgz", - "integrity": "sha512-i80DGlo1FeC5jZpuoNV9NIjQN/m2dDV3jYGWg+1Wr+KldptkUHXj+6GY1Akll66lJ3D8s6aUGi3comPLHPtWHg==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-16.1.0.tgz", + "integrity": "sha512-2cHeZPNTuf1JWbMqyA46MkExor5HMSgv8JrdmzEakUbJHUreh35/wN00FJf57qGs134exQW2thiSQ1IJUsVx2Q==", "dev": true, "dependencies": { "@commitlint/types": "^16.0.0", @@ -2059,14 +2005,14 @@ } }, "node_modules/@commitlint/load": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-16.0.0.tgz", - "integrity": "sha512-7WhrGCkP6K/XfjBBguLkkI2XUdiiIyMGlNsSoSqgRNiD352EiffhFEApMy1/XOU+viwBBm/On0n5p0NC7e9/4A==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-16.1.0.tgz", + "integrity": "sha512-MtlEhKjP8jAF85jjX4mw8DUUwCxKsCgAc865hhpnwxjrfBcmGP7Up2AFE/M3ZMGDmSl1X1TMybQk/zohj8Cqdg==", "dev": true, "dependencies": { - "@commitlint/config-validator": "^16.0.0", + "@commitlint/config-validator": "^16.1.0", "@commitlint/execute-rule": "^16.0.0", - "@commitlint/resolve-extends": "^16.0.0", + "@commitlint/resolve-extends": "^16.1.0", "@commitlint/types": "^16.0.0", "chalk": "^4.0.0", "cosmiconfig": "^7.0.0", @@ -2118,12 +2064,12 @@ } }, "node_modules/@commitlint/resolve-extends": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-16.0.0.tgz", - "integrity": "sha512-Z/w9MAQUcxeawpCLtjmkVNXAXOmB2nhW+LYmHEZcx9O6UTauF/1+uuZ2/r0MtzTe1qw2JD+1QHVhEWYHVPlkdA==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-16.1.0.tgz", + "integrity": "sha512-8182s6AFoUFX6+FT1PgQDt15nO2ogdR/EN8SYVAdhNXw1rLz8kT5saB/ICw567GuRAUgFTUMGCXy3ctMOXPEDg==", "dev": true, "dependencies": { - "@commitlint/config-validator": "^16.0.0", + "@commitlint/config-validator": "^16.1.0", "@commitlint/types": "^16.0.0", "import-fresh": "^3.0.0", "lodash": "^4.17.19", @@ -2463,11 +2409,6 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@netlify/build/node_modules/@types/node": { - "version": "16.11.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.21.tgz", - "integrity": "sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A==" - }, "node_modules/@netlify/build/node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -2494,16 +2435,6 @@ "node": ">=10" } }, - "node_modules/@netlify/build/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/@netlify/build/node_modules/decompress-response": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", @@ -2515,14 +2446,6 @@ "node": ">=10" } }, - "node_modules/@netlify/build/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/@netlify/build/node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -2598,46 +2521,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@netlify/build/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@netlify/build/node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@netlify/build/node_modules/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", - "engines": { - "node": ">=12" - } - }, "node_modules/@netlify/cache-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@netlify/cache-utils/-/cache-utils-4.1.1.tgz", - "integrity": "sha512-rb1kTdSp8Ci89b7WJ/EQJTvq3cZ0ejarXde1eq+/l3+yfvItgcY8JF9ajXGv0uKAop2G+aiuDaAzHSZdFJNJvA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@netlify/cache-utils/-/cache-utils-4.1.2.tgz", + "integrity": "sha512-CRqJLmoyBipU2fjaOeBmH9VgNGnm2kp6yuoN5PoEgzPFnB4t1mBCtEw7hes00jb5KJqBON7ESLS+4pSKr7W61Q==", "dependencies": { "cpy": "^8.1.0", - "del": "^5.1.0", + "del": "^6.0.0", "get-stream": "^6.0.0", "globby": "^11.0.0", "junk": "^3.1.0", @@ -2650,62 +2540,15 @@ "node": "^12.20.0 || ^14.14.0 || >=16.0.0" } }, - "node_modules/@netlify/cache-utils/node_modules/del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "dependencies": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@netlify/cache-utils/node_modules/del/node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@netlify/cache-utils/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@netlify/config": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@netlify/config/-/config-17.0.3.tgz", - "integrity": "sha512-u1x//PEqKvsExPQtRMG4x786mKcAV6ykwqiN102szLlr5Dojb7X5y+6vb9wi4JJ/KNiVURP7Wna/sMxGvFi/Tw==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@netlify/config/-/config-17.0.6.tgz", + "integrity": "sha512-fX9C/FCsIq+8KfiHEo+PtAV7ZL8GxCzLYjAPQosdTg+CledhPtKnEvM1i20YAaJnpeV1UJ4l3tIMQ11zfTdH7g==", "dependencies": { "chalk": "^4.1.2", "cron-parser": "^4.1.0", "deepmerge": "^4.2.2", - "dot-prop": "^5.3.0", + "dot-prop": "^6.0.0", "execa": "^5.1.1", "fast-safe-stringify": "^2.0.7", "figures": "^3.2.0", @@ -2714,11 +2557,10 @@ "indent-string": "^4.0.0", "is-plain-obj": "^3.0.0", "js-yaml": "^4.0.0", - "make-dir": "^3.1.0", "map-obj": "^4.0.0", - "netlify": "^10.1.1", - "netlify-headers-parser": "^6.0.0", - "netlify-redirect-parser": "^13.0.0", + "netlify": "^10.1.2", + "netlify-headers-parser": "^6.0.1", + "netlify-redirect-parser": "^13.0.1", "omit.js": "^2.0.2", "p-locate": "^5.0.0", "path-exists": "^4.0.0", @@ -2726,7 +2568,7 @@ "toml": "^3.0.0", "tomlify-j0.4": "^3.0.0", "validate-npm-package-name": "^3.0.0", - "yargs": "^15.3.0" + "yargs": "^17.3.1" }, "bin": { "netlify-config": "src/bin/main.js" @@ -2735,17 +2577,6 @@ "node": "^12.20.0 || ^14.14.0 || >=16.0.0" } }, - "node_modules/@netlify/config/node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@netlify/esbuild": { "version": "0.13.6", "resolved": "https://registry.npmjs.org/@netlify/esbuild/-/esbuild-0.13.6.tgz", @@ -2840,11 +2671,11 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/@netlify/functions-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@netlify/functions-utils/-/functions-utils-4.1.1.tgz", - "integrity": "sha512-vguTnUysg4NDpgx2ToiTrRMgDfit/i5W6hd2Nl9CMy9auek8stB+4HDUq4qSH2pLqKlyH7l/oJ1SZ6gtJUG1Pw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@netlify/functions-utils/-/functions-utils-4.1.4.tgz", + "integrity": "sha512-uXL2rhJd8Yz4c5GwcvjfAv2G84ru47YSBr9k8KevHPZwbk6be1SoNQLlizGFClDeVvSuSMRtrLkQdMKjJpfi2Q==", "dependencies": { - "@netlify/zip-it-and-ship-it": "^5.4.0", + "@netlify/zip-it-and-ship-it": "^5.5.0", "cpy": "^8.1.0", "path-exists": "^4.0.0" }, @@ -3222,16 +3053,6 @@ "node": "^12.20.0 || ^14.14.0 || >=16.0.0" } }, - "node_modules/@netlify/zip-it-and-ship-it/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/@netlify/zip-it-and-ship-it/node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3240,14 +3061,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/@netlify/zip-it-and-ship-it/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, "node_modules/@netlify/zip-it-and-ship-it/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -3460,9 +3273,9 @@ } }, "node_modules/@rollup/plugin-commonjs/node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dependencies": { "is-core-module": "^2.8.0", "path-parse": "^1.0.7", @@ -3519,9 +3332,9 @@ } }, "node_modules/@rollup/plugin-node-resolve/node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dependencies": { "is-core-module": "^2.8.0", "path-parse": "^1.0.7", @@ -3575,9 +3388,9 @@ } }, "node_modules/@sindresorhus/is": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.1.tgz", - "integrity": "sha512-BrzrgtaqEre0qfvI8sMTaEvx+bayuhPmfe2rfeUGPPHYr/PLxCOqkOe4TQTDPb+qcqgNcsAtXV/Ew74mcDIE8w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.3.0.tgz", + "integrity": "sha512-wwOvh0eO3PiTEivGJWiZ+b946SlMSb4pe+y+Ur/4S87cwo09pYi+FWHHnbrM3W9W7cBYKDqQXcrFYjYUCOJUEQ==", "dev": true, "engines": { "node": ">=10" @@ -3816,9 +3629,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "17.0.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", - "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" + "version": "16.11.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.21.tgz", + "integrity": "sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A==" }, "node_modules/@types/node-fetch": { "version": "2.5.12", @@ -3894,14 +3707,14 @@ "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.1.tgz", - "integrity": "sha512-Xv9tkFlyD4MQGpJgTo6wqDqGvHIRmRgah/2Sjz1PUnJTawjHWIwBivUE9x0QtU2WVii9baYgavo/bHjrZJkqTw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.9.1", - "@typescript-eslint/scope-manager": "5.9.1", - "@typescript-eslint/type-utils": "5.9.1", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/type-utils": "5.10.0", + "@typescript-eslint/utils": "5.10.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -3926,39 +3739,15 @@ } } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.1.tgz", - "integrity": "sha512-cb1Njyss0mLL9kLXgS/eEY53SZQ9sT519wpX3i+U457l2UXRDuo87hgKfgRazmu9/tQb0x2sr3Y0yrU+Zz0y+w==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.9.1", - "@typescript-eslint/types": "5.9.1", - "@typescript-eslint/typescript-estree": "5.9.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.1.tgz", - "integrity": "sha512-PLYO0AmwD6s6n0ZQB5kqPgfvh73p0+VqopQQLuNfi7Lm0EpfKyDalchpVwkE+81k5HeiRrTV/9w1aNHzjD7C4g==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", + "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.9.1", - "@typescript-eslint/types": "5.9.1", - "@typescript-eslint/typescript-estree": "5.9.1", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", "debug": "^4.3.2" }, "engines": { @@ -3978,13 +3767,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.1.tgz", - "integrity": "sha512-8BwvWkho3B/UOtzRyW07ffJXPaLSUKFBjpq8aqsRvu6HdEuzCY57+ffT7QoV4QXJXWSU1+7g3wE4AlgImmQ9pQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", + "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.9.1", - "@typescript-eslint/visitor-keys": "5.9.1" + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3995,12 +3784,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.1.tgz", - "integrity": "sha512-tRSpdBnPRssjlUh35rE9ug5HrUvaB9ntREy7gPXXKwmIx61TNN7+l5YKgi1hMKxo5NvqZCfYhA5FvyuJG6X6vg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", + "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.9.1", + "@typescript-eslint/utils": "5.10.0", "debug": "^4.3.2", "tsutils": "^3.21.0" }, @@ -4021,9 +3810,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.1.tgz", - "integrity": "sha512-SsWegWudWpkZCwwYcKoDwuAjoZXnM1y2EbEerTHho19Hmm+bQ56QG4L4jrtCu0bI5STaRTvRTZmjprWlTw/5NQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4034,13 +3823,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.1.tgz", - "integrity": "sha512-gL1sP6A/KG0HwrahVXI9fZyeVTxEYV//6PmcOn1tD0rw8VhUWYeZeuWHwwhnewnvEMcHjhnJLOBhA9rK4vmb8A==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", + "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.9.1", - "@typescript-eslint/visitor-keys": "5.9.1", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -4060,13 +3849,37 @@ } } }, + "node_modules/@typescript-eslint/utils": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", + "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.1.tgz", - "integrity": "sha512-Xh37pNz9e9ryW4TVdwiFzmr4hloty8cFj8GTWMXh3Z8swGwyQWeCcNgF0hm6t09iZd6eiZmIf4zHedQVP6TVtg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", + "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.9.1", + "@typescript-eslint/types": "5.10.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -4078,9 +3891,9 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4989,17 +4802,6 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "node_modules/ava/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/ava/node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5009,15 +4811,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/ava/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/ava/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -5060,12 +4853,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", - "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "dependencies": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.0", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" }, "peerDependencies": { @@ -5081,11 +4874,11 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.0.tgz", - "integrity": "sha512-Hcrgnmkf+4JTj73GbK3bBhlVPiLL47owUAnoJIf69Hakl3q+KfodbDXiZWGMM7iqCZTxCG3Z2VRfPNYES4rXqQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz", + "integrity": "sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.0", + "@babel/helper-define-polyfill-provider": "^0.3.1", "core-js-compat": "^3.20.0" }, "peerDependencies": { @@ -5093,11 +4886,11 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", - "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.0" + "@babel/helper-define-polyfill-provider": "^0.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -5465,17 +5258,6 @@ "node": ">=10.12.0" } }, - "node_modules/c8/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/c8/node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5485,15 +5267,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/c8/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/c8/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -5660,9 +5433,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001299", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz", - "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw==", + "version": "1.0.30001301", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz", + "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/browserslist" @@ -5766,9 +5539,15 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -6035,56 +5814,13 @@ } }, "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "wrap-ansi": "^7.0.0" } }, "node_modules/clone": { @@ -6703,9 +6439,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.2.tgz", - "integrity": "sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg==", + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz", + "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==", "dependencies": { "browserslist": "^4.19.1", "semver": "7.0.0" @@ -6724,9 +6460,9 @@ } }, "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "node_modules/cors": { "version": "2.8.5", @@ -7266,12 +7002,6 @@ "punycode": "^2.1.0" } }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, "node_modules/data-urls/node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", @@ -7338,6 +7068,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -8018,12 +7749,6 @@ "webidl-conversions": "^4.0.2" } }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, "node_modules/domhandler": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", @@ -8356,9 +8081,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron-to-chromium": { - "version": "1.4.45", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.45.tgz", - "integrity": "sha512-czF9eYVuOmlY/vxyMQz2rGlNSjZpxNQYBe1gmQv7al171qOIhgyO9k7D5AKlgeTCSPKk+LHhj5ZyIdmEub9oNg==" + "version": "1.4.49", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.49.tgz", + "integrity": "sha512-k/0t1TRfonHIp8TJKfjBu2cKj8MqYTiEpOhci+q7CVEE5xnCQnx1pTa+V8b/sdhe4S3PR4p4iceEQWhGrKQORQ==" }, "node_modules/elegant-spinner": { "version": "1.0.1", @@ -8839,9 +8564,9 @@ } }, "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "dependencies": { "is-core-module": "^2.8.0", @@ -8876,9 +8601,9 @@ } }, "node_modules/eslint-import-resolver-typescript/node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "dependencies": { "is-core-module": "^2.8.0", @@ -8995,9 +8720,9 @@ } }, "node_modules/eslint-plugin-ava/node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -9182,9 +8907,9 @@ "dev": true }, "node_modules/eslint-plugin-import/node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "dependencies": { "is-core-module": "^2.8.0", @@ -9258,9 +8983,9 @@ } }, "node_modules/eslint-plugin-node/node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "dependencies": { "is-core-module": "^2.8.0", @@ -9360,9 +9085,9 @@ } }, "node_modules/eslint-plugin-unicorn": { - "version": "40.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-40.0.0.tgz", - "integrity": "sha512-5GRXISfBk8jMmYk1eeNDw8zSRnWTxBjWkzx2Prre6E2/yLu2twozZ3EomLWCBu9nWms/ZE361BItyMQwfnG1qA==", + "version": "40.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-40.1.0.tgz", + "integrity": "sha512-y5doK2DF9Sr5AqKEHbHxjFllJ167nKDRU01HDcWyv4Tnmaoe9iNxMrBnaybZvWZUaE3OC5Unu0lNIevYamloig==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.15.7", @@ -10082,9 +9807,9 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "node_modules/fast-redact": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.2.tgz", - "integrity": "sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.0.tgz", + "integrity": "sha512-dir8LOnvialLxiXDPESMDHGp82CHi6ZEYTVkcvdn5d7psdv9ZkkButXrOeXST4aqreIRR+N7CYlsrwFuorurVg==", "dev": true, "engines": { "node": ">=6" @@ -10923,9 +10648,9 @@ } }, "node_modules/gh-release-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gh-release-fetch/-/gh-release-fetch-3.0.0.tgz", - "integrity": "sha512-P7Anj35Y4kI3RBoQ+M8Z2U9ittORYyRNLb55+5yGGXmm3Mazgkq4MPqsHH9S7+pNWFpE2BtAWeF6twzz6JY3Bw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/gh-release-fetch/-/gh-release-fetch-3.0.1.tgz", + "integrity": "sha512-gV6V6+T0kKppzh/+YXpI/jl8ZgvjMY4oyWR3DAmPsqk9ILhk8TEneLFjBBM3kO7OfZ3dWCvuQu5M0DSh/Hz21w==", "dependencies": { "@types/download": "^8.0.0", "@types/node-fetch": "^2.1.6", @@ -11114,6 +10839,14 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, + "node_modules/graphql": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.2.0.tgz", + "integrity": "sha512-MuQd7XXrdOcmfwuLwC2jNvx0n3rxIuNYOxUtiee5XOmfrWo613ar2U8pE7aHAKh8VwfpifubpD9IP+EdEAEOsA==", + "engines": { + "node": "^12.22.0 || ^14.16.0 || >=16.0.0" + } + }, "node_modules/graphviz": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/graphviz/-/graphviz-0.0.9.tgz", @@ -13010,12 +12743,6 @@ "node": ">= 0.8.0" } }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, "node_modules/jsdom/node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", @@ -14918,11 +14645,11 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/multiparty": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.2.2.tgz", - "integrity": "sha512-NtZLjlvsjcoGrzojtwQwn/Tm90aWJ6XXtPppYF4WmOk/6ncdwMMKggFY2NlRRN9yiCEIVxpOfPWahVEG2HAG8Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.2.3.tgz", + "integrity": "sha512-Ak6EUJZuhGS8hJ3c2fY6UW5MbkGUPMBEGd13djUzoY/BHqV/gTuFWtC6IuVA7A2+v3yjBS6c4or50xhzTQZImQ==", "dependencies": { - "http-errors": "~1.8.0", + "http-errors": "~1.8.1", "safe-buffer": "5.2.1", "uid-safe": "2.1.5" }, @@ -14997,9 +14724,9 @@ } }, "node_modules/nanoid": { - "version": "3.1.32", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.32.tgz", - "integrity": "sha512-F8mf7R3iT9bvThBoW4tGXhXFHCctyCiUUPrWF8WaTqa3h96d9QybkSeba43XVOOE3oiLfkVDe4bT8MeGmkrTxw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -15124,6 +14851,24 @@ "node": "^12.20.0 || ^14.14.0 || >=16.0.0" } }, + "node_modules/netlify-onegraph-internal": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/netlify-onegraph-internal/-/netlify-onegraph-internal-0.0.15.tgz", + "integrity": "sha512-PlUro29zk/D+9/8NLQOx8Qw58KWvZo/42uR+7YMqSx9pMtgvtqKWqpAGGf0iCy4eAwe/XLT/eCQR6k/dIBbZHw==", + "dependencies": { + "graphql": "16.0.0", + "node-fetch": "^2.6.0", + "uuid": "^8.3.2" + } + }, + "node_modules/netlify-onegraph-internal/node_modules/graphql": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.0.0.tgz", + "integrity": "sha512-n9NxoRfwnpYBZB/WJ7L166gyrShuZ8qYgVaX8oxVyELcJfAwkvwPt6WlYIl90WRlzqDjaNWvLmNOSnKs5llZWQ==", + "engines": { + "node": "^12.22.0 || ^14.16.0 || >=16.0.0" + } + }, "node_modules/netlify-redirect-parser": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/netlify-redirect-parser/-/netlify-redirect-parser-13.0.1.tgz", @@ -16001,9 +15746,9 @@ } }, "node_modules/npm-run-all/node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "dependencies": { "is-core-module": "^2.8.0", @@ -17321,15 +17066,15 @@ } }, "node_modules/precinct": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.3.0.tgz", - "integrity": "sha512-+NPlVGgm+SVfQeClQQt9q4L7Aq7Lym2EhoLU8Ocs1T131hLJ0LAOMigHILSf5kVH2/rym5c80bUdBPkZ1HPKFA==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.3.1.tgz", + "integrity": "sha512-pVppfMWLp2wF68rwHqBIpPBYY8Kd12lDhk8LVQzOwqllifVR15qNFyod43YLyFpurKRZQKnE7E4pofAagDOm2Q==", "dependencies": { "commander": "^2.20.3", - "debug": "^4.3.1", - "detective-amd": "^3.0.1", + "debug": "^4.3.3", + "detective-amd": "^3.1.0", "detective-cjs": "^3.1.1", - "detective-es6": "^2.2.0", + "detective-es6": "^2.2.1", "detective-less": "^1.0.2", "detective-postcss": "^4.0.0", "detective-sass": "^3.0.1", @@ -17535,9 +17280,9 @@ } }, "node_modules/proxyquire/node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "dependencies": { "is-core-module": "^2.8.0", @@ -17860,9 +17605,9 @@ } }, "node_modules/read-pkg/node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dependencies": { "is-core-module": "^2.8.0", "path-parse": "^1.0.7", @@ -18260,11 +18005,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "node_modules/require-package-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", @@ -18388,9 +18128,9 @@ } }, "node_modules/rollup": { - "version": "2.64.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.64.0.tgz", - "integrity": "sha512-+c+lbw1lexBKSMb1yxGDVfJ+vchJH3qLbmavR+awDinTDA2C5Ug9u7lkOzj62SCu0PKUExsW36tpgW7Fmpn3yQ==", + "version": "2.65.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.65.0.tgz", + "integrity": "sha512-ohZVYrhtVMTqqeqH26sngfMiyGDg6gCUReOsoflXvYpzUkDHp8sVG8F9FQxjs72OfnLWpXP2nNNqQ9I0vkRovA==", "bin": { "rollup": "dist/bin/rollup" }, @@ -19139,9 +18879,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "engines": { "node": ">=0.10.0" } @@ -19730,9 +19470,9 @@ } }, "node_modules/superagent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.0.2.tgz", - "integrity": "sha512-2Kx35bZxLLJMBKtuXezxvD0aZQ7l923VwoCn7EtUx+aFxdG7co7PeRIddfrNtvvMuGaLZXA0mKzX+yWRhjrJ7A==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.1.tgz", + "integrity": "sha512-CQ2weSS6M+doIwwYFoMatklhRbx6sVNdB99OEJ5czcP3cng76Ljqus694knFWgOj3RkrtxZqIgpe6vhe0J7QWQ==", "dev": true, "dependencies": { "component-emitter": "^1.3.0", @@ -19817,13 +19557,13 @@ } }, "node_modules/supertest": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.1.tgz", - "integrity": "sha512-2kBKhfZgnPLmjpzB0n7A2ZnEAWTaLXq4bn3EEVY9w8rUpLyIlSusqKKvWA1Cav7hxXBnXGpxBsSeOHj5wQGe1Q==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.2.tgz", + "integrity": "sha512-wCw9WhAtKJsBvh07RaS+/By91NNE0Wh0DN19/hWPlBOU8tAfOtbZoVSV4xXeoKoxgPx0rx2y+y+8660XtE7jzg==", "dev": true, "dependencies": { "methods": "^1.1.2", - "superagent": "^7.0.2" + "superagent": "^7.1.0" }, "engines": { "node": ">=6.0.0" @@ -19908,9 +19648,9 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -20688,9 +20428,9 @@ } }, "node_modules/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -21500,9 +21240,9 @@ "dev": true }, "node_modules/verdaccio/node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "dependencies": { "is-core-module": "^2.8.0", @@ -21530,12 +21270,6 @@ "extsprintf": "^1.2.0" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -21556,12 +21290,6 @@ "xml-name-validator": "^3.0.0" } }, - "node_modules/w3c-xmlserializer/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, "node_modules/wait-port": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.9.tgz", @@ -21643,9 +21371,10 @@ } }, "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "node_modules/well-known-symbols": { "version": "2.0.0", @@ -21679,6 +21408,11 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -21709,11 +21443,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -21949,9 +21678,12 @@ } }, "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } }, "node_modules/yallist": { "version": "4.0.0", @@ -21968,24 +21700,20 @@ } }, "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/yargs-parser": { @@ -21996,26 +21724,6 @@ "node": ">=10" } }, - "node_modules/yargs/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yargs/node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -22024,60 +21732,12 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/yargs/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/yargs/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", "engines": { - "node": ">=6" + "node": ">=12" } }, "node_modules/yauzl": { @@ -22137,19 +21797,19 @@ "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==" }, "@babel/core": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", - "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.10.tgz", + "integrity": "sha512-pbiIdZbCiMx/MM6toR+OfXarYix3uz0oVsnNtfdAGTcCTu3w/JGF8JhirevXLBJUu0WguSZI12qpKnx7EeMyLA==", "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", + "@babel/generator": "^7.16.8", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-module-transforms": "^7.16.7", "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.7", + "@babel/parser": "^7.16.10", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -22230,9 +21890,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz", - "integrity": "sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -22253,9 +21913,9 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", - "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -22268,9 +21928,9 @@ }, "dependencies": { "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "requires": { "is-core-module": "^2.8.0", "path-parse": "^1.0.7", @@ -22448,9 +22108,9 @@ } }, "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -22496,9 +22156,9 @@ } }, "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==" + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", + "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.7", @@ -22633,11 +22293,11 @@ } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz", - "integrity": "sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.10", "@babel/helper-plugin-utils": "^7.16.7" } }, @@ -23106,9 +22766,9 @@ } }, "@babel/preset-env": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.8.tgz", - "integrity": "sha512-9rNKgVCdwHb3z1IlbMyft6yIXIeP3xz6vWvGaLHrJThuEIqWfHb0DNBH9VuTgnDfdbUDhkmkvMZS/YMCtP7Elg==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", "requires": { "@babel/compat-data": "^7.16.8", "@babel/helper-compilation-targets": "^7.16.7", @@ -23128,7 +22788,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.16.7", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", "@babel/plugin-proposal-private-property-in-object": "^7.16.7", "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -23238,9 +22898,9 @@ } }, "@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -23248,7 +22908,7 @@ "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", + "@babel/parser": "^7.16.10", "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" @@ -23270,17 +22930,17 @@ "dev": true }, "@bugsnag/browser": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.14.1.tgz", - "integrity": "sha512-xenvisYx6xFNuh7GGR/SCLcRs2H6AXn58Ha/u/Yhk+typ1oE5EFAy15+2vdGMDmZp0GsAEgrOTsEZ30uSKdC1w==", + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.15.1.tgz", + "integrity": "sha512-9JyoadlU4Tj5wnu2NnSfvYX2n31FC7jBdsMF0JdWrrOMFH0htmjUL9JMDv3zXFtOfeez2GMDivwc/dJPXTUEkA==", "requires": { - "@bugsnag/core": "^7.14.0" + "@bugsnag/core": "^7.15.1" } }, "@bugsnag/core": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.14.0.tgz", - "integrity": "sha512-DKN7hNEA6zEOgnucihgNEiMmx4GVaFHD9dJUYQFiouAIL19R/TLgG6B+pGC+QAqHVYsCUt5XDnG8jD+J+3fKOA==", + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.15.1.tgz", + "integrity": "sha512-fwEYdQEYQhLqFYz8ZoWFCfSVGE5rEhdu/7TtHRDCNs9VwVabb3iAfFwYS8ShLeMPf0K6NaLQ1UC531cI5KEFVA==", "requires": { "@bugsnag/cuid": "^3.0.0", "@bugsnag/safe-json-stringify": "^6.0.0", @@ -23295,20 +22955,20 @@ "integrity": "sha512-LOt8aaBI+KvOQGneBtpuCz3YqzyEAehd1f3nC5yr9TIYW1+IzYKa2xWS4EiMz5pPOnRPHkyyS5t/wmSmN51Gjg==" }, "@bugsnag/js": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.14.1.tgz", - "integrity": "sha512-ygykhixXByzolFpOsUGr72ENgiL1t4TkvKvka2rhoSHOr5kul9TierjvmwBKNpkPdUpDNkgqw3y349jYzzjk+w==", + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.15.1.tgz", + "integrity": "sha512-+RjoaWFPnN9TO3oiMdFVmrQQS5ywnNGp/4aFr+UNcOgvB9V8AqwQi9yNqnbvqAPwXFvPYI3obq2n0VMiiHAPXA==", "requires": { - "@bugsnag/browser": "^7.14.1", - "@bugsnag/node": "^7.14.1" + "@bugsnag/browser": "^7.15.1", + "@bugsnag/node": "^7.15.1" } }, "@bugsnag/node": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.14.1.tgz", - "integrity": "sha512-QhdFez60rTlEueg5rA0W6x8UrTcEnssv4XVPgfooGe2fYh6O89RFjI7zVVdw8QXUyqdf7w4WzyAsCir3XEhCqQ==", + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.15.1.tgz", + "integrity": "sha512-8yBXQqQumu35endZToKKEOPWZAGZ6BA1IHNI0ivW4u4sym9KnROED1uxYCyXlOPj6BNIdwUKKLhU8jGzdxppJQ==", "requires": { - "@bugsnag/core": "^7.14.0", + "@bugsnag/core": "^7.15.1", "byline": "^5.0.0", "error-stack-parser": "^2.0.2", "iserror": "^0.0.2", @@ -23322,66 +22982,20 @@ "integrity": "sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==" }, "@commitlint/cli": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-16.0.2.tgz", - "integrity": "sha512-Jt7iaBjoLGC5Nq4dHPTvTYnqPGkElFPBtTXTvBpTgatZApczyjI2plE0oG4GYWPp1suHIS/VdVDOMpPZjGVusg==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-16.1.0.tgz", + "integrity": "sha512-x5L1knvA3isRWBRVQx+Q6D45pA9139a2aZQYpxkljMG0dj4UHZkCnsYWpnGalxPxASI7nrI0KedKfS2YeQ55cQ==", "dev": true, "requires": { "@commitlint/format": "^16.0.0", "@commitlint/lint": "^16.0.0", - "@commitlint/load": "^16.0.0", + "@commitlint/load": "^16.1.0", "@commitlint/read": "^16.0.0", "@commitlint/types": "^16.0.0", "lodash": "^4.17.19", "resolve-from": "5.0.0", "resolve-global": "1.0.0", "yargs": "^17.0.0" - }, - "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", - "dev": true - } } }, "@commitlint/config-conventional": { @@ -23394,9 +23008,9 @@ } }, "@commitlint/config-validator": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-16.0.0.tgz", - "integrity": "sha512-i80DGlo1FeC5jZpuoNV9NIjQN/m2dDV3jYGWg+1Wr+KldptkUHXj+6GY1Akll66lJ3D8s6aUGi3comPLHPtWHg==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-16.1.0.tgz", + "integrity": "sha512-2cHeZPNTuf1JWbMqyA46MkExor5HMSgv8JrdmzEakUbJHUreh35/wN00FJf57qGs134exQW2thiSQ1IJUsVx2Q==", "dev": true, "requires": { "@commitlint/types": "^16.0.0", @@ -23452,14 +23066,14 @@ } }, "@commitlint/load": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-16.0.0.tgz", - "integrity": "sha512-7WhrGCkP6K/XfjBBguLkkI2XUdiiIyMGlNsSoSqgRNiD352EiffhFEApMy1/XOU+viwBBm/On0n5p0NC7e9/4A==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-16.1.0.tgz", + "integrity": "sha512-MtlEhKjP8jAF85jjX4mw8DUUwCxKsCgAc865hhpnwxjrfBcmGP7Up2AFE/M3ZMGDmSl1X1TMybQk/zohj8Cqdg==", "dev": true, "requires": { - "@commitlint/config-validator": "^16.0.0", + "@commitlint/config-validator": "^16.1.0", "@commitlint/execute-rule": "^16.0.0", - "@commitlint/resolve-extends": "^16.0.0", + "@commitlint/resolve-extends": "^16.1.0", "@commitlint/types": "^16.0.0", "chalk": "^4.0.0", "cosmiconfig": "^7.0.0", @@ -23499,12 +23113,12 @@ } }, "@commitlint/resolve-extends": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-16.0.0.tgz", - "integrity": "sha512-Z/w9MAQUcxeawpCLtjmkVNXAXOmB2nhW+LYmHEZcx9O6UTauF/1+uuZ2/r0MtzTe1qw2JD+1QHVhEWYHVPlkdA==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-16.1.0.tgz", + "integrity": "sha512-8182s6AFoUFX6+FT1PgQDt15nO2ogdR/EN8SYVAdhNXw1rLz8kT5saB/ICw567GuRAUgFTUMGCXy3ctMOXPEDg==", "dev": true, "requires": { - "@commitlint/config-validator": "^16.0.0", + "@commitlint/config-validator": "^16.1.0", "@commitlint/types": "^16.0.0", "import-fresh": "^3.0.0", "lodash": "^4.17.19", @@ -23773,11 +23387,6 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==" }, - "@types/node": { - "version": "16.11.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.21.tgz", - "integrity": "sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A==" - }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -23795,16 +23404,6 @@ "keyv": "^4.0.0" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "decompress-response": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", @@ -23813,11 +23412,6 @@ "mimic-response": "^2.0.0" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -23864,40 +23458,16 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==" } } }, "@netlify/cache-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@netlify/cache-utils/-/cache-utils-4.1.1.tgz", - "integrity": "sha512-rb1kTdSp8Ci89b7WJ/EQJTvq3cZ0ejarXde1eq+/l3+yfvItgcY8JF9ajXGv0uKAop2G+aiuDaAzHSZdFJNJvA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@netlify/cache-utils/-/cache-utils-4.1.2.tgz", + "integrity": "sha512-CRqJLmoyBipU2fjaOeBmH9VgNGnm2kp6yuoN5PoEgzPFnB4t1mBCtEw7hes00jb5KJqBON7ESLS+4pSKr7W61Q==", "requires": { "cpy": "^8.1.0", - "del": "^5.1.0", + "del": "^6.0.0", "get-stream": "^6.0.0", "globby": "^11.0.0", "junk": "^3.1.0", @@ -23905,59 +23475,17 @@ "move-file": "^2.0.0", "path-exists": "^4.0.0", "readdirp": "^3.4.0" - }, - "dependencies": { - "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - } - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - } } }, "@netlify/config": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@netlify/config/-/config-17.0.3.tgz", - "integrity": "sha512-u1x//PEqKvsExPQtRMG4x786mKcAV6ykwqiN102szLlr5Dojb7X5y+6vb9wi4JJ/KNiVURP7Wna/sMxGvFi/Tw==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@netlify/config/-/config-17.0.6.tgz", + "integrity": "sha512-fX9C/FCsIq+8KfiHEo+PtAV7ZL8GxCzLYjAPQosdTg+CledhPtKnEvM1i20YAaJnpeV1UJ4l3tIMQ11zfTdH7g==", "requires": { "chalk": "^4.1.2", "cron-parser": "^4.1.0", "deepmerge": "^4.2.2", - "dot-prop": "^5.3.0", + "dot-prop": "^6.0.0", "execa": "^5.1.1", "fast-safe-stringify": "^2.0.7", "figures": "^3.2.0", @@ -23966,11 +23494,10 @@ "indent-string": "^4.0.0", "is-plain-obj": "^3.0.0", "js-yaml": "^4.0.0", - "make-dir": "^3.1.0", "map-obj": "^4.0.0", - "netlify": "^10.1.1", - "netlify-headers-parser": "^6.0.0", - "netlify-redirect-parser": "^13.0.0", + "netlify": "^10.1.2", + "netlify-headers-parser": "^6.0.1", + "netlify-redirect-parser": "^13.0.1", "omit.js": "^2.0.2", "p-locate": "^5.0.0", "path-exists": "^4.0.0", @@ -23978,17 +23505,7 @@ "toml": "^3.0.0", "tomlify-j0.4": "^3.0.0", "validate-npm-package-name": "^3.0.0", - "yargs": "^15.3.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - } + "yargs": "^17.3.1" } }, "@netlify/esbuild": { @@ -24068,11 +23585,11 @@ } }, "@netlify/functions-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@netlify/functions-utils/-/functions-utils-4.1.1.tgz", - "integrity": "sha512-vguTnUysg4NDpgx2ToiTrRMgDfit/i5W6hd2Nl9CMy9auek8stB+4HDUq4qSH2pLqKlyH7l/oJ1SZ6gtJUG1Pw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@netlify/functions-utils/-/functions-utils-4.1.4.tgz", + "integrity": "sha512-uXL2rhJd8Yz4c5GwcvjfAv2G84ru47YSBr9k8KevHPZwbk6be1SoNQLlizGFClDeVvSuSMRtrLkQdMKjJpfi2Q==", "requires": { - "@netlify/zip-it-and-ship-it": "^5.4.0", + "@netlify/zip-it-and-ship-it": "^5.5.0", "cpy": "^8.1.0", "path-exists": "^4.0.0" } @@ -24294,26 +23811,11 @@ "yargs": "^16.0.0" }, "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -24489,9 +23991,9 @@ }, "dependencies": { "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "requires": { "is-core-module": "^2.8.0", "path-parse": "^1.0.7", @@ -24532,9 +24034,9 @@ }, "dependencies": { "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "requires": { "is-core-module": "^2.8.0", "path-parse": "^1.0.7", @@ -24569,9 +24071,9 @@ } }, "@sindresorhus/is": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.1.tgz", - "integrity": "sha512-BrzrgtaqEre0qfvI8sMTaEvx+bayuhPmfe2rfeUGPPHYr/PLxCOqkOe4TQTDPb+qcqgNcsAtXV/Ew74mcDIE8w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.3.0.tgz", + "integrity": "sha512-wwOvh0eO3PiTEivGJWiZ+b946SlMSb4pe+y+Ur/4S87cwo09pYi+FWHHnbrM3W9W7cBYKDqQXcrFYjYUCOJUEQ==", "dev": true }, "@sindresorhus/slugify": { @@ -24788,9 +24290,9 @@ "dev": true }, "@types/node": { - "version": "17.0.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", - "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" + "version": "16.11.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.21.tgz", + "integrity": "sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A==" }, "@types/node-fetch": { "version": "2.5.12", @@ -24865,14 +24367,14 @@ "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.1.tgz", - "integrity": "sha512-Xv9tkFlyD4MQGpJgTo6wqDqGvHIRmRgah/2Sjz1PUnJTawjHWIwBivUE9x0QtU2WVii9baYgavo/bHjrZJkqTw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.9.1", - "@typescript-eslint/scope-manager": "5.9.1", - "@typescript-eslint/type-utils": "5.9.1", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/type-utils": "5.10.0", + "@typescript-eslint/utils": "5.10.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -24881,67 +24383,53 @@ "tsutils": "^3.21.0" } }, - "@typescript-eslint/experimental-utils": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.1.tgz", - "integrity": "sha512-cb1Njyss0mLL9kLXgS/eEY53SZQ9sT519wpX3i+U457l2UXRDuo87hgKfgRazmu9/tQb0x2sr3Y0yrU+Zz0y+w==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.9.1", - "@typescript-eslint/types": "5.9.1", - "@typescript-eslint/typescript-estree": "5.9.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, "@typescript-eslint/parser": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.1.tgz", - "integrity": "sha512-PLYO0AmwD6s6n0ZQB5kqPgfvh73p0+VqopQQLuNfi7Lm0EpfKyDalchpVwkE+81k5HeiRrTV/9w1aNHzjD7C4g==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", + "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.9.1", - "@typescript-eslint/types": "5.9.1", - "@typescript-eslint/typescript-estree": "5.9.1", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.1.tgz", - "integrity": "sha512-8BwvWkho3B/UOtzRyW07ffJXPaLSUKFBjpq8aqsRvu6HdEuzCY57+ffT7QoV4QXJXWSU1+7g3wE4AlgImmQ9pQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", + "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.9.1", - "@typescript-eslint/visitor-keys": "5.9.1" + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0" } }, "@typescript-eslint/type-utils": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.1.tgz", - "integrity": "sha512-tRSpdBnPRssjlUh35rE9ug5HrUvaB9ntREy7gPXXKwmIx61TNN7+l5YKgi1hMKxo5NvqZCfYhA5FvyuJG6X6vg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", + "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.9.1", + "@typescript-eslint/utils": "5.10.0", "debug": "^4.3.2", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.1.tgz", - "integrity": "sha512-SsWegWudWpkZCwwYcKoDwuAjoZXnM1y2EbEerTHho19Hmm+bQ56QG4L4jrtCu0bI5STaRTvRTZmjprWlTw/5NQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.1.tgz", - "integrity": "sha512-gL1sP6A/KG0HwrahVXI9fZyeVTxEYV//6PmcOn1tD0rw8VhUWYeZeuWHwwhnewnvEMcHjhnJLOBhA9rK4vmb8A==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", + "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.9.1", - "@typescript-eslint/visitor-keys": "5.9.1", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -24949,20 +24437,34 @@ "tsutils": "^3.21.0" } }, + "@typescript-eslint/utils": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", + "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, "@typescript-eslint/visitor-keys": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.1.tgz", - "integrity": "sha512-Xh37pNz9e9ryW4TVdwiFzmr4hloty8cFj8GTWMXh3Z8swGwyQWeCcNgF0hm6t09iZd6eiZmIf4zHedQVP6TVtg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", + "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.9.1", + "@typescript-eslint/types": "5.10.0", "eslint-visitor-keys": "^3.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true } } @@ -25654,29 +25156,12 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -25715,12 +25200,12 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", - "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "requires": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.0", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" }, "dependencies": { @@ -25732,20 +25217,20 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.0.tgz", - "integrity": "sha512-Hcrgnmkf+4JTj73GbK3bBhlVPiLL47owUAnoJIf69Hakl3q+KfodbDXiZWGMM7iqCZTxCG3Z2VRfPNYES4rXqQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz", + "integrity": "sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.0", + "@babel/helper-define-polyfill-provider": "^0.3.1", "core-js-compat": "^3.20.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", - "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.0" + "@babel/helper-define-polyfill-provider": "^0.3.1" } }, "backoff": { @@ -26024,29 +25509,12 @@ "yargs-parser": "^20.2.7" }, "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -26171,9 +25639,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001299", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz", - "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw==" + "version": "1.0.30001301", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz", + "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==" }, "caseless": { "version": "0.12.0", @@ -26245,9 +25713,9 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -26445,46 +25913,13 @@ } }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } + "wrap-ansi": "^7.0.0" } }, "clone": { @@ -26996,9 +26431,9 @@ } }, "core-js-compat": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.2.tgz", - "integrity": "sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg==", + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz", + "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==", "requires": { "browserslist": "^4.19.1", "semver": "7.0.0" @@ -27012,9 +26447,9 @@ } }, "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cors": { "version": "2.8.5", @@ -27436,12 +26871,6 @@ "punycode": "^2.1.0" } }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, "whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", @@ -27500,7 +26929,8 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decamelize-keys": { "version": "1.1.0", @@ -28004,14 +27434,6 @@ "dev": true, "requires": { "webidl-conversions": "^4.0.2" - }, - "dependencies": { - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - } } }, "domhandler": { @@ -28280,9 +27702,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.4.45", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.45.tgz", - "integrity": "sha512-czF9eYVuOmlY/vxyMQz2rGlNSjZpxNQYBe1gmQv7al171qOIhgyO9k7D5AKlgeTCSPKk+LHhj5ZyIdmEub9oNg==" + "version": "1.4.49", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.49.tgz", + "integrity": "sha512-k/0t1TRfonHIp8TJKfjBu2cKj8MqYTiEpOhci+q7CVEE5xnCQnx1pTa+V8b/sdhe4S3PR4p4iceEQWhGrKQORQ==" }, "elegant-spinner": { "version": "1.0.1", @@ -28715,9 +28137,9 @@ } }, "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "requires": { "is-core-module": "^2.8.0", @@ -28741,9 +28163,9 @@ }, "dependencies": { "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "requires": { "is-core-module": "^2.8.0", @@ -28834,9 +28256,9 @@ }, "dependencies": { "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true }, "espree": { @@ -28973,9 +28395,9 @@ "dev": true }, "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "requires": { "is-core-module": "^2.8.0", @@ -29024,9 +28446,9 @@ "dev": true }, "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "requires": { "is-core-module": "^2.8.0", @@ -29098,9 +28520,9 @@ } }, "eslint-plugin-unicorn": { - "version": "40.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-40.0.0.tgz", - "integrity": "sha512-5GRXISfBk8jMmYk1eeNDw8zSRnWTxBjWkzx2Prre6E2/yLu2twozZ3EomLWCBu9nWms/ZE361BItyMQwfnG1qA==", + "version": "40.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-40.1.0.tgz", + "integrity": "sha512-y5doK2DF9Sr5AqKEHbHxjFllJ167nKDRU01HDcWyv4Tnmaoe9iNxMrBnaybZvWZUaE3OC5Unu0lNIevYamloig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.15.7", @@ -29589,9 +29011,9 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fast-redact": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.2.tgz", - "integrity": "sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.0.tgz", + "integrity": "sha512-dir8LOnvialLxiXDPESMDHGp82CHi6ZEYTVkcvdn5d7psdv9ZkkButXrOeXST4aqreIRR+N7CYlsrwFuorurVg==", "dev": true }, "fast-safe-stringify": { @@ -30230,9 +29652,9 @@ } }, "gh-release-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gh-release-fetch/-/gh-release-fetch-3.0.0.tgz", - "integrity": "sha512-P7Anj35Y4kI3RBoQ+M8Z2U9ittORYyRNLb55+5yGGXmm3Mazgkq4MPqsHH9S7+pNWFpE2BtAWeF6twzz6JY3Bw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/gh-release-fetch/-/gh-release-fetch-3.0.1.tgz", + "integrity": "sha512-gV6V6+T0kKppzh/+YXpI/jl8ZgvjMY4oyWR3DAmPsqk9ILhk8TEneLFjBBM3kO7OfZ3dWCvuQu5M0DSh/Hz21w==", "requires": { "@types/download": "^8.0.0", "@types/node-fetch": "^2.1.6", @@ -30377,6 +29799,11 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, + "graphql": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.2.0.tgz", + "integrity": "sha512-MuQd7XXrdOcmfwuLwC2jNvx0n3rxIuNYOxUtiee5XOmfrWo613ar2U8pE7aHAKh8VwfpifubpD9IP+EdEAEOsA==" + }, "graphviz": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/graphviz/-/graphviz-0.0.9.tgz", @@ -31730,12 +31157,6 @@ "prelude-ls": "~1.1.2" } }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, "whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", @@ -33212,11 +32633,11 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "multiparty": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.2.2.tgz", - "integrity": "sha512-NtZLjlvsjcoGrzojtwQwn/Tm90aWJ6XXtPppYF4WmOk/6ncdwMMKggFY2NlRRN9yiCEIVxpOfPWahVEG2HAG8Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.2.3.tgz", + "integrity": "sha512-Ak6EUJZuhGS8hJ3c2fY6UW5MbkGUPMBEGd13djUzoY/BHqV/gTuFWtC6IuVA7A2+v3yjBS6c4or50xhzTQZImQ==", "requires": { - "http-errors": "~1.8.0", + "http-errors": "~1.8.1", "safe-buffer": "5.2.1", "uid-safe": "2.1.5" }, @@ -33269,9 +32690,9 @@ } }, "nanoid": { - "version": "3.1.32", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.32.tgz", - "integrity": "sha512-F8mf7R3iT9bvThBoW4tGXhXFHCctyCiUUPrWF8WaTqa3h96d9QybkSeba43XVOOE3oiLfkVDe4bT8MeGmkrTxw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" }, "nanomatch": { "version": "1.2.13", @@ -33371,6 +32792,23 @@ "toml": "^3.0.0" } }, + "netlify-onegraph-internal": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/netlify-onegraph-internal/-/netlify-onegraph-internal-0.0.15.tgz", + "integrity": "sha512-PlUro29zk/D+9/8NLQOx8Qw58KWvZo/42uR+7YMqSx9pMtgvtqKWqpAGGf0iCy4eAwe/XLT/eCQR6k/dIBbZHw==", + "requires": { + "graphql": "16.0.0", + "node-fetch": "^2.6.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "graphql": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.0.0.tgz", + "integrity": "sha512-n9NxoRfwnpYBZB/WJ7L166gyrShuZ8qYgVaX8oxVyELcJfAwkvwPt6WlYIl90WRlzqDjaNWvLmNOSnKs5llZWQ==" + } + } + }, "netlify-redirect-parser": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/netlify-redirect-parser/-/netlify-redirect-parser-13.0.1.tgz", @@ -34069,9 +33507,9 @@ } }, "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "requires": { "is-core-module": "^2.8.0", @@ -35044,15 +34482,15 @@ } }, "precinct": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.3.0.tgz", - "integrity": "sha512-+NPlVGgm+SVfQeClQQt9q4L7Aq7Lym2EhoLU8Ocs1T131hLJ0LAOMigHILSf5kVH2/rym5c80bUdBPkZ1HPKFA==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.3.1.tgz", + "integrity": "sha512-pVppfMWLp2wF68rwHqBIpPBYY8Kd12lDhk8LVQzOwqllifVR15qNFyod43YLyFpurKRZQKnE7E4pofAagDOm2Q==", "requires": { "commander": "^2.20.3", - "debug": "^4.3.1", - "detective-amd": "^3.0.1", + "debug": "^4.3.3", + "detective-amd": "^3.1.0", "detective-cjs": "^3.1.1", - "detective-es6": "^2.2.0", + "detective-es6": "^2.2.1", "detective-less": "^1.0.2", "detective-postcss": "^4.0.0", "detective-sass": "^3.0.1", @@ -35210,9 +34648,9 @@ }, "dependencies": { "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "requires": { "is-core-module": "^2.8.0", @@ -35387,9 +34825,9 @@ } }, "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "requires": { "is-core-module": "^2.8.0", "path-parse": "^1.0.7", @@ -35747,11 +35185,6 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "require-package-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", @@ -35846,9 +35279,9 @@ } }, "rollup": { - "version": "2.64.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.64.0.tgz", - "integrity": "sha512-+c+lbw1lexBKSMb1yxGDVfJ+vchJH3qLbmavR+awDinTDA2C5Ug9u7lkOzj62SCu0PKUExsW36tpgW7Fmpn3yQ==", + "version": "2.65.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.65.0.tgz", + "integrity": "sha512-ohZVYrhtVMTqqeqH26sngfMiyGDg6gCUReOsoflXvYpzUkDHp8sVG8F9FQxjs72OfnLWpXP2nNNqQ9I0vkRovA==", "requires": { "fsevents": "~2.3.2" } @@ -36462,9 +35895,9 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-resolve": { "version": "0.5.3", @@ -36915,9 +36348,9 @@ } }, "superagent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.0.2.tgz", - "integrity": "sha512-2Kx35bZxLLJMBKtuXezxvD0aZQ7l923VwoCn7EtUx+aFxdG7co7PeRIddfrNtvvMuGaLZXA0mKzX+yWRhjrJ7A==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.1.tgz", + "integrity": "sha512-CQ2weSS6M+doIwwYFoMatklhRbx6sVNdB99OEJ5czcP3cng76Ljqus694knFWgOj3RkrtxZqIgpe6vhe0J7QWQ==", "dev": true, "requires": { "component-emitter": "^1.3.0", @@ -36985,13 +36418,13 @@ } }, "supertest": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.1.tgz", - "integrity": "sha512-2kBKhfZgnPLmjpzB0n7A2ZnEAWTaLXq4bn3EEVY9w8rUpLyIlSusqKKvWA1Cav7hxXBnXGpxBsSeOHj5wQGe1Q==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.2.tgz", + "integrity": "sha512-wCw9WhAtKJsBvh07RaS+/By91NNE0Wh0DN19/hWPlBOU8tAfOtbZoVSV4xXeoKoxgPx0rx2y+y+8660XtE7jzg==", "dev": true, "requires": { "methods": "^1.1.2", - "superagent": "^7.0.2" + "superagent": "^7.1.0" } }, "supports-color": { @@ -37051,9 +36484,9 @@ }, "dependencies": { "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -37662,9 +37095,9 @@ } }, "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==" + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==" }, "uglify-js": { "version": "3.14.5", @@ -38084,9 +37517,9 @@ "dev": true }, "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.1.tgz", + "integrity": "sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==", "dev": true, "requires": { "is-core-module": "^2.8.0", @@ -38329,14 +37762,6 @@ "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - } } }, "w3c-hr-time": { @@ -38357,14 +37782,6 @@ "domexception": "^1.0.1", "webidl-conversions": "^4.0.2", "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - } } }, "wait-port": { @@ -38429,9 +37846,10 @@ } }, "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "well-known-symbols": { "version": "2.0.0", @@ -38460,6 +37878,13 @@ "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + } } }, "which": { @@ -38483,11 +37908,6 @@ "is-symbol": "^1.0.3" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -38659,9 +38079,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", @@ -38675,79 +38095,28 @@ "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==" } } }, diff --git a/package.json b/package.json index d49fe75312a..d11e3d8d544 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "David Calavera (https://twitter.com/calavera)", "David Wells (https://davidwells.io/)", "Raees Iqbal (https://raeesbhatti.com/)", - "Bret Comnes (https://bret.io)" + "Bret Comnes (https://bret.io)", + "Sean Grove (https://twitter.com/sgrove)" ], "engines": { "node": "^12.20.0 || ^14.14.0 || >=16.0.0" @@ -121,6 +122,7 @@ "gh-release-fetch": "^3.0.0", "git-repo-info": "^2.1.0", "gitconfiglocal": "^2.1.0", + "graphql": "^16.1.0", "hasbin": "^1.2.3", "hasha": "^5.2.2", "http-proxy": "^1.18.0", @@ -144,6 +146,7 @@ "multiparty": "^4.2.1", "netlify": "^10.1.2", "netlify-headers-parser": "^6.0.1", + "netlify-onegraph-internal": "0.0.15", "netlify-redirect-parser": "^13.0.1", "netlify-redirector": "^0.2.1", "node-fetch": "^2.6.0", diff --git a/src/commands/dev/dev.js b/src/commands/dev/dev.js index aab7e6f1d56..7903db3f452 100644 --- a/src/commands/dev/dev.js +++ b/src/commands/dev/dev.js @@ -11,6 +11,8 @@ const stripAnsiCc = require('strip-ansi-control-characters') const waitPort = require('wait-port') const { startFunctionsServer } = require('../../lib/functions/server') +const { OneGraphCliClient, startOneGraphCLISession } = require('../../lib/one-graph/cli-client') +const { getNetlifyGraphConfig } = require('../../lib/one-graph/cli-netlify-graph') const { NETLIFYDEV, NETLIFYDEVERR, @@ -18,6 +20,7 @@ const { NETLIFYDEVWARN, chalk, detectServerSettings, + error, exit, getSiteInformation, injectEnvVariables, @@ -46,10 +49,10 @@ const startStaticServer = async ({ settings }) => { log(`\n${NETLIFYDEVLOG} Static server listening to`, settings.frameworkPort) } -const isNonExistingCommandError = ({ command, error }) => { +const isNonExistingCommandError = ({ command, error: commandError }) => { // `ENOENT` is only returned for non Windows systems // See https://github.com/sindresorhus/execa/pull/447 - if (error.code === 'ENOENT') { + if (commandError.code === 'ENOENT') { return true } @@ -60,7 +63,8 @@ const isNonExistingCommandError = ({ command, error }) => { // this only works on English versions of Windows return ( - typeof error.message === 'string' && error.message.includes('is not recognized as an internal or external command') + typeof commandError.message === 'string' && + commandError.message.includes('is not recognized as an internal or external command') ) } @@ -231,7 +235,7 @@ const printBanner = ({ url }) => { */ const dev = async (options, command) => { log(`${NETLIFYDEV}`) - const { api, config, site, siteInfo } = command.netlify + const { api, config, site, siteInfo, state } = command.netlify config.dev = { ...config.dev } config.build = { ...config.build } /** @type {import('./types').DevConfig} */ @@ -262,8 +266,8 @@ const dev = async (options, command) => { let settings = {} try { settings = await detectServerSettings(devConfig, options, site.root) - } catch (error) { - log(NETLIFYDEVERR, error.message) + } catch (error_) { + log(NETLIFYDEVERR, error_.message) exit(1) } @@ -291,6 +295,26 @@ const dev = async (options, command) => { process.env.URL = url process.env.DEPLOY_URL = url + const startNetlifyGraphWatcher = Boolean(options.graph) + + if (startNetlifyGraphWatcher && options.offline) { + warn(`Unable to start Netlify Graph in offline mode`) + } else if (startNetlifyGraphWatcher && !site.id) { + error( + `No siteId defined, unable to start Netlify Graph. To enable, run ${chalk.yellow( + 'netlify init', + )} or ${chalk.yellow('netlify link')}.`, + ) + } else if (startNetlifyGraphWatcher) { + const netlifyToken = await command.authenticate() + await OneGraphCliClient.ensureAppForSite(netlifyToken, site.id) + const netlifyGraphConfig = await getNetlifyGraphConfig({ command, options }) + + log(`Starting Netlify Graph session, to edit your library run \`netlify graph:edit\` in another tab`) + + startOneGraphCLISession({ netlifyGraphConfig, netlifyToken, site, state }) + } + printBanner({ url }) } @@ -335,6 +359,7 @@ const createDevCommand = (program) => { 'specify the path to a local GeoIP location database in MMDB format', ).hideHelp(), ) + .addOption(new Option('--graph', 'enable Netlify Graph support').hideHelp()) .addExamples([ 'netlify dev', 'netlify dev -d public', diff --git a/src/commands/graph/graph-edit.js b/src/commands/graph/graph-edit.js new file mode 100644 index 00000000000..f779eded761 --- /dev/null +++ b/src/commands/graph/graph-edit.js @@ -0,0 +1,91 @@ +const gitRepoInfo = require('git-repo-info') + +const { OneGraphCliClient, generateSessionName, loadCLISession } = require('../../lib/one-graph/cli-client') +const { + defaultExampleOperationsDoc, + getGraphEditUrlBySiteName, + getNetlifyGraphConfig, + readGraphQLOperationsSourceFile, +} = require('../../lib/one-graph/cli-netlify-graph') +const { NETLIFYDEVERR, chalk, error } = require('../../utils') +const { openBrowser } = require('../../utils/open-browser') + +const { createCLISession, createPersistedQuery, ensureAppForSite, updateCLISessionMetadata } = OneGraphCliClient + +/** + * Creates the `netlify graph:edit` command + * @param {import('commander').OptionValues} options + * @param {import('../base-command').BaseCommand} program + * @returns + */ +const graphEdit = async (options, command) => { + const { api, site, siteInfo, state } = command.netlify + const siteId = site.id + + if (!site.id) { + error( + `${NETLIFYDEVERR} Warning: no siteId defined, unable to start Netlify Graph. To enable, run ${chalk.yellow( + 'netlify init', + )} or ${chalk.yellow('netlify link')}`, + ) + } + const netlifyGraphConfig = await getNetlifyGraphConfig({ command, options }) + + const { branch } = gitRepoInfo() + + let graphqlDocument = readGraphQLOperationsSourceFile(netlifyGraphConfig) + + if (graphqlDocument.trim().length === 0) { + graphqlDocument = defaultExampleOperationsDoc + } + + const netlifyToken = await command.authenticate() + + await ensureAppForSite(netlifyToken, siteId) + + let oneGraphSessionId = loadCLISession(state) + if (!oneGraphSessionId) { + const sessionName = generateSessionName() + const oneGraphSession = await createCLISession(netlifyToken, site.id, sessionName) + state.set('oneGraphSessionId', oneGraphSession.id) + oneGraphSessionId = state.get('oneGraphSessionId') + } + + const persistedDoc = await createPersistedQuery(netlifyToken, { + appId: siteId, + description: 'Temporary snapshot of local queries', + document: graphqlDocument, + tags: ['netlify-cli', `session:${oneGraphSessionId}`, `git-branch:${branch}`], + }) + + await updateCLISessionMetadata(netlifyToken, siteId, oneGraphSessionId, { docId: persistedDoc.id }) + + let siteName = siteInfo.name + + if (!siteName) { + const siteData = await api.getSite({ siteId }) + siteName = siteData.name + if (!siteName) { + error(`No site name found for siteId ${siteId}`) + } + } + + const graphEditUrl = getGraphEditUrlBySiteName({ siteName, oneGraphSessionId }) + + await openBrowser({ url: graphEditUrl }) +} + +/** + * Creates the `netlify graph:edit` command + * @param {import('../base-command').BaseCommand} program + * @returns + */ +const createGraphEditCommand = (program) => + program + .command('graph:edit') + .description('Launch the browser to edit your local graph functions from Netlify') + .action(async (options, command) => { + await graphEdit(options, command) + }) + +module.exports = { createGraphEditCommand } diff --git a/src/commands/graph/graph-pull.js b/src/commands/graph/graph-pull.js new file mode 100644 index 00000000000..6423b0af4f4 --- /dev/null +++ b/src/commands/graph/graph-pull.js @@ -0,0 +1,95 @@ +/* eslint-disable eslint-comments/disable-enable-pair */ +/* eslint-disable fp/no-loops */ +const { + OneGraphCliClient, + handleCliSessionEvent, + loadCLISession, + refetchAndGenerateFromOneGraph, +} = require('../../lib/one-graph/cli-client') +const { buildSchema, getNetlifyGraphConfig, readGraphQLSchemaFile } = require('../../lib/one-graph/cli-netlify-graph') +const { chalk, error, warn } = require('../../utils') + +/** + * Creates the `netlify graph:pull` command + * @param {import('commander').OptionValues} options + * @param {import('../base-command').BaseCommand} program + * @returns + */ +const graphPull = async (options, command) => { + const { site, state } = command.netlify + + if (!site.id) { + error( + `No siteId defined, unable to start Netlify Graph. To enable, run ${chalk.yellow( + 'netlify init', + )} or ${chalk.yellow('netlify link')}`, + ) + } + + const netlifyGraphConfig = await getNetlifyGraphConfig({ command, options }) + const netlifyToken = await command.authenticate() + const siteId = site.id + + await refetchAndGenerateFromOneGraph({ netlifyGraphConfig, netlifyToken, state, siteId }) + + const oneGraphSessionId = loadCLISession(state) + + if (!oneGraphSessionId) { + warn('No local Netlify Graph session found, skipping command queue drain') + return + } + + const schemaString = readGraphQLSchemaFile(netlifyGraphConfig) + + let schema + + try { + schema = buildSchema(schemaString) + } catch (buildSchemaError) { + error(`Error parsing schema: ${buildSchemaError}`) + } + + if (!schema) { + error(`Failed to fetch and update Netlify GraphQL schema`) + } + + const next = await OneGraphCliClient.fetchCliSessionEvents({ + appId: siteId, + authToken: netlifyToken, + sessionId: oneGraphSessionId, + }) + + if (next.errors) { + error(`Failed to fetch Netlify Graph cli session events`, next.errors) + } + + if (next.events) { + const ackIds = [] + for (const event of next.events) { + await handleCliSessionEvent({ netlifyToken, event, netlifyGraphConfig, schema, siteId: site.id }) + ackIds.push(event.id) + } + + await OneGraphCliClient.ackCLISessionEvents({ + appId: siteId, + authToken: netlifyToken, + sessionId: oneGraphSessionId, + eventIds: ackIds, + }) + } +} + +/** + * Creates the `netlify graph:pull` command + * @param {import('../base-command').BaseCommand} program + * @returns + */ +const createGraphPullCommand = (program) => + program + .command('graph:pull') + .description('Pull down your local Netlify Graph schema, and process pending Graph edit events') + .action(async (options, command) => { + await graphPull(options, command) + }) + +module.exports = { createGraphPullCommand } diff --git a/src/commands/graph/graph.js b/src/commands/graph/graph.js new file mode 100644 index 00000000000..9c928b7e770 --- /dev/null +++ b/src/commands/graph/graph.js @@ -0,0 +1,30 @@ +// @ts-check +const { createGraphEditCommand } = require('./graph-edit') +const { createGraphPullCommand } = require('./graph-pull') + +/** + * The graph command + * @param {import('commander').OptionValues} options + * @param {import('../base-command').BaseCommand} command + */ +const graph = (options, command) => { + command.help() +} + +/** + * Creates the `netlify graph` command + * @param {import('../base-command').BaseCommand} program + * @returns + */ +const createGraphCommand = (program) => { + createGraphEditCommand(program) + createGraphPullCommand(program) + + return program + .command('graph') + .description('(Beta) Control the Netlify Graph functions for the current site') + .addExamples(['netlify graph:pull', 'netlify graph:edit']) + .action(graph) +} + +module.exports = { createGraphCommand } diff --git a/src/commands/graph/index.js b/src/commands/graph/index.js new file mode 100644 index 00000000000..4cdf3fa0f8c --- /dev/null +++ b/src/commands/graph/index.js @@ -0,0 +1,5 @@ +const { createGraphCommand } = require('./graph') + +module.exports = { + createGraphCommand, +} diff --git a/src/commands/main.js b/src/commands/main.js index 6959f96069f..14c4386a223 100644 --- a/src/commands/main.js +++ b/src/commands/main.js @@ -29,6 +29,7 @@ const { createDeployCommand } = require('./deploy') const { createDevCommand } = require('./dev') const { createEnvCommand } = require('./env') const { createFunctionsCommand } = require('./functions') +const { createGraphCommand } = require('./graph') const { createInitCommand } = require('./init') const { createLinkCommand } = require('./link') const { createLmCommand } = require('./lm') @@ -170,6 +171,7 @@ const createMainCommand = () => { createDevCommand(program) createEnvCommand(program) createFunctionsCommand(program) + createGraphCommand(program) createInitCommand(program) createLinkCommand(program) createLmCommand(program) diff --git a/src/lib/one-graph/cli-client.js b/src/lib/one-graph/cli-client.js new file mode 100644 index 00000000000..9badfcb2597 --- /dev/null +++ b/src/lib/one-graph/cli-client.js @@ -0,0 +1,278 @@ +/* eslint-disable eslint-comments/disable-enable-pair */ +/* eslint-disable fp/no-loops */ +const os = require('os') + +const { GraphQL, InternalConsole, OneGraphClient } = require('netlify-onegraph-internal') +const { NetlifyGraph } = require('netlify-onegraph-internal') + +const { chalk, error, log, warn } = require('../../utils') + +const { createCLISession, createPersistedQuery, ensureAppForSite, updateCLISessionMetadata } = OneGraphClient + +const { + generateFunctionsFile, + generateHandler, + readGraphQLOperationsSourceFile, + writeGraphQLOperationsSourceFile, + writeGraphQLSchemaFile, +} = require('./cli-netlify-graph') + +const { parse } = GraphQL +const { defaultExampleOperationsDoc, extractFunctionsFromOperationDoc } = NetlifyGraph + +const internalConsole = { + log, + warn, + error, + debug: console.debug, +} + +InternalConsole.registerConsole(internalConsole) + +/** + * Start polling for CLI events for a given session to process locally + * @param {object} input + * @param {string} input.appId The app to query against, typically the siteId + * @param {string} input.netlifyToken The (typically netlify) access token that is used for authentication, if any + * @param {NetlifyGraphConfig} input.netlifyGraphConfig A standalone config object that contains all the information necessary for Netlify Graph to process events + * @param {function} input.onClose A function to call when the polling loop is closed + * @param {function} input.onError A function to call when an error occurs + * @param {function} input.onEvents A function to call when CLI events are received and need to be processed + * @param {string} input.sessionId The session id to monitor CLI events for + * @param {state} input.state A function to call to set/get the current state of the local Netlify project + * @returns + */ +const monitorCLISessionEvents = (input) => { + const { appId, netlifyGraphConfig, netlifyToken, onClose, onError, onEvents, sessionId, state } = input + + const frequency = 5000 + let shouldClose = false + + const enabledServiceWatcher = async (innerNetlifyToken, siteId) => { + const enabledServices = state.get('oneGraphEnabledServices') || ['onegraph'] + const enabledServicesInfo = await OneGraphClient.fetchEnabledServices(innerNetlifyToken, siteId) + if (!enabledServicesInfo) { + warn('Unable to fetch enabled services for site for code generation') + return + } + const newEnabledServices = enabledServicesInfo.map((service) => service.service) + const enabledServicesCompareKey = enabledServices.sort().join(',') + const newEnabledServicesCompareKey = newEnabledServices.sort().join(',') + + if (enabledServicesCompareKey !== newEnabledServicesCompareKey) { + log( + `${chalk.magenta( + 'Reloading', + )} Netlify Graph schema..., ${enabledServicesCompareKey} => ${newEnabledServicesCompareKey}`, + ) + await refetchAndGenerateFromOneGraph({ netlifyGraphConfig, state, netlifyToken: innerNetlifyToken, siteId }) + log(`${chalk.green('Reloaded')} Netlify Graph schema and regenerated functions`) + } + } + + const close = () => { + shouldClose = true + } + + let handle + + const helper = async () => { + if (shouldClose) { + clearTimeout(handle) + onClose() + } + + const next = await OneGraphClient.fetchCliSessionEvents({ appId, authToken: netlifyToken, sessionId }) + + if (next.errors) { + next.errors.forEach((fetchEventError) => { + onError(fetchEventError) + }) + } + + const { events } = next + + if (events.length !== 0) { + const ackIds = await onEvents(events) + await OneGraphClient.ackCLISessionEvents({ appId, authToken: netlifyToken, sessionId, eventIds: ackIds }) + } + + await enabledServiceWatcher(netlifyToken, appId) + + handle = setTimeout(helper, frequency) + } + + // Fire immediately to start rather than waiting the initial `frequency` + helper() + + return close +} + +/** + * Fetch the schema for a site, and regenerate all of the downstream files + * @param {object} input + * @param {string} input.siteId The id of the site to query against + * @param {string} input.netlifyToken The (typically netlify) access token that is used for authentication, if any + * @param {NetlifyGraphConfig} input.netlifyGraphConfig A standalone config object that contains all the information necessary for Netlify Graph to process events + * @param {state} input.state A function to call to set/get the current state of the local Netlify project + * @returns {Promise} + */ +const refetchAndGenerateFromOneGraph = async (input) => { + const { netlifyGraphConfig, netlifyToken, siteId, state } = input + await OneGraphClient.ensureAppForSite(netlifyToken, siteId) + + const enabledServicesInfo = await OneGraphClient.fetchEnabledServices(netlifyToken, siteId) + if (!enabledServicesInfo) { + warn('Unable to fetch enabled services for site for code generation') + return + } + + const enabledServices = enabledServicesInfo + .map((service) => service.service) + .sort((aString, bString) => aString.localeCompare(bString)) + const schema = await OneGraphClient.fetchOneGraphSchema(siteId, enabledServices) + + let currentOperationsDoc = readGraphQLOperationsSourceFile(netlifyGraphConfig) + if (currentOperationsDoc.trim().length === 0) { + currentOperationsDoc = defaultExampleOperationsDoc + } + + const parsedDoc = parse(currentOperationsDoc) + const operations = extractFunctionsFromOperationDoc(parsedDoc) + + generateFunctionsFile(netlifyGraphConfig, schema, currentOperationsDoc, operations) + writeGraphQLSchemaFile(netlifyGraphConfig, schema) + state.set('oneGraphEnabledServices', enabledServices) +} + +/** + * + * @param {object} input + * @param {string} input.siteId The site id to query against + * @param {string} input.netlifyToken The (typically netlify) access token that is used for authentication, if any + * @param {string} input.docId The GraphQL operations document id to fetch + * @param {string} input.schema The GraphQL schema to use when generating code + * @param {NetlifyGraphConfig} input.netlifyGraphConfig A standalone config object that contains all the information necessary for Netlify Graph to process events + * @returns + */ +const updateGraphQLOperationsFile = async (input) => { + const { docId, netlifyGraphConfig, netlifyToken, schema, siteId } = input + const persistedDoc = await OneGraphClient.fetchPersistedQuery(netlifyToken, siteId, docId) + if (!persistedDoc) { + warn('No persisted doc found for:', docId) + return + } + + const doc = persistedDoc.query + + writeGraphQLOperationsSourceFile(netlifyGraphConfig, doc) + const appOperationsDoc = readGraphQLOperationsSourceFile(netlifyGraphConfig) + const parsedDoc = parse(appOperationsDoc, { + noLocation: true, + }) + const operations = extractFunctionsFromOperationDoc(parsedDoc) + generateFunctionsFile(netlifyGraphConfig, schema, appOperationsDoc, operations) +} + +const handleCliSessionEvent = async ({ event, netlifyGraphConfig, netlifyToken, schema, siteId }) => { + const { __typename, payload } = await event + switch (__typename) { + case 'OneGraphNetlifyCliSessionTestEvent': + await handleCliSessionEvent({ netlifyToken, event: payload, netlifyGraphConfig, schema, siteId }) + break + case 'OneGraphNetlifyCliSessionGenerateHandlerEvent': + await generateHandler(netlifyGraphConfig, schema, payload.operationId, payload) + break + case 'OneGraphNetlifyCliSessionPersistedLibraryUpdatedEvent': + await updateGraphQLOperationsFile({ netlifyToken, docId: payload.docId, netlifyGraphConfig, schema, siteId }) + break + default: { + warn(`Unrecognized event received, you may need to upgrade your CLI version`, __typename, payload) + break + } + } +} + +/** + * Load the CLI session id from the local state + * @param {state} state + * @returns + */ +const loadCLISession = (state) => state.get('oneGraphSessionId') + +/** + * Idemponentially save the CLI session id to the local state and start monitoring for CLI events and upstream schema changes + * @param {object} input + * @param {string} input.netlifyToken The (typically netlify) access token that is used for authentication, if any + * @param {NetlifyGraphConfig} input.netlifyGraphConfig A standalone config object that contains all the information necessary for Netlify Graph to process events + * @param {state} input.state A function to call to set/get the current state of the local Netlify project + * @param {site} input.site The site object + */ +const startOneGraphCLISession = async (input) => { + const { netlifyGraphConfig, netlifyToken, site, state } = input + OneGraphClient.ensureAppForSite(netlifyToken, site.id) + let oneGraphSessionId = loadCLISession(state) + if (!oneGraphSessionId) { + const sessionName = generateSessionName() + const sessionMetadata = {} + const oneGraphSession = await OneGraphClient.createCLISession(netlifyToken, site.id, sessionName, sessionMetadata) + state.set('oneGraphSessionId', oneGraphSession.id) + oneGraphSessionId = state.get('oneGraphSessionId') + } + + const enabledServices = [] + const schema = await OneGraphClient.fetchOneGraphSchema(site.id, enabledServices) + + monitorCLISessionEvents({ + appId: site.id, + netlifyToken, + netlifyGraphConfig, + sessionId: oneGraphSessionId, + state, + onEvents: async (events) => { + for (const event of events) { + const eventName = OneGraphClient.friendlyEventName(event) + log(`${chalk.magenta('Handling')} Netlify Graph: ${eventName}...`) + await handleCliSessionEvent({ netlifyToken, event, netlifyGraphConfig, schema, siteId: site.id }) + log(`${chalk.green('Finished handling')} Netlify Graph: ${eventName}...`) + } + return events.map((event) => event.id) + }, + onError: (fetchEventError) => { + error(`Netlify Graph upstream error: ${fetchEventError}`) + }, + onClose: () => { + log('Netlify Graph upstream closed') + }, + }) +} + +/** + * Generate a session name that can be identified as belonging to the current checkout + * @returns {string} The name of the session to create + */ +const generateSessionName = () => { + const userInfo = os.userInfo({ encoding: 'utf-8' }) + const sessionName = `${userInfo.username}-${Date.now()}` + log(`Generated Netlify Graph session name: ${sessionName}`) + return sessionName +} + +const OneGraphCliClient = { + ackCLISessionEvents: OneGraphClient.ackCLISessionEvents, + createCLISession, + createPersistedQuery, + fetchCliSessionEvents: OneGraphClient.fetchCliSessionEvents, + ensureAppForSite, + updateCLISessionMetadata, +} + +module.exports = { + OneGraphCliClient, + handleCliSessionEvent, + generateSessionName, + loadCLISession, + monitorCLISessionEvents, + refetchAndGenerateFromOneGraph, + startOneGraphCLISession, +} diff --git a/src/lib/one-graph/cli-netlify-graph.js b/src/lib/one-graph/cli-netlify-graph.js new file mode 100644 index 00000000000..315a29b9d6f --- /dev/null +++ b/src/lib/one-graph/cli-netlify-graph.js @@ -0,0 +1,278 @@ +const fs = require('fs') +const path = require('path') +const process = require('process') + +const { GraphQL, InternalConsole, NetlifyGraph } = require('netlify-onegraph-internal') + +const { detectServerSettings, error, getFunctionsDir, log, warn } = require('../../utils') + +const { printSchema } = GraphQL + +const internalConsole = { + log, + warn, + error, + debug: console.debug, +} + +InternalConsole.registerConsole(internalConsole) + +/** + * Remove any relative path components from the given path + * @param {string[]} items Filesystem path items to filter + * @return {string[]} Filtered filesystem path items + */ +const filterRelativePathItems = (items) => items.filter((part) => part !== '') + +/** + * Return a full NetlifyGraph config with any defaults overridden by netlify.toml + * @param {import('../base-command').BaseCommand} command + * @return {NetlifyGraphConfig} NetlifyGraphConfig + */ +const getNetlifyGraphConfig = async ({ command, options }) => { + const { config, site } = command.netlify + config.dev = { ...config.dev } + config.build = { ...config.build } + const userSpecifiedConfig = (config && config.graph) || {} + /** @type {import('./types').DevConfig} */ + const devConfig = { + framework: '#auto', + ...(config.functionsDirectory && { functions: config.functionsDirectory }), + ...(config.build.publish && { publish: config.build.publish }), + ...config.dev, + ...options, + } + + /** @type {Partial} */ + let settings = {} + try { + settings = await detectServerSettings(devConfig, options, site.root) + } catch (detectServerSettingsError) { + error(detectServerSettingsError) + } + + const siteRoot = [path.sep, ...filterRelativePathItems(site.root.split(path.sep))] + + const tsConfig = 'tsconfig.json' + const autodetectedLanguage = fs.existsSync(tsConfig) ? 'typescript' : 'javascript' + + const framework = settings.framework || userSpecifiedConfig.framework + const isNextjs = framework === 'Next.js' + const detectedFunctionsPathString = getFunctionsDir({ config, options }) + const detectedFunctionsPath = detectedFunctionsPathString ? detectedFunctionsPathString.split(path.sep) : null + const functionsPath = filterRelativePathItems(isNextjs ? [...siteRoot, 'pages', 'api'] : [...detectedFunctionsPath]) + const netlifyGraphPath = filterRelativePathItems( + isNextjs + ? [...siteRoot, 'lib', 'netlifyGraph'] + : [...siteRoot, ...NetlifyGraph.defaultNetlifyGraphConfig.netlifyGraphPath], + ) + const baseConfig = { ...NetlifyGraph.defaultNetlifyGraphConfig, ...userSpecifiedConfig } + const netlifyGraphImplementationFilename = [...netlifyGraphPath, `index.${baseConfig.extension}`] + const netlifyGraphTypeDefinitionsFilename = [...netlifyGraphPath, `index.d.ts`] + const graphQLOperationsSourceFilename = [...netlifyGraphPath, NetlifyGraph.defaultSourceOperationsFilename] + const graphQLSchemaFilename = [...netlifyGraphPath, NetlifyGraph.defaultGraphQLSchemaFilename] + const netlifyGraphRequirePath = isNextjs ? ['..', '..', 'lib', 'netlifyGraph'] : [`./netlifyGraph`] + const language = userSpecifiedConfig.language || autodetectedLanguage + const moduleType = baseConfig.moduleType || isNextjs ? 'esm' : 'commonjs' + const fullConfig = { + ...baseConfig, + functionsPath, + netlifyGraphPath, + netlifyGraphImplementationFilename, + netlifyGraphTypeDefinitionsFilename, + graphQLOperationsSourceFilename, + graphQLSchemaFilename, + netlifyGraphRequirePath, + framework, + language, + moduleType, + } + + return fullConfig +} + +/** + * Given a NetlifyGraphConfig, ensure that the netlifyGraphPath exists + * @param {NetlifyGraphConfig} netlifyGraphConfig + */ +const ensureNetlifyGraphPath = (netlifyGraphConfig) => { + fs.mkdirSync(path.resolve(...netlifyGraphConfig.netlifyGraphPath), { recursive: true }) +} + +/** + * Given a NetlifyGraphConfig, ensure that the functionsPath exists + * @param {NetlifyGraphConfig} netlifyGraphConfig + */ +const ensureFunctionsPath = (netlifyGraphConfig) => { + fs.mkdirSync(path.resolve(...netlifyGraphConfig.functionsPath), { recursive: true }) +} + +/** + * Generate a library file with type definitions for a given NetlifyGraphConfig, operationsDoc, and schema, writing them to the filesystem + * @param {NetlifyGraphConfig} netlifyGraphConfig + * @param {GraphQLSchema} schema The schema to use when generating the functions and their types + * @param {string} operationsDoc The GraphQL operations doc to use when generating the functions + * @param {NetlifyGraph.ParsedFunction} queries The parsed queries with metadata to use when generating library functions + */ +const generateFunctionsFile = (netlifyGraphConfig, schema, operationsDoc, queries) => { + const { clientSource, typeDefinitionsSource } = NetlifyGraph.generateFunctionsSource( + netlifyGraphConfig, + schema, + operationsDoc, + queries, + ) + + ensureNetlifyGraphPath(netlifyGraphConfig) + fs.writeFileSync(path.resolve(...netlifyGraphConfig.netlifyGraphImplementationFilename), clientSource, 'utf8') + fs.writeFileSync( + path.resolve(...netlifyGraphConfig.netlifyGraphTypeDefinitionsFilename), + typeDefinitionsSource, + 'utf8', + ) +} + +/** + * Using the given NetlifyGraphConfig, read the GraphQL operations file and return the _unparsed_ GraphQL operations doc + * @param {NetlifyGraphConfig} netlifyGraphConfig + * @returns {string} GraphQL operations doc + */ +const readGraphQLOperationsSourceFile = (netlifyGraphConfig) => { + ensureNetlifyGraphPath(netlifyGraphConfig) + + const fullFilename = path.resolve(...netlifyGraphConfig.graphQLOperationsSourceFilename) + if (!fs.existsSync(fullFilename)) { + fs.writeFileSync(fullFilename, '') + fs.closeSync(fs.openSync(fullFilename, 'w')) + } + + const source = fs.readFileSync(fullFilename, 'utf8') + + return source +} + +/** + * Write an operations doc to the filesystem using the given NetlifyGraphConfig + * @param {NetlifyGraphConfig} netlifyGraphConfig + * @param {string} operationsDoc The GraphQL operations doc to write + */ +const writeGraphQLOperationsSourceFile = (netlifyGraphConfig, operationDocString) => { + const graphqlSource = operationDocString + + ensureNetlifyGraphPath(netlifyGraphConfig) + fs.writeFileSync(path.resolve(...netlifyGraphConfig.graphQLOperationsSourceFilename), graphqlSource, 'utf8') +} + +/** + * Write a GraphQL Schema printed in SDL format to the filesystem using the given NetlifyGraphConfig + * @param {NetlifyGraphConfig} netlifyGraphConfig + * @param {GraphQLSchema} schema The GraphQL schema to print and write to the filesystem + */ +const writeGraphQLSchemaFile = (netlifyGraphConfig, schema) => { + const graphqlSource = printSchema(schema) + + ensureNetlifyGraphPath(netlifyGraphConfig) + fs.writeFileSync(path.resolve(...netlifyGraphConfig.graphQLSchemaFilename), graphqlSource, 'utf8') +} + +/** + * Using the given NetlifyGraphConfig, read the GraphQL schema file and return it _unparsed_ + * @param {NetlifyGraphConfig} netlifyGraphConfig + * @returns {string} GraphQL schema + */ +const readGraphQLSchemaFile = (netlifyGraphConfig) => { + ensureNetlifyGraphPath(netlifyGraphConfig) + return fs.readFileSync(path.resolve(...netlifyGraphConfig.graphQLSchemaFilename), 'utf8') +} + +/** + * Given a NetlifyGraphConfig, read the appropriate files and write a handler for the given operationId to the filesystem + * @param {NetlifyGraphConfig} netlifyGraphConfig + * @param {GraphQLSchema} schema The GraphQL schema to use when generating the handler + * @param {string} operationId The operationId to use when generating the handler + * @param {object} handlerOptions The options to use when generating the handler + * @returns + */ +const generateHandler = (netlifyGraphConfig, schema, operationId, handlerOptions) => { + let currentOperationsDoc = readGraphQLOperationsSourceFile(netlifyGraphConfig) + if (currentOperationsDoc.trim().length === 0) { + currentOperationsDoc = NetlifyGraph.defaultExampleOperationsDoc + } + + const result = NetlifyGraph.generateHandlerSource({ + handlerOptions, + schema, + netlifyGraphConfig, + operationId, + operationsDoc: currentOperationsDoc, + }) + + if (!result) { + warn(`No handler was generated for operationId ${operationId}`) + return + } + + const { exportedFiles, operation } = result + + ensureFunctionsPath(netlifyGraphConfig) + + if (!exportedFiles) { + return + } + + exportedFiles.forEach((exportedFile) => { + const { content } = exportedFile + const isNamed = exportedFile.kind === 'NamedExportedFile' + + let filenameArr + + if (isNamed) { + filenameArr = [...exportedFile.name] + } else { + const operationName = (operation.name && operation.name.value) || 'Unnamed' + const fileExtension = netlifyGraphConfig.language === 'typescript' ? 'ts' : netlifyGraphConfig.extension + const defaultBaseFilename = `${operationName}.${fileExtension}` + const baseFilename = defaultBaseFilename + + filenameArr = [path.sep, ...netlifyGraphConfig.functionsPath, baseFilename] + } + + const absoluteFilename = path.resolve(...filenameArr) + + fs.writeFileSync(absoluteFilename, content) + }) +} + +// Export the minimal set of functions that are required for Netlify Graph +const { buildSchema, parse } = GraphQL + +/** + * + * @param {object} options + * @param {string} options.siteName The name of the site as used in the Netlify UI url scheme + * @param {string} options.oneGraphSessionId The oneGraph session id to use when generating the graph-edit link + * @returns {string} The url to the Netlify Graph UI for the current session + */ +const getGraphEditUrlBySiteName = ({ oneGraphSessionId, siteName }) => { + const host = 'app.netlify.com' || process.env.NETLIFY_APP_HOST + // http because app.netlify.com will redirect to https, and localhost will still work for development + const url = `http://${host}/sites/${siteName}/graph/explorer?cliSessionId=${oneGraphSessionId}` + + return url +} + +module.exports = { + buildSchema, + defaultExampleOperationsDoc: NetlifyGraph.defaultExampleOperationsDoc, + extractFunctionsFromOperationDoc: NetlifyGraph.extractFunctionsFromOperationDoc, + generateFunctionsSource: NetlifyGraph.generateFunctionsSource, + generateFunctionsFile, + generateHandlerSource: NetlifyGraph.generateHandlerSource, + generateHandler, + getGraphEditUrlBySiteName, + getNetlifyGraphConfig, + parse, + readGraphQLOperationsSourceFile, + readGraphQLSchemaFile, + writeGraphQLOperationsSourceFile, + writeGraphQLSchemaFile, +} diff --git a/tests/assets/netlifyGraphOperationsLibrary.graphql b/tests/assets/netlifyGraphOperationsLibrary.graphql new file mode 100644 index 00000000000..d0546046c16 --- /dev/null +++ b/tests/assets/netlifyGraphOperationsLibrary.graphql @@ -0,0 +1,11 @@ +query ExampleQuery($package: String!) @netlify(id: "d86699fb-ddfc-4833-9d9a-f3497cb7c992", doc: "A test query to snapshot") { + npm { + package(name: $package) { + id + readme + license { + url + } + } + } +} \ No newline at end of file diff --git a/tests/assets/netlifyGraphSchema.graphql b/tests/assets/netlifyGraphSchema.graphql new file mode 100644 index 00000000000..7e4126c008e --- /dev/null +++ b/tests/assets/netlifyGraphSchema.graphql @@ -0,0 +1,5999 @@ +input OneGraphSubscriptionPollScheduleRepeatInput { + """How many minutes to wait before re-running the underlying query""" + minutes: Int! +} + +input OneGraphSubscriptionPollScheduleInput { + """""" + every: OneGraphSubscriptionPollScheduleRepeatInput! +} + +type OneGraphSubscriptionPollingQueryDiffPrevious { + payload: JSON + createdAt: String +} + +type OneGraphSubscriptionPollingQueryDiff { + previous: OneGraphSubscriptionPollingQueryDiffPrevious +} + +type PollingQuery { + query: Query! + diff: OneGraphSubscriptionPollingQueryDiff! +} + +""" +Whether to include information about the API requests that OneGraph made to fulfill the query in the `extensions` field. +""" +enum OneGraphSubscriptionShowMetricsEnum { + """Don't include any info""" + NONE + + """Include summary info.""" + SUMMARY + + """Include summary metrics and full requests.""" + FULL_REQUESTS +} + +"\nOptional authentication for making requests to the Gmail API if you want\nto use a custom gmail app instead of OneGraph's built-in app.\n\nSubscriptions are long-lived, so a refresh token must also be provided.\n\nIf you use this arg, make sure you've updated OneGraph to use your OAuth credentials in the dashboard.\n" +input OneGraphSubscriptionGmailAuthArg { + refreshToken: String! + accessToken: String! +} + +"""Optional auth arg if not using OneGraph's built-in authentication""" +input OneGraphSubscriptionAuthArg { + twilio: OneGraphTwilioAuth + + "\nOptional authentication for making requests to the Gmail API if you want\nto use a custom gmail app instead of OneGraph's built-in app.\n\nSubscriptions are long-lived, so a refresh token must also be provided.\n\nIf you use this arg, make sure you've updated OneGraph to use your OAuth credentials in the dashboard.\n" + gmail: OneGraphSubscriptionGmailAuthArg +} + +input NpmPackagePublishedArg { + """ + The names of packages to be notified about when published, e.g. ["graphql", "express", "fela"] + """ + names: [String!]! +} + +type NpmNewPackagePublishedSubscriptionPayload { + """Package being published""" + package: NpmPackage! +} + +"""Namespace for npm subscriptions.""" +type NpmSubscriptionRoot { + """Get notified when *any* package is published or updated on npm""" + allPublishActivity: NpmNewPackagePublishedSubscriptionPayload + + """Get notified when a package is published or updated on npm""" + packagePublished(input: NpmPackagePublishedArg!): NpmNewPackagePublishedSubscriptionPayload +} + +type Subscription { + npm( + """ + Whether to include information about the API requests that OneGraph made to fulfill the query in the `extensions` field. + """ + showMetrics: OneGraphSubscriptionShowMetricsEnum + secret: OneGraphSubscriptionSecretInput + auth: OneGraphSubscriptionAuthArg + + """ + Set to true when creating a subscription over a websocket that should only be retained and not sent over the websocket or a webhook. If set to true, `retainPayloads` must not be set to false. + """ + retainedOnly: Boolean + + """ + Set to true to have OneGraph store payloads for this subscription. They payloads are available on the OneGraph dashboard from the app's `Subscription` page. + """ + retainPayloads: Boolean + + """ + Webhook URL that will receive a POST request every time there is new data for the subscription. The endpoint should return a 200 within 30 seconds to be considered successful. If the request does not succeed, it will be retried. + """ + webhookUrl: String + ): NpmSubscriptionRoot! + poll( + """ + Whether to include information about the API requests that OneGraph made to fulfill the query in the `extensions` field. + """ + showMetrics: OneGraphSubscriptionShowMetricsEnum + + """ + When set, OneGraph will run the query on the specified schedule, but will only deliver new payloads when the underlying query result has changed from the previous result. Use this when you only want to react to changes. + + When unset, OneGraph will run the query on the specified schedule, and will deliver a new payload regardless of whether it has changed from the previous runs. Use this when you want to reliably drive a process at a regular interval or monitor a value over time. + """ + onlyTriggerWhenPayloadChanged: Boolean = true + schedule: OneGraphSubscriptionPollScheduleInput! + secret: OneGraphSubscriptionSecretInput + auth: OneGraphSubscriptionAuthArg + + """ + Set to true to have OneGraph store payloads for this subscription. They payloads are available on the OneGraph dashboard from the app's `Subscription` page. Use this field when creating a subscription over a websocket that should only be retained and not sent over the websocket or a webhook. + """ + retainedOnly: Boolean + retainPayloads: Boolean + + """ + Webhook URL that will receive a POST request every time there is new data for the subscription. The endpoint should return a 200 within 30 seconds to be considered successful. If the request does not succeed, it will be retried. + """ + webhookUrl: String + ): PollingQuery! +} + +input SignoutServicesData { + services: [OneGraphServiceEnum!]! +} + +input OneGraphSignoutServiceUserInput { + """ + Foreign user id for the user you want to sign out. You can find the foreignUser id through me.serviceMetadata.loggedInServices + """ + foreignUserId: String! + + """Service that you want to sign out of.""" + service: OneGraphServiceEnum! +} + +type SignoutServicesResponsePayload { + me: Viewer! +} + +input OneGraphCreateNetlifyTestEventDataInput { + payload: JSON! +} + +input OneGraphCreateNetlifyTestEvent { + data: OneGraphCreateNetlifyTestEventDataInput! + sessionId: String! +} + +type OneGraphCreateNetlifyTestResponsePayload { + event: OneGraphNetlifyCliSessionEvent! +} + +input OneGraphCreateNetlifyLogEventDataInput { + message: String! +} + +input OneGraphCreateNetlifyLogEvent { + data: OneGraphCreateNetlifyLogEventDataInput! + sessionId: String! +} + +type OneGraphCreateNetlifyLogResponsePayload { + event: OneGraphNetlifyCliSessionEvent! +} + +input OneGraphDeleteNetlifyCliSessionInput { + """The id of the session.""" + sessionId: String! +} + +type OneGraphDeleteNetlifyCliSessionResponsePayload { + """The session that was deleted.""" + session: OneGraphNetlifyCliSession! +} + +input OneGraphUpdateNetlifyCliSessionInput { + """Optional metadata for the session""" + metadata: JSON + + """An optional name for the session""" + name: String + + """The id of the session""" + id: String! +} + +type OneGraphUpdateNetlifyCliSessionResponsePayload { + """The session that was updated.""" + session: OneGraphNetlifyCliSession! +} + +input OneGraphCreateNetlifyCliSessionInput { + """Optional metadata for the session""" + metadata: JSON + + """An optional name for the session""" + name: String + appId: String! +} + +type OneGraphCreateNetlifyCliSessionResponsePayload { + """The session that was created.""" + session: OneGraphNetlifyCliSession! +} + +input OneGraphAckNetlifyCliEventsInput { + eventIds: [String!]! + sessionId: String! +} + +type OneGraphAckNetlifyCliEventsResponsePayload { + """The list of events that were acknowledged""" + events: [OneGraphNetlifyCliSessionEvent!]! +} + +input OneGraphModifySchemaTokenInput { + """Id for the app that you want to modify the schema for.""" + appId: String! +} + +type OneGraphCreateModifySchemaTokenResponsePayload { + """The access token that can be used to modify the app's schema.""" + accessToken: OneGraphAccessToken! +} + +input OneGraphGraphQLSchemaExternalGraphQLSchemaInput { + """The id of the external GraphQL schema.""" + externalGraphQLSchemaId: String! +} + +input OneGraphCreateGraphQLSchemaInput { + """ + Whether to set this schema as the default for the app. Defaults to false. + """ + setAsDefaultForApp: Boolean = false + + """External GraphQL schemas to add""" + externalGraphQLSchemas: [OneGraphGraphQLSchemaExternalGraphQLSchemaInput!] + + """Optional id of a Salesforce schema to attach to the app.""" + salesforceSchemaId: String + + """The optional id of the GraphQL schema that this was derived from.""" + parentId: String + + """ + The list of services that this schema should use. Leave blank if you want to add support for all supported services. + """ + enabledServices: [OneGraphServiceEnumArg!] + + """The id of the app that the schema should belong to.""" + appId: String! +} + +type OneGraphCreateGraphQLSchemaResponsePayload { + graphqlSchema: OneGraphGraphQLSchema! + app: OneGraphApp! +} + +input OneGraphCreatePersonalTokenWithNetlifySiteAnchorInput { + name: String! + netlifySiteId: String! +} + +type OneGraphCreatePersonalTokenWithNetlifySiteAnchorResponsePayload { + """Personal access token that was created by this mutation""" + accessToken: OneGraphAccessToken! +} + +input OneGraphUpsertAppForNetlifySiteInput { + netlifySiteId: String! +} + +type OneGraphUpsertAppForNetlifySiteResponsePayload { + """The app that is associated with the Netlify site.""" + app: OneGraphApp! + + """The app that is associated with the Netlify account.""" + org: OneGraphOrg! +} + +input OneGraphCreateEmptyAccessTokenInput { + """ + Number of seconds until the token should expire. Providing a value that is over two weeks of seconds will cause the request to be rejected + """ + expiresIn: Int = 1209600 +} + +type OneGraphCreateEmptyAccessTokenPayload { + """Access token that was created by this mutation""" + accessToken: OneGraphAccessToken! +} + +input OneGraphRemoveExternalHoneycombConfigInput { + """Id of the app that the external Honeycomb config belongs to.""" + appId: String! +} + +type OneGraphRemoveExternalHoneycombConfigPayload { + """App that the external schema was removed from.""" + app: OneGraphApp +} + +input OneGraphUpdateExternalHoneycombConfigInput { + """ + If `true`, OneGraph will send events to Honeycomb. Set to `false` to stop sending metrics. + """ + active: Boolean + + """Metrics to subscribe to, with preferred dataset name.""" + datasets: [OneGraphAddExternalHoneycombConfigDatasetInput!] + + """Honeycomb token with the ability to create datasets and send events.""" + token: String + + """App to add the honeycomb config to.""" + appId: String! +} + +type OneGraphUpdateExternalHoneycombConfigPayload { + """App that the Honeycomb config belongs to.""" + app: OneGraphApp + + """The Honeycomb config that was updated.""" + externalHoneycombConfig: OneGraphExternalHoneycombConfig! +} + +input OneGraphAddExternalHoneycombConfigDatasetInput { + """ + The name of the dataset that the events will be pushed to in Honeycomb. + """ + datasetName: String! + metricType: OneGraphExternalHoneycombConfigDatasetMetricTypeEnum! +} + +input OneGraphAddExternalHoneycombConfigInput { + """Metrics to subscribe to, with preferred dataset name.""" + datasets: [OneGraphAddExternalHoneycombConfigDatasetInput!]! + + """Honeycomb token with the ability to create datasets and send events.""" + token: String! + + """App to add the honeycomb config to.""" + appId: String! +} + +type OneGraphAddExternalHoneycombConfigPayload { + """App that the Honeycomb config was added to.""" + app: OneGraphApp + + """The Honeycomb config that was added.""" + externalHoneycombConfig: OneGraphExternalHoneycombConfig! +} + +input OneGraphRemoveSlackEventWebhookInput { + """Unique onegraph id of the slack event webhook.""" + id: String! +} + +type OneGraphRemoveSlackEventWebhookPayload { + """App that the slack event webhook belongs to.""" + app: OneGraphApp + + """The slack event webhook that was removed.""" + slackEventWebhook: OneGraphSlackEventWebhook! + + """Custom OAuth client that the slack event webhook belonged to.""" + serviceAuth: OneGraphServiceAuth! +} + +input OneGraphSetSlackEventWebhookSigningSecretInput { + """Slack app-level token with the authorizations:read scope.""" + signingSecret: String! + + """Unique onegraph id of the slack event webhook.""" + id: String! +} + +type OneGraphSetSlackEventWebhookSigningSecretPayload { + """App that the slack event webhook belongs to.""" + app: OneGraphApp + + """The slack event webhook that was mofified.""" + slackEventWebhook: OneGraphSlackEventWebhook! + + """Custom OAuth client that the slack event webhook belongs to.""" + serviceAuth: OneGraphServiceAuth! +} + +input OneGraphSetSlackEventWebhookAppTokenInput { + """Slack app-level token with the authorizations:read scope.""" + appToken: String! + + """Unique onegraph id of the slack event webhook.""" + id: String! +} + +type OneGraphSetSlackEventWebhookAppTokenPayload { + """App that the slack event webhook belongs to.""" + app: OneGraphApp + + """The slack event webhook that was mofified.""" + slackEventWebhook: OneGraphSlackEventWebhook! + + """Custom OAuth client that the slack event webhook belongs to.""" + serviceAuth: OneGraphServiceAuth! +} + +input OneGraphAddSlackEventWebhookInput { + """Slack app-level token with the authorizations:read scope.""" + appToken: String! + + """Slack event subscription webhook signing secret.""" + signingSecret: String! + + """Unique id for the app's Slack custom OAuth credentials.""" + serviceAuthId: String! + + """App to add the slack event webhook to.""" + appId: String! +} + +type OneGraphAddSlackEventWebhookPayload { + """App that the slack event webhook was added to.""" + app: OneGraphApp + + """The slack event webhook that was added.""" + slackEventWebhook: OneGraphSlackEventWebhook! + + """Custom OAuth client that the slack event webhook was added to.""" + serviceAuth: OneGraphServiceAuth! +} + +input OneGraphRemoveGoogleSiteVerificationInput { + """Id of the app to remove the Google Site Verification from.""" + appId: String! +} + +type OneGraphRemoveGoogleSiteVerificationPayload { + """App that the google site verification is being removed from.""" + app: OneGraphApp +} + +input OneGraphAddGoogleSiteVerificationInput { + """The body that Google will expect at the endpoint""" + body: String! + + """The path that Google will crawl to check the site verification""" + path: String! + + """App to add the external schema to.""" + appId: String! +} + +type OneGraphAddGoogleSiteVerificationPayload { + """App that the external schema was added to.""" + app: OneGraphApp + + """The google site verification that was added.""" + googleSiteVerification: OneGraphGoogleSiteVerification! +} + +type OneGraphAddPreviewSalesforceSchemaForSalesforceViewerPayload { + """The preview salesforce schema that was created.""" + salesforceSchema: OneGraphSalesforceSchema! +} + +input OneGraphRemoveSalesforceSchemaInput { + """Id of the Salesforce schema to update.""" + id: String! +} + +type OneGraphRemoveSalesforceSchemaPayload { + """App that the Salesforce schema was removed from.""" + app: OneGraphApp + + """The Salesforce schema that was removed.""" + salesforceSchema: OneGraphSalesforceSchema! +} + +input OneGraphUpdateSalesforceSchemaInput { + """Id of the Salesforce schema to update.""" + id: String! +} + +type OneGraphUpdateSalesforceSchemaPayload { + """App that the Salesforce schema was added to.""" + app: OneGraphApp + + """The Salesforce schema that was added.""" + salesforceSchema: OneGraphSalesforceSchema! +} + +input OneGraphAddSalesforceSchemaInput { + """App to add the salesforce schema to.""" + appId: String! +} + +type OneGraphAddSalesforceSchemaPayload { + """App that the salesforce schema was added to.""" + app: OneGraphApp + + """The salesforce schema that was added.""" + salesforceSchema: OneGraphSalesforceSchema! +} + +input OneGraphPromotePreviewSalesforceSchemaInput { + """The id of the salesforce schema to promote.""" + salesforceSchemaId: String! + + """App to add the preview salesforce schema to.""" + appId: String! +} + +type OneGraphPromotePreviewSalesforceSchemaPayload { + """App that the salesforce schema was added to.""" + app: OneGraphApp + + """The salesforce schema that was promoted.""" + salesforceSchema: OneGraphSalesforceSchema! +} + +input OneGraphAddPreviewSalesforceSchemaInput { + """App to add the preview salesforce schema to.""" + appId: String! +} + +type OneGraphAddPreviewSalesforceSchemaPayload { + """App that the salesforce schema was added to.""" + app: OneGraphApp + + """The preview salesforce schema that was added.""" + salesforceSchema: OneGraphSalesforceSchema! + + """The GraphQL schema for the app after the preview schema is applied.""" + previewSchema: JSON! + + """The current GraphQL schema for the app.""" + currentSchema: JSON! +} + +input OneGraphRemoveExternalGraphQLSchemaInput { + """Id of the external schema to update.""" + id: String! +} + +type OneGraphRemoveExternalGraphQLSchemaPayload { + """App that the external schema was removed from.""" + app: OneGraphApp + + """The external schema that was removed.""" + externalGraphQLSchema: OneGraphExternalGraphQLSchema! +} + +input OneGraphUpdateExternalGraphQLSchemaInput { + """Endpoint to make GraphQL queries against.""" + endpoint: String! + + """Id of the external schema to update.""" + id: String! +} + +type OneGraphUpdateExternalGraphQLSchemaPayload { + """App that the external schema was added to.""" + app: OneGraphApp + + """The external schema that was added.""" + externalGraphQLSchema: OneGraphExternalGraphQLSchema! +} + +input OneGraphAddExternalGraphQLSchemaInput { + """Endpoint to make GraphQL queries against.""" + service: OneGraphSupportedExternalGraphQLService! + + """Endpoint to make GraphQL queries against.""" + endpoint: String! + + """App to add the external schema to.""" + appId: String! +} + +type OneGraphAddExternalGraphQLSchemaPayload { + """App that the external schema was added to.""" + app: OneGraphApp + + """The external schema that was added.""" + externalGraphQLSchema: OneGraphExternalGraphQLSchema! +} + +input OneGraphEnableGitHubAppWebhookInput { + serviceAuthId: String! +} + +type OneGraphEnableGitHubAppWebhookResponsePayload { + """Custom OAuth Client that was updated""" + serviceAuth: OneGraphServiceAuth! + + """GitHub app webhook that was created""" + gitHubAppWebhook: OneGraphGitHubAppWebhook! +} + +type OneGraphSignoutResponsePayload { + me: Viewer! +} + +"""A OneGraph SignIn result""" +type OneGraphSignInResult { + """ + The accessToken that can be used to make requests on behalf of the OneGraph user + """ + accessToken: OneGraphAccessToken +} + +input OneGraphDisableAuthGuardianSlackIntegrationInput { + appId: String! +} + +type OneGraphDisableAuthGuardianSlackIntegrationResponsePayload { + app: OneGraphApp +} + +input OneGraphEnableAuthGuardianSlackIntegrationInput { + authToken: String! + channel: String! + appId: String! +} + +type OneGraphEnableAuthGuardianSlackIntegrationResponsePayload { + app: OneGraphApp +} + +input OneGraphDisableGithubRepositorySubscriptionDelegationByIdInput { + """The id of the delegation.""" + id: String! +} + +type OneGraphDisableGithubRepositorySubscriptionDelegationByIdResult { + """The App that delegation was disabled for.""" + app: OneGraphApp! +} + +input OneGraphDisableGithubRepositorySubscriptionDelegationInput { + """ + The name of the repo, e.g. `graphiql-explorer` in `onegraph/graphiql-explorer`. + """ + repoName: String! + + """ + The owner of the repo, e.g. `onegraph` in `onegraph/graphiql-explorer`. + """ + repoOwner: String! +} + +type OneGraphDisableGithubRepositorySubscriptionDelegationResult { + """The GitHub repository name of app that delegation was enabled for.""" + repoName: String! + + """The GitHub repository owner of app that delegation was enabled for.""" + repoOwner: String! +} + +input OneGraphEnableGithubRepositorySubscriptionDelegationInput { + """ + The name of the repo, e.g. `graphiql-explorer` in `onegraph/graphiql-explorer`. + """ + repoName: String! + + """ + The owner of the repo, e.g. `onegraph` in `onegraph/graphiql-explorer`. + """ + repoOwner: String! +} + +type OneGraphEnableGithubRepositorySubscriptionDelegationResult { + """The GitHub repository name of app that delegation was disabled for.""" + repoName: String! + + """The GitHub repository owner of app that delegation was disabled for.""" + repoOwner: String! +} + +input OneGraphEvictCachedPersistedQueryResultsInput { + """The operationName of the cached result.""" + operationName: String + + """ + Variables values that must match. Note that this specifies the *minimum* of the match: even if there are *additional* variables in the cached query that weren't provided here, if the cached query successfully matches *at least* the variables provided here, the result will be removed from the cache. + """ + variables: JSON + + """The id of the persisted query.""" + docId: String! + + """Id for the app that the query was persisted on.""" + appId: String! +} + +type OneGraphEvictCachedResultsResponsePayload { + docId: String! +} + +input OneGraphDeletePersistedQueryInput { + id: String! + appId: String! +} + +type OneGraphDeletePersistedQueryResponsePayload { + app: OneGraphApp! +} + +input OneGraphPersistedQueryTokenInput { + """Id for the app that you want to persist queries on.""" + appId: String! +} + +type OneGraphCreatePersitQueryTokenResponsePayload { + """The access token that can be used to persist queries""" + accessToken: OneGraphAccessToken! +} + +input OneGraphUpdatePersistedQueryInput { + """Replace the current tags on the query with the provided tags.""" + replaceTags: [String!] + + """Tags to remove from the query""" + removeTags: [String!] + + """Tags to add to the query.""" + addTags: [String!] + + """A new description for the query.""" + description: String + accessToken: String + + """The id of the app that the persisted query belongs to.""" + appId: String! + + """The id of the persisted query.""" + id: String! +} + +type OneGraphUpdatedPersistedQueryResponsePayload { + persistedQuery: OneGraphPersistedQuery! +} + +input OneGraphCreatePersistedQueryParentInput { + """ + An optional list of tags to remove from the parent query. If any of the provided tags aren't present on the parent, the mutation will fail. No persisted queries will be created and no tags will be removed from the parent. + """ + removeTags: [String!] + + """The id of the parent""" + id: String! +} + +input OneGraphPersistedQueryCacheStrategyArg { + """Number of seconds to cache the query result for.""" + timeToLiveSeconds: Float! +} + +input OneGraphCreatePersistedQueryInput { + """ + The parent persisted query. It can be used to track lineage of the query. + """ + parent: OneGraphCreatePersistedQueryParentInput + + """ + A description for the persisted query. Maximum length is 2096 characters. + """ + description: String + + """ + List of tags to add to the persisted query. Tags are free-form text that can be used to categorize persisted queries. Each tag must be under 256 characters and there can be a maximum of 10 tags on a single persisted query. + """ + tags: [String!] + accessToken: String + + """ + If set to true, and there was a successful execution of the query in the last 30 days, then the last successful result will be returned if we encounter any error when executing the query. If we do not have a previous successful result, then the response with the error will be returned. + + Note that the fallback result will be returned even in the case of partial success. + + This parameter is useful when you expect that your queries might be rate-limited by the underlying service. + + The query must provide a cache strategy in order to use `fallbackOnError`. + """ + fallbackOnError: Boolean + cacheStrategy: OneGraphPersistedQueryCacheStrategyArg + + """ + Operation names to allow. If not provided, then all operations in the document are allowed. + """ + allowedOperationNames: [String!] + fixedVariables: JSON + freeVariables: [String!] + query: String! + appId: String! +} + +type OneGraphPersistedQueryResponsePayload { + persistedQuery: OneGraphPersistedQuery! +} + +enum OneGraphDataVitualizationSupportedServiceArg { + GMAIL +} + +input OneGraphStartDataVirtualizationInput { + """ + Account ID to enable the service for. Must match the currently logged in account id + """ + accountId: String! + + """Service to enable data virtualization for""" + service: OneGraphDataVitualizationSupportedServiceArg! +} + +""" +Information about data virtualization that has been enabled for a service +""" +type OneGraphDataVirtualizationDetails { + accountId: String! + graphQLEndpoint: String! + service: String! +} + +type OneGraphStartDataVirtualizationPayload { + """Organization that was updated by this mutation""" + dataVirutalizationDetails: OneGraphDataVirtualizationDetails! +} + +input OneGraphUpdateAppByIdPatch { + """New name for the app""" + name: String! +} + +input OneGraphUpdateAppByIdInput { + """New fields for the app""" + patch: OneGraphUpdateAppByIdPatch! + + """Id of the app""" + id: String! +} + +type OneGraphUpdateAppByIdResponsePayload { + """App that was updated by this mutation""" + app: OneGraphApp! +} + +input OneGraphUpdateOrgByIdPatch { + """New name for the organization""" + name: String! +} + +input OneGraphUpdateOrgByIdInput { + """New fields for the organization""" + patch: OneGraphUpdateOrgByIdPatch! + + """Id of the organization""" + id: String! +} + +type OneGraphUpdateOrgByIdResponsePayload { + """Organization that was updated by this mutation""" + org: OneGraphOrg! +} + +input OneGraphCreateOrgInput { + """Name for the organization""" + name: String! +} + +type OneGraphCreateOrgResponsePayload { + """Organization that was created by this mutation""" + org: OneGraphOrg! +} + +input OneGraphCreateShortenedUrlInput { + operation: String + description: String + name: String + variables: String + query: String! +} + +type OneGraphShortenUrlResponsePayload { + shortenedUrl: OneGraphShortenedQuery! +} + +input OneGraphPersistAuthsInput { + """ + Optional OneGraph accessToken to add the auths to. If not provided, OneGraph will look for a Bearer token in the Authorization header. + """ + accessToken: String + auths: OneGraphServiceAuths! +} + +type OneGraphPersistAuthsResponsePayload { + me: Viewer! +} + +input OneGraphAddAuthsToPersonalTokenInput { + """ + Auths to establish the anchor. Note that these auths won't be added to the personal token. + """ + anchorAuth: OneGraphServiceAuths + appId: String! + + """ + Token that will be destroyed and have its auths moved to the personal token. + """ + sacrificialToken: String! + personalToken: String! +} + +type OneGraphAddAuthsToPersonalTokenResponsePayload { + """Personal access token that was updated by this mutation""" + accessToken: OneGraphAccessToken! + + """OneGraph user""" + oneUser: OneGraphUser +} + +input OneGraphDeletePersonalTokenInput { + appId: String! + accessToken: String! +} + +type OneGraphDeletePersonalTokenResponsePayload { + """OneGraph user""" + oneUser: OneGraphUser! +} + +input OneGraphCreatePersonalTokenInput { + anchor: OneGraphAccessTokenAnchorEnum = ONEGRAPH_USER + appId: String! + accessToken: String! + name: String! +} + +type OneGraphCreatePersonalTokenResponsePayload { + """Personal access token that was created by this mutation""" + accessToken: OneGraphAccessToken! + + """OneGraph user""" + oneUser: OneGraphUser +} + +"""Fields to change on a subscription.""" +input OneGraphGraphQLSubscriptionUpdateInputPatch { + """The new variables to replace the existing query variables.""" + variables: JSON + + """The new query to replace the existing subscription query.""" + query: String! +} + +input OneGraphSubscriptionSecretInput { + """ + A hex-encoded key that will be used to sign all webhooks sent from this subscription. + + You can use the signature to validate that the subscription was sent from OneGraph. + + The signature will be sent in the `X-OneGraph-Signature` header of the webhook. The header will contain two parts, a signature and a timestamp (in seconds since the epoch), in the following format: + + ``` + X-OneGraph-Signature: t=1582852002,hmac_sha256=7d797ecd431e1a98aaba2f387f2c43241a13c1f093fd9d7e661758963744549a + ``` + + To verify the signature: + 1. Extract the timestamp (1582852002 above) + 2. Extract the signature (7d797ecd431e1a98aaba2f387f2c43241a13c1f093fd9d7e661758963744549a above) + 3. Concatenate the timestamp and the request body, separeted by a period (e.g. `t + '.' + requestBody`) + 4. Compute the hmac_sha256 hash of (3) + 5. Compare the hash with the provided signature using a constant-time comparison function (e.g. crypto.timingSafeEqual in Node) + 6. Reject the request if the hash you computed does not match the provided signature or if the timestamp is too far in the past (typically, 5 minutes) + + Example for validating the body in Node.js: + + ```js + const SECRET = 'your hmacSha256Key'; + const signature = res.get('X-OneGraph-Signature'); + if (!signature) { + throw new Error('Missing signature'); + } + + const sig = {}; + for (const pair of signature.split(',')) { + const [k, v] = pair.split('='); + sig[k] = v; + } + + if (!sig.t || !sig.hmac_sha256) { + throw new Error('Invalid signature header'); + } + + const hash = crypto + .createHmac('sha256', SECRET) + .update(sig.t) + .update('.') + .update(res.body) + .digest('hex'); + + if ( + !crypto.timingSafeEqual( + Buffer.from(hash, 'hex'), + Buffer.from(sig.hmac_sha256, 'hex'), + ) + ) { + throw new Error('Invalid signature'); + } + + if (parseInt(sig.t, 10) < Date.now() / 1000 - 300 /* 5 minutes */) { + throw new Error('Request is too old'); + } + + // Signature is valid + ``` + + Examples for creating the key: + + Cli: + ```cli + $ openssl rand -hex 32 + ``` + + Node: + ```js + require('crypto').randomBytes(32).toString('hex'); + ``` + + Ruby: + ```ruby + ruby -rsecurerandom -e 'puts SecureRandom.hex(32)' + ``` + """ + hmacSha256Key: String +} + +input OneGraphGraphQLSubscriptionUpdateInput { + """The fields of the subscription to update.""" + patch: OneGraphGraphQLSubscriptionUpdateInputPatch! + + """ + The signing secret that the subscription was created with. Note that this will not update the existing secret. + """ + secret: OneGraphSubscriptionSecretInput + subscriptionId: String! +} + +type OneGraphGraphQLSubscriptionUpdateResponsePayload { + """GraphQL Subscription that was modified by this mutation""" + subscription: OneGraphAppSubscription! +} + +input OneGraphGraphQLSubscriptionUnsubscribeInput { + subscriptionId: String! +} + +type OneGraphGraphQLSubscriptionUnsubscribeResponsePayload { + """GraphQL Subscription that was modified by this mutation""" + subscription: OneGraphAppSubscription! +} + +input OneGraphDestroyServiceAuthInput { + serviceAuthId: String! + appId: String! +} + +type OneGraphDestroyServiceAuthResponsePayload { + """Service auth that was destroyed by this mutation""" + serviceAuth: OneGraphServiceAuth! + app: OneGraphApp! +} + +""" +Services OneGraph supports providing a custom clientId/clientSecret for. +""" +enum OneGraphCustomServiceAuthServiceEnum { + ADROLL + ASANA + BOX + CONTENTFUL + DEV_TO + DOCUSIGN + DRIBBBLE + DROPBOX + EGGHEADIO + EVENTIL + FACEBOOK + FIREBASE + GITHUB + GMAIL + GOOGLE + GOOGLE_ADS + GOOGLE_ANALYTICS + GOOGLE_CALENDAR + GOOGLE_COMPUTE + GOOGLE_DOCS + GOOGLE_SEARCH_CONSOLE + GOOGLE_TRANSLATE + HUBSPOT + INTERCOM + MAILCHIMP + MEETUP + NETLIFY + NOTION + PRODUCT_HUNT + QUICKBOOKS + SALESFORCE + SLACK + SPOTIFY + STRIPE + TRELLO + TWILIO + TWITTER + TWITCH_TV + YNAB + YOUTUBE + ZEIT + ZENDESK +} + +input OneGraphCreateServiceAuthInput { + """Custom cname for the custom OAuth client.""" + cname: String + + """Custom redirect URI.""" + customRedirectUri: String + + """ + Whether the user who created the token should be able to fetch it from OneGraph. Defaults to false. + """ + revealTokens: Boolean = false + + """Optional list of scopes to use for your app.""" + scopes: [String!] + + """App name for trello. Required to use custom Trello credentials.""" + trelloAppName: String + + """ + Developer token for the Google Ads api. This param is required for using custom OAuth credentials for Google Ads. + + A developer token from Google allows your app to connect to the Google Ads API. To retrieve your developer token, sign in to your Manager Account. You must be signed-in to a Google Ads Manager Account before continuing. + + Navigate to TOOLS & SETTINGS > SETUP > API Center. The API Center option will appear only for Google Ads Manager Accounts. + + If your developer token is pending approval, you can start developing immediately with the pending token you received during sign up, using a test manager account. + + Your pending developer token must be approved before using it with production Google Ads accounts. + """ + googleDeveloperToken: String + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + clientSecret: String! + clientId: String! + service: OneGraphCustomServiceAuthServiceEnum! + appId: String! +} + +type OneGraphCreateServiceAuthResponsePayload { + """Service auth that was created by this mutation""" + serviceAuth: OneGraphServiceAuth! + app: OneGraphApp! +} + +input OneGraphRemoveNetlifySiteFromAppCORSOriginsInput { + netlifySite: String! + appId: String! +} + +type OneGraphRemoveNetlifySiteFromAppCORSOriginsResponsePayload { + app: OneGraphApp! +} + +input OneGraphAddNetlifySiteToAppCORSOriginsInput { + netlifySite: String! + appId: String! +} + +type OneGraphAddNetlifySiteToAppCORSOriginsResponsePayload { + app: OneGraphApp! +} + +input OneGraphRemoveCustomCorsOriginFromAppInput { + customCorsOrigin: String! + appId: String! +} + +type OneGraphRemoveCustomCorsOriginFromAppResponsePayload { + app: OneGraphApp! +} + +input OneGraphRemoveCORSOriginFromAppInput { + corsOrigin: String! + appId: String! +} + +type OneGraphRemoveCORSOriginFromAppResponsePayload { + app: OneGraphApp! +} + +input OneGraphAddCORSOriginToAppInput { + corsOrigin: String! + appId: String! +} + +type OneGraphAddCORSOriginToAppResponsePayload { + app: OneGraphApp! +} + +input SetAppCORSOriginsData { + corsOrigins: [String!]! + appId: String! +} + +type SetAppCORSOriginsResponsePayload { + app: OneGraphApp! +} + +enum OneGraphQueryChainIfMissingEnum { + ERROR + ALLOW + SKIP +} + +enum OneGraphQueryChainIfListEnum { + FIRST + LAST + ALL + EACH +} + +input OneGraphQueryChainArgumentDependencyInput { + functionFromScript: String! + maxRecur: Int = 1 + ifMissing: OneGraphQueryChainIfMissingEnum + ifList: OneGraphQueryChainIfListEnum + fromRequestIds: [String!]! + name: String! +} + +input OneGraphQueryChainVariableInput { + value: JSON + name: String! +} + +input OneGraphQueryChainRequestInput { + argumentDependencies: [OneGraphQueryChainArgumentDependencyInput!] = [] + variables: [OneGraphQueryChainVariableInput!] = [] + + """The query to run. Must provide one of `query` or `operationName`.""" + query: String + + """ + The operationName of the query in the document to run. Must provide one of `query` or `operationName`. + """ + operationName: String + + """ + The id of the query. If you provide a script in the argument dependencies for a request that depends on this query, the data from this query will be provided as `{"$ID": query-result}`. This will typically be the same as the operation name, but could be different if your chain needs to use the same query in multiple requests. + """ + id: String! +} + +""" +Dependencies from npm. Only allows packages that don't have any dependencies of their own. Packages that rely on filesystem APIs may not work. Must provide the exact version string. +""" +input OneGraphQueryChainScriptDependencyInput { + """ + The package's version string, e.g. `4.17.21`. Only accepts exact version strings. + """ + version: String! + + """The name of the package, e.g. `lodash`.""" + name: String! +} + +input OneGraphQueryChainInput { + """ + If true, will copy errors from the `OneGraphQueryChainMutationResult.result` field to the top-level `errors` field. Defaults to true. + """ + liftErrors: Boolean = true + requests: [OneGraphQueryChainRequestInput!]! + scriptDependencies: [OneGraphQueryChainScriptDependencyInput!] + script: String +} + +type OneGraphQueryChainMutationArgumentDependencyError { + """The name of the error""" + name: String + + """The error message""" + message: String + + """The error stack, as a string""" + stackString: String +} + +type OneGraphQueryChainMutationArgumentDependencyConsoleLog { + """The log level, `debug`, `info`, `warn`, or `error`""" + level: String! + + """The log body.""" + body: [JSON!]! +} + +type OneGraphQueryChainMutationArgumentDependencyResult { + """The name of the argument dependency""" + name: String! + + """The return values of the argument dependency script.""" + returnValues: [JSON!] + + """Logs captured by calling `console.log` in the script.""" + logs: [OneGraphQueryChainMutationArgumentDependencyConsoleLog!]! + + """Error, if there was an error evaluating the script.""" + error: OneGraphQueryChainMutationArgumentDependencyError +} + +type OneGraphQueryChainRequest { + """The id of the request""" + id: String! +} + +type OneGraphQueryChainMutationResult { + """The request.""" + request: OneGraphQueryChainRequest! + + """Debug information for the argument dependencies""" + argumentDependencies: [OneGraphQueryChainMutationArgumentDependencyResult!]! + + """The result of the query""" + result: [JSON]! +} + +type OneGraphQueryChainMutationPayload { + results: [OneGraphQueryChainMutationResult!]! +} + +"""Tours for exploring OneGraph""" +enum OneGraphTourEnum { + DASHBOARD + QUERYCHAIN + AUTHGUARDIAN +} + +input OneGraphCompleteTourData { + tour: OneGraphTourEnum! +} + +type OneGraphCompleteTourResponsePayload { + me: Viewer! +} + +input OneGraphUnLinkOneGraphNodesInput { + """The `oneGraphId` for the end node""" + endNodeOneGraphId: String! + + """The `oneGraphId` for the start node""" + startNodeOneGraphId: String! +} + +type OneGraphUnLinkOneGraphNodesResponsePayload { + startNode: OneGraphNode + endNode: OneGraphNode +} + +input OneGraphLinkOneGraphNodesInput { + """The `oneGraphId` for the end node""" + endNodeOneGraphId: String! + + """The `oneGraphId` for the start node""" + startNodeOneGraphId: String! +} + +type OneGraphLinkOneGraphNodesResponsePayload { + startNode: OneGraphNode + endNode: OneGraphNode +} + +"""GraphQL types that support linking""" +enum OneGraphServiceLinkGraphQLTypeEnum { + GitHubIssue + GitHubIssueComment + GitHubUser + HubspotContact + IntercomUser + SalesforceAccount + SalesforceCase + SalesforceCaseComment + SalesforceContact + SalesforceFeedComment + SalesforceFeedItem + SalesforceLead + SalesforceUser + StripeCustomer + StripeRefund + ZendeskUser +} + +input OneGraphServiceLinkNodeArg { + id: String! + type: OneGraphServiceLinkGraphQLTypeEnum! +} + +input OneGraphCreateServiceLinkArg { + endNode: OneGraphServiceLinkNodeArg! + startNode: OneGraphServiceLinkNodeArg! +} + +type OneGraphServiceLinkNode { + type: String! + id: String! +} + +type OneGraphCreateServiceLinkResponsePayload { + startNode: OneGraphServiceLinkNode! + endNode: OneGraphServiceLinkNode! +} + +input OneGraphDangerouslySignJwtPayloadInput { + expiresInSeconds: Int = 300 + includeBaseFields: Boolean = true + payload: JSON! +} + +type OneGraphDangerouslySignJwtPayloadResponsePayload { + encoded: String! +} + +input OneGraphSetAppNetlifySiteNamesInput { + netlifySiteNames: [String!]! +} + +type OneGraphSetAppNetlifySiteNamesResponsePayload { + app: OneGraphApp! +} + +input OneGraphSetAuthGuardianActiveInput { + active: Boolean! +} + +type OneGraphSetAuthGuardianActiveResponsePayload { + app: OneGraphApp +} + +"""Signing algorithm for JWTs generated by Onegraph""" +enum OneGraphJwtSigningAlgorithmEnumArg { + HMAC_256 + RSA_256 +} + +input OneGraphSetJwtSigningAlgorithmAndSecretInput { + """ + When using symmetric (HMAC) algorithms, this is the shared secret OneGraph will use to sign the generated JSON web tokens. + """ + sharedSecret: String + + """ + When generating a JWT for SSO, OneGraph can sign the JSON tokens with either a shared-secret (symmetric) key (HMAC) or a public/private (asymmetric) key pair (RSA) + """ + signingAlgorithm: OneGraphJwtSigningAlgorithmEnumArg! +} + +type OneGraphSetJwtSigningAlgorithmAndSecretPayload { + app: OneGraphApp! +} + +input OneGraphSetJwtPreflightQueryAndWebhookUrlInput { + """ + An optional GraphQL query to run after a user has signed into any service. The result will be included in the body for the preflight webhook. You may want to use this to retrieve a user's Google subId, or a list of GitHub organization names a user belongs. + """ + preflightQuery: String + + """ + When generating a JWT for SSO using OneGraph to authenticate + with third-parties, you can run an optional GraphQL query and + send the result to a webhook for preprocessing before OneGraph + signs the final token and passes it to the client + """ + webhookUrl: String +} + +type OneGraphSetAppJwtPreflightQueryResponsePayload { + app: OneGraphApp! +} + +"""Mutations related to apps""" +type OneGraphAppMutations { + setCORSOrigins(corsOrigins: [String!]!): OneGraphApp! + setJwtPreflightQueryAndWebhookUrl(input: OneGraphSetJwtPreflightQueryAndWebhookUrlInput!): OneGraphSetAppJwtPreflightQueryResponsePayload + setJwtSigningAlgorithmAndSecret(input: OneGraphSetJwtSigningAlgorithmAndSecretInput!): OneGraphSetJwtSigningAlgorithmAndSecretPayload + setAuthGuardianActive(input: OneGraphSetAuthGuardianActiveInput!): OneGraphSetAuthGuardianActiveResponsePayload + setAuthGuardian(input: OneGraphSetAuthGuardianInput!): OneGraphSetAuthGuardianResponsePayload + setNetlifySiteNames(input: OneGraphSetAppNetlifySiteNamesInput!): OneGraphSetAppNetlifySiteNamesResponsePayload! + + """ + Use this when you need to generate a JWT (JSON web token) with a valid signature based on the JWT algorithm settings for your app. For example, you might want to test out a token within the Hasura console, on your Netlify site, or against your own GraphQL server without going through a full auth flow manually. + + By default these tokens will only be valid for 5 minutes (300 seconds). + + Note that these tokens will be signed and valid, and will be accepted *anywhere* you have configured. **Treat them as secure tokens and guard them!** + """ + dangerouslySignJwtPayload(input: OneGraphDangerouslySignJwtPayloadInput!): OneGraphDangerouslySignJwtPayloadResponsePayload +} + +"""Mutations for the currently authed user""" +type OneGraphMutation { + app(id: String!): OneGraphAppMutations @deprecated(reason: "Use setAppCORSOrigins") + createServiceLink(data: OneGraphCreateServiceLinkArg!): OneGraphCreateServiceLinkResponsePayload! + linkOneGraphNodes(input: OneGraphLinkOneGraphNodesInput!): OneGraphLinkOneGraphNodesResponsePayload! + unLinkOneGraphNodes(input: OneGraphUnLinkOneGraphNodesInput!): OneGraphUnLinkOneGraphNodesResponsePayload! + completeTour(data: OneGraphCompleteTourData!): OneGraphCompleteTourResponsePayload! + createApp( + """`id` of the organization that this app should belong to""" + orgId: String! + corsOrigins: [String!]! + description: String + name: String! + ): OneGraphApp! + executeChain(input: OneGraphQueryChainInput!): OneGraphQueryChainMutationPayload! + setAppCORSOrigins(data: SetAppCORSOriginsData!): SetAppCORSOriginsResponsePayload! + addCORSOriginToApp(input: OneGraphAddCORSOriginToAppInput!): OneGraphAddCORSOriginToAppResponsePayload! + removeCORSOriginFromApp(input: OneGraphRemoveCORSOriginFromAppInput!): OneGraphRemoveCORSOriginFromAppResponsePayload! + removeCustomCorsOriginFromApp(input: OneGraphRemoveCustomCorsOriginFromAppInput!): OneGraphRemoveCustomCorsOriginFromAppResponsePayload! + addNetlifySiteToAppCORSOrigins(input: OneGraphAddNetlifySiteToAppCORSOriginsInput!): OneGraphAddNetlifySiteToAppCORSOriginsResponsePayload! + removeNetlifySiteFromAppCORSOrigins(input: OneGraphRemoveNetlifySiteFromAppCORSOriginsInput!): OneGraphRemoveNetlifySiteFromAppCORSOriginsResponsePayload! + createServiceAuth(data: OneGraphCreateServiceAuthInput!): OneGraphCreateServiceAuthResponsePayload! + destroyServiceAuth(data: OneGraphDestroyServiceAuthInput!): OneGraphDestroyServiceAuthResponsePayload! + subscriptionUnsubscribe(data: OneGraphGraphQLSubscriptionUnsubscribeInput!): OneGraphGraphQLSubscriptionUnsubscribeResponsePayload! + updateSubscription(input: OneGraphGraphQLSubscriptionUpdateInput!): OneGraphGraphQLSubscriptionUpdateResponsePayload! + createPersonalToken(input: OneGraphCreatePersonalTokenInput!): OneGraphCreatePersonalTokenResponsePayload! + deletePersonalToken(input: OneGraphDeletePersonalTokenInput!): OneGraphDeletePersonalTokenResponsePayload! + addAuthsToPersonalToken(input: OneGraphAddAuthsToPersonalTokenInput!): OneGraphAddAuthsToPersonalTokenResponsePayload! + persistAuths(input: OneGraphPersistAuthsInput!): OneGraphPersistAuthsResponsePayload! + createShortenedUrl(input: OneGraphCreateShortenedUrlInput!): OneGraphShortenUrlResponsePayload! + createOrg(input: OneGraphCreateOrgInput!): OneGraphCreateOrgResponsePayload! + updateOrgById(input: OneGraphUpdateOrgByIdInput!): OneGraphUpdateOrgByIdResponsePayload! + updateAppById(input: OneGraphUpdateAppByIdInput!): OneGraphUpdateAppByIdResponsePayload! + enableDataVirtualization(input: OneGraphStartDataVirtualizationInput!): OneGraphStartDataVirtualizationPayload! + createPersistedQuery(input: OneGraphCreatePersistedQueryInput!): OneGraphPersistedQueryResponsePayload! + updatePersistedQuery(input: OneGraphUpdatePersistedQueryInput!): OneGraphUpdatedPersistedQueryResponsePayload! + createPersitQueryToken(input: OneGraphPersistedQueryTokenInput!): OneGraphCreatePersitQueryTokenResponsePayload! + deletePersistedQuery(input: OneGraphDeletePersistedQueryInput!): OneGraphDeletePersistedQueryResponsePayload! + evictCachedPersistedQueryResults(input: OneGraphEvictCachedPersistedQueryResultsInput!): OneGraphEvictCachedResultsResponsePayload! + + """ + Allows non-admin users to subscribe to GitHub events on OneGraph for the given repo and app. + """ + enableGitHubRepositorySubscriptionDelegation(input: OneGraphEnableGithubRepositorySubscriptionDelegationInput!): OneGraphEnableGithubRepositorySubscriptionDelegationResult! + + """ + Remove ability for non-admin users to subscribe to GitHub events on OneGraph for the given repo and app. + """ + disableGitHubRepositorySubscriptionDelegation(input: OneGraphDisableGithubRepositorySubscriptionDelegationInput!): OneGraphDisableGithubRepositorySubscriptionDelegationResult! + + """ + Remove ability for non-admin users to subscribe to GitHub events on OneGraph. Allows the owner of the app on OneGraph to remove delegation for a repo. + """ + disableGitHubRepositorySubscriptionDelegationById(input: OneGraphDisableGithubRepositorySubscriptionDelegationByIdInput!): OneGraphDisableGithubRepositorySubscriptionDelegationByIdResult! + enableAuthGuardianSlackIntegration(input: OneGraphEnableAuthGuardianSlackIntegrationInput!): OneGraphEnableAuthGuardianSlackIntegrationResponsePayload + disableAuthGuardianSlackIntegration(input: OneGraphDisableAuthGuardianSlackIntegrationInput!): OneGraphDisableAuthGuardianSlackIntegrationResponsePayload + destroyApp(id: String!): OneGraphApp + saveQuery(public: Boolean, enabled: Boolean, tags: [String!]!, description: String, name: String!, body: String!): OneGraphQuery! + updateQuery(public: Boolean, enabled: Boolean, tags: [String!], name: String, id: String!): OneGraphQuery + destroyQuery(version: String!, name: String!): OneGraphQuery! + signUp(agreeToTOS: Boolean!, passwordConfirm: String!, password: String!, email: String!, fullName: String!): OneGraphSignInResult! + signIn(rememberMe: Boolean!, password: String!, email: String!): OneGraphSignInResult! + agreeToTos(userAgreesToTheOneGraphTermsOfService: Boolean!): OneGraphUser! + signOut: OneGraphSignoutResponsePayload! + + """ + Revokes a OneGraph access token, refresh token, or JWT. After a token is destroyed, it can no longer be used to authenticate with OneGraph. + + If you destroy a JWT, external services that rely on the claims embedded in the JWT may still accept the JWT and you will also have to revoke the JWT though the external service's revocation process. + """ + destroyToken( + """Any OneGraph access token, refresh token, or JWT""" + token: String! + ): Boolean! + exchangeGitHubContextForOneGraphAccessToken: OneGraphSignInResult! + exchangeNetlifyContextForOneGraphAccessToken: OneGraphSignInResult! + exchangeZeitContextForOneGraphAccessToken: OneGraphSignInResult! + associateOneGraphUserWithGitHubAccount: OneGraphUser! + associateOneGraphUserWithNetlifyAccount: OneGraphUser! + requestPasswordReset(email: String!): String! + resetPassword(passwordConfirm: String!, password: String!, token: String!): Boolean! + enableGitHubAppWebhook(input: OneGraphEnableGitHubAppWebhookInput!): OneGraphEnableGitHubAppWebhookResponsePayload! + addExternalGraphQLSchema(input: OneGraphAddExternalGraphQLSchemaInput!): OneGraphAddExternalGraphQLSchemaPayload! + updateExternalGraphQLSchema(input: OneGraphUpdateExternalGraphQLSchemaInput!): OneGraphUpdateExternalGraphQLSchemaPayload! + removeExternalGraphQLSchema(input: OneGraphRemoveExternalGraphQLSchemaInput!): OneGraphRemoveExternalGraphQLSchemaPayload! + addPreviewSalesforceSchema(input: OneGraphAddPreviewSalesforceSchemaInput!): OneGraphAddPreviewSalesforceSchemaPayload! + promotePreviewSalesforceSchema(input: OneGraphPromotePreviewSalesforceSchemaInput!): OneGraphPromotePreviewSalesforceSchemaPayload! + addSalesforceSchema(input: OneGraphAddSalesforceSchemaInput!): OneGraphAddSalesforceSchemaPayload! + updateSalesforceSchema(input: OneGraphUpdateSalesforceSchemaInput!): OneGraphUpdateSalesforceSchemaPayload! + removeSalesforceSchema(input: OneGraphRemoveSalesforceSchemaInput!): OneGraphRemoveSalesforceSchemaPayload! + addPreviewSalesforceSchemaForSalesforceViewer: OneGraphAddPreviewSalesforceSchemaForSalesforceViewerPayload! + addGoogleSiteVerification(input: OneGraphAddGoogleSiteVerificationInput!): OneGraphAddGoogleSiteVerificationPayload! + removeGoogleSiteVerification(input: OneGraphRemoveGoogleSiteVerificationInput!): OneGraphRemoveGoogleSiteVerificationPayload! + addSlackEventWebhook(input: OneGraphAddSlackEventWebhookInput!): OneGraphAddSlackEventWebhookPayload! + setSlackEventWebhookAppToken(input: OneGraphSetSlackEventWebhookAppTokenInput!): OneGraphSetSlackEventWebhookAppTokenPayload! + setSlackEventWebhookSigningSecret(input: OneGraphSetSlackEventWebhookSigningSecretInput!): OneGraphSetSlackEventWebhookSigningSecretPayload! + removeSlackEventWebhook(input: OneGraphRemoveSlackEventWebhookInput!): OneGraphRemoveSlackEventWebhookPayload! + addExternalHoneycombConfig(input: OneGraphAddExternalHoneycombConfigInput!): OneGraphAddExternalHoneycombConfigPayload! + updateExternalHoneycombConfig(input: OneGraphUpdateExternalHoneycombConfigInput!): OneGraphUpdateExternalHoneycombConfigPayload! + removeExternalHoneycombConfig(input: OneGraphRemoveExternalHoneycombConfigInput!): OneGraphRemoveExternalHoneycombConfigPayload! + createEmptyAccessToken(input: OneGraphCreateEmptyAccessTokenInput!): OneGraphCreateEmptyAccessTokenPayload! + upsertAppForNetlifySite(input: OneGraphUpsertAppForNetlifySiteInput!): OneGraphUpsertAppForNetlifySiteResponsePayload! + + """Creates an empty personal token with a Netlify site anchor""" + createPersonalTokenWithNetlifySiteAnchor(input: OneGraphCreatePersonalTokenWithNetlifySiteAnchorInput!): OneGraphCreatePersonalTokenWithNetlifySiteAnchorResponsePayload! + createGraphQLSchema(input: OneGraphCreateGraphQLSchemaInput!): OneGraphCreateGraphQLSchemaResponsePayload! + createModifySchemaToken(input: OneGraphModifySchemaTokenInput!): OneGraphCreateModifySchemaTokenResponsePayload! + + """ + Acknowledge a set of netlify CLI events for a session. All events must be for the same session. + """ + ackNetlifyCliEvents(input: OneGraphAckNetlifyCliEventsInput!): OneGraphAckNetlifyCliEventsResponsePayload! + + """Create a new CLI session.""" + createNetlifyCliSession(input: OneGraphCreateNetlifyCliSessionInput!): OneGraphCreateNetlifyCliSessionResponsePayload! + + """Update a CLI session.""" + updateNetlifyCliSession(input: OneGraphUpdateNetlifyCliSessionInput!): OneGraphUpdateNetlifyCliSessionResponsePayload! + + """Delete a CLI session.""" + deleteNetlifyCliSession(input: OneGraphDeleteNetlifyCliSessionInput!): OneGraphDeleteNetlifyCliSessionResponsePayload! + createNetlifyCliLogEvent(input: OneGraphCreateNetlifyLogEvent!): OneGraphCreateNetlifyLogResponsePayload! + createNetlifyCliTestEvent(input: OneGraphCreateNetlifyTestEvent!): OneGraphCreateNetlifyTestResponsePayload! +} + +enum NpmPublishPackagAccessEnumArg { + """ + The package will only be visible to users with appropriate permissions (as decided by the registry). + """ + PRIVATE + + """The package will be publicly visible and installable by anyone.""" + PUBLIC +} + +enum NpmPublishPackageRegistryEnumArg { + """Publish to the npm registry""" + NPM + + """ + Publish to your GitHub package registry. Set your scope to the GitHub repository owner, and the name to repository name. For more info, see [GitHub's Package Repository](https://github.com/features/packages). + """ + GITHUB +} + +input OneGraphNpmPublishPackageFileArg { + contents: String! + path: String! +} + +input NpmPublishPackageInputArg { + """Whether the package is public or private.""" + access: NpmPublishPackagAccessEnumArg! + + """ + Which registry to publish to: npm, or a GitHub repository package repository. + """ + registry: NpmPublishPackageRegistryEnumArg + + """The list of files to include in the package""" + files: [OneGraphNpmPublishPackageFileArg!]! + + """ + package.json of your package. Must include `name` and `version` as strings fields at a minimum. + """ + packageJson: JSON! +} + +"""Results from running the publishPackage mutation""" +type NpmPublishPackageResult { + """ + Whether the package was successfully uploaded to npm. Note that due to the delay between uploading and indexing, you maybe have to wait until npm reflects the new version.OneGraphNpmPackage + + You can also use the `packagePublished` npm subscription to be notified when the new version of your package has been published. + """ + successfullyUploaded: Boolean +} + +"""The root for Npm mutations.""" +type NpmMutation { + """Publish a package to npm or GitHub package registry""" + publishPackage( + """Input for package publishing""" + input: NpmPublishPackageInputArg! + ): NpmPublishPackageResult +} + +type Mutation { + """The root for npm mutations""" + npm( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): NpmMutation! + oneGraph( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): OneGraphMutation! + testMutate(query: String!): Boolean! + signoutServiceUser(input: OneGraphSignoutServiceUserInput!): SignoutServicesResponsePayload! + signoutServices(data: SignoutServicesData!): SignoutServicesResponsePayload! +} + +type OneGraphNetlifyCliSession { + id: String! + appId: String! + netlifyUserId: String! + name: String + events( + """The number of events to fetch, maximum of 1000.""" + first: Int = 1000 + ): [OneGraphNetlifyCliSessionEvent!]! + createdAt: String! + lastEventAt: String + metadata: JSON +} + +type OneGraphNetlifyCliSessionLogEvent implements OneGraphNetlifyCliSessionEvent { + id: String! + sessionId: String! + createdAt: String! + message: String! +} + +type OneGraphNetlifyCliSessionTestEvent implements OneGraphNetlifyCliSessionEvent { + id: String! + sessionId: String! + createdAt: String! + payload: JSON! +} + +interface OneGraphNetlifyCliSessionEvent { + id: String! + sessionId: String! + createdAt: String! +} + +input OneGraphSetAuthGuardianRuleEffectHasuraSetSessionVariableInput { + value: OneGraphSetAuthGuardianRuleEffectJsonValueInput! + name: String! +} + +""" +Commonly used values for use in JWT generation, like GitHub email address or the current time. +""" +enum OneGraphAuthGuardianBuiltInValue { + CONTENTFUL_AVATAR_URL + CONTENTFUL_USER_ID + CONTENTFUL_EMAIL + EGGHEADIO_AVATAR_URL + EGGHEADIO_USER_ID + EGGHEADIO_EMAIL + EGGHEADIO_IS_PRO + EGGHEADIO_IS_INSTRUCTOR + EGGHEADIO_IS_COMMUNITY_MEMBER + GITHUB_AVATAR_URL + GITHUB_EMAIL + GITHUB_LOGIN + GITHUB_NAME + GITHUB_USER_ID + GITHUB_FULL_EMAILS + GMAIL_EMAIL + GMAIL_EMAIL_VERIFIED + GMAIL_USER_ID + LOGGED_IN_SERVICES + NETLIFY_AVATAR_URL + NETLIFY_EMAIL + NETLIFY_FULL_NAME + NETLIFY_USER_ID + NOW_SECONDS + NOW_MILLISECONDS + NOW_TIMESTAMP + SALESFORCE_EMAIL + SALESFORCE_USER_ID + SPOTIFY_EMAIL + SPOTIFY_USER_ID + STRIPE_ACCOUNT_ID + STRIPE_ACCOUNT_PRIMARY_EMAIL + TWITCH_TV_EMAIL + TWITCH_TV_DISPLAY_NAME + TWITCH_TV_LOGO_URL + TWITCH_TV_USER_ID + TWITTER_IS_VERIFIED + TWITTER_EMAIL + TWITTER_NAME + TWITTER_PROFILE_IMAGE_URL + TWITTER_SCREEN_NAME + TWITTER_USER_ID + VERCEL_AVATAR_URL + VERCEL_EMAIL + VERCEL_NAME + VERCEL_USER_ID +} + +input OneGraphSetAuthGuardianRuleEffectJsonValueInput { + json: String + builtInValue: OneGraphAuthGuardianBuiltInValue +} + +input OneGraphSetAuthGuardianRuleEffectSetValueInput { + value: OneGraphSetAuthGuardianRuleEffectJsonValueInput! + path: String! +} + +input OneGraphSetAuthGuardianRuleEffectInput { + onExpressJsAddPermissions: [String!] + onApolloServerAddRoles: [String!] + onNetlifyAddUserRoles: [String!] + onHasuraSetUserId: OneGraphSetAuthGuardianRuleEffectJsonValueInput + onHasuraSetDefaultRole: String + onHasuraSetSessionVariable: OneGraphSetAuthGuardianRuleEffectHasuraSetSessionVariableInput + onHasuraAddRoles: [String!] + inTheJsonAddToListAtPath: OneGraphSetAuthGuardianRuleEffectSetValueInput + inTheJsonRemoveValueAtPath: String + inTheJsonSetValueAtPath: OneGraphSetAuthGuardianRuleEffectSetValueInput +} + +input OneGraphSetAuthGuardianRuleConditionZeitInput { + loginStatus: Boolean + hasAnEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionTwitterInput { + hasTwitterVerifiedStatus: Boolean + screenName: OneGraphSetAuthGuardianRuleStringConditionInput + loginStatus: Boolean +} + +input OneGraphSetAuthGuardianRuleConditionTwitchTvInput { + loginStatus: Boolean + hasVerifiedEmail: Boolean + hasAnEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionStripeInput { + loginStatus: Boolean + hasAPrimaryAccountEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput + hasAnAccountIdThat: OneGraphSetAuthGuardianRuleStringConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionSpotifyInput { + loginStatus: Boolean + hasAnEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionSalesforceInput { + loginStatus: Boolean + hasAnEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionNetlifyInput { + loginStatus: Boolean + hasAnEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionGmailInput { + loginStatus: Boolean + hasAnEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionGitHubInput { + isCollaboratorOnRepositoryWhereFullName: String + isMemberOfOrganizationNamed: String + hasStarredARepositoryWithAFullNameOf: String + hasCommittedToRepositoryWithAFullNameOf: String + login: OneGraphSetAuthGuardianRuleStringConditionInput + loginStatus: Boolean + hasAnEmailThat: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionEggheadioInput { + isCommunityMember: Boolean + isInstructor: Boolean + isPro: Boolean + loggedIn: Boolean + email: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleStringConditionInput { + isEqualToCaseInsensitively: String + containsCaseInsensitively: String + endsWithCaseInsensitively: String + startsWithCaseInsensitively: String + isEqualTo: String + contains: String + endsWith: String + startsWith: String +} + +input OneGraphSetAuthGuardianRuleEmailConditionInput { + isEqualTo: String + hasADomainThat: OneGraphSetAuthGuardianRuleStringConditionInput + endsWith: String + startsWith: String +} + +input OneGraphSetAuthGuardianRuleConditionContentfulInput { + confirmed: Boolean + activated: Boolean + loggedIn: Boolean + email: OneGraphSetAuthGuardianRuleEmailConditionInput +} + +input OneGraphSetAuthGuardianRuleConditionInput { + vercel: OneGraphSetAuthGuardianRuleConditionZeitInput + twitter: OneGraphSetAuthGuardianRuleConditionTwitterInput + twitch: OneGraphSetAuthGuardianRuleConditionTwitchTvInput + stripe: OneGraphSetAuthGuardianRuleConditionStripeInput + spotify: OneGraphSetAuthGuardianRuleConditionSpotifyInput + salesforce: OneGraphSetAuthGuardianRuleConditionSalesforceInput + netlify: OneGraphSetAuthGuardianRuleConditionNetlifyInput + gmail: OneGraphSetAuthGuardianRuleConditionGmailInput + gitHub: OneGraphSetAuthGuardianRuleConditionGitHubInput + eggheadio: OneGraphSetAuthGuardianRuleConditionEggheadioInput + contentful: OneGraphSetAuthGuardianRuleConditionContentfulInput + always: Boolean +} + +input OneGraphSetAuthGuardianRuleInput { + effects: [OneGraphSetAuthGuardianRuleEffectInput!]! + conditions: [OneGraphSetAuthGuardianRuleConditionInput!]! +} + +input OneGraphSetAuthGuardianInput { + rules: [OneGraphSetAuthGuardianRuleInput!]! +} + +type OneGraphSetAuthGuardianResponsePayload { + javascript: String + graphQL: String + jwt: String + rules: JSON +} + +"""A OneGraph Server Info""" +type OneGraphServerInfo { + """""" + sha: String! + + """""" + buildNumber: Int! +} + +"""Customizations to a OneGraph schema.""" +type OneGraphGraphQLSchema { + id: String! + appId: String! + parentGraphQLSchemaId: String + parentGraphQLSchema: OneGraphGraphQLSchema + services: [OneGraphServiceInfo!]! + salesforceSchema: OneGraphSalesforceSchema + + """External GraphQL schemas for the schema.""" + externalGraphQLSchemas: OneGraphExternalGraphQLSchemaConnection! + createdAt: String! + updatedAt: String! +} + +enum OneGraphExternalHoneycombConfigDatasetMetricTypeEnum { + API_CALL + SUBSCRIPTION_DELIVERY +} + +type OneGraphExternalHoneycombConfigDataset { + """The metric type.""" + metricType: OneGraphExternalHoneycombConfigDatasetMetricTypeEnum! + + """The name of the dataset in Honeycomb.""" + datasetName: String! +} + +type OneGraphExternalHoneycombConfig { + """Id of the app that the external Honeycomb config belongs to.""" + appId: String! + + """The datetime that the Honecomb config was added, in rfc3339 format.""" + createdAt: String! + + """ + The datetime that the Honeycomb config was last updated, in rfc3339 format. + """ + updatedAt: String! + + """The Honeycomb API token that OneGraph will use to send events.""" + obfuscatedToken: String! + + """If `true`, OneGraph will send events to Honeycomb.""" + active: Boolean! + + """The last error we received while sending events to the Honeycomb API.""" + lastError: String + + """User-provided dataset names""" + datasets: [OneGraphExternalHoneycombConfigDataset!]! +} + +type OneGraphGoogleSiteVerification { + """The root path that this will be served at.""" + path: String! + + """The content that will be served at the path.""" + body: String! +} + +type OneGraphSalesforceSchema { + """Id of the salesforce schema""" + id: String! + + """The id of the OneGraph app that the salesforce schema belongs to.""" + appId: String! + + """The datetime that the schema was added, in rfc3339 format.""" + createdAt: String! + + """The datetime that the schema was last updated, in rfc3339 format.""" + updatedAt: String! + + """Salesforce instanceUrl""" + instanceUrl: String! + + """Salesforce Organization ID""" + salesforceOrgId: String + + """Whether this is a preview of a change to a Salesforce schema.""" + isPreview: Boolean! + + """The previous salesforce schema, if there was one.""" + previousSalesforceSchema: OneGraphSalesforceSchema +} + +enum OneGraphSupportedExternalGraphQLService { + GRAPHCMS + WORDPRESS +} + +type OneGraphExternalGraphQLSchema { + """Id of the external graphql schema""" + id: String! + + """The datetime that the schema was added, in rfc3339 format.""" + createdAt: String! + + """The datetime that the schema was last updated, in rfc3339 format.""" + updatedAt: String! + + """Service of the external graphql schema""" + service: OneGraphSupportedExternalGraphQLService! + + """GraphQL endpoint of the external graphql schema""" + endpoint: String! +} + +type OneGraphExternalGraphQLSchemaConnection { + nodes: [OneGraphExternalGraphQLSchema!]! +} + +type OneGraphGithubRepositorySubscriptionDelegate { + id: String! + + """Name with owner (e.g. onegraph/graphiql-exporer) of the GitHub repo.""" + nameWithOwner: String! + + """ + Datetime that the repo was set up to allow non-admin subscriptions (rfc3339 encoded) + """ + createdAt: String! +} + +type OneGraphGithubRepositorySubscriptionDelegateConnection { + nodes: [OneGraphGithubRepositorySubscriptionDelegate!]! +} + +"""Persisted query""" +type OneGraphPersistedQuery { + """The persisted query's id.""" + id: String! + + """The persisted query's query string.""" + query: String! + + """The default variables provided to the query.""" + fixedVariables: JSON + + """ + The list of variables that the caller of the query is allowed to provide. + """ + freeVariables: [String!] + + """ + The list of operation names that the caller of the query is allowed to execute. If the field is null, then all operationNames are allowed. + """ + allowedOperationNames: [String!] + + """The list of user-defined tags that were added to the query""" + tags: [String!] + + """The user-defined description that was added to the query""" + description: String + + """The parent of this query, if it has one.""" + parent: OneGraphPersistedQuery +} + +"""List of persisted queries.""" +type OneGraphPersistedQueryConnection { + """List of persisted queries.""" + nodes: [OneGraphPersistedQuery!]! + + """Pagination information""" + pageInfo: PageInfo! +} + +"""A custom cors origin""" +type OneGraphCustomCorsOrigin { + """The friendly service name for the cors origin""" + friendlyServiceName: String! + + """ + The name of the origin that should be displayed, e.g. oneblog for oneblog.netlify.app. + """ + displayName: String! + + """The encoded value as a string, used to remove the custom cors origin.""" + encodedValue: String! +} + +type OneGraphAppAuthCompletedLog implements OneGraphAppLog { + """ + Noted whenever an end-user has completed a login for a service when using this app + """ + service: String! + friendlyName: String! + + """The user id according to the service they logged into""" + serviceUserId: String + + """The id of the log""" + id: String! + + """The time of the log, encoded as rfc3339""" + createdAt: String! + + """JSON data encoded as a string for this specific event""" + jsonData(pretty: Boolean = false): String! +} + +type OneGraphAppLogJwtWebhookFailed implements OneGraphAppLog { + """ + The destination webhook where we tried to deliver the JWT for preprocessing when it failed + """ + destination: String! + + """The numeric HTTP status code we received from the webhook (if any)""" + responseStatusCode: Int + + """The textual responseBody we received from the webhook (if any)""" + responseBody: String + friendlyName: String! + + """The id of the log""" + id: String! + + """The time of the log, encoded as rfc3339""" + createdAt: String! + + """JSON data encoded as a string for this specific event""" + jsonData(pretty: Boolean = false): String! +} + +type OneGraphAppLogSubscriptionDeliveryFailed implements OneGraphAppLog { + """The subscription for the failed delivery attempt""" + subscription: OneGraphAppSubscription + + """The attempt number for delivering this subscription payload""" + attempt: Int! + friendlyName: String! + + """The id of the log""" + id: String! + + """The time of the log, encoded as rfc3339""" + createdAt: String! + + """JSON data encoded as a string for this specific event""" + jsonData(pretty: Boolean = false): String! +} + +interface OneGraphAppLog { + id: String! + createdAt: String! + friendlyName: String! + jsonData(pretty: Boolean = false): String +} + +type OneGraphAppLogConnection { + """Applogs""" + nodes: [OneGraphAppLog!]! +} + +"""An RSA public key used for signing JWTs""" +type OneGraphAppJwtRsaPublicKey { + """The algorithm associated with this public key""" + algorithm: String! + + """The n of the rsa key""" + n: String! + + """The exponent of the rsa key""" + e: String! +} + +"""An HMAC key used for signing JWTs""" +type OneGraphJwtSigningKeyHmac256 implements OneGraphJwtSigningKey { + """The algorithm associated with this public key""" + algorithm: OneGraphJwtSigningAlgorithmEnum! + + """The algorithm associated with this public key""" + family: OneGraphSigningAlgorithmFamilyEnum! + + """The shared secret for this key (if any)""" + sharedSecret: String +} + +"""Signing algorithm for JWTs generated by Onegraph""" +enum OneGraphJwtSigningAlgorithmEnum { + HMAC_256 + RSA_256 +} + +"""The family of Signing algorithms""" +enum OneGraphSigningAlgorithmFamilyEnum { + SYMMETRIC + ASYMMETRIC +} + +"""An RSA public key used for signing JWTs""" +type OneGraphJwtSigningKeyRsa256 implements OneGraphJwtSigningKey { + """The algorithm associated with this public key""" + family: OneGraphSigningAlgorithmFamilyEnum! + + """The algorithm associated with this public key""" + algorithm: OneGraphJwtSigningAlgorithmEnum! +} + +interface OneGraphJwtSigningKey { + """The family of algorithms used for this key""" + family: OneGraphSigningAlgorithmFamilyEnum! + + """The algorithm associated with this key""" + algorithm: OneGraphJwtSigningAlgorithmEnum! +} + +"""The method of generating JWTs""" +enum OneGraphAppJwtGenerationMethodEnum { + MANUAL + AUTH_BUILDER +} + +"""JWT settings for the app, useful for SSO.""" +type OneGraphAppJwtSettings { + """A query to run on every user log in to use in generating the JWT token""" + jwtPreflightQuery: String + + """ + An optional webhook to use for generating the full JWT. Use this and `jwtPreflightQuery` to customize claims. Very useful when used alongside e.g. Hasura or PostGraphile + """ + jwtWebhookUrl: String + + """ + Whether this app is generating JWTs on login via a manual query/webhook combination, or using OneGraph's AuthGuardian + """ + jwtGenerationMethod: OneGraphAppJwtGenerationMethodEnum! + + """ + The rules this app is configured to use when generating JWTs on user login + """ + jwtAuthGuardianRules: JSON + + """The current key used to sign JWTs generated for this app""" + activeKey: OneGraphJwtSigningKey + + """List of the public keys for an app""" + publicKeys: [OneGraphAppJwtRsaPublicKey!] + + """The full JWT configuration for Hasura""" + hasuraConfig: String + + """ + The public well-known JWK url of where to look for public keys when verifying JWT for this app + """ + jwksUrl: String! +} + +"""Status of the subscription""" +enum OneGraphAppSubscriptionsStatusEnumArg { + ACTIVE + INACTIVE +} + +enum OneGraphAppSubscriptionPayloadDeliveryStatus { + WAITING + DELIVERING + DELIVERED + FAILED +} + +"""Payload for a subscription created by the app""" +type OneGraphAppSubscriptionPayload { + """Unique id for the payload.""" + id: String! + + """ + Body of the payload or null if the payload is expired. This is the full body of the GraphQL payload, including the `data`, `errors`, and `extensions` fields as JSON. + """ + body: JSON! + + """ + `true` if the payload body has been deleted. Payload bodies will expire after 1 year. + """ + isExpired: Boolean! + + """ + The time that this payload was created, in rfc3339 format e.g. `2021-03-24T23:35:03-00:00` + """ + createdAt: String! + + """ + The delivery status of a subscription, if the subscription has a destination. + """ + deliveryStatus: OneGraphAppSubscriptionPayloadDeliveryStatus! + + """The number of times we attempted to deliver the payload.""" + deliveryAttempts: Int! + + """ + The last time we attempted to deliver the payload, in rfc3339 format e.g. `2021-03-24T23:35:03-00:00` + """ + lastDeliveryAttempt: String + + """ + The status code we received from the webhook destination the last time we attempted to deliver the payload. This field will be null for Websocket and Retain-only subscriptions. + """ + lastStatusCode: Int + + """ + If there was an error delivering the payload to a webhook destination, this field will contain the first 512 bytes of the response we receieved from the server. + """ + lastError: String +} + +"""Payloads for a subscription""" +type OneGraphAppSubscriptionPayloadsConnection { + """List of subscription payloads""" + nodes: [OneGraphAppSubscriptionPayload!]! +} + +scalar JSON + +"""Webhook destination for a OneGraph subscription""" +type OneGraphAppSubscriptionWebhookDestination { + """Url that the webhook will deliver payloads to.""" + url: String! +} + +"""Websocket destination for a OneGraph subscription""" +type OneGraphAppSubscriptionWebsocketDestination { + """The client-side id for the subscription.""" + clientId: String! +} + +""" +Destination for a OneGraph subscription that is only retained and not delivered. +""" +type OneGraphAppSubscriptionRetainedOnlyDestination { + retainedOnly: Boolean! +} + +union OneGraphAppSubscriptionDestination = OneGraphAppSubscriptionRetainedOnlyDestination | OneGraphAppSubscriptionWebsocketDestination | OneGraphAppSubscriptionWebhookDestination + +"""Information about a subscription to Salesforce.""" +type OneGraphSalesforceSubscriptionInfo { + """ + The Id of the Salesforce Organization that this subscription is subscription to + """ + organizationId: String! +} + +"""Information about a subscription to gmail.""" +type OneGraphGmailWatch { + """Email address that is being watched.""" + emailAddress: String! +} + +"""Subscription created by the app""" +type OneGraphAppSubscription { + """Unique id for the subscription.""" + id: String! + + """Status of the subscription.""" + status: String! + + """Query that the subscription run.""" + query: String! + + """ + If this is a subscription to Gmail, contains extra information about the Gmail subscription + """ + gmailWatch: OneGraphGmailWatch + + """ + If this is a subscription to Salesforce, contains extra information about the Salesforce subscription + """ + salesforceInfo: OneGraphSalesforceSubscriptionInfo + + """Destination for the subscription payloads""" + destination: OneGraphAppSubscriptionDestination! + + """Reason why this subscription can't be updated if it can't be updated.""" + updatesUnsupportedReason: String + + """The variables that this query was saved with.""" + requestVariables: JSON + + """ + The time that this subscription was created, in rfc3339 format e.g. `2021-03-24T23:35:03-00:00` + """ + createdAt: String! + + """ + Whether this subscription retains payloads. Payloads are available through the `payload` field on the subscription. + """ + retainPayloads: Boolean! + + """ + Latest payloads for a subscription, if the subscription was created with `retainPayloads` set to true. + """ + payloads( + """Number of payloads to fetch. Defaults to 20, maximum is 100.""" + first: Int = 20 + ): OneGraphAppSubscriptionPayloadsConnection +} + +"""Information about pagination in a connection.""" +type PageInfo { + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: String + + """When paginating forwards, the cursor to continue.""" + endCursor: String +} + +""" +Subscriptions created by the app, with extra information about pagination. +""" +type OneGraphAppSubscriptionsConnection { + """Pagination information.""" + pageInfo: PageInfo! + + """List of subscriptions created by the app.""" + nodes: [OneGraphAppSubscription!]! +} + +"""Custom OAuth client for Adroll""" +type OneGraphAdrollServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Asana""" +type OneGraphAsanaServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Box""" +type OneGraphBoxServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Contentful""" +type OneGraphContentfulServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Dev.to""" +type OneGraphDevToServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Docusign""" +type OneGraphDocusignServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Dribbble""" +type OneGraphDribbbleServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Dropbox""" +type OneGraphDropboxServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Egghead.io""" +type OneGraphEggheadioServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Eventil""" +type OneGraphEventilServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Facebook""" +type OneGraphFacebookServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Firebase""" +type OneGraphFirebaseServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +type OneGraphGitHubAppWebhook { + signingSecret: String! + webhookUrl: String! +} + +"""Custom OAuth client for GitHub""" +type OneGraphGitHubServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String + gitHubAppWebhook: OneGraphGitHubAppWebhook +} + +"""Custom OAuth client for Gmail""" +type OneGraphGmailServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Google""" +type OneGraphGoogleServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Google Ads""" +type OneGraphGoogleAdsServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Google Analytics""" +type OneGraphGoogleAnalyticsServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Google Calendar""" +type OneGraphGoogleCalendarServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Google Compute""" +type OneGraphGoogleComputeServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Google Docs""" +type OneGraphGoogleDocsServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Google Search Console""" +type OneGraphGoogleSearchConsoleServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Google Translate""" +type OneGraphGoogleTranslateServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Hubspot""" +type OneGraphHubspotServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Intercom""" +type OneGraphIntercomServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Mailchimp""" +type OneGraphMailchimpServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Meetup""" +type OneGraphMeetupServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Netlify""" +type OneGraphNetlifyServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Notion""" +type OneGraphNotionServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Product Hunt""" +type OneGraphProductHuntServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for QuickBooks""" +type OneGraphQuickbooksServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Salesforce""" +type OneGraphSalesforceServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Slack Event Webhook for an app.""" +type OneGraphSlackEventWebhook { + """Unique identifier.""" + id: String! + + """Custom OAuth service id.""" + serviceAuthId: String! + + """ + The webhook url that should be set as the request url for your Slack app. + """ + webhookUrl: String! + + """ + Last time that the webhook was verified by Slack, encoded as an []rfc3339](https://tools.ietf.org/html/rfc3339) string. For example: `1985-04-12T23:20:50-00:00``. + """ + verifiedAt: String + + """ + Date that the webhook was created, encoded as an []rfc3339](https://tools.ietf.org/html/rfc3339) string. For example: `1985-04-12T23:20:50-00:00``. + """ + createdAt: String! + + """The signing secret, masked.""" + maskedSigningSecret: String + + """The app token, masked.""" + maskedAppToken: String +} + +"""Custom OAuth client for Slack""" +type OneGraphSlackServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String + slackEventWebhook: OneGraphSlackEventWebhook +} + +"""Custom OAuth client for Spotify""" +type OneGraphSpotifyServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Stripe""" +type OneGraphStripeServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Trello""" +type OneGraphTrelloServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Twilio""" +type OneGraphTwilioServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Twitter""" +type OneGraphTwitterServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Twitch""" +type OneGraphTwitchTvServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for You Need a Budget""" +type OneGraphYnabServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for YouTube""" +type OneGraphYoutubeServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Vercel""" +type OneGraphZeitServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for Zendesk""" +type OneGraphZendeskServiceAuth implements OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""Custom OAuth client for a service""" +interface OneGraphServiceAuth { + """id for the service auth""" + id: String! + + """ + The service that the clientId and clientSecret belong to, e.g. "gmail" + """ + service: String! + + """clientId for the serviceAuth.""" + clientId: String! + + """clientSecret for the serviceAuth.""" + clientSecret: String! + + """ + Optional pubsub topic for gmail auth. Required to use gmail subscriptions with custom OAuth credentials. + """ + gmailWatchPubSubTopic: String + + """ + Developer token for the Google Ads api. Required to use the Google Ads api. + """ + googleDeveloperToken: String + + """ + App name for Trello OAuth client. This is the name that will be displayed on the OAuth login form. + """ + trelloAppName: String + + """Optional scopes to use for the OAuth flow.""" + scopes: [String!] + + """ + If true, the bearer token that is created fetchable by the user whose account the token grants access to. + """ + revealTokens: Boolean! + + """Custom OAuth redirect URI.""" + customRedirectUri: String + + """Custom CNAME host.""" + cname: String +} + +"""A OneGraph Org""" +type OneGraphOrg { + """The id of the OneGraph Org""" + id: String! + + """The name of the OneGraph Org""" + name: String! + + """All OneGraph apps belonging to this organization""" + apps: [OneGraphApp!]! +} + +"""A OneGraph App""" +type OneGraphApp { + """The id of the OneGraph App""" + id: String! + + """The description of the OneGraph App""" + description: String! + + """The subdomain of the OneGraph App""" + subdomain: String! + + """The name of the OneGraph App""" + name: String! + + """The origins allowed for this OneGraph App from CORS requests""" + corsOrigins: [String!]! + + """The id of the OneGraph organization that this app belongs to""" + orgId: String! + + """The OneGraph organization that this app belongs to""" + org: OneGraphOrg + + """The queries belonging to this OneGraph app""" + queries: [OneGraphQuery!]! + + """ + The custom clientId/clientSecret that have been set for services (e.g. Gmail and Slack) that belong to this OneGraph app + """ + serviceAuths: [OneGraphServiceAuth!]! + + """Subscriptions created with this app""" + subscriptions( + """ + Fiter by the Subscription's Salesforce organization Id, if the subscription is to a change in Salesforce.. + """ + salesforceOrganizationId: String + + """ + Fiter by the Subscription's webhook url, if the destination is a webhook. + """ + webhookUrl: String + + """Fiter by status of the subscription""" + status: OneGraphAppSubscriptionsStatusEnumArg + + """Fetch items in the list after the specified cursor""" + after: String + + """How many subsriptions to fetch""" + first: Int = 25 + ): OneGraphAppSubscriptionsConnection! + + """The JWT settings for this app""" + jwtSettings: OneGraphAppJwtSettings! + + """Activity related to this app""" + auditLogs( + """ + How many log items to pull from the front of the collection, maximum of `250` + """ + first: Int = 10 + ): OneGraphAppLogConnection! + + """ + Sites on Netlify associated with this app. OneGraph will allow CORS and authentication redirects to all previews, branch, and production deploys of these sites. + """ + netlifySiteNames: [String!]! + + """Custom cors origins""" + customCorsOrigins: [OneGraphCustomCorsOrigin!]! + + """List of persisted queries for this app""" + persistedQueries( + """Only return persisted queries that have all of the provided tags.""" + tags: [String!] + + """Returns results after the provided cursor.""" + after: String + + """How many persisted queries to return. Defaults to 10, max 100.""" + first: Int = 10 + ): OneGraphPersistedQueryConnection! + + """GitHub repos for the app that can have subscriptions on OneGraph.""" + gitHubRepositorySubscriptionDelegates: OneGraphGithubRepositorySubscriptionDelegateConnection! + + """The Slack channel for AuthGuardian to post into upon user sign-in""" + authGuardianSlackChannel: String + + """Whether the AuthGuardian Slack integration is enabled""" + authGuardianSlackIntegrationEnabled: Boolean! + + """External GraphQL schemas for the app.""" + externalGraphQLSchemas: OneGraphExternalGraphQLSchemaConnection! + + """Custom Salesforce schema for the app.""" + salesforceSchema: OneGraphSalesforceSchema + + """ + The domain that must be authorized to receive push notifications from Google for Google Calendar subscriptions. + """ + googleAuthorizedDomain: String! + + """Google Site Verification for the app""" + googleSiteVerification: OneGraphGoogleSiteVerification + + """External Honeycomb config for the app""" + externalHoneycombConfig: OneGraphExternalHoneycombConfig + + """Customizations to the default GraphQL schema""" + graphQLSchema: OneGraphGraphQLSchema +} + +"""A query stored in Onegraph""" +type OneGraphQuery { + """The id of the GraphQL query""" + id: String! + + """The id of the app that this GraphQL query belongs to""" + appId: String! + + """ + Whether a GraphQL query is globally enabled/disabled. Note that even if the query is enabled, a corresponding auth_token must share a tag with this query to use it. + """ + enabled: Boolean! + + """ + Whether a GraphQL query is shared and publicly viewable, including all of its meta-information. + """ + public: Boolean! + + """The version (currently a hash of the body) of the GraphQL query""" + version: String! + + """The body of the GraphQL query""" + body: String! + + """The name of the GraphQL query""" + name: String! + + """An optional description of the GraphQL query""" + description: String + + """The tags (for permissions and organization) of the GraphQL query""" + tags: [String!]! + + """What time this query was created""" + createdAtTs: String! + + """What time this query was created in milliseconds from the epoch""" + createdAtMs: Int! +} + +"""A query stored in OneGraph in shortened form for easy sharing""" +type OneGraphShortenedQuery { + """The id of the shortened OneGraph query""" + id: String! + + """The full query body of the shortened OneGraph query""" + query: String! + + """The variables of the shortened OneGraph query""" + variables: String + + """The pre-selected operation of the shortened OneGraph query""" + operation: String + + """An optional description of the purpose of the query""" + description: String + + """The optional short name for the shortened OneGraph query""" + name: String + + """ + The fully-qualified url for the shortened OneGraph query, used for sharing + """ + url: String! +} + +input OneGraphServiceInfoFilter { + """Filter for services that support custom service auth""" + supportsCustomServiceAuth: Boolean + + """Filter for services that support OAuth login""" + supportsOauthLogin: Boolean +} + +""" +Root fields for the OneGraph service. Used by OneGraph to build OneGraph. +""" +type OneGraphServiceQuery { + services(filter: OneGraphServiceInfoFilter): [OneGraphServiceInfo!]! + shortenedUrl(id: String!): OneGraphShortenedQuery + queries: [OneGraphQuery!]! + searchQueries(query: String!): [OneGraphQuery!]! + apps: [OneGraphApp!]! + app( + """App id""" + id: String! + ): OneGraphApp! + orgs: [OneGraphOrg!]! + org( + """Org id""" + id: String! + ): OneGraphOrg! + serverInfo: OneGraphServerInfo! + authGuardianPreview(input: OneGraphSetAuthGuardianInput!): OneGraphSetAuthGuardianResponsePayload + + """ + An identity function. The field will return whatever is provided as the input. + """ + identity( + """The input that should be returned.""" + input: JSON + ): JSON + + """A graphql subscription.""" + graphQLSubscription( + """The unique id for the app.""" + appId: String! + + """The unique id for the subscription.""" + id: String! + ): OneGraphAppSubscription + + """Fetch a single persisted query by its id.""" + persistedQuery( + """The id of the app that the persisted query belongs to.""" + appId: String! + + """The id of the persisted query.""" + id: String! + ): OneGraphPersistedQuery! + + """Find a GraphQL schema by its id.""" + graphQLSchema( + """The id of the app that the GraphQL schema belongs to.""" + appId: String! + + """The id of the GraphQL schema.""" + id: String! + ): OneGraphGraphQLSchema! + netlifyCliEvents( + """The number of events to fetch. The maximum is 1000.""" + first: Int = 1000 + sessionId: String! + ): [OneGraphNetlifyCliSessionEvent!]! + + """Netlify CLI sessions, orderd by createdAt descending.""" + netlifyCliSessionsByAppId( + """The number of sessions to fetch. The maximum is 10.""" + first: Int = 10 + appId: String! + ): [OneGraphNetlifyCliSession!]! + + """Get a Netlify CLI session by its id.""" + netlifyCliSession(id: String!): OneGraphNetlifyCliSession! +} + +"""Download data for npm overall""" +type NpmOverallDownloadPeriodData { + """The start date of download stats""" + start: String! + + """The end date of download stats""" + end: String! + + """ + The download stats for all over npm for the given range. Check out explanation of how [npm download counts work](http://blog.npmjs.org/post/92574016600/numeric-precision-matters-how-npm-download-counts), including "what counts as a download?" + """ + count: Int! + + """ + "Download data for all of npm for a given period in a daily breakdown" + """ + perDay: [NpmDownloadsPerDay!]! +} + +"""Information about download stats related to a package""" +type NpmOverallDownloadData { + """The download status for all of npm over the last day""" + lastDay: NpmOverallDownloadPeriodData + + """The download status for all of npm over the last week""" + lastWeek: NpmOverallDownloadPeriodData + + """The download status for all of npm over the last month""" + lastMonth: NpmOverallDownloadPeriodData + + """The download status for all of npm for a specific period""" + period( + """ + The later date for download stats, e.g. 2018-12-07. Must be after `startDate` + """ + endDate: String! + + """ + The earlier date for download stats, e.g. 2018-12-06. Must be before `endDate` + """ + startDate: String! + ): NpmOverallDownloadPeriodData + + """The download status for all of npm for a specific day""" + day( + """The specific date for download stats, e.g. 2018-12-06""" + date: String! + ): NpmOverallDownloadPeriodData +} + +type NpmPackageMetadataDistTagEntry { + """The name of the tag""" + tag: String! + + """The version as a string for this tag""" + versionString: String! + + """The full version for this tag""" + version: NpmPackageVersion +} + +type NpmPackageMetadataDistTagLatestEntry { + """The version as a string for this tag""" + versionString: String + + """The full version for the `latest` tag""" + version: NpmPackageVersion +} + +""" +Tags can be used to provide an alias instead of version numbers. For example, a project might choose to have multiple streams of development and use a different tag for each stream, e.g., stable, beta, dev, canary. +""" +type NpmPackageDistTags { + """ + By default, the latest tag is used by npm to identify the current version of a package + """ + latest: NpmPackageMetadataDistTagLatestEntry + + """Any custom tags used by the package maintainers""" + custom: [NpmPackageMetadataDistTagEntry!]! +} + +type NpmDownloadsPerDay { + """The download count""" + count: Int + + """""" + day: String +} + +"""Download data for a given package""" +type NpmPackageDownloadPeriodData { + """The start date of download stats""" + start: String! + + """The end date of download stats""" + end: String! + + """ + The download stats for the given package and range. Check out explanation of how [npm download counts work](http://blog.npmjs.org/post/92574016600/numeric-precision-matters-how-npm-download-counts), including "what counts as a download?" + """ + count: Int! + + """ + "Download data for this package and period in a daily breakdown" + """ + perDay: [NpmDownloadsPerDay!]! +} + +"""Information about download stats related to a package""" +type NpmPackageDownloadData { + """The download status for this package over the last day""" + lastDay: NpmPackageDownloadPeriodData + + """The download status for this package over the last week""" + lastWeek: NpmPackageDownloadPeriodData + + """The download status for this package over the last month""" + lastMonth: NpmPackageDownloadPeriodData + + """The download status for this package for a specific period""" + period( + """ + The later date for download stats, e.g. 2018-12-07. Must be after `startDate` + """ + endDate: String! + + """ + The earlier date for download stats, e.g. 2018-12-06. Must be before `endDate` + """ + startDate: String! + ): NpmPackageDownloadPeriodData + + """The download status for this package for a specific day""" + day( + """The specific date for download stats, e.g. 2018-12-06""" + date: String! + ): NpmPackageDownloadPeriodData +} + +"""A npm package license""" +type NpmPackageLicense { + """ + The [SPDX identifier](https://spdx.org/licenses/) of the package's license + """ + type: String + + """A url for the full license""" + url: String +} + +""" +A mapping of other packages this version depends on to the required semver ranges +""" +type NpmPackageVersionDependency { + """The package name of the dependency""" + name: String + + """The version of the package dependency""" + version: String +} + +"""The dist object is generated by npm and may be relied upon""" +type NpmPackageDist { + """""" + tarball: String + + """""" + shasum: String +} + +"""A npm package version""" +type NpmPackageVersion { + """ + `true` if this version is known to have a shrinkwrap that must be used to install it; false if this version is known not to have a shrinkwrap. If this field is undefined, the client must determine through other means if a shrinkwrap exists. + """ + hasShrinkwrap: Boolean + + """""" + from: String + + """`package@version`, such as `npm@1.0.0`""" + id: String + + """The version of node used to publish this""" + nodeVersion: String + + """The version of the npm client used to publish this""" + npmVersion: String + + """The dist object is generated by npm and may be relied upon.""" + dist: NpmPackageDist + + """The SHA-1 sum of the tarball""" + shasum: String + + """A short description of the package at this version""" + description: String + + """The package's entry point (e.g., `index.js` or `main.js`)""" + main: String + + """The package name""" + name: String + + """Deprecation warnings message of this version""" + deprecated: String + + """The version string for this version""" + version: String + + """""" + maintainers: [NpmPackageMaintainer!] + + """ + A mapping of other packages this version depends on to the required semver ranges + """ + dependencies: [NpmPackageVersionDependency!]! + + """ + A mapping of package names to the required semver ranges of _development_ dependencies + """ + devDependencies: [NpmPackageVersionDependency!]! + + """ + A mapping of package names to the required semver ranges of _optional_ dependencies + """ + optionalDependencies: [NpmPackageVersionDependency!]! + + """ + A mapping of package names to the required semver ranges of _peer_ dependencies + """ + peerDependencies: [NpmPackageVersionDependency!]! + + """The license for this package""" + license: NpmPackageLicense! +} + +"""Information on where bugs are filed for this package""" +type NpmPackageBugs { + """""" + url: String +} + +""" +Specifies the repository where the source for this package might be found +""" +type NpmPackageRepository { + """""" + url: String + + """""" + type: String +} + +"""A package publishing time for a given version""" +type NpmPackageTimeVersion { + """The package version""" + version: String + + """The date this version was published""" + date: String +} + +""" +Information about when a package was created and last modified, as well as the publishing date for each version +""" +type NpmPackageTime { + """""" + created: String + + """""" + modified: String + + """Publishing information for each version of a package""" + versions: [NpmPackageTimeVersion!]! +} + +"""A npm package maintainer""" +type NpmPackageMaintainer { + """The package maintainer's email""" + email: String + + """""" + name: String +} + +"""A npm package""" +type NpmPackage { + """The package name, used as an ID in CouchDB""" + id: String + + """The revision number of this version of the document in CouchDB""" + rev: String + + """The primary author of the npm package""" + author: NpmPackageMaintainer + + """ + A mapping of versions to the time published, along with created and modified timestamps + """ + time: NpmPackageTime + + """The package name""" + name: String + + """A short description of the package""" + description: String + + """ + The first 64K of the README data for the most-recently published version of the package + """ + readme: String + + """""" + homepage: String + + """The repository url as given in package.json, for the latest version""" + repository: NpmPackageRepository + + """""" + keywords: [String!] + + """""" + bugs: NpmPackageBugs + + """The name of the file from which the readme data was taken""" + readmeFilename: String + + """ + People with permission to publish this package (NB: Not authoritative, but informational) + """ + maintainers: [NpmPackageMaintainer!] + + """A mapping of semver-compliant version numbers to version data""" + versions: [NpmPackageVersion!]! + + """Summary download stats for a package""" + downloads: NpmPackageDownloadData! + + """The license for this package""" + license: NpmPackageLicense! + + """ + Tags can be used to provide an alias instead of version numbers. For example, a project might choose to have multiple streams of development and use a different tag for each stream, e.g., stable, beta, dev, canary. + """ + distTags: NpmPackageDistTags +} + +"""The root for Npm.""" +type NpmQuery { + """Find a npm package member by its npm name, e.g. `"fela"`""" + package( + """Find the package by its name""" + name: String! + ): NpmPackage + + """Overall download stats in the npm ecosystem""" + downloads: NpmOverallDownloadData +} + +input OneGraphServiceUserIds { + """User id for Adroll""" + adroll: String + + """User id for Asana""" + asana: String + + """User id for Box""" + box: String + + """User id for Contentful""" + contentful: String + + """User id for Dev.to""" + devTo: String + + """User id for Docusign""" + docusign: String + + """User id for Dribbble""" + dribbble: String + + """User id for Dropbox""" + dropbox: String + + """User id for Egghead.io""" + eggheadio: String + + """User id for Eventil""" + eventil: String + + """User id for Facebook""" + facebookBusiness: String + + """User id for Firebase""" + firebase: String + + """User id for GitHub""" + gitHub: String + + """User id for Gmail""" + gmail: String + + """User id for Google""" + google: String + + """User id for Google Ads""" + googleAds: String + + """User id for Google Analytics""" + googleAnalytics: String + + """User id for Google Calendar""" + googleCalendar: String + + """User id for Google Compute""" + googleCompute: String + + """User id for Google Docs""" + googleDocs: String + + """User id for Google Search Console""" + googleSearchConsole: String + + """User id for Google Translate""" + googleTranslate: String + + """User id for Hubspot""" + hubspot: String + + """User id for Intercom""" + intercom: String + + """User id for Mailchimp""" + mailchimp: String + + """User id for Meetup""" + meetup: String + + """User id for Netlify""" + netlify: String + + """User id for Notion""" + notion: String + + """User id for Product Hunt""" + productHunt: String + + """User id for QuickBooks""" + quickbooks: String + + """User id for Salesforce""" + salesforce: String + + """User id for Slack""" + slack: String + + """User id for Spotify""" + spotify: String + + """User id for Stripe""" + stripe: String + + """User id for Trello""" + trello: String + + """User id for Twilio""" + twilio: String + + """User id for Twitter""" + twitter: String + + """User id for Twitch""" + twitchTv: String + + """User id for You Need a Budget""" + ynab: String + + """User id for YouTube""" + youTube: String + + """User id for Vercel""" + zeit: String + + """User id for Zendesk""" + zendesk: String +} + +input OneGraphZendeskAPITokenAuth { + token: String! + email: String! + subdomain: String! +} + +input OneGraphUSPSAPIAuth { + password: String + userId: String! +} + +input OneGraphUPSAPIAuth { + accessToken: String! + password: String! + username: String! +} + +input OneGraphTwilioAuth { + authToken: String! + accountSid: String! +} + +input OneGraphTrelloTokenAuth { + token: String! + apiKey: String! +} + +""" +Authenticate requests when using the Stripe API on behalf of a connected account using the Stripe-Account header and the connected account’s ID. https://stripe.com/docs/connect/authentication#stripe-account-header +""" +input OneGraphStripeConnectAuthArg { + """Id of the connected account for which the request is being made.""" + connectedStripeAccountId: String! + + """Your platform account’s secret key.""" + platformSecretKey: String! +} + +input OneGraphSalesforceOAuthArg { + instanceUrl: String! + token: String! +} + +input OneGraphOrbitAuthArg { + """ + For use with a API key. To generate an api key, see the [Account Settings](https://app.orbit.love/user/edit) in your Orbit dashboard. + """ + apiKey: String! +} + +input OneGraphOpenCollectiveAuthArg { + """ + For use with a API key. To generate an api key, see the [applications page](https://opencollective.com/applications) in your OpenCollective dashboard. + """ + apiKey: String! +} + +input OneGraphNpmBasicAuth { + password: String! + username: String! +} + +input OneGraphNpmAuthArg { + """ + An API or OAuth token with sufficient permissions to publish npm packages + """ + apiToken: String + + """Basic username/password authentication""" + basic: OneGraphNpmBasicAuth +} + +input OneGraphNetlifyAuthArg { + oauthToken: String! +} + +input OneGraphMuxAPITokenAuthArg { + secret: String! + tokenId: String! +} + +input OneGraphMuxAuthArg { + """ + For advanced usage: if you have separately implemented the Mux OAuth flow and have an OAuth token to make calls on behalf of your user, use it with this `oauthToken` argument + """ + oauthToken: String + + """ + For use with a API access token. To generate an access token ID and secret, see the [settings page](https://dashboard.mux.com/settings/access-tokens) in your Mux dashboard. Will take priority over the `oauthToken` argument if both are provided. + """ + accessToken: OneGraphMuxAPITokenAuthArg +} + +input OneGraphLogdnaServiceAuthArg { + """ + Service Key from LogDNA. Retrive a service key from [your profile](https://app.logdna.com/manage/profile) under API Keys > Service Keys. + """ + serviceKey: String! +} + +input OneGraphGoogleAdsAuthArg { + oauthToken: String! + + """ + A developer token from Google allows your app to connect to the Google Ads API. + + To retrieve your developer token, sign in to your Manager Account. You must be signed-in to a Google Ads Manager Account before continuing. Navigate to TOOLS & SETTINGS > SETUP > API Center." + """ + developerToken: String! +} + +input OneGraphFedexAPIAuth { + meterNumber: String! + accountNumber: String! + password: String! + key: String! +} + +input OneGraphDevToAuthArg { + """ + For advanced usage: if you have separately implemented the Dev.to OAuth flow and have an OAuth token to make calls on behalf of your user, use it with this `oauthToken` argument + """ + oauthToken: String + + """ + For use with a personal API token, see the [Dev.to authentication](https://docs.dev.to/api/#section/Authentication/api_key) docs on generating a token. Will take priority over the `oauthToken` argument if both are provided. + """ + apiKey: String +} + +input OneGraphCloudflareUserAuthArg { + key: String! + email: String! +} + +input OneGraphChagebeeAuthArg { + """ + A [Chargebee API key](https://www.chargebee.com/docs/2.0/api_keys.html). To create a key go to **Settings** > **Configure Chargebee** > **API Keys and Webhooks** and then click on the **API Keys** tab. + """ + apiKey: String! + + """ + The [chargebee site](https://www.chargebee.com/docs/2.0/sites-intro.html). + """ + site: String! +} + +input OneGraphApolloAuthArg { + """ + For use with a API key. To generate an api key, see the [Account Settings](https://app.apollo.love/user/edit) in your Apollo dashboard. + """ + apiKey: String! +} + +input OneGraphServiceAuths { + zendeskAPITokenAuth: OneGraphZendeskAPITokenAuth + zeitOAuthToken: String + youtubeOAuthToken: String + + """ + A Wordpress bearer token. This arg is compatible with the `authToken` that is passed as an `Authorization` header in [wp-graphql-jwt-authentication plugin](https://github.com/wp-graphql/wp-graphql-jwt-authentication), or any other plugin that uses a bearer token in the `Authorization` header. + """ + wordpressBearerToken: String + uspsAPIAuth: OneGraphUSPSAPIAuth + upsAPIAuth: OneGraphUPSAPIAuth + twilioAuth: OneGraphTwilioAuth + trelloTokenAuth: OneGraphTrelloTokenAuth + stripeOAuthToken: String + stripeConnectAuth: OneGraphStripeConnectAuthArg + spotifyOAuthToken: String + slackOAuthToken: String + salesforceOAuth: OneGraphSalesforceOAuthArg + productHuntOAuthToken: String + orbit: OneGraphOrbitAuthArg + openCollective: OneGraphOpenCollectiveAuthArg + onegraphToken: String + npmAuth: OneGraphNpmAuthArg + netlifyAuth: OneGraphNetlifyAuthArg + muxAuth: OneGraphMuxAuthArg + mixpanelApiSecret: String + logdnaServiceAuth: OneGraphLogdnaServiceAuthArg + intercomOAuthToken: String + hubspotOAuthToken: String + graphCmsToken: String + googleTranslateOAuthToken: String + googleSearchConsoleOAuthToken: String + googleMapsKey: String + googleDocsOAuthToken: String + googleComputeOAuthToken: String + googleCalendarOAuthToken: String + googleAdsAuth: OneGraphGoogleAdsAuthArg + googleOAuthToken: String + gmailOAuthToken: String + gitHubOAuthToken: String + firebaseOAuthToken: String + fedexAPIAuth: OneGraphFedexAPIAuth + facebookOAuthToken: String + dropboxOAuthToken: String + dribbbleOAuthToken: String + devToAuth: OneGraphDevToAuthArg + crunchbaseUserKey: String + cloudflareUserAuth: OneGraphCloudflareUserAuthArg + clearbitAuth: String + chargebee: OneGraphChagebeeAuthArg + brexAuth: String + apollo: OneGraphApolloAuthArg + airtableApiKey: String +} + +""" +The anchor is like two-factor auth for the token. It ensures that the person who adds auth to the token is the same as the person who created the token. +""" +enum OneGraphAccessTokenAnchorEnum { + """ + Use the logged in OneGraph user. The user must be logged in to the OneGraph dashboard to use this option. + """ + ONEGRAPH_USER + + """ + Use the logged in Netlify user. The token must have an active Netlify auth to use this option. + """ + NETLIFY_USER + + """Use the provided Netlify site.""" + NETLIFY_SITE +} + +"""Custom data for a OneGraph user auth.""" +type OneGraphUserAuthCustomDataForOneGraph { + """AppId that the tokens applies to.""" + appId: String +} + +"""Service-specific data for a user auth.""" +union OneGraphUserAuthCustomData = OneGraphUserAuthCustomDataForOneGraph + +"""A user auth associated with an access token""" +type OneGraphUserAuth { + """Service that the auth belongs to.""" + service: OneGraphServiceEnum! + + """Unique id for the logged-in entity on the service.""" + foreignUserId: String! + + """Scopes granted for the service.""" + scopes: [String!] + + """Service-specific data for the user auth""" + customData: OneGraphUserAuthCustomData +} + +"""A OneGraph Access Token""" +type OneGraphAccessToken { + """Bearer token""" + token: String! + + """ + Time that the the token expires, measured in seconds since the Unix epoch + """ + expireDate: Int! + + """Token name, if it is a personal access token""" + name: String + + """AppId that the token belongs to""" + appId: String! + + """User auths for the access token""" + userAuths: [OneGraphUserAuth!]! + + """ + The anchor is like two-factor auth for the token. It ensures that the person who adds auth to the token is the same as the person who created the token. + """ + anchor: OneGraphAccessTokenAnchorEnum + + """Netlify-specific ID for the token""" + netlifyId: String +} + +"""The settings for a OneGraph User""" +type OneGraphUserSettings { + """The tours completed by this OneGraph user""" + completedTours: [String!]! +} + +"""A OneGraph User""" +type OneGraphUser { + """The id of the OneGraph User""" + id: String! + + """Whether this OneGraph user has confirmed their account""" + confirmed: Boolean! + + """The primary email of the currently logged-in OneGraph user""" + email: String! + + """The full name of the currently logged-in OneGraph user""" + fullName: String! + + """ + The date at which this user agreed to the OneGraph terms of service at https://www.onegraph.com/terms-and-conditions + """ + agreedToTosAt: Int + + """The settings of the currently logged-in OneGraph user""" + settings: OneGraphUserSettings! + + """User hash for securely identifying a user with Intercom""" + intercomUserHash: String! + + """Personal access tokens""" + personalTokens: [OneGraphAccessToken!] + + """ + The gitHub databaseId if this OneGraph User has associated their account with a GitHub account + """ + gitHubUserId: String +} + +"""A scope that has been granted to the user""" +type OneGraphServiceMetadataGrantedScope { + """The name of the scope that the underlying service uses.""" + scope: String! + + """ + Details about the scope. This may be null if OneGraph has not mapped out the scope. + """ + scopeInfo: OneGraphServiceScope +} + +"""Filter linked nodes by __typename.""" +input OneGraphLinkedNodesTypenameFilter { + """ + Checks for linked nodes where the __typename is in the list of the provided values. + """ + in: [String!] + + """ + Checks for linked nodes where the __typename is equal to the provided value. + """ + equalTo: String +} + +"""Services supported by OneGraph.""" +enum OneGraphServiceEnumArg { + ADROLL + ASANA + BOX + CONTENTFUL + DEV_TO + DOCUSIGN + DRIBBBLE + DROPBOX + EGGHEADIO + EVENTIL + FACEBOOK + FIREBASE + GITHUB + GMAIL + GOOGLE + GOOGLE_ADS + GOOGLE_ANALYTICS + GOOGLE_CALENDAR + GOOGLE_COMPUTE + GOOGLE_DOCS + GOOGLE_SEARCH_CONSOLE + GOOGLE_TRANSLATE + HUBSPOT + INTERCOM + MAILCHIMP + MEETUP + NETLIFY + NOTION + PRODUCT_HUNT + QUICKBOOKS + SALESFORCE + SLACK + SPOTIFY + STRIPE + TRELLO + TWILIO + TWITTER + TWITCH_TV + YNAB + YOUTUBE + ZEIT + ZENDESK + AIRTABLE + APOLLO + BREX + BUNDLEPHOBIA + CHARGEBEE + CLEARBIT + CLOUDFLARE + CRUNCHBASE + DESCURI + FEDEX + GOOGLE_MAPS + GRAPHCMS + IMMIGRATION_GRAPH + LOGDNA + MIXPANEL + MUX + NPM + ONEGRAPH + ORBIT + OPEN_COLLECTIVE + RSS + UPS + USPS + WORDPRESS +} + +"""Filter linked nodes by service.""" +input OneGraphLinkedNodesServiceFilter { + """ + Checks for linked nodes where the service is in the list of the provided values. + """ + in: [OneGraphServiceEnumArg!] + + """ + Checks for linked nodes where the service is equal to the provided value. + """ + equalTo: OneGraphServiceEnumArg +} + +input OneGraphLinkedNodesConnectionFilter { + """Filter connections by their GraphQL __typename""" + typename: OneGraphLinkedNodesTypenameFilter + + """Filter connections by service""" + service: OneGraphLinkedNodesServiceFilter +} + +"""An object with a globally unique id across all of OneGraph""" +interface OneGraphNode { + """The id of the object.""" + oneGraphId: ID! + + """List of OneGraphNodes that are linked from this node.""" + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! +} + +"""List of OneGraphNodes that are linked from this node.""" +type OneGraphLinkedNodesConnection { + """List of OneGraphNodes that are linked from this node.""" + nodes: [OneGraphNode!]! +} + +"""An OAuth scope that the service supports.""" +type OneGraphServiceScope { + category: String + scope: String! + display: String! + isDefault: Boolean! + isRequired: Boolean! + description: String! + title: String +} + +"""Information about a service that OneGraph supports.""" +type OneGraphServiceInfo implements OneGraphNode { + service: OneGraphServiceEnum! + friendlyServiceName: String! + + """ + Service string that can be provided in the URL when going through the oauth flow. + """ + slug: String! + supportsOauthLogin: Boolean! + supportsCustomServiceAuth: Boolean! + supportsCustomRedirectUri: Boolean! + supportsTestFlow: Boolean! + availableScopes: [OneGraphServiceScope!] + + """A short-lived svg image url of the logo for the service. May be null.""" + logoUrl: String + oneGraphLinkedNodes( + """Filter the connected nodes that are returned by service or typename.""" + filter: OneGraphLinkedNodesConnectionFilter + ): OneGraphLinkedNodesConnection! + + """Unique id across all of OneGraph""" + oneGraphId: ID! +} + +"""Services supported by OneGraph.""" +enum OneGraphServiceEnum { + ADROLL + ASANA + BOX + CONTENTFUL + DEV_TO + DOCUSIGN + DRIBBBLE + DROPBOX + EGGHEADIO + EVENTIL + FACEBOOK + FIREBASE + GITHUB + GMAIL + GOOGLE + GOOGLE_ADS + GOOGLE_ANALYTICS + GOOGLE_CALENDAR + GOOGLE_COMPUTE + GOOGLE_DOCS + GOOGLE_SEARCH_CONSOLE + GOOGLE_TRANSLATE + HUBSPOT + INTERCOM + MAILCHIMP + MEETUP + NETLIFY + NOTION + PRODUCT_HUNT + QUICKBOOKS + SALESFORCE + SLACK + SPOTIFY + STRIPE + TRELLO + TWILIO + TWITTER + TWITCH_TV + YNAB + YOUTUBE + ZEIT + ZENDESK + AIRTABLE + APOLLO + BREX + BUNDLEPHOBIA + CHARGEBEE + CLEARBIT + CLOUDFLARE + CRUNCHBASE + DESCURI + FEDEX + GOOGLE_MAPS + GRAPHCMS + IMMIGRATION_GRAPH + LOGDNA + MIXPANEL + MUX + NPM + ONEGRAPH + ORBIT + OPEN_COLLECTIVE + RSS + UPS + USPS + WORDPRESS +} + +"""Information about a service.""" +type OneGraphServiceMetadata { + service: OneGraphServiceEnum! + friendlyServiceName: String! + isLoggedIn: Boolean! + usedTestFlow: Boolean! + foreignUserId: String + + """ + Bearer token that can be used to query the underlying API directly. This field will always be null unless the OneGraph App has enabled sharing tokens for its custom OAuth client. + """ + bearerToken: String + serviceInfo: OneGraphServiceInfo! + + """ + The scopes that the user granted for this service. This is a best estimate of the scopes that were granted. Most services do not have a way to query the scopes on an auth, and some services do not return information about the scopes that were granted in the auth flow. + """ + grantedScopes: [OneGraphServiceMetadataGrantedScope!] +} + +"""Information about OneGraph services""" +type OneGraphServicesMetadata { + loggedInServices: [OneGraphServiceMetadata!]! + adroll: OneGraphServiceMetadata! + asana: OneGraphServiceMetadata! + box: OneGraphServiceMetadata! + contentful: OneGraphServiceMetadata! + devTo: OneGraphServiceMetadata! + docusign: OneGraphServiceMetadata! + dribbble: OneGraphServiceMetadata! + dropbox: OneGraphServiceMetadata! + eggheadio: OneGraphServiceMetadata! + eventil: OneGraphServiceMetadata! + facebookBusiness: OneGraphServiceMetadata! + firebase: OneGraphServiceMetadata! + gitHub: OneGraphServiceMetadata! + gmail: OneGraphServiceMetadata! + google: OneGraphServiceMetadata! + googleAds: OneGraphServiceMetadata! + googleAnalytics: OneGraphServiceMetadata! + googleCalendar: OneGraphServiceMetadata! + googleCompute: OneGraphServiceMetadata! + googleDocs: OneGraphServiceMetadata! + googleSearchConsole: OneGraphServiceMetadata! + googleTranslate: OneGraphServiceMetadata! + hubspot: OneGraphServiceMetadata! + intercom: OneGraphServiceMetadata! + mailchimp: OneGraphServiceMetadata! + meetup: OneGraphServiceMetadata! + netlify: OneGraphServiceMetadata! + notion: OneGraphServiceMetadata! + productHunt: OneGraphServiceMetadata! + quickbooks: OneGraphServiceMetadata! + salesforce: OneGraphServiceMetadata! + slack: OneGraphServiceMetadata! + spotify: OneGraphServiceMetadata! + stripe: OneGraphServiceMetadata! + trello: OneGraphServiceMetadata! + twilio: OneGraphServiceMetadata! + twitter: OneGraphServiceMetadata! + twitchTv: OneGraphServiceMetadata! + ynab: OneGraphServiceMetadata! + youTube: OneGraphServiceMetadata! + zeit: OneGraphServiceMetadata! + zendesk: OneGraphServiceMetadata! + airtable: OneGraphServiceMetadata! + apollo: OneGraphServiceMetadata! + brex: OneGraphServiceMetadata! + bundlephobia: OneGraphServiceMetadata! + chargebee: OneGraphServiceMetadata! + clearbit: OneGraphServiceMetadata! + cloudflare: OneGraphServiceMetadata! + crunchbase: OneGraphServiceMetadata! + descuri: OneGraphServiceMetadata! + fedex: OneGraphServiceMetadata! + googleMaps: OneGraphServiceMetadata! + graphcms: OneGraphServiceMetadata! + immigrationGraph: OneGraphServiceMetadata! + logdna: OneGraphServiceMetadata! + mixpanel: OneGraphServiceMetadata! + mux: OneGraphServiceMetadata! + npm: OneGraphServiceMetadata! + onegraph: OneGraphServiceMetadata! + orbit: OneGraphServiceMetadata! + openCollective: OneGraphServiceMetadata! + rss: OneGraphServiceMetadata! + ups: OneGraphServiceMetadata! + usps: OneGraphServiceMetadata! + wordpress: OneGraphServiceMetadata! + facebook: OneGraphServiceMetadata! @deprecated(reason: "Use facebookBusiness.") +} + +"""Currently authed user""" +type Viewer { + """Metadata and logged-in state for all OneGraph services""" + serviceMetadata: OneGraphServicesMetadata! + + """Currently logged in oneUser""" + oneGraph: OneGraphUser +} + +type Query { + me( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): Viewer! + + """Fetches an object given its globally unique `oneGraphId`.""" + oneGraphNode( + """The globally unique `oneGraphId`.""" + oneGraphId: ID! + + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): OneGraphNode + + """The root for npm queries""" + npm( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): NpmQuery! + oneGraph( + """ + Instruct OneGraph to use the auth associated with a particular user. + + Note that the user must have gone through the OneGraph oauth flow and logged in with an account with the userId provided in the auth. If there is no user with the account, you may get an auth/auth-missing error. + + The userIds for logged-in services can be found under `me.serviceMetadata.loggedInServices.foreignUserId`. + """ + userIds: OneGraphServiceUserIds + + """Optional OAuth tokens used to execute the query""" + auths: OneGraphServiceAuths + ): OneGraphServiceQuery! +} \ No newline at end of file diff --git a/tests/command.graph.test.js b/tests/command.graph.test.js new file mode 100644 index 00000000000..d05ee3d065f --- /dev/null +++ b/tests/command.graph.test.js @@ -0,0 +1,14 @@ +const test = require('ava') + +const callCli = require('./utils/call-cli') +const { normalize } = require('./utils/snapshots') + +test('netlify graph', async (t) => { + const cliResponse = await callCli(['graph']) + t.snapshot(normalize(cliResponse)) +}) + +test('netlify graph completion', async (t) => { + const cliResponse = await callCli(['graph', 'pull']) + t.snapshot(normalize(cliResponse)) +}) diff --git a/tests/graph-codegen.test.js b/tests/graph-codegen.test.js new file mode 100644 index 00000000000..06d004645dd --- /dev/null +++ b/tests/graph-codegen.test.js @@ -0,0 +1,101 @@ +const fs = require('fs') +const { join } = require('path') + +const test = require('ava') + +const { + buildSchema, + extractFunctionsFromOperationDoc, + generateFunctionsSource, + generateHandlerSource, + parse, +} = require('../src/lib/one-graph/cli-netlify-graph') + +const { normalize } = require('./utils/snapshots') + +const netlifyGraphConfig = { + extension: 'js', + netlifyGraphPath: 'netlify', + moduleType: 'commonjs', + functionsPath: ['functions'], + netlifyGraphImplementationFilename: 'dummy/index.js', + netlifyGraphTypeDefinitionsFilename: 'dummy/index.d.ts', + graphQLOperationsSourceFilename: 'dummy/netlifyGraphOperationsLibrary.graphql', + graphQLSchemaFilename: 'dummy/netlifyGraphSchema.graphql', +} + +const loadAsset = (filename) => fs.readFileSync(join(__dirname, 'assets', filename), 'utf8') + +test('netlify graph function codegen', (t) => { + const schemaString = loadAsset('../assets/netlifyGraphSchema.graphql') + const schema = buildSchema(schemaString) + + const appOperationsDoc = loadAsset('../assets/netlifyGraphOperationsLibrary.graphql') + const parsedDoc = parse(appOperationsDoc, { + noLocation: true, + }) + + const operations = extractFunctionsFromOperationDoc(parsedDoc) + const generatedFunctions = generateFunctionsSource(netlifyGraphConfig, schema, appOperationsDoc, operations) + + t.snapshot(normalize(JSON.stringify(generatedFunctions))) +}) + +test('netlify graph handler codegen', (t) => { + const schemaString = loadAsset('../assets/netlifyGraphSchema.graphql') + const schema = buildSchema(schemaString) + + const appOperationsDoc = loadAsset('../assets/netlifyGraphOperationsLibrary.graphql') + + // From the asset GraphQL file + const operationId = 'd86699fb-ddfc-4833-9d9a-f3497cb7c992' + const handlerOptions = {} + const result = generateHandlerSource({ + netlifyGraphConfig, + schema, + operationsDoc: appOperationsDoc, + operationId, + handlerOptions, + }) + + if (!result) { + return + } + + const { exportedFiles, operation } = result + + if (!exportedFiles) { + return + } + + const sources = [] + + exportedFiles.forEach((exportedFile) => { + const { content } = exportedFile + const isNamed = exportedFile.kind === 'NamedExportedFile' + + let filenameArr + + if (isNamed) { + filenameArr = [...exportedFile.name] + } else { + const operationName = (operation.name && operation.name.value) || 'Unnamed' + const fileExtension = netlifyGraphConfig.language === 'typescript' ? 'ts' : netlifyGraphConfig.extension + const defaultBaseFilename = `${operationName}.${fileExtension}` + const baseFilename = defaultBaseFilename + + filenameArr = [...netlifyGraphConfig.functionsPath, baseFilename] + } + + const dummyPath = filenameArr.join('|') + + sources.push([dummyPath, content]) + }) + + const textualSource = sources + .sort(([filenameA], [filenameB]) => filenameA[0].localeCompare(filenameB[0])) + .map(([filename, content]) => `${filename}: ${content}`) + .join('/-----------------/') + + t.snapshot(normalize(JSON.stringify(textualSource))) +}) diff --git a/tests/snapshots/command.graph.test.js.md b/tests/snapshots/command.graph.test.js.md new file mode 100644 index 00000000000..3d137590b47 --- /dev/null +++ b/tests/snapshots/command.graph.test.js.md @@ -0,0 +1,53 @@ +# Snapshot report for `tests/command.graph.test.js` + +The actual snapshot is saved in `command.graph.test.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## netlify graph + +> Snapshot 1 + + `(Beta) Control the Netlify Graph functions for the current site␊ + ␊ + USAGE␊ + $ netlify graph [options]␊ + ␊ + OPTIONS␊ + -h, --help display help for command␊ + --debug Print debugging information␊ + --httpProxy [address] Proxy server address to route requests through.␊ + --httpProxyCertificateFilename [file] Certificate file to use when connecting using a proxy server␊ + ␊ + EXAMPLES␊ + $ netlify graph:pull␊ + $ netlify graph:edit␊ + ␊ + COMMANDS␊ + $ graph:edit Launch the browser to edit your local graph functions from Netlify␊ + $ graph:pull Pull down your local Netlify Graph schema, and process pending Graph edit events␊ + ` + +## netlify graph completion + +> Snapshot 1 + + `(Beta) Control the Netlify Graph functions for the current site␊ + ␊ + USAGE␊ + $ netlify graph [options]␊ + ␊ + OPTIONS␊ + -h, --help display help for command␊ + --debug Print debugging information␊ + --httpProxy [address] Proxy server address to route requests through.␊ + --httpProxyCertificateFilename [file] Certificate file to use when connecting using a proxy server␊ + ␊ + EXAMPLES␊ + $ netlify graph:pull␊ + $ netlify graph:edit␊ + ␊ + COMMANDS␊ + $ graph:edit Launch the browser to edit your local graph functions from Netlify␊ + $ graph:pull Pull down your local Netlify Graph schema, and process pending Graph edit events␊ + ` diff --git a/tests/snapshots/command.graph.test.js.snap b/tests/snapshots/command.graph.test.js.snap new file mode 100644 index 00000000000..0d166d75649 Binary files /dev/null and b/tests/snapshots/command.graph.test.js.snap differ diff --git a/tests/snapshots/command.help.test.js.md b/tests/snapshots/command.help.test.js.md index 498a23d75d9..bfdc8989c5b 100644 --- a/tests/snapshots/command.help.test.js.md +++ b/tests/snapshots/command.help.test.js.md @@ -23,6 +23,8 @@ Generated by [AVA](https://avajs.dev). $ dev Local dev server␊ $ env (Beta) Control environment variables for the current site␊ $ functions Manage netlify functions␊ + $ graph (Beta) Control the Netlify Graph functions for the current␊ + site␊ $ init Configure continuous deployment for a new or existing site. To␊ create a new site without continuous deployment, use \`netlify␊ sites:create\`␊ diff --git a/tests/snapshots/command.help.test.js.snap b/tests/snapshots/command.help.test.js.snap index 497c1fdc633..4cecc3cc7ab 100644 Binary files a/tests/snapshots/command.help.test.js.snap and b/tests/snapshots/command.help.test.js.snap differ diff --git a/tests/snapshots/graph-codegen.test.js.md b/tests/snapshots/graph-codegen.test.js.md new file mode 100644 index 00000000000..b5843f754aa --- /dev/null +++ b/tests/snapshots/graph-codegen.test.js.md @@ -0,0 +1,17 @@ +# Snapshot report for `tests/graph-codegen.test.js` + +The actual snapshot is saved in `graph-codegen.test.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## netlify graph function codegen + +> Snapshot 1 + + '{"clientSource":"// GENERATED VIA NETLIFY AUTOMATED DEV TOOLS, EDIT WITH CAUTION!/nconst https = require(/"https/")/nconst crypto = require(/"crypto/")/n/nexports.verifySignature = (input) => {/n const secret = input.secret/n const body = input.body/n const signature = input.signature/n/n if (!signature) {/n console.error(\'Missing signature\')/n return false/n }/n/n const sig = {}/n for (const pair of signature.split(\',\')) {/n const [k, v] = pair.split(\'=\')/n sig[k] = v/n }/n/n if (!sig.t || !sig.hmac_sha256) {/n console.error(\'Invalid signature header\')/n return false/n }/n/n const hash = crypto/n .createHmac(\'sha256\', secret)/n .update(sig.t)/n .update(\'.\')/n .update(body)/n .digest(\'hex\')/n/n if (/n !crypto.timingSafeEqual(/n Buffer.from(hash, \'hex\'),/n Buffer.from(sig.hmac_sha256, \'hex\')/n )/n ) {/n console.error(\'Invalid signature\')/n return false/n }/n/n if (parseInt(sig.t, 10) < Date.now() / 1000 - 300 /* 5 minutes */) {/n console.error(\'Request is too old\')/n return false/n }/n/n return true/n}/n/nconst operationsDoc = `query ExampleQuery($package: String!) @netlify(id: /"d88888fb-ddfc-4833-9d9a-f3497cb7c992/", doc: /"A test query to snapshot/") {/n npm {/n package(name: $package) {/n id/n readme/n license {/n url/n }/n }/n }/n}`/n/n/nconst fetch = (appId, options) => {/n var reqBody = options.body || null/n const userHeaders = options.headers || {}/n const headers = {/n ...userHeaders,/n \'Content-Type\': \'application/json\',/n \'Content-Length\': reqBody.length,/n }/n/n var reqOptions = {/n method: \'POST\',/n headers: headers,/n timeout: 88888,/n }/n/n const url = \'https://serve.onegraph.com/graphql?app_id=\' + appId/n/n const respBody = []/n/n return new Promise((resolve, reject) => {/n var req = https.request(url, reqOptions, (res) => {/n if (res.statusCode < 200 || res.statusCode > 299) {/n return reject(/n new Error(/n /"Netlify OneGraph return non - OK HTTP status code/" + res.statusCode,/n ),/n )/n }/n/n res.on(\'data\', (chunk) => respBody.push(chunk))/n/n res.on(\'end\', () => {/n const resString = Buffer.concat(respBody).toString()/n resolve(resString)/n })/n })/n/n req.on(\'error\', (e) => {/n console.error(\'Error making request to Netlify OneGraph: \', e)/n })/n/n req.on(\'timeout\', () => {/n req.destroy()/n reject(new Error(\'Request to Netlify OneGraph timed out\'))/n })/n/n req.write(reqBody)/n req.end()/n })/n}/n/nconst fetchOneGraphPersisted = async function fetchOneGraphPersisted(/n accessToken,/n docId,/n operationName,/n variables,/n) {/n const payload = {/n doc_id: docId,/n variables: variables,/n operationName: operationName,/n }/n/n const result = await fetch(/n process.env.SITE_ID,/n {/n method: \'POST\',/n headers: {/n Authorization: accessToken ? /"Bearer /" + accessToken : \'\',/n },/n body: JSON.stringify(payload),/n },/n )/n/n // @ts-ignore/n return JSON.parse(result)/n}/n/nconst fetchOneGraph = async function fetchOneGraph(/n accessToken,/n query,/n operationName,/n variables,/n) {/n const payload = {/n query: query,/n variables: variables,/n operationName: operationName,/n }/n/n const result = await fetch(/n process.env.SITE_ID,/n {/n method: \'POST\',/n headers: {/n Authorization: accessToken ? /"Bearer /" + accessToken : \'\',/n },/n body: JSON.stringify(payload),/n },/n )/n/n // @ts-ignore/n return JSON.parse(result)/n}/n/n/nexports.verifyRequestSignature = (request) => {/n const event = request.event/n const secret = process.env.NETLIFY_GRAPH_WEBHOOK_SECRET/n const signature = event.headers[\'x-onegraph-signature\']/n const body = event.body/n/n if (!secret) {/n console.error(/n \'NETLIFY_GRAPH_WEBHOOK_SECRET is not set, cannot verify incoming webhook request\'/n )/n return false/n }/n/n return verifySignature({ secret, signature, body: body || \'\' })/n}/n/nexports.fetchExampleQuery = (/n variables,/n accessToken,/n) => {/n return fetchOneGraph(accessToken, operationsDoc, /"ExampleQuery/", variables)/n}/n/n/n /n/**/n * The generated NetlifyGraph library with your operations/n *//nconst functions = {/n /**/n * A test query to snapshot/n *//n fetchExampleQuery: exports.fetchExampleQuery/n}/n/nexports.default = functions/n/nexports.handler = async (event, context) => {/n // return a 401 json response/n return {/n statusCode: 401,/n body: JSON.stringify({/n message: \'Unauthorized\',/n }),/n }/n}","typeDefinitionsSource":"// GENERATED VIA NETLIFY AUTOMATED DEV TOOLS, EDIT WITH CAUTION!/n/**/n * A test query to snapshot/n *//nexport function fetchExampleQuery(/n variables: {/"package/": string},/n accessToken?: string/n): Promise}/n>;/n","functionDefinitions":[{"id":"d88888fb-ddfc-4833-9d9a-f3497cb7c992","operationString":"query ExampleQuery($package: String!) @netlify(id: /"d88888fb-ddfc-4833-9d9a-f3497cb7c992/", doc: /"A test query to snapshot/") {/n npm {/n package(name: $package) {/n id/n readme/n license {/n url/n }/n }/n }/n}","description":"A test query to snapshot","fnName":"fetchExampleQuery","safeBody":"query ExampleQuery($package: String!) @netlify(id: /"d88888fb-ddfc-4833-9d9a-f3497cb7c992/", doc: /"A test query to snapshot/") {/n npm {/n package(name: $package) {/n id/n readme/n license {/n url/n }/n }/n }/n}","kind":"query","variableSignature":"{/"package/": string}","returnSignature":"{/**/n * Any data retrieved by the function will be returned here/n *//n /"data/": {/n /**/n * The root for npm queries/n *//n /"npm/": {/n /**/n * Find a npm package member by its npm name, e.g. `/"fela/"`/n *//n /"package/": {/n /**/n * The package name, used as an ID in CouchDB/n *//n /"id/": string, /**/n * The first 64K of the README data for the most-recently published version of the package/n *//n /"readme/": string, /**/n * The license for this package/n *//n /"license/": {/n /**/n * A url for the full license/n *//n /"url/": string/n }/n }/n }/n }, /**/n * Any errors in the function will be returned here/n *//n /"errors/": Array}","operationName":"ExampleQuery","parsedOperation":{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ExampleQuery","loc":{"start":6,"end":18}},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"package","loc":{"start":20,"end":27}},"loc":{"start":19,"end":27}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String","loc":{"start":29,"end":35}},"loc":{"start":29,"end":35}},"loc":{"start":29,"end":36}},"directives":[],"loc":{"start":19,"end":36}}],"directives":[{"kind":"Directive","name":{"kind":"Name","value":"netlify","loc":{"start":39,"end":46}},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id","loc":{"start":47,"end":49}},"value":{"kind":"StringValue","value":"d88888fb-ddfc-4833-9d9a-f3497cb7c992","block":false,"loc":{"start":51,"end":89}},"loc":{"start":47,"end":89}},{"kind":"Argument","name":{"kind":"Name","value":"doc","loc":{"start":91,"end":94}},"value":{"kind":"StringValue","value":"A test query to snapshot","block":false,"loc":{"start":96,"end":122}},"loc":{"start":91,"end":122}}],"loc":{"start":38,"end":123}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"npm","loc":{"start":128,"end":131}},"arguments":[],"directives":[],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"package","loc":{"start":138,"end":145}},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"name","loc":{"start":146,"end":150}},"value":{"kind":"Variable","name":{"kind":"Name","value":"package","loc":{"start":153,"end":160}},"loc":{"start":152,"end":160}},"loc":{"start":146,"end":160}}],"directives":[],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id","loc":{"start":170,"end":172}},"arguments":[],"directives":[],"loc":{"start":170,"end":172}},{"kind":"Field","name":{"kind":"Name","value":"readme","loc":{"start":179,"end":185}},"arguments":[],"directives":[],"loc":{"start":179,"end":185}},{"kind":"Field","name":{"kind":"Name","value":"license","loc":{"start":192,"end":199}},"arguments":[],"directives":[],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"url","loc":{"start":210,"end":213}},"arguments":[],"directives":[],"loc":{"start":210,"end":213}}],"loc":{"start":200,"end":221}},"loc":{"start":192,"end":221}}],"loc":{"start":162,"end":227}},"loc":{"start":138,"end":227}}],"loc":{"start":132,"end":231}},"loc":{"start":128,"end":231}}],"loc":{"start":124,"end":233}},"loc":{"start":0,"end":233}},"operationStringWithoutNetlifyDirective":"query ExampleQuery($package: String!) {/n npm {/n package(name: $package) {/n id/n readme/n license {/n url/n }/n }/n }/n}"}]}' + +## netlify graph handler codegen + +> Snapshot 1 + + '"functions|ExampleQuery.js: const { getSecrets } = require(/"@netlify/functions/");/nconst NetlifyGraph = require(/"./netlifyGraph/")/n/nexports.handler = async (event, context) => {/n // By default, all API calls use no authentication/n let accessToken = null;/n/n //// If you want to use the client\'s accessToken when making API calls on the user\'s behalf:/n // accessToken = event.headers[/"authorization/"]?.split(/" /")[1]/n/n //// If you want to use the API with your own access token:/n // accessToken = (await getSecrets(event))?.oneGraph?.bearerToken;/n /n const eventBodyJson = JSON.parse(event.body || /"{}/");/n/n const _package = event.queryStringParameters?.package;/n/n if (_package === undefined || _package === null) {/n return {/n statusCode: 422,/n body: JSON.stringify({/n error: \'You must supply parameters for: `package`\'/n }),/n };/n }/n/n const { errors: ExampleQueryErrors, data: ExampleQueryData } =/n await NetlifyGraph.fetchExampleQuery({ package: _package }, accessToken);/n/n if (ExampleQueryErrors) {/n console.error(JSON.stringify(ExampleQueryErrors, null, 2));/n }/n/n console.log(JSON.stringify(ExampleQueryData, null, 2));/n/n return {/n statusCode: 200,/n body: JSON.stringify({/n success: true,/n ExampleQueryErrors: ExampleQueryErrors,/n ExampleQueryData: ExampleQueryData/n }),/n headers: {/n \'content-type\': \'application/json\',/n },/n };/n};/n/n/** /n * Client-side invocations:/n * Call your Netlify function from the browser (after saving/n * the code to `ExampleQuery.js`) with these helpers:/n *//n/n/**/nasync function fetchExampleQuery(params) {/n const {package} = params || {};/n const resp = await fetch(`/.netlify/functions/ExampleQuery?package=${package}`,/n {/n method: /"GET/"/n });/n/n const text = await resp.text();/n/n return JSON.parse(text);/n}/n*//n"' diff --git a/tests/snapshots/graph-codegen.test.js.snap b/tests/snapshots/graph-codegen.test.js.snap new file mode 100644 index 00000000000..7870c642fa6 Binary files /dev/null and b/tests/snapshots/graph-codegen.test.js.snap differ