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 { import {
buildSchema, buildSchema,
GraphQLSchema, GraphQLSchema,
@ -6,8 +7,7 @@ import {
GraphQLNonNull, GraphQLNonNull,
} from 'graphql' } from 'graphql'
import { Hono } from 'hono' import { Hono } from 'hono'
import { errorMessages, graphqlServer } from '../src/index' import { graphqlServer } from '../src/index'
import { describe, expect, it } from 'bun:test'
// Test just only minimal patterns. // Test just only minimal patterns.
// Because others are tested well in Cloudflare Workers environment already. // Because others are tested well in Cloudflare Workers environment already.
@ -31,7 +31,7 @@ describe('graphql-server', () => {
'/graphql', '/graphql',
graphqlServer({ graphqlServer({
schema, schema,
rootValue, rootResolver: () => rootValue,
}) })
) )

View File

@ -4,14 +4,14 @@
This middleware depends on [GraphQL.js](https://www.npmjs.com/package/graphql). This middleware depends on [GraphQL.js](https://www.npmjs.com/package/graphql).
```plain ```sh
npm i graphql npm i @honojs/graphql-server
``` ```
or or
```plain ```plain
yarn add graphql yarn add @honojs/graphql-server
``` ```
## Usage ## Usage
@ -20,7 +20,7 @@ index.js:
```js ```js
import { Hono } from 'hono' import { Hono } from 'hono'
import { graphqlServer } from 'hono/graphql-server' import { graphqlServer } from '@honojs/graphql-server'
import { buildSchema } from 'graphql' import { buildSchema } from 'graphql'
export const app = new Hono() export const app = new Hono()
@ -31,15 +31,17 @@ type Query {
} }
`) `)
const rootValue = { const rootResolver = (ctx) => {
hello: () => 'Hello Hono!', return {
hello: () => 'Hello Hono!',
}
} }
app.use( app.use(
'/graphql', '/graphql',
graphqlServer({ graphqlServer({
schema, 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 { import {
Source, Source,
parse, parse,
@ -10,7 +7,7 @@ import {
specifiedRules, specifiedRules,
getOperationAST, getOperationAST,
GraphQLError, GraphQLError,
} from "https://cdn.skypack.dev/graphql@16.5.0?dts"; } from 'https://cdn.skypack.dev/graphql@16.5.0?dts'
import type { import type {
GraphQLSchema, GraphQLSchema,
@ -18,101 +15,88 @@ import type {
ValidationRule, ValidationRule,
FormattedExecutionResult, FormattedExecutionResult,
GraphQLFormattedError, 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 { Context } from 'https://deno.land/x/hono/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 { parseBody } from "./parse-body.ts";
export type RootResolver = (ctx?: Context) => Promise<unknown> | unknown
type Options = { type Options = {
schema: GraphQLSchema; schema: GraphQLSchema
rootValue?: unknown; rootResolver?: RootResolver,
pretty?: boolean; pretty?: boolean
validationRules?: ReadonlyArray<ValidationRule>; validationRules?: ReadonlyArray<ValidationRule>
// graphiql?: boolean // graphiql?: boolean
}; }
export const graphqlServer = (options: Options) => { export const graphqlServer = (options: Options) => {
const schema = options.schema; const schema = options.schema
const rootValue = options.rootValue; const pretty = options.pretty ?? false
const pretty = options.pretty ?? false; const validationRules = options.validationRules ?? []
const validationRules = options.validationRules ?? [];
// const showGraphiQL = options.graphiql ?? false // const showGraphiQL = options.graphiql ?? false
return async (c: Context, next: Next) => { return async (c: Context) => {
// GraphQL HTTP only supports GET and POST methods. // GraphQL HTTP only supports GET and POST methods.
if (c.req.method !== "GET" && c.req.method !== "POST") { if (c.req.method !== 'GET' && c.req.method !== 'POST') {
return c.json( return c.json(errorMessages(['GraphQL only supports GET and POST requests.']), 405, {
errorMessages(["GraphQL only supports GET and POST requests."]), Allow: 'GET, POST',
405, })
{
Allow: "GET, POST",
}
);
} }
let params: GraphQLParams; let params: GraphQLParams
try { try {
params = await getGraphQLParams(c.req); params = await getGraphQLParams(c.req)
} catch (e) { } catch (e) {
if (e instanceof Error) { if (e instanceof Error) {
console.error(`${e.stack || e.message}`); console.error(`${e.stack || e.message}`)
return c.json(errorMessages([e.message], [e]), 400); 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) { 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) { if (schemaValidationErrors.length > 0) {
// Return 500: Internal Server Error if invalid schema. // Return 500: Internal Server Error if invalid schema.
return c.json( return c.json(
errorMessages( errorMessages(['GraphQL schema validation error.'], schemaValidationErrors),
["GraphQL schema validation error."],
schemaValidationErrors
),
500 500
); )
} }
let documentAST: DocumentNode; let documentAST: DocumentNode
try { try {
documentAST = parse(new Source(query, "GraphQL request")); documentAST = parse(new Source(query, 'GraphQL request'))
} catch (syntaxError: unknown) { } catch (syntaxError: unknown) {
// Return 400: Bad Request if any syntax errors errors exist. // Return 400: Bad Request if any syntax errors errors exist.
if (syntaxError instanceof Error) { if (syntaxError instanceof Error) {
console.error(`${syntaxError.stack || syntaxError.message}`); console.error(`${syntaxError.stack || syntaxError.message}`)
const e = new GraphQLError(syntaxError.message, { const e = new GraphQLError(syntaxError.message, {
originalError: syntaxError, 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. // Validate AST, reporting any errors.
const validationErrors = validate(schema, documentAST, [ const validationErrors = validate(schema, documentAST, [...specifiedRules, ...validationRules])
...specifiedRules,
...validationRules,
]);
if (validationErrors.length > 0) { if (validationErrors.length > 0) {
// Return 400: Bad Request if any validation errors exist. // Return 400: Bad Request if any validation errors exist.
return c.json( return c.json(errorMessages(['GraphQL validation error.'], validationErrors), 400)
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. // Determine if this GET request will perform a non-query.
const operationAST = getOperationAST(documentAST, operationName); const operationAST = getOperationAST(documentAST, operationName)
if (operationAST && operationAST.operation !== "query") { if (operationAST && operationAST.operation !== 'query') {
/* /*
Now , does not support GraphiQL Now , does not support GraphiQL
if (showGraphiQL) { if (showGraphiQL) {
@ -126,43 +110,38 @@ export const graphqlServer = (options: Options) => {
`Can only perform a ${operationAST.operation} operation from a POST request.`, `Can only perform a ${operationAST.operation} operation from a POST request.`,
]), ]),
405, 405,
{ Allow: "POST" } { Allow: 'POST' }
); )
} }
} }
let result: FormattedExecutionResult; let result: FormattedExecutionResult
const { rootResolver } = options
try { try {
result = await execute({ result = await execute({
schema, schema,
document: documentAST, document: documentAST,
rootValue, rootValue: rootResolver ? await rootResolver(c) : null,
variableValues: variables, variableValues: variables,
operationName: operationName, operationName: operationName,
}); })
} catch (contextError: unknown) { } catch (contextError: unknown) {
if (contextError instanceof Error) { if (contextError instanceof Error) {
console.error(`${contextError.stack || contextError.message}`); console.error(`${contextError.stack || contextError.message}`)
const e = new GraphQLError(contextError.message, { const e = new GraphQLError(contextError.message, {
originalError: contextError, originalError: contextError,
nodes: documentAST, nodes: documentAST,
}); })
// Return 400: Bad Request if any execution context errors exist. // Return 400: Bad Request if any execution context errors exist.
return c.json( return c.json(errorMessages(['GraphQL execution context error.'], [e]), 400)
errorMessages(["GraphQL execution context error."], [e]),
400
);
} }
throw contextError; throw contextError
} }
if (!result.data) { if (!result.data) {
if (result.errors) { if (result.errors) {
return c.json( return c.json(errorMessages([result.errors.toString()], result.errors), 500)
errorMessages([result.errors.toString()], result.errors),
500
);
} }
} }
@ -173,70 +152,65 @@ export const graphqlServer = (options: Options) => {
*/ */
if (pretty) { 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, { return c.text(payload, 200, {
"Content-Type": "application/json", 'Content-Type': 'application/json',
}); })
} else { } 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 ( export interface GraphQLParams {
request: Request query: string | null
): Promise<GraphQLParams> => { variables: { readonly [name: string]: unknown } | null
const urlData = new URLSearchParams(request.url.split("?")[1]); operationName: string | null
const bodyData = await parseBody(request); raw: boolean
}
export const getGraphQLParams = async (request: Request): Promise<GraphQLParams> => {
const urlData = new URLSearchParams(request.url.split('?')[1])
const bodyData = await parseBody(request)
// GraphQL Query string. // 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") { if (typeof query !== 'string') {
query = null; query = null
} }
// Parse the variables if needed. // Parse the variables if needed.
let variables = (urlData.get("variables") ?? bodyData.variables) as { let variables = (urlData.get('variables') ?? bodyData.variables) as {
readonly [name: string]: unknown; readonly [name: string]: unknown
} | null; } | null
if (typeof variables === "string") { if (typeof variables === 'string') {
try { try {
variables = JSON.parse(variables); variables = JSON.parse(variables)
} catch { } catch {
throw Error("Variables are invalid JSON."); throw Error('Variables are invalid JSON.')
} }
} else if (typeof variables !== "object") { } else if (typeof variables !== 'object') {
variables = null; variables = null
} }
// Name of GraphQL operation to execute. // Name of GraphQL operation to execute.
let operationName = let operationName = urlData.get('operationName') ?? (bodyData.operationName as string | null)
urlData.get("operationName") ?? (bodyData.operationName as string | null); if (typeof operationName !== 'string') {
if (typeof operationName !== "string") { operationName = null
operationName = null;
} }
const raw = urlData.get("raw") != null || bodyData.raw !== undefined; const raw = urlData.get('raw') != null || bodyData.raw !== undefined
const params: GraphQLParams = { const params: GraphQLParams = {
query: query, query: query,
variables: variables, variables: variables,
operationName: operationName, operationName: operationName,
raw: raw, raw: raw,
}; }
return params; return params
}; }
export const errorMessages = ( export const errorMessages = (
messages: string[], messages: string[],
@ -245,16 +219,16 @@ export const errorMessages = (
if (graphqlErrors) { if (graphqlErrors) {
return { return {
errors: graphqlErrors, errors: graphqlErrors,
}; }
} }
return { return {
errors: messages.map((message) => { errors: messages.map((message) => {
return { return {
message: message, message: message,
}; }
}), }),
}; }
}; }
// export const graphiQLResponse = () => {} // export const graphiQLResponse = () => {}

View File

@ -1,49 +1,48 @@
import { buildSchema } from "https://cdn.skypack.dev/graphql@16.5.0?dts"; 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 { Hono } from 'https://deno.land/x/hono@v2.6.1/mod.ts'
import { errorMessages, graphqlServer } from "../deno_dist/index.ts"; import { graphqlServer } from '../deno_dist/index.ts'
import { assertEquals } from "https://deno.land/std@0.149.0/testing/asserts.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 // Construct a schema, using GraphQL schema language
const schema = buildSchema(` const schema = buildSchema(`
type Query { type Query {
hello: String hello: String
} }
`); `)
// The root provides a resolver function for each API endpoint // The root provides a resolver function for each API endpoint
const rootValue = { const rootValue = {
hello: () => "Hello world!", hello: () => 'Hello world!',
}; }
const app = new Hono(); const app = new Hono()
app.use( app.use(
"/graphql", '/graphql',
graphqlServer({ graphqlServer({
schema, schema,
rootValue, rootResolver: () => rootValue,
}) })
); )
app.all("*", (c) => { app.all('*', (c) => {
c.header("foo", "bar"); c.header('foo', 'bar')
return c.text("fallback"); return c.text('fallback')
}); })
const query = "query { hello }"; const query = 'query { hello }'
const body = { const body = {
query: query, query: query,
}; }
const res = await app.request("http://localhost/graphql", { const res = await app.request('http://localhost/graphql', {
method: "POST", method: 'POST',
headers: { headers: {
"Content-Type": "application/json", 'Content-Type': 'application/json',
}, },
body: JSON.stringify(body), body: JSON.stringify(body),
}); })
assertEquals(res.status, 200) assertEquals(res.status, 200)
assertEquals(await res.text(), '{"data":{"hello":"Hello world!"}}') assertEquals(await res.text(), '{"data":{"hello":"Hello world!"}}')
}); })

View File

@ -19,25 +19,27 @@
"test:deno": "deno test deno_test", "test:deno": "deno test deno_test",
"test:bun": "bun wiptest bun_test/index.test.ts", "test:bun": "bun wiptest bun_test/index.test.ts",
"test:all": "yarn test && yarn test:deno && yarn test:bun", "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", "build": "rimraf dist && tsc --project tsconfig.build.json",
"lint": "eslint --ext js,ts src .eslintrc.js", "lint": "eslint --ext js,ts src .eslintrc.js",
"lint:fix": "eslint --ext js,ts src .eslintrc.js --fix", "lint:fix": "eslint --ext js,ts src .eslintrc.js --fix",
"release": "npm publish" "release": "npm publish"
}, },
"denoify": {
"replacer": "dist/replacer.js"
},
"peerDependencies": {
"hono": "^2.6.1"
},
"dependencies": { "dependencies": {
"graphql": "^16.5.0", "graphql": "^16.5.0"
"hono": "^2.0.2"
}, },
"devDependencies": { "devDependencies": {
"@cloudflare/workers-types": "^3.14.0", "@cloudflare/workers-types": "^3.14.0",
"@types/jest": "^28.1.4", "@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/eslint-plugin": "^5.21.0",
"@typescript-eslint/parser": "^5.21.0", "@typescript-eslint/parser": "^5.21.0",
"prettier": "^2.7.1", "denoify": "^1.4.5",
"eslint": "^8.14.0", "eslint": "^8.14.0",
"eslint-config-prettier": "^8.5.0", "eslint-config-prettier": "^8.5.0",
"eslint-define-config": "^1.4.0", "eslint-define-config": "^1.4.0",
@ -46,6 +48,10 @@
"eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-flowtype": "^8.0.3",
"eslint-plugin-import": "^2.26.0", "eslint-plugin-import": "^2.26.0",
"eslint-plugin-node": "^11.1.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", "rimraf": "^3.0.2",
"ts-jest": "^28.0.5", "ts-jest": "^28.0.5",
"typescript": "^4.7.4" "typescript": "^4.7.4"
@ -53,4 +59,4 @@
"engines": { "engines": {
"node": ">=11.0.0" "node": ">=11.0.0"
} }
} }

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" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.6.tgz#0ba49ac517ad69abe7a1508bc9b3a5483df9d5d7"
integrity sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw== 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": "@types/prettier@^2.1.5":
version "2.6.3" version "2.6.3"
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" 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" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 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: cron-schedule@^3.0.4:
version "3.0.6" version "3.0.6"
resolved "https://registry.yarnpkg.com/cron-schedule/-/cron-schedule-3.0.6.tgz#7d0a3ad9154112fc3720fe43238a43d50e8465e7" 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" has-property-descriptors "^1.0.0"
object-keys "^1.1.1" object-keys "^1.1.1"
denoify@^0.11.1: denoify@^1.4.5:
version "0.11.3" version "1.4.5"
resolved "https://registry.yarnpkg.com/denoify/-/denoify-0.11.3.tgz#cf4378d9d8067d01d379122a2ef1f5ab7a296d15" resolved "https://registry.yarnpkg.com/denoify/-/denoify-1.4.5.tgz#6c4a0682b051b2d3dc8cca1d7e29611139ca4bd9"
integrity sha512-jdpeENTKWa/40CDeUuP+5oSjMoUNk+rF9AWhgjB1Rl5lBTGJw0nbT07/n2bXJ1Mn4piFTMYqXpDVYKap4jXMmg== integrity sha512-hk75EoJgI8kCizSAQ8wT7Vmopg67k9+rsos/ScYSFmEk/wMSSgi8xlQMkf99dvNDFck07BgnlywIBLpbs8oU5w==
dependencies: dependencies:
"@octokit/rest" "^18.0.0" "@octokit/rest" "^18.0.0"
"@types/comment-json" "^1.1.1" "@types/comment-json" "^1.1.1"
commander "^4.1.1" commander "^4.1.1"
comment-json "^3.0.2" 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" get-github-default-branch-name "^0.0.4"
gitignore-parser "0.0.2" gitignore-parser "0.0.2"
glob "^7.1.6" 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" path-depth "^1.0.0"
scripting-tools "^0.19.13" scripting-tools "^0.19.14"
tsafe "^0.10.0" tsafe "^1.4.1"
url-join "^4.0.1" url-join "^4.0.1"
deprecation@^2.0.0, deprecation@^2.3.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" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
evt@^2.2.1: evt@^2.4.13:
version "2.2.1" version "2.4.13"
resolved "https://registry.yarnpkg.com/evt/-/evt-2.2.1.tgz#a3d6b19e92a5fae2801d98e764294c08b8079d78" resolved "https://registry.yarnpkg.com/evt/-/evt-2.4.13.tgz#5ef873159ce62e099d58801a3e4b8e0f5b648017"
integrity sha512-MbzwSxMaZrmg09Q0HeK/W0/xwH3u9jFxb78MAXhhFczjog8gqoaO1IQGCAIOlI7FHW7NzuoCKpjcIyJUva7H3w== integrity sha512-haTVOsmjzk+28zpzvVwan9Zw2rLQF2izgi7BKjAPRzZAfcv+8scL0TpM8MzvGNKFYHiy+Bq3r6FYIIUPl9kt3A==
dependencies: dependencies:
minimal-polyfills "^2.2.1" minimal-polyfills "^2.2.2"
run-exclusive "^2.2.14" run-exclusive "^2.2.18"
tsafe "^0.10.0" tsafe "^1.4.1"
execa@^5.0.0: execa@^5.0.0:
version "5.1.1" version "5.1.1"
@ -2151,10 +2170,10 @@ has@^1.0.3:
dependencies: dependencies:
function-bind "^1.1.1" function-bind "^1.1.1"
hono@^2.0.2: hono@^2.6.1:
version "2.0.2" version "2.6.1"
resolved "https://registry.yarnpkg.com/hono/-/hono-2.0.2.tgz#5bf8b5be27523245364f8438c9a7151ac4b4d945" resolved "https://registry.yarnpkg.com/hono/-/hono-2.6.1.tgz#9e85b69cff97586eb53db329c52961e8eade943b"
integrity sha512-ge85omRQyDfOHe3EAJEG+leRsoFcwUkWeMD5UX5TMmPxd4mRbiu+yBLCUS/Dn9mUF550i0io1OUI9/6Mz2Xqkg== integrity sha512-DsJSOkwV2M7TkuRsp8VJrD02ISMsT7BXGUWjPBJS3n1fIx7NQEhat395lo7024w2ibrbmo+5FivUG0vqij9YYg==
html-escaper@^2.0.0: html-escaper@^2.0.0:
version "2.0.2" version "2.0.2"
@ -2959,11 +2978,16 @@ miniflare@2.6.0:
source-map-support "^0.5.20" source-map-support "^0.5.20"
undici "5.5.1" undici "5.5.1"
minimal-polyfills@^2.1.5, minimal-polyfills@^2.2.1: minimal-polyfills@^2.2.1:
version "2.2.1" version "2.2.1"
resolved "https://registry.yarnpkg.com/minimal-polyfills/-/minimal-polyfills-2.2.1.tgz#7249d7ece666d3b4e1ec1c1b8f949eb9d44e2308" resolved "https://registry.yarnpkg.com/minimal-polyfills/-/minimal-polyfills-2.2.1.tgz#7249d7ece666d3b4e1ec1c1b8f949eb9d44e2308"
integrity sha512-WLmHQrsZob4rVYf8yHapZPNJZ3sspGa/sN8abuSD59b0FifDEE7HMfLUi24z7mPZqTpBXy4Svp+iGvAmclCmXg== 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: minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2" version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 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" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
node-fetch@^2.6.0, node-fetch@^2.6.7: node-fetch@^2.6.7:
version "2.6.7" version "2.6.7"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
@ -3142,7 +3166,12 @@ parent-module@^1.0.0:
dependencies: dependencies:
callsites "^3.0.0" 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" version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
@ -3319,12 +3348,12 @@ rimraf@^3.0.0, rimraf@^3.0.2:
dependencies: dependencies:
glob "^7.1.3" glob "^7.1.3"
run-exclusive@^2.2.14: run-exclusive@^2.2.18:
version "2.2.14" version "2.2.18"
resolved "https://registry.yarnpkg.com/run-exclusive/-/run-exclusive-2.2.14.tgz#4f41dc7843e091f10991f8708fce87b09022a0ce" resolved "https://registry.yarnpkg.com/run-exclusive/-/run-exclusive-2.2.18.tgz#ec930edc3a7044750dc827df9372bde8f610f586"
integrity sha512-NHaQfB3zPJFx7p4M06AcmoK8xz/h8YDMCdy3jxfyoC9VqIbl1U+DiVjUuAYZBRMwvj5qkQnOUGfsmyUC4k46dg== integrity sha512-TXr1Gkl1iEAOCCpBTRm/2m0+1KGjORcWpZZ+VGGTe7dYX8E4y8/fMvrHk0zf+kclec2R//tpvdBxgG0bDgaJfw==
dependencies: dependencies:
minimal-polyfills "^2.1.5" minimal-polyfills "^2.2.1"
run-parallel@^1.1.9: run-parallel@^1.1.9:
version "1.2.0" 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" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 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" version "0.19.13"
resolved "https://registry.yarnpkg.com/scripting-tools/-/scripting-tools-0.19.13.tgz#836df7d9c2ec99aea91984d1d5b2bd110670afec" resolved "https://registry.yarnpkg.com/scripting-tools/-/scripting-tools-0.19.13.tgz#836df7d9c2ec99aea91984d1d5b2bd110670afec"
integrity sha512-d09H8vzSVa8p4XUTJqHZDbjKDyl5TG3SyPfNPUUkfyOwjwykStmfK8AXyWq7VRWjcgzTpkTiJ9uMk1NytMQY7w== 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: selfsigned@^2.0.0:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56"
@ -3610,10 +3644,10 @@ ts-jest@^28.0.5:
semver "7.x" semver "7.x"
yargs-parser "^21.0.1" yargs-parser "^21.0.1"
tsafe@^0.10.0: tsafe@^1.4.1:
version "0.10.0" version "1.4.1"
resolved "https://registry.yarnpkg.com/tsafe/-/tsafe-0.10.0.tgz#c4fba365a49467ea6167e8c9482ddb94ee51b795" resolved "https://registry.yarnpkg.com/tsafe/-/tsafe-1.4.1.tgz#59cdad8ac41babf88e56dcd1a683ae2fb145d059"
integrity sha512-CFfa1uJKfU0DDRbuB8bf2mfXjkOqiTsrltexzMMLxq5gjd1LttFECNGsO8dYUALJDbShb6+f3CwAppW/wf9BrA== integrity sha512-3IDBalvf6SyvHFS14UiwCWzqdSdo+Q0k2J7DZyJYaHW/iraW9DJpaBKDJpry3yQs3o/t/A+oGaRW3iVt2lKxzA==
tsconfig-paths@^3.14.1: tsconfig-paths@^3.14.1:
version "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" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 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: yargs-parser@^21.0.0, yargs-parser@^21.0.1:
version "21.0.1" version "21.0.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35"