diff --git a/pgpm/cli/src/commands/export.ts b/pgpm/cli/src/commands/export.ts index d01961194..5ecd81fe1 100644 --- a/pgpm/cli/src/commands/export.ts +++ b/pgpm/cli/src/commands/export.ts @@ -1,4 +1,5 @@ -import { exportMigrations,PgpmPackage } from '@pgpmjs/core'; +import { exportMigrations, exportGraphQL, GraphQLClient, PgpmPackage } from '@pgpmjs/core'; +import { graphqlRowToPostgresRow } from '@pgpmjs/core'; import { getEnvOptions } from '@pgpmjs/env'; import { getGitConfigInfo } from '@pgpmjs/types'; import { CLIOptions, Inquirerer } from 'inquirerer'; @@ -14,13 +15,17 @@ Export Command: Options: --help, -h Show this help message + --graphql-endpoint GraphQL endpoint for meta/services data (enables GraphQL mode) + --migrate-endpoint GraphQL endpoint for db_migrate data (optional, for sql_actions) + --token Bearer token for GraphQL authentication --author Project author (default: from git config) --extensionName Extension name --metaExtensionName Meta extension name (default: svc) --cwd Working directory (default: current directory) Examples: - pgpm export Export migrations from selected database + pgpm export Export migrations from selected database (SQL mode) + pgpm export --graphql-endpoint http://private.localhost:3002/graphql --migrate-endpoint http://db_migrate.localhost:3000/graphql `; export default async ( @@ -40,106 +45,230 @@ export default async ( project.ensureWorkspace(); project.resetCwd(project.workspacePath); - const options = getEnvOptions(); - - const db = await getPgPool({ - database: 'postgres' - }); - - const databasesResult = await db.query(` - SELECT datname FROM pg_catalog.pg_database - WHERE datistemplate = FALSE AND datname NOT IN ('postgres') - AND datname !~ '^pg_'; - `); - - const { databases: dbname } = await prompter.prompt(argv, [ - { - type: 'list', - name: 'databases', - message: 'Select a database', - options: databasesResult.rows.map(row => row.datname), - required: true + const graphqlEndpoint = argv['graphql-endpoint'] || argv.graphqlEndpoint; + const migrateEndpoint = argv['migrate-endpoint'] || argv.migrateEndpoint; + const token = argv.token; + + if (graphqlEndpoint) { + // ========================================================================= + // GraphQL export mode + // ========================================================================= + console.log(`GraphQL export mode: ${graphqlEndpoint}`); + + const metaClient = new GraphQLClient({ endpoint: graphqlEndpoint, token }); + + // Fetch databases via GraphQL + const dbRows = await metaClient.fetchAllNodes<{ id: string; name: string }>( + 'databases', + 'id\nname' + ); + + if (!dbRows.length) { + console.log('No databases found via GraphQL.'); + prompter.close(); + return; } - ]); - const selectedDb = await getPgPool({ - database: dbname - }); - - const dbsResult = await selectedDb.query(` - SELECT id, name FROM metaschema_public.database; - `); - - const { database_ids: selectedDatabaseName } = await prompter.prompt({} as any, [ - { - type: 'list', - name: 'database_ids', - message: 'Select database_id', - options: dbsResult.rows.map(db => db.name), - required: true + + const { database_ids: selectedDatabaseName } = await prompter.prompt(argv, [ + { + type: 'list', + name: 'database_ids', + message: 'Select database', + options: dbRows.map(db => db.name), + required: true + } + ]); + + const selectedDatabase = dbRows.find(db => db.name === selectedDatabaseName); + if (!selectedDatabase) { + console.log('Database not found.'); + prompter.close(); + return; } - ]); - - const selectedDatabase = dbsResult.rows.find(db => db.name === selectedDatabaseName); - - const dbInfo = { - dbname, - databaseName: selectedDatabaseName, - database_ids: [selectedDatabase!.id] - }; - - const { author, extensionName, metaExtensionName } = await prompter.prompt(argv, [ - { - type: 'text', - name: 'author', - message: 'Project author', - default: `${username} <${email}>`, - required: true - }, - { - type: 'text', - name: 'extensionName', - message: 'Extension name', - default: selectedDatabaseName || dbname, - required: true - }, - { - type: 'text', - name: 'metaExtensionName', - message: 'Meta extension name', - default: `${selectedDatabaseName || dbname}-service`, - required: true + + const databaseId = selectedDatabase.id; + + const { author, extensionName, metaExtensionName } = await prompter.prompt(argv, [ + { + type: 'text', + name: 'author', + message: 'Project author', + default: `${username} <${email}>`, + required: true + }, + { + type: 'text', + name: 'extensionName', + message: 'Extension name', + default: selectedDatabaseName, + required: true + }, + { + type: 'text', + name: 'metaExtensionName', + message: 'Meta extension name', + default: `${selectedDatabaseName}-service`, + required: true + } + ]); + + // Fetch schemas via GraphQL + const schemaRows = await metaClient.fetchAllNodes<{ id: string; schemaName: string; name: string }>( + 'schemas', + 'id\nschemaName\nname', + { databaseId } + ); + + // Convert camelCase to snake_case for schema rows + const pgSchemaRows = schemaRows.map(s => graphqlRowToPostgresRow(s)) as Array<{ id: string; schema_name: string; name: string }>; + + // Normalize comma-separated schema_names string into an array for checkbox override + if (typeof argv.schema_names === 'string') { + argv.schema_names = argv.schema_names.split(',').map((s: string) => s.trim()).filter(Boolean); } - ]); - - const schemasResult = await selectedDb.query( - `SELECT * FROM metaschema_public.schema WHERE database_id = $1`, - [dbInfo.database_ids[0]] - ); - - const { schema_names } = await prompter.prompt({} as any, [ - { - type: 'checkbox', - name: 'schema_names', - message: 'Select schema_name(s)', - options: schemasResult.rows.map(s => s.schema_name), - default: schemasResult.rows.map(s => s.schema_name), - required: true + + const { schema_names } = await prompter.prompt(argv, [ + { + type: 'checkbox', + name: 'schema_names', + message: 'Select schema_name(s)', + options: pgSchemaRows.map(s => s.schema_name), + default: pgSchemaRows.map(s => s.schema_name), + required: true + } + ]); + + const outdir = resolve(project.workspacePath, 'packages/'); + + await exportGraphQL({ + project, + metaEndpoint: graphqlEndpoint, + migrateEndpoint, + token, + databaseId, + databaseName: selectedDatabaseName, + schema_names, + schemas: pgSchemaRows, + author, + outdir, + extensionName, + metaExtensionName, + prompter, + argv, + username + }); + } else { + // ========================================================================= + // SQL export mode (original behavior) + // ========================================================================= + const options = getEnvOptions(); + + const db = await getPgPool({ + database: 'postgres' + }); + + const databasesResult = await db.query(` + SELECT datname FROM pg_catalog.pg_database + WHERE datistemplate = FALSE AND datname NOT IN ('postgres') + AND datname !~ '^pg_'; + `); + + const { databases: dbname } = await prompter.prompt(argv, [ + { + type: 'list', + name: 'databases', + message: 'Select a database', + options: databasesResult.rows.map(row => row.datname), + required: true + } + ]); + const selectedDb = await getPgPool({ + database: dbname + }); + + const dbsResult = await selectedDb.query(` + SELECT id, name FROM metaschema_public.database; + `); + + const { database_ids: selectedDatabaseName } = await prompter.prompt(argv, [ + { + type: 'list', + name: 'database_ids', + message: 'Select database_id', + options: dbsResult.rows.map(db => db.name), + required: true + } + ]); + + const selectedDatabase = dbsResult.rows.find(db => db.name === selectedDatabaseName); + + const dbInfo = { + dbname, + databaseName: selectedDatabaseName, + database_ids: [selectedDatabase!.id] + }; + + const { author, extensionName, metaExtensionName } = await prompter.prompt(argv, [ + { + type: 'text', + name: 'author', + message: 'Project author', + default: `${username} <${email}>`, + required: true + }, + { + type: 'text', + name: 'extensionName', + message: 'Extension name', + default: selectedDatabaseName || dbname, + required: true + }, + { + type: 'text', + name: 'metaExtensionName', + message: 'Meta extension name', + default: `${selectedDatabaseName || dbname}-service`, + required: true + } + ]); + + const schemasResult = await selectedDb.query( + `SELECT * FROM metaschema_public.schema WHERE database_id = $1`, + [dbInfo.database_ids[0]] + ); + + // Normalize comma-separated schema_names string into an array for checkbox override + if (typeof argv.schema_names === 'string') { + argv.schema_names = argv.schema_names.split(',').map((s: string) => s.trim()).filter(Boolean); } - ]); - - const outdir = resolve(project.workspacePath, 'packages/'); - - await exportMigrations({ - project, - options, - dbInfo, - author, - schema_names, - outdir, - extensionName, - metaExtensionName, - prompter - }); + + const { schema_names } = await prompter.prompt(argv, [ + { + type: 'checkbox', + name: 'schema_names', + message: 'Select schema_name(s)', + options: schemasResult.rows.map(s => s.schema_name), + default: schemasResult.rows.map(s => s.schema_name), + required: true + } + ]); + + const outdir = resolve(project.workspacePath, 'packages/'); + + await exportMigrations({ + project, + options, + dbInfo, + author, + schema_names, + outdir, + extensionName, + metaExtensionName, + prompter, + argv, + username + }); + } prompter.close(); diff --git a/pgpm/core/package.json b/pgpm/core/package.json index 8047a82f0..2fb22a24e 100644 --- a/pgpm/core/package.json +++ b/pgpm/core/package.json @@ -55,6 +55,7 @@ "csv-to-pg": "workspace:^", "genomic": "^5.3.5", "glob": "^13.0.0", + "inflekt": "^0.3.3", "komoji": "^0.8.1", "minimatch": "^10.2.4", "parse-package-name": "^1.0.0", diff --git a/pgpm/core/src/export/export-graphql-meta.ts b/pgpm/core/src/export/export-graphql-meta.ts new file mode 100644 index 000000000..9e810c946 --- /dev/null +++ b/pgpm/core/src/export/export-graphql-meta.ts @@ -0,0 +1,1030 @@ +/** + * GraphQL equivalent of export-meta.ts. + * + * Fetches metadata from metaschema_public, services_public, and metaschema_modules_public + * via GraphQL queries instead of direct SQL, then uses the same csv-to-pg Parser to + * generate SQL INSERT statements. + */ +import { Parser } from 'csv-to-pg'; + +import { GraphQLClient } from './graphql-client'; +import { + buildFieldsFragment, + getGraphQLQueryName, + graphqlRowToPostgresRow, + intervalToPostgres +} from './graphql-naming'; + +type FieldType = 'uuid' | 'uuid[]' | 'text' | 'text[]' | 'boolean' | 'image' | 'upload' | 'url' | 'jsonb' | 'int' | 'interval' | 'timestamptz'; + +interface TableConfig { + schema: string; + table: string; + conflictDoNothing?: boolean; + fields: Record; +} + +/** + * Same config map as export-meta.ts — defines the schema, table, and expected fields + * for each table we need to export. The fields are used both to build the GraphQL + * query fragment and to construct the csv-to-pg Parser for SQL generation. + */ +const config: Record = { + // ============================================================================= + // metaschema_public tables + // ============================================================================= + database: { + schema: 'metaschema_public', + table: 'database', + fields: { + id: 'uuid', + owner_id: 'uuid', + name: 'text', + hash: 'uuid' + } + }, + schema: { + schema: 'metaschema_public', + table: 'schema', + fields: { + id: 'uuid', + database_id: 'uuid', + name: 'text', + schema_name: 'text', + description: 'text', + is_public: 'boolean' + } + }, + table: { + schema: 'metaschema_public', + table: 'table', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + name: 'text', + description: 'text' + } + }, + field: { + schema: 'metaschema_public', + table: 'field', + conflictDoNothing: true, + fields: { + id: 'uuid', + database_id: 'uuid', + table_id: 'uuid', + name: 'text', + type: 'text', + description: 'text' + } + }, + policy: { + schema: 'metaschema_public', + table: 'policy', + fields: { + id: 'uuid', + database_id: 'uuid', + table_id: 'uuid', + name: 'text', + privilege: 'text', + permissive: 'boolean', + disabled: 'boolean', + policy_type: 'text', + data: 'jsonb' + } + }, + index: { + schema: 'metaschema_public', + table: 'index', + fields: { + id: 'uuid', + database_id: 'uuid', + table_id: 'uuid', + name: 'text', + field_ids: 'uuid[]', + include_field_ids: 'uuid[]', + access_method: 'text', + index_params: 'jsonb', + where_clause: 'jsonb', + is_unique: 'boolean' + } + }, + trigger: { + schema: 'metaschema_public', + table: 'trigger', + fields: { + id: 'uuid', + database_id: 'uuid', + table_id: 'uuid', + name: 'text', + event: 'text', + function_name: 'text' + } + }, + trigger_function: { + schema: 'metaschema_public', + table: 'trigger_function', + fields: { + id: 'uuid', + database_id: 'uuid', + name: 'text', + code: 'text' + } + }, + rls_function: { + schema: 'metaschema_public', + table: 'rls_function', + fields: { + id: 'uuid', + database_id: 'uuid', + table_id: 'uuid', + name: 'text', + label: 'text', + description: 'text', + data: 'jsonb', + inline: 'boolean', + security: 'int' + } + }, + foreign_key_constraint: { + schema: 'metaschema_public', + table: 'foreign_key_constraint', + fields: { + id: 'uuid', + database_id: 'uuid', + table_id: 'uuid', + name: 'text', + description: 'text', + smart_tags: 'jsonb', + type: 'text', + field_ids: 'uuid[]', + ref_table_id: 'uuid', + ref_field_ids: 'uuid[]', + delete_action: 'text', + update_action: 'text' + } + }, + primary_key_constraint: { + schema: 'metaschema_public', + table: 'primary_key_constraint', + fields: { + id: 'uuid', + database_id: 'uuid', + table_id: 'uuid', + name: 'text', + type: 'text', + field_ids: 'uuid[]' + } + }, + unique_constraint: { + schema: 'metaschema_public', + table: 'unique_constraint', + fields: { + id: 'uuid', + database_id: 'uuid', + table_id: 'uuid', + name: 'text', + description: 'text', + smart_tags: 'jsonb', + type: 'text', + field_ids: 'uuid[]' + } + }, + check_constraint: { + schema: 'metaschema_public', + table: 'check_constraint', + fields: { + id: 'uuid', + database_id: 'uuid', + table_id: 'uuid', + name: 'text', + type: 'text', + field_ids: 'uuid[]', + expr: 'jsonb' + } + }, + full_text_search: { + schema: 'metaschema_public', + table: 'full_text_search', + fields: { + id: 'uuid', + database_id: 'uuid', + table_id: 'uuid', + field_id: 'uuid', + field_ids: 'uuid[]', + weights: 'text[]', + langs: 'text[]' + } + }, + schema_grant: { + schema: 'metaschema_public', + table: 'schema_grant', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + grantee_name: 'text' + } + }, + table_grant: { + schema: 'metaschema_public', + table: 'table_grant', + fields: { + id: 'uuid', + database_id: 'uuid', + table_id: 'uuid', + privilege: 'text', + field_ids: 'uuid[]' + } + }, + default_privilege: { + schema: 'metaschema_public', + table: 'default_privilege', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + object_type: 'text', + privilege: 'text', + grantee_name: 'text', + is_grant: 'boolean' + } + }, + database_extension: { + schema: 'metaschema_public', + table: 'database_extension', + fields: { + id: 'uuid', + database_id: 'uuid', + name: 'text', + schema_id: 'uuid' + } + }, + // ============================================================================= + // services_public tables + // ============================================================================= + domains: { + schema: 'services_public', + table: 'domains', + fields: { + id: 'uuid', + database_id: 'uuid', + site_id: 'uuid', + api_id: 'uuid', + domain: 'text', + subdomain: 'text' + } + }, + sites: { + schema: 'services_public', + table: 'sites', + fields: { + id: 'uuid', + database_id: 'uuid', + title: 'text', + description: 'text', + og_image: 'image', + favicon: 'upload', + apple_touch_icon: 'image', + logo: 'image' + } + }, + apis: { + schema: 'services_public', + table: 'apis', + fields: { + id: 'uuid', + database_id: 'uuid', + name: 'text', + is_public: 'boolean', + role_name: 'text', + anon_role: 'text' + } + }, + apps: { + schema: 'services_public', + table: 'apps', + fields: { + id: 'uuid', + database_id: 'uuid', + site_id: 'uuid', + name: 'text', + app_image: 'image', + app_store_link: 'url', + app_store_id: 'text', + app_id_prefix: 'text', + play_store_link: 'url' + } + }, + site_modules: { + schema: 'services_public', + table: 'site_modules', + fields: { + id: 'uuid', + database_id: 'uuid', + site_id: 'uuid', + name: 'text', + data: 'jsonb' + } + }, + site_themes: { + schema: 'services_public', + table: 'site_themes', + fields: { + id: 'uuid', + database_id: 'uuid', + site_id: 'uuid', + theme: 'jsonb' + } + }, + site_metadata: { + schema: 'services_public', + table: 'site_metadata', + fields: { + id: 'uuid', + database_id: 'uuid', + site_id: 'uuid', + title: 'text', + description: 'text', + og_image: 'image' + } + }, + api_modules: { + schema: 'services_public', + table: 'api_modules', + fields: { + id: 'uuid', + database_id: 'uuid', + api_id: 'uuid', + name: 'text', + data: 'jsonb' + } + }, + api_schemas: { + schema: 'services_public', + table: 'api_schemas', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + api_id: 'uuid' + } + }, + api_extensions: { + schema: 'services_public', + table: 'api_extensions', + fields: { + id: 'uuid', + database_id: 'uuid', + api_id: 'uuid', + name: 'text' + } + }, + + // ============================================================================= + // metaschema_modules_public tables + // ============================================================================= + rls_module: { + schema: 'metaschema_modules_public', + table: 'rls_module', + fields: { + id: 'uuid', + database_id: 'uuid', + api_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + session_credentials_table_id: 'uuid', + sessions_table_id: 'uuid', + users_table_id: 'uuid', + authenticate: 'text', + authenticate_strict: 'text', + current_role: 'text', + current_role_id: 'text' + } + }, + user_auth_module: { + schema: 'metaschema_modules_public', + table: 'user_auth_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + emails_table_id: 'uuid', + users_table_id: 'uuid', + secrets_table_id: 'uuid', + encrypted_table_id: 'uuid', + sessions_table_id: 'uuid', + session_credentials_table_id: 'uuid', + audits_table_id: 'uuid', + audits_table_name: 'text', + sign_in_function: 'text', + sign_up_function: 'text', + sign_out_function: 'text', + sign_in_one_time_token_function: 'text', + one_time_token_function: 'text', + extend_token_expires: 'text', + send_account_deletion_email_function: 'text', + delete_account_function: 'text', + set_password_function: 'text', + reset_password_function: 'text', + forgot_password_function: 'text', + send_verification_email_function: 'text', + verify_email_function: 'text', + verify_password_function: 'text', + check_password_function: 'text' + } + }, + memberships_module: { + schema: 'metaschema_modules_public', + table: 'memberships_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + memberships_table_id: 'uuid', + memberships_table_name: 'text', + members_table_id: 'uuid', + members_table_name: 'text', + membership_defaults_table_id: 'uuid', + membership_defaults_table_name: 'text', + grants_table_id: 'uuid', + grants_table_name: 'text', + actor_table_id: 'uuid', + limits_table_id: 'uuid', + default_limits_table_id: 'uuid', + permissions_table_id: 'uuid', + default_permissions_table_id: 'uuid', + sprt_table_id: 'uuid', + admin_grants_table_id: 'uuid', + admin_grants_table_name: 'text', + owner_grants_table_id: 'uuid', + owner_grants_table_name: 'text', + membership_type: 'int', + entity_table_id: 'uuid', + entity_table_owner_id: 'uuid', + prefix: 'text', + actor_mask_check: 'text', + actor_perm_check: 'text', + entity_ids_by_mask: 'text', + entity_ids_by_perm: 'text', + entity_ids_function: 'text' + } + }, + permissions_module: { + schema: 'metaschema_modules_public', + table: 'permissions_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + table_id: 'uuid', + table_name: 'text', + default_table_id: 'uuid', + default_table_name: 'text', + bitlen: 'int', + membership_type: 'int', + entity_table_id: 'uuid', + actor_table_id: 'uuid', + prefix: 'text', + get_padded_mask: 'text', + get_mask: 'text', + get_by_mask: 'text', + get_mask_by_name: 'text' + } + }, + limits_module: { + schema: 'metaschema_modules_public', + table: 'limits_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + table_id: 'uuid', + table_name: 'text', + default_table_id: 'uuid', + default_table_name: 'text', + limit_increment_function: 'text', + limit_decrement_function: 'text', + limit_increment_trigger: 'text', + limit_decrement_trigger: 'text', + limit_update_trigger: 'text', + limit_check_function: 'text', + prefix: 'text', + membership_type: 'int', + entity_table_id: 'uuid', + actor_table_id: 'uuid' + } + }, + levels_module: { + schema: 'metaschema_modules_public', + table: 'levels_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + steps_table_id: 'uuid', + steps_table_name: 'text', + achievements_table_id: 'uuid', + achievements_table_name: 'text', + levels_table_id: 'uuid', + levels_table_name: 'text', + level_requirements_table_id: 'uuid', + level_requirements_table_name: 'text', + completed_step: 'text', + incompleted_step: 'text', + tg_achievement: 'text', + tg_achievement_toggle: 'text', + tg_achievement_toggle_boolean: 'text', + tg_achievement_boolean: 'text', + upsert_achievement: 'text', + tg_update_achievements: 'text', + steps_required: 'text', + level_achieved: 'text', + prefix: 'text', + membership_type: 'int', + entity_table_id: 'uuid', + actor_table_id: 'uuid' + } + }, + users_module: { + schema: 'metaschema_modules_public', + table: 'users_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + table_id: 'uuid', + table_name: 'text', + type_table_id: 'uuid', + type_table_name: 'text' + } + }, + hierarchy_module: { + schema: 'metaschema_modules_public', + table: 'hierarchy_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + chart_edges_table_id: 'uuid', + chart_edges_table_name: 'text', + hierarchy_sprt_table_id: 'uuid', + hierarchy_sprt_table_name: 'text', + chart_edge_grants_table_id: 'uuid', + chart_edge_grants_table_name: 'text', + entity_table_id: 'uuid', + users_table_id: 'uuid', + prefix: 'text', + private_schema_name: 'text', + sprt_table_name: 'text', + rebuild_hierarchy_function: 'text', + get_subordinates_function: 'text', + get_managers_function: 'text', + is_manager_of_function: 'text' + } + }, + membership_types_module: { + schema: 'metaschema_modules_public', + table: 'membership_types_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + table_id: 'uuid', + table_name: 'text' + } + }, + invites_module: { + schema: 'metaschema_modules_public', + table: 'invites_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + emails_table_id: 'uuid', + users_table_id: 'uuid', + invites_table_id: 'uuid', + claimed_invites_table_id: 'uuid', + invites_table_name: 'text', + claimed_invites_table_name: 'text', + submit_invite_code_function: 'text', + prefix: 'text', + membership_type: 'int', + entity_table_id: 'uuid' + } + }, + emails_module: { + schema: 'metaschema_modules_public', + table: 'emails_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + table_id: 'uuid', + owner_table_id: 'uuid', + table_name: 'text' + } + }, + sessions_module: { + schema: 'metaschema_modules_public', + table: 'sessions_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + sessions_table_id: 'uuid', + session_credentials_table_id: 'uuid', + auth_settings_table_id: 'uuid', + users_table_id: 'uuid', + sessions_default_expiration: 'interval', + sessions_table: 'text', + session_credentials_table: 'text', + auth_settings_table: 'text' + } + }, + secrets_module: { + schema: 'metaschema_modules_public', + table: 'secrets_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + table_id: 'uuid', + table_name: 'text' + } + }, + profiles_module: { + schema: 'metaschema_modules_public', + table: 'profiles_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + table_id: 'uuid', + table_name: 'text', + profile_permissions_table_id: 'uuid', + profile_permissions_table_name: 'text', + profile_grants_table_id: 'uuid', + profile_grants_table_name: 'text', + profile_definition_grants_table_id: 'uuid', + profile_definition_grants_table_name: 'text', + bitlen: 'int', + membership_type: 'int', + entity_table_id: 'uuid', + actor_table_id: 'uuid', + permissions_table_id: 'uuid', + memberships_table_id: 'uuid', + prefix: 'text' + } + }, + encrypted_secrets_module: { + schema: 'metaschema_modules_public', + table: 'encrypted_secrets_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + table_id: 'uuid', + table_name: 'text' + } + }, + connected_accounts_module: { + schema: 'metaschema_modules_public', + table: 'connected_accounts_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + table_id: 'uuid', + owner_table_id: 'uuid', + table_name: 'text' + } + }, + phone_numbers_module: { + schema: 'metaschema_modules_public', + table: 'phone_numbers_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + table_id: 'uuid', + owner_table_id: 'uuid', + table_name: 'text' + } + }, + crypto_addresses_module: { + schema: 'metaschema_modules_public', + table: 'crypto_addresses_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + table_id: 'uuid', + owner_table_id: 'uuid', + table_name: 'text', + crypto_network: 'text' + } + }, + crypto_auth_module: { + schema: 'metaschema_modules_public', + table: 'crypto_auth_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + users_table_id: 'uuid', + sessions_table_id: 'uuid', + session_credentials_table_id: 'uuid', + secrets_table_id: 'uuid', + addresses_table_id: 'uuid', + user_field: 'text', + crypto_network: 'text', + sign_in_request_challenge: 'text', + sign_in_record_failure: 'text', + sign_up_with_key: 'text', + sign_in_with_challenge: 'text' + } + }, + field_module: { + schema: 'metaschema_modules_public', + table: 'field_module', + fields: { + id: 'uuid', + database_id: 'uuid', + private_schema_id: 'uuid', + table_id: 'uuid', + field_id: 'uuid', + node_type: 'text', + data: 'jsonb', + triggers: 'text[]', + functions: 'text[]' + } + }, + table_module: { + schema: 'metaschema_modules_public', + table: 'table_module', + fields: { + id: 'uuid', + database_id: 'uuid', + private_schema_id: 'uuid', + table_id: 'uuid', + node_type: 'text', + data: 'jsonb', + fields: 'uuid[]' + } + }, + table_template_module: { + schema: 'metaschema_modules_public', + table: 'table_template_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + private_schema_id: 'uuid', + table_id: 'uuid', + owner_table_id: 'uuid', + table_name: 'text', + node_type: 'text', + data: 'jsonb' + } + }, + secure_table_provision: { + schema: 'metaschema_modules_public', + table: 'secure_table_provision', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + table_id: 'uuid', + table_name: 'text', + node_type: 'text', + use_rls: 'boolean', + node_data: 'jsonb', + grant_roles: 'text[]', + grant_privileges: 'jsonb', + policy_type: 'text', + policy_privileges: 'text[]', + policy_role: 'text', + policy_permissive: 'boolean', + policy_data: 'jsonb', + out_fields: 'uuid[]' + } + }, + uuid_module: { + schema: 'metaschema_modules_public', + table: 'uuid_module', + fields: { + id: 'uuid', + database_id: 'uuid', + schema_id: 'uuid', + uuid_function: 'text', + uuid_seed: 'text' + } + }, + default_ids_module: { + schema: 'metaschema_modules_public', + table: 'default_ids_module', + fields: { + id: 'uuid', + database_id: 'uuid' + } + }, + denormalized_table_field: { + schema: 'metaschema_modules_public', + table: 'denormalized_table_field', + fields: { + id: 'uuid', + database_id: 'uuid', + table_id: 'uuid', + field_id: 'uuid', + set_ids: 'uuid[]', + ref_table_id: 'uuid', + ref_field_id: 'uuid', + ref_ids: 'uuid[]', + use_updates: 'boolean', + update_defaults: 'boolean', + func_name: 'text', + func_order: 'int' + } + } +}; + +export interface ExportGraphQLMetaParams { + /** GraphQL client configured for the meta/services API endpoint */ + client: GraphQLClient; + /** The database_id to filter by */ + database_id: string; +} + +export type ExportGraphQLMetaResult = Record; + +/** + * Fetch metadata via GraphQL and generate SQL INSERT statements. + * This is the GraphQL equivalent of exportMeta() in export-meta.ts. + */ +export const exportGraphQLMeta = async ({ + client, + database_id +}: ExportGraphQLMetaParams): Promise => { + const sql: Record = {}; + + const queryAndParse = async (key: string) => { + const tableConfig = config[key]; + if (!tableConfig) return; + + const pgFieldNames = Object.keys(tableConfig.fields); + const graphqlFieldsFragment = buildFieldsFragment(pgFieldNames, tableConfig.fields); + const graphqlQueryName = getGraphQLQueryName(tableConfig.table); + + // The 'database' table is fetched by id, not by database_id + const condition = key === 'database' + ? { id: database_id } + : { databaseId: database_id }; + + try { + const rows = await client.fetchAllNodes( + graphqlQueryName, + graphqlFieldsFragment, + condition + ); + + if (rows.length > 0) { + // Convert camelCase GraphQL keys back to snake_case for the Parser + // Also convert interval objects back to Postgres interval strings + const pgRows = rows.map(row => { + const pgRow = graphqlRowToPostgresRow(row); + // Convert any interval fields from {seconds, minutes, ...} objects to strings + for (const [fieldName, fieldType] of Object.entries(tableConfig.fields)) { + if (fieldType === 'interval' && pgRow[fieldName] && typeof pgRow[fieldName] === 'object') { + pgRow[fieldName] = intervalToPostgres(pgRow[fieldName] as Record); + } + } + return pgRow; + }); + + // Filter fields to only those that exist in the returned data + // This mirrors the dynamic field building in the SQL version + const returnedKeys = new Set(); + for (const row of pgRows) { + for (const k of Object.keys(row)) { + returnedKeys.add(k); + } + } + + const dynamicFields: Record = {}; + for (const [fieldName, fieldType] of Object.entries(tableConfig.fields)) { + if (returnedKeys.has(fieldName)) { + dynamicFields[fieldName] = fieldType; + } + } + + if (Object.keys(dynamicFields).length === 0) return; + + const parser = new Parser({ + schema: tableConfig.schema, + table: tableConfig.table, + conflictDoNothing: tableConfig.conflictDoNothing, + fields: dynamicFields + }); + + const parsed = await parser.parse(pgRows); + if (parsed) { + sql[key] = parsed; + } + } + } catch (err: unknown) { + // If the GraphQL query fails (e.g. table not exposed), skip silently + // similar to how the SQL version handles 42P01 (undefined_table) + const message = err instanceof Error ? err.message : String(err); + if ( + message.includes('Cannot query field') || + message.includes('is not defined by type') || + message.includes('Unknown field') || + message.includes('Field') && message.includes('not found') + ) { + // Field/table not available in the GraphQL schema — skip + return; + } + throw err; + } + }; + + // ============================================================================= + // metaschema_public tables + // ============================================================================= + await queryAndParse('database'); + await queryAndParse('database_extension'); + await queryAndParse('schema'); + await queryAndParse('table'); + await queryAndParse('field'); + await queryAndParse('policy'); + await queryAndParse('index'); + await queryAndParse('trigger'); + await queryAndParse('trigger_function'); + await queryAndParse('rls_function'); + await queryAndParse('foreign_key_constraint'); + await queryAndParse('primary_key_constraint'); + await queryAndParse('unique_constraint'); + await queryAndParse('check_constraint'); + await queryAndParse('full_text_search'); + await queryAndParse('schema_grant'); + await queryAndParse('table_grant'); + await queryAndParse('default_privilege'); + + // ============================================================================= + // services_public tables + // ============================================================================= + await queryAndParse('domains'); + await queryAndParse('sites'); + await queryAndParse('apis'); + await queryAndParse('apps'); + await queryAndParse('site_modules'); + await queryAndParse('site_themes'); + await queryAndParse('site_metadata'); + await queryAndParse('api_modules'); + await queryAndParse('api_extensions'); + await queryAndParse('api_schemas'); + + // ============================================================================= + // metaschema_modules_public tables + // ============================================================================= + await queryAndParse('rls_module'); + await queryAndParse('user_auth_module'); + await queryAndParse('memberships_module'); + await queryAndParse('permissions_module'); + await queryAndParse('limits_module'); + await queryAndParse('levels_module'); + await queryAndParse('users_module'); + await queryAndParse('hierarchy_module'); + await queryAndParse('membership_types_module'); + await queryAndParse('invites_module'); + await queryAndParse('emails_module'); + await queryAndParse('sessions_module'); + await queryAndParse('secrets_module'); + await queryAndParse('profiles_module'); + await queryAndParse('encrypted_secrets_module'); + await queryAndParse('connected_accounts_module'); + await queryAndParse('phone_numbers_module'); + await queryAndParse('crypto_addresses_module'); + await queryAndParse('crypto_auth_module'); + await queryAndParse('field_module'); + await queryAndParse('table_template_module'); + await queryAndParse('secure_table_provision'); + await queryAndParse('uuid_module'); + await queryAndParse('default_ids_module'); + await queryAndParse('denormalized_table_field'); + + return sql; +}; diff --git a/pgpm/core/src/export/export-graphql.ts b/pgpm/core/src/export/export-graphql.ts new file mode 100644 index 000000000..47958c1ca --- /dev/null +++ b/pgpm/core/src/export/export-graphql.ts @@ -0,0 +1,523 @@ +/** + * GraphQL-based export orchestrator. + * + * This is a standalone GraphQL export flow that mirrors export-migrations.ts + * but fetches all data via GraphQL queries instead of direct SQL. + * + * Per Dan's guidance: "I would NOT do branching in those existing files. + * I would make the GraphQL flow its entire own flow at first." + */ +import { toSnakeCase } from 'komoji'; +import { mkdirSync, rmSync } from 'fs'; +import { sync as glob } from 'glob'; +import path from 'path'; + +import { Inquirerer } from 'inquirerer'; + +import { PgpmPackage } from '../core/class/pgpm'; +import { PgpmRow, SqlWriteOptions, writePgpmFiles, writePgpmPlan } from '../files'; +import { getMissingInstallableModules } from '../modules/modules'; +import { parseAuthor } from '../utils/author'; +import { GraphQLClient } from './graphql-client'; +import { exportGraphQLMeta } from './export-graphql-meta'; +import { graphqlRowToPostgresRow } from './graphql-naming'; + +/** + * Required extensions for database schema exports. + */ +const DB_REQUIRED_EXTENSIONS = [ + 'plpgsql', + 'uuid-ossp', + 'citext', + 'pgcrypto', + 'btree_gist', + 'postgis', + 'hstore', + 'metaschema-schema', + 'pgpm-inflection', + 'pgpm-uuid', + 'pgpm-utils', + 'pgpm-database-jobs', + 'pgpm-jwt-claims', + 'pgpm-stamps', + 'pgpm-base32', + 'pgpm-totp', + 'pgpm-types' +] as const; + +/** + * Required extensions for service/meta exports. + */ +const SERVICE_REQUIRED_EXTENSIONS = [ + 'plpgsql', + 'metaschema-schema', + 'metaschema-modules', + 'services' +] as const; + + +interface MissingModulesResult { + missingModules: { controlName: string; npmName: string }[]; + shouldInstall: boolean; +} + +const detectMissingModules = async ( + project: PgpmPackage, + extensions: string[], + prompter?: Inquirerer, + argv?: Record +): Promise => { + const installed = project.getWorkspaceInstalledModules(); + const missingModules = getMissingInstallableModules(extensions, installed); + + if (missingModules.length === 0) { + return { missingModules: [], shouldInstall: false }; + } + + const missingNames = missingModules.map(m => m.npmName); + console.log(`\nMissing pgpm modules detected: ${missingNames.join(', ')}`); + + if (prompter) { + const { install } = await prompter.prompt(argv || {} as Record, [ + { + type: 'confirm', + name: 'install', + message: `Install missing modules (${missingNames.join(', ')})?`, + default: true, + useDefault: true + } + ]); + + return { missingModules, shouldInstall: install }; + } + + return { missingModules, shouldInstall: false }; +}; + +const installMissingModules = async ( + moduleDir: string, + missingModules: { controlName: string; npmName: string }[] +): Promise => { + if (missingModules.length === 0) return; + + const missingNames = missingModules.map(m => m.npmName); + console.log('Installing missing modules...'); + + const moduleProject = new PgpmPackage(moduleDir); + await moduleProject.installModules(...missingNames); + + console.log('Modules installed successfully.'); +}; + +interface Schema { + name: string; + schema_name: string; +} + +interface MakeReplacerOptions { + schemas: Schema[]; + name: string; +} + +interface ReplacerResult { + replacer: (str: string, n?: number) => string; + replace: [RegExp, string][]; +} + +const makeReplacer = ({ schemas, name }: MakeReplacerOptions): ReplacerResult => { + const replacements: [string, string] = ['constructive-extension-name', name]; + const schemaReplacers: [string, string][] = schemas.map((schema) => [ + schema.schema_name, + toSnakeCase(`${name}_${schema.name}`) + ]); + + const replace: [RegExp, string][] = [...schemaReplacers, replacements].map( + ([from, to]) => [new RegExp(from, 'g'), to] + ); + + const replacer = (str: string, n = 0): string => { + if (!str) return ''; + if (replace[n] && replace[n].length === 2) { + return replacer(str.replace(replace[n][0], replace[n][1]), n + 1); + } + return str; + }; + + return { replacer, replace }; +}; + +interface PreparePackageOptions { + project: PgpmPackage; + author: string; + outdir: string; + name: string; + description: string; + extensions: string[]; + prompter?: Inquirerer; + repoName?: string; + username?: string; +} + +const preparePackage = async ({ + project, + author, + outdir, + name, + description, + extensions, + prompter, + repoName, + username +}: PreparePackageOptions): Promise => { + const curDir = process.cwd(); + const pgpmDir = path.resolve(path.join(outdir, name)); + mkdirSync(pgpmDir, { recursive: true }); + process.chdir(pgpmDir); + + const plan = glob(path.join(pgpmDir, 'pgpm.plan')); + if (!plan.length) { + const { fullName, email } = parseAuthor(author); + + // If username is provided, run non-interactively with all answers pre-filled. + // Otherwise, let the prompter ask for it. + const knownUsername = username || undefined; + + await project.initModule({ + name, + description, + author, + extensions, + outputDir: outdir, + noTty: !prompter || !!knownUsername, + prompter, + answers: { + moduleName: name, + moduleDesc: description, + access: 'restricted', + license: 'CLOSED', + fullName, + ...(email && { email }), + repoName: repoName || name, + ...(knownUsername && { username: knownUsername }) + } + }); + } else { + if (prompter) { + const { overwrite } = await prompter.prompt({} as Record, [ + { + type: 'confirm', + name: 'overwrite', + message: `Module "${name}" already exists at ${pgpmDir}. Overwrite deploy/revert/verify directories?`, + default: true, + useDefault: true + } + ]); + if (!overwrite) { + process.chdir(curDir); + throw new Error(`Export cancelled: Module "${name}" already exists.`); + } + } + rmSync(path.resolve(pgpmDir, 'deploy'), { recursive: true, force: true }); + rmSync(path.resolve(pgpmDir, 'revert'), { recursive: true, force: true }); + rmSync(path.resolve(pgpmDir, 'verify'), { recursive: true, force: true }); + } + + process.chdir(curDir); + return pgpmDir; +}; + +// ============================================================================= +// Public API +// ============================================================================= + +export interface ExportGraphQLOptions { + project: PgpmPackage; + /** GraphQL endpoint for metaschema/services data (e.g. http://private.localhost:3002/graphql) */ + metaEndpoint: string; + /** GraphQL endpoint for db_migrate data (e.g. http://db_migrate.localhost:3000/graphql) */ + migrateEndpoint?: string; + /** Bearer token for authentication */ + token?: string; + /** Database ID to export */ + databaseId: string; + /** Database display name */ + databaseName: string; + /** Schema names selected for export */ + schema_names: string[]; + /** Schema rows (with name and schema_name) for the replacer */ + schemas: Schema[]; + /** Author string */ + author: string; + /** Output directory for packages */ + outdir: string; + /** Extension name for the DB module */ + extensionName: string; + /** Description for the DB extension */ + extensionDesc?: string; + /** Extension name for the service/meta module */ + metaExtensionName: string; + /** Description for the service/meta extension */ + metaExtensionDesc?: string; + prompter?: Inquirerer; + argv?: Record; + repoName?: string; + username?: string; + serviceOutdir?: string; + skipSchemaRenaming?: boolean; +} + +export const exportGraphQL = async ({ + project, + metaEndpoint, + migrateEndpoint, + token, + databaseId, + databaseName, + schema_names, + schemas, + author, + outdir, + extensionName, + extensionDesc, + metaExtensionName, + metaExtensionDesc, + prompter, + argv, + repoName, + username, + serviceOutdir, + skipSchemaRenaming = false +}: ExportGraphQLOptions): Promise => { + outdir = outdir + '/'; + const svcOutdir = (serviceOutdir || outdir.slice(0, -1)) + '/'; + + const name = extensionName; + + const schemasForReplacement = skipSchemaRenaming + ? [] + : schemas.filter((schema) => schema_names.includes(schema.schema_name)); + + const { replacer } = makeReplacer({ + schemas: schemasForReplacement, + name + }); + + // ========================================================================= + // 1. Fetch sql_actions via GraphQL (db_migrate endpoint) + // ========================================================================= + let sqlActionRows: Record[] = []; + + if (migrateEndpoint) { + console.log(`Fetching sql_actions from ${migrateEndpoint}...`); + const migrateClient = new GraphQLClient({ endpoint: migrateEndpoint, token }); + + try { + const rawRows = await migrateClient.fetchAllNodes( + 'sqlActions', + 'id\ndatabaseId\nname\ndeploy\nrevert\nverify\ncontent\ndeps\naction\nactionId\nactorId\npayload', + { databaseId } + ); + + sqlActionRows = rawRows.map(graphqlRowToPostgresRow); + console.log(` Found ${sqlActionRows.length} sql_actions`); + } catch (err) { + console.warn(` Warning: Could not fetch sql_actions: ${err instanceof Error ? err.message : err}`); + } + } else { + console.log('No migrate endpoint provided, skipping sql_actions export.'); + } + + const opts: SqlWriteOptions = { + name, + replacer, + outdir, + author + }; + + const dbExtensionDesc = extensionDesc || `${name} database schema for ${databaseName}`; + + if (sqlActionRows.length > 0) { + const dbMissingResult = await detectMissingModules(project, [...DB_REQUIRED_EXTENSIONS], prompter, argv); + + const dbModuleDir = await preparePackage({ + project, + author, + outdir, + name, + description: dbExtensionDesc, + extensions: [...DB_REQUIRED_EXTENSIONS], + prompter, + repoName, + username + }); + + if (dbMissingResult.shouldInstall) { + await installMissingModules(dbModuleDir, dbMissingResult.missingModules); + } + + writePgpmPlan(sqlActionRows as unknown as PgpmRow[], opts); + writePgpmFiles(sqlActionRows as unknown as PgpmRow[], opts); + } else { + console.log('No sql_actions found. Skipping database module export.'); + } + + // ========================================================================= + // 2. Fetch meta/services data via GraphQL + // ========================================================================= + console.log(`Fetching metadata from ${metaEndpoint}...`); + const metaClient = new GraphQLClient({ endpoint: metaEndpoint, token }); + + const metaResult = await exportGraphQLMeta({ + client: metaClient, + database_id: databaseId + }); + + const metaTableCount = Object.keys(metaResult).length; + console.log(` Fetched ${metaTableCount} meta tables with data`); + + if (metaTableCount > 0) { + const metaDesc = metaExtensionDesc || `${metaExtensionName} service utilities for managing domains, APIs, and services`; + + const svcMissingResult = await detectMissingModules(project, [...SERVICE_REQUIRED_EXTENSIONS], prompter, argv); + + const svcModuleDir = await preparePackage({ + project, + author, + outdir: svcOutdir, + name: metaExtensionName, + description: metaDesc, + extensions: [...SERVICE_REQUIRED_EXTENSIONS], + prompter, + repoName, + username + }); + + if (svcMissingResult.shouldInstall) { + await installMissingModules(svcModuleDir, svcMissingResult.missingModules); + } + + const metaSchemasForReplacement = skipSchemaRenaming + ? [] + : schemas.filter((schema) => schema_names.includes(schema.schema_name)); + + const metaReplacer = makeReplacer({ + schemas: metaSchemasForReplacement, + name: metaExtensionName + }); + + const metaPackage: PgpmRow[] = []; + + const commonHeader = `SET session_replication_role TO replica; +-- using replica in case we are deploying triggers to metaschema_public + +-- unaccent, postgis affected and require grants +GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public to public; + +DO $LQLMIGRATION$ + DECLARE + BEGIN + + EXECUTE format('GRANT CONNECT ON DATABASE %I TO %I', current_database(), 'app_user'); + EXECUTE format('GRANT CONNECT ON DATABASE %I TO %I', current_database(), 'app_admin'); + + END; +$LQLMIGRATION$;`; + + const commonFooter = ` +SET session_replication_role TO DEFAULT;`; + + const tableOrder = [ + 'database', + 'schema', + 'table', + 'field', + 'policy', + 'index', + 'trigger', + 'trigger_function', + 'rls_function', + 'foreign_key_constraint', + 'primary_key_constraint', + 'unique_constraint', + 'check_constraint', + 'full_text_search', + 'schema_grant', + 'table_grant', + 'default_privilege', + 'domains', + 'sites', + 'apis', + 'apps', + 'site_modules', + 'site_themes', + 'site_metadata', + 'api_modules', + 'api_schemas', + 'rls_module', + 'user_auth_module', + 'memberships_module', + 'permissions_module', + 'limits_module', + 'levels_module', + 'users_module', + 'hierarchy_module', + 'membership_types_module', + 'invites_module', + 'emails_module', + 'sessions_module', + 'secrets_module', + 'profiles_module', + 'encrypted_secrets_module', + 'connected_accounts_module', + 'phone_numbers_module', + 'crypto_addresses_module', + 'crypto_auth_module', + 'field_module', + 'table_module', + 'secure_table_provision', + 'user_profiles_module', + 'user_settings_module', + 'organization_settings_module', + 'uuid_module', + 'default_ids_module', + 'denormalized_table_field' + ]; + + const tablesWithContent: string[] = []; + + for (const tableName of tableOrder) { + const tableSql = metaResult[tableName]; + if (tableSql) { + const replacedSql = metaReplacer.replacer(tableSql); + + const deps = tableName === 'database' + ? [] + : tablesWithContent.length > 0 + ? [`migrate/${tablesWithContent[tablesWithContent.length - 1]}`] + : []; + + metaPackage.push({ + deps, + deploy: `migrate/${tableName}`, + content: `${commonHeader} + +${replacedSql} + +${commonFooter} +` + }); + + tablesWithContent.push(tableName); + } + } + + opts.replacer = metaReplacer.replacer; + opts.name = metaExtensionName; + opts.outdir = svcOutdir; + + writePgpmPlan(metaPackage, opts); + writePgpmFiles(metaPackage, opts); + } + + console.log('GraphQL export complete.'); +}; diff --git a/pgpm/core/src/export/export-migrations.ts b/pgpm/core/src/export/export-migrations.ts index ee9505584..5694c88c0 100644 --- a/pgpm/core/src/export/export-migrations.ts +++ b/pgpm/core/src/export/export-migrations.ts @@ -1,6 +1,7 @@ import { PgpmOptions } from '@pgpmjs/types'; import { mkdirSync, rmSync } from 'fs'; import { sync as glob } from 'glob'; +import { Inquirerer } from 'inquirerer'; import { toSnakeCase } from 'komoji'; import path from 'path'; import { getPgPool } from 'pg-cache'; @@ -50,13 +51,6 @@ const SERVICE_REQUIRED_EXTENSIONS = [ 'services' ] as const; -/** - * Prompter interface for interactive prompts. - * Compatible with Inquirerer from the CLI. - */ -interface Prompter { - prompt: (argv: any, questions: any[]) => Promise>; -} /** * Result of checking for missing modules at workspace level. @@ -81,7 +75,8 @@ interface MissingModulesResult { const detectMissingModules = async ( project: PgpmPackage, extensions: string[], - prompter?: Prompter + prompter?: Inquirerer, + argv?: Record ): Promise => { // Use workspace-level check - doesn't require being inside a module const installed = project.getWorkspaceInstalledModules(); @@ -95,7 +90,7 @@ const detectMissingModules = async ( console.log(`\nMissing pgpm modules detected: ${missingNames.join(', ')}`); if (prompter) { - const { install } = await prompter.prompt({}, [ + const { install } = await prompter.prompt(argv || {}, [ { type: 'confirm', name: 'install', @@ -148,7 +143,8 @@ interface ExportMigrationsToDiskOptions { extensionDesc?: string; metaExtensionName: string; metaExtensionDesc?: string; - prompter?: Prompter; + prompter?: Inquirerer; + argv?: Record; /** Repository name for module scaffolding. Defaults to module name if not provided. */ repoName?: string; /** GitHub username/org for module scaffolding. Required for non-interactive use. */ @@ -178,7 +174,8 @@ interface ExportOptions { extensionDesc?: string; metaExtensionName: string; metaExtensionDesc?: string; - prompter?: Prompter; + prompter?: Inquirerer; + argv?: Record; /** Repository name for module scaffolding. Defaults to module name if not provided. */ repoName?: string; /** GitHub username/org for module scaffolding. Required for non-interactive use. */ @@ -207,6 +204,7 @@ const exportMigrationsToDisk = async ({ metaExtensionName, metaExtensionDesc, prompter, + argv, repoName, username, serviceOutdir, @@ -275,7 +273,7 @@ const exportMigrationsToDisk = async ({ if (results?.rows?.length > 0) { // Detect missing modules at workspace level and prompt user - const dbMissingResult = await detectMissingModules(project, [...DB_REQUIRED_EXTENSIONS], prompter); + const dbMissingResult = await detectMissingModules(project, [...DB_REQUIRED_EXTENSIONS], prompter, argv); // Create/prepare the module directory const dbModuleDir = await preparePackage({ @@ -308,7 +306,7 @@ const exportMigrationsToDisk = async ({ const metaDesc = metaExtensionDesc || `${metaExtensionName} service utilities for managing domains, APIs, and services`; // Detect missing modules at workspace level and prompt user - const svcMissingResult = await detectMissingModules(project, [...SERVICE_REQUIRED_EXTENSIONS], prompter); + const svcMissingResult = await detectMissingModules(project, [...SERVICE_REQUIRED_EXTENSIONS], prompter, argv); // Create/prepare the module directory (use serviceOutdir if provided) const svcModuleDir = await preparePackage({ @@ -475,6 +473,7 @@ export const exportMigrations = async ({ metaExtensionName, metaExtensionDesc, prompter, + argv, repoName, username, serviceOutdir, @@ -496,6 +495,7 @@ export const exportMigrations = async ({ author, outdir, prompter, + argv, repoName, username, serviceOutdir, @@ -512,7 +512,7 @@ interface PreparePackageOptions { name: string; description: string; extensions: string[]; - prompter?: Prompter; + prompter?: Inquirerer; /** Repository name for module scaffolding. Defaults to module name if not provided. */ repoName?: string; /** GitHub username/org for module scaffolding. Required for non-interactive use. */ @@ -560,6 +560,9 @@ const preparePackage = async ({ if (!plan.length) { const { fullName, email } = parseAuthor(author); + // Always run non-interactively — all answers are pre-filled + const effectiveUsername = username || fullName || 'export'; + await project.initModule({ name, description, @@ -567,6 +570,8 @@ const preparePackage = async ({ extensions, // Use outputDir to create module directly in the specified location outputDir: outdir, + noTty: true, + prompter, answers: { moduleName: name, moduleDesc: description, @@ -576,17 +581,18 @@ const preparePackage = async ({ ...(email && { email }), // Use provided values or sensible defaults repoName: repoName || name, - ...(username && { username }) + username: effectiveUsername } }); } else { if (prompter) { - const { overwrite } = await prompter.prompt({}, [ + const { overwrite } = await prompter.prompt({} as Record, [ { type: 'confirm', name: 'overwrite', message: `Module "${name}" already exists at ${pgpmDir}. Overwrite deploy/revert/verify directories?`, - default: false + default: true, + useDefault: true } ]); if (!overwrite) { diff --git a/pgpm/core/src/export/graphql-client.ts b/pgpm/core/src/export/graphql-client.ts new file mode 100644 index 000000000..74eba747d --- /dev/null +++ b/pgpm/core/src/export/graphql-client.ts @@ -0,0 +1,180 @@ +/** + * Simple GraphQL HTTP client with pagination and authentication support. + * Used by the GraphQL export flow to fetch data from the Constructive GraphQL API. + */ + +interface GraphQLClientOptions { + endpoint: string; + token?: string; + headers?: Record; +} + +interface GraphQLResponse { + data?: T; + errors?: Array<{ message: string; locations?: Array<{ line: number; column: number }> }>; +} + +interface PageInfo { + hasNextPage: boolean; + endCursor: string | null; +} + +interface ConnectionResult> { + nodes: T[]; + pageInfo: PageInfo; + totalCount?: number; +} + +export class GraphQLClient { + private endpoint: string; + private defaultHeaders: Record; + + constructor({ endpoint, token, headers }: GraphQLClientOptions) { + this.endpoint = endpoint; + this.defaultHeaders = { + 'Content-Type': 'application/json', + ...(token ? { Authorization: `Bearer ${token}` } : {}), + ...headers + }; + } + + /** + * Execute a single GraphQL query with retry for transient network errors. + */ + async query( + queryString: string, + variables?: Record, + retries = 3 + ): Promise { + const body: Record = { query: queryString }; + if (variables) { + body.variables = variables; + } + + let lastError: Error | undefined; + for (let attempt = 0; attempt < retries; attempt++) { + try { + const response = await fetch(this.endpoint, { + method: 'POST', + headers: this.defaultHeaders, + body: JSON.stringify(body) + }); + + // Try to parse JSON even on non-200 responses (GraphQL servers often + // return 400 with a JSON body containing error details) + let json: GraphQLResponse; + try { + json = (await response.json()) as GraphQLResponse; + } catch { + if (!response.ok) { + throw new Error(`GraphQL request failed: ${response.status} ${response.statusText}`); + } + throw new Error('GraphQL response is not valid JSON'); + } + + if (json.errors?.length) { + const messages = json.errors.map(e => e.message).join('; '); + throw new Error(`GraphQL errors: ${messages}`); + } + + if (!response.ok) { + throw new Error(`GraphQL request failed: ${response.status} ${response.statusText}`); + } + + if (!json.data) { + throw new Error('GraphQL response missing data'); + } + + return json.data; + } catch (err) { + lastError = err instanceof Error ? err : new Error(String(err)); + const cause = (lastError as any).cause; + const isTransient = cause?.code === 'ECONNRESET' || + cause?.code === 'ECONNREFUSED' || + cause?.code === 'UND_ERR_SOCKET' || + lastError.message.includes('fetch failed'); + + if (isTransient && attempt < retries - 1) { + const delay = Math.min(1000 * Math.pow(2, attempt), 5000); + console.warn(` Retry ${attempt + 1}/${retries - 1}: ${cause?.code || lastError.message} — waiting ${delay}ms...`); + await new Promise(resolve => setTimeout(resolve, delay)); + continue; + } + throw lastError; + } + } + + throw lastError; + } + + /** + * Fetch all rows from a paginated GraphQL connection, handling cursor-based pagination. + * Returns all nodes across all pages. + */ + async fetchAllNodes>( + queryFieldName: string, + fieldsFragment: string, + condition?: Record, + pageSize = 100 + ): Promise { + const allNodes: T[] = []; + let hasNextPage = true; + let afterCursor: string | null = null; + + while (hasNextPage) { + const args = this.buildConnectionArgs(condition, pageSize, afterCursor); + const queryString = `{ + ${queryFieldName}${args} { + nodes { + ${fieldsFragment} + } + pageInfo { + hasNextPage + endCursor + } + } +}`; + + const data = await this.query>>(queryString); + const connection = data[queryFieldName]; + + if (!connection?.nodes) { + break; + } + + allNodes.push(...connection.nodes); + hasNextPage = connection.pageInfo?.hasNextPage ?? false; + afterCursor = connection.pageInfo?.endCursor ?? null; + } + + return allNodes; + } + + private buildConnectionArgs( + condition?: Record, + first?: number, + after?: string | null + ): string { + const parts: string[] = []; + + if (first) { + parts.push(`first: ${first}`); + } + if (after) { + parts.push(`after: "${after}"`); + } + if (condition && Object.keys(condition).length > 0) { + const condParts = Object.entries(condition) + .map(([k, v]) => { + if (typeof v === 'string') return `${k}: "${v}"`; + if (typeof v === 'boolean') return `${k}: ${v}`; + if (typeof v === 'number') return `${k}: ${v}`; + return `${k}: "${v}"`; + }) + .join(', '); + parts.push(`condition: { ${condParts} }`); + } + + return parts.length > 0 ? `(${parts.join(', ')})` : ''; + } +} diff --git a/pgpm/core/src/export/graphql-naming.ts b/pgpm/core/src/export/graphql-naming.ts new file mode 100644 index 000000000..258e0f320 --- /dev/null +++ b/pgpm/core/src/export/graphql-naming.ts @@ -0,0 +1,78 @@ +/** + * Helpers for mapping between PostgreSQL names and PostGraphile GraphQL names. + * + * PostGraphile's inflection (with InflektPreset) transforms: + * - Table names: snake_case -> camelCase (pluralized for collections) + * - Column names: snake_case -> camelCase + * - Schema prefix is stripped (tables are exposed without schema prefix) + * + * Examples: + * metaschema_public.database -> databases (query), Database (type) + * metaschema_public.foreign_key_constraint -> foreignKeyConstraints + * services_public.api_schemas -> apiSchemas + * db_migrate.sql_actions -> sqlActions + * column database_id -> databaseId + */ +import { camelize, distinctPluralize, singularizeLast, underscore } from 'inflekt'; + +/** + * Get the GraphQL query field name for a given Postgres table name. + * Mirrors the PostGraphile InflektPlugin's allRowsConnection inflector: + * camelize(distinctPluralize(singularizeLast(camelize(pgTableName))), true) + */ +export const getGraphQLQueryName = (pgTableName: string): string => { + const pascal = camelize(pgTableName); + const singularized = singularizeLast(pascal); + return camelize(distinctPluralize(singularized), true); +}; + +/** + * Convert a row of GraphQL camelCase keys back to Postgres snake_case keys. + * This is needed because the csv-to-pg Parser expects snake_case column names. + * Only transforms top-level keys — nested objects (e.g. JSONB values) are left intact. + */ +export const graphqlRowToPostgresRow = ( + row: Record +): Record => { + const result: Record = {}; + for (const [key, value] of Object.entries(row)) { + result[underscore(key)] = value; + } + return result; +}; + +/** + * Convert a PostgreSQL interval object (from GraphQL Interval type) back to a Postgres interval string. + * e.g. { years: 0, months: 0, days: 0, hours: 1, minutes: 30, seconds: 0 } -> '1 hour 30 minutes' + */ +export const intervalToPostgres = (interval: Record | null): string | null => { + if (!interval) return null; + const parts: string[] = []; + if (interval.years) parts.push(`${interval.years} year${interval.years !== 1 ? 's' : ''}`); + if (interval.months) parts.push(`${interval.months} mon${interval.months !== 1 ? 's' : ''}`); + if (interval.days) parts.push(`${interval.days} day${interval.days !== 1 ? 's' : ''}`); + if (interval.hours) parts.push(`${interval.hours}:${String(interval.minutes ?? 0).padStart(2, '0')}:${String(interval.seconds ?? 0).padStart(2, '0')}`); + else if (interval.minutes) parts.push(`00:${String(interval.minutes).padStart(2, '0')}:${String(interval.seconds ?? 0).padStart(2, '0')}`); + else if (interval.seconds) parts.push(`00:00:${String(interval.seconds).padStart(2, '0')}`); + return parts.length > 0 ? parts.join(' ') : '00:00:00'; +}; + +/** + * Convert an array of Postgres field names (with optional type hints) to a GraphQL fields fragment. + * Handles composite types like 'interval' by expanding them into subfield selections. + * e.g. [['id', 'uuid'], ['sessions_default_expiration', 'interval']] -> + * 'id\nsessionsDefaultExpiration { seconds minutes hours days months years }' + */ +export const buildFieldsFragment = ( + pgFieldNames: string[], + fieldTypes?: Record +): string => { + return pgFieldNames.map(name => { + const camel = camelize(name, true); + const fieldType = fieldTypes?.[name]; + if (fieldType === 'interval') { + return `${camel} { seconds minutes hours days months years }`; + } + return camel; + }).join('\n '); +}; diff --git a/pgpm/core/src/index.ts b/pgpm/core/src/index.ts index fb507c156..582c2d172 100644 --- a/pgpm/core/src/index.ts +++ b/pgpm/core/src/index.ts @@ -1,6 +1,10 @@ export * from './core/class/pgpm'; export * from './export/export-meta'; export * from './export/export-migrations'; +export * from './export/export-graphql'; +export * from './export/export-graphql-meta'; +export { GraphQLClient } from './export/graphql-client'; +export { getGraphQLQueryName, graphqlRowToPostgresRow, buildFieldsFragment, intervalToPostgres } from './export/graphql-naming'; export * from './slice'; export * from './extensions/extensions'; export * from './modules/modules'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efe3dee61..e37f2085a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -174,7 +174,7 @@ importers: version: 5.2.1 grafserv: specifier: 1.0.0-rc.6 - version: 1.0.0-rc.6(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) + version: 1.0.0-rc.6(@types/node@22.19.11)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) lru-cache: specifier: ^11.2.6 version: 11.2.6 @@ -183,7 +183,7 @@ importers: version: link:../../postgres/pg-cache/dist postgraphile: specifier: 5.0.0-rc.7 - version: 5.0.0-rc.7(56415cfaef0e792e7fc3250b8cf6023f) + version: 5.0.0-rc.7(853bfb5f6928535d2602be94c7020fe8) devDependencies: '@types/express': specifier: ^5.0.6 @@ -196,7 +196,7 @@ importers: version: 3.1.14 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + version: 10.9.2(@types/node@22.19.11)(typescript@5.9.3) publishDirectory: dist graphile/graphile-misc-plugins: @@ -447,7 +447,7 @@ importers: version: 8.19.0 postgraphile: specifier: 5.0.0-rc.7 - version: 5.0.0-rc.7(56415cfaef0e792e7fc3250b8cf6023f) + version: 5.0.0-rc.7(853bfb5f6928535d2602be94c7020fe8) devDependencies: '@types/pg': specifier: ^8.18.0 @@ -489,7 +489,7 @@ importers: version: 0.1.12 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + version: 10.9.2(@types/node@22.19.11)(typescript@5.9.3) publishDirectory: dist graphile/graphile-search-plugin: @@ -573,7 +573,7 @@ importers: version: 1.0.0-rc.7(graphql@16.13.0) grafserv: specifier: 1.0.0-rc.6 - version: 1.0.0-rc.6(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) + version: 1.0.0-rc.6(@types/node@22.19.11)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) graphile-build: specifier: 5.0.0-rc.4 version: 5.0.0-rc.4(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0) @@ -624,7 +624,7 @@ importers: version: 5.0.0-rc.4 postgraphile: specifier: 5.0.0-rc.7 - version: 5.0.0-rc.7(56415cfaef0e792e7fc3250b8cf6023f) + version: 5.0.0-rc.7(853bfb5f6928535d2602be94c7020fe8) postgraphile-plugin-connection-filter: specifier: 3.0.0-rc.1 version: 3.0.0-rc.1 @@ -655,7 +655,7 @@ importers: version: 3.1.14 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + version: 10.9.2(@types/node@22.19.11)(typescript@5.9.3) publishDirectory: dist graphile/graphile-sql-expression-validator: @@ -727,7 +727,7 @@ importers: version: link:../../postgres/pgsql-test/dist postgraphile: specifier: 5.0.0-rc.7 - version: 5.0.0-rc.7(56415cfaef0e792e7fc3250b8cf6023f) + version: 5.0.0-rc.7(853bfb5f6928535d2602be94c7020fe8) devDependencies: '@types/pg': specifier: ^8.18.0 @@ -906,7 +906,7 @@ importers: version: 5.2.1 grafserv: specifier: 1.0.0-rc.6 - version: 1.0.0-rc.6(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) + version: 1.0.0-rc.6(@types/node@22.19.11)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) graphile-cache: specifier: workspace:^ version: link:../../graphile/graphile-cache/dist @@ -927,7 +927,7 @@ importers: version: link:../../postgres/pg-env/dist postgraphile: specifier: 5.0.0-rc.7 - version: 5.0.0-rc.7(56415cfaef0e792e7fc3250b8cf6023f) + version: 5.0.0-rc.7(853bfb5f6928535d2602be94c7020fe8) devDependencies: '@types/express': specifier: ^5.0.6 @@ -940,7 +940,7 @@ importers: version: 3.1.14 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + version: 10.9.2(@types/node@22.19.11)(typescript@5.9.3) publishDirectory: dist graphql/gql-ast: @@ -1035,7 +1035,7 @@ importers: version: 11.2.6 postgraphile: specifier: 5.0.0-rc.7 - version: 5.0.0-rc.7(56415cfaef0e792e7fc3250b8cf6023f) + version: 5.0.0-rc.7(853bfb5f6928535d2602be94c7020fe8) devDependencies: makage: specifier: ^0.1.10 @@ -1132,7 +1132,7 @@ importers: version: 1.0.0-rc.7(graphql@16.13.0) grafserv: specifier: 1.0.0-rc.6 - version: 1.0.0-rc.6(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) + version: 1.0.0-rc.6(@types/node@22.19.11)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) graphile-build: specifier: 5.0.0-rc.4 version: 5.0.0-rc.4(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0) @@ -1162,7 +1162,7 @@ importers: version: 11.2.6 multer: specifier: ^2.1.0 - version: 2.1.0 + version: 2.1.1 pg: specifier: ^8.19.0 version: 8.19.0 @@ -1180,7 +1180,7 @@ importers: version: 5.0.0-rc.4 postgraphile: specifier: 5.0.0-rc.7 - version: 5.0.0-rc.7(56415cfaef0e792e7fc3250b8cf6023f) + version: 5.0.0-rc.7(853bfb5f6928535d2602be94c7020fe8) postgraphile-plugin-connection-filter: specifier: 3.0.0-rc.1 version: 3.0.0-rc.1 @@ -1190,7 +1190,7 @@ importers: devDependencies: '@aws-sdk/client-s3': specifier: ^3.1001.0 - version: 3.1001.0 + version: 3.1002.0 '@types/cors': specifier: ^2.8.17 version: 2.8.19 @@ -1220,7 +1220,7 @@ importers: version: 3.1.14 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + version: 10.9.2(@types/node@22.19.11)(typescript@5.9.3) publishDirectory: dist graphql/server-test: @@ -1316,7 +1316,7 @@ importers: version: link:../../postgres/pgsql-test/dist postgraphile: specifier: 5.0.0-rc.7 - version: 5.0.0-rc.7(56415cfaef0e792e7fc3250b8cf6023f) + version: 5.0.0-rc.7(853bfb5f6928535d2602be94c7020fe8) devDependencies: '@types/pg': specifier: ^8.18.0 @@ -1364,7 +1364,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^4.5.2 - version: 4.7.0(vite@6.4.1(@types/node@25.3.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.7.0(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) react-test-renderer: specifier: ^19.2.4 version: 19.2.4(react@19.2.4) @@ -1379,7 +1379,7 @@ importers: version: 5.9.3 vite: specifier: ^6.3.5 - version: 6.4.1(@types/node@25.3.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + version: 6.4.1(@types/node@22.19.11)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) graphql/types: dependencies: @@ -1612,7 +1612,7 @@ importers: version: 7.2.2 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + version: 10.9.2(@types/node@22.19.11)(typescript@5.9.3) publishDirectory: dist jobs/knative-job-worker: @@ -1903,7 +1903,7 @@ importers: version: 0.1.12 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + version: 10.9.2(@types/node@22.19.11)(typescript@5.9.3) publishDirectory: dist packages/smtppostmaster: @@ -1932,7 +1932,7 @@ importers: version: 3.18.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + version: 10.9.2(@types/node@22.19.11)(typescript@5.9.3) publishDirectory: dist packages/url-domains: @@ -2058,6 +2058,9 @@ importers: glob: specifier: ^13.0.0 version: 13.0.0 + inflekt: + specifier: ^0.3.3 + version: 0.3.3 komoji: specifier: ^0.8.1 version: 0.8.1 @@ -2143,7 +2146,7 @@ importers: dependencies: pg: specifier: ^8.16.0 - version: 8.19.0 + version: 8.17.1 pgsql-test: specifier: workspace:^ version: link:../pgsql-test/dist @@ -2153,7 +2156,7 @@ importers: version: 8.18.0 drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@types/pg@8.18.0)(pg@8.19.0) + version: 0.45.1(@types/pg@8.18.0)(pg@8.17.1) makage: specifier: ^0.1.12 version: 0.1.12 @@ -2624,10 +2627,10 @@ importers: dependencies: '@aws-sdk/client-s3': specifier: ^3.1001.0 - version: 3.1001.0 + version: 3.1002.0 '@aws-sdk/lib-storage': specifier: ^3.1001.0 - version: 3.1001.0(@aws-sdk/client-s3@3.1001.0) + version: 3.1002.0(@aws-sdk/client-s3@3.1002.0) '@constructive-io/content-type-stream': specifier: workspace:^ version: link:../content-type-stream/dist @@ -2653,10 +2656,10 @@ importers: dependencies: '@aws-sdk/client-s3': specifier: ^3.1001.0 - version: 3.1001.0 + version: 3.1002.0 '@aws-sdk/lib-storage': specifier: ^3.1001.0 - version: 3.1001.0(@aws-sdk/client-s3@3.1001.0) + version: 3.1002.0(@aws-sdk/client-s3@3.1002.0) devDependencies: '@types/node': specifier: ^22.19.11 @@ -2741,55 +2744,55 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.1001.0': - resolution: {integrity: sha512-uKgFjQuBjMcd0iigLQwnqIp9gOy/5TGBxa42rcb6l5byDt1mrwOe6fyWTEUEJaNHG2LKYSPUibteGvM1zfm0Rw==} + '@aws-sdk/client-s3@3.1002.0': + resolution: {integrity: sha512-tc+vZgvjcm+1Ot+YhQjXZxVELKGGGO3D5cuR4p5xaeitXYX2+RRiz4/WdSak9slumIClnlXsdqhJ0OHognUT+w==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.973.16': - resolution: {integrity: sha512-Nasoyb5K4jfvncTKQyA13q55xHoz9as01NVYP05B0Kzux/X5UhMn3qXsZDyWOSXkfSCAIrMBKmVVWbI0vUapdQ==} + '@aws-sdk/core@3.973.17': + resolution: {integrity: sha512-VtgGP0TjbCeyp6DQpiBqJKbemTSIaN2bZc3UbeTDCani3lBCyxn75ouJYD6koSSp0bh7rKLEbUpiFsNCI7tr0w==} engines: {node: '>=20.0.0'} '@aws-sdk/crc64-nvme@3.972.3': resolution: {integrity: sha512-UExeK+EFiq5LAcbHm96CQLSia+5pvpUVSAsVApscBzayb7/6dJBJKwV4/onsk4VbWSmqxDMcfuTD+pC4RxgZHg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.14': - resolution: {integrity: sha512-PvnBY9rwBuLh9MEsAng28DG+WKl+txerKgf4BU9IPAqYI7FBIo1x6q/utLf4KLyQYgSy1TLQnbQuXx5xfBGASg==} + '@aws-sdk/credential-provider-env@3.972.15': + resolution: {integrity: sha512-RhHQG1lhkWHL4tK1C/KDjaOeis+9U0tAMnWDiwiSVQZMC7CsST9Xin+sK89XywJ5g/tyABtb7TvFePJ4Te5XSQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.16': - resolution: {integrity: sha512-m/QAcvw5OahqGPjeAnKtgfWgjLxeWOYj7JSmxKK6PLyKp2S/t2TAHI6EELEzXnIz28RMgbQLukJkVAqPASVAGQ==} + '@aws-sdk/credential-provider-http@3.972.17': + resolution: {integrity: sha512-b/bDL76p51+yQ+0O9ZDH5nw/ioE0sRYkjwjOwFWAWZXo6it2kQZUOXhVpjohx3ldKyUxt/SwAivjUu1Nr/PWlQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.14': - resolution: {integrity: sha512-EGA7ufqNpZKZcD0RwM6gRDEQgwAf19wQ99R1ptdWYDJAnpcMcWiFyT0RIrgiZFLD28CwJmYjnra75hChnEveWA==} + '@aws-sdk/credential-provider-ini@3.972.15': + resolution: {integrity: sha512-qWnM+wB8MmU2kKY7f4KowKjOjkwRosaFxrtseEEIefwoXn1SjN+CbHzXBVdTAQxxkbBiqhPgJ/WHiPtES4grRQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.14': - resolution: {integrity: sha512-P2kujQHAoV7irCTv6EGyReKFofkHCjIK+F0ZYf5UxeLeecrCwtrDkHoO2Vjsv/eRUumaKblD8czuk3CLlzwGDw==} + '@aws-sdk/credential-provider-login@3.972.15': + resolution: {integrity: sha512-x92FJy34/95wgu+qOGD8SHcgh1hZ9Qx2uFtQEGn4m9Ljou8ICIv3Ybq5yxdB7A60S8ZGCQB0mIopmjJwiLbh5g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.15': - resolution: {integrity: sha512-59NBJgTcQ2FC94T+SWkN5UQgViFtrLnkswSKhG5xbjPAotOXnkEF2Bf0bfUV1F3VaXzqAPZJoZ3bpg4rr8XD5Q==} + '@aws-sdk/credential-provider-node@3.972.16': + resolution: {integrity: sha512-7mlt14Ee4rPFAFUVgpWE7+0CBhetJJyzVFqfIsMp7sgyOSm9Y/+qHZOWAuK5I4JNc+Y5PltvJ9kssTzRo92iXQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.14': - resolution: {integrity: sha512-KAF5LBkJInUPaR9dJDw8LqmbPDRTLyXyRoWVGcJQ+DcN9rxVKBRzAK+O4dTIvQtQ7xaIDZ2kY7zUmDlz6CCXdw==} + '@aws-sdk/credential-provider-process@3.972.15': + resolution: {integrity: sha512-PrH3iTeD18y/8uJvQD2s/T87BTGhsdS/1KZU7ReWHXsplBwvCqi7AbnnNbML1pFlQwRWCE2RdSZFWDVId3CvkA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.14': - resolution: {integrity: sha512-LQzIYrNABnZzkyuIguFa3VVOox9UxPpRW6PL+QYtRHaGl1Ux/+Zi54tAVK31VdeBKPKU3cxqeu8dbOgNqy+naw==} + '@aws-sdk/credential-provider-sso@3.972.15': + resolution: {integrity: sha512-M/+LBHTPKZxxXckM6m4dnJeR+jlm9NynH9b2YDswN4Zj2St05SK/crdL3Wy3WfJTZootnnhm3oTh87Usl7PS7w==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.14': - resolution: {integrity: sha512-rOwB3vXHHHnGvAOjTgQETxVAsWjgF61XlbGd/ulvYo7EpdXs8cbIHE3PGih9tTj/65ZOegSqZGFqLaKntaI9Kw==} + '@aws-sdk/credential-provider-web-identity@3.972.15': + resolution: {integrity: sha512-QTH6k93v+UOfFam/ado8zc71tH+enTVyuvLy9uEWXX1x894dN5ovtf/MdBDgFwq3g6c9mbtgVJ4B+yBqDtXvdA==} engines: {node: '>=20.0.0'} - '@aws-sdk/lib-storage@3.1001.0': - resolution: {integrity: sha512-h1EO4CKayPb7KqdC8M8aSr/7g8LueCN048WvasFMKxH5wuN5UBa+slE1OHfi/tR+fHILa6K7YUJ6L0Ibg3OdBA==} + '@aws-sdk/lib-storage@3.1002.0': + resolution: {integrity: sha512-vOzNq63BLXUTawI4/D2kU/92wZcHsng6yuIAZuW1FofCvsWORdwdRxJYame506lKZTPCNw49LIAoBT2YJ2+pGw==} engines: {node: '>=20.0.0'} peerDependencies: - '@aws-sdk/client-s3': ^3.1001.0 + '@aws-sdk/client-s3': ^3.1002.0 '@aws-sdk/middleware-bucket-endpoint@3.972.6': resolution: {integrity: sha512-3H2bhvb7Cb/S6WFsBy/Dy9q2aegC9JmGH1inO8Lb2sWirSqpLJlZmvQHPE29h2tIxzv6el/14X/tLCQ8BQU6ZQ==} @@ -2799,8 +2802,8 @@ packages: resolution: {integrity: sha512-QMdffpU+GkSGC+bz6WdqlclqIeCsOfgX8JFZ5xvwDtX+UTj4mIXm3uXu7Ko6dBseRcJz1FA6T9OmlAAY6JgJUg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.973.2': - resolution: {integrity: sha512-KM6QujWdasNjRLG+f7YEqEY5D36vR6Govm7nPIwxjILpb5rJ0pPJZpYY1nrzgtlxwJIYAznfBK5YXoLOHKHyfQ==} + '@aws-sdk/middleware-flexible-checksums@3.973.3': + resolution: {integrity: sha512-C9Mu9pXMpQh7jBydx0MrfQxNIKwJvKbVbJJ0GZthM+cQ+KTChXA01MwttRsMq0ZRb4pBJZQtIKDUxXusDr5OKg==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-host-header@3.972.6': @@ -2819,32 +2822,32 @@ packages: resolution: {integrity: sha512-dY4v3of5EEMvik6+UDwQ96KfUFDk8m1oZDdkSc5lwi4o7rFrjnv0A+yTV+gu230iybQZnKgDLg/rt2P3H+Vscw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.16': - resolution: {integrity: sha512-U4K1rqyJYvT/zgTI3+rN+MToa51dFnnq1VSsVJuJWPNEKcEnuZVqf7yTpkJJMkYixVW5TTi1dgupd+nmJ0JyWw==} + '@aws-sdk/middleware-sdk-s3@3.972.17': + resolution: {integrity: sha512-uSyOGoVFMP44pTt29MIMfsOjegqE/7lT0K3HG0GWPiH2lD4rqZC/TRi/kH4zrGiOQdsaLc+dkfd7Sb2q8vh+gA==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-ssec@3.972.6': resolution: {integrity: sha512-acvMUX9jF4I2Ew+Z/EA6gfaFaz9ehci5wxBmXCZeulLuv8m+iGf6pY9uKz8TPjg39bdAz3hxoE0eLP8Qz+IYlA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.16': - resolution: {integrity: sha512-AmVxtxn8ZkNJbuPu3KKfW9IkJgTgcEtgSwbo0NVcAb31iGvLgHXj2nbbyrUDfh2fx8otXmqL+qw1lRaTi+V3vA==} + '@aws-sdk/middleware-user-agent@3.972.17': + resolution: {integrity: sha512-HHArkgWzomuwufXwheQqkddu763PWCpoNTq1dGjqXzJT/lojX3VlOqjNSR2Xvb6/T9ISfwYcMOcbFgUp4EWxXA==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.996.4': - resolution: {integrity: sha512-NowB1HfOnWC4kwZOnTg8E8rSL0U+RSjSa++UtEV4ipoH6JOjMLnHyGilqwl+Pe1f0Al6v9yMkSJ/8Ot0f578CQ==} + '@aws-sdk/nested-clients@3.996.5': + resolution: {integrity: sha512-zn0WApcULn7Rtl6T+KP2CQTZo/7wOa2YV1yHQnbijTQoi4YXQHM8s21JcJzt33/mqPh8AdvWX1f+83KvKuxlZw==} engines: {node: '>=20.0.0'} '@aws-sdk/region-config-resolver@3.972.6': resolution: {integrity: sha512-Aa5PusHLXAqLTX1UKDvI3pHQJtIsF7Q+3turCHqfz/1F61/zDMWfbTC8evjhrrYVAtz9Vsv3SJ/waSUeu7B6gw==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.996.4': - resolution: {integrity: sha512-MGa8ro0onekYIiesHX60LwKdkxK3Kd61p7TTbLwZemBqlnD9OLrk9sXZdFOIxXanJ+3AaJnV/jiX866eD/4PDg==} + '@aws-sdk/signature-v4-multi-region@3.996.5': + resolution: {integrity: sha512-AVIhf74wRMzU1WBPVzcGPjlADF5VxZ8m8Ctm1v7eO4/reWMhZnEBn4tlR4vM4pOYFkdrYp3MTzYVZIikCO+53Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1001.0': - resolution: {integrity: sha512-09XAq/uIYgeZhohuGRrR/R+ek3+ljFNdzWCXdqb9rlIERDjSfNiLjTtpHgSK1xTPmC5G4yWoEAyMfTXiggS6wA==} + '@aws-sdk/token-providers@3.1002.0': + resolution: {integrity: sha512-x972uKOydFn4Rb0PZJzLdNW59rH0KWC78Q2JbQzZpGlGt0DxjYdDRwBG6F42B1MyaEwHGqO/tkGc4r3/PRFfMw==} engines: {node: '>=20.0.0'} '@aws-sdk/types@3.973.4': @@ -2859,15 +2862,15 @@ packages: resolution: {integrity: sha512-yWIQSNiCjykLL+ezN5A+DfBb1gfXTytBxm57e64lYmwxDHNmInYHRJYYRAGWG1o77vKEiWaw4ui28e3yb1k5aQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-locate-window@3.965.4': - resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} + '@aws-sdk/util-locate-window@3.965.2': + resolution: {integrity: sha512-qKgO7wAYsXzhwCHhdbaKFyxd83Fgs8/1Ka+jjSPrv2Ll7mB55Wbwlo0kkfMLh993/yEc8aoDIAc1Fz9h4Spi4Q==} engines: {node: '>=20.0.0'} '@aws-sdk/util-user-agent-browser@3.972.6': resolution: {integrity: sha512-Fwr/llD6GOrFgQnKaI2glhohdGuBDfHfora6iG9qsBBBR8xv1SdCSwbtf5CWlUdCw5X7g76G/9Hf0Inh0EmoxA==} - '@aws-sdk/util-user-agent-node@3.973.1': - resolution: {integrity: sha512-kmgbDqT7aCBEVrqESM2JUjbf0zhDUQ7wnt3q1RuVS+3mglrcfVb2bwkbmf38npOyyPGtQPV5dWN3m+sSFAVAgQ==} + '@aws-sdk/util-user-agent-node@3.973.2': + resolution: {integrity: sha512-lpaIuekdkpw7VRiik0IZmd6TyvEUcuLgKZ5fKRGpCA3I4PjrD/XH15sSwW+OptxQjNU4DEzSxag70spC9SluvA==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -4726,220 +4729,220 @@ packages: '@sinonjs/fake-timers@13.0.5': resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} - '@smithy/abort-controller@4.2.10': - resolution: {integrity: sha512-qocxM/X4XGATqQtUkbE9SPUB6wekBi+FyJOMbPj0AhvyvFGYEmOlz6VB22iMePCQsFmMIvFSeViDvA7mZJG47g==} + '@smithy/abort-controller@4.2.11': + resolution: {integrity: sha512-Hj4WoYWMJnSpM6/kchsm4bUNTL9XiSyhvoMb2KIq4VJzyDt7JpGHUZHkVNPZVC7YE1tf8tPeVauxpFBKGW4/KQ==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader-native@4.2.2': - resolution: {integrity: sha512-QzzYIlf4yg0w5TQaC9VId3B3ugSk1MI/wb7tgcHtd7CBV9gNRKZrhc2EPSxSZuDy10zUZ0lomNMgkc6/VVe8xg==} + '@smithy/chunked-blob-reader-native@4.2.3': + resolution: {integrity: sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader@5.2.1': - resolution: {integrity: sha512-y5d4xRiD6TzeP5BWlb+Ig/VFqF+t9oANNhGeMqyzU7obw7FYgTgVi50i5JqBTeKp+TABeDIeeXFZdz65RipNtA==} + '@smithy/chunked-blob-reader@5.2.2': + resolution: {integrity: sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.4.9': - resolution: {integrity: sha512-ejQvXqlcU30h7liR9fXtj7PIAau1t/sFbJpgWPfiYDs7zd16jpH0IsSXKcba2jF6ChTXvIjACs27kNMc5xxE2Q==} + '@smithy/config-resolver@4.4.10': + resolution: {integrity: sha512-IRTkd6ps0ru+lTWnfnsbXzW80A8Od8p3pYiZnW98K2Hb20rqfsX7VTlfUwhrcOeSSy68Gn9WBofwPuw3e5CCsg==} engines: {node: '>=18.0.0'} - '@smithy/core@3.23.7': - resolution: {integrity: sha512-/+ldRdtiO5Cb26afAZOG1FZM0x7D4AYdjpyOv2OScJw+4C7X+OLdRnNKF5UyUE0VpPgSKr3rnF/kvprRA4h2kg==} + '@smithy/core@3.23.8': + resolution: {integrity: sha512-f7uPeBi7ehmLT4YF2u9j3qx6lSnurG1DLXOsTtJrIRNDF7VXio4BGHQ+SQteN/BrUVudbkuL4v7oOsRCzq4BqA==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.2.10': - resolution: {integrity: sha512-3bsMLJJLTZGZqVGGeBVFfLzuRulVsGTj12BzRKODTHqUABpIr0jMN1vN3+u6r2OfyhAQ2pXaMZWX/swBK5I6PQ==} + '@smithy/credential-provider-imds@4.2.11': + resolution: {integrity: sha512-lBXrS6ku0kTj3xLmsJW0WwqWbGQ6ueooYyp/1L9lkyT0M02C+DWwYwc5aTyXFbRaK38ojALxNixg+LxKSHZc0g==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.2.10': - resolution: {integrity: sha512-A4ynrsFFfSXUHicfTcRehytppFBcY3HQxEGYiyGktPIOye3Ot7fxpiy4VR42WmtGI4Wfo6OXt/c1Ky1nUFxYYQ==} + '@smithy/eventstream-codec@4.2.11': + resolution: {integrity: sha512-Sf39Ml0iVX+ba/bgMPxaXWAAFmHqYLTmbjAPfLPLY8CrYkRDEqZdUsKC1OwVMCdJXfAt0v4j49GIJ8DoSYAe6w==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.2.10': - resolution: {integrity: sha512-0xupsu9yj9oDVuQ50YCTS9nuSYhGlrwqdaKQel9y2Fz7LU9fNErVlw9N0o4pm4qqvWEGbSTI4HKc6XJfB30MVw==} + '@smithy/eventstream-serde-browser@4.2.11': + resolution: {integrity: sha512-3rEpo3G6f/nRS7fQDsZmxw/ius6rnlIpz4UX6FlALEzz8JoSxFmdBt0SZnthis+km7sQo6q5/3e+UJcuQivoXA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.3.10': - resolution: {integrity: sha512-8kn6sinrduk0yaYHMJDsNuiFpXwQwibR7n/4CDUqn4UgaG+SeBHu5jHGFdU9BLFAM7Q4/gvr9RYxBHz9/jKrhA==} + '@smithy/eventstream-serde-config-resolver@4.3.11': + resolution: {integrity: sha512-XeNIA8tcP/GDWnnKkO7qEm/bg0B/bP9lvIXZBXcGZwZ+VYM8h8k9wuDvUODtdQ2Wcp2RcBkPTCSMmaniVHrMlA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.2.10': - resolution: {integrity: sha512-uUrxPGgIffnYfvIOUmBM5i+USdEBRTdh7mLPttjphgtooxQ8CtdO1p6K5+Q4BBAZvKlvtJ9jWyrWpBJYzBKsyQ==} + '@smithy/eventstream-serde-node@4.2.11': + resolution: {integrity: sha512-fzbCh18rscBDTQSCrsp1fGcclLNF//nJyhjldsEl/5wCYmgpHblv5JSppQAyQI24lClsFT0wV06N1Porn0IsEw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.2.10': - resolution: {integrity: sha512-aArqzOEvcs2dK+xQVCgLbpJQGfZihw8SD4ymhkwNTtwKbnrzdhJsFDKuMQnam2kF69WzgJYOU5eJlCx+CA32bw==} + '@smithy/eventstream-serde-universal@4.2.11': + resolution: {integrity: sha512-MJ7HcI+jEkqoWT5vp+uoVaAjBrmxBtKhZTeynDRG/seEjJfqyg3SiqMMqyPnAMzmIfLaeJ/uiuSDP/l9AnMy/Q==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.3.12': - resolution: {integrity: sha512-muS5tFw+A/uo+U+yig06vk1776UFM+aAp9hFM8efI4ZcHhTcgv6NTeK4x7ltHeMPBwnhEjcf0MULTyxNkSNxDw==} + '@smithy/fetch-http-handler@5.3.13': + resolution: {integrity: sha512-U2Hcfl2s3XaYjikN9cT4mPu8ybDbImV3baXR0PkVlC0TTx808bRP3FaPGAzPtB8OByI+JqJ1kyS+7GEgae7+qQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.2.11': - resolution: {integrity: sha512-DrcAx3PM6AEbWZxsKl6CWAGnVwiz28Wp1ZhNu+Hi4uI/6C1PIZBIaPM2VoqBDAsOWbM6ZVzOEQMxFLLdmb4eBQ==} + '@smithy/hash-blob-browser@4.2.12': + resolution: {integrity: sha512-1wQE33DsxkM/waftAhCH9VtJbUGyt1PJ9YRDpOu+q9FUi73LLFUZ2fD8A61g2mT1UY9k7b99+V1xZ41Rz4SHRQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.10': - resolution: {integrity: sha512-1VzIOI5CcsvMDvP3iv1vG/RfLJVVVc67dCRyLSB2Hn9SWCZrDO3zvcIzj3BfEtqRW5kcMg5KAeVf1K3dR6nD3w==} + '@smithy/hash-node@4.2.11': + resolution: {integrity: sha512-T+p1pNynRkydpdL015ruIoyPSRw9e/SQOWmSAMmmprfswMrd5Ow5igOWNVlvyVFZlxXqGmyH3NQwfwy8r5Jx0A==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.2.10': - resolution: {integrity: sha512-w78xsYrOlwXKwN5tv1GnKIRbHb1HygSpeZMP6xDxCPGf1U/xDHjCpJu64c5T35UKyEPwa0bPeIcvU69VY3khUA==} + '@smithy/hash-stream-node@4.2.11': + resolution: {integrity: sha512-hQsTjwPCRY8w9GK07w1RqJi3e+myh0UaOWBBhZ1UMSDgofH/Q1fEYzU1teaX6HkpX/eWDdm7tAGR0jBPlz9QEQ==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.2.10': - resolution: {integrity: sha512-vy9KPNSFUU0ajFYk0sDZIYiUlAWGEAhRfehIr5ZkdFrRFTAuXEPUd41USuqHU6vvLX4r6Q9X7MKBco5+Il0Org==} + '@smithy/invalid-dependency@4.2.11': + resolution: {integrity: sha512-cGNMrgykRmddrNhYy1yBdrp5GwIgEkniS7k9O1VLB38yxQtlvrxpZtUVvo6T4cKpeZsriukBuuxfJcdZQc/f/g==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.2.1': - resolution: {integrity: sha512-Yfu664Qbf1B4IYIsYgKoABt010daZjkaCRvdU/sPnZG6TtHOB0md0RjNdLGzxe5UIdn9js4ftPICzmkRa9RJ4Q==} + '@smithy/is-array-buffer@4.2.2': + resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.2.10': - resolution: {integrity: sha512-Op+Dh6dPLWTjWITChFayDllIaCXRofOed8ecpggTC5fkh8yXes0vAEX7gRUfjGK+TlyxoCAA05gHbZW/zB9JwQ==} + '@smithy/md5-js@4.2.11': + resolution: {integrity: sha512-350X4kGIrty0Snx2OWv7rPM6p6vM7RzryvFs6B/56Cux3w3sChOb3bymo5oidXJlPcP9fIRxGUCk7GqpiSOtng==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.2.10': - resolution: {integrity: sha512-TQZ9kX5c6XbjhaEBpvhSvMEZ0klBs1CFtOdPFwATZSbC9UeQfKHPLPN9Y+I6wZGMOavlYTOlHEPDrt42PMSH9w==} + '@smithy/middleware-content-length@4.2.11': + resolution: {integrity: sha512-UvIfKYAKhCzr4p6jFevPlKhQwyQwlJ6IeKLDhmV1PlYfcW3RL4ROjNEDtSik4NYMi9kDkH7eSwyTP3vNJ/u/Dw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.21': - resolution: {integrity: sha512-CoVGZaqIC0tEjz0ga3ciwCMA5fd/4lIOwO2wx0fH+cTi1zxSFZnMJbIiIF9G1d4vRSDyTupDrpS3FKBBJGkRZg==} + '@smithy/middleware-endpoint@4.4.22': + resolution: {integrity: sha512-sc81w1o4Jy+/MAQlY3sQ8C7CmSpcvIi3TAzXblUv2hjG11BBSJi/Cw8vDx5BxMxapuH2I+Gc+45vWsgU07WZRQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.38': - resolution: {integrity: sha512-WdHvdhjE6Fj78vxFwDKFDwlqGOGRUWrwGeuENUbTVE46Su9mnQM+dXHtbnCaQvwuSYrRsjpe8zUsFpwUp/azlA==} + '@smithy/middleware-retry@4.4.39': + resolution: {integrity: sha512-MCVCxaCzuZgiHtHGV2Ke44nh6t4+8/tO+rTYOzrr2+G4nMLU/qbzNCWKBX54lyEaVcGQrfOJiG2f8imtiw+nIQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.11': - resolution: {integrity: sha512-STQdONGPwbbC7cusL60s7vOa6He6A9w2jWhoapL0mgVjmR19pr26slV+yoSP76SIssMTX/95e5nOZ6UQv6jolg==} + '@smithy/middleware-serde@4.2.12': + resolution: {integrity: sha512-W9g1bOLui7Xn5FABRVS0o3rXL0gfN37d/8I/W7i0N7oxjx9QecUmXEMSUMADTODwdtka9cN43t5BI2CodLJpng==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.2.10': - resolution: {integrity: sha512-pmts/WovNcE/tlyHa8z/groPeOtqtEpp61q3W0nW1nDJuMq/x+hWa/OVQBtgU0tBqupeXq0VBOLA4UZwE8I0YA==} + '@smithy/middleware-stack@4.2.11': + resolution: {integrity: sha512-s+eenEPW6RgliDk2IhjD2hWOxIx1NKrOHxEwNUaUXxYBxIyCcDfNULZ2Mu15E3kwcJWBedTET/kEASPV1A1Akg==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.3.10': - resolution: {integrity: sha512-UALRbJtVX34AdP2VECKVlnNgidLHA2A7YgcJzwSBg1hzmnO/bZBHl/LDQQyYifzUwp1UOODnl9JJ3KNawpUJ9w==} + '@smithy/node-config-provider@4.3.11': + resolution: {integrity: sha512-xD17eE7kaLgBBGf5CZQ58hh2YmwK1Z0O8YhffwB/De2jsL0U3JklmhVYJ9Uf37OtUDLF2gsW40Xwwag9U869Gg==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.4.13': - resolution: {integrity: sha512-o8CP8w6tlUA0lk+Qfwm6Ed0jCWk3bEY6iBOJjdBaowbXKCSClk8zIHQvUL6RUZMvuNafF27cbRCMYqw6O1v4aA==} + '@smithy/node-http-handler@4.4.14': + resolution: {integrity: sha512-DamSqaU8nuk0xTJDrYnRzZndHwwRnyj/n/+RqGGCcBKB4qrQem0mSDiWdupaNWdwxzyMU91qxDmHOCazfhtO3A==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.10': - resolution: {integrity: sha512-5jm60P0CU7tom0eNrZ7YrkgBaoLFXzmqB0wVS+4uK8PPGmosSrLNf6rRd50UBvukztawZ7zyA8TxlrKpF5z9jw==} + '@smithy/property-provider@4.2.11': + resolution: {integrity: sha512-14T1V64o6/ndyrnl1ze1ZhyLzIeYNN47oF/QU6P5m82AEtyOkMJTb0gO1dPubYjyyKuPD6OSVMPDKe+zioOnCg==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.3.10': - resolution: {integrity: sha512-2NzVWpYY0tRdfeCJLsgrR89KE3NTWT2wGulhNUxYlRmtRmPwLQwKzhrfVaiNlA9ZpJvbW7cjTVChYKgnkqXj1A==} + '@smithy/protocol-http@5.3.11': + resolution: {integrity: sha512-hI+barOVDJBkNt4y0L2mu3Ugc0w7+BpJ2CZuLwXtSltGAAwCb3IvnalGlbDV/UCS6a9ZuT3+exd1WxNdLb5IlQ==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.2.10': - resolution: {integrity: sha512-HeN7kEvuzO2DmAzLukE9UryiUvejD3tMp9a1D1NJETerIfKobBUCLfviP6QEk500166eD2IATaXM59qgUI+YDA==} + '@smithy/querystring-builder@4.2.11': + resolution: {integrity: sha512-7spdikrYiljpket6u0up2Ck2mxhy7dZ0+TDd+S53Dg2DHd6wg+YNJrTCHiLdgZmEXZKI7LJZcwL3721ZRDFiqA==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.2.10': - resolution: {integrity: sha512-4Mh18J26+ao1oX5wXJfWlTT+Q1OpDR8ssiC9PDOuEgVBGloqg18Fw7h5Ct8DyT9NBYwJgtJ2nLjKKFU6RP1G1Q==} + '@smithy/querystring-parser@4.2.11': + resolution: {integrity: sha512-nE3IRNjDltvGcoThD2abTozI1dkSy8aX+a2N1Rs55en5UsdyyIXgGEmevUL3okZFoJC77JgRGe99xYohhsjivQ==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.2.10': - resolution: {integrity: sha512-0R/+/Il5y8nB/By90o8hy/bWVYptbIfvoTYad0igYQO5RefhNCDmNzqxaMx7K1t/QWo0d6UynqpqN5cCQt1MCg==} + '@smithy/service-error-classification@4.2.11': + resolution: {integrity: sha512-HkMFJZJUhzU3HvND1+Yw/kYWXp4RPDLBWLcK1n+Vqw8xn4y2YiBhdww8IxhkQjP/QlZun5bwm3vcHc8AqIU3zw==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.4.5': - resolution: {integrity: sha512-pHgASxl50rrtOztgQCPmOXFjRW+mCd7ALr/3uXNzRrRoGV5G2+78GOsQ3HlQuBVHCh9o6xqMNvlIKZjWn4Euug==} + '@smithy/shared-ini-file-loader@4.4.6': + resolution: {integrity: sha512-IB/M5I8G0EeXZTHsAxpx51tMQ5R719F3aq+fjEB6VtNcCHDc0ajFDIGDZw+FW9GxtEkgTduiPpjveJdA/CX7sw==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.3.10': - resolution: {integrity: sha512-Wab3wW8468WqTKIxI+aZe3JYO52/RYT/8sDOdzkUhjnLakLe9qoQqIcfih/qxcF4qWEFoWBszY0mj5uxffaVXA==} + '@smithy/signature-v4@5.3.11': + resolution: {integrity: sha512-V1L6N9aKOBAN4wEHLyqjLBnAz13mtILU0SeDrjOaIZEeN6IFa6DxwRt1NNpOdmSpQUfkBj0qeD3m6P77uzMhgQ==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.12.1': - resolution: {integrity: sha512-Xf9UFHlAihewfkmLNZ6I/Ek6kcYBKoU3cbRS9Z4q++9GWoW0YFbAHs7wMbuXm+nGuKHZ5OKheZMuDdaWPv8DJw==} + '@smithy/smithy-client@4.12.2': + resolution: {integrity: sha512-HezY3UuG0k4T+4xhFKctLXCA5N2oN+Rtv+mmL8Gt7YmsUY2yhmcLyW75qrSzldfj75IsCW/4UhY3s20KcFnZqA==} engines: {node: '>=18.0.0'} '@smithy/types@4.13.0': resolution: {integrity: sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.2.10': - resolution: {integrity: sha512-uypjF7fCDsRk26u3qHmFI/ePL7bxxB9vKkE+2WKEciHhz+4QtbzWiHRVNRJwU3cKhrYDYQE3b0MRFtqfLYdA4A==} + '@smithy/url-parser@4.2.11': + resolution: {integrity: sha512-oTAGGHo8ZYc5VZsBREzuf5lf2pAurJQsccMusVZ85wDkX66ojEc/XauiGjzCj50A61ObFTPe6d7Pyt6UBYaing==} engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.3.1': - resolution: {integrity: sha512-BKGuawX4Doq/bI/uEmg+Zyc36rJKWuin3py89PquXBIBqmbnJwBBsmKhdHfNEp0+A4TDgLmT/3MSKZ1SxHcR6w==} + '@smithy/util-base64@4.3.2': + resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.2.1': - resolution: {integrity: sha512-SiJeLiozrAoCrgDBUgsVbmqHmMgg/2bA15AzcbcW+zan7SuyAVHN4xTSbq0GlebAIwlcaX32xacnrG488/J/6g==} + '@smithy/util-body-length-browser@4.2.2': + resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@4.2.2': - resolution: {integrity: sha512-4rHqBvxtJEBvsZcFQSPQqXP2b/yy/YlB66KlcEgcH2WNoOKCKB03DSLzXmOsXjbl8dJ4OEYTn31knhdznwk7zw==} + '@smithy/util-body-length-node@4.2.3': + resolution: {integrity: sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.2.1': - resolution: {integrity: sha512-/swhmt1qTiVkaejlmMPPDgZhEaWb/HWMGRBheaxwuVkusp/z+ErJyQxO6kaXumOciZSWlmq6Z5mNylCd33X7Ig==} + '@smithy/util-buffer-from@4.2.2': + resolution: {integrity: sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==} engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.2.1': - resolution: {integrity: sha512-462id/00U8JWFw6qBuTSWfN5TxOHvDu4WliI97qOIOnuC/g+NDAknTU8eoGXEPlLkRVgWEr03jJBLV4o2FL8+A==} + '@smithy/util-config-provider@4.2.2': + resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.37': - resolution: {integrity: sha512-JlPZhV1kQCGNJgofRTU6E8kHrjCKsb6cps8gco8QDVaFl7biFYzHg0p1x89ytIWyVyCkY3nOpO8tJPM47Vqlww==} + '@smithy/util-defaults-mode-browser@4.3.38': + resolution: {integrity: sha512-c8P1mFLNxcsdAMabB8/VUQUbWzFmgujWi4bAXSggcqLYPc8V4U5abqFqOyn+dK4YT+q8UyCVkTO8807t4t2syA==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.40': - resolution: {integrity: sha512-BM5cPEsyxHdYYO4Da77E94lenhaVPNUzBTyCGDkcw/n/mE8Q1cfHwr+n/w2bNPuUsPC30WaW5/hGKWOTKqw8kw==} + '@smithy/util-defaults-mode-node@4.2.41': + resolution: {integrity: sha512-/UG+9MT3UZAR0fLzOtMJMfWGcjjHvgggq924x/CRy8vRbL+yFf3Z6vETlvq8vDH92+31P/1gSOFoo7303wN8WQ==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.3.1': - resolution: {integrity: sha512-xyctc4klmjmieQiF9I1wssBWleRV0RhJ2DpO8+8yzi2LO1Z+4IWOZNGZGNj4+hq9kdo+nyfrRLmQTzc16Op2Vg==} + '@smithy/util-endpoints@3.3.2': + resolution: {integrity: sha512-+4HFLpE5u29AbFlTdlKIT7jfOzZ8PDYZKTb3e+AgLz986OYwqTourQ5H+jg79/66DB69Un1+qKecLnkZdAsYcA==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.2.1': - resolution: {integrity: sha512-c1hHtkgAWmE35/50gmdKajgGAKV3ePJ7t6UtEmpfCWJmQE9BQAQPz0URUVI89eSkcDqCtzqllxzG28IQoZPvwA==} + '@smithy/util-hex-encoding@4.2.2': + resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.2.10': - resolution: {integrity: sha512-LxaQIWLp4y0r72eA8mwPNQ9va4h5KeLM0I3M/HV9klmFaY2kN766wf5vsTzmaOpNNb7GgXAd9a25P3h8T49PSA==} + '@smithy/util-middleware@4.2.11': + resolution: {integrity: sha512-r3dtF9F+TpSZUxpOVVtPfk09Rlo4lT6ORBqEvX3IBT6SkQAdDSVKR5GcfmZbtl7WKhKnmb3wbDTQ6ibR2XHClw==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.2.10': - resolution: {integrity: sha512-HrBzistfpyE5uqTwiyLsFHscgnwB0kgv8vySp7q5kZ0Eltn/tjosaSGGDj/jJ9ys7pWzIP/icE2d+7vMKXLv7A==} + '@smithy/util-retry@4.2.11': + resolution: {integrity: sha512-XSZULmL5x6aCTTii59wJqKsY1l3eMIAomRAccW7Tzh9r8s7T/7rdo03oektuH5jeYRlJMPcNP92EuRDvk9aXbw==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.16': - resolution: {integrity: sha512-c7awZV6cxY0czgDDSr+Bz0XfRtg8AwW2BWhrHhLJISrpmwv8QzA2qzTllWyMVNdy1+UJr9vCm29hzuh3l8TTFw==} + '@smithy/util-stream@4.5.17': + resolution: {integrity: sha512-793BYZ4h2JAQkNHcEnyFxDTcZbm9bVybD0UV/LEWmZ5bkTms7JqjfrLMi2Qy0E5WFcCzLwCAPgcvcvxoeALbAQ==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.2.1': - resolution: {integrity: sha512-YmiUDn2eo2IOiWYYvGQkgX5ZkBSiTQu4FlDo5jNPpAxng2t6Sjb6WutnZV9l6VR4eJul1ABmCrnWBC9hKHQa6Q==} + '@smithy/util-uri-escape@4.2.2': + resolution: {integrity: sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==} engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.2.1': - resolution: {integrity: sha512-DSIwNaWtmzrNQHv8g7DBGR9mulSit65KSj5ymGEIAknmIN8IpbZefEep10LaMG/P/xquwbmJ1h9ectz8z6mV6g==} + '@smithy/util-utf8@4.2.2': + resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.2.10': - resolution: {integrity: sha512-4eTWph/Lkg1wZEDAyObwme0kmhEb7J/JjibY2znJdrYRgKbKqB7YoEhhJVJ4R1g/SYih4zuwX7LpJaM8RsnTVg==} + '@smithy/util-waiter@4.2.11': + resolution: {integrity: sha512-x7Rh2azQPs3XxbvCzcttRErKKvLnbZfqRf/gOjw2pb+ZscX88e5UkRPCB67bVnsFHxayvMvmePfKTqsRb+is1A==} engines: {node: '>=18.0.0'} - '@smithy/uuid@1.1.1': - resolution: {integrity: sha512-dSfDCeihDmZlV2oyr0yWPTUfh07suS+R5OB+FZGiv/hHyK3hrFBW5rR1UYjfa57vBsrP9lciFkRPzebaV1Qujw==} + '@smithy/uuid@1.1.2': + resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} engines: {node: '>=18.0.0'} '@styled-system/background@5.1.2': @@ -5150,9 +5153,6 @@ packages: '@types/node@22.19.11': resolution: {integrity: sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==} - '@types/node@25.3.3': - resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} - '@types/nodemailer@7.0.11': resolution: {integrity: sha512-E+U4RzR2dKrx+u3N4DlsmLaDC6mMZOM/TPROxA0UAPiTgI0y4CEFBmZE+coGWTjakDriRsXG368lNk1u9Q0a2g==} @@ -5610,8 +5610,8 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - bowser@2.14.1: - resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + bowser@2.13.1: + resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -7800,15 +7800,12 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - - minimatch@5.1.9: - resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@8.0.7: - resolution: {integrity: sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==} + minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} minimatch@9.0.1: @@ -7819,8 +7816,8 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minimist-options@4.1.0: @@ -8008,8 +8005,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - multer@2.1.0: - resolution: {integrity: sha512-TBm6j41rxNohqawsxlsWsNNh/VdV4QFXcBvRcPhXaA05EZ79z0qJ2bQFpync6JBoHTeNY5Q1JpG7AlTjdlfAEA==} + multer@2.1.1: + resolution: {integrity: sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==} engines: {node: '>= 10.16.0'} multimatch@5.0.0: @@ -8391,8 +8388,11 @@ packages: pg-cloudflare@1.3.0: resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} - pg-connection-string@2.11.0: - resolution: {integrity: sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ==} + pg-connection-string@2.10.0: + resolution: {integrity: sha512-ur/eoPKzDx2IjPaYyXS6Y8NSblxM7X64deV2ObV57vhjsWiwLvUD6meukAzogiOsu60GO8m/3Cb6FdJsWNjwXg==} + + pg-connection-string@2.12.0: + resolution: {integrity: sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==} pg-copy-streams@7.0.0: resolution: {integrity: sha512-zBvnY6wtaBRE2ae2xXWOOGMaNVPkXh1vhypAkNSKgMdciJeTyIQAHZaEeRAxUjs/p1El5jgzYmwG5u871Zj3dQ==} @@ -8405,16 +8405,24 @@ packages: resolution: {integrity: sha512-Cz5HZz4IbJN2wj9ow13dzco/HZ7UUi9qq0PYyjE4+hHgI8yxNLfXk9TqcJA+zgv7KR43QzGlx7yYcC25jTcFDw==} engines: {node: '>=22'} - pg-pool@3.12.0: - resolution: {integrity: sha512-eIJ0DES8BLaziFHW7VgJEBPi5hg3Nyng5iKpYtj3wbcAUV9A1wLgWiY7ajf/f/oO1wfxt83phXPY8Emztg7ITg==} + pg-pool@3.11.0: + resolution: {integrity: sha512-MJYfvHwtGp870aeusDh+hg9apvOe2zmpZJpyt+BMtzUWlVqbhFmMK6bOBXLBUPd7iRtIF9fZplDc7KrPN3PN7w==} + peerDependencies: + pg: '>=8.0' + + pg-pool@3.13.0: + resolution: {integrity: sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==} peerDependencies: pg: '>=8.0' pg-proto-parser@1.30.4: resolution: {integrity: sha512-+9/n8zfYQVNRc8KGhxxNXO8NA5OKni01IPtit6+C3sLMtcRVVFCj4W0XtrEGFivNjz2qwUtFmRhG8OGMTxs6hg==} - pg-protocol@1.12.0: - resolution: {integrity: sha512-uOANXNRACNdElMXJ0tPz6RBM0XQ61nONGAwlt8da5zs/iUOOCLBQOHSXnrC6fMsvtjxbOJrZZl5IScGv+7mpbg==} + pg-protocol@1.11.0: + resolution: {integrity: sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==} + + pg-protocol@1.13.0: + resolution: {integrity: sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==} pg-sql2@5.0.0-rc.4: resolution: {integrity: sha512-f8um4jNwumksk39zhkdps9jXeCkM3SY22gPjAcq45D/ZTIw2zWHMdsS6H5DE3XdeHy6pyGUzY0urmCgwuhiywg==} @@ -8424,6 +8432,15 @@ packages: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} + pg@8.17.1: + resolution: {integrity: sha512-EIR+jXdYNSMOrpRp7g6WgQr7SaZNZfS7IzZIO0oTNEeibq956JxeD15t3Jk3zZH0KH8DmOIx38qJfQenoE8bXQ==} + engines: {node: '>= 16.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + pg@8.19.0: resolution: {integrity: sha512-QIcLGi508BAHkQ3pJNptsFz5WQMlpGbuBGBaIaXsWK8mel2kQ/rThYI+DbgjUvZrIr7MiuEuc9LcChJoEZK1xQ==} engines: {node: '>= 16.0.0'} @@ -9168,8 +9185,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@2.2.0: - resolution: {integrity: sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==} + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} styled-components@5.3.11: resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} @@ -9421,9 +9438,6 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@7.22.0: resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} engines: {node: '>=20.18.1'} @@ -9767,7 +9781,7 @@ snapshots: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-locate-window': 3.965.4 + '@aws-sdk/util-locate-window': 3.965.2 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -9777,7 +9791,7 @@ snapshots: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-locate-window': 3.965.4 + '@aws-sdk/util-locate-window': 3.965.2 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -9797,80 +9811,80 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.1001.0': + '@aws-sdk/client-s3@3.1002.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.16 - '@aws-sdk/credential-provider-node': 3.972.15 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/credential-provider-node': 3.972.16 '@aws-sdk/middleware-bucket-endpoint': 3.972.6 '@aws-sdk/middleware-expect-continue': 3.972.6 - '@aws-sdk/middleware-flexible-checksums': 3.973.2 + '@aws-sdk/middleware-flexible-checksums': 3.973.3 '@aws-sdk/middleware-host-header': 3.972.6 '@aws-sdk/middleware-location-constraint': 3.972.6 '@aws-sdk/middleware-logger': 3.972.6 '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-sdk-s3': 3.972.16 + '@aws-sdk/middleware-sdk-s3': 3.972.17 '@aws-sdk/middleware-ssec': 3.972.6 - '@aws-sdk/middleware-user-agent': 3.972.16 + '@aws-sdk/middleware-user-agent': 3.972.17 '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/signature-v4-multi-region': 3.996.4 + '@aws-sdk/signature-v4-multi-region': 3.996.5 '@aws-sdk/types': 3.973.4 '@aws-sdk/util-endpoints': 3.996.3 '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.1 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.7 - '@smithy/eventstream-serde-browser': 4.2.10 - '@smithy/eventstream-serde-config-resolver': 4.3.10 - '@smithy/eventstream-serde-node': 4.2.10 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/hash-blob-browser': 4.2.11 - '@smithy/hash-node': 4.2.10 - '@smithy/hash-stream-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/md5-js': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-retry': 4.4.38 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.13 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 + '@aws-sdk/util-user-agent-node': 3.973.2 + '@smithy/config-resolver': 4.4.10 + '@smithy/core': 3.23.8 + '@smithy/eventstream-serde-browser': 4.2.11 + '@smithy/eventstream-serde-config-resolver': 4.3.11 + '@smithy/eventstream-serde-node': 4.2.11 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/hash-blob-browser': 4.2.12 + '@smithy/hash-node': 4.2.11 + '@smithy/hash-stream-node': 4.2.11 + '@smithy/invalid-dependency': 4.2.11 + '@smithy/md5-js': 4.2.11 + '@smithy/middleware-content-length': 4.2.11 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-retry': 4.4.39 + '@smithy/middleware-serde': 4.2.12 + '@smithy/middleware-stack': 4.2.11 + '@smithy/node-config-provider': 4.3.11 + '@smithy/node-http-handler': 4.4.14 + '@smithy/protocol-http': 5.3.11 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.37 - '@smithy/util-defaults-mode-node': 4.2.40 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-stream': 4.5.16 - '@smithy/util-utf8': 4.2.1 - '@smithy/util-waiter': 4.2.10 + '@smithy/url-parser': 4.2.11 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.38 + '@smithy/util-defaults-mode-node': 4.2.41 + '@smithy/util-endpoints': 3.3.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-retry': 4.2.11 + '@smithy/util-stream': 4.5.17 + '@smithy/util-utf8': 4.2.2 + '@smithy/util-waiter': 4.2.11 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.973.16': + '@aws-sdk/core@3.973.17': dependencies: '@aws-sdk/types': 3.973.4 '@aws-sdk/xml-builder': 3.972.9 - '@smithy/core': 3.23.7 - '@smithy/node-config-provider': 4.3.10 - '@smithy/property-provider': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/signature-v4': 5.3.10 - '@smithy/smithy-client': 4.12.1 + '@smithy/core': 3.23.8 + '@smithy/node-config-provider': 4.3.11 + '@smithy/property-provider': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/signature-v4': 5.3.11 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-utf8': 4.2.1 + '@smithy/util-base64': 4.3.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 '@aws-sdk/crc64-nvme@3.972.3': @@ -9878,116 +9892,116 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.14': + '@aws-sdk/credential-provider-env@3.972.15': dependencies: - '@aws-sdk/core': 3.973.16 + '@aws-sdk/core': 3.973.17 '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 + '@smithy/property-provider': 4.2.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.16': + '@aws-sdk/credential-provider-http@3.972.17': dependencies: - '@aws-sdk/core': 3.973.16 + '@aws-sdk/core': 3.973.17 '@aws-sdk/types': 3.973.4 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/node-http-handler': 4.4.13 - '@smithy/property-provider': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/node-http-handler': 4.4.14 + '@smithy/property-provider': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 - '@smithy/util-stream': 4.5.16 + '@smithy/util-stream': 4.5.17 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.14': + '@aws-sdk/credential-provider-ini@3.972.15': dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/credential-provider-env': 3.972.14 - '@aws-sdk/credential-provider-http': 3.972.16 - '@aws-sdk/credential-provider-login': 3.972.14 - '@aws-sdk/credential-provider-process': 3.972.14 - '@aws-sdk/credential-provider-sso': 3.972.14 - '@aws-sdk/credential-provider-web-identity': 3.972.14 - '@aws-sdk/nested-clients': 3.996.4 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/credential-provider-env': 3.972.15 + '@aws-sdk/credential-provider-http': 3.972.17 + '@aws-sdk/credential-provider-login': 3.972.15 + '@aws-sdk/credential-provider-process': 3.972.15 + '@aws-sdk/credential-provider-sso': 3.972.15 + '@aws-sdk/credential-provider-web-identity': 3.972.15 + '@aws-sdk/nested-clients': 3.996.5 '@aws-sdk/types': 3.973.4 - '@smithy/credential-provider-imds': 4.2.10 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/credential-provider-imds': 4.2.11 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 '@smithy/types': 4.13.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.972.14': + '@aws-sdk/credential-provider-login@3.972.15': dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/nested-clients': 3.996.4 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/nested-clients': 3.996.5 '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/property-provider': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/shared-ini-file-loader': 4.4.6 '@smithy/types': 4.13.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.972.15': + '@aws-sdk/credential-provider-node@3.972.16': dependencies: - '@aws-sdk/credential-provider-env': 3.972.14 - '@aws-sdk/credential-provider-http': 3.972.16 - '@aws-sdk/credential-provider-ini': 3.972.14 - '@aws-sdk/credential-provider-process': 3.972.14 - '@aws-sdk/credential-provider-sso': 3.972.14 - '@aws-sdk/credential-provider-web-identity': 3.972.14 + '@aws-sdk/credential-provider-env': 3.972.15 + '@aws-sdk/credential-provider-http': 3.972.17 + '@aws-sdk/credential-provider-ini': 3.972.15 + '@aws-sdk/credential-provider-process': 3.972.15 + '@aws-sdk/credential-provider-sso': 3.972.15 + '@aws-sdk/credential-provider-web-identity': 3.972.15 '@aws-sdk/types': 3.973.4 - '@smithy/credential-provider-imds': 4.2.10 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/credential-provider-imds': 4.2.11 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 '@smithy/types': 4.13.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.972.14': + '@aws-sdk/credential-provider-process@3.972.15': dependencies: - '@aws-sdk/core': 3.973.16 + '@aws-sdk/core': 3.973.17 '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.14': + '@aws-sdk/credential-provider-sso@3.972.15': dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/nested-clients': 3.996.4 - '@aws-sdk/token-providers': 3.1001.0 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/nested-clients': 3.996.5 + '@aws-sdk/token-providers': 3.1002.0 '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 '@smithy/types': 4.13.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.14': + '@aws-sdk/credential-provider-web-identity@3.972.15': dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/nested-clients': 3.996.4 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/nested-clients': 3.996.5 '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 '@smithy/types': 4.13.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/lib-storage@3.1001.0(@aws-sdk/client-s3@3.1001.0)': + '@aws-sdk/lib-storage@3.1002.0(@aws-sdk/client-s3@3.1002.0)': dependencies: - '@aws-sdk/client-s3': 3.1001.0 - '@smithy/abort-controller': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/smithy-client': 4.12.1 + '@aws-sdk/client-s3': 3.1002.0 + '@smithy/abort-controller': 4.2.11 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/smithy-client': 4.12.2 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 @@ -9997,40 +10011,40 @@ snapshots: dependencies: '@aws-sdk/types': 3.973.4 '@aws-sdk/util-arn-parser': 3.972.2 - '@smithy/node-config-provider': 4.3.10 - '@smithy/protocol-http': 5.3.10 + '@smithy/node-config-provider': 4.3.11 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 - '@smithy/util-config-provider': 4.2.1 + '@smithy/util-config-provider': 4.2.2 tslib: 2.8.1 '@aws-sdk/middleware-expect-continue@3.972.6': dependencies: '@aws-sdk/types': 3.973.4 - '@smithy/protocol-http': 5.3.10 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.973.2': + '@aws-sdk/middleware-flexible-checksums@3.973.3': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.973.16 + '@aws-sdk/core': 3.973.17 '@aws-sdk/crc64-nvme': 3.972.3 '@aws-sdk/types': 3.973.4 - '@smithy/is-array-buffer': 4.2.1 - '@smithy/node-config-provider': 4.3.10 - '@smithy/protocol-http': 5.3.10 + '@smithy/is-array-buffer': 4.2.2 + '@smithy/node-config-provider': 4.3.11 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-stream': 4.5.16 - '@smithy/util-utf8': 4.2.1 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-stream': 4.5.17 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 '@aws-sdk/middleware-host-header@3.972.6': dependencies: '@aws-sdk/types': 3.973.4 - '@smithy/protocol-http': 5.3.10 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 tslib: 2.8.1 @@ -10050,25 +10064,25 @@ snapshots: dependencies: '@aws-sdk/types': 3.973.4 '@aws/lambda-invoke-store': 0.2.3 - '@smithy/protocol-http': 5.3.10 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.16': + '@aws-sdk/middleware-sdk-s3@3.972.17': dependencies: - '@aws-sdk/core': 3.973.16 + '@aws-sdk/core': 3.973.17 '@aws-sdk/types': 3.973.4 '@aws-sdk/util-arn-parser': 3.972.2 - '@smithy/core': 3.23.7 - '@smithy/node-config-provider': 4.3.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/signature-v4': 5.3.10 - '@smithy/smithy-client': 4.12.1 + '@smithy/core': 3.23.8 + '@smithy/node-config-provider': 4.3.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/signature-v4': 5.3.11 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 - '@smithy/util-config-provider': 4.2.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-stream': 4.5.16 - '@smithy/util-utf8': 4.2.1 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-stream': 4.5.17 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 '@aws-sdk/middleware-ssec@3.972.6': @@ -10077,55 +10091,55 @@ snapshots: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.16': + '@aws-sdk/middleware-user-agent@3.972.17': dependencies: - '@aws-sdk/core': 3.973.16 + '@aws-sdk/core': 3.973.17 '@aws-sdk/types': 3.973.4 '@aws-sdk/util-endpoints': 3.996.3 - '@smithy/core': 3.23.7 - '@smithy/protocol-http': 5.3.10 + '@smithy/core': 3.23.8 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.996.4': + '@aws-sdk/nested-clients@3.996.5': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.16 + '@aws-sdk/core': 3.973.17 '@aws-sdk/middleware-host-header': 3.972.6 '@aws-sdk/middleware-logger': 3.972.6 '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-user-agent': 3.972.16 + '@aws-sdk/middleware-user-agent': 3.972.17 '@aws-sdk/region-config-resolver': 3.972.6 '@aws-sdk/types': 3.973.4 '@aws-sdk/util-endpoints': 3.996.3 '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.1 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.7 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/hash-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-retry': 4.4.38 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.13 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 + '@aws-sdk/util-user-agent-node': 3.973.2 + '@smithy/config-resolver': 4.4.10 + '@smithy/core': 3.23.8 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/hash-node': 4.2.11 + '@smithy/invalid-dependency': 4.2.11 + '@smithy/middleware-content-length': 4.2.11 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-retry': 4.4.39 + '@smithy/middleware-serde': 4.2.12 + '@smithy/middleware-stack': 4.2.11 + '@smithy/node-config-provider': 4.3.11 + '@smithy/node-http-handler': 4.4.14 + '@smithy/protocol-http': 5.3.11 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.37 - '@smithy/util-defaults-mode-node': 4.2.40 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-utf8': 4.2.1 + '@smithy/url-parser': 4.2.11 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.38 + '@smithy/util-defaults-mode-node': 4.2.41 + '@smithy/util-endpoints': 3.3.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-retry': 4.2.11 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -10133,27 +10147,27 @@ snapshots: '@aws-sdk/region-config-resolver@3.972.6': dependencies: '@aws-sdk/types': 3.973.4 - '@smithy/config-resolver': 4.4.9 - '@smithy/node-config-provider': 4.3.10 + '@smithy/config-resolver': 4.4.10 + '@smithy/node-config-provider': 4.3.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.996.4': + '@aws-sdk/signature-v4-multi-region@3.996.5': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.16 + '@aws-sdk/middleware-sdk-s3': 3.972.17 '@aws-sdk/types': 3.973.4 - '@smithy/protocol-http': 5.3.10 - '@smithy/signature-v4': 5.3.10 + '@smithy/protocol-http': 5.3.11 + '@smithy/signature-v4': 5.3.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1001.0': + '@aws-sdk/token-providers@3.1002.0': dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/nested-clients': 3.996.4 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/nested-clients': 3.996.5 '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 '@smithy/types': 4.13.0 tslib: 2.8.1 transitivePeerDependencies: @@ -10172,11 +10186,11 @@ snapshots: dependencies: '@aws-sdk/types': 3.973.4 '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-endpoints': 3.3.1 + '@smithy/url-parser': 4.2.11 + '@smithy/util-endpoints': 3.3.2 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.965.4': + '@aws-sdk/util-locate-window@3.965.2': dependencies: tslib: 2.8.1 @@ -10184,14 +10198,14 @@ snapshots: dependencies: '@aws-sdk/types': 3.973.4 '@smithy/types': 4.13.0 - bowser: 2.14.1 + bowser: 2.13.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.973.1': + '@aws-sdk/util-user-agent-node@3.973.2': dependencies: - '@aws-sdk/middleware-user-agent': 3.972.16 + '@aws-sdk/middleware-user-agent': 3.972.17 '@aws-sdk/types': 3.973.4 - '@smithy/node-config-provider': 4.3.10 + '@smithy/node-config-provider': 4.3.11 '@smithy/types': 4.13.0 tslib: 2.8.1 @@ -10415,7 +10429,7 @@ snapshots: dependencies: '@babel/code-frame': 7.28.6 '@babel/parser': 7.28.6 - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@babel/template@7.28.6': dependencies: @@ -10430,7 +10444,7 @@ snapshots: '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.6 '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -10777,20 +10791,6 @@ snapshots: - immer - use-sync-external-store - '@graphiql/plugin-doc-explorer@0.4.1(@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/react@19.2.14)(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': - dependencies: - '@graphiql/react': 0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - '@headlessui/react': 2.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - graphql: 16.13.0 - react: 19.2.4 - react-compiler-runtime: 19.1.0-rc.1(react@19.2.4) - react-dom: 19.2.4(react@19.2.4) - zustand: 5.0.11(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - transitivePeerDependencies: - - '@types/react' - - immer - - use-sync-external-store - '@graphiql/plugin-history@0.4.1(@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.11)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/node@22.19.11)(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': dependencies: '@graphiql/react': 0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.11)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) @@ -10807,22 +10807,6 @@ snapshots: - immer - use-sync-external-store - '@graphiql/plugin-history@0.4.1(@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/node@25.3.3)(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': - dependencies: - '@graphiql/react': 0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - '@graphiql/toolkit': 0.11.3(@types/node@25.3.3)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0) - react: 19.2.4 - react-compiler-runtime: 19.1.0-rc.1(react@19.2.4) - react-dom: 19.2.4(react@19.2.4) - zustand: 5.0.11(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - transitivePeerDependencies: - - '@types/node' - - '@types/react' - - graphql - - graphql-ws - - immer - - use-sync-external-store - '@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.11)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': dependencies: '@graphiql/toolkit': 0.11.3(@types/node@22.19.11)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0) @@ -10854,37 +10838,6 @@ snapshots: - immer - use-sync-external-store - '@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': - dependencies: - '@graphiql/toolkit': 0.11.3(@types/node@25.3.3)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-visually-hidden': 1.2.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - clsx: 1.2.1 - framer-motion: 12.34.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - get-value: 3.0.1 - graphql: 16.13.0 - graphql-language-service: 5.5.0(graphql@16.13.0) - jsonc-parser: 3.3.1 - markdown-it: 14.1.1 - monaco-editor: 0.52.2 - monaco-graphql: 1.7.3(graphql@16.13.0)(monaco-editor@0.52.2)(prettier@3.8.1) - prettier: 3.8.1 - react: 19.2.4 - react-compiler-runtime: 19.1.0-rc.1(react@19.2.4) - react-dom: 19.2.4(react@19.2.4) - set-value: 4.1.0 - zustand: 5.0.11(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - transitivePeerDependencies: - - '@emotion/is-prop-valid' - - '@types/node' - - '@types/react' - - '@types/react-dom' - - graphql-ws - - immer - - use-sync-external-store - '@graphiql/toolkit@0.11.3(@types/node@22.19.11)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)': dependencies: '@n1ru4l/push-pull-async-iterable-iterator': 3.2.0 @@ -10895,16 +10848,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@graphiql/toolkit@0.11.3(@types/node@25.3.3)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)': - dependencies: - '@n1ru4l/push-pull-async-iterable-iterator': 3.2.0 - graphql: 16.13.0 - meros: 1.3.2(@types/node@25.3.3) - optionalDependencies: - graphql-ws: 6.0.7(graphql@16.13.0)(ws@8.19.0) - transitivePeerDependencies: - - '@types/node' - '@graphql-typed-document-node/core@3.2.0(graphql@16.13.0)': dependencies: graphql: 16.13.0 @@ -11290,7 +11233,7 @@ snapshots: read-cmd-shim: 4.0.0 resolve-from: 5.0.0 rimraf: 4.4.1 - semver: 7.7.3 + semver: 7.7.4 set-blocking: 2.0.0 signal-exit: 3.0.7 slash: 3.0.0 @@ -11379,7 +11322,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 json-stringify-nice: 1.1.4 lru-cache: 10.4.3 - minimatch: 9.0.9 + minimatch: 9.0.5 nopt: 7.2.1 npm-install-checks: 6.3.0 npm-package-arg: 11.0.2 @@ -11392,7 +11335,7 @@ snapshots: promise-all-reject-late: 1.0.1 promise-call-limit: 3.0.2 read-package-json-fast: 3.0.2 - semver: 7.7.3 + semver: 7.7.4 ssri: 10.0.6 treeverse: 3.0.0 walk-up-path: 3.0.1 @@ -11402,7 +11345,7 @@ snapshots: '@npmcli/fs@3.1.1': dependencies: - semver: 7.7.3 + semver: 7.7.4 '@npmcli/git@5.0.8': dependencies: @@ -11413,7 +11356,7 @@ snapshots: proc-log: 4.2.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.7.3 + semver: 7.7.4 which: 4.0.0 transitivePeerDependencies: - bluebird @@ -11427,7 +11370,7 @@ snapshots: dependencies: '@npmcli/name-from-folder': 2.0.0 glob: 10.5.0 - minimatch: 9.0.9 + minimatch: 9.0.5 read-package-json-fast: 3.0.2 '@npmcli/metavuln-calculator@7.1.1': @@ -11436,7 +11379,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 pacote: 18.0.6 proc-log: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - bluebird - supports-color @@ -11453,7 +11396,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 normalize-package-data: 6.0.2 proc-log: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - bluebird @@ -11486,7 +11429,7 @@ snapshots: ignore: 5.3.2 minimatch: 9.0.3 nx: 20.8.3 - semver: 7.7.3 + semver: 7.7.4 tmp: 0.2.5 tslib: 2.8.1 yargs-parser: 21.1.1 @@ -12207,109 +12150,109 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@4.2.10': + '@smithy/abort-controller@4.2.11': dependencies: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader-native@4.2.2': + '@smithy/chunked-blob-reader-native@4.2.3': dependencies: - '@smithy/util-base64': 4.3.1 + '@smithy/util-base64': 4.3.2 tslib: 2.8.1 - '@smithy/chunked-blob-reader@5.2.1': + '@smithy/chunked-blob-reader@5.2.2': dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.4.9': + '@smithy/config-resolver@4.4.10': dependencies: - '@smithy/node-config-provider': 4.3.10 + '@smithy/node-config-provider': 4.3.11 '@smithy/types': 4.13.0 - '@smithy/util-config-provider': 4.2.1 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-endpoints': 3.3.2 + '@smithy/util-middleware': 4.2.11 tslib: 2.8.1 - '@smithy/core@3.23.7': + '@smithy/core@3.23.8': dependencies: - '@smithy/middleware-serde': 4.2.11 - '@smithy/protocol-http': 5.3.10 + '@smithy/middleware-serde': 4.2.12 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-stream': 4.5.16 - '@smithy/util-utf8': 4.2.1 - '@smithy/uuid': 1.1.1 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-stream': 4.5.17 + '@smithy/util-utf8': 4.2.2 + '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.2.10': + '@smithy/credential-provider-imds@4.2.11': dependencies: - '@smithy/node-config-provider': 4.3.10 - '@smithy/property-provider': 4.2.10 + '@smithy/node-config-provider': 4.3.11 + '@smithy/property-provider': 4.2.11 '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 + '@smithy/url-parser': 4.2.11 tslib: 2.8.1 - '@smithy/eventstream-codec@4.2.10': + '@smithy/eventstream-codec@4.2.11': dependencies: '@aws-crypto/crc32': 5.2.0 '@smithy/types': 4.13.0 - '@smithy/util-hex-encoding': 4.2.1 + '@smithy/util-hex-encoding': 4.2.2 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.2.10': + '@smithy/eventstream-serde-browser@4.2.11': dependencies: - '@smithy/eventstream-serde-universal': 4.2.10 + '@smithy/eventstream-serde-universal': 4.2.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.3.10': + '@smithy/eventstream-serde-config-resolver@4.3.11': dependencies: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.2.10': + '@smithy/eventstream-serde-node@4.2.11': dependencies: - '@smithy/eventstream-serde-universal': 4.2.10 + '@smithy/eventstream-serde-universal': 4.2.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.2.10': + '@smithy/eventstream-serde-universal@4.2.11': dependencies: - '@smithy/eventstream-codec': 4.2.10 + '@smithy/eventstream-codec': 4.2.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.3.12': + '@smithy/fetch-http-handler@5.3.13': dependencies: - '@smithy/protocol-http': 5.3.10 - '@smithy/querystring-builder': 4.2.10 + '@smithy/protocol-http': 5.3.11 + '@smithy/querystring-builder': 4.2.11 '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 + '@smithy/util-base64': 4.3.2 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.2.11': + '@smithy/hash-blob-browser@4.2.12': dependencies: - '@smithy/chunked-blob-reader': 5.2.1 - '@smithy/chunked-blob-reader-native': 4.2.2 + '@smithy/chunked-blob-reader': 5.2.2 + '@smithy/chunked-blob-reader-native': 4.2.3 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/hash-node@4.2.10': + '@smithy/hash-node@4.2.11': dependencies: '@smithy/types': 4.13.0 - '@smithy/util-buffer-from': 4.2.1 - '@smithy/util-utf8': 4.2.1 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/hash-stream-node@4.2.10': + '@smithy/hash-stream-node@4.2.11': dependencies: '@smithy/types': 4.13.0 - '@smithy/util-utf8': 4.2.1 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/invalid-dependency@4.2.10': + '@smithy/invalid-dependency@4.2.11': dependencies: '@smithy/types': 4.13.0 tslib: 2.8.1 @@ -12318,143 +12261,143 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.2.1': + '@smithy/is-array-buffer@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.2.10': + '@smithy/md5-js@4.2.11': dependencies: '@smithy/types': 4.13.0 - '@smithy/util-utf8': 4.2.1 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/middleware-content-length@4.2.10': + '@smithy/middleware-content-length@4.2.11': dependencies: - '@smithy/protocol-http': 5.3.10 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.21': + '@smithy/middleware-endpoint@4.4.22': dependencies: - '@smithy/core': 3.23.7 - '@smithy/middleware-serde': 4.2.11 - '@smithy/node-config-provider': 4.3.10 - '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/core': 3.23.8 + '@smithy/middleware-serde': 4.2.12 + '@smithy/node-config-provider': 4.3.11 + '@smithy/shared-ini-file-loader': 4.4.6 '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-middleware': 4.2.10 + '@smithy/url-parser': 4.2.11 + '@smithy/util-middleware': 4.2.11 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.38': + '@smithy/middleware-retry@4.4.39': dependencies: - '@smithy/node-config-provider': 4.3.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/service-error-classification': 4.2.10 - '@smithy/smithy-client': 4.12.1 + '@smithy/node-config-provider': 4.3.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/service-error-classification': 4.2.11 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/uuid': 1.1.1 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-retry': 4.2.11 + '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/middleware-serde@4.2.11': + '@smithy/middleware-serde@4.2.12': dependencies: - '@smithy/protocol-http': 5.3.10 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/middleware-stack@4.2.10': + '@smithy/middleware-stack@4.2.11': dependencies: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.3.10': + '@smithy/node-config-provider@4.3.11': dependencies: - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.4.13': + '@smithy/node-http-handler@4.4.14': dependencies: - '@smithy/abort-controller': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/querystring-builder': 4.2.10 + '@smithy/abort-controller': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/querystring-builder': 4.2.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/property-provider@4.2.10': + '@smithy/property-provider@4.2.11': dependencies: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/protocol-http@5.3.10': + '@smithy/protocol-http@5.3.11': dependencies: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/querystring-builder@4.2.10': + '@smithy/querystring-builder@4.2.11': dependencies: '@smithy/types': 4.13.0 - '@smithy/util-uri-escape': 4.2.1 + '@smithy/util-uri-escape': 4.2.2 tslib: 2.8.1 - '@smithy/querystring-parser@4.2.10': + '@smithy/querystring-parser@4.2.11': dependencies: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/service-error-classification@4.2.10': + '@smithy/service-error-classification@4.2.11': dependencies: '@smithy/types': 4.13.0 - '@smithy/shared-ini-file-loader@4.4.5': + '@smithy/shared-ini-file-loader@4.4.6': dependencies: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/signature-v4@5.3.10': + '@smithy/signature-v4@5.3.11': dependencies: - '@smithy/is-array-buffer': 4.2.1 - '@smithy/protocol-http': 5.3.10 + '@smithy/is-array-buffer': 4.2.2 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 - '@smithy/util-hex-encoding': 4.2.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-uri-escape': 4.2.1 - '@smithy/util-utf8': 4.2.1 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-uri-escape': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/smithy-client@4.12.1': + '@smithy/smithy-client@4.12.2': dependencies: - '@smithy/core': 3.23.7 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-stack': 4.2.10 - '@smithy/protocol-http': 5.3.10 + '@smithy/core': 3.23.8 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-stack': 4.2.11 + '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.13.0 - '@smithy/util-stream': 4.5.16 + '@smithy/util-stream': 4.5.17 tslib: 2.8.1 '@smithy/types@4.13.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.2.10': + '@smithy/url-parser@4.2.11': dependencies: - '@smithy/querystring-parser': 4.2.10 + '@smithy/querystring-parser': 4.2.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/util-base64@4.3.1': + '@smithy/util-base64@4.3.2': dependencies: - '@smithy/util-buffer-from': 4.2.1 - '@smithy/util-utf8': 4.2.1 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/util-body-length-browser@4.2.1': + '@smithy/util-body-length-browser@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@4.2.2': + '@smithy/util-body-length-node@4.2.3': dependencies: tslib: 2.8.1 @@ -12463,65 +12406,65 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.2.1': + '@smithy/util-buffer-from@4.2.2': dependencies: - '@smithy/is-array-buffer': 4.2.1 + '@smithy/is-array-buffer': 4.2.2 tslib: 2.8.1 - '@smithy/util-config-provider@4.2.1': + '@smithy/util-config-provider@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.37': + '@smithy/util-defaults-mode-browser@4.3.38': dependencies: - '@smithy/property-provider': 4.2.10 - '@smithy/smithy-client': 4.12.1 + '@smithy/property-provider': 4.2.11 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.40': + '@smithy/util-defaults-mode-node@4.2.41': dependencies: - '@smithy/config-resolver': 4.4.9 - '@smithy/credential-provider-imds': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/property-provider': 4.2.10 - '@smithy/smithy-client': 4.12.1 + '@smithy/config-resolver': 4.4.10 + '@smithy/credential-provider-imds': 4.2.11 + '@smithy/node-config-provider': 4.3.11 + '@smithy/property-provider': 4.2.11 + '@smithy/smithy-client': 4.12.2 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/util-endpoints@3.3.1': + '@smithy/util-endpoints@3.3.2': dependencies: - '@smithy/node-config-provider': 4.3.10 + '@smithy/node-config-provider': 4.3.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/util-hex-encoding@4.2.1': + '@smithy/util-hex-encoding@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.2.10': + '@smithy/util-middleware@4.2.11': dependencies: '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/util-retry@4.2.10': + '@smithy/util-retry@4.2.11': dependencies: - '@smithy/service-error-classification': 4.2.10 + '@smithy/service-error-classification': 4.2.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/util-stream@4.5.16': + '@smithy/util-stream@4.5.17': dependencies: - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/node-http-handler': 4.4.13 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/node-http-handler': 4.4.14 '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 - '@smithy/util-buffer-from': 4.2.1 - '@smithy/util-hex-encoding': 4.2.1 - '@smithy/util-utf8': 4.2.1 + '@smithy/util-base64': 4.3.2 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/util-uri-escape@4.2.1': + '@smithy/util-uri-escape@4.2.2': dependencies: tslib: 2.8.1 @@ -12530,18 +12473,18 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.2.1': + '@smithy/util-utf8@4.2.2': dependencies: - '@smithy/util-buffer-from': 4.2.1 + '@smithy/util-buffer-from': 4.2.2 tslib: 2.8.1 - '@smithy/util-waiter@4.2.10': + '@smithy/util-waiter@4.2.11': dependencies: - '@smithy/abort-controller': 4.2.10 + '@smithy/abort-controller': 4.2.11 '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/uuid@1.1.1': + '@smithy/uuid@1.1.2': dependencies: tslib: 2.8.1 @@ -12659,7 +12602,7 @@ snapshots: '@tufjs/models@2.0.1': dependencies: '@tufjs/canonical-json': 2.0.0 - minimatch: 9.0.9 + minimatch: 9.0.5 '@tybys/wasm-util@0.10.1': dependencies: @@ -12808,10 +12751,6 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@25.3.3': - dependencies: - undici-types: 7.18.2 - '@types/nodemailer@7.0.11': dependencies: '@types/node': 22.19.11 @@ -12826,7 +12765,7 @@ snapshots: '@types/pg@8.18.0': dependencies: '@types/node': 22.19.11 - pg-protocol: 1.12.0 + pg-protocol: 1.11.0 pg-types: 2.2.0 '@types/pluralize@0.0.33': {} @@ -13048,7 +12987,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.3.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.6 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) @@ -13056,7 +12995,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@25.3.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.11)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -13306,7 +13245,7 @@ snapshots: boolbase@1.0.0: {} - bowser@2.14.1: {} + bowser@2.13.1: {} brace-expansion@1.1.12: dependencies: @@ -13632,7 +13571,7 @@ snapshots: handlebars: 4.7.8 json-stringify-safe: 5.0.1 meow: 8.1.2 - semver: 7.7.3 + semver: 7.7.4 split: 1.0.1 conventional-commits-filter@3.0.0: @@ -13668,7 +13607,7 @@ snapshots: copyfiles@2.4.1: dependencies: glob: 7.2.3 - minimatch: 3.1.5 + minimatch: 3.1.2 mkdirp: 1.0.4 noms: 0.0.0 through2: 2.0.5 @@ -13890,10 +13829,10 @@ snapshots: dotenv@16.4.7: {} - drizzle-orm@0.45.1(@types/pg@8.18.0)(pg@8.19.0): + drizzle-orm@0.45.1(@types/pg@8.18.0)(pg@8.17.1): optionalDependencies: '@types/pg': 8.18.0 - pg: 8.19.0 + pg: 8.17.1 dunder-proto@1.0.1: dependencies: @@ -14242,7 +14181,7 @@ snapshots: fast-xml-parser@5.4.1: dependencies: fast-xml-builder: 1.0.0 - strnum: 2.2.0 + strnum: 2.1.2 fastq@1.20.1: dependencies: @@ -14266,7 +14205,7 @@ snapshots: filelist@1.0.4: dependencies: - minimatch: 5.1.9 + minimatch: 5.1.6 fill-range@7.1.1: dependencies: @@ -14445,7 +14384,7 @@ snapshots: git-semver-tags@5.0.1: dependencies: meow: 8.1.2 - semver: 7.7.3 + semver: 7.7.4 git-up@7.0.0: dependencies: @@ -14472,7 +14411,7 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 - minimatch: 9.0.9 + minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 @@ -14503,14 +14442,14 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.5 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 glob@9.3.5: dependencies: fs.realpath: 1.0.0 - minimatch: 8.0.7 + minimatch: 8.0.4 minipass: 4.2.8 path-scurry: 1.11.1 @@ -14558,31 +14497,6 @@ snapshots: - supports-color - use-sync-external-store - grafserv@1.0.0-rc.6(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0): - dependencies: - '@graphile/lru': 5.0.0-rc.4 - debug: 4.4.3(supports-color@5.5.0) - eventemitter3: 5.0.4 - grafast: 1.0.0-rc.7(graphql@16.13.0) - graphile-config: 1.0.0-rc.5 - graphql: 16.13.0 - graphql-ws: 6.0.7(graphql@16.13.0)(ws@8.19.0) - ruru: 2.0.0-rc.6(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(debug@4.4.3)(graphile-config@1.0.0-rc.5)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - tslib: 2.8.1 - optionalDependencies: - ws: 8.19.0 - transitivePeerDependencies: - - '@fastify/websocket' - - '@types/node' - - '@types/react' - - '@types/react-dom' - - crossws - - immer - - react - - react-dom - - supports-color - - use-sync-external-store - graphile-build-pg@5.0.0-rc.5(@dataplan/pg@1.0.0-rc.5(@dataplan/json@1.0.0-rc.5(grafast@1.0.0-rc.7(graphql@16.13.0)))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(pg-sql2@5.0.0-rc.4)(pg@8.19.0))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-build@5.0.0-rc.4(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(pg-sql2@5.0.0-rc.4)(pg@8.19.0)(tamedevil@0.1.0-rc.4): dependencies: '@dataplan/pg': 1.0.0-rc.5(@dataplan/json@1.0.0-rc.5(grafast@1.0.0-rc.7(graphql@16.13.0)))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(pg-sql2@5.0.0-rc.4)(pg@8.19.0) @@ -14685,24 +14599,6 @@ snapshots: - immer - use-sync-external-store - graphiql@5.2.2(@emotion/is-prop-valid@1.4.0)(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): - dependencies: - '@graphiql/plugin-doc-explorer': 0.4.1(@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/react@19.2.14)(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - '@graphiql/plugin-history': 0.4.1(@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/node@25.3.3)(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - '@graphiql/react': 0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - graphql: 16.13.0 - react: 19.2.4 - react-compiler-runtime: 19.1.0-rc.1(react@19.2.4) - react-dom: 19.2.4(react@19.2.4) - transitivePeerDependencies: - - '@emotion/is-prop-valid' - - '@types/node' - - '@types/react' - - '@types/react-dom' - - graphql-ws - - immer - - use-sync-external-store - graphql-language-service@5.5.0(graphql@16.13.0): dependencies: debounce-promise: 3.1.2 @@ -14870,7 +14766,7 @@ snapshots: ignore-walk@6.0.5: dependencies: - minimatch: 9.0.9 + minimatch: 9.0.5 ignore@5.3.2: {} @@ -14918,7 +14814,7 @@ snapshots: npm-package-arg: 11.0.2 promzard: 1.0.2 read: 3.0.1 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-license: 3.0.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -15631,7 +15527,7 @@ snapshots: npm-package-arg: 11.0.2 npm-registry-fetch: 17.1.0 proc-log: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 sigstore: 2.3.1 ssri: 10.0.6 transitivePeerDependencies: @@ -15751,7 +15647,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 make-error@1.3.6: {} @@ -15828,10 +15724,6 @@ snapshots: optionalDependencies: '@types/node': 22.19.11 - meros@1.3.2(@types/node@25.3.3): - optionalDependencies: - '@types/node': 25.3.3 - methods@1.1.2: {} micromatch@4.0.8: @@ -15875,15 +15767,11 @@ snapshots: dependencies: brace-expansion: 1.1.12 - minimatch@3.1.5: - dependencies: - brace-expansion: 1.1.12 - - minimatch@5.1.9: + minimatch@5.1.6: dependencies: brace-expansion: 2.0.2 - minimatch@8.0.7: + minimatch@8.0.4: dependencies: brace-expansion: 2.0.2 @@ -15895,7 +15783,7 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimatch@9.0.9: + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -16265,7 +16153,7 @@ snapshots: ms@2.1.3: {} - multer@2.1.0: + multer@2.1.1: dependencies: append-field: 1.0.0 busboy: 1.6.0 @@ -16278,7 +16166,7 @@ snapshots: array-differ: 3.0.0 array-union: 2.1.0 arrify: 2.0.1 - minimatch: 3.0.5 + minimatch: 3.1.2 mute-stream@0.0.8: {} @@ -16331,7 +16219,7 @@ snapshots: make-fetch-happen: 13.0.1 nopt: 7.2.1 proc-log: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 tar: 6.2.1 which: 4.0.0 transitivePeerDependencies: @@ -16386,13 +16274,13 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.16.1 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-license: 3.0.4 normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -16403,7 +16291,7 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 npm-normalize-package-bin@3.0.1: {} @@ -16411,7 +16299,7 @@ snapshots: dependencies: hosted-git-info: 7.0.2 proc-log: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-name: 5.0.1 npm-packlist@8.0.2: @@ -16423,7 +16311,7 @@ snapshots: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 11.0.2 - semver: 7.7.3 + semver: 7.7.4 npm-registry-fetch@17.1.0: dependencies: @@ -16479,7 +16367,7 @@ snapshots: open: 8.4.2 ora: 5.3.0 resolve.exports: 2.0.3 - semver: 7.7.3 + semver: 7.7.4 string-width: 4.2.3 tar-stream: 2.2.0 tmp: 0.2.5 @@ -16751,7 +16639,9 @@ snapshots: pg-cloudflare@1.3.0: optional: true - pg-connection-string@2.11.0: {} + pg-connection-string@2.10.0: {} + + pg-connection-string@2.12.0: {} pg-copy-streams@7.0.0: {} @@ -16761,7 +16651,11 @@ snapshots: dependencies: tslib: 2.8.1 - pg-pool@3.12.0(pg@8.19.0): + pg-pool@3.11.0(pg@8.17.1): + dependencies: + pg: 8.17.1 + + pg-pool@3.13.0(pg@8.19.0): dependencies: pg: 8.19.0 @@ -16779,7 +16673,9 @@ snapshots: transitivePeerDependencies: - supports-color - pg-protocol@1.12.0: {} + pg-protocol@1.11.0: {} + + pg-protocol@1.13.0: {} pg-sql2@5.0.0-rc.4: dependencies: @@ -16794,11 +16690,21 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 + pg@8.17.1: + dependencies: + pg-connection-string: 2.10.0 + pg-pool: 3.11.0(pg@8.17.1) + pg-protocol: 1.11.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.3.0 + pg@8.19.0: dependencies: - pg-connection-string: 2.11.0 - pg-pool: 3.12.0(pg@8.19.0) - pg-protocol: 1.12.0 + pg-connection-string: 2.12.0 + pg-pool: 3.13.0(pg@8.19.0) + pg-protocol: 1.13.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: @@ -16869,33 +16775,6 @@ snapshots: '@tsconfig/node20': 20.1.9 tslib: 2.8.1 - postgraphile@5.0.0-rc.7(56415cfaef0e792e7fc3250b8cf6023f): - dependencies: - '@dataplan/json': 1.0.0-rc.5(grafast@1.0.0-rc.7(graphql@16.13.0)) - '@dataplan/pg': 1.0.0-rc.5(@dataplan/json@1.0.0-rc.5(grafast@1.0.0-rc.7(graphql@16.13.0)))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(pg-sql2@5.0.0-rc.4)(pg@8.19.0) - '@graphile/lru': 5.0.0-rc.4 - '@types/node': 22.19.11 - '@types/pg': 8.18.0 - debug: 4.4.3(supports-color@5.5.0) - grafast: 1.0.0-rc.7(graphql@16.13.0) - grafserv: 1.0.0-rc.6(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) - graphile-build: 5.0.0-rc.4(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0) - graphile-build-pg: 5.0.0-rc.5(@dataplan/pg@1.0.0-rc.5(@dataplan/json@1.0.0-rc.5(grafast@1.0.0-rc.7(graphql@16.13.0)))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(pg-sql2@5.0.0-rc.4)(pg@8.19.0))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-build@5.0.0-rc.4(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(pg-sql2@5.0.0-rc.4)(pg@8.19.0)(tamedevil@0.1.0-rc.4) - graphile-config: 1.0.0-rc.5 - graphile-utils: 5.0.0-rc.6(@dataplan/pg@1.0.0-rc.5(@dataplan/json@1.0.0-rc.5(grafast@1.0.0-rc.7(graphql@16.13.0)))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(pg-sql2@5.0.0-rc.4)(pg@8.19.0))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-build-pg@5.0.0-rc.5(@dataplan/pg@1.0.0-rc.5(@dataplan/json@1.0.0-rc.5(grafast@1.0.0-rc.7(graphql@16.13.0)))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(pg-sql2@5.0.0-rc.4)(pg@8.19.0))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-build@5.0.0-rc.4(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(pg-sql2@5.0.0-rc.4)(pg@8.19.0)(tamedevil@0.1.0-rc.4))(graphile-build@5.0.0-rc.4(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(tamedevil@0.1.0-rc.4) - graphql: 16.13.0 - iterall: 1.3.0 - jsonwebtoken: 9.0.3 - pg: 8.19.0 - pg-sql2: 5.0.0-rc.4 - tamedevil: 0.1.0-rc.4 - tslib: 2.8.1 - ws: 8.19.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - postgraphile@5.0.0-rc.7(853bfb5f6928535d2602be94c7020fe8): dependencies: '@dataplan/json': 1.0.0-rc.5(grafast@1.0.0-rc.7(graphql@16.13.0)) @@ -17277,23 +17156,6 @@ snapshots: - immer - use-sync-external-store - ruru-types@2.0.0-rc.5(@emotion/is-prop-valid@1.4.0)(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): - dependencies: - '@graphiql/toolkit': 0.11.3(@types/node@25.3.3)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0) - graphiql: 5.2.2(@emotion/is-prop-valid@1.4.0)(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - graphql: 16.13.0 - optionalDependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - transitivePeerDependencies: - - '@emotion/is-prop-valid' - - '@types/node' - - '@types/react' - - '@types/react-dom' - - graphql-ws - - immer - - use-sync-external-store - ruru@2.0.0-rc.6(@types/node@22.19.11)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(debug@4.4.3)(graphile-config@1.0.0-rc.5)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): dependencies: '@emotion/is-prop-valid': 1.4.0 @@ -17315,27 +17177,6 @@ snapshots: - immer - use-sync-external-store - ruru@2.0.0-rc.6(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(debug@4.4.3)(graphile-config@1.0.0-rc.5)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): - dependencies: - '@emotion/is-prop-valid': 1.4.0 - graphile-config: 1.0.0-rc.5 - graphql: 16.13.0 - http-proxy: 1.18.1(debug@4.4.3) - ruru-types: 2.0.0-rc.5(@emotion/is-prop-valid@1.4.0)(@types/node@25.3.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - tslib: 2.8.1 - yargs: 17.7.2 - optionalDependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - transitivePeerDependencies: - - '@types/node' - - '@types/react' - - '@types/react-dom' - - debug - - graphql-ws - - immer - - use-sync-external-store - rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -17599,7 +17440,7 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@2.2.0: {} + strnum@2.1.2: {} styled-components@5.3.11(@babel/core@7.28.6)(react-dom@19.2.4(react@19.2.4))(react-is@19.2.4)(react@19.2.4): dependencies: @@ -17705,7 +17546,7 @@ snapshots: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 - minimatch: 3.1.5 + minimatch: 3.1.2 text-extensions@1.9.0: {} @@ -17790,24 +17631,6 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 25.3.3 - acorn: 8.15.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.9.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 @@ -17878,8 +17701,6 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.18.2: {} - undici@7.22.0: {} unique-filename@3.0.0: @@ -17985,7 +17806,7 @@ snapshots: vary@1.1.2: {} - vite@6.4.1(@types/node@25.3.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -17994,7 +17815,7 @@ snapshots: rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 22.19.11 fsevents: 2.3.3 jiti: 2.6.1 tsx: 4.21.0