From ae6ed501c91e331d91d99b7b01ca267d1a856c03 Mon Sep 17 00:00:00 2001 From: Yusuke Wada Date: Tue, 13 Dec 2022 16:32:51 +0900 Subject: [PATCH] fix: bump up Hono and make it `peerDependencies` to fix type mismatch (#21) * fix: bump up Hono and make it 'peerDependencies' to fix type mismatch * fix for lint --- bun_test/index.test.ts | 6 +- deno_dist/README.md | 16 ++-- deno_dist/index.ts | 202 ++++++++++++++++++----------------------- deno_test/hono.test.ts | 61 ++++++------- package.json | 22 +++-- src/replacer.ts | 16 ++++ yarn.lock | 103 ++++++++++++++------- 7 files changed, 231 insertions(+), 195 deletions(-) create mode 100644 src/replacer.ts diff --git a/bun_test/index.test.ts b/bun_test/index.test.ts index 63010144..9d8cbaa1 100644 --- a/bun_test/index.test.ts +++ b/bun_test/index.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from 'bun:test' import { buildSchema, GraphQLSchema, @@ -6,8 +7,7 @@ import { GraphQLNonNull, } from 'graphql' import { Hono } from 'hono' -import { errorMessages, graphqlServer } from '../src/index' -import { describe, expect, it } from 'bun:test' +import { graphqlServer } from '../src/index' // Test just only minimal patterns. // Because others are tested well in Cloudflare Workers environment already. @@ -31,7 +31,7 @@ describe('graphql-server', () => { '/graphql', graphqlServer({ schema, - rootValue, + rootResolver: () => rootValue, }) ) diff --git a/deno_dist/README.md b/deno_dist/README.md index 371c8def..b7897dd1 100644 --- a/deno_dist/README.md +++ b/deno_dist/README.md @@ -4,14 +4,14 @@ This middleware depends on [GraphQL.js](https://www.npmjs.com/package/graphql). -```plain -npm i graphql +```sh +npm i @honojs/graphql-server ``` or ```plain -yarn add graphql +yarn add @honojs/graphql-server ``` ## Usage @@ -20,7 +20,7 @@ index.js: ```js import { Hono } from 'hono' -import { graphqlServer } from 'hono/graphql-server' +import { graphqlServer } from '@honojs/graphql-server' import { buildSchema } from 'graphql' export const app = new Hono() @@ -31,15 +31,17 @@ type Query { } `) -const rootValue = { - hello: () => 'Hello Hono!', +const rootResolver = (ctx) => { + return { + hello: () => 'Hello Hono!', + } } app.use( '/graphql', graphqlServer({ schema, - rootValue, + rootResolver, }) ) diff --git a/deno_dist/index.ts b/deno_dist/index.ts index a9f20dbb..277f1f7b 100644 --- a/deno_dist/index.ts +++ b/deno_dist/index.ts @@ -1,6 +1,3 @@ -// Based on the code in the `express-graphql` package. -// https://github.com/graphql/express-graphql/blob/main/src/index.ts - import { Source, parse, @@ -10,7 +7,7 @@ import { specifiedRules, getOperationAST, GraphQLError, -} from "https://cdn.skypack.dev/graphql@16.5.0?dts"; +} from 'https://cdn.skypack.dev/graphql@16.5.0?dts' import type { GraphQLSchema, @@ -18,101 +15,88 @@ import type { ValidationRule, FormattedExecutionResult, GraphQLFormattedError, -} from "https://cdn.skypack.dev/graphql@16.5.0?dts"; +} from 'https://cdn.skypack.dev/graphql@16.5.0?dts' -import type { Context } from "https://raw.githubusercontent.com/honojs/hono/v2.0.2/deno_dist/mod.ts"; -import type { Next } from "https://raw.githubusercontent.com/honojs/hono/v2.0.2/deno_dist/mod.ts"; -import { parseBody } from "./parse-body.ts"; +import type { Context } from 'https://deno.land/x/hono/mod.ts' +import { parseBody } from './parse-body.ts' + +export type RootResolver = (ctx?: Context) => Promise | unknown type Options = { - schema: GraphQLSchema; - rootValue?: unknown; - pretty?: boolean; - validationRules?: ReadonlyArray; + schema: GraphQLSchema + rootResolver?: RootResolver, + pretty?: boolean + validationRules?: ReadonlyArray // graphiql?: boolean -}; +} export const graphqlServer = (options: Options) => { - const schema = options.schema; - const rootValue = options.rootValue; - const pretty = options.pretty ?? false; - const validationRules = options.validationRules ?? []; + const schema = options.schema + const pretty = options.pretty ?? false + const validationRules = options.validationRules ?? [] // const showGraphiQL = options.graphiql ?? false - return async (c: Context, next: Next) => { + return async (c: Context) => { // GraphQL HTTP only supports GET and POST methods. - if (c.req.method !== "GET" && c.req.method !== "POST") { - return c.json( - errorMessages(["GraphQL only supports GET and POST requests."]), - 405, - { - Allow: "GET, POST", - } - ); + if (c.req.method !== 'GET' && c.req.method !== 'POST') { + return c.json(errorMessages(['GraphQL only supports GET and POST requests.']), 405, { + Allow: 'GET, POST', + }) } - let params: GraphQLParams; + let params: GraphQLParams try { - params = await getGraphQLParams(c.req); + params = await getGraphQLParams(c.req) } catch (e) { if (e instanceof Error) { - console.error(`${e.stack || e.message}`); - return c.json(errorMessages([e.message], [e]), 400); + console.error(`${e.stack || e.message}`) + return c.json(errorMessages([e.message], [e]), 400) } - throw e; + throw e } - const { query, variables, operationName } = params; + const { query, variables, operationName } = params if (query == null) { - return c.json(errorMessages(["Must provide query string."]), 400); + return c.json(errorMessages(['Must provide query string.']), 400) } - const schemaValidationErrors = validateSchema(schema); + const schemaValidationErrors = validateSchema(schema) if (schemaValidationErrors.length > 0) { // Return 500: Internal Server Error if invalid schema. return c.json( - errorMessages( - ["GraphQL schema validation error."], - schemaValidationErrors - ), + errorMessages(['GraphQL schema validation error.'], schemaValidationErrors), 500 - ); + ) } - let documentAST: DocumentNode; + let documentAST: DocumentNode try { - documentAST = parse(new Source(query, "GraphQL request")); + documentAST = parse(new Source(query, 'GraphQL request')) } catch (syntaxError: unknown) { // Return 400: Bad Request if any syntax errors errors exist. if (syntaxError instanceof Error) { - console.error(`${syntaxError.stack || syntaxError.message}`); + console.error(`${syntaxError.stack || syntaxError.message}`) const e = new GraphQLError(syntaxError.message, { originalError: syntaxError, - }); - return c.json(errorMessages(["GraphQL syntax error."], [e]), 400); + }) + return c.json(errorMessages(['GraphQL syntax error.'], [e]), 400) } - throw syntaxError; + throw syntaxError } // Validate AST, reporting any errors. - const validationErrors = validate(schema, documentAST, [ - ...specifiedRules, - ...validationRules, - ]); + const validationErrors = validate(schema, documentAST, [...specifiedRules, ...validationRules]) if (validationErrors.length > 0) { // Return 400: Bad Request if any validation errors exist. - return c.json( - errorMessages(["GraphQL validation error."], validationErrors), - 400 - ); + return c.json(errorMessages(['GraphQL validation error.'], validationErrors), 400) } - if (c.req.method === "GET") { + if (c.req.method === 'GET') { // Determine if this GET request will perform a non-query. - const operationAST = getOperationAST(documentAST, operationName); - if (operationAST && operationAST.operation !== "query") { + const operationAST = getOperationAST(documentAST, operationName) + if (operationAST && operationAST.operation !== 'query') { /* Now , does not support GraphiQL if (showGraphiQL) { @@ -126,43 +110,38 @@ export const graphqlServer = (options: Options) => { `Can only perform a ${operationAST.operation} operation from a POST request.`, ]), 405, - { Allow: "POST" } - ); + { Allow: 'POST' } + ) } } - let result: FormattedExecutionResult; + let result: FormattedExecutionResult + const { rootResolver } = options try { result = await execute({ schema, document: documentAST, - rootValue, + rootValue: rootResolver ? await rootResolver(c) : null, variableValues: variables, operationName: operationName, - }); + }) } catch (contextError: unknown) { if (contextError instanceof Error) { - console.error(`${contextError.stack || contextError.message}`); + console.error(`${contextError.stack || contextError.message}`) const e = new GraphQLError(contextError.message, { originalError: contextError, nodes: documentAST, - }); + }) // Return 400: Bad Request if any execution context errors exist. - return c.json( - errorMessages(["GraphQL execution context error."], [e]), - 400 - ); + return c.json(errorMessages(['GraphQL execution context error.'], [e]), 400) } - throw contextError; + throw contextError } if (!result.data) { if (result.errors) { - return c.json( - errorMessages([result.errors.toString()], result.errors), - 500 - ); + return c.json(errorMessages([result.errors.toString()], result.errors), 500) } } @@ -173,70 +152,65 @@ export const graphqlServer = (options: Options) => { */ if (pretty) { - const payload = JSON.stringify(result, null, pretty ? 2 : 0); + const payload = JSON.stringify(result, null, pretty ? 2 : 0) return c.text(payload, 200, { - "Content-Type": "application/json", - }); + 'Content-Type': 'application/json', + }) } else { - return c.json(result); + return c.json(result) } - - await next(); // XXX - }; -}; - -export interface GraphQLParams { - query: string | null; - variables: { readonly [name: string]: unknown } | null; - operationName: string | null; - raw: boolean; + } } -export const getGraphQLParams = async ( - request: Request -): Promise => { - const urlData = new URLSearchParams(request.url.split("?")[1]); - const bodyData = await parseBody(request); +export interface GraphQLParams { + query: string | null + variables: { readonly [name: string]: unknown } | null + operationName: string | null + raw: boolean +} + +export const getGraphQLParams = async (request: Request): Promise => { + const urlData = new URLSearchParams(request.url.split('?')[1]) + const bodyData = await parseBody(request) // GraphQL Query string. - let query = urlData.get("query") ?? (bodyData.query as string | null); + let query = urlData.get('query') ?? (bodyData.query as string | null) - if (typeof query !== "string") { - query = null; + if (typeof query !== 'string') { + query = null } // Parse the variables if needed. - let variables = (urlData.get("variables") ?? bodyData.variables) as { - readonly [name: string]: unknown; - } | null; - if (typeof variables === "string") { + let variables = (urlData.get('variables') ?? bodyData.variables) as { + readonly [name: string]: unknown + } | null + if (typeof variables === 'string') { try { - variables = JSON.parse(variables); + variables = JSON.parse(variables) } catch { - throw Error("Variables are invalid JSON."); + throw Error('Variables are invalid JSON.') } - } else if (typeof variables !== "object") { - variables = null; + } else if (typeof variables !== 'object') { + variables = null } // Name of GraphQL operation to execute. - let operationName = - urlData.get("operationName") ?? (bodyData.operationName as string | null); - if (typeof operationName !== "string") { - operationName = null; + let operationName = urlData.get('operationName') ?? (bodyData.operationName as string | null) + if (typeof operationName !== 'string') { + operationName = null } - const raw = urlData.get("raw") != null || bodyData.raw !== undefined; + const raw = urlData.get('raw') != null || bodyData.raw !== undefined const params: GraphQLParams = { query: query, variables: variables, operationName: operationName, raw: raw, - }; + } - return params; -}; + return params +} export const errorMessages = ( messages: string[], @@ -245,16 +219,16 @@ export const errorMessages = ( if (graphqlErrors) { return { errors: graphqlErrors, - }; + } } return { errors: messages.map((message) => { return { message: message, - }; + } }), - }; -}; + } +} // export const graphiQLResponse = () => {} diff --git a/deno_test/hono.test.ts b/deno_test/hono.test.ts index fe1f10ef..72a52600 100644 --- a/deno_test/hono.test.ts +++ b/deno_test/hono.test.ts @@ -1,49 +1,48 @@ -import { buildSchema } from "https://cdn.skypack.dev/graphql@16.5.0?dts"; -import { Hono } from "https://deno.land/x/hono@v2.0.3/mod.ts"; -import { errorMessages, graphqlServer } from "../deno_dist/index.ts"; -import { assertEquals } from "https://deno.land/std@0.149.0/testing/asserts.ts"; +import { buildSchema } from 'https://cdn.skypack.dev/graphql@16.5.0?dts' +import { Hono } from 'https://deno.land/x/hono@v2.6.1/mod.ts' +import { graphqlServer } from '../deno_dist/index.ts' +import { assertEquals } from 'https://deno.land/std@0.149.0/testing/asserts.ts' - -Deno.test("graphql-server", async (t) => { +Deno.test('graphql-server', async (t) => { // Construct a schema, using GraphQL schema language const schema = buildSchema(` type Query { hello: String } -`); +`) // The root provides a resolver function for each API endpoint const rootValue = { - hello: () => "Hello world!", - }; + hello: () => 'Hello world!', + } - const app = new Hono(); + const app = new Hono() app.use( - "/graphql", + '/graphql', graphqlServer({ schema, - rootValue, + rootResolver: () => rootValue, }) - ); + ) - app.all("*", (c) => { - c.header("foo", "bar"); - return c.text("fallback"); - }); + app.all('*', (c) => { + c.header('foo', 'bar') + return c.text('fallback') + }) - const query = "query { hello }"; - const body = { - query: query, - }; + const query = 'query { hello }' + const body = { + query: query, + } - const res = await app.request("http://localhost/graphql", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(body), - }); - assertEquals(res.status, 200) - assertEquals(await res.text(), '{"data":{"hello":"Hello world!"}}') -}); + const res = await app.request('http://localhost/graphql', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }) + assertEquals(res.status, 200) + assertEquals(await res.text(), '{"data":{"hello":"Hello world!"}}') +}) diff --git a/package.json b/package.json index 74fd8e18..bded4795 100644 --- a/package.json +++ b/package.json @@ -19,25 +19,27 @@ "test:deno": "deno test deno_test", "test:bun": "bun wiptest bun_test/index.test.ts", "test:all": "yarn test && yarn test:deno && yarn test:bun", - "denoify": "rimraf deno_dist && denoify && rimraf 'deno_dist/**/*.test.ts'", + "denoify": "yarn build && rimraf deno_dist && denoify && rimraf 'deno_dist/**/*.test.ts'", "build": "rimraf dist && tsc --project tsconfig.build.json", "lint": "eslint --ext js,ts src .eslintrc.js", "lint:fix": "eslint --ext js,ts src .eslintrc.js --fix", "release": "npm publish" }, + "denoify": { + "replacer": "dist/replacer.js" + }, + "peerDependencies": { + "hono": "^2.6.1" + }, "dependencies": { - "graphql": "^16.5.0", - "hono": "^2.0.2" + "graphql": "^16.5.0" }, "devDependencies": { "@cloudflare/workers-types": "^3.14.0", "@types/jest": "^28.1.4", - "denoify": "^0.11.1", - "jest": "^28.1.2", - "jest-environment-miniflare": "^2.6.0", "@typescript-eslint/eslint-plugin": "^5.21.0", "@typescript-eslint/parser": "^5.21.0", - "prettier": "^2.7.1", + "denoify": "^1.4.5", "eslint": "^8.14.0", "eslint-config-prettier": "^8.5.0", "eslint-define-config": "^1.4.0", @@ -46,6 +48,10 @@ "eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-import": "^2.26.0", "eslint-plugin-node": "^11.1.0", + "hono": "^2.6.1", + "jest": "^28.1.2", + "jest-environment-miniflare": "^2.6.0", + "prettier": "^2.7.1", "rimraf": "^3.0.2", "ts-jest": "^28.0.5", "typescript": "^4.7.4" @@ -53,4 +59,4 @@ "engines": { "node": ">=11.0.0" } -} +} \ No newline at end of file diff --git a/src/replacer.ts b/src/replacer.ts new file mode 100644 index 00000000..5cbdfea9 --- /dev/null +++ b/src/replacer.ts @@ -0,0 +1,16 @@ +// @denoify-ignore +import { makeThisModuleAnExecutableReplacer, ParsedImportExportStatement } from 'denoify' + +makeThisModuleAnExecutableReplacer(async ({ parsedImportExportStatement }) => { + if (parsedImportExportStatement.parsedArgument.nodeModuleName === 'hono') { + return ParsedImportExportStatement.stringify({ + ...parsedImportExportStatement, + parsedArgument: { + type: 'URL', + url: 'https://deno.land/x/hono/mod.ts', + }, + }) + } + + return undefined +}) diff --git a/yarn.lock b/yarn.lock index 87c70fb3..3a97867a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -947,6 +947,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.6.tgz#0ba49ac517ad69abe7a1508bc9b3a5483df9d5d7" integrity sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/prettier@^2.1.5": version "2.6.3" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" @@ -1412,6 +1417,17 @@ core-util-is@^1.0.2: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + cron-schedule@^3.0.4: version "3.0.6" resolved "https://registry.yarnpkg.com/cron-schedule/-/cron-schedule-3.0.6.tgz#7d0a3ad9154112fc3720fe43238a43d50e8465e7" @@ -1470,23 +1486,26 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -denoify@^0.11.1: - version "0.11.3" - resolved "https://registry.yarnpkg.com/denoify/-/denoify-0.11.3.tgz#cf4378d9d8067d01d379122a2ef1f5ab7a296d15" - integrity sha512-jdpeENTKWa/40CDeUuP+5oSjMoUNk+rF9AWhgjB1Rl5lBTGJw0nbT07/n2bXJ1Mn4piFTMYqXpDVYKap4jXMmg== +denoify@^1.4.5: + version "1.4.5" + resolved "https://registry.yarnpkg.com/denoify/-/denoify-1.4.5.tgz#6c4a0682b051b2d3dc8cca1d7e29611139ca4bd9" + integrity sha512-hk75EoJgI8kCizSAQ8wT7Vmopg67k9+rsos/ScYSFmEk/wMSSgi8xlQMkf99dvNDFck07BgnlywIBLpbs8oU5w== dependencies: "@octokit/rest" "^18.0.0" "@types/comment-json" "^1.1.1" commander "^4.1.1" comment-json "^3.0.2" - evt "^2.2.1" + cosmiconfig "^7.0.1" + evt "^2.4.13" get-github-default-branch-name "^0.0.4" gitignore-parser "0.0.2" glob "^7.1.6" - node-fetch "^2.6.0" + minimal-polyfills "^2.2.2" + node-fetch "^2.6.7" + parse-dont-validate "^4.0.1" path-depth "^1.0.0" - scripting-tools "^0.19.13" - tsafe "^0.10.0" + scripting-tools "^0.19.14" + tsafe "^1.4.1" url-join "^4.0.1" deprecation@^2.0.0, deprecation@^2.3.1: @@ -1838,14 +1857,14 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -evt@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/evt/-/evt-2.2.1.tgz#a3d6b19e92a5fae2801d98e764294c08b8079d78" - integrity sha512-MbzwSxMaZrmg09Q0HeK/W0/xwH3u9jFxb78MAXhhFczjog8gqoaO1IQGCAIOlI7FHW7NzuoCKpjcIyJUva7H3w== +evt@^2.4.13: + version "2.4.13" + resolved "https://registry.yarnpkg.com/evt/-/evt-2.4.13.tgz#5ef873159ce62e099d58801a3e4b8e0f5b648017" + integrity sha512-haTVOsmjzk+28zpzvVwan9Zw2rLQF2izgi7BKjAPRzZAfcv+8scL0TpM8MzvGNKFYHiy+Bq3r6FYIIUPl9kt3A== dependencies: - minimal-polyfills "^2.2.1" - run-exclusive "^2.2.14" - tsafe "^0.10.0" + minimal-polyfills "^2.2.2" + run-exclusive "^2.2.18" + tsafe "^1.4.1" execa@^5.0.0: version "5.1.1" @@ -2151,10 +2170,10 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hono@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hono/-/hono-2.0.2.tgz#5bf8b5be27523245364f8438c9a7151ac4b4d945" - integrity sha512-ge85omRQyDfOHe3EAJEG+leRsoFcwUkWeMD5UX5TMmPxd4mRbiu+yBLCUS/Dn9mUF550i0io1OUI9/6Mz2Xqkg== +hono@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/hono/-/hono-2.6.1.tgz#9e85b69cff97586eb53db329c52961e8eade943b" + integrity sha512-DsJSOkwV2M7TkuRsp8VJrD02ISMsT7BXGUWjPBJS3n1fIx7NQEhat395lo7024w2ibrbmo+5FivUG0vqij9YYg== html-escaper@^2.0.0: version "2.0.2" @@ -2959,11 +2978,16 @@ miniflare@2.6.0: source-map-support "^0.5.20" undici "5.5.1" -minimal-polyfills@^2.1.5, minimal-polyfills@^2.2.1: +minimal-polyfills@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/minimal-polyfills/-/minimal-polyfills-2.2.1.tgz#7249d7ece666d3b4e1ec1c1b8f949eb9d44e2308" integrity sha512-WLmHQrsZob4rVYf8yHapZPNJZ3sspGa/sN8abuSD59b0FifDEE7HMfLUi24z7mPZqTpBXy4Svp+iGvAmclCmXg== +minimal-polyfills@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/minimal-polyfills/-/minimal-polyfills-2.2.2.tgz#6b06a004acce420eb91cf94698f5e6e7f2518378" + integrity sha512-eEOUq/LH/DbLWihrxUP050Wi7H/N/I2dQT98Ep6SqOpmIbk4sXOI4wqalve66QoZa+6oljbZWU6I6T4dehQGmw== + minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -3001,7 +3025,7 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -node-fetch@^2.6.0, node-fetch@^2.6.7: +node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -3142,7 +3166,12 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^5.2.0: +parse-dont-validate@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-dont-validate/-/parse-dont-validate-4.0.2.tgz#4611b40f1e41814f74e71ce49d278a9893d2f7e3" + integrity sha512-e8KvTcCGfIuE7do7m/3DgFbOQ1ddU5y6CioUfD3CLMSHGm0reBAqpl1kfTxT676eaFrWij/k9hhLDJb6XH7J4A== + +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -3319,12 +3348,12 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -run-exclusive@^2.2.14: - version "2.2.14" - resolved "https://registry.yarnpkg.com/run-exclusive/-/run-exclusive-2.2.14.tgz#4f41dc7843e091f10991f8708fce87b09022a0ce" - integrity sha512-NHaQfB3zPJFx7p4M06AcmoK8xz/h8YDMCdy3jxfyoC9VqIbl1U+DiVjUuAYZBRMwvj5qkQnOUGfsmyUC4k46dg== +run-exclusive@^2.2.18: + version "2.2.18" + resolved "https://registry.yarnpkg.com/run-exclusive/-/run-exclusive-2.2.18.tgz#ec930edc3a7044750dc827df9372bde8f610f586" + integrity sha512-TXr1Gkl1iEAOCCpBTRm/2m0+1KGjORcWpZZ+VGGTe7dYX8E4y8/fMvrHk0zf+kclec2R//tpvdBxgG0bDgaJfw== dependencies: - minimal-polyfills "^2.1.5" + minimal-polyfills "^2.2.1" run-parallel@^1.1.9: version "1.2.0" @@ -3338,11 +3367,16 @@ safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -scripting-tools@^0.19.12, scripting-tools@^0.19.13: +scripting-tools@^0.19.12: version "0.19.13" resolved "https://registry.yarnpkg.com/scripting-tools/-/scripting-tools-0.19.13.tgz#836df7d9c2ec99aea91984d1d5b2bd110670afec" integrity sha512-d09H8vzSVa8p4XUTJqHZDbjKDyl5TG3SyPfNPUUkfyOwjwykStmfK8AXyWq7VRWjcgzTpkTiJ9uMk1NytMQY7w== +scripting-tools@^0.19.14: + version "0.19.14" + resolved "https://registry.yarnpkg.com/scripting-tools/-/scripting-tools-0.19.14.tgz#d46cdea3dcf042b103b1712103b007e72c4901d5" + integrity sha512-KGRES70dEmcaCdpx3R88bLWmfA4mQ/EGikCQy0FGTZwx3y9F5yYkzEhwp02+ZTgpvF25JcNOhDBbOqL6z92kwg== + selfsigned@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" @@ -3610,10 +3644,10 @@ ts-jest@^28.0.5: semver "7.x" yargs-parser "^21.0.1" -tsafe@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/tsafe/-/tsafe-0.10.0.tgz#c4fba365a49467ea6167e8c9482ddb94ee51b795" - integrity sha512-CFfa1uJKfU0DDRbuB8bf2mfXjkOqiTsrltexzMMLxq5gjd1LttFECNGsO8dYUALJDbShb6+f3CwAppW/wf9BrA== +tsafe@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/tsafe/-/tsafe-1.4.1.tgz#59cdad8ac41babf88e56dcd1a683ae2fb145d059" + integrity sha512-3IDBalvf6SyvHFS14UiwCWzqdSdo+Q0k2J7DZyJYaHW/iraW9DJpaBKDJpry3yQs3o/t/A+oGaRW3iVt2lKxzA== tsconfig-paths@^3.14.1: version "3.14.1" @@ -3803,6 +3837,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + yargs-parser@^21.0.0, yargs-parser@^21.0.1: version "21.0.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35"