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
pull/29/head
Yusuke Wada 2022-12-13 16:32:51 +09:00 committed by GitHub
parent 4489964e28
commit ae6ed501c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 231 additions and 195 deletions

View File

@ -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,
})
)

View File

@ -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 = {
const rootResolver = (ctx) => {
return {
hello: () => 'Hello Hono!',
}
}
app.use(
'/graphql',
graphqlServer({
schema,
rootValue,
rootResolver,
})
)

View File

@ -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> | unknown
type Options = {
schema: GraphQLSchema;
rootValue?: unknown;
pretty?: boolean;
validationRules?: ReadonlyArray<ValidationRule>;
schema: GraphQLSchema
rootResolver?: RootResolver,
pretty?: boolean
validationRules?: ReadonlyArray<ValidationRule>
// 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;
query: string | null
variables: { readonly [name: string]: unknown } | null
operationName: string | null
raw: boolean
}
export const getGraphQLParams = async (
request: Request
): Promise<GraphQLParams> => {
const urlData = new URLSearchParams(request.url.split("?")[1]);
const bodyData = await parseBody(request);
export const getGraphQLParams = async (request: Request): Promise<GraphQLParams> => {
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 = () => {}

View File

@ -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 query = 'query { hello }'
const body = {
query: query,
};
}
const res = await app.request("http://localhost/graphql", {
method: "POST",
const res = await app.request('http://localhost/graphql', {
method: 'POST',
headers: {
"Content-Type": "application/json",
'Content-Type': 'application/json',
},
body: JSON.stringify(body),
});
})
assertEquals(res.status, 200)
assertEquals(await res.text(), '{"data":{"hello":"Hello world!"}}')
});
})

View File

@ -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"

16
src/replacer.ts 100644
View File

@ -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
})

103
yarn.lock
View File

@ -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"