diff --git a/@app/__tests__/helpers.ts b/@app/__tests__/helpers.ts index a73f5c1a..13d81063 100644 --- a/@app/__tests__/helpers.ts +++ b/@app/__tests__/helpers.ts @@ -1,6 +1,6 @@ import { Pool, PoolClient } from "pg"; -const pools = {}; +const pools: { [key: string]: Pool } = {}; if (!process.env.TEST_DATABASE_URL) { throw new Error("Cannot run tests without a TEST_DATABASE_URL"); diff --git a/@app/client/package.json b/@app/client/package.json index 9ebc7456..12e3d197 100644 --- a/@app/client/package.json +++ b/@app/client/package.json @@ -20,7 +20,7 @@ "@types/react": "18.0.28", "antd": "5.2.3", "dayjs": "^1.11.7", - "graphql": "^15.8.0", + "graphql": "^16.1.0-experimental-stream-defer.6", "lodash": "^4.17.21", "net": "^1.0.2", "next": "^13.2.3", diff --git a/@app/db/package.json b/@app/db/package.json index d87c900f..e17cc606 100644 --- a/@app/db/package.json +++ b/@app/db/package.json @@ -18,7 +18,6 @@ "graphile-migrate": "^1.4.1" }, "devDependencies": { - "@types/pg": "^8.6.6", "graphile-worker": "^0.13.0", "jest": "^29.4.3", "lodash": "^4.17.21", diff --git a/@app/lib/package.json b/@app/lib/package.json index 49dd4299..cbdd3f3b 100644 --- a/@app/lib/package.json +++ b/@app/lib/package.json @@ -9,7 +9,8 @@ }, "dependencies": { "@apollo/client": "3.4.17", - "graphql": "^15.8.0", + "grafast": "0.0.1-beta.8", + "graphql": "^16.1.0-experimental-stream-defer.6", "graphql-ws": "^5.11.3", "next": "^13.2.3", "next-with-apollo": "^5.3.0", @@ -25,7 +26,7 @@ "cross-env": "^7.0.3", "express": "^4.20.0", "jest": "^29.4.3", - "postgraphile": "^4.13.0", + "postgraphile": "5.0.0-beta.2", "typescript": "~5.3.3" } } diff --git a/@app/lib/src/GraphileApolloLink.ts b/@app/lib/src/GraphileApolloLink.ts index 669a23ac..40983431 100644 --- a/@app/lib/src/GraphileApolloLink.ts +++ b/@app/lib/src/GraphileApolloLink.ts @@ -6,8 +6,11 @@ import { Operation, } from "@apollo/client"; import { Request, Response } from "express"; -import { execute, getOperationAST } from "graphql"; -import { HttpRequestHandler } from "postgraphile"; +import { execute, hookArgs, isAsyncIterable } from "grafast"; +import { getOperationAST } from "graphql"; +import type { PostGraphileInstance } from "postgraphile"; +// augments Grafast.RequestContext with expressv4 +import type {} from "postgraphile/grafserv/express/v4"; export interface GraphileApolloLinkInterface { /** The request object. */ @@ -17,10 +20,7 @@ export interface GraphileApolloLinkInterface { res: Response; /** The instance of the express middleware returned by calling `postgraphile()` */ - postgraphileMiddleware: HttpRequestHandler; - - /** An optional rootValue to use inside resolvers. */ - rootValue?: any; + pgl: PostGraphileInstance; } /** @@ -36,7 +36,7 @@ export class GraphileApolloLink extends ApolloLink { operation: Operation, _forward?: NextLink ): Observable | null { - const { postgraphileMiddleware, req, res, rootValue } = this.options; + const { pgl, req, res } = this.options; return new Observable((observer) => { (async () => { try { @@ -53,22 +53,28 @@ export class GraphileApolloLink extends ApolloLink { } return; } - const schema = await postgraphileMiddleware.getGraphQLSchema(); - const data = - await postgraphileMiddleware.withPostGraphileContextFromReqRes( + const schema = await pgl.getSchema(); + const args = { + schema, + document, + variableValues, + operationName, + }; + await hookArgs(args, pgl.getResolvedPreset(), { + node: { req, res, - {}, - (context) => - execute( - schema, - document, - rootValue || {}, - context, - variableValues, - operationName - ) - ); + }, + expressv4: { + req, + res, + }, + }); + const data = await execute(args); + if (isAsyncIterable(data)) { + data.return?.(); + throw new Error("Iterable not supported by GraphileApolloLink"); + } if (!observer.closed) { observer.next(data); observer.complete(); diff --git a/@app/lib/src/withApollo.tsx b/@app/lib/src/withApollo.tsx index 1c93d144..474f1113 100644 --- a/@app/lib/src/withApollo.tsx +++ b/@app/lib/src/withApollo.tsx @@ -89,7 +89,7 @@ function makeServerSideLink(req: any, res: any) { return new GraphileApolloLink({ req, res, - postgraphileMiddleware: req.app.get("postgraphileMiddleware"), + pgl: req.app.get("pgl"), }); } diff --git a/@app/server/__tests__/helpers.ts b/@app/server/__tests__/helpers.ts index d0694536..61c93f4f 100644 --- a/@app/server/__tests__/helpers.ts +++ b/@app/server/__tests__/helpers.ts @@ -1,18 +1,21 @@ -import { Request, Response } from "express"; -import { ExecutionResult, graphql, GraphQLSchema } from "graphql"; -import { Pool, PoolClient } from "pg"; +import { makeWithPgClientViaPgClientAlreadyInTransaction } from "@dataplan/pg/adaptors/pg"; +import { execute, hookArgs } from "grafast"; import { - createPostGraphileSchema, - PostGraphileOptions, - withPostGraphileContext, -} from "postgraphile"; + ExecutionArgs, + ExecutionResult, + GraphQLSchema, + parse, + validate, +} from "graphql"; +import { Pool, PoolClient } from "pg"; +import { postgraphile, PostGraphileInstance } from "postgraphile"; import { createSession, createUsers, poolFromUrl, } from "../../__tests__/helpers"; -import { getPostGraphileOptions } from "../src/graphile.config"; +import { getPreset } from "../src/graphile.config"; export * from "../../__tests__/helpers"; @@ -22,8 +25,8 @@ export async function createUserAndLogIn() { const pool = poolFromUrl(process.env.TEST_DATABASE_URL!); const client = await pool.connect(); try { - const [user] = await createUsers(pool, 1, true); - const session = await createSession(pool, user.id); + const [user] = await createUsers(client, 1, true); + const session = await createSession(client, user.id); return { user, session }; } finally { client.release(); @@ -96,7 +99,7 @@ export function sanitize(json: any): any { // Contains the PostGraphile schema and rootPgPool interface ICtx { rootPgPool: Pool; - options: PostGraphileOptions; + pgl: PostGraphileInstance; schema: GraphQLSchema; } let ctx: ICtx | null = null; @@ -106,17 +109,14 @@ export const setup = async () => { connectionString: process.env.TEST_DATABASE_URL, }); - const options = getPostGraphileOptions({ rootPgPool }); - const schema = await createPostGraphileSchema( - rootPgPool, - "app_public", - options - ); + const preset = getPreset({ rootPgPool, authPgPool: rootPgPool }); + const pgl = postgraphile(preset); + const schema = await pgl.getSchema(); // Store the context ctx = { rootPgPool, - options, + pgl, schema, }; }; @@ -146,9 +146,10 @@ export const runGraphQLQuery = async function runGraphQLQuery( ) => void | ExecutionResult | Promise = () => {} // Place test assertions in this function ) { if (!ctx) throw new Error("No ctx!"); - const { schema, rootPgPool, options } = ctx; + const { schema, rootPgPool, pgl } = ctx; + const resolvedPreset = pgl.getResolvedPreset(); const req = new MockReq({ - url: options.graphqlRoute || "/graphql", + url: resolvedPreset.grafserv?.graphqlPath || "/graphql", method: "POST", headers: { Accept: "application/json", @@ -159,92 +160,90 @@ export const runGraphQLQuery = async function runGraphQLQuery( const res: any = { req }; req.res = res; - const { - pgSettings: pgSettingsGenerator, - additionalGraphQLContextFromRequest, - } = options; - const pgSettings = - (typeof pgSettingsGenerator === "function" - ? await pgSettingsGenerator(req) - : pgSettingsGenerator) || {}; + let checkResult: ExecutionResult | void; + const document = parse(query); + const errors = validate(schema, document); + if (errors.length > 0) { + throw errors[0]; + } + const args: ExecutionArgs = { + schema, + document, + contextValue: { + __TESTING: true, + }, + variableValues: variables, + }; + await hookArgs(args, resolvedPreset, { + node: { req, res }, + expressv4: { req, res }, + }); // Because we're connected as the database owner, we should manually switch to // the authenticator role - if (!pgSettings.role) { - pgSettings.role = process.env.DATABASE_AUTHENTICATOR; + const context = args.contextValue as Grafast.Context; + if (!context.pgSettings?.role) { + context.pgSettings = context.pgSettings ?? {}; + context.pgSettings.role = process.env.DATABASE_AUTHENTICATOR as string; } - await withPostGraphileContext( - { - ...options, - pgPool: rootPgPool, - pgSettings, - pgForceTransaction: true, - }, - async (context) => { - let checkResult; - const { pgClient } = context; - try { - // This runs our GraphQL query, passing the replacement client - const additionalContext = additionalGraphQLContextFromRequest - ? await additionalGraphQLContextFromRequest(req, res) - : null; - const result = await graphql( - schema, - query, - null, - { - ...context, - ...additionalContext, - __TESTING: true, - }, - variables - ); - // Expand errors - if (result.errors) { - if (options.handleErrors) { - result.errors = options.handleErrors(result.errors); - } else { - // This does a similar transform that PostGraphile does to errors. - // It's not the same. Sorry. - result.errors = result.errors.map((rawErr) => { - const e = Object.create(rawErr); - Object.defineProperty(e, "originalError", { - value: rawErr.originalError, - enumerable: false, - }); - - if (e.originalError) { - Object.keys(e.originalError).forEach((k) => { - try { - e[k] = e.originalError[k]; - } catch (err) { - // Meh. - } - }); + const pgClient = await rootPgPool.connect(); + try { + await pgClient.query("begin"); + + // Override withPgClient with a transactional version for the tests + const withPgClient = makeWithPgClientViaPgClientAlreadyInTransaction( + pgClient, + true + ); + context.withPgClient = withPgClient; + + const result = (await execute(args, resolvedPreset)) as ExecutionResult; + // Expand errors + if (result.errors) { + if (resolvedPreset.grafserv?.maskError) { + result.errors = result.errors.map(resolvedPreset.grafserv.maskError); + } else { + // This does a similar transform that PostGraphile does to errors. + // It's not the same. Sorry. + result.errors = result.errors.map((rawErr) => { + const e = Object.create(rawErr); + Object.defineProperty(e, "originalError", { + value: rawErr.originalError, + enumerable: false, + }); + + if (e.originalError) { + Object.keys(e.originalError).forEach((k) => { + try { + e[k] = e.originalError[k]; + } catch (err) { + // Meh. } - return e; }); } - } - - // This is were we call the `checker` so you can do your assertions. - // Also note that we pass the `replacementPgClient` so that you can - // query the data in the database from within the transaction before it - // gets rolled back. - checkResult = await checker(result, { - pgClient, + return e; }); + } + } - // You don't have to keep this, I just like knowing when things change! - expect(sanitize(result)).toMatchSnapshot(); + // This is were we call the `checker` so you can do your assertions. + // Also note that we pass the `replacementPgClient` so that you can + // query the data in the database from within the transaction before it + // gets rolled back. + checkResult = await checker(result, { + pgClient, + }); - return checkResult == null ? result : checkResult; - } finally { - // Rollback the transaction so no changes are written to the DB - this - // makes our tests fairly deterministic. - await pgClient.query("rollback"); - } + // You don't have to keep this, I just like knowing when things change! + expect(sanitize(result)).toMatchSnapshot(); + + return checkResult == null ? result : checkResult; + } finally { + try { + await pgClient.query("rollback"); + } finally { + pgClient.release(); } - ); + } }; diff --git a/@app/server/__tests__/tsconfig.json b/@app/server/__tests__/tsconfig.json new file mode 100644 index 00000000..379a994d --- /dev/null +++ b/@app/server/__tests__/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.json", + "include": ["."] +} diff --git a/@app/server/package.json b/@app/server/package.json index 7e80aa03..f8b9c2e9 100644 --- a/@app/server/package.json +++ b/@app/server/package.json @@ -13,17 +13,16 @@ "dependencies": { "@app/client": "0.0.0", "@app/config": "0.0.0", - "@graphile-contrib/pg-simplify-inflector": "^6.1.0", - "@graphile/pg-pubsub": "^4.13.0", - "@graphile/pro": "^1.0.4", - "@types/connect-pg-simple": "^7.0.0", + "@dataplan/json": "0.0.1-beta.2", + "@dataplan/pg": "0.0.1-beta.2", + "@graphile/simplify-inflection": "8.0.0-beta.1", + "@types/connect-pg-simple": "^7.0.3", "@types/csurf": "^1.11.2", "@types/express-session": "^1.17.6", "@types/helmet": "^4.0.0", "@types/morgan": "^1.9.4", "@types/passport": "^1.0.12", "@types/passport-github2": "^1.2.5", - "@types/pg": "^8.6.6", "@types/redis": "^4.0.11", "body-parser": "^1.20.3", "chalk": "^5.2.0", @@ -32,9 +31,8 @@ "csurf": "^1.11.0", "express": "^4.20.0", "express-session": "^1.17.3", - "graphile-build": "^4.13.0", - "graphile-build-pg": "^4.13.0", - "graphile-utils": "^4.13.0", + "grafast": "0.0.1-beta.8", + "graphile-utils": "5.0.0-beta.2", "graphile-worker": "^0.13.0", "helmet": "^6.0.1", "lodash": "^4.17.21", @@ -43,14 +41,15 @@ "passport": "^0.6.0", "passport-github2": "^0.1.12", "pg": "^8.9.0", - "postgraphile": "^4.13.0", + "pg-sql2": "5.0.0", + "postgraphile": "5.0.0-beta.2", "redis": "^4.6.5", "source-map-support": "^0.5.21", "tslib": "^2.5.0" }, "devDependencies": { "@types/node": "^18.14.2", - "graphql": "^15.8.0", + "graphql": "^16.1.0-experimental-stream-defer.6", "jest": "^29.4.3", "mock-req": "^0.2.0", "ts-node": "^10.9.1" diff --git a/@app/server/scripts/schema-export.ts b/@app/server/scripts/schema-export.ts index 9f2bd674..ae864607 100644 --- a/@app/server/scripts/schema-export.ts +++ b/@app/server/scripts/schema-export.ts @@ -1,28 +1,33 @@ import { writeFileSync } from "fs"; import { lexicographicSortSchema, printSchema } from "graphql"; import { Pool } from "pg"; -import { createPostGraphileSchema } from "postgraphile"; +import { makeSchema } from "postgraphile"; -import { getPostGraphileOptions } from "../src/graphile.config"; +import { getPreset } from "../src/graphile.config"; async function main() { - const rootPgPool = new Pool({ - connectionString: process.env.DATABASE_URL!, + const authPgPool = new Pool({ + connectionString: process.env.AUTH_DATABASE_URL!, }); + const preset = { + extends: [getPreset({ authPgPool })], + schema: { + // Turn off built-in schema exporting + exportSchemaSDLPath: undefined, + exportSchemaIntrospectionResultPath: undefined, + }, + }; + try { - const schema = await createPostGraphileSchema( - process.env.AUTH_DATABASE_URL!, - "app_public", - getPostGraphileOptions({ rootPgPool }) - ); + const { schema } = await makeSchema(preset); const sorted = lexicographicSortSchema(schema); writeFileSync( `${__dirname}/../../../data/schema.graphql`, - printSchema(sorted) + printSchema(sorted) + "\n" ); console.log("GraphQL schema exported"); } finally { - rootPgPool.end(); + authPgPool.end(); } } diff --git a/@app/server/src/app.ts b/@app/server/src/app.ts index 2ebb96c4..f9a0ff41 100644 --- a/@app/server/src/app.ts +++ b/@app/server/src/app.ts @@ -1,6 +1,5 @@ -import express, { Express } from "express"; -import { IncomingMessage, Server } from "http"; -import { Middleware } from "postgraphile"; +import express, { Express, NextFunction } from "express"; +import { IncomingMessage, Server, ServerResponse } from "http"; import { Duplex } from "stream"; import { cloudflareIps } from "./cloudflare"; @@ -36,6 +35,13 @@ export function getWebsocketMiddlewares( return app.get("websocketMiddlewares"); } +export interface Middleware< + Request extends IncomingMessage, + Response extends ServerResponse, +> { + (req: Request, res: Response, next: NextFunction): void; +} + export async function makeApp({ httpServer, }: { diff --git a/@app/server/src/graphile.config.ts b/@app/server/src/graphile.config.ts index ec81bf19..f357bfdd 100644 --- a/@app/server/src/graphile.config.ts +++ b/@app/server/src/graphile.config.ts @@ -1,12 +1,14 @@ -import PgPubsub from "@graphile/pg-pubsub"; -import GraphilePro from "@graphile/pro"; // Requires license key -import PgSimplifyInflectorPlugin from "@graphile-contrib/pg-simplify-inflector"; -import { Request, Response } from "express"; -import { NodePlugin } from "graphile-build"; +// TODO: import GraphilePro from "@graphile/pro"; // Requires license key +import { PgSimplifyInflectionPreset } from "@graphile/simplify-inflection"; +import { Request } from "express"; import { resolve } from "path"; -import { Pool, PoolClient } from "pg"; -import { makePluginHook, Middleware, PostGraphileOptions } from "postgraphile"; -import { makePgSmartTagsFromFilePlugin } from "postgraphile/plugins"; +import { Pool } from "pg"; +import { makePgService } from "postgraphile/adaptors/pg"; +import type {} from "postgraphile/grafserv/express/v4"; +import { NodePlugin } from "postgraphile/graphile-build"; +import postgraphilePresetAmber from "postgraphile/presets/amber"; +import { makeV4Preset } from "postgraphile/presets/v4"; +import { pgSmartTagsFromFile } from "postgraphile/utils"; import OrdersPlugin from "./plugins/Orders"; import PassportLoginPlugin from "./plugins/PassportLoginPlugin"; @@ -15,12 +17,15 @@ import RemoveQueryQueryPlugin from "./plugins/RemoveQueryQueryPlugin"; import SubscriptionsPlugin from "./plugins/SubscriptionsPlugin"; import handleErrors from "./utils/handleErrors"; -export interface OurGraphQLContext { - pgClient: PoolClient; - sessionId: string | null; - rootPgPool: Pool; - login(user: any): Promise; - logout(): Promise; +declare global { + namespace Grafast { + interface Context { + sessionId: string | null; + rootPgPool: Pool; + login(user: any): Promise; + logout(): Promise; + } + } } declare global { @@ -31,7 +36,7 @@ declare global { } } -const TagsFilePlugin = makePgSmartTagsFromFilePlugin( +const TagsFilePlugin = pgSmartTagsFromFile( // We're using JSONC for VSCode compatibility; also using an explicit file // path keeps the tests happy. resolve(__dirname, "../postgraphile.tags.jsonc") @@ -39,8 +44,6 @@ const TagsFilePlugin = makePgSmartTagsFromFilePlugin( type UUID = string; -const isTest = process.env.NODE_ENV === "test"; - function uuidOrNull(input: string | number | null | undefined): UUID | null { if (!input) return null; const str = String(input); @@ -55,77 +58,77 @@ function uuidOrNull(input: string | number | null | undefined): UUID | null { } } -const isDev = process.env.NODE_ENV === "development"; -//const isTest = process.env.NODE_ENV === "test"; - -const pluginHook = makePluginHook([ - // Add the pub/sub realtime provider - PgPubsub, - - // If we have a Graphile Pro license, then enable the plugin - ...(process.env.GRAPHILE_LICENSE ? [GraphilePro] : []), -]); - interface IPostGraphileOptionsOptions { - websocketMiddlewares?: Middleware[]; - rootPgPool: Pool; + authPgPool: Pool; + rootPgPool?: Pool; } -export function getPostGraphileOptions({ - websocketMiddlewares, +const isTest = process.env.NODE_ENV === "test"; +const isDev = process.env.NODE_ENV === "development"; + +export function getPreset({ + authPgPool, rootPgPool, }: IPostGraphileOptionsOptions) { - const options: PostGraphileOptions = { - // This is for PostGraphile server plugins: https://www.graphile.org/postgraphile/plugins/ - pluginHook, - - // This is so that PostGraphile installs the watch fixtures, it's also needed to enable live queries - ownerConnectionString: process.env.DATABASE_URL, - - // On production we still want to start even if the database isn't available. - // On development, we want to deal nicely with issues in the database. - // For these reasons, we're going to keep retryOnInitFail enabled for both environments. - retryOnInitFail: !isTest, - - // Add websocket support to the PostGraphile server; you still need to use a subscriptions plugin such as - // @graphile/pg-pubsub - subscriptions: true, - websocketMiddlewares, - - // enableQueryBatching: On the client side, use something like apollo-link-batch-http to make use of this - enableQueryBatching: true, - - // dynamicJson: instead of inputting/outputting JSON as strings, input/output raw JSON objects - dynamicJson: true, - - // ignoreRBAC=false: honour the permissions in your DB - don't expose what you don't GRANT - ignoreRBAC: false, - - // ignoreIndexes=false: honour your DB indexes - only expose things that are fast - ignoreIndexes: false, - - // setofFunctionsContainNulls=false: reduces the number of nulls in your schema - setofFunctionsContainNulls: false, - - // Enable GraphiQL in development - graphiql: isDev || !!process.env.ENABLE_GRAPHIQL, - // Use a fancier GraphiQL with `prettier` for formatting, and header editing. - enhanceGraphiql: true, - // Allow EXPLAIN in development (you can replace this with a callback function if you want more control) - allowExplain: isDev, - - // Disable query logging - we're using morgan - disableQueryLog: true, - - // Custom error handling - handleErrors, - /* - * To use the built in PostGraphile error handling, you can use the - * following code instead of `handleErrors` above. Using `handleErrors` - * gives you much more control (and stability) over how errors are - * output to the user. - */ - /* + const preset: GraphileConfig.Preset = { + pgServices: [ + makePgService({ + // This is so that PostGraphile installs the watch fixtures + superuserConnectionString: process.env.DATABASE_URL, + + pool: authPgPool, + + schemas: ["app_public"], + + // Enable LISTEN/NOTIFY (for subscriptions/watch mode) + pubsub: true, + }), + ], + + extends: [ + postgraphilePresetAmber, + + makeV4Preset({ + // On production we still want to start even if the database isn't available. + // On development, we want to deal nicely with issues in the database. + // For these reasons, we're going to keep retryOnInitFail enabled for both environments. + retryOnInitFail: !isTest, + + // Add websocket support to the PostGraphile server; you still need to use a subscriptions plugin such as + // @graphile/pg-pubsub + subscriptions: true, + + // dynamicJson: instead of inputting/outputting JSON as strings, input/output raw JSON objects + dynamicJson: true, + + // ignoreRBAC=false: honour the permissions in your DB - don't expose what you don't GRANT + ignoreRBAC: false, + + // ignoreIndexes=false: honour your DB indexes - only expose things that are fast + ignoreIndexes: false, + + // setofFunctionsContainNulls=false: reduces the number of nulls in your schema + setofFunctionsContainNulls: false, + + // Enable GraphiQL in development + graphiql: isDev || !!process.env.ENABLE_GRAPHIQL, + // Use a fancier GraphiQL with `prettier` for formatting, and header editing. + enhanceGraphiql: true, + // Allow EXPLAIN in development (you can replace this with a callback function if you want more control) + allowExplain: isDev, + + // Disable query logging - we're using morgan + // TODO: disableQueryLog: true, + + // Custom error handling + handleErrors, + /* + * To use the built in PostGraphile error handling, you can use the + * following code instead of `handleErrors` above. Using `handleErrors` + * gives you much more control (and stability) over how errors are + * output to the user. + */ + /* // See https://www.graphile.org/postgraphile/debugging/ extendedErrors: isDev || isTest @@ -148,137 +151,135 @@ export function getPostGraphileOptions({ showErrorStack: isDev || isTest, */ - // Automatically update GraphQL schema when database changes - watchPg: isDev, + // Automatically update GraphQL schema when database changes + watchPg: isDev, - // Keep data/schema.graphql up to date - sortExport: true, - exportGqlSchemaPath: isDev - ? `${__dirname}/../../../data/schema.graphql` - : undefined, + // Keep data/schema.graphql up to date + sortExport: true, + exportGqlSchemaPath: isDev + ? `${__dirname}/../../../data/schema.graphql` + : undefined, - /* - * Plugins to enhance the GraphQL schema, see: - * https://www.graphile.org/postgraphile/extending/ - */ - appendPlugins: [ - // PostGraphile adds a `query: Query` field to `Query` for Relay 1 - // compatibility. We don't need that. - RemoveQueryQueryPlugin, + /* + * Plugins to enhance the GraphQL schema, see: + * https://www.graphile.org/postgraphile/extending/ + */ + appendPlugins: [ + // PostGraphile adds a `query: Query` field to `Query` for Relay 1 + // compatibility. We don't need that. + RemoveQueryQueryPlugin, - // Adds support for our `postgraphile.tags.json5` file - TagsFilePlugin, + // Adds support for our `postgraphile.tags.json5` file + TagsFilePlugin, - // Simplifies the field names generated by PostGraphile. - PgSimplifyInflectorPlugin, + // Omits by default non-primary-key constraint mutations + PrimaryKeyMutationsOnlyPlugin, - // Omits by default non-primary-key constraint mutations - PrimaryKeyMutationsOnlyPlugin, + // Adds the `login` mutation to enable users to log in + PassportLoginPlugin, - // Adds the `login` mutation to enable users to log in - PassportLoginPlugin, + // Adds realtime features to our GraphQL schema + SubscriptionsPlugin, - // Adds realtime features to our GraphQL schema - SubscriptionsPlugin, - - // Adds custom orders to our GraphQL schema - OrdersPlugin, - ], + // Adds custom orders to our GraphQL schema + OrdersPlugin, + ], - /* - * Plugins we don't want in our schema - */ - skipPlugins: [ - // Disable the 'Node' interface - NodePlugin, - ], + /* + * Plugins we don't want in our schema + */ + skipPlugins: [ + // Disable the 'Node' interface + NodePlugin, + ], + + graphileBuildOptions: { + /* + * Any properties here are merged into the settings passed to each Graphile + * Engine plugin - useful for configuring how the plugins operate. + */ + + // Makes all SQL function arguments except those with defaults non-nullable + pgStrictFunctions: true, + }, - graphileBuildOptions: { - /* - * Any properties here are merged into the settings passed to each Graphile - * Engine plugin - useful for configuring how the plugins operate. - */ - - // Makes all SQL function arguments except those with defaults non-nullable - pgStrictFunctions: true, - }, - - /* - * Postgres transaction settings for each GraphQL query/mutation to - * indicate to Postgres who is attempting to access the resources. These - * will be referenced by RLS policies/triggers/etc. - * - * Settings set here will be set using the equivalent of `SET LOCAL`, so - * certain things are not allowed. You can override Postgres settings such - * as 'role' and 'search_path' here; but for settings indicating the - * current user, session id, or other privileges to be used by RLS policies - * the setting names must contain at least one and at most two period - * symbols (`.`), and the first segment must not clash with any Postgres or - * extension settings. We find `jwt.claims.*` to be a safe namespace, - * whether or not you're using JWTs. - */ - async pgSettings(req) { - const sessionId = uuidOrNull(req.user?.session_id); - if (sessionId) { - // Update the last_active timestamp (but only do it at most once every 15 seconds to avoid too much churn). - await rootPgPool.query( - "UPDATE app_private.sessions SET last_active = NOW() WHERE uuid = $1 AND last_active < NOW() - INTERVAL '15 seconds'", - [sessionId] - ); - } - return { - // Everyone uses the "visitor" role currently - role: process.env.DATABASE_VISITOR, + /* + * Postgres transaction settings for each GraphQL query/mutation to + * indicate to Postgres who is attempting to access the resources. These + * will be referenced by RLS policies/triggers/etc. + * + * Settings set here will be set using the equivalent of `SET LOCAL`, so + * certain things are not allowed. You can override Postgres settings such + * as 'role' and 'search_path' here; but for settings indicating the + * current user, session id, or other privileges to be used by RLS policies + * the setting names must contain at least one and at most two period + * symbols (`.`), and the first segment must not clash with any Postgres or + * extension settings. We find `jwt.claims.*` to be a safe namespace, + * whether or not you're using JWTs. + */ + async pgSettings(inReq) { + const req = inReq as Request; + const sessionId = uuidOrNull(req.user?.session_id); + if (sessionId) { + // Update the last_active timestamp (but only do it at most once every 15 seconds to avoid too much churn). + await rootPgPool?.query( + "UPDATE app_private.sessions SET last_active = NOW() WHERE uuid = $1 AND last_active < NOW() - INTERVAL '15 seconds'", + [sessionId] + ); + } + return { + // Everyone uses the "visitor" role currently + role: process.env.DATABASE_VISITOR, + + /* + * Note, though this says "jwt" it's not actually anything to do with + * JWTs, we just know it's a safe namespace to use, and it means you + * can use JWTs too, if you like, and they'll use the same settings + * names reducing the amount of code you need to write. + */ + "jwt.claims.session_id": sessionId, + }; + }, /* - * Note, though this says "jwt" it's not actually anything to do with - * JWTs, we just know it's a safe namespace to use, and it means you - * can use JWTs too, if you like, and they'll use the same settings - * names reducing the amount of code you need to write. + * These properties are merged into context (the third argument to GraphQL + * resolvers). This is useful if you write your own plugins that need + * access to, e.g., the logged in user. */ - "jwt.claims.session_id": sessionId, - }; - }, - - /* - * These properties are merged into context (the third argument to GraphQL - * resolvers). This is useful if you write your own plugins that need - * access to, e.g., the logged in user. - */ - async additionalGraphQLContextFromRequest( - req - ): Promise> { - return { - // The current session id - sessionId: uuidOrNull(req.user?.session_id), - - // Needed so passport can write to the database - rootPgPool, - - // Use this to tell Passport.js we're logged in - login: (user: any) => - new Promise((resolve, reject) => { - req.login(user, (err) => (err ? reject(err) : resolve())); - }), - - logout: () => { - return new Promise((resolve, reject) => - req.logout((err) => (err ? reject(err) : resolve())) - ); + async additionalGraphQLContextFromRequest(inReq) { + const req = inReq as Request; + return { + // The current session id + sessionId: uuidOrNull(req.user?.session_id), + + // Needed so passport can write to the database + rootPgPool, + + // Use this to tell Passport.js we're logged in + login: (user: any) => + new Promise((resolve, reject) => { + req.login(user, (err) => (err ? reject(err) : resolve())); + }), + + logout: () => { + return new Promise((resolve, reject) => + req.logout((err) => (err ? reject(err) : resolve())) + ); + }, + }; }, - }; - }, - - // Pro plugin options (requires process.env.GRAPHILE_LICENSE) - defaultPaginationCap: - parseInt(process.env.GRAPHQL_PAGINATION_CAP || "", 10) || 50, - graphqlDepthLimit: - parseInt(process.env.GRAPHQL_DEPTH_LIMIT || "", 10) || 12, - graphqlCostLimit: - parseInt(process.env.GRAPHQL_COST_LIMIT || "", 10) || 30000, - exposeGraphQLCost: - (parseInt(process.env.HIDE_QUERY_COST || "", 10) || 0) < 1, - // readReplicaPgPool ..., + + // Pro plugin options (requires process.env.GRAPHILE_LICENSE) + // TODO: defaultPaginationCap: parseInt(process.env.GRAPHQL_PAGINATION_CAP || "", 10) || 50, + // TODO: graphqlDepthLimit: parseInt(process.env.GRAPHQL_DEPTH_LIMIT || "", 10) || 12, + // TODO: graphqlCostLimit: parseInt(process.env.GRAPHQL_COST_LIMIT || "", 10) || 30000, + // TODO: exposeGraphQLCost: (parseInt(process.env.HIDE_QUERY_COST || "", 10) || 0) < 1, + // readReplicaPgPool ..., + }), + + // Simplifies the field names generated by PostGraphile. + PgSimplifyInflectionPreset, + ], }; - return options; + return preset; } diff --git a/@app/server/src/middleware/installHelmet.ts b/@app/server/src/middleware/installHelmet.ts index 00d57457..9ce0a88f 100644 --- a/@app/server/src/middleware/installHelmet.ts +++ b/@app/server/src/middleware/installHelmet.ts @@ -53,11 +53,13 @@ export default async function installHelmet(app: Express) { } if (isDev || isTest) { - // Dev needs 'unsafe-eval' due to - // https://github.com/vercel/next.js/issues/14221 options.contentSecurityPolicy.directives["script-src"] = [ "'self'", + // Dev needs 'unsafe-eval' due to + // https://github.com/vercel/next.js/issues/14221 "'unsafe-eval'", + // Ruru needs 'unsafe-inline' + "'unsafe-inline'", ]; } diff --git a/@app/server/src/middleware/installPostGraphile.ts b/@app/server/src/middleware/installPostGraphile.ts index 5cd253ec..dd3d3139 100644 --- a/@app/server/src/middleware/installPostGraphile.ts +++ b/@app/server/src/middleware/installPostGraphile.ts @@ -1,13 +1,15 @@ import { Express, Request, Response } from "express"; -import { createServer } from "http"; -import { enhanceHttpServerWithSubscriptions, postgraphile } from "postgraphile"; +import { ServerResponse } from "http"; +import { OutgoingHttpHeaders } from "http2"; +import { postgraphile } from "postgraphile"; +import { grafserv } from "postgraphile/grafserv/express/v4"; import { getHttpServer, getUpgradeHandlers, getWebsocketMiddlewares, } from "../app"; -import { getPostGraphileOptions } from "../graphile.config"; +import { getPreset } from "../graphile.config"; import { getAuthPgPool, getRootPgPool } from "./installDatabasePools"; export default async function installPostGraphile(app: Express) { @@ -15,41 +17,69 @@ export default async function installPostGraphile(app: Express) { const authPgPool = getAuthPgPool(app); const rootPgPool = getRootPgPool(app); const httpServer = getHttpServer(app); - // Forbid PostGraphile from adding websocket listeners to httpServer - (httpServer as any)["__postgraphileSubscriptionsEnabled"] = true; - const middleware = postgraphile( - authPgPool, - "app_public", - getPostGraphileOptions({ - websocketMiddlewares, + + const pgl = postgraphile( + getPreset({ + authPgPool, rootPgPool, }) ); - app.set("postgraphileMiddleware", middleware); - - app.use(middleware); + app.set("pgl", pgl); - // Extract the upgrade handler from PostGraphile so we can mix it with - // other upgrade handlers. - const fakeHttpServer = createServer(); - await enhanceHttpServerWithSubscriptions(fakeHttpServer, middleware); - const postgraphileUpgradeHandler = fakeHttpServer.listeners( - "upgrade" - )[0] as any; - // Prevent PostGraphile registering its websocket handler + const serv = pgl.createServ(grafserv); + serv.addTo(app, httpServer, false); - // Now handle websockets - if (postgraphileUpgradeHandler) { + // Handle websockets + const onUpgrade = await serv.getUpgradeHandler(); + if (onUpgrade) { const upgradeHandlers = getUpgradeHandlers(app); upgradeHandlers.push({ name: "PostGraphile", - check(req) { - return ( - (req.url === "/graphql" || req.url?.startsWith("/graphql?")) ?? false - ); + check: serv.shouldHandleUpgrade.bind(serv), + async upgrade(originalReq, socket, head) { + const req = originalReq as Request; + // Create a "dummy" response to trick our small array of middlewares into running + const dummyRes = new ServerResponse(req) as Response; + dummyRes.writeHead = (( + statusCode: number, + _statusMessage?: OutgoingHttpHeaders | string | undefined, + headers?: OutgoingHttpHeaders | undefined + ): Response => { + if (statusCode && statusCode > 200) { + // tslint:disable-next-line no-console + console.error( + `Something used 'writeHead' to write a '${statusCode}' error for websockets - check the middleware you're passing!` + ); + socket.destroy(); + } else if (headers) { + // tslint:disable-next-line no-console + console.error( + "Passing headers to 'writeHead' is not supported with websockets currently - check the middleware you're passing" + ); + socket.destroy(); + } + return dummyRes; + }) as any; + (req as any).res = dummyRes; + // Apply websocket middlewares + try { + for (const middleware of websocketMiddlewares) { + await new Promise((resolve, reject) => + middleware(req, dummyRes, (err: any) => + err ? reject(err) : resolve() + ) + ); + } + return onUpgrade(req, socket, head); + } catch (e) { + console.error( + "Error occurred whilst applying websocket middlewares", + e + ); + socket.destroy(); + } }, - upgrade: postgraphileUpgradeHandler, }); } } diff --git a/@app/server/src/plugins/Orders.ts b/@app/server/src/plugins/Orders.ts index 0d81bab7..1fdaf558 100644 --- a/@app/server/src/plugins/Orders.ts +++ b/@app/server/src/plugins/Orders.ts @@ -1,19 +1,38 @@ import { makeAddPgTableOrderByPlugin, orderByAscDesc } from "graphile-utils"; +import type { SQL } from "pg-sql2"; export default makeAddPgTableOrderByPlugin( - "app_public", - "organization_memberships", - ({ pgSql: sql }) => { - const sqlIdentifier = sql.identifier(Symbol("member")); - return orderByAscDesc( - "MEMBER_NAME", - // @ts-ignore - ({ queryBuilder }) => sql.fragment`( - select ${sqlIdentifier}.name - from app_public.users as ${sqlIdentifier} - where ${sqlIdentifier}.id = ${queryBuilder.getTableAlias()}.user_id - limit 1 - )` + { schemaName: "app_public", tableName: "organization_memberships" }, + (build) => { + const { + sql, + input: { + pgRegistry: { pgResources }, + }, + } = build; + const usersResource = Object.values(pgResources).find( + (s) => + !s.parameters && + s.extensions?.pg?.schemaName === "app_public" && + s.extensions.pg.name === "users" ); + if (!usersResource) { + throw new Error(`Couldn't find the source for app_public.users`); + } + const sqlIdentifier = sql.identifier(Symbol("member")); + return orderByAscDesc("MEMBER_NAME", ($organizationMemberships) => { + $organizationMemberships.join({ + type: "inner", + from: usersResource.from as SQL, + alias: sqlIdentifier, + conditions: [ + sql`${sqlIdentifier}.id = ${$organizationMemberships.alias}.user_id`, + ], + }); + return { + fragment: sql`${sqlIdentifier}.name`, + codec: usersResource.codec.attributes!["name"].codec, + }; + }); } ); diff --git a/@app/server/src/plugins/PassportLoginPlugin.ts b/@app/server/src/plugins/PassportLoginPlugin.ts index bca1b432..4873a223 100644 --- a/@app/server/src/plugins/PassportLoginPlugin.ts +++ b/@app/server/src/plugins/PassportLoginPlugin.ts @@ -1,6 +1,8 @@ -import { gql, makeExtendSchemaPlugin, Resolvers } from "graphile-utils"; +import type { ExecutableStep } from "grafast"; +import { access } from "grafast"; +import type { ObjectResolver } from "graphile-utils"; +import { gql, makeExtendSchemaPlugin } from "graphile-utils"; -import { OurGraphQLContext } from "../graphile.config"; import { ERROR_MESSAGE_OVERRIDES } from "../utils/handleErrors"; const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { @@ -14,7 +16,7 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { } type RegisterPayload { - user: User! @pgField + user: User! } input LoginInput { @@ -23,7 +25,7 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { } type LoginPayload { - user: User! @pgField + user: User! } type LogoutPayload { @@ -85,12 +87,34 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { resetPassword(input: ResetPasswordInput!): ResetPasswordPayload } `; - const resolvers: Resolvers = { + const userResource = build.input.pgRegistry.pgResources.users; + const currentUserIdResource = + build.input.pgRegistry.pgResources.current_user_id; + if (!userResource || !currentUserIdResource) { + throw new Error( + "Couldn't find either the 'users' or 'current_user_id' source" + ); + } + const plans = { + RegisterPayload: { + user($obj: ExecutableStep<{ userId: number }>) { + const $userId = access($obj, "userId"); + return userResource.get({ id: $userId }); + }, + }, + LoginPayload: { + user() { + const $userId = + currentUserIdResource.execute() as ExecutableStep; + return userResource.get({ id: $userId }); + }, + }, + }; + const resolvers: { Mutation: ObjectResolver } = { Mutation: { - async register(_mutation, args, context: OurGraphQLContext, resolveInfo) { - const { selectGraphQLResultFromTable } = resolveInfo.graphile; + async register(_mutation, args, context: Grafast.Context) { const { username, password, email, name, avatarUrl } = args.input; - const { rootPgPool, login, pgClient } = context; + const { rootPgPool, login, pgSettings } = context; try { // Create a user and create a session for it in the proccess const { @@ -123,28 +147,15 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { } if (details.session_id) { - // Store into transaction - await pgClient.query( - `select set_config('jwt.claims.session_id', $1, true)`, - [details.session_id] - ); + // Update pgSettings so future queries will use the new session + pgSettings!["jwt.claims.session_id"] = details.session_id; // Tell Passport.js we're logged in await login({ session_id: details.session_id }); } - // Fetch the data that was requested from GraphQL, and return it - const sql = build.pgSql; - const [row] = await selectGraphQLResultFromTable( - sql.fragment`app_public.users`, - (tableAlias, sqlBuilder) => { - sqlBuilder.where( - sql.fragment`${tableAlias}.id = ${sql.value(details.user_id)}` - ); - } - ); return { - data: row, + userId: details.user_id, }; } catch (e: any) { const { code } = e; @@ -155,6 +166,7 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { ...Object.keys(ERROR_MESSAGE_OVERRIDES), ]; if (safeErrorCodes.includes(code)) { + // TODO: make SafeError throw e; } else { console.error( @@ -167,10 +179,9 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { } } }, - async login(_mutation, args, context: OurGraphQLContext, resolveInfo) { - const { selectGraphQLResultFromTable } = resolveInfo.graphile; + async login(_mutation, args, context: Grafast.Context) { const { username, password } = args.input; - const { rootPgPool, login, pgClient } = context; + const { rootPgPool, login, pgSettings } = context; try { // Call our login function to find out if the username/password combination exists const { @@ -191,29 +202,15 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { await login({ session_id: session.uuid }); } - // Get session_id from PG - await pgClient.query( - `select set_config('jwt.claims.session_id', $1, true)`, - [session.uuid] - ); + // Update pgSettings so future queries will use the new session + pgSettings!["jwt.claims.session_id"] = session.uuid; - // Fetch the data that was requested from GraphQL, and return it - const sql = build.pgSql; - const [row] = await selectGraphQLResultFromTable( - sql.fragment`app_public.users`, - (tableAlias, sqlBuilder) => { - sqlBuilder.where( - sql.fragment`${tableAlias}.id = app_public.current_user_id()` - ); - } - ); - return { - data: row, - }; + return {}; } catch (e: any) { const code = e.extensions?.code ?? e.code; const safeErrorCodes = ["LOCKD", "CREDS"]; if (safeErrorCodes.includes(code)) { + // TODO: throw SafeError throw e; } else { console.error(e); @@ -224,21 +221,18 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { } }, - async logout(_mutation, _args, context: OurGraphQLContext, _resolveInfo) { - const { pgClient, logout } = context; - await pgClient.query("select app_public.logout();"); + async logout(_mutation, _args, context: Grafast.Context) { + const { pgSettings, withPgClient, logout } = context; + await withPgClient(pgSettings, (pgClient) => + pgClient.query({ text: "select app_public.logout();" }) + ); await logout(); return { success: true, }; }, - async resetPassword( - _mutation, - args, - context: OurGraphQLContext, - _resolveInfo - ) { + async resetPassword(_mutation, args, context: Grafast.Context) { const { rootPgPool } = context; const { userId, resetToken, newPassword, clientMutationId } = args.input; @@ -264,6 +258,7 @@ const PassportLoginPlugin = makeExtendSchemaPlugin((build) => { }; return { typeDefs, + plans, resolvers, }; }); diff --git a/@app/server/src/plugins/PrimaryKeyMutationsOnlyPlugin.ts b/@app/server/src/plugins/PrimaryKeyMutationsOnlyPlugin.ts index 7659a1f6..79dd885e 100644 --- a/@app/server/src/plugins/PrimaryKeyMutationsOnlyPlugin.ts +++ b/@app/server/src/plugins/PrimaryKeyMutationsOnlyPlugin.ts @@ -1,24 +1,27 @@ -import { Plugin } from "graphile-build"; +import type { GraphileConfig } from "postgraphile"; -type PgConstraint = any; - -const PrimaryKeyMutationsOnlyPlugin: Plugin = (builder) => { - builder.hook( - "build", - (build) => { - build.pgIntrospectionResultsByKind.constraint.forEach( - (constraint: PgConstraint) => { - if (!constraint.tags.omit && constraint.type !== "p") { - constraint.tags.omit = ["update", "delete"]; +const PrimaryKeyMutationsOnlyPlugin: GraphileConfig.Plugin = { + name: "PrimaryKeyMutationsOnlyPlugin", + version: "0.0.0", + gather: { + hooks: { + pgIntrospection_introspection(info, event) { + const { introspection } = event; + for (const pgConstraint of introspection.constraints) { + if (pgConstraint.contype === "u") { + const tags = pgConstraint.getTags(); + const newBehavior = ["-update", "-delete"]; + if (typeof tags.behavior === "string") { + newBehavior.push(tags.behavior); + } else if (Array.isArray(tags.behavior)) { + newBehavior.push(...(tags.behavior as string[])); + } + tags.behavior = newBehavior; } } - ); - return build; + }, }, - [], - [], - ["PgIntrospection"] - ); + }, }; export default PrimaryKeyMutationsOnlyPlugin; diff --git a/@app/server/src/plugins/RemoveQueryQueryPlugin.ts b/@app/server/src/plugins/RemoveQueryQueryPlugin.ts index eee6a30a..dce02ada 100644 --- a/@app/server/src/plugins/RemoveQueryQueryPlugin.ts +++ b/@app/server/src/plugins/RemoveQueryQueryPlugin.ts @@ -1,12 +1,18 @@ -import { Plugin } from "postgraphile"; +import type { GraphileConfig } from "postgraphile"; -const RemoveQueryQueryPlugin: Plugin = (builder) => { - builder.hook("GraphQLObjectType:fields", (fields, build, context) => { - if (context.scope.isRootQuery) { - delete fields.query; - } - return fields; - }); +const RemoveQueryQueryPlugin: GraphileConfig.Plugin = { + name: "RemoveQueryQueryPlugin", + version: "0.0.0", + schema: { + hooks: { + GraphQLObjectType_fields(fields, _build, context) { + if (context.scope.isRootQuery) { + delete fields.query; + } + return fields; + }, + }, + }, }; export default RemoveQueryQueryPlugin; diff --git a/@app/server/src/plugins/SubscriptionsPlugin.ts b/@app/server/src/plugins/SubscriptionsPlugin.ts index 5875419b..d3c54508 100644 --- a/@app/server/src/plugins/SubscriptionsPlugin.ts +++ b/@app/server/src/plugins/SubscriptionsPlugin.ts @@ -1,27 +1,8 @@ -import { Build } from "graphile-build"; -import { QueryBuilder, SQL } from "graphile-build-pg"; -import { - embed /*, AugmentedGraphQLFieldResolver */, - gql, - makeExtendSchemaPlugin, -} from "graphile-utils"; -// graphile-utils doesn't export this yet -import { GraphQLResolveInfo } from "graphql"; - -import { OurGraphQLContext } from "../graphile.config"; -type GraphileHelpers = any; -type AugmentedGraphQLFieldResolver< - TSource, - TContext, - TArgs = { [argName: string]: any }, -> = ( - parent: TSource, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo & { - graphile: GraphileHelpers; - } -) => any; +import type { JSONValue } from "@dataplan/json"; +import { jsonParse } from "@dataplan/json"; +import type { ExecutableStep } from "grafast"; +import { access, context, lambda, listen, SafeError } from "grafast"; +import { gql, makeExtendSchemaPlugin } from "graphile-utils"; /* * PG NOTIFY events are sent via a channel, this function helps us determine @@ -31,27 +12,13 @@ type AugmentedGraphQLFieldResolver< * NOTE: channels are limited to 63 characters in length (this is a PostgreSQL * limitation). */ -const currentUserTopicFromContext = async ( - _args: {}, - context: { [key: string]: any }, - _resolveInfo: GraphQLResolveInfo -) => { - let userId: number | null = null; - if (context.sessionId /* fail fast */) { - // We have the users session ID, but to get their actual ID we need to ask the database. - const { - rows: [user], - } = await context.pgClient.query( - "select app_public.current_user_id() as id" - ); - userId = user?.id; - } +function currentUserTopicByUserId(userId: string | null) { if (userId) { return `graphql:user:${userId}`; } else { - throw new Error("You're not logged in"); + throw new SafeError("You're not logged in"); } -}; +} /* * This plugin adds a number of custom subscriptions to our schema. By making @@ -67,10 +34,24 @@ const currentUserTopicFromContext = async ( * And see the database trigger function `app_public.tg__graphql_subscription()`. */ const SubscriptionsPlugin = makeExtendSchemaPlugin((build) => { - const { pgSql: sql } = build; + const currentUserIdResource = + build.input.pgRegistry.pgResources.current_user_id; + if (!currentUserIdResource) { + throw new Error("Couldn't find current_user_id source"); + } + const usersResource = Object.values(build.input.pgRegistry.pgResources).find( + (s) => + !s.parameters && + s.extensions?.pg?.schemaName === "app_public" && + s.extensions.pg.name === "users" + ); + if (!usersResource) { + throw new Error("Couldn't find source for app_public.users"); + } + return { typeDefs: gql` - type UserSubscriptionPayload { + type UserSubscriptionPayload { user: User # Populated by our resolver below event: String # Part of the NOTIFY payload } @@ -79,14 +60,30 @@ const SubscriptionsPlugin = makeExtendSchemaPlugin((build) => { """ Triggered when the logged in user's record is updated in some way. """ - currentUserUpdated: UserSubscriptionPayload @pgSubscription(topic: ${embed( - currentUserTopicFromContext - )}) + currentUserUpdated: UserSubscriptionPayload } `, - resolvers: { + plans: { + Subscription: { + currentUserUpdated: { + subscribePlan() { + const $pgSubscriber = context().get("pgSubscriber"); + // We have the users session ID, but to get their actual ID we need to ask the database. + const $userId = + currentUserIdResource.execute() as ExecutableStep; + const $topic = lambda($userId, currentUserTopicByUserId); + return listen($pgSubscriber, $topic, (e) => e); + }, + plan($e) { + return jsonParse($e); + }, + }, + }, UserSubscriptionPayload: { - user: recordByIdFromTable(build, sql.fragment`app_public.users`), + user($obj: ExecutableStep) { + const $id = access($obj, "subject"); + return usersResource.get({ id: $id }); + }, }, }, }; @@ -96,35 +93,7 @@ const SubscriptionsPlugin = makeExtendSchemaPlugin((build) => { interface TgGraphQLSubscriptionPayload { event: string; subject: string | null; -} - -/* - * This function handles the boilerplate of fetching a record from the database - * which has the 'id' equal to the 'subject' from the PG NOTIFY event payload - * (see `tg__graphql_subscription()` trigger function in the database). - */ - -function recordByIdFromTable( - build: Build, - sqlTable: SQL -): AugmentedGraphQLFieldResolver { - const { pgSql: sql } = build; - return async ( - event: TgGraphQLSubscriptionPayload, - _args: {}, - _context: OurGraphQLContext, - { graphile: { selectGraphQLResultFromTable } } - ) => { - const rows = await selectGraphQLResultFromTable( - sqlTable, - (tableAlias: SQL, sqlBuilder: QueryBuilder) => { - sqlBuilder.where( - sql.fragment`${tableAlias}.id = ${sql.value(event.subject)}` - ); - } - ); - return rows[0]; - }; + id: string; } export default SubscriptionsPlugin; diff --git a/data/schema.graphql b/data/schema.graphql index 862c36cd..190eaba9 100644 --- a/data/schema.graphql +++ b/data/schema.graphql @@ -97,7 +97,7 @@ type CreateOrganizationPayload { """An edge for our `Organization`. May be used by Relay 1.""" organizationEdge( """The method to use when ordering `Organization`.""" - orderBy: [OrganizationsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [OrganizationsOrderBy!]! = [PRIMARY_KEY_ASC] ): OrganizationsEdge """ @@ -140,7 +140,7 @@ type CreateUserEmailPayload { """An edge for our `UserEmail`. May be used by Relay 1.""" userEmailEdge( """The method to use when ordering `UserEmail`.""" - orderBy: [UserEmailsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [UserEmailsOrderBy!]! = [PRIMARY_KEY_ASC] ): UserEmailsEdge } @@ -149,7 +149,10 @@ scalar Cursor """ A point in time as described by the [ISO -8601](https://en.wikipedia.org/wiki/ISO_8601) standard. May or may not include a timezone. +8601](https://en.wikipedia.org/wiki/ISO_8601) and, if it has a timezone, [RFC +3339](https://datatracker.ietf.org/doc/html/rfc3339) standards. Input values +that do not conform to both ISO 8601 and RFC 3339 may be coerced, which may lead +to unexpected results. """ scalar Datetime @@ -194,7 +197,6 @@ type DeleteUserAuthenticationPayload { unchanged and unused. May be used by a client to track mutations. """ clientMutationId: String - deletedUserAuthenticationNodeId: ID """ Our root query field type. Allows us to run any query from our mutation payload. @@ -225,7 +227,6 @@ type DeleteUserEmailPayload { unchanged and unused. May be used by a client to track mutations. """ clientMutationId: String - deletedUserEmailNodeId: ID """ Our root query field type. Allows us to run any query from our mutation payload. @@ -241,7 +242,7 @@ type DeleteUserEmailPayload { """An edge for our `UserEmail`. May be used by Relay 1.""" userEmailEdge( """The method to use when ordering `UserEmail`.""" - orderBy: [UserEmailsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [UserEmailsOrderBy!]! = [PRIMARY_KEY_ASC] ): UserEmailsEdge } @@ -338,7 +339,7 @@ type MakeEmailPrimaryPayload { """An edge for our `UserEmail`. May be used by Relay 1.""" userEmailEdge( """The method to use when ordering `UserEmail`.""" - orderBy: [UserEmailsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [UserEmailsOrderBy!]! = [PRIMARY_KEY_ASC] ): UserEmailsEdge } @@ -751,13 +752,19 @@ type PageInfo { type Query { """The currently logged in user (or null if not logged in).""" currentUser: User + + """Get a single `Organization`.""" organization(id: UUID!): Organization + + """Get a single `Organization`.""" organizationBySlug(slug: String!): Organization """ Given an invitation UUID (and, if required, the code that was emailed to you), retrieves the `Organization` that you were invited to. """ organizationForInvitation(code: String, invitationId: UUID!): Organization + + """Get a single `OrganizationMembership`.""" organizationMembership(id: UUID!): OrganizationMembership """Reads and enables pagination through a set of `Organization`.""" @@ -788,9 +795,17 @@ type Query { """The method to use when ordering `Organization`.""" orderBy: [OrganizationsOrderBy!] = [PRIMARY_KEY_ASC] ): OrganizationsConnection + + """Get a single `User`.""" user(id: UUID!): User + + """Get a single `UserAuthentication`.""" userAuthentication(id: UUID!): UserAuthentication + + """Get a single `User`.""" userByUsername(username: String!): User + + """Get a single `UserEmail`.""" userEmail(id: UUID!): UserEmail } @@ -938,7 +953,7 @@ type TransferOrganizationBillingContactPayload { """An edge for our `Organization`. May be used by Relay 1.""" organizationEdge( """The method to use when ordering `Organization`.""" - orderBy: [OrganizationsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [OrganizationsOrderBy!]! = [PRIMARY_KEY_ASC] ): OrganizationsEdge """ @@ -970,7 +985,7 @@ type TransferOrganizationOwnershipPayload { """An edge for our `Organization`. May be used by Relay 1.""" organizationEdge( """The method to use when ordering `Organization`.""" - orderBy: [OrganizationsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [OrganizationsOrderBy!]! = [PRIMARY_KEY_ASC] ): OrganizationsEdge """ @@ -1013,7 +1028,7 @@ type UpdateOrganizationPayload { """An edge for our `Organization`. May be used by Relay 1.""" organizationEdge( """The method to use when ordering `Organization`.""" - orderBy: [OrganizationsOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [OrganizationsOrderBy!]! = [PRIMARY_KEY_ASC] ): OrganizationsEdge """ @@ -1058,7 +1073,7 @@ type UpdateUserPayload { """An edge for our `User`. May be used by Relay 1.""" userEdge( """The method to use when ordering `User`.""" - orderBy: [UsersOrderBy!] = [PRIMARY_KEY_ASC] + orderBy: [UsersOrderBy!]! = [PRIMARY_KEY_ASC] ): UsersEdge } diff --git a/package.json b/package.json index 7c98ce31..f62bb7ad 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "abort-controller": "^3.0.0", - "graphql": "^15.8.0" + "graphql": "^16.1.0-experimental-stream-defer.6" }, "devDependencies": { "@babel/core": "^7.21.0", @@ -73,7 +73,6 @@ "mock-res": "^0.6.0", "node-fetch": "^3.3.1", "nodemon": "^2.0.20", - "pg": "^8.9.0", "prettier": "^3.1.1", "rimraf": "^4.1.2", "ts-jest": "^29.0.5", @@ -83,7 +82,7 @@ "update-dotenv": "^1.1.1" }, "resolutions": { - "graphql": "15.x", + "graphql": "16.1.0-experimental-stream-defer.6", "pg-connection-string": "2.x" }, "workspaces": { diff --git a/yarn.lock b/yarn.lock index d6b08a2c..4fcbae15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -217,7 +217,7 @@ __metadata: antd: 5.2.3 cross-env: ^7.0.3 dayjs: ^1.11.7 - graphql: ^15.8.0 + graphql: ^16.1.0-experimental-stream-defer.6 jest: ^29.4.3 lodash: ^4.17.21 net: ^1.0.2 @@ -263,7 +263,6 @@ __metadata: version: 0.0.0-use.local resolution: "@app/db@workspace:@app/db" dependencies: - "@types/pg": ^8.6.6 cross-env: ^7.0.3 graphile-migrate: ^1.4.1 graphile-worker: ^0.13.0 @@ -310,12 +309,13 @@ __metadata: "@types/zxcvbn": ^4.4.1 cross-env: ^7.0.3 express: ^4.20.0 - graphql: ^15.8.0 + grafast: 0.0.1-beta.8 + graphql: ^16.1.0-experimental-stream-defer.6 graphql-ws: ^5.11.3 jest: ^29.4.3 next: ^13.2.3 next-with-apollo: ^5.3.0 - postgraphile: ^4.13.0 + postgraphile: 5.0.0-beta.2 rc-field-form: ^1.27.4 react: ^18.2.0 react-dom: ^18.2.0 @@ -331,10 +331,10 @@ __metadata: dependencies: "@app/client": 0.0.0 "@app/config": 0.0.0 - "@graphile-contrib/pg-simplify-inflector": ^6.1.0 - "@graphile/pg-pubsub": ^4.13.0 - "@graphile/pro": ^1.0.4 - "@types/connect-pg-simple": ^7.0.0 + "@dataplan/json": 0.0.1-beta.2 + "@dataplan/pg": 0.0.1-beta.2 + "@graphile/simplify-inflection": 8.0.0-beta.1 + "@types/connect-pg-simple": ^7.0.3 "@types/csurf": ^1.11.2 "@types/express-session": ^1.17.6 "@types/helmet": ^4.0.0 @@ -342,7 +342,6 @@ __metadata: "@types/node": ^18.14.2 "@types/passport": ^1.0.12 "@types/passport-github2": ^1.2.5 - "@types/pg": ^8.6.6 "@types/redis": ^4.0.11 body-parser: ^1.20.3 bufferutil: ^4.0.7 @@ -352,11 +351,10 @@ __metadata: csurf: ^1.11.0 express: ^4.20.0 express-session: ^1.17.3 - graphile-build: ^4.13.0 - graphile-build-pg: ^4.13.0 - graphile-utils: ^4.13.0 + grafast: 0.0.1-beta.8 + graphile-utils: 5.0.0-beta.2 graphile-worker: ^0.13.0 - graphql: ^15.8.0 + graphql: ^16.1.0-experimental-stream-defer.6 helmet: ^6.0.1 jest: ^29.4.3 lodash: ^4.17.21 @@ -366,7 +364,8 @@ __metadata: passport: ^0.6.0 passport-github2: ^0.1.12 pg: ^8.9.0 - postgraphile: ^4.13.0 + pg-sql2: 5.0.0 + postgraphile: 5.0.0-beta.2 redis: ^4.6.5 source-map-support: ^0.5.21 ts-node: ^10.9.1 @@ -1995,6 +1994,46 @@ __metadata: languageName: node linkType: hard +"@dataplan/json@npm:0.0.1-beta.2": + version: 0.0.1-beta.2 + resolution: "@dataplan/json@npm:0.0.1-beta.2" + dependencies: + chalk: ^4.1.2 + tslib: ^2.5.0 + peerDependencies: + grafast: ^0.0.1-beta.2 + checksum: 1e415fd8dc617772f436a82f51b51dab61b08e89ae89aaea95d5fa071aa80053f1144f525bf46f6e6c3f61e50f6fa2e00ed4b952d7f88d17169d4dec1b8f5ec2 + languageName: node + linkType: hard + +"@dataplan/pg@npm:0.0.1-beta.2": + version: 0.0.1-beta.2 + resolution: "@dataplan/pg@npm:0.0.1-beta.2" + dependencies: + "@graphile/lru": ^5.0.0-beta.1 + "@types/node": ^18.15.5 + chalk: ^4.1.2 + debug: ^4.3.3 + eventemitter3: ^4.0.7 + pg-sql2: ^5.0.0-beta.1 + postgres-array: ~2.0.0 + postgres-range: ^1.1.1 + tslib: ^2.5.0 + peerDependencies: + "@dataplan/json": ^0.0.1-beta.2 + grafast: ^0.0.1-beta.2 + graphile-config: ^0.0.1-beta.1 + pg: ^8.7.1 + pg-sql2: ^5.0.0-beta.1 + peerDependenciesMeta: + graphile-config: + optional: true + pg: + optional: true + checksum: 27e09e50b582d18ad917df3243804eac741dd5604cb8ddff0b35fca39144edffb431e7d0e65ca7ca474699f3359de2ce85504354c24842bdebb4e261769f49f7 + languageName: node + linkType: hard + "@emnapi/core@npm:^1.4.3": version: 1.9.2 resolution: "@emnapi/core@npm:1.9.2" @@ -2030,6 +2069,22 @@ __metadata: languageName: node linkType: hard +"@emotion/is-prop-valid@npm:^1.4.0": + version: 1.4.0 + resolution: "@emotion/is-prop-valid@npm:1.4.0" + dependencies: + "@emotion/memoize": ^0.9.0 + checksum: 6b003cdc62106c2d5d12207c2d1352d674339252a2d7ac8d96974781d7c639833f35d22e7e331411795daaafa62f126c2824a4983584292b431e08b42877d51e + languageName: node + linkType: hard + +"@emotion/memoize@npm:^0.9.0": + version: 0.9.0 + resolution: "@emotion/memoize@npm:0.9.0" + checksum: 038132359397348e378c593a773b1148cd0cf0a2285ffd067a0f63447b945f5278860d9de718f906a74c7c940ba1783ac2ca18f1c06a307b01cc0e3944e783b1 + languageName: node + linkType: hard + "@emotion/unitless@npm:^0.7.5": version: 0.7.5 resolution: "@emotion/unitless@npm:0.7.5" @@ -2079,6 +2134,58 @@ __metadata: languageName: node linkType: hard +"@floating-ui/core@npm:^1.7.5": + version: 1.7.5 + resolution: "@floating-ui/core@npm:1.7.5" + dependencies: + "@floating-ui/utils": ^0.2.11 + checksum: 9dda28bb1d301305ba407ad61fc1acf0f498819a6976e0b9c0a91069d92fb4b4bc8d6cffd1c68c4c281cffd0f7d267cbc2e56ea622f91c342aaa060d5b73d5db + languageName: node + linkType: hard + +"@floating-ui/dom@npm:^1.7.6": + version: 1.7.6 + resolution: "@floating-ui/dom@npm:1.7.6" + dependencies: + "@floating-ui/core": ^1.7.5 + "@floating-ui/utils": ^0.2.11 + checksum: 0c1ba371a2e5b8cdbd6a88daafd8bb22cc415a5b50dbf23d829842c1551efe8e74fed5d34c89644fa8ee5dcf9b0470f9b2e9a3f82f91622abe6e1284b272d1c1 + languageName: node + linkType: hard + +"@floating-ui/react-dom@npm:^2.0.0, @floating-ui/react-dom@npm:^2.1.2": + version: 2.1.8 + resolution: "@floating-ui/react-dom@npm:2.1.8" + dependencies: + "@floating-ui/dom": ^1.7.6 + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: f81777f92bfbdc3bdb852f3c15d2609ffcd207e15db7cd2b58680ea9bd0574ba37a472475dfb71dbfcbfbdef40792ab8120f327df2050d52193bafff8db9aa71 + languageName: node + linkType: hard + +"@floating-ui/react@npm:^0.26.16": + version: 0.26.28 + resolution: "@floating-ui/react@npm:0.26.28" + dependencies: + "@floating-ui/react-dom": ^2.1.2 + "@floating-ui/utils": ^0.2.8 + tabbable: ^6.0.0 + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 1bfcccdb1f388ceb0075dc3e46934f4f04ef10bff2f971e1bf79067391c8729b366025caca0a42f5ca80854820a621a9edecbacdc046c33eb428f508fd6ce1f3 + languageName: node + linkType: hard + +"@floating-ui/utils@npm:^0.2.11, @floating-ui/utils@npm:^0.2.8": + version: 0.2.11 + resolution: "@floating-ui/utils@npm:0.2.11" + checksum: e98a2da3e36bd476460b0b85c3ba37c254516790d8c5eafa79ecf67bae7f2230c46d5fabce196aaf08bcd31586828e2df718cd2ccd1d333f18120f8adef66828 + languageName: node + linkType: hard + "@gar/promisify@npm:^1.1.3": version: 1.1.3 resolution: "@gar/promisify@npm:1.1.3" @@ -2086,13 +2193,6 @@ __metadata: languageName: node linkType: hard -"@graphile-contrib/pg-simplify-inflector@npm:^6.1.0": - version: 6.1.0 - resolution: "@graphile-contrib/pg-simplify-inflector@npm:6.1.0" - checksum: cd9ca7d2769f60b77ad83368b128a6c6fd6e596442b5094a8a8473a7ad92df1496c4c278106858daafe65489f7428dfd816c23b36c6de73092af0e05c8287822 - languageName: node - linkType: hard - "@graphile/logger@npm:^0.2.0": version: 0.2.0 resolution: "@graphile/logger@npm:0.2.0" @@ -2100,43 +2200,95 @@ __metadata: languageName: node linkType: hard -"@graphile/lru@npm:4.11.0": - version: 4.11.0 - resolution: "@graphile/lru@npm:4.11.0" +"@graphile/lru@npm:^5.0.0, @graphile/lru@npm:^5.0.0-beta.1, @graphile/lru@npm:^5.0.0-beta.3, @graphile/lru@npm:^5.0.0-beta.4": + version: 5.0.0 + resolution: "@graphile/lru@npm:5.0.0" dependencies: - tslib: ^2.0.1 - checksum: c92fdbcdf3d8cd75666f2d62c8afddf7cbf9b30ce3a9cee76f56553e6993aa4fe003d69b3eb2795c95fb8203670dd9dd98fc57bc3f51bf58b6bb5a6735f9213e + tslib: ^2.8.1 + checksum: 5f84469796ffa4b98ebb536e75810640a21614f9a206e1a5b09527639ae62e64128bd01cbe6c469e3e94ba6231e929939bc65fef47b805987658e63e16c2ce09 languageName: node linkType: hard -"@graphile/pg-pubsub@npm:^4.13.0": - version: 4.13.0 - resolution: "@graphile/pg-pubsub@npm:4.13.0" +"@graphile/simplify-inflection@npm:8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@graphile/simplify-inflection@npm:8.0.0-beta.1" + checksum: cd465782b5fc21f90bba7df978f663320ef8a0e02e4ade079c92762ab1c78d765e7048f058d668f1759fdc785e2091dfe5fdf5bf12609af6066882b4ca07c71d + languageName: node + linkType: hard + +"@graphiql/plugin-doc-explorer@npm:^0.4.1": + version: 0.4.1 + resolution: "@graphiql/plugin-doc-explorer@npm:0.4.1" dependencies: - "@types/debug": ^4.1.4 - "@types/pg": ">=6 <9" - debug: ^4.1.1 - graphql-subscriptions: ^1.1.0 - tslib: ^2.0.1 + "@headlessui/react": ^2.2 + zustand: ^5 peerDependencies: - graphile-build: 4.x - graphql: ">=0.6 <16" - postgraphile: ^4.4.0-beta.10 - checksum: 64a35d5681e530d6b196a8626f2ecadbbeb325f5d42ccd183c087398771098d634bcb7f0fe0fa4136072c9446d83cdec71940930d9c2c4f92341aaf7d95964e7 + "@graphiql/react": ^0.37.0 + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + react: ^18 || ^19 + react-compiler-runtime: 19.1.0-rc.1 + react-dom: ^18 || ^19 + checksum: 74b34cc4da9971279de377211798bc7eea16748d953939237a0dae3550ac5e79584415ff683249d0d660c9d0d5be96a42ad6672d31ad3f41c0c1ca84065a0211 languageName: node linkType: hard -"@graphile/pro@npm:^1.0.4": - version: 1.0.4 - resolution: "@graphile/pro@npm:1.0.4" +"@graphiql/plugin-history@npm:^0.4.1": + version: 0.4.1 + resolution: "@graphiql/plugin-history@npm:0.4.1" dependencies: - "@types/pg": ">=6 <9" - graphql: ">=0.9 <16" - graphql-depth-limit: ^1.1.0 - pg: ">=6.1.0 <9" + "@graphiql/toolkit": ^0.11.3 + zustand: ^5 + peerDependencies: + "@graphiql/react": ^0.37.0 + react: ^18 || ^19 + react-compiler-runtime: 19.1.0-rc.1 + react-dom: ^18 || ^19 + checksum: 3d0f3fa68c1ea6c0c95852b4174de9c7445304e6ee988be4060dfad783b594a83ab391773df611710f4341d4e0e2bf8ac42fce362ff0446a06afd2aba66a206c + languageName: node + linkType: hard + +"@graphiql/react@npm:^0.37.3": + version: 0.37.3 + resolution: "@graphiql/react@npm:0.37.3" + dependencies: + "@graphiql/toolkit": ^0.11.3 + "@radix-ui/react-dialog": ^1.1 + "@radix-ui/react-dropdown-menu": ^2.1 + "@radix-ui/react-tooltip": ^1.2 + "@radix-ui/react-visually-hidden": ^1.2 + clsx: ^1.2.1 + framer-motion: ^12.12 + get-value: ^3.0.1 + graphql-language-service: ^5.5.0 + jsonc-parser: ^3.3.1 + markdown-it: ^14.1.0 + monaco-editor: 0.52.2 + monaco-graphql: ^1.7.3 + prettier: ^3.5.3 + set-value: ^4.1.0 + zustand: ^5 peerDependencies: - postgraphile: ^4.9.1 - checksum: 18bb39a81db05d4523ee8480fade710b5ae1989f95385b72085445faa597f00cf3f44028ca8662e0a5b29076cec71a17ca942685c313e714141be2ded1f79c76 + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + react: ^18 || ^19 + react-compiler-runtime: 19.1.0-rc.1 + react-dom: ^18 || ^19 + checksum: 2b2f9f11b9a147f3a645e8e733da2984524dd4961660a6b53b32276d1d03767770f7b2a910c5e728cd23e66d51f3a48967d650857bebe1a9c6cd453cec631c0b + languageName: node + linkType: hard + +"@graphiql/toolkit@npm:^0.11.3": + version: 0.11.3 + resolution: "@graphiql/toolkit@npm:0.11.3" + dependencies: + "@n1ru4l/push-pull-async-iterable-iterator": ^3.1.0 + meros: ^1.1.4 + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + graphql-ws: ">= 4.5.0" + peerDependenciesMeta: + graphql-ws: + optional: true + checksum: 1e513b05e41b27fa7bc1a8d5c41f2f9a3fa817e8b481872872373870188234c792aa978e48f59cdfa58c415ed5af4036b256542ad53ccebcb33384c076b511fc languageName: node linkType: hard @@ -2777,6 +2929,22 @@ __metadata: languageName: node linkType: hard +"@headlessui/react@npm:^2.2": + version: 2.2.9 + resolution: "@headlessui/react@npm:2.2.9" + dependencies: + "@floating-ui/react": ^0.26.16 + "@react-aria/focus": ^3.20.2 + "@react-aria/interactions": ^3.25.0 + "@tanstack/react-virtual": ^3.13.9 + use-sync-external-store: ^1.5.0 + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + checksum: 32b8bbf62d09a53f6c2a3a49e9cab868a024810b53f1b12fb00e34ce4dc45c3c48acb09abcd319fb2da60a2d13482500be758c4fc112ec6e64b1cc587ea9825a + languageName: node + linkType: hard + "@humanwhocodes/config-array@npm:^0.11.8": version: 0.11.8 resolution: "@humanwhocodes/config-array@npm:0.11.8" @@ -3180,6 +3348,13 @@ __metadata: languageName: node linkType: hard +"@n1ru4l/push-pull-async-iterable-iterator@npm:^3.1.0": + version: 3.2.0 + resolution: "@n1ru4l/push-pull-async-iterable-iterator@npm:3.2.0" + checksum: 2c7bdbc6c3d8f0aa05c2e3e80c4a856f766e6113a86198fd0df2448117f7cfa71ee2946f6aa7e745caec6ac04d19a5a61c6c80c6fdbf686d43984b3791f0a04d + languageName: node + linkType: hard + "@napi-rs/wasm-runtime@npm:^0.2.11": version: 0.2.12 resolution: "@napi-rs/wasm-runtime@npm:0.2.12" @@ -3412,6 +3587,598 @@ __metadata: languageName: node linkType: hard +"@radix-ui/primitive@npm:1.1.3": + version: 1.1.3 + resolution: "@radix-ui/primitive@npm:1.1.3" + checksum: ee27abbff0d6d305816e9314655eb35e72478ba47416bc9d5cb0581728be35e3408cfc0748313837561d635f0cb7dfaae26e61831f0e16c0fd7d669a612f2cb0 + languageName: node + linkType: hard + +"@radix-ui/react-arrow@npm:1.1.7": + version: 1.1.7 + resolution: "@radix-ui/react-arrow@npm:1.1.7" + dependencies: + "@radix-ui/react-primitive": 2.1.3 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 6cdf74f06090f8994cdf6d3935a44ea3ac309163a4f59c476482c4907e8e0775f224045030abf10fa4f9e1cb7743db034429249b9e59354988e247eeb0f4fdcf + languageName: node + linkType: hard + +"@radix-ui/react-collection@npm:1.1.7": + version: 1.1.7 + resolution: "@radix-ui/react-collection@npm:1.1.7" + dependencies: + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-context": 1.1.2 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-slot": 1.2.3 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: dd9bb015ef86205b4246f55bc84e5ad54519bb89b4825dd83e646fe95205191fe376bb31a9e847f9d66b710d0ef7fc9353c0b0ded7e8997a5c1f5be6addf94ef + languageName: node + linkType: hard + +"@radix-ui/react-compose-refs@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-compose-refs@npm:1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 9a91f0213014ffa40c5b8aae4debb993be5654217e504e35aa7422887eb2d114486d37e53c482d0fffb00cd44f51b5269fcdf397b280c71666fa11b7f32f165d + languageName: node + linkType: hard + +"@radix-ui/react-context@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-context@npm:1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 6d08437f23df362672259e535ae463e70bf7a0069f09bfa06c983a5a90e15250bde19da1d63ef8e3da06df1e1b4f92afa9d28ca6aa0297bb1c8aaf6ca83d28c5 + languageName: node + linkType: hard + +"@radix-ui/react-dialog@npm:^1.1": + version: 1.1.15 + resolution: "@radix-ui/react-dialog@npm:1.1.15" + dependencies: + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-context": 1.1.2 + "@radix-ui/react-dismissable-layer": 1.1.11 + "@radix-ui/react-focus-guards": 1.1.3 + "@radix-ui/react-focus-scope": 1.1.7 + "@radix-ui/react-id": 1.1.1 + "@radix-ui/react-portal": 1.1.9 + "@radix-ui/react-presence": 1.1.5 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-slot": 1.2.3 + "@radix-ui/react-use-controllable-state": 1.2.2 + aria-hidden: ^1.2.4 + react-remove-scroll: ^2.6.3 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: a0834338ec66866ce301ef46e0dad9d99accf496f03b5021eceec7e2b79d7286b4f2c5e35f2387891e2bf33ef9a11d381dde2c8fe936a2f30cd50ca4e9bf4cb5 + languageName: node + linkType: hard + +"@radix-ui/react-direction@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-direction@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 8cc330285f1d06829568042ca9aabd3295be4690ae93683033fc8632b5c4dfc60f5c1312f6e2cae27c196189c719de3cfbcf792ff74800f9ccae0ab4abc1bc92 + languageName: node + linkType: hard + +"@radix-ui/react-dismissable-layer@npm:1.1.11": + version: 1.1.11 + resolution: "@radix-ui/react-dismissable-layer@npm:1.1.11" + dependencies: + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-use-callback-ref": 1.1.1 + "@radix-ui/react-use-escape-keydown": 1.1.1 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 8fc9f027c9f68940c69c9cc117c43e1313d1a78ae4109cf809868b82837e5e2a7d410adf78e97328d9d5a080a63e399918414985658ab029a8df7d775af23b68 + languageName: node + linkType: hard + +"@radix-ui/react-dropdown-menu@npm:^2.1": + version: 2.1.16 + resolution: "@radix-ui/react-dropdown-menu@npm:2.1.16" + dependencies: + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-context": 1.1.2 + "@radix-ui/react-id": 1.1.1 + "@radix-ui/react-menu": 2.1.16 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-use-controllable-state": 1.2.2 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 8178faa47e4ec58870db4f5c7fc158edf060bf00e9c9ed75e8028fdbc62dd9624b63ed5c461175be8e964d136f382b658881df68bdaf328da5c2ca56f8048f88 + languageName: node + linkType: hard + +"@radix-ui/react-focus-guards@npm:1.1.3": + version: 1.1.3 + resolution: "@radix-ui/react-focus-guards@npm:1.1.3" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: b57878f6cf0ebc3e8d7c5c6bbaad44598daac19c921551ca541c104201048a9a902f3d69196e7a09995fd46e998c309aab64dc30fa184b3609d67d187a6a9c24 + languageName: node + linkType: hard + +"@radix-ui/react-focus-scope@npm:1.1.7": + version: 1.1.7 + resolution: "@radix-ui/react-focus-scope@npm:1.1.7" + dependencies: + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-use-callback-ref": 1.1.1 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: bb642d192d3da8431f8b39f64959b493a7ba743af8501b76699ef93357c96507c11fb76d468824b52b0e024eaee130a641f3a213268ac7c9af34883b45610c9b + languageName: node + linkType: hard + +"@radix-ui/react-id@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-id@npm:1.1.1" + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.1 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 8d68e200778eb3038906870fc869b3d881f4a46715fb20cddd9c76cba42fdaaa4810a3365b6ec2daf0f185b9201fc99d009167f59c7921bc3a139722c2e976db + languageName: node + linkType: hard + +"@radix-ui/react-menu@npm:2.1.16": + version: 2.1.16 + resolution: "@radix-ui/react-menu@npm:2.1.16" + dependencies: + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-collection": 1.1.7 + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-context": 1.1.2 + "@radix-ui/react-direction": 1.1.1 + "@radix-ui/react-dismissable-layer": 1.1.11 + "@radix-ui/react-focus-guards": 1.1.3 + "@radix-ui/react-focus-scope": 1.1.7 + "@radix-ui/react-id": 1.1.1 + "@radix-ui/react-popper": 1.2.8 + "@radix-ui/react-portal": 1.1.9 + "@radix-ui/react-presence": 1.1.5 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-roving-focus": 1.1.11 + "@radix-ui/react-slot": 1.2.3 + "@radix-ui/react-use-callback-ref": 1.1.1 + aria-hidden: ^1.2.4 + react-remove-scroll: ^2.6.3 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 622f3abf8bb3c324ceb824988d7d384865191d5b09f2ddbc2a879b95d48d3e25ed9e22c4059203f4d29eaefe7d67a36e4b3cd2ce6b51596351cfd575d45d1fec + languageName: node + linkType: hard + +"@radix-ui/react-popper@npm:1.2.8": + version: 1.2.8 + resolution: "@radix-ui/react-popper@npm:1.2.8" + dependencies: + "@floating-ui/react-dom": ^2.0.0 + "@radix-ui/react-arrow": 1.1.7 + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-context": 1.1.2 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-use-callback-ref": 1.1.1 + "@radix-ui/react-use-layout-effect": 1.1.1 + "@radix-ui/react-use-rect": 1.1.1 + "@radix-ui/react-use-size": 1.1.1 + "@radix-ui/rect": 1.1.1 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 51370bc4868542ab8b807da0b43158d699715c13f5e31a5236861a172b75eb68ab9556945bbddbc0cb408bcc8da4f4569f42d657b19925e89501797e4eb3738b + languageName: node + linkType: hard + +"@radix-ui/react-portal@npm:1.1.9": + version: 1.1.9 + resolution: "@radix-ui/react-portal@npm:1.1.9" + dependencies: + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-use-layout-effect": 1.1.1 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: bd6be39bf021d5c917e2474ecba411e2625171f7ef96862b9af04bbd68833bb3662a7f1fbdeb5a7a237111b10e811e76d2cd03e957dadd6e668ef16541bfbd68 + languageName: node + linkType: hard + +"@radix-ui/react-presence@npm:1.1.5": + version: 1.1.5 + resolution: "@radix-ui/react-presence@npm:1.1.5" + dependencies: + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-use-layout-effect": 1.1.1 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 05f1b8e80d3d878efab44304ce55d0b9e6c7050e8345f9da95d0597a716121fb2467c3247c847c51a6cb27edd00e86ac36b2635e4c00ea79d91cfc26c930da81 + languageName: node + linkType: hard + +"@radix-ui/react-primitive@npm:2.1.3": + version: 2.1.3 + resolution: "@radix-ui/react-primitive@npm:2.1.3" + dependencies: + "@radix-ui/react-slot": 1.2.3 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 01f82e4bad76b57767198762c905e5bcea04f4f52129749791e31adfcb1b36f6fdc89c73c40017d812b6e25e4ac925d837214bb280cfeaa5dc383457ce6940b0 + languageName: node + linkType: hard + +"@radix-ui/react-primitive@npm:2.1.4": + version: 2.1.4 + resolution: "@radix-ui/react-primitive@npm:2.1.4" + dependencies: + "@radix-ui/react-slot": 1.2.4 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 8b4cf865b4d4d135c9c6768856fdad0f62cbe43a2819471eb682061d2076222c3368ae0b771516426b264afcaf0a0032943408b3a789cbb77273152dd4a06d05 + languageName: node + linkType: hard + +"@radix-ui/react-roving-focus@npm:1.1.11": + version: 1.1.11 + resolution: "@radix-ui/react-roving-focus@npm:1.1.11" + dependencies: + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-collection": 1.1.7 + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-context": 1.1.2 + "@radix-ui/react-direction": 1.1.1 + "@radix-ui/react-id": 1.1.1 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-use-callback-ref": 1.1.1 + "@radix-ui/react-use-controllable-state": 1.2.2 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 62af05c244803359c36beea278dac89caee37d20c31b84bcba3a20c462df33b7395c2e1b08b3a8ebb471c29cec4b3fb4f97488b6a167b1b275cedf994cf436e6 + languageName: node + linkType: hard + +"@radix-ui/react-slot@npm:1.2.3": + version: 1.2.3 + resolution: "@radix-ui/react-slot@npm:1.2.3" + dependencies: + "@radix-ui/react-compose-refs": 1.1.2 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 2731089e15477dd5eef98a5757c36113dd932d0c52ff05123cd89f05f0412e95e5b205229185d1cd705cda4a674a838479cce2b3b46ed903f82f5d23d9e3f3c2 + languageName: node + linkType: hard + +"@radix-ui/react-slot@npm:1.2.4": + version: 1.2.4 + resolution: "@radix-ui/react-slot@npm:1.2.4" + dependencies: + "@radix-ui/react-compose-refs": 1.1.2 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 6e1cda512f649ca9df8e746a5059c69aa7539b43870ff6def360103590d68d1ea3adf8a216092107b3e6476d55a3d71707e162b5be04574126bcc6fdfffefe6a + languageName: node + linkType: hard + +"@radix-ui/react-tooltip@npm:^1.2": + version: 1.2.8 + resolution: "@radix-ui/react-tooltip@npm:1.2.8" + dependencies: + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-context": 1.1.2 + "@radix-ui/react-dismissable-layer": 1.1.11 + "@radix-ui/react-id": 1.1.1 + "@radix-ui/react-popper": 1.2.8 + "@radix-ui/react-portal": 1.1.9 + "@radix-ui/react-presence": 1.1.5 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-slot": 1.2.3 + "@radix-ui/react-use-controllable-state": 1.2.2 + "@radix-ui/react-visually-hidden": 1.2.3 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: acd2606793f05e77c0fe1cc98d97bc1e9d07cdfd48fdebd23e4555676b9acaafbf70e518fbde943a9304cd086d85c2c78bcb9470d9128c2dc8cb61b02531311e + languageName: node + linkType: hard + +"@radix-ui/react-use-callback-ref@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-callback-ref@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: cde8c40f1d4e79e6e71470218163a746858304bad03758ac84dc1f94247a046478e8e397518350c8d6609c84b7e78565441d7505bb3ed573afce82cfdcd19faf + languageName: node + linkType: hard + +"@radix-ui/react-use-controllable-state@npm:1.2.2": + version: 1.2.2 + resolution: "@radix-ui/react-use-controllable-state@npm:1.2.2" + dependencies: + "@radix-ui/react-use-effect-event": 0.0.2 + "@radix-ui/react-use-layout-effect": 1.1.1 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: b438ee199d0630bf95eaafe8bf4bce219e73b371cfc8465f47548bfa4ee231f1134b5c6696b242890a01a0fd25fa34a7b172346bbfc5ee25cfb28b3881b1dc92 + languageName: node + linkType: hard + +"@radix-ui/react-use-effect-event@npm:0.0.2": + version: 0.0.2 + resolution: "@radix-ui/react-use-effect-event@npm:0.0.2" + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.1 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 5a1950a30a399ea7e4b98154da9f536737a610de80189b7aacd4f064a89a3cd0d2a48571d527435227252e72e872bdb544ff6ffcfbdd02de2efd011be4aaa902 + languageName: node + linkType: hard + +"@radix-ui/react-use-escape-keydown@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.1.1" + dependencies: + "@radix-ui/react-use-callback-ref": 1.1.1 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 0eb0756c2c55ddcde9ff01446ab01c085ab2bf799173e97db7ef5f85126f9e8600225570801a1f64740e6d14c39ffe8eed7c14d29737345a5797f4622ac96f6f + languageName: node + linkType: hard + +"@radix-ui/react-use-layout-effect@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-layout-effect@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: bad2ba4f206e6255263582bedfb7868773c400836f9a1b423c0b464ffe4a17e13d3f306d1ce19cf7a19a492e9d0e49747464f2656451bb7c6a99f5a57bd34de2 + languageName: node + linkType: hard + +"@radix-ui/react-use-rect@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-rect@npm:1.1.1" + dependencies: + "@radix-ui/rect": 1.1.1 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 116461bebc49472f7497e66a9bd413541181b3d00c5e0aaeef45d790dc1fbd7c8dcea80b169ea273306228b9a3c2b70067e902d1fd5004b3057e3bbe35b9d55d + languageName: node + linkType: hard + +"@radix-ui/react-use-size@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-size@npm:1.1.1" + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.1 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 64e61f65feb67ffc80e1fc4a8d5e32480fb6d68475e2640377e021178dead101568cba5f936c9c33e6c142c7cf2fb5d76ad7b23ef80e556ba142d56cf306147b + languageName: node + linkType: hard + +"@radix-ui/react-visually-hidden@npm:1.2.3": + version: 1.2.3 + resolution: "@radix-ui/react-visually-hidden@npm:1.2.3" + dependencies: + "@radix-ui/react-primitive": 2.1.3 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 42296bde1ddf4af4e7445e914c35d6bc8406d6ede49f0a959a553e75b3ed21da09fda80a81c48d8ec058ed8129ce7137499d02ee26f90f0d3eaa2417922d6509 + languageName: node + linkType: hard + +"@radix-ui/react-visually-hidden@npm:^1.2": + version: 1.2.4 + resolution: "@radix-ui/react-visually-hidden@npm:1.2.4" + dependencies: + "@radix-ui/react-primitive": 2.1.4 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 43bbb68532748fabe8bec52628a7876714889f67e1a21d627c30816e53b68042ece849eef61fbd854af9c528b157cdd483ad032668c95d627ef27edd2530253f + languageName: node + linkType: hard + +"@radix-ui/rect@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/rect@npm:1.1.1" + checksum: c1c111edeab70b14a735bca43601de6468c792482864b766ac8940b43321492e5c0ae62f92b156cecdc9265ec3c680c32b3fa0c8a90b5e796923a9af13c5dc20 + languageName: node + linkType: hard + "@rc-component/context@npm:^1.3.0": version: 1.3.0 resolution: "@rc-component/context@npm:1.3.0" @@ -3478,6 +4245,95 @@ __metadata: languageName: node linkType: hard +"@react-aria/focus@npm:^3.20.2": + version: 3.21.5 + resolution: "@react-aria/focus@npm:3.21.5" + dependencies: + "@react-aria/interactions": ^3.27.1 + "@react-aria/utils": ^3.33.1 + "@react-types/shared": ^3.33.1 + "@swc/helpers": ^0.5.0 + clsx: ^2.0.0 + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: b83bc3b3d2e95b1ad4951f689a970884da1a92dcec1a46637d6979f1f4e06c49a02e97287f9976ad19f42cc0ea7e70e15fbbf7ccf4310cb02f5da58de8f6ac26 + languageName: node + linkType: hard + +"@react-aria/interactions@npm:^3.25.0, @react-aria/interactions@npm:^3.27.1": + version: 3.27.1 + resolution: "@react-aria/interactions@npm:3.27.1" + dependencies: + "@react-aria/ssr": ^3.9.10 + "@react-aria/utils": ^3.33.1 + "@react-stately/flags": ^3.1.2 + "@react-types/shared": ^3.33.1 + "@swc/helpers": ^0.5.0 + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: 81517255ac491d701ec37d3340e6a9f2762c345c5ff1ff3cfe00bb2000690ba9e663276ca6ec5ec9f2ccca00afc72c82952866a160b32c9745eb5c5226ffa150 + languageName: node + linkType: hard + +"@react-aria/ssr@npm:^3.9.10": + version: 3.9.10 + resolution: "@react-aria/ssr@npm:3.9.10" + dependencies: + "@swc/helpers": ^0.5.0 + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: 45307c53beee3a48f79f361ba07d4306250a051a0da5c258a545b47495983743975ad193e05542d28d15087e597049c74c850fe4fd920157a7d190d47f19dd52 + languageName: node + linkType: hard + +"@react-aria/utils@npm:^3.33.1": + version: 3.33.1 + resolution: "@react-aria/utils@npm:3.33.1" + dependencies: + "@react-aria/ssr": ^3.9.10 + "@react-stately/flags": ^3.1.2 + "@react-stately/utils": ^3.11.0 + "@react-types/shared": ^3.33.1 + "@swc/helpers": ^0.5.0 + clsx: ^2.0.0 + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: bbe721b20feae445ea669bee1f68c23f8fd6aa62afdbe00f6e33e34f9f738e3799859b2c76252005294bcec554a0d945a53446180f20af6343f65c8fedfc3e60 + languageName: node + linkType: hard + +"@react-stately/flags@npm:^3.1.2": + version: 3.1.2 + resolution: "@react-stately/flags@npm:3.1.2" + dependencies: + "@swc/helpers": ^0.5.0 + checksum: e203a3ef0c9d0faa4ed0bec9ade4b9157f8e52aa196cbe23abc1260025fba306739c9a829b2a9167b0eef27d2db31c72e017804e16dd480c8a523b0e4d225aec + languageName: node + linkType: hard + +"@react-stately/utils@npm:^3.11.0": + version: 3.11.0 + resolution: "@react-stately/utils@npm:3.11.0" + dependencies: + "@swc/helpers": ^0.5.0 + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: a5232b6ad60f5171254fab1ca4e3f51328766d8c2868bc37fb052458580491dd466cfc71d88fb0c55c879d2621bd6d93543c6e361e2829e5fcb305bcb463ca2f + languageName: node + linkType: hard + +"@react-types/shared@npm:^3.33.1": + version: 3.33.1 + resolution: "@react-types/shared@npm:3.33.1" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + checksum: 9c76807c0d6dfde1369cd7b48c817a64136fbaccb5b2c76a27dea2941319b51d289f7d6ffb97123e8b169ffeb42ebac3f30410acc6c18a210a8aa5491b6a9d46 + languageName: node + linkType: hard + "@redis/bloom@npm:1.2.0": version: 1.2.0 resolution: "@redis/bloom@npm:1.2.0" @@ -3599,6 +4455,34 @@ __metadata: languageName: node linkType: hard +"@swc/helpers@npm:^0.5.0": + version: 0.5.21 + resolution: "@swc/helpers@npm:0.5.21" + dependencies: + tslib: ^2.8.0 + checksum: 637e6ee47dd5b853e3ae96dfd9ed9a7440e474ef104e829969aad724423928db99c1ecc57116557fba433f184caaef3d75f998f6199dddfaa21a9b2ce3d2c680 + languageName: node + linkType: hard + +"@tanstack/react-virtual@npm:^3.13.9": + version: 3.13.23 + resolution: "@tanstack/react-virtual@npm:3.13.23" + dependencies: + "@tanstack/virtual-core": 3.13.23 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: fb60d65b61f299648325d8d69d00e5d9434ec20e075496c2e451426087d6216d617558565f05d7a503393a482db29112140b19082f709785f4a469800ddc4e31 + languageName: node + linkType: hard + +"@tanstack/virtual-core@npm:3.13.23": + version: 3.13.23 + resolution: "@tanstack/virtual-core@npm:3.13.23" + checksum: fbc278fc013ecfb67f79f3265d382ae3a756e8edaae41a9daca360ad5ddcf03e27d7ad8c5962923ebbb0aae68195a1795180627f6937d4ca7c09d7bf6c302950 + languageName: node + linkType: hard + "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -3694,14 +4578,14 @@ __metadata: languageName: node linkType: hard -"@types/connect-pg-simple@npm:^7.0.0": - version: 7.0.0 - resolution: "@types/connect-pg-simple@npm:7.0.0" +"@types/connect-pg-simple@npm:^7.0.3": + version: 7.0.3 + resolution: "@types/connect-pg-simple@npm:7.0.3" dependencies: "@types/express": "*" "@types/express-session": "*" "@types/pg": "*" - checksum: e430ee68d8aa4fe44b4ffb19cf81f25826643bb4351e4134be9f43ccffb9865ce290d7bd32f47b8cb22926339595349bd786f206558f7b7526afb9c2d1defd4e + checksum: 231911352e4036c7a316f5adfaa427ca89ef0d2e898892274a782851401631e874d9f07dd6090e64a0cd587c8f8522afb20c506f7144f033a14aaad9b765fdd6 languageName: node linkType: hard @@ -3723,7 +4607,7 @@ __metadata: languageName: node linkType: hard -"@types/debug@npm:^4.1.2, @types/debug@npm:^4.1.4": +"@types/debug@npm:^4.1.2": version: 4.1.7 resolution: "@types/debug@npm:4.1.7" dependencies: @@ -3796,6 +4680,15 @@ __metadata: languageName: node linkType: hard +"@types/interpret@npm:^1.1.3, @types/interpret@npm:^1.1.4": + version: 1.1.4 + resolution: "@types/interpret@npm:1.1.4" + dependencies: + "@types/node": "*" + checksum: 3374cd32164e42d9d44312e9f2e17ea10a4463a6292a576d39dddd946932284ac6a92a6b08c980637ee5bf4c0cc7ebf6f2afdce0be12facc0ed6036bee3d9e9a + languageName: node + linkType: hard + "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": version: 2.0.4 resolution: "@types/istanbul-lib-coverage@npm:2.0.4" @@ -3873,7 +4766,7 @@ __metadata: languageName: node linkType: hard -"@types/jsonwebtoken@npm:^9.0.0, @types/jsonwebtoken@npm:^9.0.1": +"@types/jsonwebtoken@npm:^9.0.0": version: 9.0.1 resolution: "@types/jsonwebtoken@npm:9.0.1" dependencies: @@ -3949,6 +4842,24 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^18.15.5": + version: 18.19.130 + resolution: "@types/node@npm:18.19.130" + dependencies: + undici-types: ~5.26.4 + checksum: b7032363581c416e721a88cffdc2b47662337cacd20f8294f5619a1abf79615c7fef1521964c2aa9d36ed6aae733e1a03e8c704661bd5a0c2f34b390f41ea395 + languageName: node + linkType: hard + +"@types/node@npm:^22.16.3, @types/node@npm:^22.19.1": + version: 22.19.17 + resolution: "@types/node@npm:22.19.17" + dependencies: + undici-types: ~6.21.0 + checksum: c817456948b0453b15a15d7865faea0b0de9bc93e9725788a62978f05994702b673029300ce9667d52ce439acfb43ecd8122acb8eba9145c26b1c4d22e67a234 + languageName: node + linkType: hard + "@types/nodemailer@npm:^6.4.7": version: 6.4.7 resolution: "@types/nodemailer@npm:6.4.7" @@ -4012,14 +4923,21 @@ __metadata: languageName: node linkType: hard -"@types/pg@npm:*, @types/pg@npm:>=6 <9, @types/pg@npm:^8.6.5, @types/pg@npm:^8.6.6": - version: 8.6.6 - resolution: "@types/pg@npm:8.6.6" +"@types/pg@npm:*, @types/pg@npm:>=6 <9, @types/pg@npm:^8.6.2, @types/pg@npm:^8.6.5": + version: 8.20.0 + resolution: "@types/pg@npm:8.20.0" dependencies: "@types/node": "*" pg-protocol: "*" pg-types: ^2.2.0 - checksum: ac145553a8ad2f357feacad1bceaf5d6ce904eb9d66233b84c469a2b4fa3738d4ebdf29b7ea45387be2d07f915fd873a229f90a2f766d7c377afa7c41fbcf8d1 + checksum: e3610a00e38d52a0b9069bda48a9a5746d198f0aaa72710898fe6c277777ca3ef5190725afa61f53adb4ddd624e48267133b691f4ae7076dbef5d83aa31c2cf0 + languageName: node + linkType: hard + +"@types/pluralize@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/pluralize@npm:0.0.29" + checksum: db7732b733ba1dc59f080f87364c9f985c1ae9f1e5ec5fcefb83c1327149e01ecac42766352eb7b19b117cf39defa99cf514629f3666968a3bdeb00e74f2a97e languageName: node linkType: hard @@ -4078,7 +4996,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.5.0": +"@types/semver@npm:^7.3.9, @types/semver@npm:^7.5.0, @types/semver@npm:^7.7.0, @types/semver@npm:^7.7.1": version: 7.7.1 resolution: "@types/semver@npm:7.7.1" checksum: 76d218e414482a398148d5c28f2bfa017108869f3fc18cda379c9d8d062348f8b9653ae2fa8642d3b5b52e211928fe8be34f22da4e1f08245c84e0e51e040673 @@ -4116,15 +5034,6 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^7.4.0": - version: 7.4.7 - resolution: "@types/ws@npm:7.4.7" - dependencies: - "@types/node": "*" - checksum: b4c9b8ad209620c9b21e78314ce4ff07515c0cadab9af101c1651e7bfb992d7fd933bd8b9c99d110738fd6db523ed15f82f29f50b45510288da72e964dedb1a3 - languageName: node - linkType: hard - "@types/ws@npm:^8.0.0": version: 8.5.4 resolution: "@types/ws@npm:8.5.4" @@ -4917,14 +5826,13 @@ __metadata: eslint-plugin-simple-import-sort: ^10.0.0 eslint_d: ^12.2.1 glob: ^9.1.0 - graphql: ^15.8.0 + graphql: ^16.1.0-experimental-stream-defer.6 inquirer: ^9.1.4 jest: ^29.4.3 mock-req: ^0.2.0 mock-res: ^0.6.0 node-fetch: ^3.3.1 nodemon: ^2.0.20 - pg: ^8.9.0 prettier: ^3.1.1 rimraf: ^4.1.2 ts-jest: ^29.0.5 @@ -5241,6 +6149,15 @@ __metadata: languageName: node linkType: hard +"aria-hidden@npm:^1.2.4": + version: 1.2.6 + resolution: "aria-hidden@npm:1.2.6" + dependencies: + tslib: ^2.0.0 + checksum: 56409c55c43ad917607f3f3aa67748dcf30a27e8bb5cb3c5d86b43e38babadd63cd77731a27bc8a8c4332c2291741ed92333bf7ca45f8b99ebc87b94a8070a6e + languageName: node + linkType: hard + "aria-query@npm:^5.3.2": version: 5.3.2 resolution: "aria-query@npm:5.3.2" @@ -5762,13 +6679,6 @@ __metadata: languageName: node linkType: hard -"backo2@npm:^1.0.2": - version: 1.0.2 - resolution: "backo2@npm:1.0.2" - checksum: fda8d0a0f4810068d23715f2f45153146d6ee8f62dd827ce1e0b6cc3c8328e84ad61e11399a83931705cef702fe7cbb457856bf99b9bd10c4ed57b0786252385 - languageName: node - linkType: hard - "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -5878,26 +6788,6 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:^1.15.2": - version: 1.20.2 - resolution: "body-parser@npm:1.20.2" - dependencies: - bytes: 3.1.2 - content-type: ~1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: ~1.6.18 - unpipe: 1.0.0 - checksum: 14d37ec638ab5c93f6099ecaed7f28f890d222c650c69306872e00b9efa081ff6c596cd9afb9930656aae4d6c4e1c17537bea12bb73c87a217cb3cfea8896737 - languageName: node - linkType: hard - "boolbase@npm:^1.0.0": version: 1.0.0 resolution: "boolbase@npm:1.0.0" @@ -6594,6 +7484,20 @@ __metadata: languageName: node linkType: hard +"clsx@npm:^1.2.1": + version: 1.2.1 + resolution: "clsx@npm:1.2.1" + checksum: 30befca8019b2eb7dbad38cff6266cf543091dae2825c856a62a8ccf2c3ab9c2907c4d12b288b73101196767f66812365400a227581484a05f968b0307cfaf12 + languageName: node + linkType: hard + +"clsx@npm:^2.0.0": + version: 2.1.1 + resolution: "clsx@npm:2.1.1" + checksum: acd3e1ab9d8a433ecb3cc2f6a05ab95fe50b4a3cfc5ba47abb6cbf3754585fcb87b84e90c822a1f256c4198e3b41c7f6c391577ffc8678ad587fc0976b24fd57 + languageName: node + linkType: hard + "cluster-key-slot@npm:1.1.2": version: 1.1.2 resolution: "cluster-key-slot@npm:1.1.2" @@ -7143,6 +8047,13 @@ __metadata: languageName: node linkType: hard +"debounce-promise@npm:^3.1.2": + version: 3.1.2 + resolution: "debounce-promise@npm:3.1.2" + checksum: 29bac4524c423cc852319d7455363909ea3d933a3b9e3eb1149d963cffc34c475fe37219d0bafc61af566500b5d663cba579bbad7ee4023bef06f8394ed900ad + languageName: node + linkType: hard + "debounce@npm:^1.2.0": version: 1.2.1 resolution: "debounce@npm:1.2.1" @@ -7159,7 +8070,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:>=3 <5, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.2.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.2.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -7364,6 +8275,13 @@ __metadata: languageName: node linkType: hard +"detect-node-es@npm:^1.1.0": + version: 1.1.0 + resolution: "detect-node-es@npm:1.1.0" + checksum: e46307d7264644975b71c104b9f028ed1d3d34b83a15b8a22373640ce5ea630e5640b1078b8ea15f202b54641da71e4aa7597093bd4b91f113db520a26a37449 + languageName: node + linkType: hard + "detect-node@npm:2.0.4": version: 2.0.4 resolution: "detect-node@npm:2.0.4" @@ -8510,10 +9428,17 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^3.1.0": - version: 3.1.2 - resolution: "eventemitter3@npm:3.1.2" - checksum: 81e4e82b8418f5cfd986d2b4a2fa5397ac4eb8134e09bcb47005545e22fdf8e9e61d5c053d34651112245aae411bdfe6d0ad5511da0400743fef5fc38bfcfbe3 +"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.7": + version: 4.0.7 + resolution: "eventemitter3@npm:4.0.7" + checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 + languageName: node + linkType: hard + +"eventemitter3@npm:^5.0.1": + version: 5.0.4 + resolution: "eventemitter3@npm:5.0.4" + checksum: bcbd2c3a9d2553c2289623ede8aab474d5c92bcbf18e5fe76f0e550c2b7801afb5a4351c7f11e8ee2379cca1ee48316aeb98fc3b946b7dd1f47a4c1ee8c4dcf2 languageName: node linkType: hard @@ -8914,21 +9839,6 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:^1.0.6": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" - dependencies: - debug: 2.6.9 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - on-finished: 2.4.1 - parseurl: ~1.3.3 - statuses: 2.0.1 - unpipe: ~1.0.0 - checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716 - languageName: node - linkType: hard - "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -8966,6 +9876,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.0.0": + version: 1.15.11 + resolution: "follow-redirects@npm:1.15.11" + peerDependenciesMeta: + debug: + optional: true + checksum: 20bf55e9504f59e6cc3743ba27edb2ebf41edea1baab34799408f2c050f73f0c612728db21c691276296d2795ea8a812dc532a98e8793619fcab91abe06d017f + languageName: node + linkType: hard + "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -9039,6 +9959,28 @@ __metadata: languageName: node linkType: hard +"framer-motion@npm:^12.12": + version: 12.38.0 + resolution: "framer-motion@npm:12.38.0" + dependencies: + motion-dom: ^12.38.0 + motion-utils: ^12.36.0 + tslib: ^2.4.0 + peerDependencies: + "@emotion/is-prop-valid": "*" + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/is-prop-valid": + optional: true + react: + optional: true + react-dom: + optional: true + checksum: 3c1dfa3258957061e35b8ae99ac2abe90ddc346c079fecaf3316d7180c4bee7674aa736cc167af32089f98f9d2dcf7e23e8de2c7df7bb397a2253d14441a901f + languageName: node + linkType: hard + "fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -9229,6 +10171,13 @@ __metadata: languageName: node linkType: hard +"get-nonce@npm:^1.0.0": + version: 1.0.1 + resolution: "get-nonce@npm:1.0.1" + checksum: e2614e43b4694c78277bb61b0f04583d45786881289285c73770b07ded246a98be7e1f78b940c80cbe6f2b07f55f0b724e6db6fd6f1bcbd1e8bdac16521074ed + languageName: node + linkType: hard + "get-package-type@npm:^0.1.0": version: 0.1.0 resolution: "get-package-type@npm:0.1.0" @@ -9299,6 +10248,15 @@ __metadata: languageName: node linkType: hard +"get-value@npm:^3.0.1": + version: 3.0.1 + resolution: "get-value@npm:3.0.1" + dependencies: + isobject: ^3.0.1 + checksum: d2df36858c34f0ef63d928e760740b23d14a7b955eaf740fea0d908b60cf2504de388a2ff72fb531318719645271f506390005f811a53d35ce4d7f7eba98e470 + languageName: node + linkType: hard + "getos@npm:^3.2.1": version: 3.2.1 resolution: "getos@npm:3.2.1" @@ -9511,6 +10469,54 @@ __metadata: languageName: node linkType: hard +"grafast@npm:0.0.1-beta.8, grafast@npm:^0.0.1-beta.2": + version: 0.0.1-beta.8 + resolution: "grafast@npm:0.0.1-beta.8" + dependencies: + "@graphile/lru": ^5.0.0-beta.3 + debug: ^4.3.4 + graphql: ^16.1.0-experimental-stream-defer.6 + tamedevil: ^0.0.0-beta.3 + peerDependencies: + "@envelop/core": ^3.0.4 + graphile-config: ^0.0.1-beta.3 + graphql: ^16.1.0-experimental-stream-defer.6 + tamedevil: ^0.0.0-beta.3 + peerDependenciesMeta: + "@envelop/core": + optional: true + graphile-config: + optional: true + checksum: 502e352837484285af6a26d9a1a54bfd41035437e4a53b442602dbcccc3e53e8c5bec66aecca82049044e7ece050e9f22d26783e39937bcdf2fc1513d9b5c767 + languageName: node + linkType: hard + +"grafserv@npm:^0.0.1-beta.2": + version: 0.0.1-beta.9 + resolution: "grafserv@npm:0.0.1-beta.9" + dependencies: + "@graphile/lru": ^5.0.0-beta.3 + debug: ^4.3.4 + eventemitter3: ^5.0.1 + graphile-config: ^0.0.1-beta.3 + graphql-ws: ^5.14.0 + ruru: ^2.0.0-beta.5 + tslib: ^2.6.2 + peerDependencies: + grafast: ^0.0.1-beta.8 + graphile-config: ^0.0.1-beta.3 + graphql: ^16.1.0-experimental-stream-defer.6 + h3: ^1.7.1 + ws: ^8.12.1 + peerDependenciesMeta: + h3: + optional: true + ws: + optional: true + checksum: 55e9b31bf62a124c9cee54c2a7c55b633dcc920926f9db1d4ef8d74220a436675b19ed73749d95a1cea9686d7eccd75662e1aaeca4f83511854f066244526774 + languageName: node + linkType: hard + "grapheme-splitter@npm:^1.0.4": version: 1.0.4 resolution: "grapheme-splitter@npm:1.0.4" @@ -9525,40 +10531,86 @@ __metadata: languageName: node linkType: hard -"graphile-build-pg@npm:4.13.0, graphile-build-pg@npm:^4.13.0": - version: 4.13.0 - resolution: "graphile-build-pg@npm:4.13.0" +"graphile-build-pg@npm:5.0.0-beta.2": + version: 5.0.0-beta.2 + resolution: "graphile-build-pg@npm:5.0.0-beta.2" dependencies: - "@graphile/lru": 4.11.0 - chalk: ^2.4.2 - debug: ^4.1.1 - graphile-build: 4.13.0 - jsonwebtoken: ^9.0.0 - lodash: ">=4 <5" - lru-cache: ">=4 <5" - pg-sql2: 4.13.0 + "@types/node": ^18.15.5 + debug: ^4.3.3 + graphile-config: ^0.0.1-beta.1 + jsonwebtoken: ^8.5.1 + pg-introspection: ^0.0.1-beta.1 + tslib: ^2.5.0 peerDependencies: - pg: ">=6.1.0 <9" - checksum: 0eb2bc7ea7a78010b0c812562e7b01f1ad6b8bd9569f3b6c4fe3d399159f8ce382f665335265d26a618ba5cd32c4d9055cb5d5740a9596f1699b3324f132d0f6 + "@dataplan/pg": ^0.0.1-beta.2 + grafast: ^0.0.1-beta.2 + graphile-build: 5.0.0-beta.2 + graphile-config: ^0.0.1-beta.1 + graphql: ^16.1.0-experimental-stream-defer.6 + pg: ^8.7.1 + pg-sql2: ^5.0.0-beta.1 + tamedevil: ^0.0.0-beta.1 + peerDependenciesMeta: + pg: + optional: true + checksum: 630709c9d1c37c1ab0700f8e68b14ec3e5b504912410d6ffd52c8a8bbb93150c8962af8e53ec04b5f6f3d13ac0193ec91db78684a9e610bfed5ddd50b0d5670e languageName: node linkType: hard -"graphile-build@npm:4.13.0, graphile-build@npm:^4.13.0": - version: 4.13.0 - resolution: "graphile-build@npm:4.13.0" +"graphile-build@npm:5.0.0-beta.2": + version: 5.0.0-beta.2 + resolution: "graphile-build@npm:5.0.0-beta.2" dependencies: - "@graphile/lru": 4.11.0 - chalk: ^2.4.2 - debug: ^4.1.1 - graphql-parse-resolve-info: 4.13.0 - iterall: ^1.2.2 - lodash: ">=4 <5" - lru-cache: ^5.0.0 + "@types/node": ^18.15.5 + "@types/pluralize": ^0.0.29 + "@types/semver": ^7.3.9 + chalk: ^4.1.2 + debug: ^4.3.3 + graphile-config: ^0.0.1-beta.1 + graphql: ^16.1.0-experimental-stream-defer.6 + lodash: ^4.17.21 pluralize: ^7.0.0 - semver: ^6.0.0 + semver: ^7.3.5 + tslib: ^2.5.0 peerDependencies: - graphql: ">=0.9 <0.14 || ^14.0.2 || ^15.4.0" - checksum: bb8554e734430b88efede33c0529b4b1edc47fc56483557828ff1e98ea1bb6af08f5b9806fcc736d7ab9fe4ea79945a52c95be174ed7aaf4f8440c2cc4ec9881 + grafast: ^0.0.1-beta.2 + graphile-config: ^0.0.1-beta.1 + graphql: ^16.1.0-experimental-stream-defer.6 + checksum: 7ddbb939a9f7cd49caea876605770419088bd88e6d03a670efb552f781c3985a1770b5a3178a03566d5b2fc184dbe409f5c84f0a42ada238f29cf4a7428d2593 + languageName: node + linkType: hard + +"graphile-config@npm:^0.0.1-beta.1, graphile-config@npm:^0.0.1-beta.3": + version: 0.0.1-beta.18 + resolution: "graphile-config@npm:0.0.1-beta.18" + dependencies: + "@types/interpret": ^1.1.3 + "@types/node": ^22.16.3 + "@types/semver": ^7.7.0 + chalk: ^4.1.2 + debug: ^4.4.1 + interpret: ^3.1.1 + semver: ^7.7.2 + tslib: ^2.8.1 + yargs: ^17.7.2 + checksum: 1637ecd092f83a0a5ee853f9a507c77dedb57ac9b31978740694602cdc1fd52a3efb2968d958305611bbb23a0c4eda5375ac6489f9ce71a134b76d550e1998fc + languageName: node + linkType: hard + +"graphile-config@npm:^1.0.0": + version: 1.0.0 + resolution: "graphile-config@npm:1.0.0" + dependencies: + "@types/interpret": ^1.1.4 + "@types/node": ^22.19.1 + "@types/semver": ^7.7.1 + chalk: ^4.1.2 + debug: ^4.4.3 + interpret: ^3.1.1 + semver: ^7.7.3 + tslib: ^2.8.1 + yargs: ^17.7.2 + checksum: 011b7eedc8820a9d604d62468549f81a93a7aa447a5d4884f62914f0aa6f749dc9bbc684655a2b154824f07320f9bedb5024a890b8a225536ff680586707c807 languageName: node linkType: hard @@ -9584,17 +10636,46 @@ __metadata: languageName: node linkType: hard -"graphile-utils@npm:^4.13.0": - version: 4.13.0 - resolution: "graphile-utils@npm:4.13.0" +"graphile-utils@npm:5.0.0-beta.2": + version: 5.0.0-beta.2 + resolution: "graphile-utils@npm:5.0.0-beta.2" dependencies: debug: ^4.1.1 - graphql: ">=0.9 <0.14 || ^14.0.2 || ^15.4.0" - tslib: ^2.0.1 + json5: ^2.2.3 + tslib: ^2.5.0 peerDependencies: - graphile-build: ^4.5.0 - graphile-build-pg: ^4.5.0 - checksum: 6371c219ff9ac0bf8eb7ec89756e868cc91af5bf53c2160ff39df67bd48a2f92d4f933c218aafad48d8707005725b09ead93bc26ab2fd353d67710df72e8f91b + grafast: ^0.0.1-beta.2 + graphile-build: ^5.0.0-beta.2 + graphile-build-pg: ^5.0.0-beta.2 + graphile-config: ^0.0.1-beta.1 + graphql: ^16.1.0-experimental-stream-defer.6 + tamedevil: ^0.0.0-beta.1 + peerDependenciesMeta: + graphile-build-pg: + optional: true + checksum: e0dd6f0901b2689f1de1236294a6692b17c539dd70ebeb12a860e39efe5da54a083ab5e40327acd52faeeb0235a86124b57884642cf1bb4501f77bd1169c012d + languageName: node + linkType: hard + +"graphile-utils@npm:^5.0.0-beta.2": + version: 5.0.0 + resolution: "graphile-utils@npm:5.0.0" + dependencies: + debug: ^4.4.3 + json5: ^2.2.3 + tslib: ^2.8.1 + peerDependencies: + "@dataplan/pg": ^1.0.0-rc.7 + grafast: ^1.0.0-rc.8 + graphile-build: ^5.0.0-rc.5 + graphile-build-pg: ^5.0.0-rc.7 + graphile-config: ^1.0.0-rc.5 + graphql: ^16.9.0 + tamedevil: ^0.1.0-rc.5 + peerDependenciesMeta: + graphile-build-pg: + optional: true + checksum: a1b69fcc715fbf353c22c50d603651bf64f63ae85514070941bd67b54dd4c3066f88ab0c3124ebf4782de27bfa3c4d06bf500d6ca2bea9aa10846db5f7849d0f languageName: node linkType: hard @@ -9617,6 +10698,22 @@ __metadata: languageName: node linkType: hard +"graphiql@npm:^5.2.1": + version: 5.2.2 + resolution: "graphiql@npm:5.2.2" + dependencies: + "@graphiql/plugin-doc-explorer": ^0.4.1 + "@graphiql/plugin-history": ^0.4.1 + "@graphiql/react": ^0.37.3 + react-compiler-runtime: 19.1.0-rc.1 + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + react: ^18 || ^19 + react-dom: ^18 || ^19 + checksum: 3c43edff8b2b170c4407353a6f399f3a39844c6ac946191617b0a4ee5fbc7df940b11edc4e7401555dee21880180ad879a71cd78cd1f113a486779b3223a0679 + languageName: node + linkType: hard + "graphql-config@npm:^4.4.0": version: 4.4.1 resolution: "graphql-config@npm:4.4.1" @@ -9655,15 +10752,18 @@ __metadata: languageName: node linkType: hard -"graphql-parse-resolve-info@npm:4.13.0": - version: 4.13.0 - resolution: "graphql-parse-resolve-info@npm:4.13.0" +"graphql-language-service@npm:^5.5.0": + version: 5.5.0 + resolution: "graphql-language-service@npm:5.5.0" dependencies: - debug: ^4.1.1 - tslib: ^2.0.1 + debounce-promise: ^3.1.2 + nullthrows: ^1.0.0 + vscode-languageserver-types: ^3.17.1 peerDependencies: - graphql: ">=0.9 <0.14 || ^14.0.2 || ^15.4.0 || ^16.3.0" - checksum: a0ac79196d9a7b884a24ce59576a4537431db79536039f97a496dd4fcf919da0a481115b4d08d8b4e7ea646b2decbf67a1b589875ecbc437f269a7acc4dea893 + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + bin: + graphql: dist/temp-bin.js + checksum: fa662e006fef1c4a6b18ef0e884ac5d0f9b3373319f8dd6c867657895054798aef3607d6513678e0d48cbb4460ce8c0f6f93751b929d22e3200aafc4132eb492 languageName: node linkType: hard @@ -9681,17 +10781,6 @@ __metadata: languageName: node linkType: hard -"graphql-subscriptions@npm:^1.1.0": - version: 1.2.1 - resolution: "graphql-subscriptions@npm:1.2.1" - dependencies: - iterall: ^1.3.0 - peerDependencies: - graphql: ^0.10.5 || ^0.11.3 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 - checksum: 2b9533c6774e7be46acd6fbee528aab06429f15dc222eabd991e82c02bf74e390b638dffa1a3fd86c1e26212c40a42a0418d7f4a7c3a1edf0534978ef128e528 - languageName: node - linkType: hard - "graphql-tag@npm:^2.11.0, graphql-tag@npm:^2.12.3": version: 2.12.6 resolution: "graphql-tag@npm:2.12.6" @@ -9703,7 +10792,7 @@ __metadata: languageName: node linkType: hard -"graphql-ws@npm:5.11.3, graphql-ws@npm:^5.11.3, graphql-ws@npm:^5.6.2": +"graphql-ws@npm:5.11.3, graphql-ws@npm:^5.11.3": version: 5.11.3 resolution: "graphql-ws@npm:5.11.3" peerDependencies: @@ -9712,10 +10801,19 @@ __metadata: languageName: node linkType: hard -"graphql@npm:15.x": - version: 15.8.0 - resolution: "graphql@npm:15.8.0" - checksum: 423325271db8858428641b9aca01699283d1fe5b40ef6d4ac622569ecca927019fce8196208b91dd1d8eb8114f00263fe661d241d0eb40c10e5bfd650f86ec5e +"graphql-ws@npm:^5.14.0": + version: 5.16.2 + resolution: "graphql-ws@npm:5.16.2" + peerDependencies: + graphql: ">=0.11 <=16" + checksum: ecbfee032fed2fad80a7da192ad46c0ff53c13125def6c5bd83f6ad491c9e77c212f343c7f87b4e36825b0a92178ea5038081bb0f27b96af91e9bdd44dba24e6 + languageName: node + linkType: hard + +"graphql@npm:16.1.0-experimental-stream-defer.6": + version: 16.1.0-experimental-stream-defer.6 + resolution: "graphql@npm:16.1.0-experimental-stream-defer.6" + checksum: 55cbcde8e1fb01dcf482c5cfafa0ad18995bb92397b4e8824ae2b0cd2f10eea6a7445342979d8d28874c2bf2fea1cacbfed8cc0e8ce918a6a87e8275d764e1c4 languageName: node linkType: hard @@ -9959,19 +11057,6 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:^1.5.1": - version: 1.8.1 - resolution: "http-errors@npm:1.8.1" - dependencies: - depd: ~1.1.2 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: ">= 1.5.0 < 2" - toidentifier: 1.0.1 - checksum: d3c7e7e776fd51c0a812baff570bdf06fe49a5dc448b700ab6171b1250e4cf7db8b8f4c0b133e4bfe2451022a5790c1ca6c2cae4094dedd6ac8304a1267f91d2 - languageName: node - linkType: hard - "http-errors@npm:~1.7.3": version: 1.7.3 resolution: "http-errors@npm:1.7.3" @@ -9996,6 +11081,17 @@ __metadata: languageName: node linkType: hard +"http-proxy@npm:^1.18.1": + version: 1.18.1 + resolution: "http-proxy@npm:1.18.1" + dependencies: + eventemitter3: ^4.0.0 + follow-redirects: ^1.0.0 + requires-port: ^1.0.0 + checksum: f5bd96bf83e0b1e4226633dbb51f8b056c3e6321917df402deacec31dd7fe433914fc7a2c1831cf7ae21e69c90b3a669b8f434723e9e8b71fd68afe30737b6a5 + languageName: node + linkType: hard + "http-signature@npm:~1.3.6": version: 1.3.6 resolution: "http-signature@npm:1.3.6" @@ -10263,6 +11359,13 @@ __metadata: languageName: node linkType: hard +"interpret@npm:^3.1.1": + version: 3.1.1 + resolution: "interpret@npm:3.1.1" + checksum: 35cebcf48c7351130437596d9ab8c8fe131ce4038da4561e6d665f25640e0034702a031cf7e3a5cea60ac7ac548bf17465e0571ede126f3d3a6933152171ac82 + languageName: node + linkType: hard + "invariant@npm:2.2.4, invariant@npm:^2.2.4": version: 2.2.4 resolution: "invariant@npm:2.2.4" @@ -10634,6 +11737,22 @@ __metadata: languageName: node linkType: hard +"is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: ^3.0.1 + checksum: 2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca + languageName: node + linkType: hard + +"is-primitive@npm:^3.0.1": + version: 3.0.1 + resolution: "is-primitive@npm:3.0.1" + checksum: c4da6a6e6d487f31d85b9259b67695fffcc75dca6c9612b0a002e3050c734227b9911be09b877539ec6309710229c19f4edd0f9e26ed2a67924ee0916baf0bed + languageName: node + linkType: hard + "is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" @@ -10869,6 +11988,13 @@ __metadata: languageName: node linkType: hard +"isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 + languageName: node + linkType: hard + "isomorphic-fetch@npm:^3.0.0": version: 3.0.0 resolution: "isomorphic-fetch@npm:3.0.0" @@ -10957,7 +12083,7 @@ __metadata: languageName: node linkType: hard -"iterall@npm:^1.0.2, iterall@npm:^1.2.1, iterall@npm:^1.2.2, iterall@npm:^1.3.0": +"iterall@npm:^1.3.0": version: 1.3.0 resolution: "iterall@npm:1.3.0" checksum: c78b99678f8c99be488cca7f33e4acca9b72c1326e050afbaf023f086e55619ee466af0464af94a0cb3f292e60cb5bac53a8fd86bd4249ecad26e09f17bb158b @@ -11603,7 +12729,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.1, json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.2, json5@npm:^2.2.3": +"json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -11612,6 +12738,13 @@ __metadata: languageName: node linkType: hard +"jsonc-parser@npm:^3.3.1": + version: 3.3.1 + resolution: "jsonc-parser@npm:3.3.1" + checksum: 81ef19d98d9c6bd6e4a37a95e2753c51c21705cbeffd895e177f4b542cca9cda5fda12fb942a71a2e824a9132cf119dc2e642e9286386055e1365b5478f49a47 + languageName: node + linkType: hard + "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -11632,6 +12765,24 @@ __metadata: languageName: node linkType: hard +"jsonwebtoken@npm:^8.5.1": + version: 8.5.1 + resolution: "jsonwebtoken@npm:8.5.1" + dependencies: + jws: ^3.2.2 + lodash.includes: ^4.3.0 + lodash.isboolean: ^3.0.3 + lodash.isinteger: ^4.0.4 + lodash.isnumber: ^3.0.3 + lodash.isplainobject: ^4.0.6 + lodash.isstring: ^4.0.1 + lodash.once: ^4.0.0 + ms: ^2.1.1 + semver: ^5.6.0 + checksum: 93c9e3f23c59b758ac88ba15f4e4753b3749dfce7a6f7c40fb86663128a1e282db085eec852d4e0cbca4cefdcd3a8275ee255dbd08fcad0df26ad9f6e4cc853a + languageName: node + linkType: hard + "jsonwebtoken@npm:^9.0.0": version: 9.0.0 resolution: "jsonwebtoken@npm:9.0.0" @@ -11775,6 +12926,15 @@ __metadata: languageName: node linkType: hard +"linkify-it@npm:^5.0.0": + version: 5.0.0 + resolution: "linkify-it@npm:5.0.0" + dependencies: + uc.micro: ^2.0.0 + checksum: b0b86cadaf816b64c947a83994ceaad1c15f9fe7e079776ab88699fb71afd7b8fc3fd3d0ae5ebec8c92c1d347be9ba257b8aef338c0ebf81b0d27dcf429a765a + languageName: node + linkType: hard + "listr2@npm:^3.8.3": version: 3.14.0 resolution: "listr2@npm:3.14.0" @@ -11849,6 +13009,48 @@ __metadata: languageName: node linkType: hard +"lodash.includes@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.includes@npm:4.3.0" + checksum: 71092c130515a67ab3bd928f57f6018434797c94def7f46aafa417771e455ce3a4834889f4267b17887d7f75297dfabd96231bf704fd2b8c5096dc4a913568b6 + languageName: node + linkType: hard + +"lodash.isboolean@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isboolean@npm:3.0.3" + checksum: b70068b4a8b8837912b54052557b21fc4774174e3512ed3c5b94621e5aff5eb6c68089d0a386b7e801d679cd105d2e35417978a5e99071750aa2ed90bffd0250 + languageName: node + linkType: hard + +"lodash.isinteger@npm:^4.0.4": + version: 4.0.4 + resolution: "lodash.isinteger@npm:4.0.4" + checksum: 6034821b3fc61a2ffc34e7d5644bb50c5fd8f1c0121c554c21ac271911ee0c0502274852845005f8651d51e199ee2e0cfebfe40aaa49c7fe617f603a8a0b1691 + languageName: node + linkType: hard + +"lodash.isnumber@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isnumber@npm:3.0.3" + checksum: 913784275b565346255e6ae6a6e30b760a0da70abc29f3e1f409081585875105138cda4a429ff02577e1bc0a7ae2a90e0a3079a37f3a04c3d6c5aaa532f4cab2 + languageName: node + linkType: hard + +"lodash.isplainobject@npm:^4.0.6": + version: 4.0.6 + resolution: "lodash.isplainobject@npm:4.0.6" + checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 + languageName: node + linkType: hard + +"lodash.isstring@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.isstring@npm:4.0.1" + checksum: eaac87ae9636848af08021083d796e2eea3d02e80082ab8a9955309569cb3a463ce97fd281d7dc119e402b2e7d8c54a23914b15d2fc7fff56461511dc8937ba0 + languageName: node + linkType: hard + "lodash.lowercase@npm:^4.3.0": version: 4.3.0 resolution: "lodash.lowercase@npm:4.3.0" @@ -11870,14 +13072,14 @@ __metadata: languageName: node linkType: hard -"lodash.once@npm:^4.1.1": +"lodash.once@npm:^4.0.0, lodash.once@npm:^4.1.1": version: 4.1.1 resolution: "lodash.once@npm:4.1.1" checksum: d768fa9f9b4e1dc6453be99b753906f58990e0c45e7b2ca5a3b40a33111e5d17f6edf2f768786e2716af90a8e78f8f91431ab8435f761fef00f9b0c256f6d245 languageName: node linkType: hard -"lodash@npm:4.17.21, lodash@npm:>=4 <5, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.0": +"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -11952,7 +13154,14 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:>=4 <5, lru-cache@npm:^4.1.5": +"lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 6476138d2125387a6d20f100608c2583d415a4f64a0fecf30c9e2dda976614f09cad4baa0842447bd37dd459a7bd27f57d9d8f8ce558805abd487c583f3d774a + languageName: node + linkType: hard + +"lru-cache@npm:^4.1.5": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" dependencies: @@ -11962,14 +13171,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.2.0": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 6476138d2125387a6d20f100608c2583d415a4f64a0fecf30c9e2dda976614f09cad4baa0842447bd37dd459a7bd27f57d9d8f8ce558805abd487c583f3d774a - languageName: node - linkType: hard - -"lru-cache@npm:^5.0.0, lru-cache@npm:^5.1.1": +"lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" dependencies: @@ -12059,6 +13261,22 @@ __metadata: languageName: node linkType: hard +"markdown-it@npm:^14.1.0": + version: 14.1.1 + resolution: "markdown-it@npm:14.1.1" + dependencies: + argparse: ^2.0.1 + entities: ^4.4.0 + linkify-it: ^5.0.0 + mdurl: ^2.0.0 + punycode.js: ^2.3.1 + uc.micro: ^2.1.0 + bin: + markdown-it: bin/markdown-it.mjs + checksum: d6d55865c60debc4cc21d7288f0f6ea04ca055af79c58c467a29c949a289b7e679912c2575d79edb20f55ff3b4548f75b1e1184f939223fa32b08331c5fee81c + languageName: node + linkType: hard + "math-intrinsics@npm:^1.1.0": version: 1.1.0 resolution: "math-intrinsics@npm:1.1.0" @@ -12066,6 +13284,13 @@ __metadata: languageName: node linkType: hard +"mdurl@npm:^2.0.0": + version: 2.0.0 + resolution: "mdurl@npm:2.0.0" + checksum: 880bc289ef668df0bb34c5b2b5aaa7b6ea755052108cdaf4a5e5968ad01cf27e74927334acc9ebcc50a8628b65272ae6b1fd51fae1330c130e261c0466e1a3b2 + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -12101,6 +13326,18 @@ __metadata: languageName: node linkType: hard +"meros@npm:^1.1.4": + version: 1.3.2 + resolution: "meros@npm:1.3.2" + peerDependencies: + "@types/node": ">=13" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 95ada58717efb8b5ae90397a77844a781b37ac12d785d5212775f9ae229309e6fe9575ac1a82bb0c84ff3815691f162cdb17bdbdc66545c784541c785b64048b + languageName: node + linkType: hard + "meros@npm:^1.2.1": version: 1.2.1 resolution: "meros@npm:1.2.1" @@ -12757,6 +13994,27 @@ __metadata: languageName: node linkType: hard +"monaco-editor@npm:0.52.2": + version: 0.52.2 + resolution: "monaco-editor@npm:0.52.2" + checksum: d5ff7b7a469afee25ac708d9ace0dcc5ef24ed328dfc526a52944a497f0d826cfb0685a778ff4b7becc0a8f7843f260c17ea6de3f6719481d53501d79ebb1260 + languageName: node + linkType: hard + +"monaco-graphql@npm:^1.7.3": + version: 1.7.3 + resolution: "monaco-graphql@npm:1.7.3" + dependencies: + graphql-language-service: ^5.5.0 + picomatch-browser: ^2.2.6 + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + monaco-editor: ">= 0.20.0 < 0.53" + prettier: ^2.8.0 || ^3.0.0 + checksum: ebe37ae020bb11e32051a9a932628b4dfa9adb0fe6165d69f86876efdac5f525fe7d0aa3658e876001cf1c83dc5a9a1727136d556db942c26a456df91a27ae81 + languageName: node + linkType: hard + "morgan@npm:^1.10.0": version: 1.10.0 resolution: "morgan@npm:1.10.0" @@ -12770,6 +14028,22 @@ __metadata: languageName: node linkType: hard +"motion-dom@npm:^12.38.0": + version: 12.38.0 + resolution: "motion-dom@npm:12.38.0" + dependencies: + motion-utils: ^12.36.0 + checksum: 6841612e5f620b500181129b864ff184949ab15c066b12df3e9939e48796b91ec4622994c24d64112c7ab84dbc3df7657fbd2707195d9b18decca1bf50217473 + languageName: node + linkType: hard + +"motion-utils@npm:^12.36.0": + version: 12.36.0 + resolution: "motion-utils@npm:12.36.0" + checksum: 61b61425101402ab879b7b4cdf9c940009937e18005ce7a52a3b679bde9c73594802188bc14d2b9d2885a6f70015a2cf9173f3f1c8da2a63bf4edaa503a143f1 + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -13188,7 +14462,7 @@ __metadata: languageName: node linkType: hard -"nullthrows@npm:^1.1.1": +"nullthrows@npm:^1.0.0, nullthrows@npm:^1.1.1": version: 1.1.1 resolution: "nullthrows@npm:1.1.1" checksum: 10806b92121253eb1b08ecf707d92480f5331ba8ae5b23fa3eb0548ad24196eb797ed47606153006568a5733ea9e528a3579f21421f7828e09e7756f4bdd386f @@ -13652,7 +14926,7 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:^1.3.2, parseurl@npm:~1.3.3": +"parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 @@ -13832,6 +15106,13 @@ __metadata: languageName: node linkType: hard +"pg-cloudflare@npm:^1.3.0": + version: 1.3.0 + resolution: "pg-cloudflare@npm:1.3.0" + checksum: 8f43db569f44d2a1673e33d73fc37919507b5c9cb4976968543aa13da4c919c391bb81f4435ab98890e48dda6cff265aa7618557da460a4e2b3a6dac83155510 + languageName: node + linkType: hard + "pg-connection-string@npm:2.x": version: 2.5.0 resolution: "pg-connection-string@npm:2.5.0" @@ -13846,6 +15127,15 @@ __metadata: languageName: node linkType: hard +"pg-introspection@npm:^0.0.1-beta.1": + version: 0.0.1-beta.13 + resolution: "pg-introspection@npm:0.0.1-beta.13" + dependencies: + tslib: ^2.8.1 + checksum: e23b324b9b3758da4cd7149498a3d35f237e5832a881100ed26f0769f1d443f902a5bcad9ba9ac7dd4e37b58ee5fff032e624af44710644154a3a1923b4caea0 + languageName: node + linkType: hard + "pg-minify@npm:^1.5.2": version: 1.6.2 resolution: "pg-minify@npm:1.6.2" @@ -13853,6 +15143,15 @@ __metadata: languageName: node linkType: hard +"pg-pool@npm:^3.13.0": + version: 3.13.0 + resolution: "pg-pool@npm:3.13.0" + peerDependencies: + pg: ">=8.0" + checksum: c5cc5187d9d78cbc3151f64feb4365b90ee5b110361b9bca9cdff4312d85ff9d01018a83d4e5a4cd896b8f38ee0467d3dee53d219440ad6eb5e802ea31fd3cbe + languageName: node + linkType: hard + "pg-pool@npm:^3.5.2": version: 3.5.2 resolution: "pg-pool@npm:3.5.2" @@ -13869,21 +15168,24 @@ __metadata: languageName: node linkType: hard -"pg-sql2@npm:4.13.0": - version: 4.13.0 - resolution: "pg-sql2@npm:4.13.0" +"pg-protocol@npm:^1.13.0": + version: 1.13.0 + resolution: "pg-protocol@npm:1.13.0" + checksum: 93f3d82804b6471961f97a1747e8a793c89defb3266fcc5659d842f36e022b2f7ea574490fa4e23cf1c9acafadb77642d388d9140581f94e23e19a8699fcd6a0 + languageName: node + linkType: hard + +"pg-sql2@npm:5.0.0, pg-sql2@npm:^5.0.0-beta.1": + version: 5.0.0 + resolution: "pg-sql2@npm:5.0.0" dependencies: - "@graphile/lru": 4.11.0 - "@types/pg": ">=6 <9" - debug: ">=3 <5" - tslib: ^2.0.1 - peerDependencies: - pg: ">=6.1.0 <9" - checksum: a9ada8a0113d9ea24e435acd627f080512c5b15248afefb0a67e4d01415c8d692b25d731cce58345b0cbef6fab334471b5cb4c5e7a07dc85ded98160aa61cbc2 + "@graphile/lru": ^5.0.0 + tslib: ^2.8.1 + checksum: 885910b9f9209db9a6e0a9b33b2a623ebe8ff253fbe0e8c23cc357544f935431ae1e9444d9a6cd57e9ad87746ee4fd627b3ed79fb1332f7e67799e0a4902723c languageName: node linkType: hard -"pg-types@npm:^2.1.0, pg-types@npm:^2.2.0": +"pg-types@npm:2.2.0, pg-types@npm:^2.1.0, pg-types@npm:^2.2.0": version: 2.2.0 resolution: "pg-types@npm:2.2.0" dependencies: @@ -13896,7 +15198,7 @@ __metadata: languageName: node linkType: hard -"pg@npm:>=6.1.0 <9, pg@npm:>=6.5 <9, pg@npm:^8.8.0, pg@npm:^8.9.0": +"pg@npm:>=6.5 <9, pg@npm:^8.8.0": version: 8.9.0 resolution: "pg@npm:8.9.0" dependencies: @@ -13916,7 +15218,29 @@ __metadata: languageName: node linkType: hard -"pgpass@npm:1.x": +"pg@npm:^8.7.1, pg@npm:^8.9.0": + version: 8.20.0 + resolution: "pg@npm:8.20.0" + dependencies: + pg-cloudflare: ^1.3.0 + pg-connection-string: ^2.12.0 + pg-pool: ^3.13.0 + pg-protocol: ^1.13.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + peerDependencies: + pg-native: ">=3.0.1" + dependenciesMeta: + pg-cloudflare: + optional: true + peerDependenciesMeta: + pg-native: + optional: true + checksum: ffd032bb79b126176928efc1160e27778be797ebbd0a7be50e3099955bf2a07912c07c6ea748f5fcc369cd298f5b649b5ee8a10bf0a8f8f239377da4ff989a05 + languageName: node + linkType: hard + +"pgpass@npm:1.0.5, pgpass@npm:1.x": version: 1.0.5 resolution: "pgpass@npm:1.0.5" dependencies: @@ -13939,6 +15263,13 @@ __metadata: languageName: node linkType: hard +"picomatch-browser@npm:^2.2.6": + version: 2.2.6 + resolution: "picomatch-browser@npm:2.2.6" + checksum: 946c50a8654da43167a0f9a90dd0b50f3d4e830ee71c0926ee9052d7e6f40d8907deaafba19cea71b97207b4aaa52c245335e4cd5bbaf78fe2ba567cd0c341fa + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -14021,54 +15352,49 @@ __metadata: languageName: node linkType: hard -"postgraphile-core@npm:4.13.0": - version: 4.13.0 - resolution: "postgraphile-core@npm:4.13.0" - dependencies: - graphile-build: 4.13.0 - graphile-build-pg: 4.13.0 - tslib: ^2.0.1 - peerDependencies: - graphql: ">=0.9 <0.14 || ^14.0.2 || ^15.4.0" - pg: ">=6.1.0 <9" - checksum: 4b339843b4e2dde0b4a3076a1d019be0dab6d1c8a30ede6d67fbfba480f58017df76e2ad80c4af49c7dcc4156b41665c726961f1b5c8e4a8c6e593030174206c - languageName: node - linkType: hard - -"postgraphile@npm:^4.13.0": - version: 4.13.0 - resolution: "postgraphile@npm:4.13.0" +"postgraphile@npm:5.0.0-beta.2": + version: 5.0.0-beta.2 + resolution: "postgraphile@npm:5.0.0-beta.2" dependencies: - "@graphile/lru": 4.11.0 - "@types/json5": ^0.0.30 - "@types/jsonwebtoken": ^9.0.1 - "@types/pg": ">=6 <9" - "@types/ws": ^7.4.0 - body-parser: ^1.15.2 - chalk: ^2.4.2 - commander: ^2.19.0 - debug: ^4.1.1 - finalhandler: ^1.0.6 - graphile-build: 4.13.0 - graphile-build-pg: 4.13.0 - graphile-utils: ^4.13.0 - graphql: ^0.6.0 || ^0.7.0 || ^0.8.0-b || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.2 || ^15.0.0 - graphql-ws: ^5.6.2 - http-errors: ^1.5.1 - iterall: ^1.0.2 - json5: ^2.1.1 - jsonwebtoken: ^9.0.0 - parseurl: ^1.3.2 - pg: ">=6.1.0 <9" - pg-connection-string: ^2.0.0 - pg-sql2: 4.13.0 - postgraphile-core: 4.13.0 - subscriptions-transport-ws: ^0.9.18 - tslib: ^2.1.0 - ws: ^7.4.2 + "@dataplan/json": 0.0.1-beta.2 + "@dataplan/pg": 0.0.1-beta.2 + "@graphile/lru": ^5.0.0-beta.1 + "@types/node": ^18.15.5 + "@types/pg": ^8.6.2 + debug: ^4.3.3 + grafast: ^0.0.1-beta.2 + grafserv: ^0.0.1-beta.2 + graphile-build: 5.0.0-beta.2 + graphile-build-pg: 5.0.0-beta.2 + graphile-config: ^0.0.1-beta.1 + graphile-utils: ^5.0.0-beta.2 + graphql: ^16.1.0-experimental-stream-defer.6 + iterall: ^1.3.0 + jsonwebtoken: ^8.5.1 + pg: ^8.7.1 + pg-sql2: ^5.0.0-beta.1 + tamedevil: ^0.0.0-beta.1 + tslib: ^2.5.0 + ws: ^8.12.1 + peerDependencies: + "@dataplan/json": 0.0.1-beta.2 + "@dataplan/pg": 0.0.1-beta.2 + "@envelop/core": ^3.0.4 + grafast: ^0.0.1-beta.2 + grafserv: ^0.0.1-beta.2 + graphile-build: 5.0.0-beta.2 + graphile-build-pg: 5.0.0-beta.2 + graphile-config: ^0.0.1-beta.1 + graphql: ^16.1.0-experimental-stream-defer.6 + pg: ^8.7.1 + pg-sql2: ^5.0.0-beta.1 + tamedevil: ^0.0.0-beta.1 + peerDependenciesMeta: + "@envelop/core": + optional: true bin: - postgraphile: cli.js - checksum: 2462335f9518135d2417e29ae715c04c6468ad12fbc5743622e9f1d6ed5b9de5a74fd948b9ca0fe31d6a871ee63fc1b699abc0c3d92a1d9c4586dca17a0b0de8 + postgraphile: dist/cli-run.js + checksum: 5ab34c8a4f4bf38d737e8684de499b16f7d757127b3d37e3e058df066cbdc72903cbedaddb0c4b1af8f5b80ae7326ccc427c8b9cce34c051e50039b5d11d6e53 languageName: node linkType: hard @@ -14102,6 +15428,13 @@ __metadata: languageName: node linkType: hard +"postgres-range@npm:^1.1.1": + version: 1.1.4 + resolution: "postgres-range@npm:1.1.4" + checksum: 460af8c882a50e2c3d08ede5d5ee9e5e5a99dcf471e3ed55b4c17cad62dc85177b51bb8105b626a9c73de9edcba934e86665923b0d86e1c8e1f55d3e0f3530c6 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -14118,7 +15451,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.1.1": +"prettier@npm:^3.1.1, prettier@npm:^3.5.3": version: 3.8.1 resolution: "prettier@npm:3.8.1" bin: @@ -14247,6 +15580,13 @@ __metadata: languageName: node linkType: hard +"punycode.js@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode.js@npm:2.3.1" + checksum: 13466d7ed5e8dacdab8c4cc03837e7dd14218a59a40eb14a837f1f53ca396e18ef2c4ee6d7766b8ed2fc391d6a3ac489eebf2de83b3596f5a54e86df4a251b72 + languageName: node + linkType: hard + "punycode@npm:1.3.2": version: 1.3.2 resolution: "punycode@npm:1.3.2" @@ -14293,15 +15633,6 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" - dependencies: - side-channel: ^1.0.4 - checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297 - languageName: node - linkType: hard - "qs@npm:6.13.0": version: 6.13.0 resolution: "qs@npm:6.13.0" @@ -14936,6 +16267,15 @@ __metadata: languageName: node linkType: hard +"react-compiler-runtime@npm:19.1.0-rc.1": + version: 19.1.0-rc.1 + resolution: "react-compiler-runtime@npm:19.1.0-rc.1" + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^0.0.0-experimental + checksum: 87b81a60247dc00056222b3cc3c52bf4f25c07eb4e65d79c4752b0c2ca841601a6d0817707340b356606facc2a3754a8158a3b88f3780f34220e03dd502b85d2 + languageName: node + linkType: hard + "react-dom@npm:^18.2.0": version: 18.2.0 resolution: "react-dom@npm:18.2.0" @@ -14962,6 +16302,41 @@ __metadata: languageName: node linkType: hard +"react-remove-scroll-bar@npm:^2.3.7": + version: 2.3.8 + resolution: "react-remove-scroll-bar@npm:2.3.8" + dependencies: + react-style-singleton: ^2.2.2 + tslib: ^2.0.0 + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: c4663247f689dbe51c370836edf735487f6d8796acb7f15b09e8a1c14e84c7997360e8e3d54de2bc9c0e782fed2b2c4127d15b4053e4d2cf26839e809e57605f + languageName: node + linkType: hard + +"react-remove-scroll@npm:^2.6.3": + version: 2.7.2 + resolution: "react-remove-scroll@npm:2.7.2" + dependencies: + react-remove-scroll-bar: ^2.3.7 + react-style-singleton: ^2.2.3 + tslib: ^2.1.0 + use-callback-ref: ^1.3.3 + use-sidecar: ^1.1.3 + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 70179d794b3172afea8f1df7aedab0df2849f8f9662e20814a3ef6268564f19f077e1153e80c4ab3b379543e7ac1492bec921db130018ca74f2eaedeea841f4d + languageName: node + linkType: hard + "react-sortable-hoc@npm:^2.0.0": version: 2.0.0 resolution: "react-sortable-hoc@npm:2.0.0" @@ -14977,6 +16352,22 @@ __metadata: languageName: node linkType: hard +"react-style-singleton@npm:^2.2.2, react-style-singleton@npm:^2.2.3": + version: 2.2.3 + resolution: "react-style-singleton@npm:2.2.3" + dependencies: + get-nonce: ^1.0.0 + tslib: ^2.0.0 + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: a7b0bf493c9231065ebafa84c4237aed997c746c561196121b7de82fe155a5355b372db5070a3ac9fe980cf7f60dc0f1e8cf6402a2aa5b2957392932ccf76e76 + languageName: node + linkType: hard + "react@npm:^18.2.0": version: 18.2.0 resolution: "react@npm:18.2.0" @@ -15194,6 +16585,13 @@ __metadata: languageName: node linkType: hard +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff + languageName: node + linkType: hard + "resize-observer-polyfill@npm:^1.5.1": version: 1.5.1 resolution: "resize-observer-polyfill@npm:1.5.1" @@ -15406,6 +16804,52 @@ __metadata: languageName: node linkType: hard +"ruru-types@npm:^2.0.0": + version: 2.0.0 + resolution: "ruru-types@npm:2.0.0" + dependencies: + "@graphiql/toolkit": ^0.11.3 + graphiql: ^5.2.1 + peerDependencies: + graphql: ^16.9.0 + react: ^18 || ^19 + react-dom: ^18 || ^19 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + checksum: 97124645fcbfcba7c636312259dc5c96270b79786ecfad85aa3f110b746aa7179cbc300d1fdc2345e1d99f18042309097716f76d49ec5ae471c0a0725d1f794e + languageName: node + linkType: hard + +"ruru@npm:^2.0.0-beta.5": + version: 2.0.0 + resolution: "ruru@npm:2.0.0" + dependencies: + "@emotion/is-prop-valid": ^1.4.0 + graphile-config: ^1.0.0 + graphql: ^16.9.0 + http-proxy: ^1.18.1 + ruru-types: ^2.0.0 + tslib: ^2.8.1 + yargs: ^17.7.2 + peerDependencies: + graphile-config: ^1.0.0-rc.5 + graphql: ^16.9.0 + react: ^18 || ^19 + react-dom: ^18 || ^19 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + bin: + ruru: dist/cli-run.js + checksum: e801a5b1cda56e2bc67bc18dfef89797167fc1c00732f6d3abf689371de32a60c8f91909729b1eaa38e8e223a681d76777d9228b260d62bbf2b531901c1787c6 + languageName: node + linkType: hard + "rxjs@npm:^7.0.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.5.7": version: 7.8.0 resolution: "rxjs@npm:7.8.0" @@ -15619,7 +17063,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.5.4, semver@npm:^7.7.1, semver@npm:^7.7.3": +"semver@npm:^7.5.4, semver@npm:^7.7.1, semver@npm:^7.7.2, semver@npm:^7.7.3": version: 7.7.4 resolution: "semver@npm:7.7.4" bin: @@ -15734,6 +17178,16 @@ __metadata: languageName: node linkType: hard +"set-value@npm:^4.1.0": + version: 4.1.0 + resolution: "set-value@npm:4.1.0" + dependencies: + is-plain-object: ^2.0.4 + is-primitive: ^3.0.1 + checksum: 2b4f0f222538ae4c1f4171a5014c113649631c86ed81d1ac0c2df406d0a974d8006412ce1d7844c531268f1c66eb912f7eae7245ab3114e34357f1ff9d6dc697 + languageName: node + linkType: hard + "setimmediate@npm:^1.0.5": version: 1.0.5 resolution: "setimmediate@npm:1.0.5" @@ -16371,21 +17825,6 @@ __metadata: languageName: node linkType: hard -"subscriptions-transport-ws@npm:^0.9.18": - version: 0.9.19 - resolution: "subscriptions-transport-ws@npm:0.9.19" - dependencies: - backo2: ^1.0.2 - eventemitter3: ^3.1.0 - iterall: ^1.2.1 - symbol-observable: ^1.0.4 - ws: ^5.2.0 || ^6.0.0 || ^7.0.0 - peerDependencies: - graphql: ">=0.10.0" - checksum: 6979b36e03c0a48e33836cb412941e41bae8743767dff2aa453159cfffa983b879cc80cd4e744e82afbf11062c66899c37f5dca0281253ee240098ada0078533 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -16440,13 +17879,6 @@ __metadata: languageName: node linkType: hard -"symbol-observable@npm:^1.0.4": - version: 1.2.0 - resolution: "symbol-observable@npm:1.2.0" - checksum: 48ffbc22e3d75f9853b3ff2ae94a44d84f386415110aea5effc24d84c502e03a4a6b7a8f75ebaf7b585780bda34eb5d6da3121f826a6f93398429d30032971b6 - languageName: node - linkType: hard - "symbol-observable@npm:^4.0.0": version: 4.0.0 resolution: "symbol-observable@npm:4.0.0" @@ -16464,6 +17896,23 @@ __metadata: languageName: node linkType: hard +"tabbable@npm:^6.0.0": + version: 6.4.0 + resolution: "tabbable@npm:6.4.0" + checksum: 7084cba269ebbc7dcdeed5aca7f90c0a0fb59a295dd1e83703ab89cca5e6c53b78d02020e3d1065481984cd64bba7dd1ea3c0a48e92fdba83d586e6e86d62a74 + languageName: node + linkType: hard + +"tamedevil@npm:^0.0.0-beta.1, tamedevil@npm:^0.0.0-beta.3": + version: 0.0.0-beta.9 + resolution: "tamedevil@npm:0.0.0-beta.9" + dependencies: + "@graphile/lru": ^5.0.0-beta.4 + tslib: ^2.8.1 + checksum: 91ef59458ddda2483b3109d6cf2ce4f96a3d4d576239e78b3aa5626d0adf5c6cae728bc205a3e83028b285e7c4019d0dbaf453e10de5664e53ca62c45cbb9e6a + languageName: node + linkType: hard + "tapable@npm:^2.1.1, tapable@npm:^2.2.0": version: 2.2.1 resolution: "tapable@npm:2.2.1" @@ -16834,13 +18283,20 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.5.0, tslib@npm:~2.5.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.5.0, tslib@npm:~2.5.0": version: 2.5.0 resolution: "tslib@npm:2.5.0" checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 languageName: node linkType: hard +"tslib@npm:^2.6.2, tslib@npm:^2.8.0, tslib@npm:^2.8.1": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a + languageName: node + linkType: hard + "tslib@npm:~2.4.0": version: 2.4.1 resolution: "tslib@npm:2.4.1" @@ -17009,6 +18465,13 @@ __metadata: languageName: node linkType: hard +"uc.micro@npm:^2.0.0, uc.micro@npm:^2.1.0": + version: 2.1.0 + resolution: "uc.micro@npm:2.1.0" + checksum: 37197358242eb9afe367502d4638ac8c5838b78792ab218eafe48287b0ed28aaca268ec0392cc5729f6c90266744de32c06ae938549aee041fc93b0f9672d6b2 + languageName: node + linkType: hard + "uglify-js@npm:^3.5.1": version: 3.17.4 resolution: "uglify-js@npm:3.17.4" @@ -17072,6 +18535,20 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 + languageName: node + linkType: hard + +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 46331c7d6016bf85b3e8f20c159d62f5ae471aba1eb3dc52fff35a0259d58dcc7d592d4cc4f00c5f9243fa738a11cfa48bd20203040d4a9e6bc25e807fab7ab3 + languageName: node + linkType: hard + "unfetch@npm:^4.2.0": version: 4.2.0 resolution: "unfetch@npm:4.2.0" @@ -17315,6 +18792,21 @@ __metadata: languageName: node linkType: hard +"use-callback-ref@npm:^1.3.3": + version: 1.3.3 + resolution: "use-callback-ref@npm:1.3.3" + dependencies: + tslib: ^2.0.0 + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 4da1c82d7a2409cee6c882748a40f4a083decf238308bf12c3d0166f0e338f8d512f37b8d11987eb5a421f14b9b5b991edf3e11ed25c3bb7a6559081f8359b44 + languageName: node + linkType: hard + "use-json-comparison@npm:^1.0.3": version: 1.0.6 resolution: "use-json-comparison@npm:1.0.6" @@ -17333,6 +18825,22 @@ __metadata: languageName: node linkType: hard +"use-sidecar@npm:^1.1.3": + version: 1.1.3 + resolution: "use-sidecar@npm:1.1.3" + dependencies: + detect-node-es: ^1.1.0 + tslib: ^2.0.0 + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 88664c6b2c5b6e53e4d5d987694c9053cea806da43130248c74ca058945c8caa6ccb7b1787205a9eb5b9d124633e42153848904002828acabccdc48cda026622 + languageName: node + linkType: hard + "use-sync-external-store@npm:^1.2.0": version: 1.2.0 resolution: "use-sync-external-store@npm:1.2.0" @@ -17342,6 +18850,15 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:^1.5.0": + version: 1.6.0 + resolution: "use-sync-external-store@npm:1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 61a62e910713adfaf91bdb72ff2cd30e5ba83687accaf3b6e75a903b45bf635f5722e3694af30d83a03e92cb533c0a5c699298d2fef639a03ffc86b469f4eee2 + languageName: node + linkType: hard + "utf-8-validate@npm:^6.0.3": version: 6.0.3 resolution: "utf-8-validate@npm:6.0.3" @@ -17447,6 +18964,13 @@ __metadata: languageName: node linkType: hard +"vscode-languageserver-types@npm:^3.17.1": + version: 3.17.5 + resolution: "vscode-languageserver-types@npm:3.17.5" + checksum: 79b420e7576398d396579ca3a461c9ed70e78db4403cd28bbdf4d3ed2b66a2b4114031172e51fad49f0baa60a2180132d7cb2ea35aa3157d7af3c325528210ac + languageName: node + linkType: hard + "walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -17772,18 +19296,18 @@ __metadata: languageName: node linkType: hard -"ws@npm:^5.2.0 || ^6.0.0 || ^7.0.0, ws@npm:^7.4.2": - version: 7.5.9 - resolution: "ws@npm:7.5.9" +"ws@npm:^8.12.1": + version: 8.20.0 + resolution: "ws@npm:8.20.0" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: c3c100a181b731f40b7f2fddf004aa023f79d64f489706a28bc23ff88e87f6a64b3c6651fbec3a84a53960b75159574d7a7385709847a62ddb7ad6af76f49138 + checksum: 2b31d24a53690770564a033c21ea48390f84d23fbc5abc14b2bbec4e112846f2f3ca66caee769a73fb8bc89ba16b452a6911a553e9742bbc75bccb79e203953e languageName: node linkType: hard @@ -17933,6 +19457,21 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: ^8.0.1 + 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.1.1 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a + languageName: node + linkType: hard + "yauzl@npm:^2.10.0": version: 2.10.0 resolution: "yauzl@npm:2.10.0" @@ -17974,6 +19513,27 @@ __metadata: languageName: node linkType: hard +"zustand@npm:^5": + version: 5.0.12 + resolution: "zustand@npm:5.0.12" + peerDependencies: + "@types/react": ">=18.0.0" + immer: ">=9.0.6" + react: ">=18.0.0" + use-sync-external-store: ">=1.2.0" + peerDependenciesMeta: + "@types/react": + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + checksum: bf856f2d86912d46439b6e32004b32b77518af49dc23fdc1998457777d860183e0a677498731b61f3d38717b62283e08dd38d1fc3714385e84ba87ef9f5aa4c6 + languageName: node + linkType: hard + "zxcvbn@npm:^4.4.2": version: 4.4.2 resolution: "zxcvbn@npm:4.4.2"