diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 9a3628bf..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "env": { - "browser": true, - "es2021": true, - "node": true, - "jest": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "overrides": [], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint", - "simple-import-sort", - "unused-imports" - ], - "rules": { - "indent": [ - "error", - 2 - ], - "quotes": [ - "error", - "single", - { - "avoidEscape": true, - "allowTemplateLiterals": true - } - ], - "quote-props": [ - "error", - "as-needed" - ], - "semi": [ - "error", - "always" - ], - "simple-import-sort/imports": 1, - "simple-import-sort/exports": 1, - "unused-imports/no-unused-imports": 1, - "@typescript-eslint/no-unused-vars": [ - 1, - { - "argsIgnorePattern": "React|res|next|^_" - } - ], - "@typescript-eslint/no-explicit-any": 0, - "@typescript-eslint/no-var-requires": 0, - "no-console": 0, - "@typescript-eslint/ban-ts-comment": 0, - "prefer-const": 0, - "no-case-declarations": 0, - "no-implicit-globals": 0, - "@typescript-eslint/no-unsafe-declaration-merging": 0 - } -} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..ae09f855 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,41 @@ +import base from '@constructive-io/eslint-config'; + +export default [ + ...base, + { + ignores: [ + // fixtures and their expected codegen output + '__fixtures__/**', + '**/__snapshots__/**', + // protobuf codegen (build:proto) + 'packages/utils/src/asts.ts', + 'packages/utils/src/runtime-schema.ts', + 'packages/utils/src/wrapped.ts', + 'packages/traverse/src/18/**', + 'packages/transform-ast/src/{13,14,15,16,17,18}/**', + 'packages/proto-parser/test-utils/**', + // inferred/generated types and keyword list + 'packages/pgsql-types/src/types.ts', + 'packages/quotes/src/kwlist.ts', + // generated kitchen-sink test files + '**/__tests__/kitchen-sink/**' + ] + }, + { + // template literals holding code that is emitted verbatim; changing the + // escaping here would change the generated output + files: ['packages/proto-parser/src/inline-helpers/**'], + rules: { + 'no-useless-escape': 'off' + } + }, + { + // per-version transformers mirror the AST shape field for field, including + // identity assignments and empty node payloads such as `{ Null: {} }` + files: ['packages/transform-ast/src/transformers/**'], + rules: { + 'no-self-assign': 'off', + '@typescript-eslint/no-empty-object-type': 'off' + } + } +]; diff --git a/package.json b/package.json index ac4fc240..345ddeb8 100644 --- a/package.json +++ b/package.json @@ -24,22 +24,23 @@ "update-workspace": "makage update-workspace" }, "devDependencies": { + "@constructive-io/eslint-config": "^0.2.0", "@types/jest": "^30.0.0", "@types/node": "^20.12.7", "@typescript-eslint/eslint-plugin": "^8.47.0", "@typescript-eslint/parser": "^8.47.0", + "copyfiles": "^2.4.1", "eslint": "^9.39.1", "eslint-config-prettier": "^10.1.8", "eslint-plugin-simple-import-sort": "^12.1.0", "eslint-plugin-unused-imports": "^4.0.0", "glob": "^11.0.0", - "copyfiles": "^2.4.1", - "rimraf": "^6.0.1", "jest": "^30.2.0", "jest-diff": "30.2.0", "lerna": "^8.2.4", "makage": "^0.1.8", "prettier": "^3.0.2", + "rimraf": "^6.0.1", "semver": "^7.7.2", "strip-ansi": "^6", "ts-jest": "^29.4.6", diff --git a/packages/deparser/__tests__/entry-point.test.ts b/packages/deparser/__tests__/entry-point.test.ts index 3ed8ce71..267d42f9 100644 --- a/packages/deparser/__tests__/entry-point.test.ts +++ b/packages/deparser/__tests__/entry-point.test.ts @@ -1,6 +1,7 @@ +import * as t from '@pgsql/types'; import { parse } from 'libpg-query'; + import { Deparser } from '../src/deparser'; -import * as t from '@pgsql/types'; describe('Entry Point Refactoring', () => { const sql = ` diff --git a/packages/deparser/__tests__/misc/castings.test.ts b/packages/deparser/__tests__/misc/castings.test.ts index a5e09941..0ec9fd2e 100644 --- a/packages/deparser/__tests__/misc/castings.test.ts +++ b/packages/deparser/__tests__/misc/castings.test.ts @@ -1,7 +1,7 @@ import { expectParseDeparse } from '../../test-utils'; it('should format foreign key constraint with pretty option enabled', async () => { - const sql = `SELECT '123'::INTEGER;`; - const result = await expectParseDeparse(sql, { pretty: true }); - expect(result).toMatchSnapshot(); + const sql = `SELECT '123'::INTEGER;`; + const result = await expectParseDeparse(sql, { pretty: true }); + expect(result).toMatchSnapshot(); }); diff --git a/packages/deparser/__tests__/misc/pg-catalog.test.ts b/packages/deparser/__tests__/misc/pg-catalog.test.ts index 404d1e61..d783998d 100644 --- a/packages/deparser/__tests__/misc/pg-catalog.test.ts +++ b/packages/deparser/__tests__/misc/pg-catalog.test.ts @@ -1,7 +1,7 @@ import { expectParseDeparse } from '../../test-utils'; it('should format pg_catalog.char with pretty option enabled', async () => { - const sql = ` + const sql = ` CREATE TABLE dashboard_jobs.jobs ( id bigserial PRIMARY KEY, queue_name text DEFAULT CAST(public.gen_random_uuid() AS text), @@ -23,6 +23,6 @@ CREATE TABLE dashboard_jobs.jobs ( UNIQUE (key) ); `; - const result = await expectParseDeparse(sql, { pretty: true }); - expect(result).toMatchSnapshot(); + const result = await expectParseDeparse(sql, { pretty: true }); + expect(result).toMatchSnapshot(); }); diff --git a/packages/deparser/__tests__/pretty/alter-table-column.test.ts b/packages/deparser/__tests__/pretty/alter-table-column.test.ts index 569f9802..9da77d05 100644 --- a/packages/deparser/__tests__/pretty/alter-table-column.test.ts +++ b/packages/deparser/__tests__/pretty/alter-table-column.test.ts @@ -1,14 +1,14 @@ import { PrettyTest } from '../../test-utils/PrettyTest'; const prettyTest = new PrettyTest([ - "original/alter/alter-table-column-1.sql", - "original/alter/alter-table-column-2.sql", - "original/alter/alter-table-column-3.sql", - "original/alter/alter-table-column-4.sql", - "original/alter/alter-table-column-5.sql", - "original/alter/alter-table-column-6.sql", - "original/alter/alter-table-column-7.sql", - "original/alter/alter-table-column-8.sql", - "original/alter/alter-table-column-9.sql" + 'original/alter/alter-table-column-1.sql', + 'original/alter/alter-table-column-2.sql', + 'original/alter/alter-table-column-3.sql', + 'original/alter/alter-table-column-4.sql', + 'original/alter/alter-table-column-5.sql', + 'original/alter/alter-table-column-6.sql', + 'original/alter/alter-table-column-7.sql', + 'original/alter/alter-table-column-8.sql', + 'original/alter/alter-table-column-9.sql' ]); prettyTest.generateTests(); diff --git a/packages/deparser/__tests__/pretty/pg-catalog.test.ts b/packages/deparser/__tests__/pretty/pg-catalog.test.ts index b29c9730..68978d83 100644 --- a/packages/deparser/__tests__/pretty/pg-catalog.test.ts +++ b/packages/deparser/__tests__/pretty/pg-catalog.test.ts @@ -1,36 +1,36 @@ import { PrettyTest } from '../../test-utils/PrettyTest'; const prettyTest = new PrettyTest([ - "misc/pg_catalog-timestamp-etc-1.sql", - "misc/pg_catalog-timestamp-etc-2.sql", - "misc/pg_catalog-timestamp-etc-3.sql", - "misc/pg_catalog-timestamp-etc-4.sql", - "misc/pg_catalog-timestamp-etc-5.sql", - "misc/pg_catalog-timestamp-etc-6.sql", - "misc/pg_catalog-timestamp-etc-7.sql", - "misc/pg_catalog-timestamp-etc-8.sql", - "misc/pg_catalog-timestamp-etc-9.sql", - "misc/pg_catalog-timestamp-etc-10.sql", - "misc/pg_catalog-timestamp-etc-11.sql", - "misc/pg_catalog-timestamp-etc-12.sql", - "misc/pg_catalog-timestamp-etc-13.sql", - /// - "misc/pg_catalog-1.sql", - "misc/pg_catalog-2.sql", - "misc/pg_catalog-3.sql", - "misc/pg_catalog-4.sql", - "misc/pg_catalog-5.sql", - "misc/pg_catalog-6.sql", - "misc/pg_catalog-7.sql", - "misc/pg_catalog-8.sql", - "misc/pg_catalog-9.sql", - "misc/pg_catalog-10.sql", - "misc/pg_catalog-11.sql", - "misc/pg_catalog-12.sql", - "misc/pg_catalog-13.sql", - "misc/pg_catalog-14.sql", - "misc/pg_catalog-15.sql", - "misc/pg_catalog-16.sql", - "misc/pg_catalog-17.sql" + 'misc/pg_catalog-timestamp-etc-1.sql', + 'misc/pg_catalog-timestamp-etc-2.sql', + 'misc/pg_catalog-timestamp-etc-3.sql', + 'misc/pg_catalog-timestamp-etc-4.sql', + 'misc/pg_catalog-timestamp-etc-5.sql', + 'misc/pg_catalog-timestamp-etc-6.sql', + 'misc/pg_catalog-timestamp-etc-7.sql', + 'misc/pg_catalog-timestamp-etc-8.sql', + 'misc/pg_catalog-timestamp-etc-9.sql', + 'misc/pg_catalog-timestamp-etc-10.sql', + 'misc/pg_catalog-timestamp-etc-11.sql', + 'misc/pg_catalog-timestamp-etc-12.sql', + 'misc/pg_catalog-timestamp-etc-13.sql', + /// + 'misc/pg_catalog-1.sql', + 'misc/pg_catalog-2.sql', + 'misc/pg_catalog-3.sql', + 'misc/pg_catalog-4.sql', + 'misc/pg_catalog-5.sql', + 'misc/pg_catalog-6.sql', + 'misc/pg_catalog-7.sql', + 'misc/pg_catalog-8.sql', + 'misc/pg_catalog-9.sql', + 'misc/pg_catalog-10.sql', + 'misc/pg_catalog-11.sql', + 'misc/pg_catalog-12.sql', + 'misc/pg_catalog-13.sql', + 'misc/pg_catalog-14.sql', + 'misc/pg_catalog-15.sql', + 'misc/pg_catalog-16.sql', + 'misc/pg_catalog-17.sql' ]); prettyTest.generateTests(); diff --git a/packages/deparser/jest.config.js b/packages/deparser/jest.config.js index 0aa3aaa4..057a9420 100644 --- a/packages/deparser/jest.config.js +++ b/packages/deparser/jest.config.js @@ -1,18 +1,18 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", - transform: { - "^.+\\.tsx?$": [ - "ts-jest", - { - babelConfig: false, - tsconfig: "tsconfig.json", - }, - ], - }, - transformIgnorePatterns: [`/node_modules/*`], - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - modulePathIgnorePatterns: ["dist/*"] + preset: 'ts-jest', + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + babelConfig: false, + tsconfig: 'tsconfig.json', + }, + ], + }, + transformIgnorePatterns: [`/node_modules/*`], + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + modulePathIgnorePatterns: ['dist/*'] }; diff --git a/packages/deparser/scripts/clean-utils.ts b/packages/deparser/scripts/clean-utils.ts index f50da037..4d32ebaa 100644 --- a/packages/deparser/scripts/clean-utils.ts +++ b/packages/deparser/scripts/clean-utils.ts @@ -1,4 +1,4 @@ -/* eslint-disable no-restricted-syntax */ + export const cleanLines = (sql: string) => { return sql @@ -35,11 +35,11 @@ export const transform = (obj: any, props: any): any => { if (obj instanceof Object || typeof obj === 'object') { copy = {}; for (const attr in obj) { - if (obj.hasOwnProperty(attr)) { - if (props.hasOwnProperty(attr)) { + if (Object.prototype.hasOwnProperty.call(obj, attr)) { + if (Object.prototype.hasOwnProperty.call(props, attr)) { if (typeof props[attr] === 'function') { copy[attr] = props[attr](obj[attr]); - } else if (props[attr].hasOwnProperty(obj[attr])) { + } else if (Object.prototype.hasOwnProperty.call(props[attr], obj[attr])) { copy[attr] = props[attr][obj[attr]]; } else { copy[attr] = transform(obj[attr], props); diff --git a/packages/deparser/scripts/generate-version-packages.ts b/packages/deparser/scripts/generate-version-packages.ts index d2c353f6..5318a691 100644 --- a/packages/deparser/scripts/generate-version-packages.ts +++ b/packages/deparser/scripts/generate-version-packages.ts @@ -59,33 +59,33 @@ function generatePackageJson(packageName: string, pgVersion: string, versionInfo function generateTsConfig(): any { return { - "compilerOptions": { - "outDir": "dist", - "rootDir": "src/", - "target": "es2022", - "module": "commonjs", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "strictNullChecks": false, - "skipLibCheck": true, - "sourceMap": false, - "declaration": true, - "resolveJsonModule": true, - "moduleResolution": "node" + compilerOptions: { + outDir: 'dist', + rootDir: 'src/', + target: 'es2022', + module: 'commonjs', + esModuleInterop: true, + forceConsistentCasingInFileNames: true, + strict: true, + strictNullChecks: false, + skipLibCheck: true, + sourceMap: false, + declaration: true, + resolveJsonModule: true, + moduleResolution: 'node' }, - "include": ["src/**/*.ts"], - "exclude": ["dist", "node_modules", "**/*.spec.*", "**/*.test.*"] + include: ['src/**/*.ts'], + exclude: ['dist', 'node_modules', '**/*.spec.*', '**/*.test.*'] }; } function generateTsConfigEsm(): any { return { - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "esnext", - "outDir": "./dist/esm", - "declaration": false + extends: './tsconfig.json', + compilerOptions: { + module: 'esnext', + outDir: './dist/esm', + declaration: false } }; } diff --git a/packages/deparser/scripts/make-fixtures-ast.ts b/packages/deparser/scripts/make-fixtures-ast.ts index 633dbdbc..487ccbcc 100644 --- a/packages/deparser/scripts/make-fixtures-ast.ts +++ b/packages/deparser/scripts/make-fixtures-ast.ts @@ -1,9 +1,10 @@ #!/usr/bin/env ts-node -import * as path from 'path'; +import { ParseResult } from '@pgsql/types'; import * as fs from 'fs'; import { sync as globSync } from 'glob'; import { parse } from 'libpg-query'; -import { ParseResult, RawStmt } from '@pgsql/types'; +import * as path from 'path'; + import { cleanTree } from './clean-utils'; const FIXTURE_DIR = path.join(__dirname, '../../../__fixtures__/legacy'); diff --git a/packages/deparser/scripts/make-fixtures-sql.ts b/packages/deparser/scripts/make-fixtures-sql.ts index eb8c0eb4..dce4ffad 100644 --- a/packages/deparser/scripts/make-fixtures-sql.ts +++ b/packages/deparser/scripts/make-fixtures-sql.ts @@ -1,9 +1,9 @@ #!/usr/bin/env ts-node -import * as path from 'path'; +import { ParseResult } from '@pgsql/types'; import * as fs from 'fs'; import { sync as globSync } from 'glob'; -import { parse, deparse } from 'libpg-query'; -import { ParseResult, RawStmt } from '@pgsql/types'; +import { deparse,parse } from 'libpg-query'; +import * as path from 'path'; const FIXTURE_DIR = path.join(__dirname, '../../../__fixtures__/legacy'); const OUT_DIR = path.join(__dirname, '../../../__fixtures__/generated'); diff --git a/packages/deparser/scripts/make-fixtures.ts b/packages/deparser/scripts/make-fixtures.ts index d2753a76..92e463cb 100644 --- a/packages/deparser/scripts/make-fixtures.ts +++ b/packages/deparser/scripts/make-fixtures.ts @@ -1,9 +1,10 @@ #!/usr/bin/env ts-node -import * as path from 'path'; import * as fs from 'fs'; import { sync as globSync } from 'glob'; import { parse } from 'libpg-query'; -import { splitStatements, generateStatementKey } from './statement-splitter'; +import * as path from 'path'; + +import { generateStatementKey,splitStatements } from './statement-splitter'; const FIXTURE_DIR = path.join(__dirname, '../../../__fixtures__/kitchen-sink'); const OUT_DIR = path.join(__dirname, '../../../__fixtures__/generated'); diff --git a/packages/deparser/scripts/make-kitchen-sink.ts b/packages/deparser/scripts/make-kitchen-sink.ts index 92918052..3deea101 100644 --- a/packages/deparser/scripts/make-kitchen-sink.ts +++ b/packages/deparser/scripts/make-kitchen-sink.ts @@ -1,9 +1,9 @@ #!/usr/bin/env ts-node -import * as path from 'path'; +import { ParseResult, RawStmt } from '@pgsql/types'; import * as fs from 'fs'; import { sync as globSync } from 'glob'; import { parse } from 'libpg-query'; -import { ParseResult, RawStmt } from '@pgsql/types'; +import * as path from 'path'; const FIXTURE_DIR = path.join(__dirname, '../../../__fixtures__/kitchen-sink'); const OUT_DIR = path.join(__dirname, '../__tests__/kitchen-sink'); @@ -24,7 +24,7 @@ const fixtures = new FixtureTestUtils(); it('${name}', async () => { await fixtures.runFixtureTests(${JSON.stringify(tests, null, 2)}); }); -` +`; }; const fixtures = globSync(path.join(FIXTURE_DIR, '**/*.sql')); diff --git a/packages/deparser/scripts/make-upstream-diff.ts b/packages/deparser/scripts/make-upstream-diff.ts index 32f6c710..99fe91f5 100644 --- a/packages/deparser/scripts/make-upstream-diff.ts +++ b/packages/deparser/scripts/make-upstream-diff.ts @@ -1,12 +1,12 @@ #!/usr/bin/env ts-node -import * as path from 'path'; import * as fs from 'fs'; import { sync as globSync } from 'glob'; -import { parse, deparse } from 'libpg-query'; -import { ParseResult, RawStmt } from '@pgsql/types'; +import { deparse,parse } from 'libpg-query'; +import * as path from 'path'; + import { deparse as ourDeparse } from '../src'; import { cleanTree } from './clean-utils'; -import { splitStatements, generateStatementKey } from './statement-splitter'; +import { generateStatementKey,splitStatements } from './statement-splitter'; const FIXTURE_DIR = path.join(__dirname, '../../../__fixtures__/kitchen-sink'); const OUT_DIR = path.join(__dirname, '../../../__fixtures__/generated'); diff --git a/packages/deparser/scripts/statement-splitter.ts b/packages/deparser/scripts/statement-splitter.ts index f423fd79..9bf62c3d 100644 --- a/packages/deparser/scripts/statement-splitter.ts +++ b/packages/deparser/scripts/statement-splitter.ts @@ -1,5 +1,5 @@ -import { parse } from 'libpg-query'; import { ParseResult, RawStmt } from '@pgsql/types'; +import { parse } from 'libpg-query'; export interface ExtractedStatement { statement: string; diff --git a/packages/deparser/scripts/strip-deparser-types.ts b/packages/deparser/scripts/strip-deparser-types.ts index ba698e74..37dd408f 100644 --- a/packages/deparser/scripts/strip-deparser-types.ts +++ b/packages/deparser/scripts/strip-deparser-types.ts @@ -1,6 +1,6 @@ -import * as ts from 'typescript'; import * as fs from 'fs'; import * as path from 'path'; +import * as ts from 'typescript'; /** * Script to strip types from deparser files and copy them to version directories diff --git a/packages/deparser/scripts/strip-direct-transformer-types.ts b/packages/deparser/scripts/strip-direct-transformer-types.ts index 4742a4a7..e0268cf1 100644 --- a/packages/deparser/scripts/strip-direct-transformer-types.ts +++ b/packages/deparser/scripts/strip-direct-transformer-types.ts @@ -1,6 +1,6 @@ -import * as ts from 'typescript'; import * as fs from 'fs'; import * as path from 'path'; +import * as ts from 'typescript'; /** * Script to strip types from direct transformer files and replace them with 'any' diff --git a/packages/deparser/scripts/strip-transformer-types.ts b/packages/deparser/scripts/strip-transformer-types.ts index 0cf03101..736d59fb 100644 --- a/packages/deparser/scripts/strip-transformer-types.ts +++ b/packages/deparser/scripts/strip-transformer-types.ts @@ -1,6 +1,6 @@ -import * as ts from 'typescript'; import * as fs from 'fs'; import * as path from 'path'; +import * as ts from 'typescript'; /** * Script to strip types from transformer files and replace them with 'any' diff --git a/packages/deparser/src/deparser.ts b/packages/deparser/src/deparser.ts index 7f58e17f..976a7a4b 100644 --- a/packages/deparser/src/deparser.ts +++ b/packages/deparser/src/deparser.ts @@ -1,10 +1,11 @@ -import { Node } from '@pgsql/types'; -import { DeparserContext, DeparserVisitor } from './visitors/base'; -import { SqlFormatter } from './utils/sql-formatter'; import { QuoteUtils } from '@pgsql/quotes'; -import { ListUtils } from './utils/list-utils'; +import { Node } from '@pgsql/types'; import * as t from '@pgsql/types'; +import { ListUtils } from './utils/list-utils'; +import { SqlFormatter } from './utils/sql-formatter'; +import { DeparserContext, DeparserVisitor } from './visitors/base'; + /** * List of real PostgreSQL built-in types as they appear in pg_catalog.pg_type.typname. * These are stored in lowercase in PostgreSQL system catalogs. @@ -201,112 +202,112 @@ export class Deparser implements DeparserVisitor { */ private getObjectTypeKeyword(objectType: string): string { switch (objectType) { - case 'OBJECT_TABLE': - return 'TABLE'; - case 'OBJECT_VIEW': - return 'VIEW'; - case 'OBJECT_INDEX': - return 'INDEX'; - case 'OBJECT_SEQUENCE': - return 'SEQUENCE'; - case 'OBJECT_FUNCTION': - return 'FUNCTION'; - case 'OBJECT_PROCEDURE': - return 'PROCEDURE'; - case 'OBJECT_SCHEMA': - return 'SCHEMA'; - case 'OBJECT_DATABASE': - return 'DATABASE'; - case 'OBJECT_DOMAIN': - return 'DOMAIN'; - case 'OBJECT_AGGREGATE': - return 'AGGREGATE'; - case 'OBJECT_CONVERSION': - return 'CONVERSION'; - case 'OBJECT_LANGUAGE': - return 'LANGUAGE'; - case 'OBJECT_OPERATOR': - return 'OPERATOR'; - case 'OBJECT_OPFAMILY': - return 'OPERATOR FAMILY'; - case 'OBJECT_OPCLASS': - return 'OPERATOR CLASS'; - case 'OBJECT_TSDICTIONARY': - return 'TEXT SEARCH DICTIONARY'; - case 'OBJECT_TSCONFIGURATION': - return 'TEXT SEARCH CONFIGURATION'; - case 'OBJECT_EVENT_TRIGGER': - return 'EVENT TRIGGER'; - case 'OBJECT_FDW': - return 'FOREIGN DATA WRAPPER'; - case 'OBJECT_FOREIGN_SERVER': - return 'SERVER'; - case 'OBJECT_TYPE': - return 'TYPE'; - case 'OBJECT_COLLATION': - return 'COLLATION'; - case 'OBJECT_PUBLICATION': - return 'PUBLICATION'; - case 'OBJECT_ACCESS_METHOD': - return 'ACCESS METHOD'; - case 'OBJECT_AMOP': - return 'OPERATOR CLASS'; - case 'OBJECT_AMPROC': - return 'OPERATOR CLASS'; - case 'OBJECT_ATTRIBUTE': - return 'ATTRIBUTE'; - case 'OBJECT_CAST': - return 'CAST'; - case 'OBJECT_COLUMN': - return 'COLUMN'; - case 'OBJECT_DEFAULT': - return 'DEFAULT'; - case 'OBJECT_DEFACL': - return 'DEFAULT PRIVILEGES'; - case 'OBJECT_DOMCONSTRAINT': - return 'DOMAIN'; - case 'OBJECT_EXTENSION': - return 'EXTENSION'; - case 'OBJECT_FOREIGN_TABLE': - return 'FOREIGN TABLE'; - case 'OBJECT_LARGEOBJECT': - return 'LARGE OBJECT'; - case 'OBJECT_MATVIEW': - return 'MATERIALIZED VIEW'; - case 'OBJECT_PARAMETER_ACL': - return 'PARAMETER'; - case 'OBJECT_POLICY': - return 'POLICY'; - case 'OBJECT_PUBLICATION_NAMESPACE': - return 'PUBLICATION'; - case 'OBJECT_PUBLICATION_REL': - return 'PUBLICATION'; - case 'OBJECT_ROLE': - return 'ROLE'; - case 'OBJECT_ROUTINE': - return 'ROUTINE'; - case 'OBJECT_RULE': - return 'RULE'; - case 'OBJECT_STATISTIC_EXT': - return 'STATISTICS'; - case 'OBJECT_SUBSCRIPTION': - return 'SUBSCRIPTION'; - case 'OBJECT_TABCONSTRAINT': - return 'CONSTRAINT'; - case 'OBJECT_TABLESPACE': - return 'TABLESPACE'; - case 'OBJECT_TRANSFORM': - return 'TRANSFORM'; - case 'OBJECT_TRIGGER': - return 'TRIGGER'; - case 'OBJECT_TSPARSER': - return 'TEXT SEARCH PARSER'; - case 'OBJECT_TSTEMPLATE': - return 'TEXT SEARCH TEMPLATE'; - case 'OBJECT_USER_MAPPING': - return 'USER MAPPING'; - default: - throw new Error(`Unsupported objectType: ${objectType}`); + case 'OBJECT_TABLE': + return 'TABLE'; + case 'OBJECT_VIEW': + return 'VIEW'; + case 'OBJECT_INDEX': + return 'INDEX'; + case 'OBJECT_SEQUENCE': + return 'SEQUENCE'; + case 'OBJECT_FUNCTION': + return 'FUNCTION'; + case 'OBJECT_PROCEDURE': + return 'PROCEDURE'; + case 'OBJECT_SCHEMA': + return 'SCHEMA'; + case 'OBJECT_DATABASE': + return 'DATABASE'; + case 'OBJECT_DOMAIN': + return 'DOMAIN'; + case 'OBJECT_AGGREGATE': + return 'AGGREGATE'; + case 'OBJECT_CONVERSION': + return 'CONVERSION'; + case 'OBJECT_LANGUAGE': + return 'LANGUAGE'; + case 'OBJECT_OPERATOR': + return 'OPERATOR'; + case 'OBJECT_OPFAMILY': + return 'OPERATOR FAMILY'; + case 'OBJECT_OPCLASS': + return 'OPERATOR CLASS'; + case 'OBJECT_TSDICTIONARY': + return 'TEXT SEARCH DICTIONARY'; + case 'OBJECT_TSCONFIGURATION': + return 'TEXT SEARCH CONFIGURATION'; + case 'OBJECT_EVENT_TRIGGER': + return 'EVENT TRIGGER'; + case 'OBJECT_FDW': + return 'FOREIGN DATA WRAPPER'; + case 'OBJECT_FOREIGN_SERVER': + return 'SERVER'; + case 'OBJECT_TYPE': + return 'TYPE'; + case 'OBJECT_COLLATION': + return 'COLLATION'; + case 'OBJECT_PUBLICATION': + return 'PUBLICATION'; + case 'OBJECT_ACCESS_METHOD': + return 'ACCESS METHOD'; + case 'OBJECT_AMOP': + return 'OPERATOR CLASS'; + case 'OBJECT_AMPROC': + return 'OPERATOR CLASS'; + case 'OBJECT_ATTRIBUTE': + return 'ATTRIBUTE'; + case 'OBJECT_CAST': + return 'CAST'; + case 'OBJECT_COLUMN': + return 'COLUMN'; + case 'OBJECT_DEFAULT': + return 'DEFAULT'; + case 'OBJECT_DEFACL': + return 'DEFAULT PRIVILEGES'; + case 'OBJECT_DOMCONSTRAINT': + return 'DOMAIN'; + case 'OBJECT_EXTENSION': + return 'EXTENSION'; + case 'OBJECT_FOREIGN_TABLE': + return 'FOREIGN TABLE'; + case 'OBJECT_LARGEOBJECT': + return 'LARGE OBJECT'; + case 'OBJECT_MATVIEW': + return 'MATERIALIZED VIEW'; + case 'OBJECT_PARAMETER_ACL': + return 'PARAMETER'; + case 'OBJECT_POLICY': + return 'POLICY'; + case 'OBJECT_PUBLICATION_NAMESPACE': + return 'PUBLICATION'; + case 'OBJECT_PUBLICATION_REL': + return 'PUBLICATION'; + case 'OBJECT_ROLE': + return 'ROLE'; + case 'OBJECT_ROUTINE': + return 'ROUTINE'; + case 'OBJECT_RULE': + return 'RULE'; + case 'OBJECT_STATISTIC_EXT': + return 'STATISTICS'; + case 'OBJECT_SUBSCRIPTION': + return 'SUBSCRIPTION'; + case 'OBJECT_TABCONSTRAINT': + return 'CONSTRAINT'; + case 'OBJECT_TABLESPACE': + return 'TABLESPACE'; + case 'OBJECT_TRANSFORM': + return 'TRANSFORM'; + case 'OBJECT_TRIGGER': + return 'TRIGGER'; + case 'OBJECT_TSPARSER': + return 'TEXT SEARCH PARSER'; + case 'OBJECT_TSTEMPLATE': + return 'TEXT SEARCH TEMPLATE'; + case 'OBJECT_USER_MAPPING': + return 'USER MAPPING'; + default: + throw new Error(`Unsupported objectType: ${objectType}`); } } @@ -438,17 +439,17 @@ export class Deparser implements DeparserVisitor { } switch (node.op) { - case 'SETOP_UNION': - output.push('UNION'); - break; - case 'SETOP_INTERSECT': - output.push('INTERSECT'); - break; - case 'SETOP_EXCEPT': - output.push('EXCEPT'); - break; - default: - throw new Error(`Bad SelectStmt op: ${node.op}`); + case 'SETOP_UNION': + output.push('UNION'); + break; + case 'SETOP_INTERSECT': + output.push('INTERSECT'); + break; + case 'SETOP_EXCEPT': + output.push('EXCEPT'); + break; + default: + throw new Error(`Bad SelectStmt op: ${node.op}`); } if (node.all) { @@ -682,214 +683,214 @@ export class Deparser implements DeparserVisitor { const rexpr = node.rexpr; switch (kind) { - case 'AEXPR_OP': - if (lexpr && rexpr) { - const operator = this.deparseOperatorName(name, context); - let leftExpr = this.visit(lexpr, context); - let rightExpr = this.visit(rexpr, context); - - // Check if left expression needs parentheses - let leftNeedsParens = false; - if (lexpr && 'A_Expr' in lexpr && lexpr.A_Expr?.kind === 'AEXPR_OP') { - const leftOp = this.deparseOperatorName(ListUtils.unwrapList(lexpr.A_Expr.name), context); - if (this.needsParentheses(leftOp, operator, 'left')) { - leftNeedsParens = true; - } - } - if (lexpr && this.isComplexExpression(lexpr)) { + case 'AEXPR_OP': + if (lexpr && rexpr) { + const operator = this.deparseOperatorName(name, context); + let leftExpr = this.visit(lexpr, context); + let rightExpr = this.visit(rexpr, context); + + // Check if left expression needs parentheses + let leftNeedsParens = false; + if (lexpr && 'A_Expr' in lexpr && lexpr.A_Expr?.kind === 'AEXPR_OP') { + const leftOp = this.deparseOperatorName(ListUtils.unwrapList(lexpr.A_Expr.name), context); + if (this.needsParentheses(leftOp, operator, 'left')) { leftNeedsParens = true; } - if (leftNeedsParens) { - leftExpr = context.parens(leftExpr); - } + } + if (lexpr && this.isComplexExpression(lexpr)) { + leftNeedsParens = true; + } + if (leftNeedsParens) { + leftExpr = context.parens(leftExpr); + } - // Check if right expression needs parentheses - let rightNeedsParens = false; - if (rexpr && 'A_Expr' in rexpr && rexpr.A_Expr?.kind === 'AEXPR_OP') { - const rightOp = this.deparseOperatorName(ListUtils.unwrapList(rexpr.A_Expr.name), context); - if (this.needsParentheses(rightOp, operator, 'right')) { - rightNeedsParens = true; - } - } - if (rexpr && this.isComplexExpression(rexpr)) { + // Check if right expression needs parentheses + let rightNeedsParens = false; + if (rexpr && 'A_Expr' in rexpr && rexpr.A_Expr?.kind === 'AEXPR_OP') { + const rightOp = this.deparseOperatorName(ListUtils.unwrapList(rexpr.A_Expr.name), context); + if (this.needsParentheses(rightOp, operator, 'right')) { rightNeedsParens = true; } - if (rightNeedsParens) { - rightExpr = context.parens(rightExpr); - } - - return context.format([leftExpr, operator, rightExpr]); - }else if (rexpr) { - // Unary operator (e.g., unary minus: - expr) - const operator = this.deparseOperatorName(name, context); - let rightExpr = this.visit(rexpr, context); + } + if (rexpr && this.isComplexExpression(rexpr)) { + rightNeedsParens = true; + } + if (rightNeedsParens) { + rightExpr = context.parens(rightExpr); + } - // Wrap in parentheses if rexpr is a binary A_Expr to preserve semantics - // e.g., -(a - b) must stay -(a - b), not become -a - b - if (rexpr && 'A_Expr' in rexpr && rexpr.A_Expr?.kind === 'AEXPR_OP' && rexpr.A_Expr?.lexpr) { - rightExpr = context.parens(rightExpr); - } + return context.format([leftExpr, operator, rightExpr]); + }else if (rexpr) { + // Unary operator (e.g., unary minus: - expr) + const operator = this.deparseOperatorName(name, context); + let rightExpr = this.visit(rexpr, context); - return context.format([operator, rightExpr]); + // Wrap in parentheses if rexpr is a binary A_Expr to preserve semantics + // e.g., -(a - b) must stay -(a - b), not become -a - b + if (rexpr && 'A_Expr' in rexpr && rexpr.A_Expr?.kind === 'AEXPR_OP' && rexpr.A_Expr?.lexpr) { + rightExpr = context.parens(rightExpr); } - break; - case 'AEXPR_OP_ANY': + + return context.format([operator, rightExpr]); + } + break; + case 'AEXPR_OP_ANY': + return context.format([ + this.visit(lexpr, context), + this.deparseOperatorName(name, context), + 'ANY', + context.parens(this.visit(rexpr, context)) + ]); + case 'AEXPR_OP_ALL': + return context.format([ + this.visit(lexpr, context), + this.deparseOperatorName(name, context), + 'ALL', + context.parens(this.visit(rexpr, context)) + ]); + case 'AEXPR_DISTINCT': { + let leftExpr = this.visit(lexpr, context); + let rightExpr = this.visit(rexpr, context); + + // Add parentheses for complex expressions + if (lexpr && this.isComplexExpression(lexpr)) { + leftExpr = context.parens(leftExpr); + } + if (rexpr && this.isComplexExpression(rexpr)) { + rightExpr = context.parens(rightExpr); + } + + return context.format([ + leftExpr, + 'IS DISTINCT FROM', + rightExpr + ]); + } + case 'AEXPR_NOT_DISTINCT': { + let leftExpr = this.visit(lexpr, context); + let rightExpr = this.visit(rexpr, context); + + // Add parentheses for complex expressions + if (lexpr && this.isComplexExpression(lexpr)) { + leftExpr = context.parens(leftExpr); + } + if (rexpr && this.isComplexExpression(rexpr)) { + rightExpr = context.parens(rightExpr); + } + + return context.format([ + leftExpr, + 'IS NOT DISTINCT FROM', + rightExpr + ]); + } + case 'AEXPR_NULLIF': + return context.format([ + 'NULLIF', + context.parens([ + this.visit(lexpr, context), + this.visit(rexpr, context) + ].join(', ')) + ]); + case 'AEXPR_IN': + const inOperator = this.deparseOperatorName(name, context); + if (inOperator === '<>' || inOperator === '!=') { return context.format([ this.visit(lexpr, context), - this.deparseOperatorName(name, context), - 'ANY', + 'NOT IN', context.parens(this.visit(rexpr, context)) ]); - case 'AEXPR_OP_ALL': + } else { return context.format([ this.visit(lexpr, context), - this.deparseOperatorName(name, context), - 'ALL', + 'IN', context.parens(this.visit(rexpr, context)) ]); - case 'AEXPR_DISTINCT': { - let leftExpr = this.visit(lexpr, context); - let rightExpr = this.visit(rexpr, context); - - // Add parentheses for complex expressions - if (lexpr && this.isComplexExpression(lexpr)) { - leftExpr = context.parens(leftExpr); - } - if (rexpr && this.isComplexExpression(rexpr)) { - rightExpr = context.parens(rightExpr); - } - + } + case 'AEXPR_LIKE': + const likeOp = this.deparseOperatorName(name, context); + if (likeOp === '!~~') { return context.format([ - leftExpr, - 'IS DISTINCT FROM', - rightExpr + this.visit(lexpr, context), + 'NOT LIKE', + this.visit(rexpr, context) ]); - } - case 'AEXPR_NOT_DISTINCT': { - let leftExpr = this.visit(lexpr, context); - let rightExpr = this.visit(rexpr, context); - - // Add parentheses for complex expressions - if (lexpr && this.isComplexExpression(lexpr)) { - leftExpr = context.parens(leftExpr); - } - if (rexpr && this.isComplexExpression(rexpr)) { - rightExpr = context.parens(rightExpr); - } - + } else { return context.format([ - leftExpr, - 'IS NOT DISTINCT FROM', - rightExpr + this.visit(lexpr, context), + 'LIKE', + this.visit(rexpr, context) ]); } - case 'AEXPR_NULLIF': + case 'AEXPR_ILIKE': + const ilikeOp = this.deparseOperatorName(name, context); + if (ilikeOp === '!~~*') { return context.format([ - 'NULLIF', - context.parens([ - this.visit(lexpr, context), - this.visit(rexpr, context) - ].join(', ')) + this.visit(lexpr, context), + 'NOT ILIKE', + this.visit(rexpr, context) ]); - case 'AEXPR_IN': - const inOperator = this.deparseOperatorName(name, context); - if (inOperator === '<>' || inOperator === '!=') { - return context.format([ - this.visit(lexpr, context), - 'NOT IN', - context.parens(this.visit(rexpr, context)) - ]); - } else { - return context.format([ - this.visit(lexpr, context), - 'IN', - context.parens(this.visit(rexpr, context)) - ]); - } - case 'AEXPR_LIKE': - const likeOp = this.deparseOperatorName(name, context); - if (likeOp === '!~~') { - return context.format([ - this.visit(lexpr, context), - 'NOT LIKE', - this.visit(rexpr, context) - ]); - } else { - return context.format([ - this.visit(lexpr, context), - 'LIKE', - this.visit(rexpr, context) - ]); - } - case 'AEXPR_ILIKE': - const ilikeOp = this.deparseOperatorName(name, context); - if (ilikeOp === '!~~*') { - return context.format([ - this.visit(lexpr, context), - 'NOT ILIKE', - this.visit(rexpr, context) - ]); - } else { - return context.format([ - this.visit(lexpr, context), - 'ILIKE', - this.visit(rexpr, context) - ]); - } - case 'AEXPR_SIMILAR': - const similarOp = this.deparseOperatorName(name, context); - let rightExpr: string; + } else { + return context.format([ + this.visit(lexpr, context), + 'ILIKE', + this.visit(rexpr, context) + ]); + } + case 'AEXPR_SIMILAR': + const similarOp = this.deparseOperatorName(name, context); + let rightExpr: string; - if (rexpr && 'FuncCall' in rexpr && + if (rexpr && 'FuncCall' in rexpr && rexpr.FuncCall?.funcname?.length === 2 && (rexpr.FuncCall.funcname[0] as any)?.String?.sval === 'pg_catalog' && (rexpr.FuncCall.funcname[1] as any)?.String?.sval === 'similar_to_escape') { - const args = rexpr.FuncCall.args || []; - rightExpr = this.visit(args[0], context); - if (args.length > 1) { - rightExpr += ` ESCAPE ${this.visit(args[1], context)}`; - } - } else { - rightExpr = this.visit(rexpr, context); + const args = rexpr.FuncCall.args || []; + rightExpr = this.visit(args[0], context); + if (args.length > 1) { + rightExpr += ` ESCAPE ${this.visit(args[1], context)}`; } + } else { + rightExpr = this.visit(rexpr, context); + } - if (similarOp === '!~') { - return context.format([ - this.visit(lexpr, context), - 'NOT SIMILAR TO', - rightExpr - ]); - } else { - return context.format([ - this.visit(lexpr, context), - 'SIMILAR TO', - rightExpr - ]); - } - case 'AEXPR_BETWEEN': - return context.format([ - this.visit(lexpr, context), - 'BETWEEN', - this.visitBetweenRange(rexpr, context) - ]); - case 'AEXPR_NOT_BETWEEN': - return context.format([ - this.visit(lexpr, context), - 'NOT BETWEEN', - this.visitBetweenRange(rexpr, context) - ]); - case 'AEXPR_BETWEEN_SYM': + if (similarOp === '!~') { return context.format([ this.visit(lexpr, context), - 'BETWEEN SYMMETRIC', - this.visitBetweenRange(rexpr, context) + 'NOT SIMILAR TO', + rightExpr ]); - case 'AEXPR_NOT_BETWEEN_SYM': + } else { return context.format([ this.visit(lexpr, context), - 'NOT BETWEEN SYMMETRIC', - this.visitBetweenRange(rexpr, context) + 'SIMILAR TO', + rightExpr ]); + } + case 'AEXPR_BETWEEN': + return context.format([ + this.visit(lexpr, context), + 'BETWEEN', + this.visitBetweenRange(rexpr, context) + ]); + case 'AEXPR_NOT_BETWEEN': + return context.format([ + this.visit(lexpr, context), + 'NOT BETWEEN', + this.visitBetweenRange(rexpr, context) + ]); + case 'AEXPR_BETWEEN_SYM': + return context.format([ + this.visit(lexpr, context), + 'BETWEEN SYMMETRIC', + this.visitBetweenRange(rexpr, context) + ]); + case 'AEXPR_NOT_BETWEEN_SYM': + return context.format([ + this.visit(lexpr, context), + 'NOT BETWEEN SYMMETRIC', + this.visitBetweenRange(rexpr, context) + ]); } throw new Error(`Unhandled A_Expr kind: ${kind}`); @@ -917,15 +918,15 @@ export class Deparser implements DeparserVisitor { private getOperatorPrecedence(operator: string): number { const precedence: { [key: string]: number } = { '||': 1, // string concatenation - 'OR': 2, // logical OR - 'AND': 3, // logical AND - 'NOT': 4, // logical NOT - 'IS': 5, // IS NULL, IS NOT NULL, etc. - 'IN': 5, // IN, NOT IN - 'BETWEEN': 5, // BETWEEN, NOT BETWEEN - 'LIKE': 5, // LIKE, ILIKE, SIMILAR TO - 'ILIKE': 5, - 'SIMILAR': 5, + OR: 2, // logical OR + AND: 3, // logical AND + NOT: 4, // logical NOT + IS: 5, // IS NULL, IS NOT NULL, etc. + IN: 5, // IN, NOT IN + BETWEEN: 5, // BETWEEN, NOT BETWEEN + LIKE: 5, // LIKE, ILIKE, SIMILAR TO + ILIKE: 5, + SIMILAR: 5, '<': 6, // comparison operators '<=': 6, '>': 6, @@ -1457,26 +1458,26 @@ export class Deparser implements DeparserVisitor { // return formatStr.replace('%s', () => andArgs); // ✅ Function callback prevents interpretation switch (boolop) { - case 'AND_EXPR': - if (context.isPretty() && args.length > 1) { - const andArgs = args.map(arg => this.visit(arg, boolContext)).join(context.newline() + context.indent('AND ')); - return formatStr.replace('%s', () => andArgs); - } else { - const andArgs = args.map(arg => this.visit(arg, boolContext)).join(' AND '); - return formatStr.replace('%s', () => andArgs); - } - case 'OR_EXPR': - if (context.isPretty() && args.length > 1) { - const orArgs = args.map(arg => this.visit(arg, boolContext)).join(context.newline() + context.indent('OR ')); - return formatStr.replace('%s', () => orArgs); - } else { - const orArgs = args.map(arg => this.visit(arg, boolContext)).join(' OR '); - return formatStr.replace('%s', () => orArgs); - } - case 'NOT_EXPR': - return `NOT (${this.visit(args[0], context)})`; - default: - throw new Error(`Unhandled BoolExpr boolop: ${boolop}`); + case 'AND_EXPR': + if (context.isPretty() && args.length > 1) { + const andArgs = args.map(arg => this.visit(arg, boolContext)).join(context.newline() + context.indent('AND ')); + return formatStr.replace('%s', () => andArgs); + } else { + const andArgs = args.map(arg => this.visit(arg, boolContext)).join(' AND '); + return formatStr.replace('%s', () => andArgs); + } + case 'OR_EXPR': + if (context.isPretty() && args.length > 1) { + const orArgs = args.map(arg => this.visit(arg, boolContext)).join(context.newline() + context.indent('OR ')); + return formatStr.replace('%s', () => orArgs); + } else { + const orArgs = args.map(arg => this.visit(arg, boolContext)).join(' OR '); + return formatStr.replace('%s', () => orArgs); + } + case 'NOT_EXPR': + return `NOT (${this.visit(args[0], context)})`; + default: + throw new Error(`Unhandled BoolExpr boolop: ${boolop}`); } } @@ -2226,35 +2227,35 @@ export class Deparser implements DeparserVisitor { formatSingleTypeMod(typemod: number, typeName: string): string | null { switch (typeName) { - case 'varchar': - case 'bpchar': - case 'char': - if (typemod > 4) { - return (typemod - 64).toString(); - } - break; - case 'numeric': - case 'decimal': - if (typemod > 4) { - const modValue = typemod - 4; - const precision = (modValue >> 16) & 0xFFFF; - const scale = modValue & 0xFFFF; - if (scale > 0) { - return `${precision},${scale}`; - } else { - return precision.toString(); - } - } - break; - case 'time': - case 'timetz': - case 'timestamp': - case 'timestamptz': - case 'interval': - if (typemod >= 0) { - return typemod.toString(); + case 'varchar': + case 'bpchar': + case 'char': + if (typemod > 4) { + return (typemod - 64).toString(); + } + break; + case 'numeric': + case 'decimal': + if (typemod > 4) { + const modValue = typemod - 4; + const precision = (modValue >> 16) & 0xFFFF; + const scale = modValue & 0xFFFF; + if (scale > 0) { + return `${precision},${scale}`; + } else { + return precision.toString(); } - break; + } + break; + case 'time': + case 'timetz': + case 'timestamp': + case 'timestamptz': + case 'interval': + if (typemod >= 0) { + return typemod.toString(); + } + break; } return null; @@ -2262,35 +2263,35 @@ export class Deparser implements DeparserVisitor { getPgCatalogTypeName(typeName: string, size: string | null): string { switch (typeName) { - case 'bpchar': - if (size != null) { - return 'char'; - } - return 'bpchar'; - case 'varchar': - return 'varchar'; - case 'numeric': - return 'numeric'; - case 'bool': - return 'boolean'; - case 'int2': - return 'smallint'; - case 'int4': - return 'int'; - case 'int8': - return 'bigint'; - case 'real': - return 'float4'; - case 'time': - return 'time'; - case 'timestamp': - return 'timestamp'; - case 'interval': - return 'interval'; - case 'bit': - return 'bit'; - default: - return typeName; + case 'bpchar': + if (size != null) { + return 'char'; + } + return 'bpchar'; + case 'varchar': + return 'varchar'; + case 'numeric': + return 'numeric'; + case 'bool': + return 'boolean'; + case 'int2': + return 'smallint'; + case 'int4': + return 'int'; + case 'int8': + return 'bigint'; + case 'real': + return 'float4'; + case 'time': + return 'time'; + case 'timestamp': + return 'timestamp'; + case 'interval': + return 'interval'; + case 'bit': + return 'bit'; + default: + return typeName; } } @@ -2485,24 +2486,24 @@ export class Deparser implements DeparserVisitor { output.push(this.visit(node.arg, boolContext)); switch (node.booltesttype as string) { - case 'IS_TRUE': - output.push('IS TRUE'); - break; - case 'IS_NOT_TRUE': - output.push('IS NOT TRUE'); - break; - case 'IS_FALSE': - output.push('IS FALSE'); - break; - case 'IS_NOT_FALSE': - output.push('IS NOT FALSE'); - break; - case 'IS_UNKNOWN': - output.push('IS UNKNOWN'); - break; - case 'IS_NOT_UNKNOWN': - output.push('IS NOT UNKNOWN'); - break; + case 'IS_TRUE': + output.push('IS TRUE'); + break; + case 'IS_NOT_TRUE': + output.push('IS NOT TRUE'); + break; + case 'IS_FALSE': + output.push('IS FALSE'); + break; + case 'IS_NOT_FALSE': + output.push('IS NOT FALSE'); + break; + case 'IS_UNKNOWN': + output.push('IS UNKNOWN'); + break; + case 'IS_NOT_UNKNOWN': + output.push('IS NOT UNKNOWN'); + break; } return output.join(' '); @@ -2514,12 +2515,12 @@ export class Deparser implements DeparserVisitor { output.push(this.visit(node.arg, context)); switch (node.nulltesttype as string) { - case 'IS_NULL': - output.push('IS NULL'); - break; - case 'IS_NOT_NULL': - output.push('IS NOT NULL'); - break; + case 'IS_NULL': + output.push('IS NULL'); + break; + case 'IS_NOT_NULL': + output.push('IS NOT NULL'); + break; } return output.join(' '); @@ -2531,16 +2532,16 @@ export class Deparser implements DeparserVisitor { preserveOperatorDefElemCase(defName: string): string { const caseMap: { [key: string]: string } = { - 'leftarg': 'Leftarg', - 'rightarg': 'Rightarg', - 'procedure': 'Procedure', - 'function': 'Function', - 'commutator': 'Commutator', - 'negator': 'Negator', - 'restrict': 'Restrict', - 'join': 'Join', - 'hashes': 'Hashes', - 'merges': 'Merges' + leftarg: 'Leftarg', + rightarg: 'Rightarg', + procedure: 'Procedure', + function: 'Function', + commutator: 'Commutator', + negator: 'Negator', + restrict: 'Restrict', + join: 'Join', + hashes: 'Hashes', + merges: 'Merges' }; return caseMap[defName.toLowerCase()] || defName; @@ -2703,15 +2704,15 @@ export class Deparser implements DeparserVisitor { if (node.partspec) { output.push('PARTITION BY'); switch (node.partspec.strategy) { - case 'PARTITION_STRATEGY_HASH': - output.push('HASH'); - break; - case 'PARTITION_STRATEGY_LIST': - output.push('LIST'); - break; - case 'PARTITION_STRATEGY_RANGE': - output.push('RANGE'); - break; + case 'PARTITION_STRATEGY_HASH': + output.push('HASH'); + break; + case 'PARTITION_STRATEGY_LIST': + output.push('LIST'); + break; + case 'PARTITION_STRATEGY_RANGE': + output.push('RANGE'); + break; } if (node.partspec.partParams && node.partspec.partParams.length > 0) { const partParams = ListUtils.unwrapList(node.partspec.partParams) @@ -2724,15 +2725,15 @@ export class Deparser implements DeparserVisitor { if (node.oncommit && node.oncommit !== 'ONCOMMIT_NOOP') { output.push('ON COMMIT'); switch (node.oncommit) { - case 'ONCOMMIT_PRESERVE_ROWS': - output.push('PRESERVE ROWS'); - break; - case 'ONCOMMIT_DELETE_ROWS': - output.push('DELETE ROWS'); - break; - case 'ONCOMMIT_DROP': - output.push('DROP'); - break; + case 'ONCOMMIT_PRESERVE_ROWS': + output.push('PRESERVE ROWS'); + break; + case 'ONCOMMIT_DELETE_ROWS': + output.push('DELETE ROWS'); + break; + case 'ONCOMMIT_DROP': + output.push('DROP'); + break; } } @@ -2813,350 +2814,350 @@ export class Deparser implements DeparserVisitor { } switch (node.contype) { - case 'CONSTR_NULL': - output.push('NULL'); - break; - case 'CONSTR_NOTNULL': - output.push('NOT NULL'); - if (node.keys && node.keys.length > 0 && !context.isColumnConstraint) { - const keyList = ListUtils.unwrapList(node.keys) - .map(key => this.visit(key, context)) - .join(', '); - output.push(keyList); + case 'CONSTR_NULL': + output.push('NULL'); + break; + case 'CONSTR_NOTNULL': + output.push('NOT NULL'); + if (node.keys && node.keys.length > 0 && !context.isColumnConstraint) { + const keyList = ListUtils.unwrapList(node.keys) + .map(key => this.visit(key, context)) + .join(', '); + output.push(keyList); + } + if (node.is_no_inherit) { + output.push('NO INHERIT'); + } + if (node.skip_validation) { + output.push('NOT VALID'); + } + break; + case 'CONSTR_DEFAULT': + output.push('DEFAULT'); + if (node.raw_expr) { + output.push(this.visit(node.raw_expr, context)); + } + break; + case 'CONSTR_CHECK': + if (context.isPretty() && !context.isColumnConstraint) { + output.push('\n' + context.indent('CHECK')); + } else { + output.push('CHECK'); + } + if (node.raw_expr) { + if (context.isPretty()) { + const checkExpr = this.visit(node.raw_expr, context); + if (checkExpr.includes('\n')) { + output.push('(\n' + context.indent(checkExpr) + '\n)'); + } else { + output.push(`(${checkExpr})`); + } + } else { + output.push(context.parens(this.visit(node.raw_expr, context))); } - if (node.is_no_inherit) { - output.push('NO INHERIT'); + } + // PG18: constraints are enforced unless explicitly NOT ENFORCED + // (libpg-query omits false booleans, so undefined means not enforced) + if (node.is_enforced !== true && !context.isDomainConstraint) { + output.push('NOT ENFORCED'); + } else if (node.skip_validation) { + // NOT ENFORCED implies NOT VALID, so only emit NOT VALID when enforced + output.push('NOT VALID'); + } + // Handle NO INHERIT for check constraints - only for table constraints, not domain constraints + if (node.is_no_inherit && !context.isDomainConstraint) { + output.push('NO INHERIT'); + } + break; + case 'CONSTR_GENERATED': + output.push('GENERATED'); + if (node.generated_when === 'a') { + output.push('ALWAYS'); + } else if (node.generated_when === 's') { + output.push('BY DEFAULT'); + } + output.push('AS'); + if (node.raw_expr) { + output.push(context.parens(this.visit(node.raw_expr, context))); + } + output.push(node.generated_kind === 'v' ? 'VIRTUAL' : 'STORED'); + break; + case 'CONSTR_IDENTITY': + output.push('GENERATED'); + if (node.generated_when === 'a') { + output.push('ALWAYS'); + } else if (node.generated_when === 'd' || node.generated_when === 's') { + output.push('BY DEFAULT'); + } + output.push('AS IDENTITY'); + if (node.options && node.options.length > 0) { + const optionStrs = ListUtils.unwrapList(node.options) + .map(option => { + if (option.DefElem) { + const defElem = option.DefElem; + if (defElem.defname === 'sequence_name') { + if (defElem.arg && defElem.arg.List) { + const nameList = ListUtils.unwrapList(defElem.arg) + .map(item => this.visit(item, context)) + .join('.'); + return `SEQUENCE NAME ${nameList}`; + } + return 'SEQUENCE NAME'; + } else if (defElem.defname === 'start') { + const argValue = defElem.arg ? this.visit(defElem.arg, context) : ''; + return `START WITH ${argValue}`; + } else if (defElem.defname === 'increment') { + const argValue = defElem.arg ? this.visit(defElem.arg, context) : ''; + return `INCREMENT BY ${argValue}`; + } else if (defElem.defname === 'minvalue') { + if (defElem.arg) { + const argValue = this.visit(defElem.arg, context); + return `MINVALUE ${argValue}`; + } else { + return 'NO MINVALUE'; + } + } else if (defElem.defname === 'maxvalue') { + if (defElem.arg) { + const argValue = this.visit(defElem.arg, context); + return `MAXVALUE ${argValue}`; + } else { + return 'NO MAXVALUE'; + } + } else if (defElem.defname === 'cache') { + const argValue = defElem.arg ? this.visit(defElem.arg, context) : ''; + return `CACHE ${argValue}`; + } else if (defElem.defname === 'cycle') { + const argValue = defElem.arg ? this.visit(defElem.arg, context) : ''; + return argValue === 'true' ? 'CYCLE' : 'NO CYCLE'; + } + const argValue = defElem.arg ? this.visit(defElem.arg, context) : ''; + return `${defElem.defname.toUpperCase()} ${argValue}`; + } + return this.visit(option, context); + }); + if (context.isPretty()) { + const indentedOptions = optionStrs.map(option => context.indent(option)); + output.push('(\n' + indentedOptions.join('\n') + '\n)'); + } else { + output.push(`(${optionStrs.join(' ')})`); } - if (node.skip_validation) { - output.push('NOT VALID'); + } + break; + case 'CONSTR_PRIMARY': + output.push('PRIMARY KEY'); + if (node.keys && node.keys.length > 0) { + const keyItems = ListUtils.unwrapList(node.keys) + .map(key => this.visit(key, context)); + if (node.without_overlaps) { + keyItems[keyItems.length - 1] += ' WITHOUT OVERLAPS'; } - break; - case 'CONSTR_DEFAULT': - output.push('DEFAULT'); - if (node.raw_expr) { - output.push(this.visit(node.raw_expr, context)); + output.push(`(${keyItems.join(', ')})`); + } + if (node.indexname) { + output.push('USING INDEX'); + output.push(node.indexname); + } + break; + case 'CONSTR_UNIQUE': + if (context.isPretty() && !context.isColumnConstraint) { + output.push('\n' + context.indent('UNIQUE')); + } else { + output.push('UNIQUE'); + } + if (node.nulls_not_distinct) { + output.push('NULLS NOT DISTINCT'); + } + if (node.keys && node.keys.length > 0) { + const keyItems = ListUtils.unwrapList(node.keys) + .map(key => this.visit(key, context)); + if (node.without_overlaps) { + keyItems[keyItems.length - 1] += ' WITHOUT OVERLAPS'; } - break; - case 'CONSTR_CHECK': + output.push(`(${keyItems.join(', ')})`); + } + if (node.indexname) { + output.push('USING INDEX'); + output.push(node.indexname); + } + break; + case 'CONSTR_FOREIGN': + // Only add "FOREIGN KEY" for table-level constraints, not column-level constraints + if (!context.isColumnConstraint) { + if (context.isPretty()) { + output.push('\n' + context.indent('FOREIGN KEY')); + if (node.fk_attrs && node.fk_attrs.length > 0) { + output.push(`(${this.deparseKeyAttrs(node.fk_attrs, node.fk_with_period, context)})`); + } + output.push('\n' + context.indent('REFERENCES')); + } else { + output.push('FOREIGN KEY'); + if (node.fk_attrs && node.fk_attrs.length > 0) { + output.push(`(${this.deparseKeyAttrs(node.fk_attrs, node.fk_with_period, context)})`); + } + output.push('REFERENCES'); + } + } else { + output.push('REFERENCES'); + } + if (node.pktable) { if (context.isPretty() && !context.isColumnConstraint) { - output.push('\n' + context.indent('CHECK')); + const lastIndex = output.length - 1; + if (lastIndex >= 0 && output[lastIndex].includes('REFERENCES')) { + output[lastIndex] += ' ' + this.RangeVar(node.pktable, context); + } else { + output.push(this.RangeVar(node.pktable, context)); + } } else { - output.push('CHECK'); + output.push(this.RangeVar(node.pktable, context)); } - if (node.raw_expr) { - if (context.isPretty()) { - const checkExpr = this.visit(node.raw_expr, context); - if (checkExpr.includes('\n')) { - output.push('(\n' + context.indent(checkExpr) + '\n)'); - } else { - output.push(`(${checkExpr})`); - } + } + if (node.pk_attrs && node.pk_attrs.length > 0) { + const pkAttrs = this.deparseKeyAttrs(node.pk_attrs, node.pk_with_period, context); + if (context.isPretty() && !context.isColumnConstraint) { + const lastIndex = output.length - 1; + if (lastIndex >= 0) { + output[lastIndex] += ` (${pkAttrs})`; } else { - output.push(context.parens(this.visit(node.raw_expr, context))); + output.push(`(${pkAttrs})`); } + } else { + output.push(`(${pkAttrs})`); } - // PG18: constraints are enforced unless explicitly NOT ENFORCED - // (libpg-query omits false booleans, so undefined means not enforced) - if (node.is_enforced !== true && !context.isDomainConstraint) { - output.push('NOT ENFORCED'); - } else if (node.skip_validation) { - // NOT ENFORCED implies NOT VALID, so only emit NOT VALID when enforced - output.push('NOT VALID'); + } + if (node.fk_matchtype && node.fk_matchtype !== 's') { + let matchClause = ''; + switch (node.fk_matchtype) { + case 'f': + matchClause = 'MATCH FULL'; + break; + case 'p': + matchClause = 'MATCH PARTIAL'; + break; } - // Handle NO INHERIT for check constraints - only for table constraints, not domain constraints - if (node.is_no_inherit && !context.isDomainConstraint) { - output.push('NO INHERIT'); + if (context.isPretty() && !context.isColumnConstraint) { + output.push('\n' + context.indent(matchClause)); + } else { + output.push(matchClause); } - break; - case 'CONSTR_GENERATED': - output.push('GENERATED'); - if (node.generated_when === 'a') { - output.push('ALWAYS'); - } else if (node.generated_when === 's') { - output.push('BY DEFAULT'); - } - output.push('AS'); - if (node.raw_expr) { - output.push(context.parens(this.visit(node.raw_expr, context))); + } + if (node.fk_upd_action && node.fk_upd_action !== 'a') { + let updateClause = 'ON UPDATE '; + switch (node.fk_upd_action) { + case 'r': + updateClause += 'RESTRICT'; + break; + case 'c': + updateClause += 'CASCADE'; + break; + case 'n': + updateClause += 'SET NULL'; + break; + case 'd': + updateClause += 'SET DEFAULT'; + break; } - output.push(node.generated_kind === 'v' ? 'VIRTUAL' : 'STORED'); - break; - case 'CONSTR_IDENTITY': - output.push('GENERATED'); - if (node.generated_when === 'a') { - output.push('ALWAYS'); - } else if (node.generated_when === 'd' || node.generated_when === 's') { - output.push('BY DEFAULT'); - } - output.push('AS IDENTITY'); - if (node.options && node.options.length > 0) { - const optionStrs = ListUtils.unwrapList(node.options) - .map(option => { - if (option.DefElem) { - const defElem = option.DefElem; - if (defElem.defname === 'sequence_name') { - if (defElem.arg && defElem.arg.List) { - const nameList = ListUtils.unwrapList(defElem.arg) - .map(item => this.visit(item, context)) - .join('.'); - return `SEQUENCE NAME ${nameList}`; - } - return 'SEQUENCE NAME'; - } else if (defElem.defname === 'start') { - const argValue = defElem.arg ? this.visit(defElem.arg, context) : ''; - return `START WITH ${argValue}`; - } else if (defElem.defname === 'increment') { - const argValue = defElem.arg ? this.visit(defElem.arg, context) : ''; - return `INCREMENT BY ${argValue}`; - } else if (defElem.defname === 'minvalue') { - if (defElem.arg) { - const argValue = this.visit(defElem.arg, context); - return `MINVALUE ${argValue}`; - } else { - return 'NO MINVALUE'; - } - } else if (defElem.defname === 'maxvalue') { - if (defElem.arg) { - const argValue = this.visit(defElem.arg, context); - return `MAXVALUE ${argValue}`; - } else { - return 'NO MAXVALUE'; - } - } else if (defElem.defname === 'cache') { - const argValue = defElem.arg ? this.visit(defElem.arg, context) : ''; - return `CACHE ${argValue}`; - } else if (defElem.defname === 'cycle') { - const argValue = defElem.arg ? this.visit(defElem.arg, context) : ''; - return argValue === 'true' ? 'CYCLE' : 'NO CYCLE'; - } - const argValue = defElem.arg ? this.visit(defElem.arg, context) : ''; - return `${defElem.defname.toUpperCase()} ${argValue}`; - } - return this.visit(option, context); - }); - if (context.isPretty()) { - const indentedOptions = optionStrs.map(option => context.indent(option)); - output.push('(\n' + indentedOptions.join('\n') + '\n)'); - } else { - output.push(`(${optionStrs.join(' ')})`); - } + if (context.isPretty()) { + output.push('\n' + context.indent(updateClause)); + } else { + output.push('ON UPDATE'); + output.push(updateClause.replace('ON UPDATE ', '')); } - break; - case 'CONSTR_PRIMARY': - output.push('PRIMARY KEY'); - if (node.keys && node.keys.length > 0) { - const keyItems = ListUtils.unwrapList(node.keys) - .map(key => this.visit(key, context)); - if (node.without_overlaps) { - keyItems[keyItems.length - 1] += ' WITHOUT OVERLAPS'; - } - output.push(`(${keyItems.join(', ')})`); + } + if (node.fk_del_action && node.fk_del_action !== 'a') { + let deleteClause = 'ON DELETE '; + switch (node.fk_del_action) { + case 'r': + deleteClause += 'RESTRICT'; + break; + case 'c': + deleteClause += 'CASCADE'; + break; + case 'n': + deleteClause += 'SET NULL'; + break; + case 'd': + deleteClause += 'SET DEFAULT'; + break; } - if (node.indexname) { - output.push('USING INDEX'); - output.push(node.indexname); + if (context.isPretty()) { + output.push('\n' + context.indent(deleteClause)); + } else { + output.push('ON DELETE'); + output.push(deleteClause.replace('ON DELETE ', '')); } - break; - case 'CONSTR_UNIQUE': + } + // PG18: constraints are enforced unless explicitly NOT ENFORCED + // (libpg-query omits false booleans, so undefined means not enforced) + if (node.is_enforced !== true && !context.isDomainConstraint) { if (context.isPretty() && !context.isColumnConstraint) { - output.push('\n' + context.indent('UNIQUE')); + output.push('\n' + context.indent('NOT ENFORCED')); } else { - output.push('UNIQUE'); - } - if (node.nulls_not_distinct) { - output.push('NULLS NOT DISTINCT'); - } - if (node.keys && node.keys.length > 0) { - const keyItems = ListUtils.unwrapList(node.keys) - .map(key => this.visit(key, context)); - if (node.without_overlaps) { - keyItems[keyItems.length - 1] += ' WITHOUT OVERLAPS'; - } - output.push(`(${keyItems.join(', ')})`); - } - if (node.indexname) { - output.push('USING INDEX'); - output.push(node.indexname); + output.push('NOT ENFORCED'); } - break; - case 'CONSTR_FOREIGN': - // Only add "FOREIGN KEY" for table-level constraints, not column-level constraints - if (!context.isColumnConstraint) { - if (context.isPretty()) { - output.push('\n' + context.indent('FOREIGN KEY')); - if (node.fk_attrs && node.fk_attrs.length > 0) { - output.push(`(${this.deparseKeyAttrs(node.fk_attrs, node.fk_with_period, context)})`); - } - output.push('\n' + context.indent('REFERENCES')); - } else { - output.push('FOREIGN KEY'); - if (node.fk_attrs && node.fk_attrs.length > 0) { - output.push(`(${this.deparseKeyAttrs(node.fk_attrs, node.fk_with_period, context)})`); - } - output.push('REFERENCES'); - } + } else if (node.skip_validation && !context.isDomainConstraint) { + // NOT ENFORCED implies NOT VALID, so only emit NOT VALID when enforced + if (context.isPretty() && !context.isColumnConstraint) { + output.push('\n' + context.indent('NOT VALID')); } else { - output.push('REFERENCES'); - } - if (node.pktable) { - if (context.isPretty() && !context.isColumnConstraint) { - const lastIndex = output.length - 1; - if (lastIndex >= 0 && output[lastIndex].includes('REFERENCES')) { - output[lastIndex] += ' ' + this.RangeVar(node.pktable, context); - } else { - output.push(this.RangeVar(node.pktable, context)); - } - } else { - output.push(this.RangeVar(node.pktable, context)); - } - } - if (node.pk_attrs && node.pk_attrs.length > 0) { - const pkAttrs = this.deparseKeyAttrs(node.pk_attrs, node.pk_with_period, context); - if (context.isPretty() && !context.isColumnConstraint) { - const lastIndex = output.length - 1; - if (lastIndex >= 0) { - output[lastIndex] += ` (${pkAttrs})`; - } else { - output.push(`(${pkAttrs})`); - } - } else { - output.push(`(${pkAttrs})`); - } - } - if (node.fk_matchtype && node.fk_matchtype !== 's') { - let matchClause = ''; - switch (node.fk_matchtype) { - case 'f': - matchClause = 'MATCH FULL'; - break; - case 'p': - matchClause = 'MATCH PARTIAL'; - break; - } - if (context.isPretty() && !context.isColumnConstraint) { - output.push('\n' + context.indent(matchClause)); - } else { - output.push(matchClause); - } - } - if (node.fk_upd_action && node.fk_upd_action !== 'a') { - let updateClause = 'ON UPDATE '; - switch (node.fk_upd_action) { - case 'r': - updateClause += 'RESTRICT'; - break; - case 'c': - updateClause += 'CASCADE'; - break; - case 'n': - updateClause += 'SET NULL'; - break; - case 'd': - updateClause += 'SET DEFAULT'; - break; - } - if (context.isPretty()) { - output.push('\n' + context.indent(updateClause)); - } else { - output.push('ON UPDATE'); - output.push(updateClause.replace('ON UPDATE ', '')); - } - } - if (node.fk_del_action && node.fk_del_action !== 'a') { - let deleteClause = 'ON DELETE '; - switch (node.fk_del_action) { - case 'r': - deleteClause += 'RESTRICT'; - break; - case 'c': - deleteClause += 'CASCADE'; - break; - case 'n': - deleteClause += 'SET NULL'; - break; - case 'd': - deleteClause += 'SET DEFAULT'; - break; - } - if (context.isPretty()) { - output.push('\n' + context.indent(deleteClause)); - } else { - output.push('ON DELETE'); - output.push(deleteClause.replace('ON DELETE ', '')); - } - } - // PG18: constraints are enforced unless explicitly NOT ENFORCED - // (libpg-query omits false booleans, so undefined means not enforced) - if (node.is_enforced !== true && !context.isDomainConstraint) { - if (context.isPretty() && !context.isColumnConstraint) { - output.push('\n' + context.indent('NOT ENFORCED')); - } else { - output.push('NOT ENFORCED'); - } - } else if (node.skip_validation && !context.isDomainConstraint) { - // NOT ENFORCED implies NOT VALID, so only emit NOT VALID when enforced - if (context.isPretty() && !context.isColumnConstraint) { - output.push('\n' + context.indent('NOT VALID')); - } else { - output.push('NOT VALID'); - } + output.push('NOT VALID'); } - break; - case 'CONSTR_ATTR_DEFERRABLE': - output.push('DEFERRABLE'); - break; - case 'CONSTR_ATTR_NOT_DEFERRABLE': - output.push('NOT DEFERRABLE'); - break; - case 'CONSTR_ATTR_DEFERRED': - output.push('INITIALLY DEFERRED'); - break; - case 'CONSTR_ATTR_IMMEDIATE': - output.push('INITIALLY IMMEDIATE'); - break; - case 'CONSTR_ATTR_ENFORCED': - output.push('ENFORCED'); - break; - case 'CONSTR_ATTR_NOT_ENFORCED': - output.push('NOT ENFORCED'); - break; - case 'CONSTR_EXCLUSION': - output.push('EXCLUDE'); - if (node.access_method) { - output.push('USING'); - output.push(node.access_method); - } - if (node.exclusions && node.exclusions.length > 0) { - const exclusionElements = ListUtils.unwrapList(node.exclusions).map(elem => { - if (this.getNodeType(elem) === 'List') { - const elemList = ListUtils.unwrapList(elem); - if (elemList.length >= 2) { - const column = this.visit(elemList[0], context); - // Extract operator string from nested List structure - const operatorNode = elemList[1]; - let operator = ''; - if (this.getNodeType(operatorNode) === 'List') { - const operatorList = ListUtils.unwrapList(operatorNode); - if (operatorList.length > 0 && operatorList[0].String) { - operator = operatorList[0].String.sval; - } - } else if (operatorNode.String) { - operator = operatorNode.String.sval; - } else { - operator = this.visit(operatorNode, context); + } + break; + case 'CONSTR_ATTR_DEFERRABLE': + output.push('DEFERRABLE'); + break; + case 'CONSTR_ATTR_NOT_DEFERRABLE': + output.push('NOT DEFERRABLE'); + break; + case 'CONSTR_ATTR_DEFERRED': + output.push('INITIALLY DEFERRED'); + break; + case 'CONSTR_ATTR_IMMEDIATE': + output.push('INITIALLY IMMEDIATE'); + break; + case 'CONSTR_ATTR_ENFORCED': + output.push('ENFORCED'); + break; + case 'CONSTR_ATTR_NOT_ENFORCED': + output.push('NOT ENFORCED'); + break; + case 'CONSTR_EXCLUSION': + output.push('EXCLUDE'); + if (node.access_method) { + output.push('USING'); + output.push(node.access_method); + } + if (node.exclusions && node.exclusions.length > 0) { + const exclusionElements = ListUtils.unwrapList(node.exclusions).map(elem => { + if (this.getNodeType(elem) === 'List') { + const elemList = ListUtils.unwrapList(elem); + if (elemList.length >= 2) { + const column = this.visit(elemList[0], context); + // Extract operator string from nested List structure + const operatorNode = elemList[1]; + let operator = ''; + if (this.getNodeType(operatorNode) === 'List') { + const operatorList = ListUtils.unwrapList(operatorNode); + if (operatorList.length > 0 && operatorList[0].String) { + operator = operatorList[0].String.sval; } - return `${column} WITH ${operator}`; + } else if (operatorNode.String) { + operator = operatorNode.String.sval; + } else { + operator = this.visit(operatorNode, context); } + return `${column} WITH ${operator}`; } - return this.visit(elem, context); - }); - output.push(`(${exclusionElements.join(', ')})`); - } - if (node.where_clause) { - output.push('WHERE'); - output.push(context.parens(this.visit(node.where_clause as any, context))); - } - break; + } + return this.visit(elem, context); + }); + output.push(`(${exclusionElements.join(', ')})`); + } + if (node.where_clause) { + output.push('WHERE'); + output.push(context.parens(this.visit(node.where_clause as any, context))); + } + break; } // Handle deferrable constraints for all constraint types that support it @@ -3207,30 +3208,30 @@ export class Deparser implements DeparserVisitor { const subselect = context.parens(this.visit(node.subselect, context)); switch (node.subLinkType) { - case 'ANY_SUBLINK': - if (node.testexpr && node.operName) { - const testExpr = this.visit(node.testexpr, context); - const operator = this.deparseOperatorName(node.operName, context); - return `${testExpr} ${operator} ANY ${subselect}`; - } else if (node.testexpr) { - const testExpr = this.visit(node.testexpr, context); - return `${testExpr} IN ${subselect}`; - } - return subselect; - case 'ALL_SUBLINK': - if (node.testexpr && node.operName) { - const testExpr = this.visit(node.testexpr, context); - const operator = this.deparseOperatorName(node.operName, context); - return `${testExpr} ${operator} ALL ${subselect}`; - } - return subselect; - case 'EXISTS_SUBLINK': - return `EXISTS ${subselect}`; - case 'ARRAY_SUBLINK': - return `ARRAY${subselect}`; - case 'EXPR_SUBLINK': - default: - return subselect; + case 'ANY_SUBLINK': + if (node.testexpr && node.operName) { + const testExpr = this.visit(node.testexpr, context); + const operator = this.deparseOperatorName(node.operName, context); + return `${testExpr} ${operator} ANY ${subselect}`; + } else if (node.testexpr) { + const testExpr = this.visit(node.testexpr, context); + return `${testExpr} IN ${subselect}`; + } + return subselect; + case 'ALL_SUBLINK': + if (node.testexpr && node.operName) { + const testExpr = this.visit(node.testexpr, context); + const operator = this.deparseOperatorName(node.operName, context); + return `${testExpr} ${operator} ALL ${subselect}`; + } + return subselect; + case 'EXISTS_SUBLINK': + return `EXISTS ${subselect}`; + case 'ARRAY_SUBLINK': + return `ARRAY${subselect}`; + case 'EXPR_SUBLINK': + default: + return subselect; } } @@ -3428,25 +3429,25 @@ export class Deparser implements DeparserVisitor { GroupingSet(node: t.GroupingSet, context: DeparserContext): string { switch (node.kind) { - case 'GROUPING_SET_EMPTY': - return '()'; - case 'GROUPING_SET_SIMPLE': - // Not present in raw parse trees - return ''; - case 'GROUPING_SET_ROLLUP': - const rollupContent = ListUtils.unwrapList(node.content); - const rollupStrs = rollupContent.map(c => this.visit(c, context)); - return `ROLLUP (${rollupStrs.join(', ')})`; - case 'GROUPING_SET_CUBE': - const cubeContent = ListUtils.unwrapList(node.content); - const cubeStrs = cubeContent.map(c => this.visit(c, context)); - return `CUBE (${cubeStrs.join(', ')})`; - case 'GROUPING_SET_SETS': - const setsContent = ListUtils.unwrapList(node.content); - const setsStrs = setsContent.map(c => this.visit(c, context)); - return `GROUPING SETS (${setsStrs.join(', ')})`; - default: - return ''; + case 'GROUPING_SET_EMPTY': + return '()'; + case 'GROUPING_SET_SIMPLE': + // Not present in raw parse trees + return ''; + case 'GROUPING_SET_ROLLUP': + const rollupContent = ListUtils.unwrapList(node.content); + const rollupStrs = rollupContent.map(c => this.visit(c, context)); + return `ROLLUP (${rollupStrs.join(', ')})`; + case 'GROUPING_SET_CUBE': + const cubeContent = ListUtils.unwrapList(node.content); + const cubeStrs = cubeContent.map(c => this.visit(c, context)); + return `CUBE (${cubeStrs.join(', ')})`; + case 'GROUPING_SET_SETS': + const setsContent = ListUtils.unwrapList(node.content); + const setsStrs = setsContent.map(c => this.visit(c, context)); + return `GROUPING SETS (${setsStrs.join(', ')})`; + default: + return ''; } } @@ -3488,20 +3489,20 @@ export class Deparser implements DeparserVisitor { const output: string[] = []; switch (node.strength) { - case 'LCS_FORUPDATE': - output.push('FOR UPDATE'); - break; - case 'LCS_FORSHARE': - output.push('FOR SHARE'); - break; - case 'LCS_FORKEYSHARE': - output.push('FOR KEY SHARE'); - break; - case 'LCS_FORNOKEYUPDATE': - output.push('FOR NO KEY UPDATE'); - break; - default: - throw new Error(`Unsupported locking strength: ${node.strength}`); + case 'LCS_FORUPDATE': + output.push('FOR UPDATE'); + break; + case 'LCS_FORSHARE': + output.push('FOR SHARE'); + break; + case 'LCS_FORKEYSHARE': + output.push('FOR KEY SHARE'); + break; + case 'LCS_FORNOKEYUPDATE': + output.push('FOR NO KEY UPDATE'); + break; + default: + throw new Error(`Unsupported locking strength: ${node.strength}`); } if (node.lockedRels && node.lockedRels.length > 0) { @@ -3750,12 +3751,12 @@ export class Deparser implements DeparserVisitor { if (node.withCheckOption) { switch (node.withCheckOption) { - case 'CASCADED_CHECK_OPTION': - output.push('WITH CASCADED CHECK OPTION'); - break; - case 'LOCAL_CHECK_OPTION': - output.push('WITH LOCAL CHECK OPTION'); - break; + case 'CASCADED_CHECK_OPTION': + output.push('WITH CASCADED CHECK OPTION'); + break; + case 'LOCAL_CHECK_OPTION': + output.push('WITH LOCAL CHECK OPTION'); + break; } } @@ -3867,23 +3868,23 @@ export class Deparser implements DeparserVisitor { if (node.ordering) { switch (node.ordering) { - case 'SORTBY_ASC': - output.push('ASC'); - break; - case 'SORTBY_DESC': - output.push('DESC'); - break; + case 'SORTBY_ASC': + output.push('ASC'); + break; + case 'SORTBY_DESC': + output.push('DESC'); + break; } } if (node.nulls_ordering) { switch (node.nulls_ordering) { - case 'SORTBY_NULLS_FIRST': - output.push('NULLS FIRST'); - break; - case 'SORTBY_NULLS_LAST': - output.push('NULLS LAST'); - break; + case 'SORTBY_NULLS_FIRST': + output.push('NULLS FIRST'); + break; + case 'SORTBY_NULLS_LAST': + output.push('NULLS LAST'); + break; } } @@ -4031,27 +4032,27 @@ export class Deparser implements DeparserVisitor { } switch (node.jointype) { - case 'JOIN_INNER': - if (node.isNatural) { - joinStr += 'JOIN'; - } - else if (!node.quals && (!node.usingClause || node.usingClause.length === 0)) { - joinStr += 'CROSS JOIN'; - } else { - joinStr += 'JOIN'; - } - break; - case 'JOIN_LEFT': - joinStr += 'LEFT JOIN'; - break; - case 'JOIN_FULL': - joinStr += 'FULL JOIN'; - break; - case 'JOIN_RIGHT': - joinStr += 'RIGHT JOIN'; - break; - default: + case 'JOIN_INNER': + if (node.isNatural) { + joinStr += 'JOIN'; + } + else if (!node.quals && (!node.usingClause || node.usingClause.length === 0)) { + joinStr += 'CROSS JOIN'; + } else { joinStr += 'JOIN'; + } + break; + case 'JOIN_LEFT': + joinStr += 'LEFT JOIN'; + break; + case 'JOIN_FULL': + joinStr += 'FULL JOIN'; + break; + case 'JOIN_RIGHT': + joinStr += 'RIGHT JOIN'; + break; + default: + joinStr += 'JOIN'; } if (node.rarg) { @@ -4147,56 +4148,56 @@ export class Deparser implements DeparserVisitor { const output: string[] = []; switch (node.kind) { - case 'TRANS_STMT_BEGIN': - output.push('BEGIN'); - break; - case 'TRANS_STMT_START': - output.push('START TRANSACTION'); - break; - case 'TRANS_STMT_COMMIT': - output.push('COMMIT'); - break; - case 'TRANS_STMT_ROLLBACK': - output.push('ROLLBACK'); - break; - case 'TRANS_STMT_SAVEPOINT': - output.push('SAVEPOINT'); - if (node.savepoint_name) { - output.push(QuoteUtils.quoteIdentifier(node.savepoint_name)); - } - break; - case 'TRANS_STMT_RELEASE': - output.push('RELEASE SAVEPOINT'); - if (node.savepoint_name) { - output.push(QuoteUtils.quoteIdentifier(node.savepoint_name)); - } - break; - case 'TRANS_STMT_ROLLBACK_TO': - output.push('ROLLBACK TO'); - if (node.savepoint_name) { - output.push(QuoteUtils.quoteIdentifier(node.savepoint_name)); - } - break; - case 'TRANS_STMT_PREPARE': - output.push('PREPARE TRANSACTION'); - if (node.gid) { - output.push(`'${node.gid}'`); - } - break; - case 'TRANS_STMT_COMMIT_PREPARED': - output.push('COMMIT PREPARED'); - if (node.gid) { - output.push(`'${node.gid}'`); - } - break; - case 'TRANS_STMT_ROLLBACK_PREPARED': - output.push('ROLLBACK PREPARED'); - if (node.gid) { - output.push(`'${node.gid}'`); - } - break; - default: - throw new Error(`Unsupported TransactionStmt kind: ${node.kind}`); + case 'TRANS_STMT_BEGIN': + output.push('BEGIN'); + break; + case 'TRANS_STMT_START': + output.push('START TRANSACTION'); + break; + case 'TRANS_STMT_COMMIT': + output.push('COMMIT'); + break; + case 'TRANS_STMT_ROLLBACK': + output.push('ROLLBACK'); + break; + case 'TRANS_STMT_SAVEPOINT': + output.push('SAVEPOINT'); + if (node.savepoint_name) { + output.push(QuoteUtils.quoteIdentifier(node.savepoint_name)); + } + break; + case 'TRANS_STMT_RELEASE': + output.push('RELEASE SAVEPOINT'); + if (node.savepoint_name) { + output.push(QuoteUtils.quoteIdentifier(node.savepoint_name)); + } + break; + case 'TRANS_STMT_ROLLBACK_TO': + output.push('ROLLBACK TO'); + if (node.savepoint_name) { + output.push(QuoteUtils.quoteIdentifier(node.savepoint_name)); + } + break; + case 'TRANS_STMT_PREPARE': + output.push('PREPARE TRANSACTION'); + if (node.gid) { + output.push(`'${node.gid}'`); + } + break; + case 'TRANS_STMT_COMMIT_PREPARED': + output.push('COMMIT PREPARED'); + if (node.gid) { + output.push(`'${node.gid}'`); + } + break; + case 'TRANS_STMT_ROLLBACK_PREPARED': + output.push('ROLLBACK PREPARED'); + if (node.gid) { + output.push(`'${node.gid}'`); + } + break; + default: + throw new Error(`Unsupported TransactionStmt kind: ${node.kind}`); } // Handle transaction options (e.g., READ ONLY, ISOLATION LEVEL) @@ -4257,116 +4258,116 @@ export class Deparser implements DeparserVisitor { VariableSetStmt(node: t.VariableSetStmt, context: DeparserContext): string { switch (node.kind) { - case 'VAR_SET_VALUE': - const localPrefix = node.is_local ? 'LOCAL ' : ''; - if (node.jumble_args && node.name === 'xmloption' && node.args) { - const xmlValue = this.getNodeData(ListUtils.unwrapList(node.args)[0]); - const xmlOption = (typeof xmlValue.sval === 'object' ? xmlValue.sval.sval : xmlValue.sval) || ''; - return `SET ${localPrefix}XML OPTION ${xmlOption.toUpperCase()}`; - } - const args = node.args ? ListUtils.unwrapList(node.args).map(arg => { - const nodeData = this.getNodeData(arg); - if (nodeData.sval !== undefined) { - const svalValue = typeof nodeData.sval === 'object' ? nodeData.sval.sval : nodeData.sval; - if (svalValue === '' || svalValue.includes(' ') || svalValue.includes('-') || /[A-Z]/.test(svalValue) || /^\d/.test(svalValue) || svalValue.includes('.') || svalValue.includes('$') || svalValue.toLowerCase() === 'all' || /^[+-]\d/.test(svalValue)) { - return `'${svalValue}'`; - } - return svalValue; - } - return this.visit(arg, context); - }).join(', ') : ''; - - if (node.jumble_args && node.name === 'timezone') { - return `SET ${localPrefix}TIME ZONE ${args}`; - } - - // Handle args - always include TO clause if args exist (even if empty string) - const paramName = QuoteUtils.quoteIdentifier(node.name); - if (!node.args || node.args.length === 0) { - return `SET ${localPrefix}${paramName}`; - } - return `SET ${localPrefix}${paramName} TO ${args}`; - case 'VAR_SET_DEFAULT': - if (node.jumble_args && node.name === 'timezone') { - return `SET ${node.is_local ? 'LOCAL ' : ''}TIME ZONE DEFAULT`; - } - const defaultParamName = QuoteUtils.quoteIdentifier(node.name); - return `SET ${defaultParamName} TO DEFAULT`; - case 'VAR_SET_CURRENT': - const currentParamName = QuoteUtils.quoteIdentifier(node.name); - return `SET ${currentParamName} FROM CURRENT`; - case 'VAR_SET_MULTI': - if (node.name === 'TRANSACTION' || node.name === 'SESSION CHARACTERISTICS') { - // Handle SET TRANSACTION statements specially - const transactionOptions: string[] = []; - if (node.args) { - const args = ListUtils.unwrapList(node.args); - for (const arg of args) { - if (arg.DefElem) { - const defElem = arg.DefElem; - if (defElem.defname === 'transaction_isolation') { - const value = defElem.arg ? this.visit(defElem.arg, context) : ''; - transactionOptions.push(`ISOLATION LEVEL ${value.replace(/'/g, '').toUpperCase()}`); - } else if (defElem.defname === 'transaction_read_only') { - // Handle both A_Const with ival (integer) and sval (string) values - let boolValue = false; - if (defElem.arg) { - const nodeData = this.getNodeData(defElem.arg); - if (nodeData.ival !== undefined) { - // Handle nested ival structure: { ival: { ival: 1 } } - const ivalValue = typeof nodeData.ival === 'object' ? nodeData.ival.ival : nodeData.ival; - boolValue = ivalValue === 1; - } else if (nodeData.sval !== undefined) { - // Handle nested sval structure: { sval: { sval: "value" } } - const svalValue = typeof nodeData.sval === 'object' ? nodeData.sval.sval : nodeData.sval; - const stringValue = svalValue.replace(/'/g, ''); - boolValue = stringValue.toLowerCase() === 'on' || stringValue.toLowerCase() === 'true'; - } + case 'VAR_SET_VALUE': + const localPrefix = node.is_local ? 'LOCAL ' : ''; + if (node.jumble_args && node.name === 'xmloption' && node.args) { + const xmlValue = this.getNodeData(ListUtils.unwrapList(node.args)[0]); + const xmlOption = (typeof xmlValue.sval === 'object' ? xmlValue.sval.sval : xmlValue.sval) || ''; + return `SET ${localPrefix}XML OPTION ${xmlOption.toUpperCase()}`; + } + const args = node.args ? ListUtils.unwrapList(node.args).map(arg => { + const nodeData = this.getNodeData(arg); + if (nodeData.sval !== undefined) { + const svalValue = typeof nodeData.sval === 'object' ? nodeData.sval.sval : nodeData.sval; + if (svalValue === '' || svalValue.includes(' ') || svalValue.includes('-') || /[A-Z]/.test(svalValue) || /^\d/.test(svalValue) || svalValue.includes('.') || svalValue.includes('$') || svalValue.toLowerCase() === 'all' || /^[+-]\d/.test(svalValue)) { + return `'${svalValue}'`; + } + return svalValue; + } + return this.visit(arg, context); + }).join(', ') : ''; + + if (node.jumble_args && node.name === 'timezone') { + return `SET ${localPrefix}TIME ZONE ${args}`; + } + + // Handle args - always include TO clause if args exist (even if empty string) + const paramName = QuoteUtils.quoteIdentifier(node.name); + if (!node.args || node.args.length === 0) { + return `SET ${localPrefix}${paramName}`; + } + return `SET ${localPrefix}${paramName} TO ${args}`; + case 'VAR_SET_DEFAULT': + if (node.jumble_args && node.name === 'timezone') { + return `SET ${node.is_local ? 'LOCAL ' : ''}TIME ZONE DEFAULT`; + } + const defaultParamName = QuoteUtils.quoteIdentifier(node.name); + return `SET ${defaultParamName} TO DEFAULT`; + case 'VAR_SET_CURRENT': + const currentParamName = QuoteUtils.quoteIdentifier(node.name); + return `SET ${currentParamName} FROM CURRENT`; + case 'VAR_SET_MULTI': + if (node.name === 'TRANSACTION' || node.name === 'SESSION CHARACTERISTICS') { + // Handle SET TRANSACTION statements specially + const transactionOptions: string[] = []; + if (node.args) { + const args = ListUtils.unwrapList(node.args); + for (const arg of args) { + if (arg.DefElem) { + const defElem = arg.DefElem; + if (defElem.defname === 'transaction_isolation') { + const value = defElem.arg ? this.visit(defElem.arg, context) : ''; + transactionOptions.push(`ISOLATION LEVEL ${value.replace(/'/g, '').toUpperCase()}`); + } else if (defElem.defname === 'transaction_read_only') { + // Handle both A_Const with ival (integer) and sval (string) values + let boolValue = false; + if (defElem.arg) { + const nodeData = this.getNodeData(defElem.arg); + if (nodeData.ival !== undefined) { + // Handle nested ival structure: { ival: { ival: 1 } } + const ivalValue = typeof nodeData.ival === 'object' ? nodeData.ival.ival : nodeData.ival; + boolValue = ivalValue === 1; + } else if (nodeData.sval !== undefined) { + // Handle nested sval structure: { sval: { sval: "value" } } + const svalValue = typeof nodeData.sval === 'object' ? nodeData.sval.sval : nodeData.sval; + const stringValue = svalValue.replace(/'/g, ''); + boolValue = stringValue.toLowerCase() === 'on' || stringValue.toLowerCase() === 'true'; } - transactionOptions.push(boolValue ? 'READ ONLY' : 'READ WRITE'); - } else if (defElem.defname === 'transaction_deferrable') { - // Handle both A_Const with ival (integer) and sval (string) values - let boolValue = false; - if (defElem.arg) { - const nodeData = this.getNodeData(defElem.arg); - if (nodeData.ival !== undefined) { - // Handle nested ival structure: { ival: { ival: 1 } } - const ivalValue = typeof nodeData.ival === 'object' ? nodeData.ival.ival : nodeData.ival; - boolValue = ivalValue === 1; - } else if (nodeData.sval !== undefined) { - // Handle nested sval structure: { sval: { sval: "value" } } - const svalValue = typeof nodeData.sval === 'object' ? nodeData.sval.sval : nodeData.sval; - const stringValue = svalValue.replace(/'/g, ''); - boolValue = stringValue.toLowerCase() === 'on' || stringValue.toLowerCase() === 'true'; - } + } + transactionOptions.push(boolValue ? 'READ ONLY' : 'READ WRITE'); + } else if (defElem.defname === 'transaction_deferrable') { + // Handle both A_Const with ival (integer) and sval (string) values + let boolValue = false; + if (defElem.arg) { + const nodeData = this.getNodeData(defElem.arg); + if (nodeData.ival !== undefined) { + // Handle nested ival structure: { ival: { ival: 1 } } + const ivalValue = typeof nodeData.ival === 'object' ? nodeData.ival.ival : nodeData.ival; + boolValue = ivalValue === 1; + } else if (nodeData.sval !== undefined) { + // Handle nested sval structure: { sval: { sval: "value" } } + const svalValue = typeof nodeData.sval === 'object' ? nodeData.sval.sval : nodeData.sval; + const stringValue = svalValue.replace(/'/g, ''); + boolValue = stringValue.toLowerCase() === 'on' || stringValue.toLowerCase() === 'true'; } - transactionOptions.push(boolValue ? 'DEFERRABLE' : 'NOT DEFERRABLE'); } + transactionOptions.push(boolValue ? 'DEFERRABLE' : 'NOT DEFERRABLE'); } } } - if (node.name === 'SESSION CHARACTERISTICS') { - return `SET SESSION CHARACTERISTICS AS TRANSACTION ${transactionOptions.join(', ')}`; - } else { - return `SET TRANSACTION ${transactionOptions.join(', ')}`; - } + } + if (node.name === 'SESSION CHARACTERISTICS') { + return `SET SESSION CHARACTERISTICS AS TRANSACTION ${transactionOptions.join(', ')}`; } else { - // Handle other multi-variable sets - const assignments = node.args ? ListUtils.unwrapList(node.args).map(arg => { - if (arg.VariableSetStmt) { - return this.VariableSetStmt(arg.VariableSetStmt, context); - } - return this.visit(arg, context); - }).join(', ') : ''; - return `SET ${assignments}`; - } - case 'VAR_RESET': - const resetParamName = QuoteUtils.quoteIdentifier(node.name); - return `RESET ${resetParamName}`; - case 'VAR_RESET_ALL': - return 'RESET ALL'; - default: - throw new Error(`Unsupported VariableSetStmt kind: ${node.kind}`); + return `SET TRANSACTION ${transactionOptions.join(', ')}`; + } + } else { + // Handle other multi-variable sets + const assignments = node.args ? ListUtils.unwrapList(node.args).map(arg => { + if (arg.VariableSetStmt) { + return this.VariableSetStmt(arg.VariableSetStmt, context); + } + return this.visit(arg, context); + }).join(', ') : ''; + return `SET ${assignments}`; + } + case 'VAR_RESET': + const resetParamName = QuoteUtils.quoteIdentifier(node.name); + return `RESET ${resetParamName}`; + case 'VAR_RESET_ALL': + return 'RESET ALL'; + default: + throw new Error(`Unsupported VariableSetStmt kind: ${node.kind}`); } } @@ -4409,16 +4410,16 @@ export class Deparser implements DeparserVisitor { } switch (node.roletype) { - case 'ROLESPEC_PUBLIC': - return 'PUBLIC'; - case 'ROLESPEC_CURRENT_USER': - return 'CURRENT_USER'; - case 'ROLESPEC_SESSION_USER': - return 'SESSION_USER'; - case 'ROLESPEC_CURRENT_ROLE': - return 'CURRENT_ROLE'; - default: - return 'PUBLIC'; + case 'ROLESPEC_PUBLIC': + return 'PUBLIC'; + case 'ROLESPEC_CURRENT_USER': + return 'CURRENT_USER'; + case 'ROLESPEC_SESSION_USER': + return 'SESSION_USER'; + case 'ROLESPEC_CURRENT_ROLE': + return 'CURRENT_ROLE'; + default: + return 'PUBLIC'; } } @@ -4434,159 +4435,159 @@ export class Deparser implements DeparserVisitor { if (node.removeType) { switch (node.removeType) { - case 'OBJECT_TABLE': - output.push('TABLE'); - break; - case 'OBJECT_VIEW': - output.push('VIEW'); - break; - case 'OBJECT_INDEX': - output.push('INDEX'); - break; - case 'OBJECT_SEQUENCE': - output.push('SEQUENCE'); - break; - case 'OBJECT_SCHEMA': - output.push('SCHEMA'); - break; - case 'OBJECT_FUNCTION': - output.push('FUNCTION'); - break; - case 'OBJECT_PROCEDURE': - output.push('PROCEDURE'); - break; - case 'OBJECT_DATABASE': - output.push('DATABASE'); - break; - case 'OBJECT_EXTENSION': - output.push('EXTENSION'); - break; - case 'OBJECT_TYPE': - output.push('TYPE'); - break; - case 'OBJECT_DOMAIN': - output.push('DOMAIN'); - break; - case 'OBJECT_TRIGGER': - output.push('TRIGGER'); - break; - case 'OBJECT_RULE': - output.push('RULE'); - break; - case 'OBJECT_POLICY': - output.push('POLICY'); - break; - case 'OBJECT_ROLE': - output.push('ROLE'); - break; + case 'OBJECT_TABLE': + output.push('TABLE'); + break; + case 'OBJECT_VIEW': + output.push('VIEW'); + break; + case 'OBJECT_INDEX': + output.push('INDEX'); + break; + case 'OBJECT_SEQUENCE': + output.push('SEQUENCE'); + break; + case 'OBJECT_SCHEMA': + output.push('SCHEMA'); + break; + case 'OBJECT_FUNCTION': + output.push('FUNCTION'); + break; + case 'OBJECT_PROCEDURE': + output.push('PROCEDURE'); + break; + case 'OBJECT_DATABASE': + output.push('DATABASE'); + break; + case 'OBJECT_EXTENSION': + output.push('EXTENSION'); + break; + case 'OBJECT_TYPE': + output.push('TYPE'); + break; + case 'OBJECT_DOMAIN': + output.push('DOMAIN'); + break; + case 'OBJECT_TRIGGER': + output.push('TRIGGER'); + break; + case 'OBJECT_RULE': + output.push('RULE'); + break; + case 'OBJECT_POLICY': + output.push('POLICY'); + break; + case 'OBJECT_ROLE': + output.push('ROLE'); + break; - case 'OBJECT_TABLESPACE': - output.push('TABLESPACE'); - break; - case 'OBJECT_FOREIGN_SERVER': - output.push('SERVER'); - break; - case 'OBJECT_FDW': - output.push('FOREIGN DATA WRAPPER'); - break; - case 'OBJECT_PUBLICATION': - output.push('PUBLICATION'); - break; - case 'OBJECT_SUBSCRIPTION': - output.push('SUBSCRIPTION'); - break; - case 'OBJECT_CAST': - output.push('CAST'); - break; - case 'OBJECT_TRANSFORM': - output.push('TRANSFORM'); - break; - case 'OBJECT_ACCESS_METHOD': - output.push('ACCESS METHOD'); - break; - case 'OBJECT_OPERATOR': - output.push('OPERATOR'); - break; - case 'OBJECT_FOREIGN_TABLE': - output.push('FOREIGN TABLE'); - break; - case 'OBJECT_MATVIEW': - output.push('MATERIALIZED VIEW'); - break; - case 'OBJECT_OPCLASS': - output.push('OPERATOR CLASS'); - break; - case 'OBJECT_OPFAMILY': - output.push('OPERATOR FAMILY'); - break; - case 'OBJECT_COLLATION': - output.push('COLLATION'); - break; - case 'OBJECT_CONVERSION': - output.push('CONVERSION'); - break; - case 'OBJECT_LANGUAGE': - output.push('LANGUAGE'); - break; - case 'OBJECT_LARGEOBJECT': - output.push('LARGE OBJECT'); - break; - case 'OBJECT_AGGREGATE': - output.push('AGGREGATE'); - break; - case 'OBJECT_STATISTIC_EXT': - output.push('STATISTICS'); - break; - case 'OBJECT_EVENT_TRIGGER': - output.push('EVENT TRIGGER'); - break; - case 'OBJECT_AMOP': - output.push('OPERATOR CLASS'); - break; - case 'OBJECT_AMPROC': - output.push('OPERATOR CLASS'); - break; - case 'OBJECT_ATTRIBUTE': - output.push('ATTRIBUTE'); - break; - case 'OBJECT_DEFAULT': - output.push('DEFAULT'); - break; - case 'OBJECT_DEFACL': - output.push('DEFAULT PRIVILEGES'); - break; - case 'OBJECT_PARAMETER_ACL': - output.push('PARAMETER'); - break; - case 'OBJECT_PUBLICATION_NAMESPACE': - output.push('PUBLICATION'); - break; - case 'OBJECT_PUBLICATION_REL': - output.push('PUBLICATION'); - break; - case 'OBJECT_ROUTINE': - output.push('ROUTINE'); - break; - case 'OBJECT_TABCONSTRAINT': - output.push('CONSTRAINT'); - break; - case 'OBJECT_TSCONFIGURATION': - output.push('TEXT SEARCH CONFIGURATION'); - break; - case 'OBJECT_TSDICTIONARY': - output.push('TEXT SEARCH DICTIONARY'); - break; - case 'OBJECT_TSPARSER': - output.push('TEXT SEARCH PARSER'); - break; - case 'OBJECT_TSTEMPLATE': - output.push('TEXT SEARCH TEMPLATE'); - break; - case 'OBJECT_USER_MAPPING': - output.push('USER MAPPING'); - break; - default: - throw new Error(`Unsupported DROP object type: ${node.removeType}`); + case 'OBJECT_TABLESPACE': + output.push('TABLESPACE'); + break; + case 'OBJECT_FOREIGN_SERVER': + output.push('SERVER'); + break; + case 'OBJECT_FDW': + output.push('FOREIGN DATA WRAPPER'); + break; + case 'OBJECT_PUBLICATION': + output.push('PUBLICATION'); + break; + case 'OBJECT_SUBSCRIPTION': + output.push('SUBSCRIPTION'); + break; + case 'OBJECT_CAST': + output.push('CAST'); + break; + case 'OBJECT_TRANSFORM': + output.push('TRANSFORM'); + break; + case 'OBJECT_ACCESS_METHOD': + output.push('ACCESS METHOD'); + break; + case 'OBJECT_OPERATOR': + output.push('OPERATOR'); + break; + case 'OBJECT_FOREIGN_TABLE': + output.push('FOREIGN TABLE'); + break; + case 'OBJECT_MATVIEW': + output.push('MATERIALIZED VIEW'); + break; + case 'OBJECT_OPCLASS': + output.push('OPERATOR CLASS'); + break; + case 'OBJECT_OPFAMILY': + output.push('OPERATOR FAMILY'); + break; + case 'OBJECT_COLLATION': + output.push('COLLATION'); + break; + case 'OBJECT_CONVERSION': + output.push('CONVERSION'); + break; + case 'OBJECT_LANGUAGE': + output.push('LANGUAGE'); + break; + case 'OBJECT_LARGEOBJECT': + output.push('LARGE OBJECT'); + break; + case 'OBJECT_AGGREGATE': + output.push('AGGREGATE'); + break; + case 'OBJECT_STATISTIC_EXT': + output.push('STATISTICS'); + break; + case 'OBJECT_EVENT_TRIGGER': + output.push('EVENT TRIGGER'); + break; + case 'OBJECT_AMOP': + output.push('OPERATOR CLASS'); + break; + case 'OBJECT_AMPROC': + output.push('OPERATOR CLASS'); + break; + case 'OBJECT_ATTRIBUTE': + output.push('ATTRIBUTE'); + break; + case 'OBJECT_DEFAULT': + output.push('DEFAULT'); + break; + case 'OBJECT_DEFACL': + output.push('DEFAULT PRIVILEGES'); + break; + case 'OBJECT_PARAMETER_ACL': + output.push('PARAMETER'); + break; + case 'OBJECT_PUBLICATION_NAMESPACE': + output.push('PUBLICATION'); + break; + case 'OBJECT_PUBLICATION_REL': + output.push('PUBLICATION'); + break; + case 'OBJECT_ROUTINE': + output.push('ROUTINE'); + break; + case 'OBJECT_TABCONSTRAINT': + output.push('CONSTRAINT'); + break; + case 'OBJECT_TSCONFIGURATION': + output.push('TEXT SEARCH CONFIGURATION'); + break; + case 'OBJECT_TSDICTIONARY': + output.push('TEXT SEARCH DICTIONARY'); + break; + case 'OBJECT_TSPARSER': + output.push('TEXT SEARCH PARSER'); + break; + case 'OBJECT_TSTEMPLATE': + output.push('TEXT SEARCH TEMPLATE'); + break; + case 'OBJECT_USER_MAPPING': + output.push('USER MAPPING'); + break; + default: + throw new Error(`Unsupported DROP object type: ${node.removeType}`); } } @@ -4876,29 +4877,29 @@ export class Deparser implements DeparserVisitor { if (node.objtype) { switch (node.objtype) { - case 'OBJECT_TABLE': - output.push('TABLE'); - break; - case 'OBJECT_INDEX': - output.push('INDEX'); - break; - case 'OBJECT_SEQUENCE': - output.push('SEQUENCE'); - break; - case 'OBJECT_VIEW': - output.push('VIEW'); - break; - case 'OBJECT_MATVIEW': - output.push('MATERIALIZED VIEW'); - break; - case 'OBJECT_FOREIGN_TABLE': - output.push('FOREIGN TABLE'); - break; - case 'OBJECT_TYPE': - output.push('TYPE'); - break; - default: - output.push('TABLE'); + case 'OBJECT_TABLE': + output.push('TABLE'); + break; + case 'OBJECT_INDEX': + output.push('INDEX'); + break; + case 'OBJECT_SEQUENCE': + output.push('SEQUENCE'); + break; + case 'OBJECT_VIEW': + output.push('VIEW'); + break; + case 'OBJECT_MATVIEW': + output.push('MATERIALIZED VIEW'); + break; + case 'OBJECT_FOREIGN_TABLE': + output.push('FOREIGN TABLE'); + break; + case 'OBJECT_TYPE': + output.push('TYPE'); + break; + default: + output.push('TABLE'); } } else { output.push('TABLE'); @@ -4941,658 +4942,658 @@ export class Deparser implements DeparserVisitor { if (node.subtype) { switch (node.subtype) { - case 'AT_AddColumn': - if (context.objtype === 'OBJECT_TYPE') { - output.push('ADD ATTRIBUTE'); - } else { - output.push('ADD COLUMN'); - } - if (node.missing_ok) { - output.push('IF NOT EXISTS'); - } - if (node.def) { - const colDefData = this.getNodeData(node.def); + case 'AT_AddColumn': + if (context.objtype === 'OBJECT_TYPE') { + output.push('ADD ATTRIBUTE'); + } else { + output.push('ADD COLUMN'); + } + if (node.missing_ok) { + output.push('IF NOT EXISTS'); + } + if (node.def) { + const colDefData = this.getNodeData(node.def); - if (context.isPretty()) { - const parts: string[] = []; - const indentedParts: string[] = []; + if (context.isPretty()) { + const parts: string[] = []; + const indentedParts: string[] = []; - if (colDefData.colname) { - parts.push(QuoteUtils.quoteIdentifier(colDefData.colname)); - } + if (colDefData.colname) { + parts.push(QuoteUtils.quoteIdentifier(colDefData.colname)); + } - if (colDefData.typeName) { - parts.push(this.TypeName(colDefData.typeName, context)); - } + if (colDefData.typeName) { + parts.push(this.TypeName(colDefData.typeName, context)); + } - if (colDefData.is_not_null) { - indentedParts.push('NOT NULL'); - } + if (colDefData.is_not_null) { + indentedParts.push('NOT NULL'); + } - if (colDefData.collClause) { - indentedParts.push(this.CollateClause(colDefData.collClause, context)); - } + if (colDefData.collClause) { + indentedParts.push(this.CollateClause(colDefData.collClause, context)); + } - if (colDefData.constraints) { - const constraints = ListUtils.unwrapList(colDefData.constraints); - constraints.forEach(constraint => { - const columnConstraintContext = context.spawn('ColumnDef', { isColumnConstraint: true }); - const constraintStr = this.visit(constraint, columnConstraintContext); + if (colDefData.constraints) { + const constraints = ListUtils.unwrapList(colDefData.constraints); + constraints.forEach(constraint => { + const columnConstraintContext = context.spawn('ColumnDef', { isColumnConstraint: true }); + const constraintStr = this.visit(constraint, columnConstraintContext); - if (constraintStr.includes('REFERENCES') && constraintStr.includes('ON DELETE')) { - const refMatch = constraintStr.match(/^(.*REFERENCES[^)]*\([^)]*\))\s*(ON\s+DELETE\s+CASCADE.*)$/); - if (refMatch) { - indentedParts.push(refMatch[1]); - indentedParts.push(refMatch[2]); - } else { - indentedParts.push(constraintStr); - } - } else if (constraintStr === 'UNIQUE' && colDefData.raw_default) { - const defaultStr = 'DEFAULT ' + this.visit(colDefData.raw_default, context); - indentedParts.push('UNIQUE ' + defaultStr); + if (constraintStr.includes('REFERENCES') && constraintStr.includes('ON DELETE')) { + const refMatch = constraintStr.match(/^(.*REFERENCES[^)]*\([^)]*\))\s*(ON\s+DELETE\s+CASCADE.*)$/); + if (refMatch) { + indentedParts.push(refMatch[1]); + indentedParts.push(refMatch[2]); } else { indentedParts.push(constraintStr); } - }); - } + } else if (constraintStr === 'UNIQUE' && colDefData.raw_default) { + const defaultStr = 'DEFAULT ' + this.visit(colDefData.raw_default, context); + indentedParts.push('UNIQUE ' + defaultStr); + } else { + indentedParts.push(constraintStr); + } + }); + } - if (colDefData.raw_default && !colDefData.constraints?.some((c: any) => { - const constraintStr = this.visit(c, context.spawn('ColumnDef', { isColumnConstraint: true })); - return constraintStr === 'UNIQUE'; - })) { - const defaultStr = 'DEFAULT ' + this.visit(colDefData.raw_default, context); - indentedParts.push(defaultStr); - } + if (colDefData.raw_default && !colDefData.constraints?.some((c: any) => { + const constraintStr = this.visit(c, context.spawn('ColumnDef', { isColumnConstraint: true })); + return constraintStr === 'UNIQUE'; + })) { + const defaultStr = 'DEFAULT ' + this.visit(colDefData.raw_default, context); + indentedParts.push(defaultStr); + } - if (colDefData.fdwoptions && colDefData.fdwoptions.length > 0) { - indentedParts.push('OPTIONS'); - const columnContext = context.spawn('ColumnDef'); - const options = ListUtils.unwrapList(colDefData.fdwoptions).map(opt => this.visit(opt, columnContext)); - indentedParts.push(`(${options.join(', ')})`); - } + if (colDefData.fdwoptions && colDefData.fdwoptions.length > 0) { + indentedParts.push('OPTIONS'); + const columnContext = context.spawn('ColumnDef'); + const options = ListUtils.unwrapList(colDefData.fdwoptions).map(opt => this.visit(opt, columnContext)); + indentedParts.push(`(${options.join(', ')})`); + } - let result = parts.join(' '); - if (indentedParts.length > 0) { - const indentedStr = indentedParts.map(part => context.indent(part)).join(context.newline()); - result += context.newline() + indentedStr; - } + let result = parts.join(' '); + if (indentedParts.length > 0) { + const indentedStr = indentedParts.map(part => context.indent(part)).join(context.newline()); + result += context.newline() + indentedStr; + } - output.push(result); - } else { - const parts: string[] = []; - - if (colDefData.colname) { - parts.push(QuoteUtils.quoteIdentifier(colDefData.colname)); - } - - if (colDefData.typeName) { - parts.push(this.TypeName(colDefData.typeName, context)); - } - - if (colDefData.collClause) { - parts.push(this.CollateClause(colDefData.collClause, context)); - } + output.push(result); + } else { + const parts: string[] = []; - if (colDefData.fdwoptions && colDefData.fdwoptions.length > 0) { - parts.push('OPTIONS'); - const columnContext = context.spawn('ColumnDef'); - const options = ListUtils.unwrapList(colDefData.fdwoptions).map(opt => this.visit(opt, columnContext)); - parts.push(`(${options.join(', ')})`); - } + if (colDefData.colname) { + parts.push(QuoteUtils.quoteIdentifier(colDefData.colname)); + } - if (colDefData.constraints) { - const constraints = ListUtils.unwrapList(colDefData.constraints); - const constraintStrs = constraints.map(constraint => { - const columnConstraintContext = context.spawn('ColumnDef', { isColumnConstraint: true }); - return this.visit(constraint, columnConstraintContext); - }); - parts.push(...constraintStrs); - } + if (colDefData.typeName) { + parts.push(this.TypeName(colDefData.typeName, context)); + } - if (colDefData.raw_default) { - parts.push('DEFAULT'); - parts.push(this.visit(colDefData.raw_default, context)); - } + if (colDefData.collClause) { + parts.push(this.CollateClause(colDefData.collClause, context)); + } - if (colDefData.is_not_null) { - parts.push('NOT NULL'); - } + if (colDefData.fdwoptions && colDefData.fdwoptions.length > 0) { + parts.push('OPTIONS'); + const columnContext = context.spawn('ColumnDef'); + const options = ListUtils.unwrapList(colDefData.fdwoptions).map(opt => this.visit(opt, columnContext)); + parts.push(`(${options.join(', ')})`); + } - output.push(parts.join(' ')); + if (colDefData.constraints) { + const constraints = ListUtils.unwrapList(colDefData.constraints); + const constraintStrs = constraints.map(constraint => { + const columnConstraintContext = context.spawn('ColumnDef', { isColumnConstraint: true }); + return this.visit(constraint, columnConstraintContext); + }); + parts.push(...constraintStrs); } - } - if (node.behavior === 'DROP_CASCADE') { - output.push('CASCADE'); - } - break; - case 'AT_DropColumn': - if (node.missing_ok) { - if (context.objtype === 'OBJECT_TYPE') { - output.push('DROP ATTRIBUTE IF EXISTS'); - } else { - output.push('DROP COLUMN IF EXISTS'); + + if (colDefData.raw_default) { + parts.push('DEFAULT'); + parts.push(this.visit(colDefData.raw_default, context)); } - } else { - if (context.objtype === 'OBJECT_TYPE') { - output.push('DROP ATTRIBUTE'); - } else { - output.push('DROP COLUMN'); + + if (colDefData.is_not_null) { + parts.push('NOT NULL'); } + + output.push(parts.join(' ')); } - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - if (node.behavior === 'DROP_CASCADE') { - output.push('CASCADE'); - } else if (node.behavior === 'DROP_RESTRICT') { - output.push('RESTRICT'); - } - break; - case 'AT_AlterColumnType': + } + if (node.behavior === 'DROP_CASCADE') { + output.push('CASCADE'); + } + break; + case 'AT_DropColumn': + if (node.missing_ok) { if (context.objtype === 'OBJECT_TYPE') { - output.push('ALTER ATTRIBUTE'); + output.push('DROP ATTRIBUTE IF EXISTS'); } else { - output.push('ALTER COLUMN'); + output.push('DROP COLUMN IF EXISTS'); } - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - output.push('TYPE'); - if (node.def) { - const nodeData = this.getNodeData(node.def); - if (nodeData && nodeData.typeName) { - output.push(this.TypeName(nodeData.typeName, context)); - // Handle USING clause (stored in raw_default for ALTER COLUMN TYPE) - if (nodeData.raw_default) { - output.push('USING'); - output.push(this.visit(nodeData.raw_default, context)); - } - } else { - // Fallback to original behavior - const typeDef = this.visit(node.def, context); - output.push(typeDef); - } - } - // Handle CASCADE/RESTRICT behavior for ALTER COLUMN TYPE operations - if (node.behavior === 'DROP_CASCADE') { - output.push('CASCADE'); - } - break; - case 'AT_SetTableSpace': - output.push('SET TABLESPACE'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'AT_AddConstraint': - output.push('ADD'); - if (node.def) { - const constraintDef = this.visit(node.def, context); - output.push(constraintDef); - } - break; - case 'AT_DropConstraint': - if (node.missing_ok) { - output.push('DROP CONSTRAINT IF EXISTS'); - } else { - output.push('DROP CONSTRAINT'); - } - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - if (node.behavior === 'DROP_CASCADE') { - output.push('CASCADE'); - } else if (node.behavior === 'DROP_RESTRICT') { - output.push('RESTRICT'); - } - break; - case 'AT_SetRelOptions': - output.push('SET'); - if (node.def) { - const alterTableContext = context.spawn('AlterTableCmd', { subtype: 'AT_SetRelOptions' }); - const options = ListUtils.unwrapList(node.def) - .map(option => this.visit(option, alterTableContext)) - .join(', '); - output.push(`(${options})`); - } else { - output.push('()'); - } - break; - case 'AT_ResetRelOptions': - output.push('RESET'); - if (node.def) { - const alterTableContext = context.spawn('AlterTableCmd', { subtype: 'AT_ResetRelOptions' }); - const options = ListUtils.unwrapList(node.def) - .map(option => this.visit(option, alterTableContext)) - .join(', '); - output.push(`(${options})`); - } else { - output.push('()'); - } - break; - case 'AT_ColumnDefault': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - if (node.def) { - output.push('SET DEFAULT'); - output.push(this.visit(node.def, context)); - } else { - output.push('DROP DEFAULT'); - } - break; - case 'AT_SetStorage': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - output.push('SET STORAGE'); - if (node.def) { - const storageType = this.visit(node.def, context); - output.push(storageType); - } - break; - case 'AT_ClusterOn': - output.push('CLUSTER ON'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'AT_DropCluster': - output.push('SET WITHOUT CLUSTER'); - break; - case 'AT_ChangeOwner': - output.push('OWNER TO'); - if (node.newowner) { - output.push(this.RoleSpec(node.newowner, context)); - } - break; - case 'AT_AddInherit': - output.push('INHERIT'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_DropInherit': - output.push('NO INHERIT'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_SetNotNull': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - output.push('SET NOT NULL'); - break; - case 'AT_DropNotNull': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - output.push('DROP NOT NULL'); - break; - case 'AT_SetStatistics': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } else if (node.num !== undefined && node.num !== null) { - output.push(node.num.toString()); - } - output.push('SET STATISTICS'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_SetOptions': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - output.push('SET'); - if (node.def) { - const alterTableContext = context.spawn('AlterTableCmd', { subtype: 'AT_SetOptions' }); - const options = ListUtils.unwrapList(node.def) - .map(option => this.visit(option, alterTableContext)) - .join(', '); - output.push(`(${options})`); - } else { - output.push('()'); - } - break; - case 'AT_ResetOptions': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - output.push('RESET'); - if (node.def) { - const alterTableContext = context.spawn('AlterTableCmd', { subtype: 'AT_ResetOptions' }); - const options = ListUtils.unwrapList(node.def) - .map(option => this.visit(option, alterTableContext)) - .join(', '); - output.push(`(${options})`); - } else { - output.push('()'); - } - break; - case 'AT_SetCompression': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - output.push('SET COMPRESSION'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_ValidateConstraint': - output.push('VALIDATE CONSTRAINT'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'AT_EnableTrig': - output.push('ENABLE TRIGGER'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'AT_EnableAlwaysTrig': - output.push('ENABLE ALWAYS TRIGGER'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'AT_EnableReplicaTrig': - output.push('ENABLE REPLICA TRIGGER'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'AT_DisableTrig': - output.push('DISABLE TRIGGER'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'AT_EnableTrigAll': - output.push('ENABLE TRIGGER ALL'); - break; - case 'AT_DisableTrigAll': - output.push('DISABLE TRIGGER ALL'); - break; - case 'AT_EnableTrigUser': - output.push('ENABLE TRIGGER USER'); - break; - case 'AT_DisableTrigUser': - output.push('DISABLE TRIGGER USER'); - break; - case 'AT_EnableRule': - output.push('ENABLE RULE'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'AT_EnableAlwaysRule': - output.push('ENABLE ALWAYS RULE'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'AT_EnableReplicaRule': - output.push('ENABLE REPLICA RULE'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'AT_DisableRule': - output.push('DISABLE RULE'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'AT_SetAccessMethod': - output.push('SET ACCESS METHOD'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); + } else { + if (context.objtype === 'OBJECT_TYPE') { + output.push('DROP ATTRIBUTE'); } else { - // Handle DEFAULT access method case - output.push('DEFAULT'); - } - break; - case 'AT_EnableRowSecurity': - output.push('ENABLE ROW LEVEL SECURITY'); - break; - case 'AT_DisableRowSecurity': - output.push('DISABLE ROW LEVEL SECURITY'); - break; - case 'AT_ForceRowSecurity': - output.push('FORCE ROW LEVEL SECURITY'); - break; - case 'AT_NoForceRowSecurity': - output.push('NO FORCE ROW LEVEL SECURITY'); - break; - case 'AT_AttachPartition': - output.push('ATTACH PARTITION'); - if (node.def) { - output.push(this.visit(node.def, context)); + output.push('DROP COLUMN'); } - break; - case 'AT_DetachPartition': - output.push('DETACH PARTITION'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_DetachPartitionFinalize': - output.push('DETACH PARTITION'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - output.push('FINALIZE'); - break; - case 'AT_SetLogged': - output.push('SET LOGGED'); - break; - case 'AT_SetUnLogged': - output.push('SET UNLOGGED'); - break; - case 'AT_AddColumnToView': - output.push('ADD COLUMN'); - if (node.def) { - const columnDef = this.visit(node.def, context); - output.push(columnDef); - } - break; - case 'AT_CookedColumnDefault': + } + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + if (node.behavior === 'DROP_CASCADE') { + output.push('CASCADE'); + } else if (node.behavior === 'DROP_RESTRICT') { + output.push('RESTRICT'); + } + break; + case 'AT_AlterColumnType': + if (context.objtype === 'OBJECT_TYPE') { + output.push('ALTER ATTRIBUTE'); + } else { output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - if (node.def) { - output.push('SET DEFAULT'); - output.push(this.visit(node.def, context)); + } + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('TYPE'); + if (node.def) { + const nodeData = this.getNodeData(node.def); + if (nodeData && nodeData.typeName) { + output.push(this.TypeName(nodeData.typeName, context)); + // Handle USING clause (stored in raw_default for ALTER COLUMN TYPE) + if (nodeData.raw_default) { + output.push('USING'); + output.push(this.visit(nodeData.raw_default, context)); + } } else { - output.push('DROP DEFAULT'); - } - break; - case 'AT_SetExpression': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - output.push('SET EXPRESSION'); - if (node.def) { - output.push('AS'); - output.push(context.parens(this.visit(node.def, context))); - } - break; - case 'AT_DropExpression': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - output.push('DROP EXPRESSION'); - if (node.missing_ok) { - output.push('IF EXISTS'); - } - break; - case 'AT_AddIndex': - output.push('ADD'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_ReAddIndex': - output.push('ADD'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_ReAddConstraint': - output.push('ADD'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_ReAddDomainConstraint': - output.push('ADD'); - if (node.def) { - output.push(this.visit(node.def, context)); + // Fallback to original behavior + const typeDef = this.visit(node.def, context); + output.push(typeDef); } - break; - case 'AT_AlterConstraint': - if (node.def && this.getNodeType(node.def) === 'ATAlterConstraint') { - output.push(this.ATAlterConstraint(this.getNodeData(node.def) as t.ATAlterConstraint, context)); - } else { - output.push('ALTER CONSTRAINT'); - if (node.def && this.getNodeType(node.def) === 'Constraint') { - const constraintData = this.getNodeData(node.def) as any; - if (constraintData.conname) { - output.push(QuoteUtils.quoteIdentifier(constraintData.conname)); - if (constraintData.deferrable !== undefined) { - output.push(constraintData.deferrable ? 'DEFERRABLE' : 'NOT DEFERRABLE'); - } - if (constraintData.initdeferred !== undefined) { - output.push(constraintData.initdeferred ? 'INITIALLY DEFERRED' : 'INITIALLY IMMEDIATE'); - } + } + // Handle CASCADE/RESTRICT behavior for ALTER COLUMN TYPE operations + if (node.behavior === 'DROP_CASCADE') { + output.push('CASCADE'); + } + break; + case 'AT_SetTableSpace': + output.push('SET TABLESPACE'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'AT_AddConstraint': + output.push('ADD'); + if (node.def) { + const constraintDef = this.visit(node.def, context); + output.push(constraintDef); + } + break; + case 'AT_DropConstraint': + if (node.missing_ok) { + output.push('DROP CONSTRAINT IF EXISTS'); + } else { + output.push('DROP CONSTRAINT'); + } + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + if (node.behavior === 'DROP_CASCADE') { + output.push('CASCADE'); + } else if (node.behavior === 'DROP_RESTRICT') { + output.push('RESTRICT'); + } + break; + case 'AT_SetRelOptions': + output.push('SET'); + if (node.def) { + const alterTableContext = context.spawn('AlterTableCmd', { subtype: 'AT_SetRelOptions' }); + const options = ListUtils.unwrapList(node.def) + .map(option => this.visit(option, alterTableContext)) + .join(', '); + output.push(`(${options})`); + } else { + output.push('()'); + } + break; + case 'AT_ResetRelOptions': + output.push('RESET'); + if (node.def) { + const alterTableContext = context.spawn('AlterTableCmd', { subtype: 'AT_ResetRelOptions' }); + const options = ListUtils.unwrapList(node.def) + .map(option => this.visit(option, alterTableContext)) + .join(', '); + output.push(`(${options})`); + } else { + output.push('()'); + } + break; + case 'AT_ColumnDefault': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + if (node.def) { + output.push('SET DEFAULT'); + output.push(this.visit(node.def, context)); + } else { + output.push('DROP DEFAULT'); + } + break; + case 'AT_SetStorage': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('SET STORAGE'); + if (node.def) { + const storageType = this.visit(node.def, context); + output.push(storageType); + } + break; + case 'AT_ClusterOn': + output.push('CLUSTER ON'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'AT_DropCluster': + output.push('SET WITHOUT CLUSTER'); + break; + case 'AT_ChangeOwner': + output.push('OWNER TO'); + if (node.newowner) { + output.push(this.RoleSpec(node.newowner, context)); + } + break; + case 'AT_AddInherit': + output.push('INHERIT'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_DropInherit': + output.push('NO INHERIT'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_SetNotNull': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('SET NOT NULL'); + break; + case 'AT_DropNotNull': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('DROP NOT NULL'); + break; + case 'AT_SetStatistics': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } else if (node.num !== undefined && node.num !== null) { + output.push(node.num.toString()); + } + output.push('SET STATISTICS'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_SetOptions': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('SET'); + if (node.def) { + const alterTableContext = context.spawn('AlterTableCmd', { subtype: 'AT_SetOptions' }); + const options = ListUtils.unwrapList(node.def) + .map(option => this.visit(option, alterTableContext)) + .join(', '); + output.push(`(${options})`); + } else { + output.push('()'); + } + break; + case 'AT_ResetOptions': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('RESET'); + if (node.def) { + const alterTableContext = context.spawn('AlterTableCmd', { subtype: 'AT_ResetOptions' }); + const options = ListUtils.unwrapList(node.def) + .map(option => this.visit(option, alterTableContext)) + .join(', '); + output.push(`(${options})`); + } else { + output.push('()'); + } + break; + case 'AT_SetCompression': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('SET COMPRESSION'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_ValidateConstraint': + output.push('VALIDATE CONSTRAINT'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'AT_EnableTrig': + output.push('ENABLE TRIGGER'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'AT_EnableAlwaysTrig': + output.push('ENABLE ALWAYS TRIGGER'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'AT_EnableReplicaTrig': + output.push('ENABLE REPLICA TRIGGER'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'AT_DisableTrig': + output.push('DISABLE TRIGGER'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'AT_EnableTrigAll': + output.push('ENABLE TRIGGER ALL'); + break; + case 'AT_DisableTrigAll': + output.push('DISABLE TRIGGER ALL'); + break; + case 'AT_EnableTrigUser': + output.push('ENABLE TRIGGER USER'); + break; + case 'AT_DisableTrigUser': + output.push('DISABLE TRIGGER USER'); + break; + case 'AT_EnableRule': + output.push('ENABLE RULE'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'AT_EnableAlwaysRule': + output.push('ENABLE ALWAYS RULE'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'AT_EnableReplicaRule': + output.push('ENABLE REPLICA RULE'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'AT_DisableRule': + output.push('DISABLE RULE'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'AT_SetAccessMethod': + output.push('SET ACCESS METHOD'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } else { + // Handle DEFAULT access method case + output.push('DEFAULT'); + } + break; + case 'AT_EnableRowSecurity': + output.push('ENABLE ROW LEVEL SECURITY'); + break; + case 'AT_DisableRowSecurity': + output.push('DISABLE ROW LEVEL SECURITY'); + break; + case 'AT_ForceRowSecurity': + output.push('FORCE ROW LEVEL SECURITY'); + break; + case 'AT_NoForceRowSecurity': + output.push('NO FORCE ROW LEVEL SECURITY'); + break; + case 'AT_AttachPartition': + output.push('ATTACH PARTITION'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_DetachPartition': + output.push('DETACH PARTITION'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_DetachPartitionFinalize': + output.push('DETACH PARTITION'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + output.push('FINALIZE'); + break; + case 'AT_SetLogged': + output.push('SET LOGGED'); + break; + case 'AT_SetUnLogged': + output.push('SET UNLOGGED'); + break; + case 'AT_AddColumnToView': + output.push('ADD COLUMN'); + if (node.def) { + const columnDef = this.visit(node.def, context); + output.push(columnDef); + } + break; + case 'AT_CookedColumnDefault': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + if (node.def) { + output.push('SET DEFAULT'); + output.push(this.visit(node.def, context)); + } else { + output.push('DROP DEFAULT'); + } + break; + case 'AT_SetExpression': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('SET EXPRESSION'); + if (node.def) { + output.push('AS'); + output.push(context.parens(this.visit(node.def, context))); + } + break; + case 'AT_DropExpression': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('DROP EXPRESSION'); + if (node.missing_ok) { + output.push('IF EXISTS'); + } + break; + case 'AT_AddIndex': + output.push('ADD'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_ReAddIndex': + output.push('ADD'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_ReAddConstraint': + output.push('ADD'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_ReAddDomainConstraint': + output.push('ADD'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_AlterConstraint': + if (node.def && this.getNodeType(node.def) === 'ATAlterConstraint') { + output.push(this.ATAlterConstraint(this.getNodeData(node.def) as t.ATAlterConstraint, context)); + } else { + output.push('ALTER CONSTRAINT'); + if (node.def && this.getNodeType(node.def) === 'Constraint') { + const constraintData = this.getNodeData(node.def) as any; + if (constraintData.conname) { + output.push(QuoteUtils.quoteIdentifier(constraintData.conname)); + if (constraintData.deferrable !== undefined) { + output.push(constraintData.deferrable ? 'DEFERRABLE' : 'NOT DEFERRABLE'); } - } else if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - if (node.def) { - output.push(this.visit(node.def, context)); + if (constraintData.initdeferred !== undefined) { + output.push(constraintData.initdeferred ? 'INITIALLY DEFERRED' : 'INITIALLY IMMEDIATE'); } } - } - break; - case 'AT_AddIndexConstraint': - output.push('ADD'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_ReAddComment': - output.push('COMMENT'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_AlterColumnGenericOptions': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - output.push('OPTIONS'); - if (node.def) { - const alterColumnContext = context.spawn('AlterTableCmd', { alterColumnOptions: true }); - const options = ListUtils.unwrapList(node.def) - .map(option => this.visit(option, alterColumnContext)) - .join(', '); - output.push(`(${options})`); - } - break; - case 'AT_DropOids': - output.push('SET WITHOUT OIDS'); - break; - case 'AT_ReplaceRelOptions': - output.push('REPLACE'); - if (node.def && Array.isArray(node.def)) { - const options = ListUtils.unwrapList(node.def) - .map(option => this.visit(option, context)) - .join(', '); - output.push(`(${options})`); - } else { - output.push('()'); - } - break; - case 'AT_AddOf': - output.push('OF'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_DropOf': - output.push('NOT OF'); - break; - case 'AT_ReplicaIdentity': - output.push('REPLICA IDENTITY'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_GenericOptions': - output.push('OPTIONS'); - if (node.def) { - const alterTableContext = context.spawn('AlterTableCmd', { alterTableOptions: true }); - const options = ListUtils.unwrapList(node.def) - .map(option => this.visit(option, alterTableContext)) - .join(', '); - output.push(`(${options})`); - } - break; - case 'AT_AddIdentity': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - output.push('ADD'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_SetIdentity': - output.push('ALTER COLUMN'); - if (node.name) { + } else if (node.name) { output.push(QuoteUtils.quoteIdentifier(node.name)); + if (node.def) { + output.push(this.visit(node.def, context)); + } } - output.push('SET'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_DropIdentity': - output.push('ALTER COLUMN'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - output.push('DROP IDENTITY'); - if (node.behavior === 'DROP_CASCADE') { - output.push('CASCADE'); - } else if (node.behavior === 'DROP_RESTRICT') { - output.push('RESTRICT'); - } - break; - case 'AT_ReAddStatistics': - output.push('ADD'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - default: - throw new Error(`Unsupported AlterTableCmd subtype: ${node.subtype}`); + } + break; + case 'AT_AddIndexConstraint': + output.push('ADD'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_ReAddComment': + output.push('COMMENT'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_AlterColumnGenericOptions': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('OPTIONS'); + if (node.def) { + const alterColumnContext = context.spawn('AlterTableCmd', { alterColumnOptions: true }); + const options = ListUtils.unwrapList(node.def) + .map(option => this.visit(option, alterColumnContext)) + .join(', '); + output.push(`(${options})`); + } + break; + case 'AT_DropOids': + output.push('SET WITHOUT OIDS'); + break; + case 'AT_ReplaceRelOptions': + output.push('REPLACE'); + if (node.def && Array.isArray(node.def)) { + const options = ListUtils.unwrapList(node.def) + .map(option => this.visit(option, context)) + .join(', '); + output.push(`(${options})`); + } else { + output.push('()'); + } + break; + case 'AT_AddOf': + output.push('OF'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_DropOf': + output.push('NOT OF'); + break; + case 'AT_ReplicaIdentity': + output.push('REPLICA IDENTITY'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_GenericOptions': + output.push('OPTIONS'); + if (node.def) { + const alterTableContext = context.spawn('AlterTableCmd', { alterTableOptions: true }); + const options = ListUtils.unwrapList(node.def) + .map(option => this.visit(option, alterTableContext)) + .join(', '); + output.push(`(${options})`); + } + break; + case 'AT_AddIdentity': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('ADD'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_SetIdentity': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('SET'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_DropIdentity': + output.push('ALTER COLUMN'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + output.push('DROP IDENTITY'); + if (node.behavior === 'DROP_CASCADE') { + output.push('CASCADE'); + } else if (node.behavior === 'DROP_RESTRICT') { + output.push('RESTRICT'); + } + break; + case 'AT_ReAddStatistics': + output.push('ADD'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + default: + throw new Error(`Unsupported AlterTableCmd subtype: ${node.subtype}`); } } @@ -5681,6 +5682,7 @@ export class Deparser implements DeparserVisitor { if (bodyType === 'List') { const statements = ListUtils.unwrapList(node.sql_body); if (statements.length === 0 || (statements.length === 1 && Object.keys(statements[0]).length === 0)) { + // empty body: nothing to emit } else { // Handle nested List structure in BEGIN ATOMIC blocks let actualStatements = statements; @@ -5719,18 +5721,18 @@ export class Deparser implements DeparserVisitor { if (node.mode) { switch (node.mode) { - case 'FUNC_PARAM_IN': - output.push('IN'); - break; - case 'FUNC_PARAM_OUT': - output.push('OUT'); - break; - case 'FUNC_PARAM_INOUT': - output.push('INOUT'); - break; - case 'FUNC_PARAM_VARIADIC': - output.push('VARIADIC'); - break; + case 'FUNC_PARAM_IN': + output.push('IN'); + break; + case 'FUNC_PARAM_OUT': + output.push('OUT'); + break; + case 'FUNC_PARAM_INOUT': + output.push('INOUT'); + break; + case 'FUNC_PARAM_VARIADIC': + output.push('VARIADIC'); + break; } } @@ -5864,14 +5866,14 @@ export class Deparser implements DeparserVisitor { return `${node.defname}=${this.visit(node.arg, context.spawn('DefElem'))}`; } - // Handle CREATE OPERATOR boolean flags - MUST be first to preserve case - if (context.parentNodeTypes.includes('DefineStmt') && + // Handle CREATE OPERATOR boolean flags - MUST be first to preserve case + if (context.parentNodeTypes.includes('DefineStmt') && ['hashes', 'merges'].includes(node.defname.toLowerCase()) && !node.arg) { - if (node.defname !== node.defname.toLowerCase() && node.defname !== node.defname.toUpperCase()) { - return QuoteUtils.quoteIdentifier(node.defname); - } - return node.defname.charAt(0).toUpperCase() + node.defname.slice(1).toLowerCase(); - } + if (node.defname !== node.defname.toLowerCase() && node.defname !== node.defname.toUpperCase()) { + return QuoteUtils.quoteIdentifier(node.defname); + } + return node.defname.charAt(0).toUpperCase() + node.defname.slice(1).toLowerCase(); + } // Handle FDW-related statements and ALTER OPTIONS that use space format for options if (context.parentNodeTypes.includes('AlterFdwStmt') || context.parentNodeTypes.includes('CreateFdwStmt') || context.parentNodeTypes.includes('CreateForeignServerStmt') || context.parentNodeTypes.includes('AlterForeignServerStmt') || context.parentNodeTypes.includes('CreateUserMappingStmt') || context.parentNodeTypes.includes('AlterUserMappingStmt') || context.parentNodeTypes.includes('ColumnDef') || context.parentNodeTypes.includes('CreateForeignTableStmt') || context.parentNodeTypes.includes('ImportForeignSchemaStmt') || context.alterColumnOptions || context.alterTableOptions) { @@ -5893,7 +5895,7 @@ export class Deparser implements DeparserVisitor { ? `'${argValue}'` : argValue; - const quotedDefname = QuoteUtils.quoteIdentifier(node.defname); + const quotedDefname = QuoteUtils.quoteIdentifier(node.defname); if (node.defaction === 'DEFELEM_ADD') { return `ADD ${quotedDefname} ${finalValue}`; @@ -5918,8 +5920,8 @@ export class Deparser implements DeparserVisitor { return `SET ${node.defname} ${quotedValue}`; } - const quotedDefname = QuoteUtils.quoteIdentifier(node.defname); - return `${quotedDefname} ${quotedValue}`; + const quotedDefname = QuoteUtils.quoteIdentifier(node.defname); + return `${quotedDefname} ${quotedValue}`; } else if (node.defaction === 'DEFELEM_DROP') { // Handle DROP without argument return `DROP ${node.defname}`; @@ -5984,8 +5986,8 @@ export class Deparser implements DeparserVisitor { const quotedValue = typeof argValue === 'string' ? QuoteUtils.escape(argValue) : argValue; - const quotedDefname = QuoteUtils.quoteIdentifier(node.defname); - return `${quotedDefname} ${quotedValue}`; + const quotedDefname = QuoteUtils.quoteIdentifier(node.defname); + return `${quotedDefname} ${quotedValue}`; } @@ -6064,11 +6066,11 @@ export class Deparser implements DeparserVisitor { const listItems = ListUtils.unwrapList(listData.items); const parts = listItems.map(item => { const itemData = this.getNodeData(item); - if (this.getNodeType(item) === 'String') { - // Check if this identifier needs quotes to preserve case - const value = itemData.sval; - return QuoteUtils.quoteIdentifier(value); - } + if (this.getNodeType(item) === 'String') { + // Check if this identifier needs quotes to preserve case + const value = itemData.sval; + return QuoteUtils.quoteIdentifier(value); + } return this.visit(item, context); }); return `OWNED BY ${parts.join('.')}`; @@ -6332,18 +6334,18 @@ export class Deparser implements DeparserVisitor { return preservedName; } - // Handle boolean flags (no arguments) - preserve quoted case - if (['hashes', 'merges'].includes(node.defname.toLowerCase())) { - if (node.defname !== node.defname.toLowerCase() && node.defname !== node.defname.toUpperCase()) { - return QuoteUtils.quoteIdentifier(node.defname); - } - return preservedName.toUpperCase(); - } + // Handle boolean flags (no arguments) - preserve quoted case + if (['hashes', 'merges'].includes(node.defname.toLowerCase())) { + if (node.defname !== node.defname.toLowerCase() && node.defname !== node.defname.toUpperCase()) { + return QuoteUtils.quoteIdentifier(node.defname); + } + return preservedName.toUpperCase(); + } - // Handle CREATE AGGREGATE quoted identifiers - preserve quotes when needed - const quotedDefname = QuoteUtils.quoteIdentifier(node.defname); - if (quotedDefname !== node.defname) { - if (node.arg) { + // Handle CREATE AGGREGATE quoted identifiers - preserve quotes when needed + const quotedDefname = QuoteUtils.quoteIdentifier(node.defname); + if (quotedDefname !== node.defname) { + if (node.arg) { if (this.getNodeType(node.arg) === 'String') { const stringData = this.getNodeData(node.arg); // Handle boolean string values without quotes @@ -6402,13 +6404,13 @@ export class Deparser implements DeparserVisitor { return `${node.defname} = ${quotedValue}`; } - // Handle CREATE TYPE boolean flags - preserve quoted case for attributes like "Passedbyvalue" - if (context.parentNodeTypes.includes('DefineStmt') && !node.arg) { - // Check if the original defname appears to be quoted (mixed case that's not all upper/lower) - if (node.defname !== node.defname.toLowerCase() && node.defname !== node.defname.toUpperCase()) { - return QuoteUtils.quoteIdentifier(node.defname); - } - } + // Handle CREATE TYPE boolean flags - preserve quoted case for attributes like "Passedbyvalue" + if (context.parentNodeTypes.includes('DefineStmt') && !node.arg) { + // Check if the original defname appears to be quoted (mixed case that's not all upper/lower) + if (node.defname !== node.defname.toLowerCase() && node.defname !== node.defname.toUpperCase()) { + return QuoteUtils.quoteIdentifier(node.defname); + } + } return node.defname.toUpperCase(); } @@ -6588,17 +6590,17 @@ export class Deparser implements DeparserVisitor { if (node.op) { switch (node.op) { - case 'SETOP_UNION': - output.push(node.all ? 'UNION ALL' : 'UNION'); - break; - case 'SETOP_INTERSECT': - output.push(node.all ? 'INTERSECT ALL' : 'INTERSECT'); - break; - case 'SETOP_EXCEPT': - output.push(node.all ? 'EXCEPT ALL' : 'EXCEPT'); - break; - default: - throw new Error(`Unsupported SetOperation: ${node.op}`); + case 'SETOP_UNION': + output.push(node.all ? 'UNION ALL' : 'UNION'); + break; + case 'SETOP_INTERSECT': + output.push(node.all ? 'INTERSECT ALL' : 'INTERSECT'); + break; + case 'SETOP_EXCEPT': + output.push(node.all ? 'EXCEPT ALL' : 'EXCEPT'); + break; + default: + throw new Error(`Unsupported SetOperation: ${node.op}`); } } @@ -6614,27 +6616,27 @@ export class Deparser implements DeparserVisitor { if (node.identity_type) { switch (node.identity_type) { - case 'd': - case 'REPLICA_IDENTITY_DEFAULT': - output.push('DEFAULT'); - break; - case 'f': - case 'REPLICA_IDENTITY_FULL': - output.push('FULL'); - break; - case 'n': - case 'REPLICA_IDENTITY_NOTHING': - output.push('NOTHING'); - break; - case 'i': - case 'REPLICA_IDENTITY_INDEX': - output.push('USING', 'INDEX'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - default: - throw new Error(`Unsupported replica identity type: ${node.identity_type}`); + case 'd': + case 'REPLICA_IDENTITY_DEFAULT': + output.push('DEFAULT'); + break; + case 'f': + case 'REPLICA_IDENTITY_FULL': + output.push('FULL'); + break; + case 'n': + case 'REPLICA_IDENTITY_NOTHING': + output.push('NOTHING'); + break; + case 'i': + case 'REPLICA_IDENTITY_INDEX': + output.push('USING', 'INDEX'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + default: + throw new Error(`Unsupported replica identity type: ${node.identity_type}`); } } @@ -6668,89 +6670,89 @@ export class Deparser implements DeparserVisitor { if (node.subtype) { switch (node.subtype) { - case 'AT_SetNotNull': - output.push('SET', 'NOT', 'NULL'); - break; - case 'AT_DropNotNull': - output.push('DROP', 'NOT', 'NULL'); - break; - case 'AT_SetDefault': + case 'AT_SetNotNull': + output.push('SET', 'NOT', 'NULL'); + break; + case 'AT_DropNotNull': + output.push('DROP', 'NOT', 'NULL'); + break; + case 'AT_SetDefault': + output.push('SET', 'DEFAULT'); + if (node.def) { + output.push(this.visit(node.def, context)); + } + break; + case 'AT_DropDefault': + output.push('DROP', 'DEFAULT'); + break; + case 'AT_AddConstraint': + output.push('ADD'); + if (node.def) { + // Pass domain context to avoid adding constraint names for domain constraints + const domainContext = context.spawn('CreateDomainStmt', { isDomainConstraint: true }); + output.push(this.visit(node.def, domainContext)); + } + break; + case 'AT_DropConstraint': + output.push('DROP', 'CONSTRAINT'); + if (node.missing_ok) { + output.push('IF', 'EXISTS'); + } + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + if (node.behavior === 'DROP_CASCADE') { + output.push('CASCADE'); + } + break; + case 'AT_ValidateConstraint': + output.push('VALIDATE', 'CONSTRAINT'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'C': + output.push('ADD'); + if (node.def) { + // Pass domain context to avoid adding constraint names for domain constraints + const domainContext = context.spawn('CreateDomainStmt', { isDomainConstraint: true }); + output.push(this.visit(node.def, domainContext)); + } + break; + case 'X': + output.push('DROP', 'CONSTRAINT'); + if (node.missing_ok) { + output.push('IF', 'EXISTS'); + } + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + if (node.behavior === 'DROP_CASCADE') { + output.push('CASCADE'); + } + break; + case 'V': + output.push('VALIDATE', 'CONSTRAINT'); + if (node.name) { + output.push(QuoteUtils.quoteIdentifier(node.name)); + } + break; + case 'O': + output.push('SET', 'NOT', 'NULL'); + break; + case 'N': + output.push('DROP', 'NOT', 'NULL'); + break; + case 'T': + if (node.def) { output.push('SET', 'DEFAULT'); - if (node.def) { - output.push(this.visit(node.def, context)); - } - break; - case 'AT_DropDefault': + output.push(this.visit(node.def, context)); + } else { output.push('DROP', 'DEFAULT'); - break; - case 'AT_AddConstraint': - output.push('ADD'); - if (node.def) { - // Pass domain context to avoid adding constraint names for domain constraints - const domainContext = context.spawn('CreateDomainStmt', { isDomainConstraint: true }); - output.push(this.visit(node.def, domainContext)); - } - break; - case 'AT_DropConstraint': - output.push('DROP', 'CONSTRAINT'); - if (node.missing_ok) { - output.push('IF', 'EXISTS'); - } - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - if (node.behavior === 'DROP_CASCADE') { - output.push('CASCADE'); - } - break; - case 'AT_ValidateConstraint': - output.push('VALIDATE', 'CONSTRAINT'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'C': - output.push('ADD'); - if (node.def) { - // Pass domain context to avoid adding constraint names for domain constraints - const domainContext = context.spawn('CreateDomainStmt', { isDomainConstraint: true }); - output.push(this.visit(node.def, domainContext)); - } - break; - case 'X': - output.push('DROP', 'CONSTRAINT'); - if (node.missing_ok) { - output.push('IF', 'EXISTS'); - } - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - if (node.behavior === 'DROP_CASCADE') { - output.push('CASCADE'); - } - break; - case 'V': - output.push('VALIDATE', 'CONSTRAINT'); - if (node.name) { - output.push(QuoteUtils.quoteIdentifier(node.name)); - } - break; - case 'O': - output.push('SET', 'NOT', 'NULL'); - break; - case 'N': - output.push('DROP', 'NOT', 'NULL'); - break; - case 'T': - if (node.def) { - output.push('SET', 'DEFAULT'); - output.push(this.visit(node.def, context)); - } else { - output.push('DROP', 'DEFAULT'); - } - break; - default: - throw new Error(`Unsupported AlterDomainStmt subtype: ${node.subtype}`); + } + break; + default: + throw new Error(`Unsupported AlterDomainStmt subtype: ${node.subtype}`); } } @@ -6859,16 +6861,16 @@ export class Deparser implements DeparserVisitor { DiscardStmt(node: t.DiscardStmt, context: DeparserContext): string { switch (node.target) { - case 'DISCARD_ALL': - return 'DISCARD ALL'; - case 'DISCARD_PLANS': - return 'DISCARD PLANS'; - case 'DISCARD_SEQUENCES': - return 'DISCARD SEQUENCES'; - case 'DISCARD_TEMP': - return 'DISCARD TEMP'; - default: - throw new Error(`Unsupported DiscardStmt target: ${node.target}`); + case 'DISCARD_ALL': + return 'DISCARD ALL'; + case 'DISCARD_PLANS': + return 'DISCARD PLANS'; + case 'DISCARD_SEQUENCES': + return 'DISCARD SEQUENCES'; + case 'DISCARD_TEMP': + return 'DISCARD TEMP'; + default: + throw new Error(`Unsupported DiscardStmt target: ${node.target}`); } } @@ -6877,83 +6879,83 @@ export class Deparser implements DeparserVisitor { if (node.objtype) { switch (node.objtype) { - case 'OBJECT_TABLE': - output.push('TABLE'); - break; - case 'OBJECT_COLUMN': - output.push('COLUMN'); - break; - case 'OBJECT_INDEX': - output.push('INDEX'); - break; - case 'OBJECT_FUNCTION': - output.push('FUNCTION'); - break; - case 'OBJECT_VIEW': - output.push('VIEW'); - break; - case 'OBJECT_SCHEMA': - output.push('SCHEMA'); - break; - case 'OBJECT_DATABASE': - output.push('DATABASE'); - break; - case 'OBJECT_MATVIEW': - output.push('MATERIALIZED VIEW'); - break; - case 'OBJECT_TABCONSTRAINT': - output.push('CONSTRAINT'); - break; - case 'OBJECT_TRIGGER': - output.push('TRIGGER'); - break; - case 'OBJECT_FDW': - output.push('FOREIGN DATA WRAPPER'); - break; - case 'OBJECT_EVENT_TRIGGER': - output.push('EVENT TRIGGER'); - break; - case 'OBJECT_FOREIGN_SERVER': - output.push('SERVER'); - break; - case 'OBJECT_FOREIGN_TABLE': - output.push('FOREIGN TABLE'); - break; - case 'OBJECT_STATISTIC_EXT': - output.push('STATISTICS'); - break; - case 'OBJECT_LARGEOBJECT': - output.push('LARGE OBJECT'); - break; - case 'OBJECT_OPERATOR': - output.push('OPERATOR'); - break; - case 'OBJECT_OPCLASS': - output.push('OPERATOR CLASS'); - break; - case 'OBJECT_OPFAMILY': - output.push('OPERATOR FAMILY'); - break; - case 'OBJECT_POLICY': - output.push('POLICY'); - break; - case 'OBJECT_TSPARSER': - output.push('TEXT SEARCH PARSER'); - break; - case 'OBJECT_TSDICTIONARY': - output.push('TEXT SEARCH DICTIONARY'); - break; - case 'OBJECT_TSTEMPLATE': - output.push('TEXT SEARCH TEMPLATE'); - break; - case 'OBJECT_TSCONFIGURATION': - output.push('TEXT SEARCH CONFIGURATION'); - break; - case 'OBJECT_TRANSFORM': - output.push('TRANSFORM'); - break; - default: - output.push(node.objtype.replace('OBJECT_', '')); + case 'OBJECT_TABLE': + output.push('TABLE'); + break; + case 'OBJECT_COLUMN': + output.push('COLUMN'); + break; + case 'OBJECT_INDEX': + output.push('INDEX'); + break; + case 'OBJECT_FUNCTION': + output.push('FUNCTION'); + break; + case 'OBJECT_VIEW': + output.push('VIEW'); + break; + case 'OBJECT_SCHEMA': + output.push('SCHEMA'); + break; + case 'OBJECT_DATABASE': + output.push('DATABASE'); + break; + case 'OBJECT_MATVIEW': + output.push('MATERIALIZED VIEW'); + break; + case 'OBJECT_TABCONSTRAINT': + output.push('CONSTRAINT'); + break; + case 'OBJECT_TRIGGER': + output.push('TRIGGER'); + break; + case 'OBJECT_FDW': + output.push('FOREIGN DATA WRAPPER'); + break; + case 'OBJECT_EVENT_TRIGGER': + output.push('EVENT TRIGGER'); + break; + case 'OBJECT_FOREIGN_SERVER': + output.push('SERVER'); + break; + case 'OBJECT_FOREIGN_TABLE': + output.push('FOREIGN TABLE'); + break; + case 'OBJECT_STATISTIC_EXT': + output.push('STATISTICS'); + break; + case 'OBJECT_LARGEOBJECT': + output.push('LARGE OBJECT'); + break; + case 'OBJECT_OPERATOR': + output.push('OPERATOR'); + break; + case 'OBJECT_OPCLASS': + output.push('OPERATOR CLASS'); + break; + case 'OBJECT_OPFAMILY': + output.push('OPERATOR FAMILY'); + break; + case 'OBJECT_POLICY': + output.push('POLICY'); + break; + case 'OBJECT_TSPARSER': + output.push('TEXT SEARCH PARSER'); + break; + case 'OBJECT_TSDICTIONARY': + output.push('TEXT SEARCH DICTIONARY'); + break; + case 'OBJECT_TSTEMPLATE': + output.push('TEXT SEARCH TEMPLATE'); + break; + case 'OBJECT_TSCONFIGURATION': + output.push('TEXT SEARCH CONFIGURATION'); + break; + case 'OBJECT_TRANSFORM': + output.push('TRANSFORM'); + break; + default: + output.push(node.objtype.replace('OBJECT_', '')); } } @@ -7389,17 +7391,17 @@ export class Deparser implements DeparserVisitor { if (node.action) { switch (node.action) { - case 'AP_AddObjects': - output.push('ADD'); - break; - case 'AP_DropObjects': - output.push('DROP'); - break; - case 'AP_SetObjects': - output.push('SET'); - break; - default: - throw new Error(`Unsupported AlterPublicationStmt action: ${node.action}`); + case 'AP_AddObjects': + output.push('ADD'); + break; + case 'AP_DropObjects': + output.push('DROP'); + break; + case 'AP_SetObjects': + output.push('SET'); + break; + default: + throw new Error(`Unsupported AlterPublicationStmt action: ${node.action}`); } } @@ -7429,33 +7431,33 @@ export class Deparser implements DeparserVisitor { if (node.kind) { switch (node.kind) { - case 'ALTER_SUBSCRIPTION_OPTIONS': - output.push('SET'); - break; - case 'ALTER_SUBSCRIPTION_CONNECTION': - output.push('CONNECTION'); - if (node.conninfo) { - output.push(`'${node.conninfo}'`); - } - break; - case 'ALTER_SUBSCRIPTION_SET_PUBLICATION': - output.push('SET PUBLICATION'); - if (node.publication && node.publication.length > 0) { - const publications = ListUtils.unwrapList(node.publication).map(pub => this.visit(pub, context)); - output.push(publications.join(', ')); - } - break; - case 'ALTER_SUBSCRIPTION_REFRESH': - output.push('REFRESH PUBLICATION'); - break; - case 'ALTER_SUBSCRIPTION_ENABLED': - output.push('ENABLE'); - break; - case 'ALTER_SUBSCRIPTION_SKIP': - output.push('SKIP'); - break; - default: - throw new Error(`Unsupported AlterSubscriptionStmt kind: ${node.kind}`); + case 'ALTER_SUBSCRIPTION_OPTIONS': + output.push('SET'); + break; + case 'ALTER_SUBSCRIPTION_CONNECTION': + output.push('CONNECTION'); + if (node.conninfo) { + output.push(`'${node.conninfo}'`); + } + break; + case 'ALTER_SUBSCRIPTION_SET_PUBLICATION': + output.push('SET PUBLICATION'); + if (node.publication && node.publication.length > 0) { + const publications = ListUtils.unwrapList(node.publication).map(pub => this.visit(pub, context)); + output.push(publications.join(', ')); + } + break; + case 'ALTER_SUBSCRIPTION_REFRESH': + output.push('REFRESH PUBLICATION'); + break; + case 'ALTER_SUBSCRIPTION_ENABLED': + output.push('ENABLE'); + break; + case 'ALTER_SUBSCRIPTION_SKIP': + output.push('SKIP'); + break; + default: + throw new Error(`Unsupported AlterSubscriptionStmt kind: ${node.kind}`); } } @@ -7481,12 +7483,12 @@ export class Deparser implements DeparserVisitor { if (node.behavior) { switch (node.behavior) { - case 'DROP_CASCADE': - output.push('CASCADE'); - break; - case 'DROP_RESTRICT': - output.push('RESTRICT'); - break; + case 'DROP_CASCADE': + output.push('CASCADE'); + break; + case 'DROP_RESTRICT': + output.push('RESTRICT'); + break; } } @@ -7626,12 +7628,12 @@ export class Deparser implements DeparserVisitor { if (node.behavior) { switch (node.behavior) { - case 'DROP_CASCADE': - output.push('CASCADE'); - break; - case 'DROP_RESTRICT': - output.push('RESTRICT'); - break; + case 'DROP_CASCADE': + output.push('CASCADE'); + break; + case 'DROP_RESTRICT': + output.push('RESTRICT'); + break; } } @@ -7683,78 +7685,78 @@ export class Deparser implements DeparserVisitor { if (node.kind) { switch (node.kind) { - case 'ALTER_TSCONFIG_ADD_MAPPING': - output.push('ADD', 'MAPPING', 'FOR'); - if (node.tokentype && node.tokentype.length > 0) { - const tokenTypes = ListUtils.unwrapList(node.tokentype).map(token => this.visit(token, context)); - output.push(tokenTypes.join(', ')); - } - if (node.dicts && node.dicts.length > 0) { - output.push('WITH'); - const dictNames = ListUtils.unwrapList(node.dicts).map(dict => { - if (dict.List && dict.List.items) { - return ListUtils.unwrapList(dict.List.items).map(item => this.visit(item, context)).join('.'); - } - return this.visit(dict, context); - }); - output.push(dictNames.join(', ')); - } - break; - case 'ALTER_TSCONFIG_ALTER_MAPPING_FOR_TOKEN': - output.push('ALTER', 'MAPPING', 'FOR'); - if (node.tokentype && node.tokentype.length > 0) { - const tokenTypes = ListUtils.unwrapList(node.tokentype).map(token => this.visit(token, context)); - output.push(tokenTypes.join(', ')); - } - if (node.dicts && node.dicts.length > 0) { - output.push('WITH'); - const dictNames = ListUtils.unwrapList(node.dicts).map(dict => { - if (dict.List && dict.List.items) { - return ListUtils.unwrapList(dict.List.items).map(item => this.visit(item, context)).join('.'); - } - return this.visit(dict, context); - }); - output.push(dictNames.join(', ')); - } - break; - case 'ALTER_TSCONFIG_REPLACE_DICT': - output.push('ALTER', 'MAPPING', 'REPLACE'); - if (node.dicts && node.dicts.length >= 2) { - const dictNames = ListUtils.unwrapList(node.dicts).map(dict => { - if (dict.List && dict.List.items) { - return ListUtils.unwrapList(dict.List.items).map(item => this.visit(item, context)).join('.'); - } - return this.visit(dict, context); - }); - output.push(dictNames[0], 'WITH', dictNames.slice(1).join(', ')); - } - break; - case 'ALTER_TSCONFIG_REPLACE_DICT_FOR_TOKEN': - output.push('ALTER', 'MAPPING', 'FOR'); - if (node.tokentype && node.tokentype.length > 0) { - const tokenTypes = ListUtils.unwrapList(node.tokentype).map(token => this.visit(token, context)); - output.push(tokenTypes.join(', ')); - } - if (node.dicts && node.dicts.length >= 2) { - output.push('REPLACE'); - const dictNames = ListUtils.unwrapList(node.dicts).map(dict => { - if (dict.List && dict.List.items) { - return ListUtils.unwrapList(dict.List.items).map(item => this.visit(item, context)).join('.'); - } - return this.visit(dict, context); - }); - output.push(dictNames[0], 'WITH', dictNames.slice(1).join(', ')); - } - break; - case 'ALTER_TSCONFIG_DROP_MAPPING': - output.push('DROP', 'MAPPING', 'FOR'); - if (node.tokentype && node.tokentype.length > 0) { - const tokenTypes = ListUtils.unwrapList(node.tokentype).map(token => this.visit(token, context)); - output.push(tokenTypes.join(', ')); - } - break; - default: - throw new Error(`Unsupported AlterTSConfigurationStmt kind: ${node.kind}`); + case 'ALTER_TSCONFIG_ADD_MAPPING': + output.push('ADD', 'MAPPING', 'FOR'); + if (node.tokentype && node.tokentype.length > 0) { + const tokenTypes = ListUtils.unwrapList(node.tokentype).map(token => this.visit(token, context)); + output.push(tokenTypes.join(', ')); + } + if (node.dicts && node.dicts.length > 0) { + output.push('WITH'); + const dictNames = ListUtils.unwrapList(node.dicts).map(dict => { + if (dict.List && dict.List.items) { + return ListUtils.unwrapList(dict.List.items).map(item => this.visit(item, context)).join('.'); + } + return this.visit(dict, context); + }); + output.push(dictNames.join(', ')); + } + break; + case 'ALTER_TSCONFIG_ALTER_MAPPING_FOR_TOKEN': + output.push('ALTER', 'MAPPING', 'FOR'); + if (node.tokentype && node.tokentype.length > 0) { + const tokenTypes = ListUtils.unwrapList(node.tokentype).map(token => this.visit(token, context)); + output.push(tokenTypes.join(', ')); + } + if (node.dicts && node.dicts.length > 0) { + output.push('WITH'); + const dictNames = ListUtils.unwrapList(node.dicts).map(dict => { + if (dict.List && dict.List.items) { + return ListUtils.unwrapList(dict.List.items).map(item => this.visit(item, context)).join('.'); + } + return this.visit(dict, context); + }); + output.push(dictNames.join(', ')); + } + break; + case 'ALTER_TSCONFIG_REPLACE_DICT': + output.push('ALTER', 'MAPPING', 'REPLACE'); + if (node.dicts && node.dicts.length >= 2) { + const dictNames = ListUtils.unwrapList(node.dicts).map(dict => { + if (dict.List && dict.List.items) { + return ListUtils.unwrapList(dict.List.items).map(item => this.visit(item, context)).join('.'); + } + return this.visit(dict, context); + }); + output.push(dictNames[0], 'WITH', dictNames.slice(1).join(', ')); + } + break; + case 'ALTER_TSCONFIG_REPLACE_DICT_FOR_TOKEN': + output.push('ALTER', 'MAPPING', 'FOR'); + if (node.tokentype && node.tokentype.length > 0) { + const tokenTypes = ListUtils.unwrapList(node.tokentype).map(token => this.visit(token, context)); + output.push(tokenTypes.join(', ')); + } + if (node.dicts && node.dicts.length >= 2) { + output.push('REPLACE'); + const dictNames = ListUtils.unwrapList(node.dicts).map(dict => { + if (dict.List && dict.List.items) { + return ListUtils.unwrapList(dict.List.items).map(item => this.visit(item, context)).join('.'); + } + return this.visit(dict, context); + }); + output.push(dictNames[0], 'WITH', dictNames.slice(1).join(', ')); + } + break; + case 'ALTER_TSCONFIG_DROP_MAPPING': + output.push('DROP', 'MAPPING', 'FOR'); + if (node.tokentype && node.tokentype.length > 0) { + const tokenTypes = ListUtils.unwrapList(node.tokentype).map(token => this.visit(token, context)); + output.push(tokenTypes.join(', ')); + } + break; + default: + throw new Error(`Unsupported AlterTSConfigurationStmt kind: ${node.kind}`); } } @@ -7782,38 +7784,38 @@ export class Deparser implements DeparserVisitor { // Handle direction first, then check for ALL within each direction if (node.direction) { switch (node.direction) { - case 'FETCH_FORWARD': - if (isAll) { - output.push('FORWARD', 'ALL'); - } else if (node.howMany !== undefined && node.howMany !== null) { - output.push('FORWARD', node.howMany.toString()); - } else { - output.push('FORWARD'); - } - break; - case 'FETCH_BACKWARD': - if (isAll) { - output.push('BACKWARD', 'ALL'); - } else if (node.howMany !== undefined && node.howMany !== null) { - output.push('BACKWARD', node.howMany.toString()); - } else { - output.push('BACKWARD'); - } - break; - case 'FETCH_ABSOLUTE': - if (node.howMany !== undefined && node.howMany !== null) { - output.push('ABSOLUTE', node.howMany.toString()); - } - break; - case 'FETCH_RELATIVE': - if (node.howMany !== undefined && node.howMany !== null) { - output.push('RELATIVE', node.howMany.toString()); - } else { - output.push('RELATIVE', '0'); - } - break; - default: - throw new Error(`Unsupported FetchStmt direction: ${node.direction}`); + case 'FETCH_FORWARD': + if (isAll) { + output.push('FORWARD', 'ALL'); + } else if (node.howMany !== undefined && node.howMany !== null) { + output.push('FORWARD', node.howMany.toString()); + } else { + output.push('FORWARD'); + } + break; + case 'FETCH_BACKWARD': + if (isAll) { + output.push('BACKWARD', 'ALL'); + } else if (node.howMany !== undefined && node.howMany !== null) { + output.push('BACKWARD', node.howMany.toString()); + } else { + output.push('BACKWARD'); + } + break; + case 'FETCH_ABSOLUTE': + if (node.howMany !== undefined && node.howMany !== null) { + output.push('ABSOLUTE', node.howMany.toString()); + } + break; + case 'FETCH_RELATIVE': + if (node.howMany !== undefined && node.howMany !== null) { + output.push('RELATIVE', node.howMany.toString()); + } else { + output.push('RELATIVE', '0'); + } + break; + default: + throw new Error(`Unsupported FetchStmt direction: ${node.direction}`); } } else if (isAll) { // Handle plain "ALL" without direction @@ -8034,28 +8036,28 @@ export class Deparser implements DeparserVisitor { if (node.remote_schema) { output.push(QuoteUtils.quoteIdentifier(node.remote_schema)); - } - - if (node.list_type) { - switch (node.list_type) { - case 'FDW_IMPORT_SCHEMA_ALL': - break; - case 'FDW_IMPORT_SCHEMA_LIMIT_TO': - output.push('LIMIT', 'TO'); - if (node.table_list && node.table_list.length > 0) { - const tables = ListUtils.unwrapList(node.table_list).map(table => this.visit(table, context)); - output.push(`(${tables.join(', ')})`); - } - break; - case 'FDW_IMPORT_SCHEMA_EXCEPT': - output.push('EXCEPT'); - if (node.table_list && node.table_list.length > 0) { - const tables = ListUtils.unwrapList(node.table_list).map(table => this.visit(table, context)); - output.push(`(${tables.join(', ')})`); - } - break; - default: - throw new Error(`Unsupported ImportForeignSchemaStmt list_type: ${node.list_type}`); + } + + if (node.list_type) { + switch (node.list_type) { + case 'FDW_IMPORT_SCHEMA_ALL': + break; + case 'FDW_IMPORT_SCHEMA_LIMIT_TO': + output.push('LIMIT', 'TO'); + if (node.table_list && node.table_list.length > 0) { + const tables = ListUtils.unwrapList(node.table_list).map(table => this.visit(table, context)); + output.push(`(${tables.join(', ')})`); + } + break; + case 'FDW_IMPORT_SCHEMA_EXCEPT': + output.push('EXCEPT'); + if (node.table_list && node.table_list.length > 0) { + const tables = ListUtils.unwrapList(node.table_list).map(table => this.visit(table, context)); + output.push(`(${tables.join(', ')})`); + } + break; + default: + throw new Error(`Unsupported ImportForeignSchemaStmt list_type: ${node.list_type}`); } } @@ -8141,23 +8143,23 @@ export class Deparser implements DeparserVisitor { if (node.kind) { switch (node.kind) { - case 'REINDEX_OBJECT_INDEX': - output.push('INDEX'); - break; - case 'REINDEX_OBJECT_TABLE': - output.push('TABLE'); - break; - case 'REINDEX_OBJECT_SCHEMA': - output.push('SCHEMA'); - break; - case 'REINDEX_OBJECT_SYSTEM': - output.push('SYSTEM'); - break; - case 'REINDEX_OBJECT_DATABASE': - output.push('DATABASE'); - break; - default: - throw new Error(`Unsupported ReindexStmt kind: ${node.kind}`); + case 'REINDEX_OBJECT_INDEX': + output.push('INDEX'); + break; + case 'REINDEX_OBJECT_TABLE': + output.push('TABLE'); + break; + case 'REINDEX_OBJECT_SCHEMA': + output.push('SCHEMA'); + break; + case 'REINDEX_OBJECT_SYSTEM': + output.push('SYSTEM'); + break; + case 'REINDEX_OBJECT_DATABASE': + output.push('DATABASE'); + break; + default: + throw new Error(`Unsupported ReindexStmt kind: ${node.kind}`); } } @@ -8256,138 +8258,138 @@ export class Deparser implements DeparserVisitor { } switch (node.renameType) { - case 'OBJECT_TABLE': - output.push('TABLE'); - break; - case 'OBJECT_VIEW': + case 'OBJECT_TABLE': + output.push('TABLE'); + break; + case 'OBJECT_VIEW': + output.push('VIEW'); + break; + case 'OBJECT_INDEX': + output.push('INDEX'); + break; + case 'OBJECT_SEQUENCE': + output.push('SEQUENCE'); + break; + case 'OBJECT_FUNCTION': + output.push('FUNCTION'); + break; + case 'OBJECT_PROCEDURE': + output.push('PROCEDURE'); + break; + case 'OBJECT_SCHEMA': + output.push('SCHEMA'); + break; + case 'OBJECT_DATABASE': + output.push('DATABASE'); + break; + case 'OBJECT_COLUMN': + if (node.relationType === 'OBJECT_FOREIGN_TABLE') { + output.push('FOREIGN TABLE'); + } else if (node.relationType === 'OBJECT_VIEW') { output.push('VIEW'); - break; - case 'OBJECT_INDEX': - output.push('INDEX'); - break; - case 'OBJECT_SEQUENCE': - output.push('SEQUENCE'); - break; - case 'OBJECT_FUNCTION': - output.push('FUNCTION'); - break; - case 'OBJECT_PROCEDURE': - output.push('PROCEDURE'); - break; - case 'OBJECT_SCHEMA': - output.push('SCHEMA'); - break; - case 'OBJECT_DATABASE': - output.push('DATABASE'); - break; - case 'OBJECT_COLUMN': - if (node.relationType === 'OBJECT_FOREIGN_TABLE') { - output.push('FOREIGN TABLE'); - } else if (node.relationType === 'OBJECT_VIEW') { - output.push('VIEW'); - } else { - output.push('TABLE'); - } - break; - case 'OBJECT_DOMAIN': - output.push('DOMAIN'); - break; - case 'OBJECT_TYPE': - output.push('TYPE'); - break; - case 'OBJECT_DOMCONSTRAINT': - output.push('DOMAIN'); - break; - case 'OBJECT_TABCONSTRAINT': + } else { output.push('TABLE'); - break; - case 'OBJECT_AGGREGATE': - output.push('AGGREGATE'); - break; - case 'OBJECT_COLLATION': - output.push('COLLATION'); - break; - case 'OBJECT_CONVERSION': - output.push('CONVERSION'); - break; - case 'OBJECT_EXTENSION': - output.push('EXTENSION'); - break; - case 'OBJECT_FOREIGN_SERVER': - output.push('SERVER'); - break; - case 'OBJECT_FOREIGN_TABLE': - output.push('FOREIGN TABLE'); - break; - case 'OBJECT_LANGUAGE': - output.push('LANGUAGE'); - break; - case 'OBJECT_MATVIEW': - output.push('MATERIALIZED VIEW'); - break; - case 'OBJECT_OPCLASS': - output.push('OPERATOR CLASS'); - break; - case 'OBJECT_OPERATOR': - output.push('OPERATOR'); - break; - case 'OBJECT_OPFAMILY': - output.push('OPERATOR FAMILY'); - break; - case 'OBJECT_POLICY': - output.push('POLICY'); - if (node.subname) { - output.push(QuoteUtils.quoteIdentifier(node.subname)); - } - break; - case 'OBJECT_PUBLICATION': - output.push('PUBLICATION'); - break; - case 'OBJECT_ROLE': - output.push('ROLE'); - break; - case 'OBJECT_RULE': - output.push('RULE'); - break; - case 'OBJECT_SUBSCRIPTION': - output.push('SUBSCRIPTION'); - break; - case 'OBJECT_TABLESPACE': - output.push('TABLESPACE'); - break; - case 'OBJECT_TRIGGER': - output.push('TRIGGER'); - break; - case 'OBJECT_TSCONFIGURATION': - output.push('TEXT SEARCH CONFIGURATION'); - break; - case 'OBJECT_TSDICTIONARY': - output.push('TEXT SEARCH DICTIONARY'); - break; - case 'OBJECT_TSPARSER': - output.push('TEXT SEARCH PARSER'); - break; - case 'OBJECT_TSTEMPLATE': - output.push('TEXT SEARCH TEMPLATE'); - break; - case 'OBJECT_FDW': - output.push('FOREIGN DATA WRAPPER'); - break; - case 'OBJECT_EVENT_TRIGGER': - output.push('EVENT TRIGGER'); - break; - case 'OBJECT_ATTRIBUTE': - if (node.relationType === 'OBJECT_TYPE') { - output.push('TYPE'); - } else { - output.push('TABLE'); // fallback for other relation types - } - break; - case 'OBJECT_ROUTINE': - output.push('ROUTINE'); - break; - default: - throw new Error(`Unsupported RenameStmt renameType: ${node.renameType}`); + } + break; + case 'OBJECT_DOMAIN': + output.push('DOMAIN'); + break; + case 'OBJECT_TYPE': + output.push('TYPE'); + break; + case 'OBJECT_DOMCONSTRAINT': + output.push('DOMAIN'); + break; + case 'OBJECT_TABCONSTRAINT': + output.push('TABLE'); + break; + case 'OBJECT_AGGREGATE': + output.push('AGGREGATE'); + break; + case 'OBJECT_COLLATION': + output.push('COLLATION'); + break; + case 'OBJECT_CONVERSION': + output.push('CONVERSION'); + break; + case 'OBJECT_EXTENSION': + output.push('EXTENSION'); + break; + case 'OBJECT_FOREIGN_SERVER': + output.push('SERVER'); + break; + case 'OBJECT_FOREIGN_TABLE': + output.push('FOREIGN TABLE'); + break; + case 'OBJECT_LANGUAGE': + output.push('LANGUAGE'); + break; + case 'OBJECT_MATVIEW': + output.push('MATERIALIZED VIEW'); + break; + case 'OBJECT_OPCLASS': + output.push('OPERATOR CLASS'); + break; + case 'OBJECT_OPERATOR': + output.push('OPERATOR'); + break; + case 'OBJECT_OPFAMILY': + output.push('OPERATOR FAMILY'); + break; + case 'OBJECT_POLICY': + output.push('POLICY'); + if (node.subname) { + output.push(QuoteUtils.quoteIdentifier(node.subname)); + } + break; + case 'OBJECT_PUBLICATION': + output.push('PUBLICATION'); + break; + case 'OBJECT_ROLE': + output.push('ROLE'); + break; + case 'OBJECT_RULE': + output.push('RULE'); + break; + case 'OBJECT_SUBSCRIPTION': + output.push('SUBSCRIPTION'); + break; + case 'OBJECT_TABLESPACE': + output.push('TABLESPACE'); + break; + case 'OBJECT_TRIGGER': + output.push('TRIGGER'); + break; + case 'OBJECT_TSCONFIGURATION': + output.push('TEXT SEARCH CONFIGURATION'); + break; + case 'OBJECT_TSDICTIONARY': + output.push('TEXT SEARCH DICTIONARY'); + break; + case 'OBJECT_TSPARSER': + output.push('TEXT SEARCH PARSER'); + break; + case 'OBJECT_TSTEMPLATE': + output.push('TEXT SEARCH TEMPLATE'); + break; + case 'OBJECT_FDW': + output.push('FOREIGN DATA WRAPPER'); + break; + case 'OBJECT_EVENT_TRIGGER': + output.push('EVENT TRIGGER'); + break; + case 'OBJECT_ATTRIBUTE': + if (node.relationType === 'OBJECT_TYPE') { + output.push('TYPE'); + } else { + output.push('TABLE'); // fallback for other relation types + } + break; + case 'OBJECT_ROUTINE': + output.push('ROUTINE'); + break; + default: + throw new Error(`Unsupported RenameStmt renameType: ${node.renameType}`); } if (node.missing_ok) { @@ -8440,16 +8442,16 @@ export class Deparser implements DeparserVisitor { } } - if (node.renameType === 'OBJECT_COLUMN' && node.subname) { - output.push('RENAME COLUMN', QuoteUtils.quoteIdentifier(node.subname), 'TO'); - } else if (node.renameType === 'OBJECT_DOMCONSTRAINT' && node.subname) { - output.push('RENAME CONSTRAINT', QuoteUtils.quoteIdentifier(node.subname), 'TO'); - } else if (node.renameType === 'OBJECT_TABCONSTRAINT' && node.subname) { - output.push('RENAME CONSTRAINT', QuoteUtils.quoteIdentifier(node.subname), 'TO'); - } else if (node.renameType === 'OBJECT_ATTRIBUTE' && node.subname) { - output.push('RENAME ATTRIBUTE', QuoteUtils.quoteIdentifier(node.subname), 'TO'); - } else if (node.renameType === 'OBJECT_ROLE' && node.subname) { - output.push(QuoteUtils.quoteIdentifier(node.subname), 'RENAME TO'); + if (node.renameType === 'OBJECT_COLUMN' && node.subname) { + output.push('RENAME COLUMN', QuoteUtils.quoteIdentifier(node.subname), 'TO'); + } else if (node.renameType === 'OBJECT_DOMCONSTRAINT' && node.subname) { + output.push('RENAME CONSTRAINT', QuoteUtils.quoteIdentifier(node.subname), 'TO'); + } else if (node.renameType === 'OBJECT_TABCONSTRAINT' && node.subname) { + output.push('RENAME CONSTRAINT', QuoteUtils.quoteIdentifier(node.subname), 'TO'); + } else if (node.renameType === 'OBJECT_ATTRIBUTE' && node.subname) { + output.push('RENAME ATTRIBUTE', QuoteUtils.quoteIdentifier(node.subname), 'TO'); + } else if (node.renameType === 'OBJECT_ROLE' && node.subname) { + output.push(QuoteUtils.quoteIdentifier(node.subname), 'RENAME TO'); } else if (node.renameType === 'OBJECT_SCHEMA' && node.subname) { output.push(this.quoteIfNeeded(node.subname), 'RENAME TO'); } else if (node.renameType === 'OBJECT_RULE') { @@ -8537,103 +8539,103 @@ export class Deparser implements DeparserVisitor { // Handle object type specification only for ALTER DEFAULT PRIVILEGES context if (node.objtype && node.targtype === 'ACL_TARGET_DEFAULTS') { switch (node.objtype) { - case 'OBJECT_TABLE': - output.push('TABLES'); - break; - case 'OBJECT_SEQUENCE': - output.push('SEQUENCES'); - break; - case 'OBJECT_FUNCTION': - output.push('FUNCTIONS'); - break; - case 'OBJECT_PROCEDURE': - output.push('PROCEDURES'); - break; - case 'OBJECT_ROUTINE': - output.push('ROUTINES'); - break; - case 'OBJECT_TYPE': - output.push('TYPES'); - break; - case 'OBJECT_SCHEMA': - output.push('SCHEMAS'); - break; - default: - break; + case 'OBJECT_TABLE': + output.push('TABLES'); + break; + case 'OBJECT_SEQUENCE': + output.push('SEQUENCES'); + break; + case 'OBJECT_FUNCTION': + output.push('FUNCTIONS'); + break; + case 'OBJECT_PROCEDURE': + output.push('PROCEDURES'); + break; + case 'OBJECT_ROUTINE': + output.push('ROUTINES'); + break; + case 'OBJECT_TYPE': + output.push('TYPES'); + break; + case 'OBJECT_SCHEMA': + output.push('SCHEMAS'); + break; + default: + break; } } switch (node.targtype) { - case 'ACL_TARGET_OBJECT': - if (node.objtype === 'OBJECT_SCHEMA') { - output.push('SCHEMA'); - } else if (node.objtype === 'OBJECT_LANGUAGE') { - output.push('LANGUAGE'); - } else if (node.objtype === 'OBJECT_SEQUENCE') { - output.push('SEQUENCE'); - } else if (node.objtype === 'OBJECT_FUNCTION') { - output.push('FUNCTION'); - } else if (node.objtype === 'OBJECT_PROCEDURE') { - output.push('PROCEDURE'); - } else if (node.objtype === 'OBJECT_TYPE') { - output.push('TYPE'); - } else if (node.objtype === 'OBJECT_DOMAIN') { - output.push('DOMAIN'); - } else if (node.objtype === 'OBJECT_LARGEOBJECT') { - output.push('LARGE OBJECT'); - } else if (node.objtype === 'OBJECT_FDW') { - output.push('FOREIGN', 'DATA', 'WRAPPER'); - } else if (node.objtype === 'OBJECT_FOREIGN_SERVER') { - output.push('FOREIGN', 'SERVER'); - } else if (node.objtype === 'OBJECT_DATABASE') { - output.push('DATABASE'); - } - if (node.objects && node.objects.length > 0) { - const objects = ListUtils.unwrapList(node.objects) - .map(obj => this.visit(obj, context)) - .join(', '); - output.push(objects); - } + case 'ACL_TARGET_OBJECT': + if (node.objtype === 'OBJECT_SCHEMA') { + output.push('SCHEMA'); + } else if (node.objtype === 'OBJECT_LANGUAGE') { + output.push('LANGUAGE'); + } else if (node.objtype === 'OBJECT_SEQUENCE') { + output.push('SEQUENCE'); + } else if (node.objtype === 'OBJECT_FUNCTION') { + output.push('FUNCTION'); + } else if (node.objtype === 'OBJECT_PROCEDURE') { + output.push('PROCEDURE'); + } else if (node.objtype === 'OBJECT_TYPE') { + output.push('TYPE'); + } else if (node.objtype === 'OBJECT_DOMAIN') { + output.push('DOMAIN'); + } else if (node.objtype === 'OBJECT_LARGEOBJECT') { + output.push('LARGE OBJECT'); + } else if (node.objtype === 'OBJECT_FDW') { + output.push('FOREIGN', 'DATA', 'WRAPPER'); + } else if (node.objtype === 'OBJECT_FOREIGN_SERVER') { + output.push('FOREIGN', 'SERVER'); + } else if (node.objtype === 'OBJECT_DATABASE') { + output.push('DATABASE'); + } + if (node.objects && node.objects.length > 0) { + const objects = ListUtils.unwrapList(node.objects) + .map(obj => this.visit(obj, context)) + .join(', '); + output.push(objects); + } + break; + case 'ACL_TARGET_ALL_IN_SCHEMA': + // Handle different object types for ALL ... IN SCHEMA syntax + switch (node.objtype) { + case 'OBJECT_TABLE': + output.push('ALL TABLES IN SCHEMA'); break; - case 'ACL_TARGET_ALL_IN_SCHEMA': - // Handle different object types for ALL ... IN SCHEMA syntax - switch (node.objtype) { - case 'OBJECT_TABLE': - output.push('ALL TABLES IN SCHEMA'); - break; - case 'OBJECT_SEQUENCE': - output.push('ALL SEQUENCES IN SCHEMA'); - break; - case 'OBJECT_FUNCTION': - output.push('ALL FUNCTIONS IN SCHEMA'); - break; - case 'OBJECT_PROCEDURE': - output.push('ALL PROCEDURES IN SCHEMA'); - break; - case 'OBJECT_ROUTINE': - output.push('ALL ROUTINES IN SCHEMA'); - break; - case 'OBJECT_TYPE': - output.push('ALL TYPES IN SCHEMA'); - break; - default: - output.push('ALL TABLES IN SCHEMA'); // Default fallback - break; - } - if (node.objects && node.objects.length > 0) { - const schemas = ListUtils.unwrapList(node.objects) - .map(schema => this.visit(schema, context)) - .join(', '); - output.push(schemas); - } + case 'OBJECT_SEQUENCE': + output.push('ALL SEQUENCES IN SCHEMA'); + break; + case 'OBJECT_FUNCTION': + output.push('ALL FUNCTIONS IN SCHEMA'); + break; + case 'OBJECT_PROCEDURE': + output.push('ALL PROCEDURES IN SCHEMA'); + break; + case 'OBJECT_ROUTINE': + output.push('ALL ROUTINES IN SCHEMA'); + break; + case 'OBJECT_TYPE': + output.push('ALL TYPES IN SCHEMA'); break; default: - if (node.objects && node.objects.length > 0) { - const objects = ListUtils.unwrapList(node.objects) - .map(obj => this.visit(obj, context)) - .join(', '); - output.push(objects); - } + output.push('ALL TABLES IN SCHEMA'); // Default fallback + break; + } + if (node.objects && node.objects.length > 0) { + const schemas = ListUtils.unwrapList(node.objects) + .map(schema => this.visit(schema, context)) + .join(', '); + output.push(schemas); + } + break; + default: + if (node.objects && node.objects.length > 0) { + const objects = ListUtils.unwrapList(node.objects) + .map(obj => this.visit(obj, context)) + .join(', '); + output.push(objects); + } } if (node.is_grant) { @@ -8790,26 +8792,26 @@ export class Deparser implements DeparserVisitor { if (node.objtype) { switch (node.objtype) { - case 'OBJECT_TABLE': - output.push('TABLE'); - break; - case 'OBJECT_COLUMN': - output.push('COLUMN'); - break; - case 'OBJECT_FUNCTION': - output.push('FUNCTION'); - break; - case 'OBJECT_SCHEMA': - output.push('SCHEMA'); - break; - case 'OBJECT_DATABASE': - output.push('DATABASE'); - break; - case 'OBJECT_ROLE': - output.push('ROLE'); - break; - default: - output.push(node.objtype.replace('OBJECT_', '')); + case 'OBJECT_TABLE': + output.push('TABLE'); + break; + case 'OBJECT_COLUMN': + output.push('COLUMN'); + break; + case 'OBJECT_FUNCTION': + output.push('FUNCTION'); + break; + case 'OBJECT_SCHEMA': + output.push('SCHEMA'); + break; + case 'OBJECT_DATABASE': + output.push('DATABASE'); + break; + case 'OBJECT_ROLE': + output.push('ROLE'); + break; + default: + output.push(node.objtype.replace('OBJECT_', '')); } } @@ -8935,16 +8937,16 @@ export class Deparser implements DeparserVisitor { if (node.context) { switch (node.context) { - case 'COERCION_IMPLICIT': - output.push('AS IMPLICIT'); - break; - case 'COERCION_ASSIGNMENT': - output.push('AS ASSIGNMENT'); - break; - case 'COERCION_EXPLICIT': - break; - default: - throw new Error(`Unsupported CreateCastStmt context: ${node.context}`); + case 'COERCION_IMPLICIT': + output.push('AS IMPLICIT'); + break; + case 'COERCION_ASSIGNMENT': + output.push('AS ASSIGNMENT'); + break; + case 'COERCION_EXPLICIT': + break; + default: + throw new Error(`Unsupported CreateCastStmt context: ${node.context}`); } }else if (node.context === 'COERCION_ASSIGNMENT') { output.push('AS ASSIGNMENT'); @@ -9272,22 +9274,22 @@ export class Deparser implements DeparserVisitor { output.push(QuoteUtils.quoteIdentifier(node.trigname)); } - if (node.tgenabled) { - switch (node.tgenabled) { - case 'O': - output.push('ENABLE'); - break; - case 'D': - output.push('DISABLE'); - break; - case 'R': - output.push('ENABLE REPLICA'); - break; - case 'A': - output.push('ENABLE ALWAYS'); - break; - default: - throw new Error(`Unsupported trigger enable state: ${node.tgenabled}`); + if (node.tgenabled) { + switch (node.tgenabled) { + case 'O': + output.push('ENABLE'); + break; + case 'D': + output.push('DISABLE'); + break; + case 'R': + output.push('ENABLE REPLICA'); + break; + case 'A': + output.push('ENABLE ALWAYS'); + break; + default: + throw new Error(`Unsupported trigger enable state: ${node.tgenabled}`); } } @@ -9436,15 +9438,15 @@ export class Deparser implements DeparserVisitor { const output: string[] = ['WHEN']; switch (node.matchKind) { - case 'MERGE_WHEN_MATCHED': - output.push('MATCHED'); - break; - case 'MERGE_WHEN_NOT_MATCHED_BY_SOURCE': - output.push('NOT MATCHED BY SOURCE'); - break; - case 'MERGE_WHEN_NOT_MATCHED_BY_TARGET': - output.push('NOT MATCHED'); - break; + case 'MERGE_WHEN_MATCHED': + output.push('MATCHED'); + break; + case 'MERGE_WHEN_NOT_MATCHED_BY_SOURCE': + output.push('NOT MATCHED BY SOURCE'); + break; + case 'MERGE_WHEN_NOT_MATCHED_BY_TARGET': + output.push('NOT MATCHED'); + break; } if (node.condition) { @@ -9455,45 +9457,45 @@ export class Deparser implements DeparserVisitor { output.push('THEN'); switch (node.commandType) { - case 'CMD_UPDATE': { - output.push('UPDATE SET'); - const assignments = ListUtils.unwrapList(node.targetList) - .map(target => this.visit(target, context.spawn('UpdateStmt', { update: true }))) + case 'CMD_UPDATE': { + output.push('UPDATE SET'); + const assignments = ListUtils.unwrapList(node.targetList) + .map(target => this.visit(target, context.spawn('UpdateStmt', { update: true }))) + .join(', '); + output.push(assignments); + break; + } + case 'CMD_INSERT': { + output.push('INSERT'); + const targetList = ListUtils.unwrapList(node.targetList); + if (targetList.length > 0) { + const columns = targetList + .map(target => QuoteUtils.quoteIdentifier(target.ResTarget?.name)) .join(', '); - output.push(assignments); - break; + output.push(`(${columns})`); } - case 'CMD_INSERT': { - output.push('INSERT'); - const targetList = ListUtils.unwrapList(node.targetList); - if (targetList.length > 0) { - const columns = targetList - .map(target => QuoteUtils.quoteIdentifier(target.ResTarget?.name)) - .join(', '); - output.push(`(${columns})`); - } - if (node.override === 'OVERRIDING_USER_VALUE') { - output.push('OVERRIDING USER VALUE'); - } else if (node.override === 'OVERRIDING_SYSTEM_VALUE') { - output.push('OVERRIDING SYSTEM VALUE'); - } - const values = ListUtils.unwrapList(node.values); - if (values.length > 0) { - const valueItems = values - .map(value => this.visit(value, context)) - .join(', '); - output.push(`VALUES (${valueItems})`); - } else { - output.push('DEFAULT VALUES'); - } - break; + if (node.override === 'OVERRIDING_USER_VALUE') { + output.push('OVERRIDING USER VALUE'); + } else if (node.override === 'OVERRIDING_SYSTEM_VALUE') { + output.push('OVERRIDING SYSTEM VALUE'); } - case 'CMD_DELETE': - output.push('DELETE'); - break; - case 'CMD_NOTHING': - output.push('DO NOTHING'); - break; + const values = ListUtils.unwrapList(node.values); + if (values.length > 0) { + const valueItems = values + .map(value => this.visit(value, context)) + .join(', '); + output.push(`VALUES (${valueItems})`); + } else { + output.push('DEFAULT VALUES'); + } + break; + } + case 'CMD_DELETE': + output.push('DELETE'); + break; + case 'CMD_NOTHING': + output.push('DO NOTHING'); + break; } return output.join(' '); @@ -9924,15 +9926,15 @@ export class Deparser implements DeparserVisitor { if (node.into && node.into.onCommit && node.into.onCommit !== 'ONCOMMIT_NOOP') { output.push('ON COMMIT'); switch (node.into.onCommit) { - case 'ONCOMMIT_PRESERVE_ROWS': - output.push('PRESERVE ROWS'); - break; - case 'ONCOMMIT_DELETE_ROWS': - output.push('DELETE ROWS'); - break; - case 'ONCOMMIT_DROP': - output.push('DROP'); - break; + case 'ONCOMMIT_PRESERVE_ROWS': + output.push('PRESERVE ROWS'); + break; + case 'ONCOMMIT_DELETE_ROWS': + output.push('DELETE ROWS'); + break; + case 'ONCOMMIT_DROP': + output.push('DROP'); + break; } } @@ -10012,96 +10014,96 @@ export class Deparser implements DeparserVisitor { } switch (node.kind) { - case 'OBJECT_OPERATOR': - output.push('CREATE OPERATOR'); - - if (node.defnames && node.defnames.length > 0) { - const names = ListUtils.unwrapList(node.defnames).map((name, index) => { - if (index === node.defnames.length - 1) { - const nodeData = this.getNodeData(name); - if (nodeData && nodeData.sval) { - return nodeData.sval; // Return operator symbol unquoted - } + case 'OBJECT_OPERATOR': + output.push('CREATE OPERATOR'); + + if (node.defnames && node.defnames.length > 0) { + const names = ListUtils.unwrapList(node.defnames).map((name, index) => { + if (index === node.defnames.length - 1) { + const nodeData = this.getNodeData(name); + if (nodeData && nodeData.sval) { + return nodeData.sval; // Return operator symbol unquoted } - return this.visit(name, context); // Quote schema/namespace names normally - }); - output.push(names.join('.')); - } - - if (node.definition && node.definition.length > 0) { - output.push('('); - const definitions = ListUtils.unwrapList(node.definition).map(def => { - if (def.DefElem) { - const defElem = def.DefElem; - const defName = defElem.defname; - const defValue = defElem.arg; - - if (defName && defValue) { - const quotedDefName = QuoteUtils.quoteIdentifier(defName); - const preservedDefName = quotedDefName !== defName ? quotedDefName : this.preserveOperatorDefElemCase(defName); - - if ((defName.toLowerCase() === 'commutator' || defName.toLowerCase() === 'negator') && defValue.List) { - const listItems = ListUtils.unwrapList(defValue.List.items); - if (listItems.length === 1 && listItems[0].String) { - return `${preservedDefName} = ${listItems[0].String.sval}`; - } - } - // For commutator/negator, we already handled them above - if ((defName.toLowerCase() === 'commutator' || defName.toLowerCase() === 'negator')) { - return `${preservedDefName} = ${this.visit(defValue, context)}`; - } - return `${preservedDefName} = ${this.visit(defValue, context)}`; - } else if (defName && !defValue) { - // Handle boolean flags like HASHES, MERGES - preserve original case - if (defName === 'Hashes' || defName === 'Merges') { - return QuoteUtils.quoteIdentifier(defName); - } - return this.preserveOperatorDefElemCase(defName).toUpperCase(); - } + } + return this.visit(name, context); // Quote schema/namespace names normally + }); + output.push(names.join('.')); + } + + if (node.definition && node.definition.length > 0) { + output.push('('); + const definitions = ListUtils.unwrapList(node.definition).map(def => { + if (def.DefElem) { + const defElem = def.DefElem; + const defName = defElem.defname; + const defValue = defElem.arg; + + if (defName && defValue) { + const quotedDefName = QuoteUtils.quoteIdentifier(defName); + const preservedDefName = quotedDefName !== defName ? quotedDefName : this.preserveOperatorDefElemCase(defName); + + if ((defName.toLowerCase() === 'commutator' || defName.toLowerCase() === 'negator') && defValue.List) { + const listItems = ListUtils.unwrapList(defValue.List.items); + if (listItems.length === 1 && listItems[0].String) { + return `${preservedDefName} = ${listItems[0].String.sval}`; + } + } + // For commutator/negator, we already handled them above + if ((defName.toLowerCase() === 'commutator' || defName.toLowerCase() === 'negator')) { + return `${preservedDefName} = ${this.visit(defValue, context)}`; + } + return `${preservedDefName} = ${this.visit(defValue, context)}`; + } else if (defName && !defValue) { + // Handle boolean flags like HASHES, MERGES - preserve original case + if (defName === 'Hashes' || defName === 'Merges') { + return QuoteUtils.quoteIdentifier(defName); + } + return this.preserveOperatorDefElemCase(defName).toUpperCase(); } - return this.visit(def, context); - }); - output.push(definitions.join(', ')); - output.push(')'); - } - break; + } + return this.visit(def, context); + }); + output.push(definitions.join(', ')); + output.push(')'); + } + break; - case 'OBJECT_TYPE': - output.push('CREATE TYPE'); + case 'OBJECT_TYPE': + output.push('CREATE TYPE'); - if (node.defnames && node.defnames.length > 0) { - output.push(ListUtils.unwrapList(node.defnames).map(name => this.visit(name, context)).join('.')); - } + if (node.defnames && node.defnames.length > 0) { + output.push(ListUtils.unwrapList(node.defnames).map(name => this.visit(name, context)).join('.')); + } - if (node.definition && node.definition.length > 0) { - const defineStmtContext = context.spawn('DefineStmt'); - const definitions = ListUtils.unwrapList(node.definition).map(def => { - return this.visit(def, defineStmtContext); - }); - output.push(`(${definitions.join(', ')})`); - } - break; + if (node.definition && node.definition.length > 0) { + const defineStmtContext = context.spawn('DefineStmt'); + const definitions = ListUtils.unwrapList(node.definition).map(def => { + return this.visit(def, defineStmtContext); + }); + output.push(`(${definitions.join(', ')})`); + } + break; - case 'OBJECT_AGGREGATE': - output.push('CREATE'); - if (node.replace) { - output.push('OR REPLACE'); - } - output.push('AGGREGATE'); + case 'OBJECT_AGGREGATE': + output.push('CREATE'); + if (node.replace) { + output.push('OR REPLACE'); + } + output.push('AGGREGATE'); - if (node.defnames && node.defnames.length > 0) { - const nameStrs = ListUtils.unwrapList(node.defnames).map(name => this.visit(name, context)); - output.push(nameStrs.join('.')); - } + if (node.defnames && node.defnames.length > 0) { + const nameStrs = ListUtils.unwrapList(node.defnames).map(name => this.visit(name, context)); + output.push(nameStrs.join('.')); + } - if (node.args && node.args.length > 0) { - const args = ListUtils.unwrapList(node.args); + if (node.args && node.args.length > 0) { + const args = ListUtils.unwrapList(node.args); - // Check if this is an ordered-set aggregate (indicated by Integer(1) or empty Integer after List with FunctionParameter FUNC_PARAM_DEFAULT) - const hasOrderedSetIndicator = args.some(arg => arg.Integer && arg.Integer.ival === 1); + // Check if this is an ordered-set aggregate (indicated by Integer(1) or empty Integer after List with FunctionParameter FUNC_PARAM_DEFAULT) + const hasOrderedSetIndicator = args.some(arg => arg.Integer && arg.Integer.ival === 1); - // Check for ORDER BY pattern: List with FunctionParameter FUNC_PARAM_DEFAULT followed by empty Integer - const hasOrderByPattern = args.length >= 2 && + // Check for ORDER BY pattern: List with FunctionParameter FUNC_PARAM_DEFAULT followed by empty Integer + const hasOrderByPattern = args.length >= 2 && args[0].List && args[0].List.items && args[0].List.items.length === 1 && @@ -10109,76 +10111,65 @@ export class Deparser implements DeparserVisitor { args[0].List.items[0].FunctionParameter.mode === 'FUNC_PARAM_DEFAULT' && args[1].Integer && Object.keys(args[1].Integer).length === 0; - const filteredArgs = args.filter(arg => { - if (arg.Integer && (arg.Integer.ival === -1 || arg.Integer.ival === 1)) { - return false; - } - if (arg.Integer && Object.keys(arg.Integer).length === 0 && hasOrderByPattern) { - return false; - } - return true; - }); + const filteredArgs = args.filter(arg => { + if (arg.Integer && (arg.Integer.ival === -1 || arg.Integer.ival === 1)) { + return false; + } + if (arg.Integer && Object.keys(arg.Integer).length === 0 && hasOrderByPattern) { + return false; + } + return true; + }); - if (filteredArgs.length > 0) { - if (hasOrderByPattern) { - // Handle ORDER BY syntax for aggregates like myavg (ORDER BY numeric) - const listArg = filteredArgs[0]; - if (listArg.List && listArg.List.items && listArg.List.items[0].FunctionParameter) { - const functionParam = listArg.List.items[0].FunctionParameter; - // Handle argType which has a TypeName-like structure with names array - let paramStr; - if (functionParam.argType && functionParam.argType.names) { - // Extract type name from names array (skip pg_catalog schema) - const names = functionParam.argType.names; - if (names.length >= 2 && names[0].String && names[0].String.sval === 'pg_catalog') { - paramStr = names[1].String.sval; - } else if (names.length >= 1 && names[0].String) { - paramStr = names[0].String.sval; - } else { - paramStr = 'unknown'; - } + if (filteredArgs.length > 0) { + if (hasOrderByPattern) { + // Handle ORDER BY syntax for aggregates like myavg (ORDER BY numeric) + const listArg = filteredArgs[0]; + if (listArg.List && listArg.List.items && listArg.List.items[0].FunctionParameter) { + const functionParam = listArg.List.items[0].FunctionParameter; + // Handle argType which has a TypeName-like structure with names array + let paramStr; + if (functionParam.argType && functionParam.argType.names) { + // Extract type name from names array (skip pg_catalog schema) + const names = functionParam.argType.names; + if (names.length >= 2 && names[0].String && names[0].String.sval === 'pg_catalog') { + paramStr = names[1].String.sval; + } else if (names.length >= 1 && names[0].String) { + paramStr = names[0].String.sval; } else { - // Fallback to visiting the argType as a TypeName - paramStr = this.visit({ TypeName: functionParam.argType }, context); + paramStr = 'unknown'; } - output.push(`(ORDER BY ${paramStr})`); } else { - const paramStr = this.visit(listArg, context); - output.push(`(ORDER BY ${paramStr})`); + // Fallback to visiting the argType as a TypeName + paramStr = this.visit({ TypeName: functionParam.argType }, context); } - } else if (hasOrderedSetIndicator && filteredArgs.length === 1 && filteredArgs[0].List) { - // Handle ordered-set aggregate with ORDER BY syntax - const listArg = filteredArgs[0].List; - if (listArg.items && listArg.items.length >= 2) { - const items = ListUtils.unwrapList(listArg.items); - const firstItem = this.visit(items[0], context); - const remainingItems = items.slice(1).map(item => this.visit(item, context)); - - output.push(`(${firstItem} ORDER BY ${remainingItems.join(', ')})`); - } else if (listArg.items && listArg.items.length === 1) { - // Handle single VARIADIC parameter in ordered-set context - const item = listArg.items[0]; - if (item.FunctionParameter && item.FunctionParameter.mode === 'FUNC_PARAM_VARIADIC') { - const paramStr = this.visit(item, context); - output.push(`(${paramStr} ORDER BY ${paramStr})`); - } else { - const paramStr = this.visit(item, context); - output.push(`(${paramStr})`); - } + output.push(`(ORDER BY ${paramStr})`); + } else { + const paramStr = this.visit(listArg, context); + output.push(`(ORDER BY ${paramStr})`); + } + } else if (hasOrderedSetIndicator && filteredArgs.length === 1 && filteredArgs[0].List) { + // Handle ordered-set aggregate with ORDER BY syntax + const listArg = filteredArgs[0].List; + if (listArg.items && listArg.items.length >= 2) { + const items = ListUtils.unwrapList(listArg.items); + const firstItem = this.visit(items[0], context); + const remainingItems = items.slice(1).map(item => this.visit(item, context)); + + output.push(`(${firstItem} ORDER BY ${remainingItems.join(', ')})`); + } else if (listArg.items && listArg.items.length === 1) { + // Handle single VARIADIC parameter in ordered-set context + const item = listArg.items[0]; + if (item.FunctionParameter && item.FunctionParameter.mode === 'FUNC_PARAM_VARIADIC') { + const paramStr = this.visit(item, context); + output.push(`(${paramStr} ORDER BY ${paramStr})`); } else { - // Fallback to regular processing if structure is unexpected - const argStrs = filteredArgs.map(arg => { - if (Object.keys(arg).length === 0) { - return '*'; - } - return this.visit(arg, context); - }); - output.push(`(${argStrs.join(', ')})`); + const paramStr = this.visit(item, context); + output.push(`(${paramStr})`); } } else { - // Handle regular aggregate arguments + // Fallback to regular processing if structure is unexpected const argStrs = filteredArgs.map(arg => { - // Handle empty object representing * wildcard if (Object.keys(arg).length === 0) { return '*'; } @@ -10186,189 +10177,200 @@ export class Deparser implements DeparserVisitor { }); output.push(`(${argStrs.join(', ')})`); } + } else { + // Handle regular aggregate arguments + const argStrs = filteredArgs.map(arg => { + // Handle empty object representing * wildcard + if (Object.keys(arg).length === 0) { + return '*'; + } + return this.visit(arg, context); + }); + output.push(`(${argStrs.join(', ')})`); } } + } - if (node.definition && node.definition.length > 0) { - const definitions = ListUtils.unwrapList(node.definition).map(def => { - if (def.DefElem) { - const defElem = def.DefElem; - const defName = defElem.defname; - const defValue = defElem.arg; + if (node.definition && node.definition.length > 0) { + const definitions = ListUtils.unwrapList(node.definition).map(def => { + if (def.DefElem) { + const defElem = def.DefElem; + const defName = defElem.defname; + const defValue = defElem.arg; - if (defName && defValue) { - const quotedDefName = QuoteUtils.quoteIdentifier(defName); - const preservedDefName = quotedDefName !== defName ? quotedDefName : defName; + if (defName && defValue) { + const quotedDefName = QuoteUtils.quoteIdentifier(defName); + const preservedDefName = quotedDefName !== defName ? quotedDefName : defName; - // Handle String arguments with single quotes for string literals - if (defValue.String) { - return `${preservedDefName} = '${defValue.String.sval}'`; - } - return `${preservedDefName} = ${this.visit(defValue, context)}`; - } + // Handle String arguments with single quotes for string literals + if (defValue.String) { + return `${preservedDefName} = '${defValue.String.sval}'`; + } + return `${preservedDefName} = ${this.visit(defValue, context)}`; } - return this.visit(def, context); - }); - output.push(`(${definitions.join(', ')})`); - } - break; - - case 'OBJECT_TSDICTIONARY': - output.push('CREATE TEXT SEARCH DICTIONARY'); + } + return this.visit(def, context); + }); + output.push(`(${definitions.join(', ')})`); + } + break; - if (node.defnames && node.defnames.length > 0) { - output.push(ListUtils.unwrapList(node.defnames).map(name => this.visit(name, context)).join('.')); - } + case 'OBJECT_TSDICTIONARY': + output.push('CREATE TEXT SEARCH DICTIONARY'); - if (node.definition && node.definition.length > 0) { - output.push('('); - const definitions = ListUtils.unwrapList(node.definition).map(def => { - if (def.DefElem) { - const defElem = def.DefElem; - const defName = defElem.defname; - const defValue = defElem.arg; + if (node.defnames && node.defnames.length > 0) { + output.push(ListUtils.unwrapList(node.defnames).map(name => this.visit(name, context)).join('.')); + } - if (defName && defValue) { - return `${defName} = ${this.visit(defValue, context)}`; - } + if (node.definition && node.definition.length > 0) { + output.push('('); + const definitions = ListUtils.unwrapList(node.definition).map(def => { + if (def.DefElem) { + const defElem = def.DefElem; + const defName = defElem.defname; + const defValue = defElem.arg; + + if (defName && defValue) { + return `${defName} = ${this.visit(defValue, context)}`; } - return this.visit(def, context); - }); - output.push(definitions.join(', ')); - output.push(')'); - } - break; - - case 'OBJECT_TSCONFIGURATION': - output.push('CREATE TEXT SEARCH CONFIGURATION'); + } + return this.visit(def, context); + }); + output.push(definitions.join(', ')); + output.push(')'); + } + break; - if (node.defnames && node.defnames.length > 0) { - output.push(ListUtils.unwrapList(node.defnames).map(name => this.visit(name, context)).join('.')); - } + case 'OBJECT_TSCONFIGURATION': + output.push('CREATE TEXT SEARCH CONFIGURATION'); - if (node.definition && node.definition.length > 0) { - output.push('('); - const definitions = ListUtils.unwrapList(node.definition).map(def => { - if (def.DefElem) { - const defElem = def.DefElem; - const defName = defElem.defname; - const defValue = defElem.arg; + if (node.defnames && node.defnames.length > 0) { + output.push(ListUtils.unwrapList(node.defnames).map(name => this.visit(name, context)).join('.')); + } - if (defName && defValue) { - return `${defName} = ${this.visit(defValue, context)}`; - } + if (node.definition && node.definition.length > 0) { + output.push('('); + const definitions = ListUtils.unwrapList(node.definition).map(def => { + if (def.DefElem) { + const defElem = def.DefElem; + const defName = defElem.defname; + const defValue = defElem.arg; + + if (defName && defValue) { + return `${defName} = ${this.visit(defValue, context)}`; } - return this.visit(def, context); - }); - output.push(definitions.join(', ')); - output.push(')'); - } - break; - - case 'OBJECT_TSPARSER': - output.push('CREATE TEXT SEARCH PARSER'); + } + return this.visit(def, context); + }); + output.push(definitions.join(', ')); + output.push(')'); + } + break; - if (node.defnames && node.defnames.length > 0) { - const names = ListUtils.unwrapList(node.defnames) - .map(name => this.visit(name, context)) - .join('.'); - output.push(names); - } + case 'OBJECT_TSPARSER': + output.push('CREATE TEXT SEARCH PARSER'); - if (node.definition && node.definition.length > 0) { - output.push('('); - const definitions = ListUtils.unwrapList(node.definition).map(def => { - if (def.DefElem) { - const defElem = def.DefElem; - const defName = defElem.defname; - const defValue = defElem.arg; + if (node.defnames && node.defnames.length > 0) { + const names = ListUtils.unwrapList(node.defnames) + .map(name => this.visit(name, context)) + .join('.'); + output.push(names); + } - if (defName && defValue) { - return `${defName} = ${this.visit(defValue, context)}`; - } + if (node.definition && node.definition.length > 0) { + output.push('('); + const definitions = ListUtils.unwrapList(node.definition).map(def => { + if (def.DefElem) { + const defElem = def.DefElem; + const defName = defElem.defname; + const defValue = defElem.arg; + + if (defName && defValue) { + return `${defName} = ${this.visit(defValue, context)}`; } - return this.visit(def, context); - }); - output.push(definitions.join(', ')); - output.push(')'); - } - break; - - case 'OBJECT_TSTEMPLATE': - output.push('CREATE TEXT SEARCH TEMPLATE'); + } + return this.visit(def, context); + }); + output.push(definitions.join(', ')); + output.push(')'); + } + break; - if (node.defnames && node.defnames.length > 0) { - const names = ListUtils.unwrapList(node.defnames) - .map(name => this.visit(name, context)) - .join('.'); - output.push(names); - } + case 'OBJECT_TSTEMPLATE': + output.push('CREATE TEXT SEARCH TEMPLATE'); - if (node.definition && node.definition.length > 0) { - output.push('('); - const definitions = ListUtils.unwrapList(node.definition).map(def => { - if (def.DefElem) { - const defElem = def.DefElem; - const defName = defElem.defname; - const defValue = defElem.arg; + if (node.defnames && node.defnames.length > 0) { + const names = ListUtils.unwrapList(node.defnames) + .map(name => this.visit(name, context)) + .join('.'); + output.push(names); + } - if (defName && defValue) { - return `${defName} = ${this.visit(defValue, context)}`; - } + if (node.definition && node.definition.length > 0) { + output.push('('); + const definitions = ListUtils.unwrapList(node.definition).map(def => { + if (def.DefElem) { + const defElem = def.DefElem; + const defName = defElem.defname; + const defValue = defElem.arg; + + if (defName && defValue) { + return `${defName} = ${this.visit(defValue, context)}`; } - return this.visit(def, context); - }); - output.push(definitions.join(', ')); - output.push(')'); - } - break; + } + return this.visit(def, context); + }); + output.push(definitions.join(', ')); + output.push(')'); + } + break; - case 'OBJECT_COLLATION': - output.push('CREATE COLLATION'); + case 'OBJECT_COLLATION': + output.push('CREATE COLLATION'); - if (node.defnames && node.defnames.length > 0) { - output.push(ListUtils.unwrapList(node.defnames).map(name => this.visit(name, context)).join('.')); - } + if (node.defnames && node.defnames.length > 0) { + output.push(ListUtils.unwrapList(node.defnames).map(name => this.visit(name, context)).join('.')); + } - if (node.definition && node.definition.length > 0) { - const definitions = ListUtils.unwrapList(node.definition).map(def => { - if (def.DefElem) { - const defElem = def.DefElem; - const defName = defElem.defname; - const defValue = defElem.arg; + if (node.definition && node.definition.length > 0) { + const definitions = ListUtils.unwrapList(node.definition).map(def => { + if (def.DefElem) { + const defElem = def.DefElem; + const defName = defElem.defname; + const defValue = defElem.arg; - if (defName && defValue) { - // Handle FROM clause for collation definitions - if (defName === 'from') { - return `FROM ${this.visit(defValue, context)}`; - } + if (defName && defValue) { + // Handle FROM clause for collation definitions + if (defName === 'from') { + return `FROM ${this.visit(defValue, context)}`; + } - // For CREATE COLLATION, ensure String nodes are quoted as string literals - let valueStr; - if (defValue.String) { - valueStr = `'${defValue.String.sval}'`; - } else { - valueStr = this.visit(defValue, context); - } - return `${defName} = ${valueStr}`; + // For CREATE COLLATION, ensure String nodes are quoted as string literals + let valueStr; + if (defValue.String) { + valueStr = `'${defValue.String.sval}'`; + } else { + valueStr = this.visit(defValue, context); } + return `${defName} = ${valueStr}`; } - return this.visit(def, context); - }); - - // Check if we have FROM clause or parameter definitions - const hasFromClause = definitions.some(def => def.startsWith('FROM ')); - if (hasFromClause) { - output.push(definitions.join(' ')); - } else { - // Wrap parameter definitions in parentheses - output.push(`(${definitions.join(', ')})`); } + return this.visit(def, context); + }); + + // Check if we have FROM clause or parameter definitions + const hasFromClause = definitions.some(def => def.startsWith('FROM ')); + if (hasFromClause) { + output.push(definitions.join(' ')); + } else { + // Wrap parameter definitions in parentheses + output.push(`(${definitions.join(', ')})`); } - break; + } + break; - default: - throw new Error(`Unsupported DefineStmt kind: ${node.kind}`); + default: + throw new Error(`Unsupported DefineStmt kind: ${node.kind}`); } return output.join(' '); @@ -10508,16 +10510,16 @@ export class Deparser implements DeparserVisitor { output.push('TYPE'); switch (node.amtype) { - case 'i': - output.push('INDEX'); - break; - case 't': - output.push('TABLE'); - break; - default: - // Fallback to the raw value if unknown - output.push(node.amtype || ''); - break; + case 'i': + output.push('INDEX'); + break; + case 't': + output.push('TABLE'); + break; + default: + // Fallback to the raw value if unknown + output.push(node.amtype || ''); + break; } if (node.handler_name && node.handler_name.length > 0) { @@ -10560,15 +10562,15 @@ export class Deparser implements DeparserVisitor { if (node.onCommit && node.onCommit !== 'ONCOMMIT_NOOP') { output.push('ON COMMIT'); switch (node.onCommit) { - case 'ONCOMMIT_PRESERVE_ROWS': - output.push('PRESERVE ROWS'); - break; - case 'ONCOMMIT_DELETE_ROWS': - output.push('DELETE ROWS'); - break; - case 'ONCOMMIT_DROP': - output.push('DROP'); - break; + case 'ONCOMMIT_PRESERVE_ROWS': + output.push('PRESERVE ROWS'); + break; + case 'ONCOMMIT_DELETE_ROWS': + output.push('DELETE ROWS'); + break; + case 'ONCOMMIT_DROP': + output.push('DROP'); + break; } } @@ -10928,105 +10930,106 @@ export class Deparser implements DeparserVisitor { const output: string[] = []; switch (node.op) { - case 'IS_XMLCONCAT': - output.push('XMLCONCAT'); - break; - case 'IS_XMLELEMENT': - output.push('XMLELEMENT'); - const elementParts: string[] = []; - if (node.name) { - elementParts.push(`NAME ${QuoteUtils.quoteIdentifier(node.name)}`); - } - if (node.named_args && node.named_args.length > 0) { - const namedArgStrs = ListUtils.unwrapList(node.named_args).map(arg => this.visit(arg, context)); - elementParts.push(`XMLATTRIBUTES(${namedArgStrs.join(', ')})`); - } - if (node.args && node.args.length > 0) { - const argStrs = ListUtils.unwrapList(node.args).map(arg => this.visit(arg, context)); - elementParts.push(...argStrs); - } - if (elementParts.length > 0) { - output.push(`(${elementParts.join(', ')})`); - } - break; - case 'IS_XMLFOREST': - output.push('XMLFOREST'); - break; - case 'IS_XMLPARSE': - output.push('XMLPARSE'); - const parseParts: string[] = []; - if (node.xmloption) { - if (node.xmloption === 'XMLOPTION_DOCUMENT') { - parseParts.push('DOCUMENT'); - } else if (node.xmloption === 'XMLOPTION_CONTENT') { - parseParts.push('CONTENT'); - } - } - if (node.args && node.args.length > 0) { - const argStrs = ListUtils.unwrapList(node.args).map(arg => this.visit(arg, context)); - if (argStrs.length > 0) { - parseParts.push(argStrs[0]); - } + case 'IS_XMLCONCAT': + output.push('XMLCONCAT'); + break; + case 'IS_XMLELEMENT': + output.push('XMLELEMENT'); + const elementParts: string[] = []; + if (node.name) { + elementParts.push(`NAME ${QuoteUtils.quoteIdentifier(node.name)}`); + } + if (node.named_args && node.named_args.length > 0) { + const namedArgStrs = ListUtils.unwrapList(node.named_args).map(arg => this.visit(arg, context)); + elementParts.push(`XMLATTRIBUTES(${namedArgStrs.join(', ')})`); + } + if (node.args && node.args.length > 0) { + const argStrs = ListUtils.unwrapList(node.args).map(arg => this.visit(arg, context)); + elementParts.push(...argStrs); + } + if (elementParts.length > 0) { + output.push(`(${elementParts.join(', ')})`); + } + break; + case 'IS_XMLFOREST': + output.push('XMLFOREST'); + break; + case 'IS_XMLPARSE': + output.push('XMLPARSE'); + const parseParts: string[] = []; + if (node.xmloption) { + if (node.xmloption === 'XMLOPTION_DOCUMENT') { + parseParts.push('DOCUMENT'); + } else if (node.xmloption === 'XMLOPTION_CONTENT') { + parseParts.push('CONTENT'); } - if (parseParts.length > 0) { - output.push(`(${parseParts.join(' ')})`); + } + if (node.args && node.args.length > 0) { + const argStrs = ListUtils.unwrapList(node.args).map(arg => this.visit(arg, context)); + if (argStrs.length > 0) { + parseParts.push(argStrs[0]); } - break; - case 'IS_XMLROOT': - output.push('XMLROOT'); - if (node.args && node.args.length > 0) { - const args = ListUtils.unwrapList(node.args); - const rootParts: string[] = []; + } + if (parseParts.length > 0) { + output.push(`(${parseParts.join(' ')})`); + } + break; + case 'IS_XMLROOT': + output.push('XMLROOT'); + if (node.args && node.args.length > 0) { + const args = ListUtils.unwrapList(node.args); + const rootParts: string[] = []; - if (args[0]) { - rootParts.push(this.visit(args[0], context)); - } + if (args[0]) { + rootParts.push(this.visit(args[0], context)); + } - if (args[1]) { - const versionArg = args[1]; - if (versionArg.A_Const && versionArg.A_Const.isnull) { - rootParts.push('version NO VALUE'); - } else { - rootParts.push(`version ${this.visit(versionArg, context)}`); - } + if (args[1]) { + const versionArg = args[1]; + if (versionArg.A_Const && versionArg.A_Const.isnull) { + rootParts.push('version NO VALUE'); + } else { + rootParts.push(`version ${this.visit(versionArg, context)}`); } + } - if (args[2]) { - const standaloneArg = args[2]; - if (standaloneArg.A_Const && standaloneArg.A_Const.ival !== undefined) { - if (standaloneArg.A_Const.ival.ival === 1) { - rootParts.push('STANDALONE NO'); - } else if (standaloneArg.A_Const.ival.ival === 2) { - rootParts.push('STANDALONE NO VALUE'); - } else if (standaloneArg.A_Const.ival.ival === 3) { - } else if (Object.keys(standaloneArg.A_Const.ival).length === 0) { - rootParts.push('STANDALONE YES'); - } else { - rootParts.push(`STANDALONE ${this.visit(standaloneArg, context)}`); - } + if (args[2]) { + const standaloneArg = args[2]; + if (standaloneArg.A_Const && standaloneArg.A_Const.ival !== undefined) { + if (standaloneArg.A_Const.ival.ival === 1) { + rootParts.push('STANDALONE NO'); + } else if (standaloneArg.A_Const.ival.ival === 2) { + rootParts.push('STANDALONE NO VALUE'); + } else if (standaloneArg.A_Const.ival.ival === 3) { + // STANDALONE omitted + } else if (Object.keys(standaloneArg.A_Const.ival).length === 0) { + rootParts.push('STANDALONE YES'); } else { rootParts.push(`STANDALONE ${this.visit(standaloneArg, context)}`); } - } - - if (rootParts.length > 0) { - output.push(`(${rootParts.join(', ')})`); + } else { + rootParts.push(`STANDALONE ${this.visit(standaloneArg, context)}`); } } - break; - case 'IS_XMLSERIALIZE': - output.push('XMLSERIALIZE'); - break; - case 'IS_DOCUMENT': - if (node.args && node.args.length > 0) { - const argStrs = ListUtils.unwrapList(node.args).map(arg => this.visit(arg, context)); - output.push(`${argStrs[0]} IS DOCUMENT`); - } else { - output.push('IS DOCUMENT'); + + if (rootParts.length > 0) { + output.push(`(${rootParts.join(', ')})`); } - break; - default: - throw new Error(`Unsupported XmlExpr op: ${node.op}`); + } + break; + case 'IS_XMLSERIALIZE': + output.push('XMLSERIALIZE'); + break; + case 'IS_DOCUMENT': + if (node.args && node.args.length > 0) { + const argStrs = ListUtils.unwrapList(node.args).map(arg => this.visit(arg, context)); + output.push(`${argStrs[0]} IS DOCUMENT`); + } else { + output.push('IS DOCUMENT'); + } + break; + default: + throw new Error(`Unsupported XmlExpr op: ${node.op}`); } // Handle name and args for operations that don't have special handling @@ -11166,20 +11169,20 @@ export class Deparser implements DeparserVisitor { if (node.event) { switch (node.event) { - case 'CMD_SELECT': - output.push('SELECT'); - break; - case 'CMD_INSERT': - output.push('INSERT'); - break; - case 'CMD_UPDATE': - output.push('UPDATE'); - break; - case 'CMD_DELETE': - output.push('DELETE'); - break; - default: - output.push(node.event.toString()); + case 'CMD_SELECT': + output.push('SELECT'); + break; + case 'CMD_INSERT': + output.push('INSERT'); + break; + case 'CMD_UPDATE': + output.push('UPDATE'); + break; + case 'CMD_DELETE': + output.push('DELETE'); + break; + default: + output.push(node.event.toString()); } } @@ -11287,38 +11290,38 @@ export class Deparser implements DeparserVisitor { SQLValueFunction(node: t.SQLValueFunction, context: DeparserContext): string { switch (node.op) { - case 'SVFOP_CURRENT_DATE': - return 'CURRENT_DATE'; - case 'SVFOP_CURRENT_TIME': - return 'CURRENT_TIME'; - case 'SVFOP_CURRENT_TIME_N': - return `CURRENT_TIME(${node.typmod || 0})`; - case 'SVFOP_CURRENT_TIMESTAMP': - return 'CURRENT_TIMESTAMP'; - case 'SVFOP_CURRENT_TIMESTAMP_N': - return `CURRENT_TIMESTAMP(${node.typmod || 0})`; - case 'SVFOP_LOCALTIME': - return 'LOCALTIME'; - case 'SVFOP_LOCALTIME_N': - return `LOCALTIME(${node.typmod || 0})`; - case 'SVFOP_LOCALTIMESTAMP': - return 'LOCALTIMESTAMP'; - case 'SVFOP_LOCALTIMESTAMP_N': - return `LOCALTIMESTAMP(${node.typmod || 0})`; - case 'SVFOP_CURRENT_ROLE': - return 'CURRENT_ROLE'; - case 'SVFOP_CURRENT_USER': - return 'CURRENT_USER'; - case 'SVFOP_USER': - return 'USER'; - case 'SVFOP_SESSION_USER': - return 'SESSION_USER'; - case 'SVFOP_CURRENT_CATALOG': - return 'CURRENT_CATALOG'; - case 'SVFOP_CURRENT_SCHEMA': - return 'CURRENT_SCHEMA'; - default: - throw new Error(`Unsupported SQLValueFunction op: ${node.op}`); + case 'SVFOP_CURRENT_DATE': + return 'CURRENT_DATE'; + case 'SVFOP_CURRENT_TIME': + return 'CURRENT_TIME'; + case 'SVFOP_CURRENT_TIME_N': + return `CURRENT_TIME(${node.typmod || 0})`; + case 'SVFOP_CURRENT_TIMESTAMP': + return 'CURRENT_TIMESTAMP'; + case 'SVFOP_CURRENT_TIMESTAMP_N': + return `CURRENT_TIMESTAMP(${node.typmod || 0})`; + case 'SVFOP_LOCALTIME': + return 'LOCALTIME'; + case 'SVFOP_LOCALTIME_N': + return `LOCALTIME(${node.typmod || 0})`; + case 'SVFOP_LOCALTIMESTAMP': + return 'LOCALTIMESTAMP'; + case 'SVFOP_LOCALTIMESTAMP_N': + return `LOCALTIMESTAMP(${node.typmod || 0})`; + case 'SVFOP_CURRENT_ROLE': + return 'CURRENT_ROLE'; + case 'SVFOP_CURRENT_USER': + return 'CURRENT_USER'; + case 'SVFOP_USER': + return 'USER'; + case 'SVFOP_SESSION_USER': + return 'SESSION_USER'; + case 'SVFOP_CURRENT_CATALOG': + return 'CURRENT_CATALOG'; + case 'SVFOP_CURRENT_SCHEMA': + return 'CURRENT_SCHEMA'; + default: + throw new Error(`Unsupported SQLValueFunction op: ${node.op}`); } } diff --git a/packages/deparser/src/index.ts b/packages/deparser/src/index.ts index d874e41a..0654a4e1 100644 --- a/packages/deparser/src/index.ts +++ b/packages/deparser/src/index.ts @@ -1,4 +1,4 @@ -import { Deparser, DeparserOptions } from "./deparser"; +import { Deparser, DeparserOptions } from './deparser'; const deparseMethod = Deparser.deparse; @@ -7,7 +7,7 @@ export const deparseSync = deparseMethod; // Create an async wrapper for deparse export const deparse = async (...args: Parameters): Promise> => { - return deparseMethod(...args); + return deparseMethod(...args); }; export { Deparser, DeparserOptions }; diff --git a/packages/deparser/src/visitors/base.ts b/packages/deparser/src/visitors/base.ts index b18429ec..1cf6ffc8 100644 --- a/packages/deparser/src/visitors/base.ts +++ b/packages/deparser/src/visitors/base.ts @@ -1,4 +1,5 @@ import { Node } from '@pgsql/types'; + import { SqlFormatter } from '../utils/sql-formatter'; export interface DeparserContextOptions { diff --git a/packages/deparser/test-utils/index.ts b/packages/deparser/test-utils/index.ts index 58880ba5..760009fa 100644 --- a/packages/deparser/test-utils/index.ts +++ b/packages/deparser/test-utils/index.ts @@ -1,9 +1,10 @@ -import { parse } from 'libpg-query'; -import { deparseSync as deparse, DeparserOptions } from '../src'; -import { cleanTree } from '../scripts/clean-utils'; import { readFileSync } from 'fs'; +import { diff } from 'jest-diff'; +import { parse } from 'libpg-query'; import * as path from 'path'; -import { diff } from 'jest-diff' + +import { cleanTree } from '../scripts/clean-utils'; +import { DeparserOptions,deparseSync as deparse } from '../src'; export async function expectParseDeparse(sql1: string, options: DeparserOptions = { pretty: false }) { const parsed = await parse(sql1); @@ -61,24 +62,24 @@ function createParseError( function getErrorMessage(type: ParseErrorType): string { switch (type) { - case 'PARSE_FAILED': - return 'Parse failed - no statements returned'; - case 'INVALID_STATEMENT': - return 'Invalid statement structure'; - case 'REPARSE_FAILED': - return 'Reparse failed - no statements returned'; - case 'AST_MISMATCH': - return 'AST mismatch after parse/deparse cycle'; - case 'UNEXPECTED_ERROR': - return 'Unexpected error during parse/deparse cycle'; - case 'INVALID_DEPARSED_SQL': - return 'Invalid deparsed SQL'; - case 'PRETTY_INVALID_DEPARSED_SQL': - return 'Invalid deparsed SQL (pretty)'; - case 'PRETTY_REPARSE_FAILED': - return 'Reparse failed - no statements returned (pretty)'; - case 'PRETTY_AST_MISMATCH': - return 'AST mismatch after parse/deparse cycle (pretty)'; + case 'PARSE_FAILED': + return 'Parse failed - no statements returned'; + case 'INVALID_STATEMENT': + return 'Invalid statement structure'; + case 'REPARSE_FAILED': + return 'Reparse failed - no statements returned'; + case 'AST_MISMATCH': + return 'AST mismatch after parse/deparse cycle'; + case 'UNEXPECTED_ERROR': + return 'Unexpected error during parse/deparse cycle'; + case 'INVALID_DEPARSED_SQL': + return 'Invalid deparsed SQL'; + case 'PRETTY_INVALID_DEPARSED_SQL': + return 'Invalid deparsed SQL (pretty)'; + case 'PRETTY_REPARSE_FAILED': + return 'Reparse failed - no statements returned (pretty)'; + case 'PRETTY_AST_MISMATCH': + return 'AST mismatch after parse/deparse cycle (pretty)'; } } @@ -287,11 +288,7 @@ export class FixtureTestUtils extends TestUtils { } const entries = this.getTestEntries(filters); for (const [relativePath, sql] of entries) { - try { - await this.expectAstMatch(relativePath, sql); - } catch (err) { - throw err; - } + await this.expectAstMatch(relativePath, sql); } } } diff --git a/packages/parse/__tests__/parse.test.ts b/packages/parse/__tests__/parse.test.ts index 6544c786..8ace22ca 100644 --- a/packages/parse/__tests__/parse.test.ts +++ b/packages/parse/__tests__/parse.test.ts @@ -1,4 +1,4 @@ -import { parse, parseSync, deparseEnhanced, isRawComment, isRawWhitespace, isRawStmt, loadModule } from '../src'; +import { deparseEnhanced, isRawComment, isRawStmt, isRawWhitespace, loadModule,parse, parseSync } from '../src'; beforeAll(async () => { await loadModule(); diff --git a/packages/parse/__tests__/roundtrip.test.ts b/packages/parse/__tests__/roundtrip.test.ts index 81b5765c..010445ab 100644 --- a/packages/parse/__tests__/roundtrip.test.ts +++ b/packages/parse/__tests__/roundtrip.test.ts @@ -1,12 +1,13 @@ import * as fs from 'fs'; import * as path from 'path'; + import { - parseSync, deparseEnhanced, isRawComment, - isRawWhitespace, isRawStmt, + isRawWhitespace, loadModule, + parseSync, } from '../src'; const FIXTURES_DIR = path.join(__dirname, 'fixtures'); diff --git a/packages/parse/__tests__/scanner.test.ts b/packages/parse/__tests__/scanner.test.ts index 5c1b995c..f3ecd3f4 100644 --- a/packages/parse/__tests__/scanner.test.ts +++ b/packages/parse/__tests__/scanner.test.ts @@ -1,6 +1,7 @@ -import { scanComments, ScannedElement } from '../src/scanner'; import { loadModule } from 'libpg-query'; +import { scanComments } from '../src/scanner'; + describe('scanComments', () => { beforeAll(async () => { await loadModule(); @@ -62,14 +63,14 @@ describe('scanComments', () => { describe('dollar-quoted strings (should be skipped)', () => { it('ignores comments inside $$ dollar-quoted strings', () => { - const sql = "SELECT $$ -- not a comment $$;"; + const sql = 'SELECT $$ -- not a comment $$;'; const elements = scanComments(sql); const comments = elements.filter(e => e.kind === 'comment'); expect(comments).toHaveLength(0); }); it('ignores comments inside tagged dollar-quoted strings', () => { - const sql = "SELECT $body$ -- not a comment $body$;"; + const sql = 'SELECT $body$ -- not a comment $body$;'; const elements = scanComments(sql); const comments = elements.filter(e => e.kind === 'comment'); expect(comments).toHaveLength(0); diff --git a/packages/parse/jest.config.js b/packages/parse/jest.config.js index dbccf866..d0c2c967 100644 --- a/packages/parse/jest.config.js +++ b/packages/parse/jest.config.js @@ -1,28 +1,28 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", - transform: { - "^.+\\.tsx?$": [ - "ts-jest", - { - babelConfig: false, - tsconfig: "tsconfig.test.json", - }, - ], - }, - transformIgnorePatterns: [ - "/node_modules/(?!(pgsql-deparser|@pgsql/quotes|@pgsql/types|@pgsql/utils)/)" + preset: 'ts-jest', + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + babelConfig: false, + tsconfig: 'tsconfig.test.json', + }, ], - moduleNameMapper: { - "^pgsql-deparser$": "/../deparser/src/index.ts", - "^pgsql-deparser/(.*)$": "/../deparser/src/$1", - "^@pgsql/quotes$": "/../quotes/src/index.ts", - "^@pgsql/quotes/(.*)$": "/../quotes/src/$1", - "^@pgsql/utils$": "/../utils/src/index.ts", - "^@pgsql/utils/(.*)$": "/../utils/src/$1", - }, - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - modulePathIgnorePatterns: ["dist/*"] + }, + transformIgnorePatterns: [ + '/node_modules/(?!(pgsql-deparser|@pgsql/quotes|@pgsql/types|@pgsql/utils)/)' + ], + moduleNameMapper: { + '^pgsql-deparser$': '/../deparser/src/index.ts', + '^pgsql-deparser/(.*)$': '/../deparser/src/$1', + '^@pgsql/quotes$': '/../quotes/src/index.ts', + '^@pgsql/quotes/(.*)$': '/../quotes/src/$1', + '^@pgsql/utils$': '/../utils/src/index.ts', + '^@pgsql/utils/(.*)$': '/../utils/src/$1', + }, + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + modulePathIgnorePatterns: ['dist/*'] }; diff --git a/packages/parse/src/deparse.ts b/packages/parse/src/deparse.ts index 386b2923..cb46f265 100644 --- a/packages/parse/src/deparse.ts +++ b/packages/parse/src/deparse.ts @@ -8,13 +8,13 @@ */ import { Deparser, DeparserOptions } from 'pgsql-deparser'; + import { EnhancedParseResult, isRawComment, - isRawWhitespace, isRawStmt, + isRawWhitespace, RawComment, - RawWhitespace, } from './types'; /** diff --git a/packages/parse/src/index.ts b/packages/parse/src/index.ts index b8835461..c932c186 100644 --- a/packages/parse/src/index.ts +++ b/packages/parse/src/index.ts @@ -27,14 +27,14 @@ export { loadModule } from 'libpg-query'; // Types export { - RawComment, - RawWhitespace, - EnhancedStmt, EnhancedParseResult, + EnhancedStmt, isRawComment, - isRawWhitespace, isRawStmt, + isRawWhitespace, + RawComment, + RawWhitespace, } from './types'; // Scanner (for advanced use) -export { scanComments, ScannedComment, ScannedWhitespace, ScannedElement } from './scanner'; +export { scanComments, ScannedComment, ScannedElement,ScannedWhitespace } from './scanner'; diff --git a/packages/parse/src/parse.ts b/packages/parse/src/parse.ts index f2429cbc..8ed7194b 100644 --- a/packages/parse/src/parse.ts +++ b/packages/parse/src/parse.ts @@ -4,8 +4,9 @@ * parse result's stmts array. */ -import { parse as libParse, parseSync as libParseSync } from 'libpg-query'; import { ParseResult, RawStmt } from '@pgsql/types'; +import { parse as libParse, parseSync as libParseSync } from 'libpg-query'; + import { scanComments, ScannedElement } from './scanner'; import { EnhancedParseResult, EnhancedStmt } from './types'; diff --git a/packages/parse/src/types.ts b/packages/parse/src/types.ts index 1681947c..eb2c3407 100644 --- a/packages/parse/src/types.ts +++ b/packages/parse/src/types.ts @@ -1,4 +1,4 @@ -import { ParseResult, RawStmt } from '@pgsql/types'; +import { RawStmt } from '@pgsql/types'; /** * Synthetic AST node representing a SQL comment. diff --git a/packages/parser/__tests__/parser.test.ts b/packages/parser/__tests__/parser.test.ts index 82caa91c..85d1aea0 100644 --- a/packages/parser/__tests__/parser.test.ts +++ b/packages/parser/__tests__/parser.test.ts @@ -1,4 +1,4 @@ -import { parse, parseSync, deparse, deparseSync, loadModule } from '../src'; +import { deparse, deparseSync, loadModule,parse, parseSync } from '../src'; describe('pgsql-parser', () => { describe('Async API', () => { diff --git a/packages/parser/jest.config.js b/packages/parser/jest.config.js index a6514846..e049bd3d 100644 --- a/packages/parser/jest.config.js +++ b/packages/parser/jest.config.js @@ -1,18 +1,18 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", - transform: { - "^.+\\.tsx?$": [ - "ts-jest", - { - babelConfig: false, - tsconfig: "tsconfig.json", - }, - ], - }, - transformIgnorePatterns: [`/node_modules/*`], - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - modulePathIgnorePatterns: ["dist/*", "versions/*"] + preset: 'ts-jest', + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + babelConfig: false, + tsconfig: 'tsconfig.json', + }, + ], + }, + transformIgnorePatterns: [`/node_modules/*`], + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + modulePathIgnorePatterns: ['dist/*', 'versions/*'] }; diff --git a/packages/parser/scripts/prepare-versions.ts b/packages/parser/scripts/prepare-versions.ts index 861af77f..e6beaec8 100644 --- a/packages/parser/scripts/prepare-versions.ts +++ b/packages/parser/scripts/prepare-versions.ts @@ -79,40 +79,40 @@ export * from '@pgsql/types'; ); fs.writeFileSync(path.join(versionDir, 'tsconfig.json'), JSON.stringify({ - "compilerOptions": { - "outDir": "dist", - "rootDir": "src/", - "target": "es2022", - "module": "commonjs", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "strictNullChecks": false, - "skipLibCheck": true, - "sourceMap": false, - "declaration": true, - "resolveJsonModule": true, - "moduleResolution": "node" + compilerOptions: { + outDir: 'dist', + rootDir: 'src/', + target: 'es2022', + module: 'commonjs', + esModuleInterop: true, + forceConsistentCasingInFileNames: true, + strict: true, + strictNullChecks: false, + skipLibCheck: true, + sourceMap: false, + declaration: true, + resolveJsonModule: true, + moduleResolution: 'node' }, - "include": [ - "src/**/*.ts" + include: [ + 'src/**/*.ts' ], - "exclude": [ - "dist", - "node_modules", - "**/*.spec.*", - "**/*.test.*" + exclude: [ + 'dist', + 'node_modules', + '**/*.spec.*', + '**/*.test.*' ] }, null, 2)); fs.writeFileSync(path.join(versionDir, 'tsconfig.esm.json'), JSON.stringify({ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "dist/esm", - "module": "es2022", - "rootDir": "src/", - "declaration": false + extends: './tsconfig.json', + compilerOptions: { + outDir: 'dist/esm', + module: 'es2022', + rootDir: 'src/', + declaration: false } }, null, 2)); diff --git a/packages/parser/scripts/test-ast.ts b/packages/parser/scripts/test-ast.ts index dd39e2ef..10559f45 100644 --- a/packages/parser/scripts/test-ast.ts +++ b/packages/parser/scripts/test-ast.ts @@ -1,8 +1,9 @@ -import { parse } from '../src/'; -import { cleanTree } from '../src/utils'; import { readFileSync, writeFileSync } from 'fs'; import { join } from 'path'; +import { parse } from '../src/'; +import { cleanTree } from '../src/utils'; + async function testAst() { try { // Read SQL from input.sql in the same directory diff --git a/packages/parser/src/index.ts b/packages/parser/src/index.ts index b13b1a19..cdfebefa 100644 --- a/packages/parser/src/index.ts +++ b/packages/parser/src/index.ts @@ -1,9 +1,7 @@ export { + loadModule as loadModule, parse as parse, - parseSync as parseSync, - loadModule as loadModule -} from 'libpg-query'; - + parseSync as parseSync} from 'libpg-query'; export { deparse, deparseSync diff --git a/packages/pgsql-cli/jest.config.js b/packages/pgsql-cli/jest.config.js index 0aa3aaa4..057a9420 100644 --- a/packages/pgsql-cli/jest.config.js +++ b/packages/pgsql-cli/jest.config.js @@ -1,18 +1,18 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", - transform: { - "^.+\\.tsx?$": [ - "ts-jest", - { - babelConfig: false, - tsconfig: "tsconfig.json", - }, - ], - }, - transformIgnorePatterns: [`/node_modules/*`], - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - modulePathIgnorePatterns: ["dist/*"] + preset: 'ts-jest', + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + babelConfig: false, + tsconfig: 'tsconfig.json', + }, + ], + }, + transformIgnorePatterns: [`/node_modules/*`], + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + modulePathIgnorePatterns: ['dist/*'] }; diff --git a/packages/pgsql-cli/src/commands/deparse.ts b/packages/pgsql-cli/src/commands/deparse.ts index 0a8a9451..d5df2b32 100644 --- a/packages/pgsql-cli/src/commands/deparse.ts +++ b/packages/pgsql-cli/src/commands/deparse.ts @@ -1,7 +1,8 @@ +import chalk from 'chalk'; import { readFileSync, writeFileSync } from 'fs'; -import { resolve, join } from 'path'; +import { join,resolve } from 'path'; import { deparse } from 'pgsql-deparser'; -import chalk from 'chalk'; + import { showHelp } from '../utils/help'; export async function deparseCommand(argv: any) { diff --git a/packages/pgsql-cli/src/commands/parse.ts b/packages/pgsql-cli/src/commands/parse.ts index 6f5c3b93..82958da9 100644 --- a/packages/pgsql-cli/src/commands/parse.ts +++ b/packages/pgsql-cli/src/commands/parse.ts @@ -1,7 +1,8 @@ +import chalk from 'chalk'; import { readFileSync, writeFileSync } from 'fs'; -import { resolve, join } from 'path'; +import { join,resolve } from 'path'; import { parse } from 'pgsql-parser'; -import chalk from 'chalk'; + import { showHelp } from '../utils/help'; export async function parseCommand(argv: any) { diff --git a/packages/pgsql-cli/src/commands/proto-fetch.ts b/packages/pgsql-cli/src/commands/proto-fetch.ts index a647c509..ebb66c58 100644 --- a/packages/pgsql-cli/src/commands/proto-fetch.ts +++ b/packages/pgsql-cli/src/commands/proto-fetch.ts @@ -1,4 +1,5 @@ import chalk from 'chalk'; + import { showHelp } from '../utils/help'; import { downloadProtoFile, generateProtoJS, replaceTextInProtoJS } from './proto-fetch/helpers'; diff --git a/packages/pgsql-cli/src/commands/proto-fetch/cli.ts b/packages/pgsql-cli/src/commands/proto-fetch/cli.ts index a6f0f687..91ee0fb6 100644 --- a/packages/pgsql-cli/src/commands/proto-fetch/cli.ts +++ b/packages/pgsql-cli/src/commands/proto-fetch/cli.ts @@ -32,7 +32,7 @@ export const help = (): void => { --originalPackageName Original package name to be replaced in the JS file. --newPackageName New package name to replace in the JS file. `); -} +}; export default async (argv: CommandOptions): Promise => { diff --git a/packages/pgsql-cli/src/commands/proto-fetch/helpers.ts b/packages/pgsql-cli/src/commands/proto-fetch/helpers.ts index 9f1d4821..2f305b1c 100644 --- a/packages/pgsql-cli/src/commands/proto-fetch/helpers.ts +++ b/packages/pgsql-cli/src/commands/proto-fetch/helpers.ts @@ -1,6 +1,6 @@ -import https from 'https'; -import fs from 'fs'; import { exec } from 'child_process'; +import fs from 'fs'; +import https from 'https'; import { sync as mkdirp } from 'mkdirp'; import { dirname } from 'path'; @@ -30,7 +30,7 @@ export const downloadProtoFile = (protoUrl: string, filePath: string): Promise => new Promise((resolve, reject) => { diff --git a/packages/pgsql-cli/src/commands/proto-gen.ts b/packages/pgsql-cli/src/commands/proto-gen.ts index 2cb00b22..d8c593bc 100644 --- a/packages/pgsql-cli/src/commands/proto-gen.ts +++ b/packages/pgsql-cli/src/commands/proto-gen.ts @@ -1,6 +1,7 @@ -import { PgProtoParser, PgProtoParserOptions, getOptionsWithDefaults } from 'pg-proto-parser'; -import o from 'nested-obj'; import chalk from 'chalk'; +import o from 'nested-obj'; +import { getOptionsWithDefaults,PgProtoParser, PgProtoParserOptions } from 'pg-proto-parser'; + import { showHelp } from '../utils/help'; export async function protoGenCommand(argv: any) { diff --git a/packages/pgsql-cli/src/commands/runtime-schema.ts b/packages/pgsql-cli/src/commands/runtime-schema.ts index e8c92edd..61edb4fd 100644 --- a/packages/pgsql-cli/src/commands/runtime-schema.ts +++ b/packages/pgsql-cli/src/commands/runtime-schema.ts @@ -1,7 +1,8 @@ -import { PgProtoParser, PgProtoParserOptions, getOptionsWithDefaults } from 'pg-proto-parser'; +import chalk from 'chalk'; import { writeFileSync } from 'fs'; import { join } from 'path'; -import chalk from 'chalk'; +import { getOptionsWithDefaults,PgProtoParser, PgProtoParserOptions } from 'pg-proto-parser'; + import { showHelp } from '../utils/help'; export async function runtimeSchemaCommand(argv: any) { diff --git a/packages/pgsql-cli/src/index.ts b/packages/pgsql-cli/src/index.ts index 0cd713a7..71d78126 100644 --- a/packages/pgsql-cli/src/index.ts +++ b/packages/pgsql-cli/src/index.ts @@ -1,13 +1,11 @@ #!/usr/bin/env node -import minimist from 'minimist'; import chalk from 'chalk'; -import { readFileSync } from 'fs'; -import { resolve } from 'path'; +import minimist from 'minimist'; -import { parseCommand } from './commands/parse'; import { deparseCommand } from './commands/deparse'; -import { protoGenCommand } from './commands/proto-gen'; +import { parseCommand } from './commands/parse'; import { protoFetchCommand } from './commands/proto-fetch'; +import { protoGenCommand } from './commands/proto-gen'; import { runtimeSchemaCommand } from './commands/runtime-schema'; import { showHelp, showVersion } from './utils/help'; @@ -35,30 +33,30 @@ async function main() { } switch (command) { - case 'parse': - await parseCommand(argv); - break; + case 'parse': + await parseCommand(argv); + break; - case 'deparse': - await deparseCommand(argv); - break; + case 'deparse': + await deparseCommand(argv); + break; - case 'proto-gen': - await protoGenCommand(argv); - break; + case 'proto-gen': + await protoGenCommand(argv); + break; - case 'proto-fetch': - await protoFetchCommand(argv); - break; + case 'proto-fetch': + await protoFetchCommand(argv); + break; - case 'runtime-schema': - await runtimeSchemaCommand(argv); - break; + case 'runtime-schema': + await runtimeSchemaCommand(argv); + break; - default: - console.error(chalk.red(`Unknown command: ${command}`)); - showHelp(); - process.exit(1); + default: + console.error(chalk.red(`Unknown command: ${command}`)); + showHelp(); + process.exit(1); } } catch (error: any) { console.error(chalk.red('Error:'), error.message || error); diff --git a/packages/pgsql-cli/src/package.ts b/packages/pgsql-cli/src/package.ts index 74d39ab3..d13fda90 100644 --- a/packages/pgsql-cli/src/package.ts +++ b/packages/pgsql-cli/src/package.ts @@ -1,5 +1,5 @@ -import { existsSync,readFileSync } from "fs"; -import { dirname,join } from "path"; +import { existsSync,readFileSync } from 'fs'; +import { dirname,join } from 'path'; // need to search due to the dist/ folder and src/, etc. function findPackageJson(currentDir: string): string { diff --git a/packages/pgsql-cli/src/utils/help.ts b/packages/pgsql-cli/src/utils/help.ts index f1902454..9c3d92e3 100644 --- a/packages/pgsql-cli/src/utils/help.ts +++ b/packages/pgsql-cli/src/utils/help.ts @@ -1,6 +1,6 @@ import chalk from 'chalk'; import { readFileSync } from 'fs'; -import { resolve, join } from 'path'; +import { join } from 'path'; export function showVersion() { // Try to find package.json in various locations @@ -29,23 +29,23 @@ export function showVersion() { export function showHelp(command?: string) { if (command) { switch (command) { - case 'parse': - showParseHelp(); - break; - case 'deparse': - showDeparseHelp(); - break; - case 'proto-gen': - showProtoGenHelp(); - break; - case 'proto-fetch': - showProtoFetchHelp(); - break; - case 'runtime-schema': - showRuntimeSchemaHelp(); - break; - default: - showGeneralHelp(); + case 'parse': + showParseHelp(); + break; + case 'deparse': + showDeparseHelp(); + break; + case 'proto-gen': + showProtoGenHelp(); + break; + case 'proto-fetch': + showProtoFetchHelp(); + break; + case 'runtime-schema': + showRuntimeSchemaHelp(); + break; + default: + showGeneralHelp(); } } else { showGeneralHelp(); diff --git a/packages/pgsql-types/scripts/generate-types.ts b/packages/pgsql-types/scripts/generate-types.ts index 55be9ffa..ce266fb0 100644 --- a/packages/pgsql-types/scripts/generate-types.ts +++ b/packages/pgsql-types/scripts/generate-types.ts @@ -1,7 +1,8 @@ -import { runtimeSchema, NodeSpec, FieldSpec } from '../../utils/src/runtime-schema'; import * as fs from 'fs'; import * as path from 'path'; +import { FieldSpec,NodeSpec, runtimeSchema } from '../../utils/src/runtime-schema'; + interface FieldMetadata { nullable: boolean; tags: string[]; @@ -21,15 +22,15 @@ const schemaMap = new Map( ); const primitiveTypeMap: Record = { - 'string': 'string', - 'bool': 'boolean', - 'int32': 'number', - 'int64': 'number', - 'uint32': 'number', - 'uint64': 'number', - 'float': 'number', - 'double': 'number', - 'bytes': 'Uint8Array', + string: 'string', + bool: 'boolean', + int32: 'number', + int64: 'number', + uint32: 'number', + uint64: 'number', + float: 'number', + double: 'number', + bytes: 'Uint8Array', }; function isPrimitiveType(type: string): boolean { diff --git a/packages/pgsql-types/scripts/infer-field-metadata.ts b/packages/pgsql-types/scripts/infer-field-metadata.ts index 2e91ba73..133101d8 100644 --- a/packages/pgsql-types/scripts/infer-field-metadata.ts +++ b/packages/pgsql-types/scripts/infer-field-metadata.ts @@ -1,8 +1,9 @@ -import { parseSync, loadModule } from 'libpg-query'; -import { runtimeSchema, NodeSpec, FieldSpec } from '../../utils/src/runtime-schema'; import * as fs from 'fs'; +import { loadModule,parseSync } from 'libpg-query'; import * as path from 'path'; +import { FieldSpec,NodeSpec, runtimeSchema } from '../../utils/src/runtime-schema'; + interface FieldMetadata { nullable: boolean; tags: string[]; diff --git a/packages/plpgsql-deparser/__tests__/deparser-fixes.test.ts b/packages/plpgsql-deparser/__tests__/deparser-fixes.test.ts index 17385209..7722b63a 100644 --- a/packages/plpgsql-deparser/__tests__/deparser-fixes.test.ts +++ b/packages/plpgsql-deparser/__tests__/deparser-fixes.test.ts @@ -1,4 +1,5 @@ import { loadModule, parsePlPgSQLSync } from 'libpg-query'; + import { deparseSync, PLpgSQLParseResult } from '../src'; import { PLpgSQLTestUtils } from '../test-utils'; diff --git a/packages/plpgsql-deparser/__tests__/hydrate-demo.test.ts b/packages/plpgsql-deparser/__tests__/hydrate-demo.test.ts index 543ccc67..69b0c904 100644 --- a/packages/plpgsql-deparser/__tests__/hydrate-demo.test.ts +++ b/packages/plpgsql-deparser/__tests__/hydrate-demo.test.ts @@ -1,8 +1,9 @@ -import { loadModule, parsePlPgSQLSync, parseSync } from 'libpg-query'; -import { deparse } from 'pgsql-deparser'; import * as fs from 'fs'; +import { loadModule, parsePlPgSQLSync, parseSync } from 'libpg-query'; import * as path from 'path'; -import { hydratePlpgsqlAst, dehydratePlpgsqlAst, PLpgSQLParseResult, deparseSync } from '../src'; +import { deparse } from 'pgsql-deparser'; + +import { dehydratePlpgsqlAst, deparseSync,hydratePlpgsqlAst, PLpgSQLParseResult } from '../src'; describe('hydrate demonstration with big-function.sql', () => { beforeAll(async () => { diff --git a/packages/plpgsql-deparser/__tests__/hydrate.test.ts b/packages/plpgsql-deparser/__tests__/hydrate.test.ts index e46945e3..1e439cf2 100644 --- a/packages/plpgsql-deparser/__tests__/hydrate.test.ts +++ b/packages/plpgsql-deparser/__tests__/hydrate.test.ts @@ -1,5 +1,6 @@ import { loadModule, parsePlPgSQLSync } from 'libpg-query'; -import { hydratePlpgsqlAst, dehydratePlpgsqlAst, deparseSync, isHydratedExpr, getOriginalQuery, PLpgSQLParseResult } from '../src'; + +import { dehydratePlpgsqlAst, deparseSync, getOriginalQuery, hydratePlpgsqlAst, isHydratedExpr, PLpgSQLParseResult } from '../src'; describe('hydratePlpgsqlAst', () => { beforeAll(async () => { diff --git a/packages/plpgsql-deparser/__tests__/plpgsql-deparser.test.ts b/packages/plpgsql-deparser/__tests__/plpgsql-deparser.test.ts index d2bdd08d..ae12e840 100644 --- a/packages/plpgsql-deparser/__tests__/plpgsql-deparser.test.ts +++ b/packages/plpgsql-deparser/__tests__/plpgsql-deparser.test.ts @@ -1,5 +1,6 @@ import { loadModule } from 'libpg-query'; -import { PLpgSQLDeparser, deparseSync, PLpgSQLParseResult } from '../src'; + +import { deparseSync, PLpgSQLDeparser, PLpgSQLParseResult } from '../src'; import { FixtureTestUtils } from '../test-utils'; describe('PLpgSQLDeparser', () => { diff --git a/packages/plpgsql-deparser/__tests__/return-context.test.ts b/packages/plpgsql-deparser/__tests__/return-context.test.ts index 987f8102..715f42e0 100644 --- a/packages/plpgsql-deparser/__tests__/return-context.test.ts +++ b/packages/plpgsql-deparser/__tests__/return-context.test.ts @@ -1,4 +1,5 @@ -import { loadModule, parsePlPgSQLSync, parseSync } from 'libpg-query'; +import { loadModule, parsePlPgSQLSync } from 'libpg-query'; + import { deparseSync, ReturnInfo } from '../src'; import { PLpgSQLParseResult } from '../src/types'; diff --git a/packages/plpgsql-deparser/__tests__/schema-rename-mapped.test.ts b/packages/plpgsql-deparser/__tests__/schema-rename-mapped.test.ts index 82eacdfb..efaa7238 100644 --- a/packages/plpgsql-deparser/__tests__/schema-rename-mapped.test.ts +++ b/packages/plpgsql-deparser/__tests__/schema-rename-mapped.test.ts @@ -8,11 +8,12 @@ * 2. The final SQL output after transformation */ -import { loadModule, parsePlPgSQLSync, parseSync } from 'libpg-query'; -import { Deparser } from 'pgsql-deparser'; -import { hydratePlpgsqlAst, dehydratePlpgsqlAst, PLpgSQLParseResult, deparseSync } from '../src'; import { readFileSync } from 'fs'; +import { loadModule, parsePlPgSQLSync, parseSync } from 'libpg-query'; import * as path from 'path'; +import { Deparser } from 'pgsql-deparser'; + +import { dehydratePlpgsqlAst, deparseSync,hydratePlpgsqlAst, PLpgSQLParseResult } from '../src'; const FIXTURE_PATH = path.join(__dirname, '../../../__fixtures__/plpgsql/plpgsql_schema_rename.sql'); @@ -377,15 +378,15 @@ describe('schema rename mapped', () => { it('should transform schema names and snapshot schema rename map and output', () => { // Define the schema rename map with schemas to transform const schemaRenameMap: SchemaRenameMap = { - 'app_public': { + app_public: { newSchema: 'myapp_v2', references: [], }, - 'app_private': { + app_private: { newSchema: 'myapp_private_v2', references: [], }, - 'app_internal': { + app_internal: { newSchema: 'myapp_internal_v2', references: [], }, diff --git a/packages/plpgsql-deparser/__tests__/schema-transform.demo.test.ts b/packages/plpgsql-deparser/__tests__/schema-transform.demo.test.ts index e4034d7b..45b9e2e2 100644 --- a/packages/plpgsql-deparser/__tests__/schema-transform.demo.test.ts +++ b/packages/plpgsql-deparser/__tests__/schema-transform.demo.test.ts @@ -18,7 +18,8 @@ import { loadModule, parsePlPgSQLSync, parseSync } from 'libpg-query'; import { Deparser } from 'pgsql-deparser'; -import { hydratePlpgsqlAst, dehydratePlpgsqlAst, PLpgSQLParseResult, deparseSync } from '../src'; + +import { dehydratePlpgsqlAst, deparseSync,hydratePlpgsqlAst, PLpgSQLParseResult } from '../src'; describe('schema transform demo', () => { beforeAll(async () => { @@ -327,7 +328,7 @@ describe('schema transform demo', () => { expect(output).toContain('myapp_public.get_active_users'); expect(output).toContain('myapp_public.users'); // Use regex with word boundary to avoid matching 'app_public' inside 'myapp_public' - expect(output).not.toMatch(/\bapp_public\./) + expect(output).not.toMatch(/\bapp_public\./); // Verify valid SQL const reparsed = parseSync(output); diff --git a/packages/plpgsql-deparser/jest.config.js b/packages/plpgsql-deparser/jest.config.js index 0aa3aaa4..057a9420 100644 --- a/packages/plpgsql-deparser/jest.config.js +++ b/packages/plpgsql-deparser/jest.config.js @@ -1,18 +1,18 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", - transform: { - "^.+\\.tsx?$": [ - "ts-jest", - { - babelConfig: false, - tsconfig: "tsconfig.json", - }, - ], - }, - transformIgnorePatterns: [`/node_modules/*`], - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - modulePathIgnorePatterns: ["dist/*"] + preset: 'ts-jest', + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + babelConfig: false, + tsconfig: 'tsconfig.json', + }, + ], + }, + transformIgnorePatterns: [`/node_modules/*`], + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + modulePathIgnorePatterns: ['dist/*'] }; diff --git a/packages/plpgsql-deparser/scripts/make-fixtures.ts b/packages/plpgsql-deparser/scripts/make-fixtures.ts index cf624d54..46560b43 100644 --- a/packages/plpgsql-deparser/scripts/make-fixtures.ts +++ b/packages/plpgsql-deparser/scripts/make-fixtures.ts @@ -1,9 +1,9 @@ #!/usr/bin/env ts-node -import * as path from 'path'; import * as fs from 'fs'; import { sync as globSync } from 'glob'; import { parse } from 'libpg-query'; -import { parsePlPgSQLSync, loadModule } from 'libpg-query'; +import { loadModule,parsePlPgSQLSync } from 'libpg-query'; +import * as path from 'path'; const FIXTURE_DIR = path.join(__dirname, '../../../__fixtures__/plpgsql'); const OUT_DIR = path.join(__dirname, '../../../__fixtures__/plpgsql-generated'); diff --git a/packages/plpgsql-deparser/src/hydrate-types.ts b/packages/plpgsql-deparser/src/hydrate-types.ts index 7c748d2d..036e29ea 100644 --- a/packages/plpgsql-deparser/src/hydrate-types.ts +++ b/packages/plpgsql-deparser/src/hydrate-types.ts @@ -1,4 +1,4 @@ -import { ParseResult, Node } from '@pgsql/types'; +import { Node,ParseResult } from '@pgsql/types'; export enum ParseMode { RAW_PARSE_DEFAULT = 0, diff --git a/packages/plpgsql-deparser/src/hydrate.ts b/packages/plpgsql-deparser/src/hydrate.ts index 14d71f7a..bffd97eb 100644 --- a/packages/plpgsql-deparser/src/hydrate.ts +++ b/packages/plpgsql-deparser/src/hydrate.ts @@ -1,16 +1,16 @@ +import { Node,ParseResult } from '@pgsql/types'; import { parseSync, scanSync } from 'libpg-query'; -import { ParseResult, Node } from '@pgsql/types'; import { Deparser, DeparserOptions } from 'pgsql-deparser'; + import { + HydratedExprAssign, HydratedExprQuery, - HydratedExprRaw, HydratedExprSqlExpr, HydratedExprSqlStmt, - HydratedExprAssign, HydratedTypeName, + HydrationError, HydrationOptions, HydrationResult, - HydrationError, HydrationStats, ParseMode, } from './hydrate-types'; @@ -724,64 +724,64 @@ function normalizeForComparison(str: string): string { function dehydrateQuery(query: HydratedExprQuery, sqlDeparseOptions?: DeparserOptions): string { switch (query.kind) { - case 'assign': { - // For assignments, always prefer deparsing the AST nodes if they exist. - // This enables AST-based transformations (e.g., schema renaming). - // Fall back to string fields if AST nodes are missing or deparse fails. - const assignQuery = query as HydratedExprAssign; + case 'assign': { + // For assignments, always prefer deparsing the AST nodes if they exist. + // This enables AST-based transformations (e.g., schema renaming). + // Fall back to string fields if AST nodes are missing or deparse fails. + const assignQuery = query as HydratedExprAssign; - let target = assignQuery.target; - let value = assignQuery.value; + let target = assignQuery.target; + let value = assignQuery.value; - // For target: prefer deparsed AST if available - if (assignQuery.targetExpr) { - const deparsedTarget = deparseExprNode(assignQuery.targetExpr, sqlDeparseOptions); - if (deparsedTarget !== null) { - target = deparsedTarget; - } + // For target: prefer deparsed AST if available + if (assignQuery.targetExpr) { + const deparsedTarget = deparseExprNode(assignQuery.targetExpr, sqlDeparseOptions); + if (deparsedTarget !== null) { + target = deparsedTarget; } + } - // For value: prefer deparsed AST if available - if (assignQuery.valueExpr) { - const deparsedValue = deparseExprNode(assignQuery.valueExpr, sqlDeparseOptions); - if (deparsedValue !== null) { - value = deparsedValue; - } + // For value: prefer deparsed AST if available + if (assignQuery.valueExpr) { + const deparsedValue = deparseExprNode(assignQuery.valueExpr, sqlDeparseOptions); + if (deparsedValue !== null) { + value = deparsedValue; } - - return `${target} := ${value}`; } - case 'sql-stmt': { - // Deparse the modified parseResult back to SQL - // This enables AST-based transformations (e.g., schema renaming) - // Pass through sqlDeparseOptions to control formatting (pretty printing, etc.) - const stmtQuery = query as HydratedExprSqlStmt; - if (stmtQuery.parseResult?.stmts?.[0]?.stmt) { - try { - return Deparser.deparse(stmtQuery.parseResult.stmts[0].stmt, sqlDeparseOptions); - } catch { - // Fall back to original if deparse fails - return query.original; - } + + return `${target} := ${value}`; + } + case 'sql-stmt': { + // Deparse the modified parseResult back to SQL + // This enables AST-based transformations (e.g., schema renaming) + // Pass through sqlDeparseOptions to control formatting (pretty printing, etc.) + const stmtQuery = query as HydratedExprSqlStmt; + if (stmtQuery.parseResult?.stmts?.[0]?.stmt) { + try { + return Deparser.deparse(stmtQuery.parseResult.stmts[0].stmt, sqlDeparseOptions); + } catch { + // Fall back to original if deparse fails + return query.original; } - return query.original; } - case 'sql-expr': { - // For sql-expr, always prefer deparsing the AST. - // This enables AST-based transformations (e.g., schema renaming). - // Fall back to original only if deparse fails. - const exprQuery = query as HydratedExprSqlExpr; - if (exprQuery.expr) { - const deparsed = deparseExprNode(exprQuery.expr, sqlDeparseOptions); - if (deparsed !== null) { - return deparsed; - } + return query.original; + } + case 'sql-expr': { + // For sql-expr, always prefer deparsing the AST. + // This enables AST-based transformations (e.g., schema renaming). + // Fall back to original only if deparse fails. + const exprQuery = query as HydratedExprSqlExpr; + if (exprQuery.expr) { + const deparsed = deparseExprNode(exprQuery.expr, sqlDeparseOptions); + if (deparsed !== null) { + return deparsed; } - // Fall back to original if deparse fails - return query.original; } - case 'raw': - default: - return query.original; + // Fall back to original if deparse fails + return query.original; + } + case 'raw': + default: + return query.original; } } diff --git a/packages/plpgsql-deparser/src/index.ts b/packages/plpgsql-deparser/src/index.ts index 3bee06e6..faab7344 100644 --- a/packages/plpgsql-deparser/src/index.ts +++ b/packages/plpgsql-deparser/src/index.ts @@ -19,6 +19,6 @@ export const deparseFunction = async ( }; export { PLpgSQLDeparser, PLpgSQLDeparserOptions, ReturnInfo, ReturnInfoKind }; -export * from './types'; +export { dehydratePlpgsqlAst, DehydrationOptions,getOriginalQuery, hydratePlpgsqlAst, isHydratedExpr, isHydratedTypeName } from './hydrate'; export * from './hydrate-types'; -export { hydratePlpgsqlAst, dehydratePlpgsqlAst, isHydratedExpr, isHydratedTypeName, getOriginalQuery, DehydrationOptions } from './hydrate'; +export * from './types'; diff --git a/packages/plpgsql-deparser/src/plpgsql-deparser.ts b/packages/plpgsql-deparser/src/plpgsql-deparser.ts index 6117130f..e32a9b0c 100644 --- a/packages/plpgsql-deparser/src/plpgsql-deparser.ts +++ b/packages/plpgsql-deparser/src/plpgsql-deparser.ts @@ -11,52 +11,51 @@ * CREATE FUNCTION statement. */ -import { Deparser as SqlDeparser, QuoteUtils } from 'pgsql-deparser'; +import { QuoteUtils } from 'pgsql-deparser'; + import { - PLpgSQLParseResult, - PLpgSQLFunctionNode, + DiagItemKind, + ElogLevel, + FetchDirection, PLpgSQL_function, - PLpgSQLDatum, - PLpgSQLAliasNode, - PLpgSQL_var, PLpgSQL_rec, PLpgSQL_row, - PLpgSQLStmtNode, - PLpgSQL_stmt_block, + PLpgSQL_stmt_assert, PLpgSQL_stmt_assign, - PLpgSQL_stmt_if, + PLpgSQL_stmt_block, + PLpgSQL_stmt_call, PLpgSQL_stmt_case, - PLpgSQL_stmt_loop, - PLpgSQL_stmt_while, - PLpgSQL_stmt_fori, - PLpgSQL_stmt_fors, - PLpgSQL_stmt_forc, - PLpgSQL_stmt_foreach_a, - PLpgSQL_stmt_exit, - PLpgSQL_stmt_return, - PLpgSQL_stmt_return_next, - PLpgSQL_stmt_return_query, - PLpgSQL_stmt_raise, - PLpgSQL_stmt_assert, - PLpgSQL_stmt_execsql, + PLpgSQL_stmt_close, + PLpgSQL_stmt_commit, PLpgSQL_stmt_dynexecute, PLpgSQL_stmt_dynfors, + PLpgSQL_stmt_execsql, + PLpgSQL_stmt_exit, + PLpgSQL_stmt_fetch, + PLpgSQL_stmt_forc, + PLpgSQL_stmt_foreach_a, + PLpgSQL_stmt_fori, + PLpgSQL_stmt_fors, PLpgSQL_stmt_getdiag, + PLpgSQL_stmt_if, + PLpgSQL_stmt_loop, PLpgSQL_stmt_open, - PLpgSQL_stmt_fetch, - PLpgSQL_stmt_close, PLpgSQL_stmt_perform, - PLpgSQL_stmt_call, - PLpgSQL_stmt_commit, + PLpgSQL_stmt_raise, + PLpgSQL_stmt_return, + PLpgSQL_stmt_return_next, + PLpgSQL_stmt_return_query, PLpgSQL_stmt_rollback, PLpgSQL_stmt_set, + PLpgSQL_stmt_while, + PLpgSQL_var, + PLpgSQLAliasNode, + PLpgSQLDatum, PLpgSQLExprNode, + PLpgSQLFunctionNode, + PLpgSQLParseResult, + PLpgSQLStmtNode, PLpgSQLTypeNode, - PLpgSQLCaseWhenNode, - PLpgSQLElsifNode, - ElogLevel, - FetchDirection, - DiagItemKind, RaiseOptionType, } from './types'; @@ -979,64 +978,64 @@ export class PLpgSQLDeparser { const nodeData = (stmt as any)[nodeType]; switch (nodeType) { - case 'PLpgSQL_stmt_block': - return this.deparseBlock(nodeData, context, skipLabel); - case 'PLpgSQL_stmt_assign': - return this.deparseAssign(nodeData, context); - case 'PLpgSQL_stmt_if': - return this.deparseIf(nodeData, context); - case 'PLpgSQL_stmt_case': - return this.deparseCase(nodeData, context); - case 'PLpgSQL_stmt_loop': - return this.deparseLoop(nodeData, context); - case 'PLpgSQL_stmt_while': - return this.deparseWhile(nodeData, context); - case 'PLpgSQL_stmt_fori': - return this.deparseFori(nodeData, context); - case 'PLpgSQL_stmt_fors': - return this.deparseFors(nodeData, context); - case 'PLpgSQL_stmt_forc': - return this.deparseForc(nodeData, context); - case 'PLpgSQL_stmt_foreach_a': - return this.deparseForeach(nodeData, context); - case 'PLpgSQL_stmt_exit': - return this.deparseExit(nodeData, context); - case 'PLpgSQL_stmt_return': - return this.deparseReturn(nodeData, context); - case 'PLpgSQL_stmt_return_next': - return this.deparseReturnNext(nodeData, context); - case 'PLpgSQL_stmt_return_query': - return this.deparseReturnQuery(nodeData, context); - case 'PLpgSQL_stmt_raise': - return this.deparseRaise(nodeData, context); - case 'PLpgSQL_stmt_assert': - return this.deparseAssert(nodeData, context); - case 'PLpgSQL_stmt_execsql': - return this.deparseExecSql(nodeData, context); - case 'PLpgSQL_stmt_dynexecute': - return this.deparseDynExecute(nodeData, context); - case 'PLpgSQL_stmt_dynfors': - return this.deparseDynFors(nodeData, context); - case 'PLpgSQL_stmt_getdiag': - return this.deparseGetDiag(nodeData, context); - case 'PLpgSQL_stmt_open': - return this.deparseOpen(nodeData, context); - case 'PLpgSQL_stmt_fetch': - return this.deparseFetch(nodeData, context); - case 'PLpgSQL_stmt_close': - return this.deparseClose(nodeData, context); - case 'PLpgSQL_stmt_perform': - return this.deparsePerform(nodeData, context); - case 'PLpgSQL_stmt_call': - return this.deparseCall(nodeData, context); - case 'PLpgSQL_stmt_commit': - return this.deparseCommit(nodeData, context); - case 'PLpgSQL_stmt_rollback': - return this.deparseRollback(nodeData, context); - case 'PLpgSQL_stmt_set': - return this.deparseSet(nodeData, context); - default: - throw new Error(`Unknown PL/pgSQL statement type: ${nodeType}`); + case 'PLpgSQL_stmt_block': + return this.deparseBlock(nodeData, context, skipLabel); + case 'PLpgSQL_stmt_assign': + return this.deparseAssign(nodeData, context); + case 'PLpgSQL_stmt_if': + return this.deparseIf(nodeData, context); + case 'PLpgSQL_stmt_case': + return this.deparseCase(nodeData, context); + case 'PLpgSQL_stmt_loop': + return this.deparseLoop(nodeData, context); + case 'PLpgSQL_stmt_while': + return this.deparseWhile(nodeData, context); + case 'PLpgSQL_stmt_fori': + return this.deparseFori(nodeData, context); + case 'PLpgSQL_stmt_fors': + return this.deparseFors(nodeData, context); + case 'PLpgSQL_stmt_forc': + return this.deparseForc(nodeData, context); + case 'PLpgSQL_stmt_foreach_a': + return this.deparseForeach(nodeData, context); + case 'PLpgSQL_stmt_exit': + return this.deparseExit(nodeData, context); + case 'PLpgSQL_stmt_return': + return this.deparseReturn(nodeData, context); + case 'PLpgSQL_stmt_return_next': + return this.deparseReturnNext(nodeData, context); + case 'PLpgSQL_stmt_return_query': + return this.deparseReturnQuery(nodeData, context); + case 'PLpgSQL_stmt_raise': + return this.deparseRaise(nodeData, context); + case 'PLpgSQL_stmt_assert': + return this.deparseAssert(nodeData, context); + case 'PLpgSQL_stmt_execsql': + return this.deparseExecSql(nodeData, context); + case 'PLpgSQL_stmt_dynexecute': + return this.deparseDynExecute(nodeData, context); + case 'PLpgSQL_stmt_dynfors': + return this.deparseDynFors(nodeData, context); + case 'PLpgSQL_stmt_getdiag': + return this.deparseGetDiag(nodeData, context); + case 'PLpgSQL_stmt_open': + return this.deparseOpen(nodeData, context); + case 'PLpgSQL_stmt_fetch': + return this.deparseFetch(nodeData, context); + case 'PLpgSQL_stmt_close': + return this.deparseClose(nodeData, context); + case 'PLpgSQL_stmt_perform': + return this.deparsePerform(nodeData, context); + case 'PLpgSQL_stmt_call': + return this.deparseCall(nodeData, context); + case 'PLpgSQL_stmt_commit': + return this.deparseCommit(nodeData, context); + case 'PLpgSQL_stmt_rollback': + return this.deparseRollback(nodeData, context); + case 'PLpgSQL_stmt_set': + return this.deparseSet(nodeData, context); + default: + throw new Error(`Unknown PL/pgSQL statement type: ${nodeType}`); } } @@ -2214,29 +2213,29 @@ export class PLpgSQLDeparser { if (level === undefined) return ''; switch (level) { - case ElogLevel.DEBUG5: - case ElogLevel.DEBUG4: - case ElogLevel.DEBUG3: - case ElogLevel.DEBUG2: - case ElogLevel.DEBUG1: - return this.keyword('DEBUG'); - case ElogLevel.LOG: - case ElogLevel.LOG_SERVER_ONLY: - return this.keyword('LOG'); - case ElogLevel.INFO: - return this.keyword('INFO'); - case ElogLevel.NOTICE: - return this.keyword('NOTICE'); - case ElogLevel.WARNING: - case ElogLevel.WARNING_CLIENT_ONLY: - return this.keyword('WARNING'); - case ElogLevel.ERROR: - return this.keyword('EXCEPTION'); - case ElogLevel.FATAL: - case ElogLevel.PANIC: - return this.keyword('EXCEPTION'); - default: - return ''; + case ElogLevel.DEBUG5: + case ElogLevel.DEBUG4: + case ElogLevel.DEBUG3: + case ElogLevel.DEBUG2: + case ElogLevel.DEBUG1: + return this.keyword('DEBUG'); + case ElogLevel.LOG: + case ElogLevel.LOG_SERVER_ONLY: + return this.keyword('LOG'); + case ElogLevel.INFO: + return this.keyword('INFO'); + case ElogLevel.NOTICE: + return this.keyword('NOTICE'); + case ElogLevel.WARNING: + case ElogLevel.WARNING_CLIENT_ONLY: + return this.keyword('WARNING'); + case ElogLevel.ERROR: + return this.keyword('EXCEPTION'); + case ElogLevel.FATAL: + case ElogLevel.PANIC: + return this.keyword('EXCEPTION'); + default: + return ''; } } @@ -2247,26 +2246,26 @@ export class PLpgSQLDeparser { if (optType === undefined) return ''; switch (optType) { - case RaiseOptionType.PLPGSQL_RAISEOPTION_ERRCODE: - return this.keyword('ERRCODE'); - case RaiseOptionType.PLPGSQL_RAISEOPTION_MESSAGE: - return this.keyword('MESSAGE'); - case RaiseOptionType.PLPGSQL_RAISEOPTION_DETAIL: - return this.keyword('DETAIL'); - case RaiseOptionType.PLPGSQL_RAISEOPTION_HINT: - return this.keyword('HINT'); - case RaiseOptionType.PLPGSQL_RAISEOPTION_COLUMN: - return this.keyword('COLUMN'); - case RaiseOptionType.PLPGSQL_RAISEOPTION_CONSTRAINT: - return this.keyword('CONSTRAINT'); - case RaiseOptionType.PLPGSQL_RAISEOPTION_DATATYPE: - return this.keyword('DATATYPE'); - case RaiseOptionType.PLPGSQL_RAISEOPTION_TABLE: - return this.keyword('TABLE'); - case RaiseOptionType.PLPGSQL_RAISEOPTION_SCHEMA: - return this.keyword('SCHEMA'); - default: - return ''; + case RaiseOptionType.PLPGSQL_RAISEOPTION_ERRCODE: + return this.keyword('ERRCODE'); + case RaiseOptionType.PLPGSQL_RAISEOPTION_MESSAGE: + return this.keyword('MESSAGE'); + case RaiseOptionType.PLPGSQL_RAISEOPTION_DETAIL: + return this.keyword('DETAIL'); + case RaiseOptionType.PLPGSQL_RAISEOPTION_HINT: + return this.keyword('HINT'); + case RaiseOptionType.PLPGSQL_RAISEOPTION_COLUMN: + return this.keyword('COLUMN'); + case RaiseOptionType.PLPGSQL_RAISEOPTION_CONSTRAINT: + return this.keyword('CONSTRAINT'); + case RaiseOptionType.PLPGSQL_RAISEOPTION_DATATYPE: + return this.keyword('DATATYPE'); + case RaiseOptionType.PLPGSQL_RAISEOPTION_TABLE: + return this.keyword('TABLE'); + case RaiseOptionType.PLPGSQL_RAISEOPTION_SCHEMA: + return this.keyword('SCHEMA'); + default: + return ''; } } @@ -2281,50 +2280,50 @@ export class PLpgSQLDeparser { if (typeof kind === 'string') { // Map string names to their SQL keyword equivalents const stringMap: Record = { - 'ROW_COUNT': 'ROW_COUNT', - 'PG_CONTEXT': 'PG_CONTEXT', - 'PG_EXCEPTION_CONTEXT': 'PG_EXCEPTION_CONTEXT', - 'PG_EXCEPTION_DETAIL': 'PG_EXCEPTION_DETAIL', - 'PG_EXCEPTION_HINT': 'PG_EXCEPTION_HINT', - 'RETURNED_SQLSTATE': 'RETURNED_SQLSTATE', - 'COLUMN_NAME': 'COLUMN_NAME', - 'CONSTRAINT_NAME': 'CONSTRAINT_NAME', - 'PG_DATATYPE_NAME': 'PG_DATATYPE_NAME', - 'MESSAGE_TEXT': 'MESSAGE_TEXT', - 'TABLE_NAME': 'TABLE_NAME', - 'SCHEMA_NAME': 'SCHEMA_NAME', + ROW_COUNT: 'ROW_COUNT', + PG_CONTEXT: 'PG_CONTEXT', + PG_EXCEPTION_CONTEXT: 'PG_EXCEPTION_CONTEXT', + PG_EXCEPTION_DETAIL: 'PG_EXCEPTION_DETAIL', + PG_EXCEPTION_HINT: 'PG_EXCEPTION_HINT', + RETURNED_SQLSTATE: 'RETURNED_SQLSTATE', + COLUMN_NAME: 'COLUMN_NAME', + CONSTRAINT_NAME: 'CONSTRAINT_NAME', + PG_DATATYPE_NAME: 'PG_DATATYPE_NAME', + MESSAGE_TEXT: 'MESSAGE_TEXT', + TABLE_NAME: 'TABLE_NAME', + SCHEMA_NAME: 'SCHEMA_NAME', }; const mapped = stringMap[kind]; return mapped ? this.keyword(mapped) : ''; } switch (kind) { - case DiagItemKind.PLPGSQL_GETDIAG_ROW_COUNT: - return this.keyword('ROW_COUNT'); - case DiagItemKind.PLPGSQL_GETDIAG_CONTEXT: - return this.keyword('PG_CONTEXT'); - case DiagItemKind.PLPGSQL_GETDIAG_ERROR_CONTEXT: - return this.keyword('PG_EXCEPTION_CONTEXT'); - case DiagItemKind.PLPGSQL_GETDIAG_ERROR_DETAIL: - return this.keyword('PG_EXCEPTION_DETAIL'); - case DiagItemKind.PLPGSQL_GETDIAG_ERROR_HINT: - return this.keyword('PG_EXCEPTION_HINT'); - case DiagItemKind.PLPGSQL_GETDIAG_RETURNED_SQLSTATE: - return this.keyword('RETURNED_SQLSTATE'); - case DiagItemKind.PLPGSQL_GETDIAG_COLUMN_NAME: - return this.keyword('COLUMN_NAME'); - case DiagItemKind.PLPGSQL_GETDIAG_CONSTRAINT_NAME: - return this.keyword('CONSTRAINT_NAME'); - case DiagItemKind.PLPGSQL_GETDIAG_DATATYPE_NAME: - return this.keyword('PG_DATATYPE_NAME'); - case DiagItemKind.PLPGSQL_GETDIAG_MESSAGE_TEXT: - return this.keyword('MESSAGE_TEXT'); - case DiagItemKind.PLPGSQL_GETDIAG_TABLE_NAME: - return this.keyword('TABLE_NAME'); - case DiagItemKind.PLPGSQL_GETDIAG_SCHEMA_NAME: - return this.keyword('SCHEMA_NAME'); - default: - return ''; + case DiagItemKind.PLPGSQL_GETDIAG_ROW_COUNT: + return this.keyword('ROW_COUNT'); + case DiagItemKind.PLPGSQL_GETDIAG_CONTEXT: + return this.keyword('PG_CONTEXT'); + case DiagItemKind.PLPGSQL_GETDIAG_ERROR_CONTEXT: + return this.keyword('PG_EXCEPTION_CONTEXT'); + case DiagItemKind.PLPGSQL_GETDIAG_ERROR_DETAIL: + return this.keyword('PG_EXCEPTION_DETAIL'); + case DiagItemKind.PLPGSQL_GETDIAG_ERROR_HINT: + return this.keyword('PG_EXCEPTION_HINT'); + case DiagItemKind.PLPGSQL_GETDIAG_RETURNED_SQLSTATE: + return this.keyword('RETURNED_SQLSTATE'); + case DiagItemKind.PLPGSQL_GETDIAG_COLUMN_NAME: + return this.keyword('COLUMN_NAME'); + case DiagItemKind.PLPGSQL_GETDIAG_CONSTRAINT_NAME: + return this.keyword('CONSTRAINT_NAME'); + case DiagItemKind.PLPGSQL_GETDIAG_DATATYPE_NAME: + return this.keyword('PG_DATATYPE_NAME'); + case DiagItemKind.PLPGSQL_GETDIAG_MESSAGE_TEXT: + return this.keyword('MESSAGE_TEXT'); + case DiagItemKind.PLPGSQL_GETDIAG_TABLE_NAME: + return this.keyword('TABLE_NAME'); + case DiagItemKind.PLPGSQL_GETDIAG_SCHEMA_NAME: + return this.keyword('SCHEMA_NAME'); + default: + return ''; } } @@ -2339,36 +2338,36 @@ export class PLpgSQLDeparser { if (direction === undefined) return ''; switch (direction) { - case FetchDirection.FETCH_FORWARD: - if (expr) { - return `${this.keyword('FORWARD')} ${this.deparseExpr(expr)}`; - } - if (howMany === 1) return ''; - if (howMany === 2147483647) return this.keyword('ALL'); // FETCH_ALL - return `${this.keyword('FORWARD')} ${howMany}`; - case FetchDirection.FETCH_BACKWARD: - if (expr) { - return `${this.keyword('BACKWARD')} ${this.deparseExpr(expr)}`; - } - if (howMany === 1) return this.keyword('PRIOR'); - if (howMany === 2147483647) return `${this.keyword('BACKWARD')} ${this.keyword('ALL')}`; // FETCH_ALL - return `${this.keyword('BACKWARD')} ${howMany}`; - case FetchDirection.FETCH_ABSOLUTE: - if (expr) { - return `${this.keyword('ABSOLUTE')} ${this.deparseExpr(expr)}`; - } - // FIRST/LAST are stored as ABSOLUTE 1 / ABSOLUTE -1 with no expr; - // an explicit ABSOLUTE n always carries an expr. - if (howMany === 1) return this.keyword('FIRST'); - if (howMany === -1) return this.keyword('LAST'); - return `${this.keyword('ABSOLUTE')} ${howMany}`; - case FetchDirection.FETCH_RELATIVE: - if (expr) { - return `${this.keyword('RELATIVE')} ${this.deparseExpr(expr)}`; - } - return `${this.keyword('RELATIVE')} ${howMany}`; - default: - return ''; + case FetchDirection.FETCH_FORWARD: + if (expr) { + return `${this.keyword('FORWARD')} ${this.deparseExpr(expr)}`; + } + if (howMany === 1) return ''; + if (howMany === 2147483647) return this.keyword('ALL'); // FETCH_ALL + return `${this.keyword('FORWARD')} ${howMany}`; + case FetchDirection.FETCH_BACKWARD: + if (expr) { + return `${this.keyword('BACKWARD')} ${this.deparseExpr(expr)}`; + } + if (howMany === 1) return this.keyword('PRIOR'); + if (howMany === 2147483647) return `${this.keyword('BACKWARD')} ${this.keyword('ALL')}`; // FETCH_ALL + return `${this.keyword('BACKWARD')} ${howMany}`; + case FetchDirection.FETCH_ABSOLUTE: + if (expr) { + return `${this.keyword('ABSOLUTE')} ${this.deparseExpr(expr)}`; + } + // FIRST/LAST are stored as ABSOLUTE 1 / ABSOLUTE -1 with no expr; + // an explicit ABSOLUTE n always carries an expr. + if (howMany === 1) return this.keyword('FIRST'); + if (howMany === -1) return this.keyword('LAST'); + return `${this.keyword('ABSOLUTE')} ${howMany}`; + case FetchDirection.FETCH_RELATIVE: + if (expr) { + return `${this.keyword('RELATIVE')} ${this.deparseExpr(expr)}`; + } + return `${this.keyword('RELATIVE')} ${howMany}`; + default: + return ''; } } diff --git a/packages/plpgsql-deparser/test-utils/PlpgsqlPrettyTest.ts b/packages/plpgsql-deparser/test-utils/PlpgsqlPrettyTest.ts index 45691a49..a5b73a11 100644 --- a/packages/plpgsql-deparser/test-utils/PlpgsqlPrettyTest.ts +++ b/packages/plpgsql-deparser/test-utils/PlpgsqlPrettyTest.ts @@ -1,8 +1,9 @@ -import { parsePlPgSQLSync, loadModule } from 'libpg-query'; -import { deparseSync, PLpgSQLParseResult } from '../src'; import * as fs from 'fs'; +import { loadModule,parsePlPgSQLSync } from 'libpg-query'; import * as path from 'path'; +import { deparseSync, PLpgSQLParseResult } from '../src'; + export class PlpgsqlPrettyTest { private testCases: string[]; private fixturesDir: string; diff --git a/packages/plpgsql-deparser/test-utils/index.ts b/packages/plpgsql-deparser/test-utils/index.ts index 25916620..c66b106b 100644 --- a/packages/plpgsql-deparser/test-utils/index.ts +++ b/packages/plpgsql-deparser/test-utils/index.ts @@ -1,8 +1,9 @@ +import { existsSync,readdirSync, readFileSync } from 'fs'; +import { diff } from 'jest-diff'; import { parsePlPgSQL, parsePlPgSQLSync, parseSync } from 'libpg-query'; -import { deparseSync, PLpgSQLParseResult, ReturnInfo } from '../src'; -import { readFileSync, readdirSync, existsSync } from 'fs'; import * as path from 'path'; -import { diff } from 'jest-diff'; + +import { deparseSync, PLpgSQLParseResult, ReturnInfo } from '../src'; const PLPGSQL_FIXTURES_DIR = path.join(__dirname, '../../../__fixtures__/plpgsql'); const GENERATED_JSON = path.join(__dirname, '../../../__fixtures__/plpgsql-generated/generated.json'); @@ -210,12 +211,12 @@ export const transform = (obj: any, props: any): any => { if (obj instanceof Object || typeof obj === 'object') { copy = {}; for (const attr in obj) { - if (obj.hasOwnProperty(attr)) { + if (Object.prototype.hasOwnProperty.call(obj, attr)) { let value: any; - if (props.hasOwnProperty(attr)) { + if (Object.prototype.hasOwnProperty.call(props, attr)) { if (typeof props[attr] === 'function') { value = props[attr](obj[attr]); - } else if (props[attr].hasOwnProperty(obj[attr])) { + } else if (Object.prototype.hasOwnProperty.call(props[attr], obj[attr])) { value = props[attr][obj[attr]]; } else { value = transform(obj[attr], props); @@ -310,18 +311,18 @@ function createParseError( function getErrorMessage(type: ParseErrorType): string { switch (type) { - case 'PARSE_FAILED': - return 'PL/pgSQL parse failed'; - case 'DEPARSE_FAILED': - return 'PL/pgSQL deparse failed'; - case 'RECONSTRUCT_FAILED': - return 'Failed to reconstruct SQL statement'; - case 'REPARSE_FAILED': - return 'Reparse of reconstructed SQL failed'; - case 'AST_MISMATCH': - return 'AST mismatch after parse/deparse cycle'; - case 'UNEXPECTED_ERROR': - return 'Unexpected error during parse/deparse cycle'; + case 'PARSE_FAILED': + return 'PL/pgSQL parse failed'; + case 'DEPARSE_FAILED': + return 'PL/pgSQL deparse failed'; + case 'RECONSTRUCT_FAILED': + return 'Failed to reconstruct SQL statement'; + case 'REPARSE_FAILED': + return 'Reparse of reconstructed SQL failed'; + case 'AST_MISMATCH': + return 'AST mismatch after parse/deparse cycle'; + case 'UNEXPECTED_ERROR': + return 'Unexpected error during parse/deparse cycle'; } } diff --git a/packages/plpgsql-parse/__tests__/parse.test.ts b/packages/plpgsql-parse/__tests__/parse.test.ts index 6c37ac3f..508580b8 100644 --- a/packages/plpgsql-parse/__tests__/parse.test.ts +++ b/packages/plpgsql-parse/__tests__/parse.test.ts @@ -1,6 +1,7 @@ import { loadModule } from 'libpg-query'; +import { isRawComment, isRawStmt } from 'pgsql-parse'; + import { parseSync } from '../src/parse'; -import { isRawComment, isRawWhitespace, isRawStmt } from 'pgsql-parse'; beforeAll(async () => { await loadModule(); diff --git a/packages/plpgsql-parse/__tests__/roundtrip.test.ts b/packages/plpgsql-parse/__tests__/roundtrip.test.ts index dccd6955..b8b0ff25 100644 --- a/packages/plpgsql-parse/__tests__/roundtrip.test.ts +++ b/packages/plpgsql-parse/__tests__/roundtrip.test.ts @@ -1,9 +1,10 @@ +import { readdirSync,readFileSync } from 'fs'; import { loadModule } from 'libpg-query'; -import { parseSync } from '../src/parse'; -import { deparseSync } from '../src/deparse'; -import { readFileSync, readdirSync } from 'fs'; import * as path from 'path'; +import { deparseSync } from '../src/deparse'; +import { parseSync } from '../src/parse'; + const FIXTURES_DIR = path.join(__dirname, 'fixtures'); beforeAll(async () => { diff --git a/packages/plpgsql-parse/__tests__/scanner.test.ts b/packages/plpgsql-parse/__tests__/scanner.test.ts index 8044a06e..d84e3b9c 100644 --- a/packages/plpgsql-parse/__tests__/scanner.test.ts +++ b/packages/plpgsql-parse/__tests__/scanner.test.ts @@ -1,4 +1,4 @@ -import { scanBodyComments, groupCommentsByAnchor } from '../src/body-scanner'; +import { groupCommentsByAnchor,scanBodyComments } from '../src/body-scanner'; describe('scanBodyComments', () => { it('should extract standalone comment lines', () => { diff --git a/packages/plpgsql-parse/jest.config.js b/packages/plpgsql-parse/jest.config.js index 0aa3aaa4..057a9420 100644 --- a/packages/plpgsql-parse/jest.config.js +++ b/packages/plpgsql-parse/jest.config.js @@ -1,18 +1,18 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", - transform: { - "^.+\\.tsx?$": [ - "ts-jest", - { - babelConfig: false, - tsconfig: "tsconfig.json", - }, - ], - }, - transformIgnorePatterns: [`/node_modules/*`], - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - modulePathIgnorePatterns: ["dist/*"] + preset: 'ts-jest', + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + babelConfig: false, + tsconfig: 'tsconfig.json', + }, + ], + }, + transformIgnorePatterns: [`/node_modules/*`], + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + modulePathIgnorePatterns: ['dist/*'] }; diff --git a/packages/plpgsql-parse/src/deparse.ts b/packages/plpgsql-parse/src/deparse.ts index de0dc08a..b3879bb4 100644 --- a/packages/plpgsql-parse/src/deparse.ts +++ b/packages/plpgsql-parse/src/deparse.ts @@ -9,26 +9,22 @@ import { parsePlPgSQLSync, - parseSync as parseSqlSync, } from 'libpg-query'; -import type { ParseResult } from 'libpg-query'; +import { Deparser } from 'pgsql-deparser'; import { - deparseEnhanced, isRawComment, - isRawWhitespace, isRawStmt, - type EnhancedParseResult, + isRawWhitespace, } from 'pgsql-parse'; -import { Deparser } from 'pgsql-deparser'; import { - hydratePlpgsqlAst, dehydratePlpgsqlAst, deparseFunctionSync, + hydratePlpgsqlAst, type PLpgSQLParseResult, } from 'plpgsql-deparser'; -import { getReturnInfoFromParsedFunction } from './return-info'; -import { scanBodyComments, groupCommentsByAnchor } from './body-scanner'; -import type { PlpgsqlParseResult, FunctionComments, BodyComment } from './types'; + +import { groupCommentsByAnchor } from './body-scanner'; +import type { BodyComment,FunctionComments, PlpgsqlParseResult } from './types'; export interface DeparseOptions { pretty?: boolean; diff --git a/packages/plpgsql-parse/src/index.ts b/packages/plpgsql-parse/src/index.ts index 11e3a989..d970b2f4 100644 --- a/packages/plpgsql-parse/src/index.ts +++ b/packages/plpgsql-parse/src/index.ts @@ -11,21 +11,21 @@ */ // Enhanced parse functions (comment/whitespace preserving) -export { parse, parseSync, loadModule } from './parse'; +export { loadModule,parse, parseSync } from './parse'; // Enhanced deparse functions -export { deparse, deparseSync, type DeparseOptions } from './deparse'; +export { deparse, type DeparseOptions,deparseSync } from './deparse'; // Types export type { - PlpgsqlParseResult, - FunctionComments, BodyComment, + FunctionComments, + PlpgsqlParseResult, } from './types'; // Body scanner (for advanced use) -export { scanBodyComments, groupCommentsByAnchor, type CommentGroup } from './body-scanner'; +export { type CommentGroup,groupCommentsByAnchor, scanBodyComments } from './body-scanner'; // Re-export pgsql-parse types for convenience export type { EnhancedParseResult, EnhancedStmt, RawComment, RawWhitespace } from 'pgsql-parse'; -export { isRawComment, isRawWhitespace, isRawStmt } from 'pgsql-parse'; +export { isRawComment, isRawStmt,isRawWhitespace } from 'pgsql-parse'; diff --git a/packages/plpgsql-parse/src/parse.ts b/packages/plpgsql-parse/src/parse.ts index a558969b..f047147a 100644 --- a/packages/plpgsql-parse/src/parse.ts +++ b/packages/plpgsql-parse/src/parse.ts @@ -7,20 +7,16 @@ * composes them and adds body-comment metadata on top. */ +import type { ParseResult } from 'libpg-query'; import { - parseSync as parseSqlSync, - parsePlPgSQLSync, loadModule, + parseSync as parseSqlSync, } from 'libpg-query'; -import type { ParseResult } from 'libpg-query'; +import type { EnhancedParseResult } from 'pgsql-parse'; import { parseSync as pgsqlParseSync } from 'pgsql-parse'; -import type { EnhancedParseResult, EnhancedStmt } from 'pgsql-parse'; -import { - hydratePlpgsqlAst, - type PLpgSQLParseResult, -} from 'plpgsql-deparser'; + import { scanBodyComments } from './body-scanner'; -import type { PlpgsqlParseResult, FunctionComments } from './types'; +import type { FunctionComments,PlpgsqlParseResult } from './types'; export { loadModule }; diff --git a/packages/plpgsql-parser/__tests__/plpgsql-parser.test.ts b/packages/plpgsql-parser/__tests__/plpgsql-parser.test.ts index dcdb46dd..be6abee9 100644 --- a/packages/plpgsql-parser/__tests__/plpgsql-parser.test.ts +++ b/packages/plpgsql-parser/__tests__/plpgsql-parser.test.ts @@ -1,4 +1,4 @@ -import { parse, transformSync, deparseSync, loadModule } from '../src'; +import { deparseSync, loadModule,parse, transformSync } from '../src'; beforeAll(async () => { await loadModule(); diff --git a/packages/plpgsql-parser/__tests__/return-info.test.ts b/packages/plpgsql-parser/__tests__/return-info.test.ts index 48f93f2b..23bccbe2 100644 --- a/packages/plpgsql-parser/__tests__/return-info.test.ts +++ b/packages/plpgsql-parser/__tests__/return-info.test.ts @@ -1,4 +1,5 @@ import { loadModule, parseSync } from 'libpg-query'; + import { getReturnInfo, getReturnInfoFromParsedFunction } from '../src/return-info'; describe('getReturnInfo', () => { diff --git a/packages/plpgsql-parser/__tests__/round-trip.test.ts b/packages/plpgsql-parser/__tests__/round-trip.test.ts index a5dad42a..5436977f 100644 --- a/packages/plpgsql-parser/__tests__/round-trip.test.ts +++ b/packages/plpgsql-parser/__tests__/round-trip.test.ts @@ -1,8 +1,8 @@ -import { parse, deparseSync, loadModule } from '../src'; -import { parseSync } from 'libpg-query'; -import { readFileSync, existsSync } from 'fs'; +import { existsSync,readFileSync } from 'fs'; import * as path from 'path'; +import { deparseSync, loadModule,parse } from '../src'; + const FIXTURES_DIR = path.join(__dirname, '../../../__fixtures__/plpgsql'); const GENERATED_JSON = path.join(__dirname, '../../../__fixtures__/plpgsql-generated/generated.json'); @@ -31,12 +31,12 @@ const transform = (obj: any, props: any): any => { if (obj instanceof Object || typeof obj === 'object') { copy = {}; for (const attr in obj) { - if (obj.hasOwnProperty(attr)) { + if (Object.prototype.hasOwnProperty.call(obj, attr)) { let value: any; - if (props.hasOwnProperty(attr)) { + if (Object.prototype.hasOwnProperty.call(props, attr)) { if (typeof props[attr] === 'function') { value = props[attr](obj[attr]); - } else if (props[attr].hasOwnProperty(obj[attr])) { + } else if (Object.prototype.hasOwnProperty.call(props[attr], obj[attr])) { value = props[attr][obj[attr]]; } else { value = transform(obj[attr], props); diff --git a/packages/plpgsql-parser/__tests__/traverse.test.ts b/packages/plpgsql-parser/__tests__/traverse.test.ts index 272d3a1b..844cda8e 100644 --- a/packages/plpgsql-parser/__tests__/traverse.test.ts +++ b/packages/plpgsql-parser/__tests__/traverse.test.ts @@ -1,5 +1,5 @@ -import { loadModule,parse, PlpgsqlNodePath, walk } from '../src'; import type { PlpgsqlVisitor } from '../src'; +import { loadModule,parse, PlpgsqlNodePath, walk } from '../src'; describe('plpgsql-parser traverse', () => { beforeAll(async () => { diff --git a/packages/plpgsql-parser/jest.config.js b/packages/plpgsql-parser/jest.config.js index 0aa3aaa4..057a9420 100644 --- a/packages/plpgsql-parser/jest.config.js +++ b/packages/plpgsql-parser/jest.config.js @@ -1,18 +1,18 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", - transform: { - "^.+\\.tsx?$": [ - "ts-jest", - { - babelConfig: false, - tsconfig: "tsconfig.json", - }, - ], - }, - transformIgnorePatterns: [`/node_modules/*`], - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - modulePathIgnorePatterns: ["dist/*"] + preset: 'ts-jest', + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + babelConfig: false, + tsconfig: 'tsconfig.json', + }, + ], + }, + transformIgnorePatterns: [`/node_modules/*`], + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + modulePathIgnorePatterns: ['dist/*'] }; diff --git a/packages/plpgsql-parser/src/deparse.ts b/packages/plpgsql-parser/src/deparse.ts index f7a691f8..317a34a6 100644 --- a/packages/plpgsql-parser/src/deparse.ts +++ b/packages/plpgsql-parser/src/deparse.ts @@ -1,16 +1,14 @@ import { deparse as deparseSql } from 'pgsql-deparser'; import { dehydratePlpgsqlAst, - deparseSync as deparsePlpgsql, - deparseFunctionSync as deparsePlpgsqlFunction -} from 'plpgsql-deparser'; + deparseFunctionSync as deparsePlpgsqlFunction} from 'plpgsql-deparser'; + +import { getReturnInfoFromParsedFunction } from './return-info'; import type { - ParsedScript, - TransformContext, DeparseOptions, - ParsedFunction -} from './types'; -import { getReturnInfoFromParsedFunction } from './return-info'; + ParsedFunction, + ParsedScript, + TransformContext} from './types'; function stitchBodyIntoSqlAst( sqlAst: any, diff --git a/packages/plpgsql-parser/src/index.ts b/packages/plpgsql-parser/src/index.ts index 00c34221..4d0a2a46 100644 --- a/packages/plpgsql-parser/src/index.ts +++ b/packages/plpgsql-parser/src/index.ts @@ -1,11 +1,12 @@ -export * from './types'; -export { parse, parseSync, loadModule } from './parse'; export { deparse, deparseSync } from './deparse'; +export { loadModule,parse, parseSync } from './parse'; export { transform, transformSync } from './transform'; export { walkSql, type WalkSqlOptions } from './traverse'; +export * from './types'; // The walkers live in @pgsql/traverse; re-exported here so a single import // covers parsing and traversal. +export { getReturnInfo, getReturnInfoFromParsedFunction } from './return-info'; export { PlpgsqlNodePath, type PlpgsqlNodeTag, @@ -23,21 +24,16 @@ export { walkSqlAst, WRITE_STATEMENTS } from '@pgsql/traverse'; -export { getReturnInfo, getReturnInfoFromParsedFunction } from './return-info'; - export { - hydratePlpgsqlAst, + parsePlPgSQLSync as parsePlpgsqlBody, + parseSync as parseSql} from 'libpg-query'; +export { Deparser,deparse as deparseSql } from 'pgsql-deparser'; +export { dehydratePlpgsqlAst, deparseSync as deparsePlpgsqlBody, - isHydratedExpr, getOriginalQuery, + hydratePlpgsqlAst, + isHydratedExpr, ReturnInfo, ReturnInfoKind } from 'plpgsql-deparser'; - -export { deparse as deparseSql, Deparser } from 'pgsql-deparser'; - -export { - parseSync as parseSql, - parsePlPgSQLSync as parsePlpgsqlBody -} from 'libpg-query'; diff --git a/packages/plpgsql-parser/src/parse.ts b/packages/plpgsql-parser/src/parse.ts index a1dca5d7..94970af8 100644 --- a/packages/plpgsql-parser/src/parse.ts +++ b/packages/plpgsql-parser/src/parse.ts @@ -1,18 +1,18 @@ +import type { ParseResult } from 'libpg-query'; import { - parseSync as parseSqlSync, + loadModule, parsePlPgSQLSync, - loadModule -} from 'libpg-query'; -import type { ParseResult } from 'libpg-query'; + parseSync as parseSqlSync} from 'libpg-query'; import { hydratePlpgsqlAst, PLpgSQLParseResult } from 'plpgsql-deparser'; + import type { - ParsedScript, ParsedFunction, - ParsedStatement, ParsedItem, + ParsedScript, + ParsedStatement, ParseOptions } from './types'; diff --git a/packages/plpgsql-parser/src/transform.ts b/packages/plpgsql-parser/src/transform.ts index 20e0c2c6..123ed95e 100644 --- a/packages/plpgsql-parser/src/transform.ts +++ b/packages/plpgsql-parser/src/transform.ts @@ -1,14 +1,13 @@ -import { parse } from './parse'; import { deparse, deparseSync } from './deparse'; +import { parse } from './parse'; import type { - TransformOptions, + ParsedFunction, + ParsedStatement, + TransformCallback, TransformContext, TransformInput, - TransformCallback, - TransformVisitors, - ParsedFunction, - ParsedStatement -} from './types'; + TransformOptions, + TransformVisitors} from './types'; function isCallback(input: TransformInput): input is TransformCallback { return typeof input === 'function'; diff --git a/packages/plpgsql-parser/src/types.ts b/packages/plpgsql-parser/src/types.ts index 63afac93..e6f4da7d 100644 --- a/packages/plpgsql-parser/src/types.ts +++ b/packages/plpgsql-parser/src/types.ts @@ -1,9 +1,8 @@ import type { ParseResult } from 'libpg-query'; import type { - PLpgSQLParseResult, + HydrationError, HydrationStats, - HydrationError -} from 'plpgsql-deparser'; + PLpgSQLParseResult} from 'plpgsql-deparser'; export interface PlpgsqlFunctionBody { raw: string; diff --git a/packages/proto-parser/__tests__/enums.test.ts b/packages/proto-parser/__tests__/enums.test.ts index 3f7e279f..5f7a3241 100644 --- a/packages/proto-parser/__tests__/enums.test.ts +++ b/packages/proto-parser/__tests__/enums.test.ts @@ -9,7 +9,7 @@ describe('pure', () => { removeUndefinedAt0: false } }); - }) + }); it('removeAt0', () => { parseAndSnap('enums/pure/removeUndef', { @@ -19,8 +19,8 @@ describe('pure', () => { removeUndefinedAt0: true } }); - }) -}) + }); +}); describe('typeUnion', () => { it('enums', () => { @@ -31,7 +31,7 @@ describe('typeUnion', () => { removeUndefinedAt0: false } }); - }) + }); it('removeAt0', () => { parseAndSnap('enums/typeUnion/removeUndef', { enums: { @@ -40,7 +40,7 @@ describe('typeUnion', () => { removeUndefinedAt0: true } }); - }) -}) + }); +}); diff --git a/packages/proto-parser/__tests__/meta.test.ts b/packages/proto-parser/__tests__/meta.test.ts index 762cf724..52a85334 100644 --- a/packages/proto-parser/__tests__/meta.test.ts +++ b/packages/proto-parser/__tests__/meta.test.ts @@ -1,439 +1,440 @@ -import * as t from '../test-utils/meta'; +import generate from '@babel/generator'; import { SelectStmt } from '@pgsql/types'; -import { generateTsAstCodeFromPgAst } from '../src/utils' + +import { generateTsAstCodeFromPgAst } from '../src/utils'; +import * as t from '../test-utils/meta'; import { runtimeSchema } from '../test-utils/meta/runtime-schema'; -import generate from '@babel/generator'; it('AST to AST to create AST — meta 🤯', () => { - const selectStmt = t.nodes.selectStmt({ - targetList: [ - t.nodes.resTarget({ - val: t.nodes.columnRef({ - fields: [t.nodes.aStar()] - }) - }) - ], - fromClause: [ - t.nodes.rangeVar({ - relname: 'some_amazing_table', - inh: true, - relpersistence: 'p' - }) - ], - limitOption: 'LIMIT_OPTION_DEFAULT', - op: 'SETOP_NONE' - }); + const selectStmt = t.nodes.selectStmt({ + targetList: [ + t.nodes.resTarget({ + val: t.nodes.columnRef({ + fields: [t.nodes.aStar()] + }) + }) + ], + fromClause: [ + t.nodes.rangeVar({ + relname: 'some_amazing_table', + inh: true, + relpersistence: 'p' + }) + ], + limitOption: 'LIMIT_OPTION_DEFAULT', + op: 'SETOP_NONE' + }); - const astForAst = generateTsAstCodeFromPgAst(selectStmt, runtimeSchema); - expect(generate(astForAst).code).toMatchSnapshot(); + const astForAst = generateTsAstCodeFromPgAst(selectStmt, runtimeSchema); + expect(generate(astForAst).code).toMatchSnapshot(); }); it('Complex AST — Advanced SQL with CTEs, Window Functions, Joins, and Subqueries', () => { - const complexSelectStmt: { SelectStmt: SelectStmt } = t.nodes.selectStmt({ - // WITH clause for CTEs - withClause: t.ast.withClause({ - ctes: [ - // First CTE: Sales summary - t.nodes.commonTableExpr({ - ctename: 'sales_summary', - ctequery: t.nodes.selectStmt({ - targetList: [ - t.nodes.resTarget({ - name: 'customer_id', - val: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'customer_id' })] - }) - }), - t.nodes.resTarget({ - name: 'total_sales', - val: t.nodes.funcCall({ - funcname: [t.nodes.string({ sval: 'sum' })], - args: [ - t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'amount' })] - }) - ] - }) - }), - t.nodes.resTarget({ - name: 'avg_order_value', - val: t.nodes.funcCall({ - funcname: [t.nodes.string({ sval: 'avg' })], - args: [ - t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'amount' })] - }) - ] - }) + const complexSelectStmt: { SelectStmt: SelectStmt } = t.nodes.selectStmt({ + // WITH clause for CTEs + withClause: t.ast.withClause({ + ctes: [ + // First CTE: Sales summary + t.nodes.commonTableExpr({ + ctename: 'sales_summary', + ctequery: t.nodes.selectStmt({ + targetList: [ + t.nodes.resTarget({ + name: 'customer_id', + val: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'customer_id' })] }) - ], - fromClause: [ - t.nodes.rangeVar({ - relname: 'orders', - inh: true, - relpersistence: 'p' + }), + t.nodes.resTarget({ + name: 'total_sales', + val: t.nodes.funcCall({ + funcname: [t.nodes.string({ sval: 'sum' })], + args: [ + t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'amount' })] + }) + ] }) - ], - whereClause: t.nodes.aExpr({ - kind: 'AEXPR_OP', - name: [t.nodes.string({ sval: '>=' })], - lexpr: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'order_date' })] - }), - rexpr: t.nodes.aConst({ - sval: t.ast.string({ sval: '2023-01-01' }) + }), + t.nodes.resTarget({ + name: 'avg_order_value', + val: t.nodes.funcCall({ + funcname: [t.nodes.string({ sval: 'avg' })], + args: [ + t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'amount' })] + }) + ] }) + }) + ], + fromClause: [ + t.nodes.rangeVar({ + relname: 'orders', + inh: true, + relpersistence: 'p' + }) + ], + whereClause: t.nodes.aExpr({ + kind: 'AEXPR_OP', + name: [t.nodes.string({ sval: '>=' })], + lexpr: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'order_date' })] }), - groupClause: [ - t.nodes.columnRef({ + rexpr: t.nodes.aConst({ + sval: t.ast.string({ sval: '2023-01-01' }) + }) + }), + groupClause: [ + t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'customer_id' })] + }) + ], + limitOption: 'LIMIT_OPTION_DEFAULT', + op: 'SETOP_NONE' + }) + }), + t.nodes.commonTableExpr({ + ctename: 'customer_rankings', + ctequery: t.nodes.selectStmt({ + targetList: [ + t.nodes.resTarget({ + name: 'customer_id', + val: t.nodes.columnRef({ fields: [t.nodes.string({ sval: 'customer_id' })] }) - ], - limitOption: 'LIMIT_OPTION_DEFAULT', - op: 'SETOP_NONE' - }) - }), - t.nodes.commonTableExpr({ - ctename: 'customer_rankings', - ctequery: t.nodes.selectStmt({ - targetList: [ - t.nodes.resTarget({ - name: 'customer_id', - val: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'customer_id' })] - }) - }), - t.nodes.resTarget({ - name: 'total_sales', - val: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'total_sales' })] - }) - }), - t.nodes.resTarget({ - name: 'sales_rank', - val: t.nodes.windowFunc({ - winfnoid: 3133, // ROW_NUMBER function OID - wintype: 20, // INT8 type - args: [], - winref: 1, - winstar: false, - winagg: false - }) - }), - t.nodes.resTarget({ - name: 'sales_percentile', - val: t.nodes.windowFunc({ - winfnoid: 3974, // PERCENT_RANK function OID - wintype: 701, // FLOAT8 type - args: [], - winref: 2, - winstar: false, - winagg: false - }) + }), + t.nodes.resTarget({ + name: 'total_sales', + val: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'total_sales' })] }) - ], - fromClause: [ - t.nodes.rangeVar({ - relname: 'sales_summary', - inh: true, - relpersistence: 'p' + }), + t.nodes.resTarget({ + name: 'sales_rank', + val: t.nodes.windowFunc({ + winfnoid: 3133, // ROW_NUMBER function OID + wintype: 20, // INT8 type + args: [], + winref: 1, + winstar: false, + winagg: false }) - ], - windowClause: [ - t.nodes.windowDef({ - name: 'sales_window', - orderClause: [ - t.nodes.sortBy({ - node: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'total_sales' })] - }), - sortby_dir: 'SORTBY_DESC', - sortby_nulls: 'SORTBY_NULLS_DEFAULT' - }) - ] + }), + t.nodes.resTarget({ + name: 'sales_percentile', + val: t.nodes.windowFunc({ + winfnoid: 3974, // PERCENT_RANK function OID + wintype: 701, // FLOAT8 type + args: [], + winref: 2, + winstar: false, + winagg: false }) - ], - limitOption: 'LIMIT_OPTION_DEFAULT', - op: 'SETOP_NONE' - }) + }) + ], + fromClause: [ + t.nodes.rangeVar({ + relname: 'sales_summary', + inh: true, + relpersistence: 'p' + }) + ], + windowClause: [ + t.nodes.windowDef({ + name: 'sales_window', + orderClause: [ + t.nodes.sortBy({ + node: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'total_sales' })] + }), + sortby_dir: 'SORTBY_DESC', + sortby_nulls: 'SORTBY_NULLS_DEFAULT' + }) + ] + }) + ], + limitOption: 'LIMIT_OPTION_DEFAULT', + op: 'SETOP_NONE' }) - ], - recursive: false - }), + }) + ], + recursive: false + }), - // Main SELECT target list with complex expressions - targetList: [ - t.nodes.resTarget({ - name: 'customer_name', - val: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'c' }), t.nodes.string({ sval: 'name' })] - }) - }), - t.nodes.resTarget({ - name: 'total_sales', - val: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'total_sales' })] - }) - }), - t.nodes.resTarget({ - name: 'sales_rank', - val: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'sales_rank' })] - }) - }), - t.nodes.resTarget({ - name: 'customer_tier', - val: t.nodes.caseExpr({ - args: [ - t.nodes.caseWhen({ - expr: t.nodes.aExpr({ - kind: 'AEXPR_OP', - name: [t.nodes.string({ sval: '<=' })], - lexpr: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'sales_rank' })] - }), - rexpr: t.nodes.aConst({ - ival: t.ast.integer({ ival: 10 }) - }) + // Main SELECT target list with complex expressions + targetList: [ + t.nodes.resTarget({ + name: 'customer_name', + val: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'c' }), t.nodes.string({ sval: 'name' })] + }) + }), + t.nodes.resTarget({ + name: 'total_sales', + val: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'total_sales' })] + }) + }), + t.nodes.resTarget({ + name: 'sales_rank', + val: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'sales_rank' })] + }) + }), + t.nodes.resTarget({ + name: 'customer_tier', + val: t.nodes.caseExpr({ + args: [ + t.nodes.caseWhen({ + expr: t.nodes.aExpr({ + kind: 'AEXPR_OP', + name: [t.nodes.string({ sval: '<=' })], + lexpr: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'sales_rank' })] }), - result: t.nodes.aConst({ - sval: t.ast.string({ sval: 'Premium' }) + rexpr: t.nodes.aConst({ + ival: t.ast.integer({ ival: 10 }) }) }), - t.nodes.caseWhen({ - expr: t.nodes.aExpr({ - kind: 'AEXPR_OP', - name: [t.nodes.string({ sval: '<=' })], - lexpr: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'sales_rank' })] - }), - rexpr: t.nodes.aConst({ - ival: t.ast.integer({ ival: 50 }) - }) + result: t.nodes.aConst({ + sval: t.ast.string({ sval: 'Premium' }) + }) + }), + t.nodes.caseWhen({ + expr: t.nodes.aExpr({ + kind: 'AEXPR_OP', + name: [t.nodes.string({ sval: '<=' })], + lexpr: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'sales_rank' })] }), - result: t.nodes.aConst({ - sval: t.ast.string({ sval: 'Gold' }) + rexpr: t.nodes.aConst({ + ival: t.ast.integer({ ival: 50 }) }) }), - t.nodes.caseWhen({ - expr: t.nodes.aExpr({ - kind: 'AEXPR_OP', - name: [t.nodes.string({ sval: '<=' })], - lexpr: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'sales_rank' })] - }), - rexpr: t.nodes.aConst({ - ival: t.ast.integer({ ival: 100 }) - }) + result: t.nodes.aConst({ + sval: t.ast.string({ sval: 'Gold' }) + }) + }), + t.nodes.caseWhen({ + expr: t.nodes.aExpr({ + kind: 'AEXPR_OP', + name: [t.nodes.string({ sval: '<=' })], + lexpr: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'sales_rank' })] }), - result: t.nodes.aConst({ - sval: t.ast.string({ sval: 'Silver' }) + rexpr: t.nodes.aConst({ + ival: t.ast.integer({ ival: 100 }) }) + }), + result: t.nodes.aConst({ + sval: t.ast.string({ sval: 'Silver' }) }) - ], - defresult: t.nodes.aConst({ - sval: t.ast.string({ sval: 'Bronze' }) }) + ], + defresult: t.nodes.aConst({ + sval: t.ast.string({ sval: 'Bronze' }) }) - }), - t.nodes.resTarget({ - name: 'recent_order_count', - val: t.nodes.subLink({ - subLinkType: 'EXPR_SUBLINK', - subselect: t.nodes.selectStmt({ - targetList: [ - t.nodes.resTarget({ - val: t.nodes.funcCall({ - funcname: [t.nodes.string({ sval: 'count' })], - args: [t.nodes.aStar()] - }) - }) - ], - fromClause: [ - t.nodes.rangeVar({ - relname: 'orders', - alias: t.ast.alias({ aliasname: 'o2' }), - inh: true, - relpersistence: 'p' + }) + }), + t.nodes.resTarget({ + name: 'recent_order_count', + val: t.nodes.subLink({ + subLinkType: 'EXPR_SUBLINK', + subselect: t.nodes.selectStmt({ + targetList: [ + t.nodes.resTarget({ + val: t.nodes.funcCall({ + funcname: [t.nodes.string({ sval: 'count' })], + args: [t.nodes.aStar()] }) - ], - whereClause: t.nodes.boolExpr({ - boolop: 'AND_EXPR', - args: [ - t.nodes.aExpr({ - kind: 'AEXPR_OP', - name: [t.nodes.string({ sval: '=' })], - lexpr: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'o2' }), t.nodes.string({ sval: 'customer_id' })] - }), - rexpr: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'c' }), t.nodes.string({ sval: 'id' })] - }) + }) + ], + fromClause: [ + t.nodes.rangeVar({ + relname: 'orders', + alias: t.ast.alias({ aliasname: 'o2' }), + inh: true, + relpersistence: 'p' + }) + ], + whereClause: t.nodes.boolExpr({ + boolop: 'AND_EXPR', + args: [ + t.nodes.aExpr({ + kind: 'AEXPR_OP', + name: [t.nodes.string({ sval: '=' })], + lexpr: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'o2' }), t.nodes.string({ sval: 'customer_id' })] }), - t.nodes.aExpr({ - kind: 'AEXPR_OP', - name: [t.nodes.string({ sval: '>=' })], - lexpr: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'o2' }), t.nodes.string({ sval: 'order_date' })] - }), - rexpr: t.nodes.funcCall({ - funcname: [t.nodes.string({ sval: 'current_date' })], - args: [] - }) + rexpr: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'c' }), t.nodes.string({ sval: 'id' })] }) - ] - }), - limitOption: 'LIMIT_OPTION_DEFAULT', - op: 'SETOP_NONE' - }) + }), + t.nodes.aExpr({ + kind: 'AEXPR_OP', + name: [t.nodes.string({ sval: '>=' })], + lexpr: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'o2' }), t.nodes.string({ sval: 'order_date' })] + }), + rexpr: t.nodes.funcCall({ + funcname: [t.nodes.string({ sval: 'current_date' })], + args: [] + }) + }) + ] + }), + limitOption: 'LIMIT_OPTION_DEFAULT', + op: 'SETOP_NONE' }) }) - ], + }) + ], - // Complex FROM clause with joins - fromClause: [ - t.nodes.joinExpr({ - jointype: 'JOIN_INNER', - larg: t.nodes.rangeVar({ - relname: 'customers', - alias: t.ast.alias({ aliasname: 'c' }), - inh: true, - relpersistence: 'p' - }), - rarg: t.nodes.rangeVar({ - relname: 'customer_rankings', - alias: t.ast.alias({ aliasname: 'cr' }), - inh: true, - relpersistence: 'p' + // Complex FROM clause with joins + fromClause: [ + t.nodes.joinExpr({ + jointype: 'JOIN_INNER', + larg: t.nodes.rangeVar({ + relname: 'customers', + alias: t.ast.alias({ aliasname: 'c' }), + inh: true, + relpersistence: 'p' + }), + rarg: t.nodes.rangeVar({ + relname: 'customer_rankings', + alias: t.ast.alias({ aliasname: 'cr' }), + inh: true, + relpersistence: 'p' + }), + quals: t.nodes.aExpr({ + kind: 'AEXPR_OP', + name: [t.nodes.string({ sval: '=' })], + lexpr: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'c' }), t.nodes.string({ sval: 'id' })] }), - quals: t.nodes.aExpr({ - kind: 'AEXPR_OP', - name: [t.nodes.string({ sval: '=' })], - lexpr: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'c' }), t.nodes.string({ sval: 'id' })] - }), - rexpr: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'customer_id' })] - }) + rexpr: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'customer_id' })] }) }) - ], + }) + ], - // WHERE clause with complex conditions - whereClause: t.nodes.boolExpr({ - boolop: 'AND_EXPR', - args: [ - t.nodes.aExpr({ - kind: 'AEXPR_OP', - name: [t.nodes.string({ sval: '>' })], - lexpr: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'total_sales' })] - }), - rexpr: t.nodes.aConst({ - ival: t.ast.integer({ ival: 1000 }) - }) + // WHERE clause with complex conditions + whereClause: t.nodes.boolExpr({ + boolop: 'AND_EXPR', + args: [ + t.nodes.aExpr({ + kind: 'AEXPR_OP', + name: [t.nodes.string({ sval: '>' })], + lexpr: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'total_sales' })] }), - t.nodes.aExpr({ - kind: 'AEXPR_OP', - name: [t.nodes.string({ sval: 'IS NOT' })], - lexpr: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'c' }), t.nodes.string({ sval: 'status' })] - }), - rexpr: t.nodes.aConst({ - sval: t.ast.string({ sval: 'inactive' }) - }) + rexpr: t.nodes.aConst({ + ival: t.ast.integer({ ival: 1000 }) }) - ] - }), - - // ORDER BY clause - sortClause: [ - t.nodes.sortBy({ - node: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'sales_rank' })] + }), + t.nodes.aExpr({ + kind: 'AEXPR_OP', + name: [t.nodes.string({ sval: 'IS NOT' })], + lexpr: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'c' }), t.nodes.string({ sval: 'status' })] }), - sortby_dir: 'SORTBY_ASC', - sortby_nulls: 'SORTBY_NULLS_DEFAULT' + rexpr: t.nodes.aConst({ + sval: t.ast.string({ sval: 'inactive' }) + }) }) - ], + ] + }), - // LIMIT clause - limitCount: t.nodes.aConst({ - ival: t.ast.integer({ ival: 50 }) - }), + // ORDER BY clause + sortClause: [ + t.nodes.sortBy({ + node: t.nodes.columnRef({ + fields: [t.nodes.string({ sval: 'cr' }), t.nodes.string({ sval: 'sales_rank' })] + }), + sortby_dir: 'SORTBY_ASC', + sortby_nulls: 'SORTBY_NULLS_DEFAULT' + }) + ], + + // LIMIT clause + limitCount: t.nodes.aConst({ + ival: t.ast.integer({ ival: 50 }) + }), - limitOption: 'LIMIT_OPTION_COUNT', - op: 'SETOP_NONE' - }); + limitOption: 'LIMIT_OPTION_COUNT', + op: 'SETOP_NONE' + }); - const astForComplexAst = generateTsAstCodeFromPgAst(complexSelectStmt, runtimeSchema); - expect(generate(astForComplexAst).code).toMatchSnapshot(); + const astForComplexAst = generateTsAstCodeFromPgAst(complexSelectStmt, runtimeSchema); + expect(generate(astForComplexAst).code).toMatchSnapshot(); }); it('Enhanced AST generation with runtime schema — wrapped vs unwrapped nodes', () => { - const selectStmt = t.nodes.selectStmt({ - targetList: [ - t.nodes.resTarget({ - val: t.nodes.columnRef({ - fields: [t.nodes.aStar()] - }) - }) - ], - fromClause: [ - t.nodes.rangeVar({ - relname: 'test_table', - inh: true, - relpersistence: 'p' - }) - ], - limitOption: 'LIMIT_OPTION_DEFAULT', - op: 'SETOP_NONE' - }); + const selectStmt = t.nodes.selectStmt({ + targetList: [ + t.nodes.resTarget({ + val: t.nodes.columnRef({ + fields: [t.nodes.aStar()] + }) + }) + ], + fromClause: [ + t.nodes.rangeVar({ + relname: 'test_table', + inh: true, + relpersistence: 'p' + }) + ], + limitOption: 'LIMIT_OPTION_DEFAULT', + op: 'SETOP_NONE' + }); - const enhancedAst = generateTsAstCodeFromPgAst(selectStmt, runtimeSchema); - const generatedCode = generate(enhancedAst).code; + const enhancedAst = generateTsAstCodeFromPgAst(selectStmt, runtimeSchema); + const generatedCode = generate(enhancedAst).code; - expect(generatedCode).toMatchSnapshot(); + expect(generatedCode).toMatchSnapshot(); - expect(generatedCode).toContain('t.nodes.selectStmt'); - expect(generatedCode).toContain('t.nodes.resTarget'); + expect(generatedCode).toContain('t.nodes.selectStmt'); + expect(generatedCode).toContain('t.nodes.resTarget'); }); it('Complex AST with runtime schema — mixed wrapped/unwrapped patterns', () => { - const complexStmt = t.nodes.selectStmt({ - withClause: t.ast.withClause({ - ctes: [ - t.nodes.commonTableExpr({ - ctename: 'test_cte', - ctequery: t.nodes.selectStmt({ - targetList: [ - t.nodes.resTarget({ - val: t.nodes.columnRef({ - fields: [t.nodes.string({ sval: 'id' })] - }) - }) - ], - limitOption: 'LIMIT_OPTION_DEFAULT' - }) - }) - ], - recursive: false - }), - targetList: [ - t.nodes.resTarget({ + const complexStmt = t.nodes.selectStmt({ + withClause: t.ast.withClause({ + ctes: [ + t.nodes.commonTableExpr({ + ctename: 'test_cte', + ctequery: t.nodes.selectStmt({ + targetList: [ + t.nodes.resTarget({ val: t.nodes.columnRef({ - fields: [t.nodes.aStar()] + fields: [t.nodes.string({ sval: 'id' })] }) - }) - ], - limitOption: 'LIMIT_OPTION_DEFAULT', - op: 'SETOP_NONE' - }); + }) + ], + limitOption: 'LIMIT_OPTION_DEFAULT' + }) + }) + ], + recursive: false + }), + targetList: [ + t.nodes.resTarget({ + val: t.nodes.columnRef({ + fields: [t.nodes.aStar()] + }) + }) + ], + limitOption: 'LIMIT_OPTION_DEFAULT', + op: 'SETOP_NONE' + }); - const enhancedAst = generateTsAstCodeFromPgAst(complexStmt, runtimeSchema); - const generatedCode = generate(enhancedAst).code; + const enhancedAst = generateTsAstCodeFromPgAst(complexStmt, runtimeSchema); + const generatedCode = generate(enhancedAst).code; - expect(generatedCode).toMatchSnapshot(); - expect(generatedCode).toContain('t.ast.withClause'); - expect(generatedCode).toContain('t.nodes.selectStmt'); + expect(generatedCode).toMatchSnapshot(); + expect(generatedCode).toContain('t.ast.withClause'); + expect(generatedCode).toContain('t.nodes.selectStmt'); }); diff --git a/packages/proto-parser/__tests__/types.test.ts b/packages/proto-parser/__tests__/types.test.ts index e84bb6d0..20ef6f6a 100644 --- a/packages/proto-parser/__tests__/types.test.ts +++ b/packages/proto-parser/__tests__/types.test.ts @@ -11,21 +11,21 @@ describe('types', () => { }); it('fieldsRequired', () => { parseAndSnap('types/fieldsRequired', { - types: { - enabled: true, - optionalFields: false - } + types: { + enabled: true, + optionalFields: false + } }); }); it('wrappedNodeTypeExport', () => { parseAndSnap('types/node-wrapped', { - types: { - enabled: true, - enumsSource: 'my-enums.ts', - filename: 'types.ts', - wrappedNodeTypeExport: true - } + types: { + enabled: true, + enumsSource: 'my-enums.ts', + filename: 'types.ts', + wrappedNodeTypeExport: true + } }); }); }); diff --git a/packages/proto-parser/__tests__/utilities.test.ts b/packages/proto-parser/__tests__/utilities.test.ts index f789d9cf..775d9adc 100644 --- a/packages/proto-parser/__tests__/utilities.test.ts +++ b/packages/proto-parser/__tests__/utilities.test.ts @@ -1,7 +1,8 @@ -import { Type } from "@launchql/protobufjs"; -import { ProtoStore } from "../src/store"; -import { getDependents, getDependencies, getUndefinedKey } from "../src/utils"; -import { getStore } from "../test-utils"; +import { Type } from '@launchql/protobufjs'; + +import { ProtoStore } from '../src/store'; +import { getDependencies, getDependents, getUndefinedKey } from '../src/utils'; +import { getStore } from '../test-utils'; describe('Dependency and Dependent Resolution', () => { @@ -38,9 +39,9 @@ describe('Dependency and Dependent Resolution', () => { typesToSearch, store.enums ); - expect(list).toEqual([ - 'RangeTblRef' - ]); + expect(list).toEqual([ + 'RangeTblRef' + ]); }); it('TargetEntry', () => { const list = @@ -49,9 +50,9 @@ describe('Dependency and Dependent Resolution', () => { typesToSearch, store.enums ); - expect(list).toEqual([ - 'TargetEntry' - ]); + expect(list).toEqual([ + 'TargetEntry' + ]); }); }); @@ -74,8 +75,8 @@ describe('Dependency and Dependent Resolution', () => { typesToSearch, store.enums ); - expect(list).toEqual([ - ]); + expect(list).toEqual([ + ]); }); }); }); diff --git a/packages/proto-parser/jest.config.js b/packages/proto-parser/jest.config.js index 0aa3aaa4..057a9420 100644 --- a/packages/proto-parser/jest.config.js +++ b/packages/proto-parser/jest.config.js @@ -1,18 +1,18 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", - transform: { - "^.+\\.tsx?$": [ - "ts-jest", - { - babelConfig: false, - tsconfig: "tsconfig.json", - }, - ], - }, - transformIgnorePatterns: [`/node_modules/*`], - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - modulePathIgnorePatterns: ["dist/*"] + preset: 'ts-jest', + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + babelConfig: false, + tsconfig: 'tsconfig.json', + }, + ], + }, + transformIgnorePatterns: [`/node_modules/*`], + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + modulePathIgnorePatterns: ['dist/*'] }; diff --git a/packages/proto-parser/scripts/generate-test-utils.ts b/packages/proto-parser/scripts/generate-test-utils.ts index 36b5fe94..4b840206 100644 --- a/packages/proto-parser/scripts/generate-test-utils.ts +++ b/packages/proto-parser/scripts/generate-test-utils.ts @@ -1,8 +1,9 @@ +import { join,resolve } from 'path'; + import { PgProtoParser, PgProtoParserOptions } from '../src'; -import { resolve, join } from 'path'; import { getTestProtoPath } from '../test-utils'; -const inFile: string = getTestProtoPath('13-latest.proto') +const inFile: string = getTestProtoPath('13-latest.proto'); const outDir: string = resolve(join(__dirname, '../test-utils/utils')); const options: PgProtoParserOptions = { diff --git a/packages/proto-parser/src/ast/enums/enums-json.ts b/packages/proto-parser/src/ast/enums/enums-json.ts index c1137511..af1cb0a4 100644 --- a/packages/proto-parser/src/ast/enums/enums-json.ts +++ b/packages/proto-parser/src/ast/enums/enums-json.ts @@ -9,17 +9,17 @@ type EnumNameToValue = Record>; * Used for creating enum-to-string mapping files (JSON or TypeScript). */ export const generateEnum2StrJSON = (enums: Enum[]): EnumValueToName => { - const valueToName: EnumValueToName = {}; + const valueToName: EnumValueToName = {}; - enums.forEach(enumObj => { - valueToName[enumObj.name] = {}; + enums.forEach(enumObj => { + valueToName[enumObj.name] = {}; - for (const [key, value] of Object.entries(enumObj.values)) { - valueToName[enumObj.name][value as number] = key; - } - }); + for (const [key, value] of Object.entries(enumObj.values)) { + valueToName[enumObj.name][value as number] = key; + } + }); - return valueToName; + return valueToName; }; /** @@ -28,15 +28,15 @@ export const generateEnum2StrJSON = (enums: Enum[]): EnumValueToName => { * Used for creating string-to-enum mapping files (JSON or TypeScript). */ export const generateEnum2IntJSON = (enums: Enum[]): EnumNameToValue => { - const nameToValue: EnumNameToValue = {}; + const nameToValue: EnumNameToValue = {}; - enums.forEach(enumObj => { - nameToValue[enumObj.name] = {}; + enums.forEach(enumObj => { + nameToValue[enumObj.name] = {}; - for (const [key, value] of Object.entries(enumObj.values)) { - nameToValue[enumObj.name][key] = value as number; - } - }); + for (const [key, value] of Object.entries(enumObj.values)) { + nameToValue[enumObj.name][key] = value as number; + } + }); - return nameToValue; + return nameToValue; }; \ No newline at end of file diff --git a/packages/proto-parser/src/ast/enums/enums.ts b/packages/proto-parser/src/ast/enums/enums.ts index ef4d1514..2d3ed541 100644 --- a/packages/proto-parser/src/ast/enums/enums.ts +++ b/packages/proto-parser/src/ast/enums/enums.ts @@ -1,5 +1,6 @@ -import { Enum } from '@launchql/protobufjs'; import * as t from '@babel/types'; +import { Enum } from '@launchql/protobufjs'; + import { createNamedImport } from '../../utils'; /** @@ -129,7 +130,7 @@ export const generateEnumValueFunctions = (enumData: Enum[]) => { // Return the entire AST return [exportedEnumTypeAlias, exportedFunction]; -} +}; /** * Generates a unidirectional function that converts enum string keys to their numeric values. @@ -211,7 +212,7 @@ export const generateEnumToIntFunctions = (enumData: Enum[]) => { // Return the entire AST return [exportedEnumTypeAlias, exportedFunction]; -} +}; /** * Generates a nested object structure with individual converter functions for each enum. @@ -308,7 +309,7 @@ export const generateEnumToIntFunctionsNested = (enumData: Enum[]) => { const exportedMapType = t.exportNamedDeclaration(enumToIntMapTypeAlias, []); return [exportedEnumType, exportedMapType, exportedObject]; -} +}; /** * Generates a nested object structure with functions to convert enum numeric values to string keys. @@ -405,7 +406,7 @@ export const generateEnumToStringFunctionsNested = (enumData: Enum[]) => { const exportedMapType = t.exportNamedDeclaration(enumToStringMapTypeAlias, []); return [exportedEnumType, exportedMapType, exportedObject]; -} +}; /** * Generates a unidirectional function that converts enum numeric values to their string keys. @@ -487,4 +488,4 @@ export const generateEnumToStringFunctions = (enumData: Enum[]) => { // Return the entire AST return [exportedEnumTypeAlias, exportedFunction]; -} +}; diff --git a/packages/proto-parser/src/ast/types/types.ts b/packages/proto-parser/src/ast/types/types.ts index 3895c64d..20da5d29 100644 --- a/packages/proto-parser/src/ast/types/types.ts +++ b/packages/proto-parser/src/ast/types/types.ts @@ -1,8 +1,9 @@ -import { Type, Field } from '@launchql/protobufjs'; import * as t from '@babel/types'; -import { createNamedImport, createNamedImportAsSuffix, getFieldName, toSpecialCamelCase } from '../../utils'; -import { PgProtoParserOptions } from '../../options'; +import { Field,Type } from '@launchql/protobufjs'; + import { NODE_TYPE } from '../../constants'; +import { PgProtoParserOptions } from '../../options'; +import { createNamedImport, createNamedImportAsSuffix, getFieldName, toSpecialCamelCase } from '../../utils'; import { resolveTypeName } from './utils'; /** @@ -85,7 +86,7 @@ export const generateAstHelperMethods = (types: Type[]): t.ExportDefaultDeclarat }); return t.exportDefaultDeclaration(t.objectExpression(creators)); -} +}; /** * Generates helper factory methods that return AST nodes wrapped in a type-specific object. @@ -173,7 +174,7 @@ export const generateWrappedAstHelperMethods = (types: Type[]): t.ExportDefaultD }); return t.exportDefaultDeclaration(t.objectExpression(creators)); -} +}; /** * Generates a TypeScript union type named 'Node' that includes all AST node types. @@ -257,7 +258,7 @@ const extractTypeFieldsAsTsProperties = ( }); return properties; -} +}; /** * Converts a protobuf Type definition into a TypeScript interface declaration. @@ -280,7 +281,7 @@ export const convertTypeToTsInterface = ( // Wrap the interface declaration in an export statement return t.exportNamedDeclaration(interfaceDecl, []); -} +}; /** @@ -295,4 +296,4 @@ export const generateTypeImportSpecifiers = (types: Type[], options: PgProtoPars const importDeclaration = t.importDeclaration(importSpecifiers, t.stringLiteral(options.utils.astHelpers.typesSource)); return importDeclaration; -} +}; diff --git a/packages/proto-parser/src/ast/types/utils.ts b/packages/proto-parser/src/ast/types/utils.ts index c777897c..f5f7f564 100644 --- a/packages/proto-parser/src/ast/types/utils.ts +++ b/packages/proto-parser/src/ast/types/utils.ts @@ -1,4 +1,5 @@ import * as t from '@babel/types'; + import { isPrimitiveType } from '../../utils'; /** @@ -8,29 +9,29 @@ import { isPrimitiveType } from '../../utils'; */ export const getTSType = (type: string = 'any') => { switch (type) { - case 'string': - return t.tsStringKeyword(); - case 'double': - case 'float': - case 'int32': - case 'uint32': - case 'sint32': - case 'fixed32': - case 'sfixed32': - return t.tsNumberKeyword(); - case 'int64': - case 'uint64': - case 'sint64': - case 'fixed64': - case 'sfixed64': - return t.tsBigIntKeyword() - case 'bytes': - return t.tsTypeReference(t.identifier('Uint8Array')); - case 'bool': - return t.tsBooleanKeyword(); - default: - // For custom types, reference them directly - return t.tsTypeReference(t.identifier(type)); + case 'string': + return t.tsStringKeyword(); + case 'double': + case 'float': + case 'int32': + case 'uint32': + case 'sint32': + case 'fixed32': + case 'sfixed32': + return t.tsNumberKeyword(); + case 'int64': + case 'uint64': + case 'sint64': + case 'fixed64': + case 'sfixed64': + return t.tsBigIntKeyword(); + case 'bytes': + return t.tsTypeReference(t.identifier('Uint8Array')); + case 'bool': + return t.tsBooleanKeyword(); + default: + // For custom types, reference them directly + return t.tsTypeReference(t.identifier(type)); }; }; @@ -45,4 +46,4 @@ export const resolveTypeName = (type: string) => { return getTSType(type); } return t.tsTypeReference(t.identifier(type)); -} +}; diff --git a/packages/proto-parser/src/index.ts b/packages/proto-parser/src/index.ts index a226798c..153b83eb 100644 --- a/packages/proto-parser/src/index.ts +++ b/packages/proto-parser/src/index.ts @@ -1,4 +1,4 @@ -export * from './store'; -export * from './parser'; export * from './options'; +export * from './parser'; +export * from './store'; export * from './utils'; \ No newline at end of file diff --git a/packages/proto-parser/src/options/defaults.ts b/packages/proto-parser/src/options/defaults.ts index 5b6bb425..911770a9 100644 --- a/packages/proto-parser/src/options/defaults.ts +++ b/packages/proto-parser/src/options/defaults.ts @@ -1,68 +1,68 @@ import deepmerge from 'deepmerge'; import { join } from 'path'; -import { PgProtoParserOptions } from "./types"; +import { PgProtoParserOptions } from './types'; // Define default options outside of the class export const defaultPgProtoParserOptions: PgProtoParserOptions = { - outDir: join(process.cwd(), 'out'), - includeHeader: true, - exclude: [], - utils: { - enums: { - enabled: false, - filename: 'utils.ts', - unidirectional: false, - toIntFilename: 'enum-to-int.ts', - toStringFilename: 'enum-to-string.ts', - outputFormat: 'switchStatements' - }, - astHelpers: { - enabled: false, - typesSource: './types', - inlineNestedObj: false, - nestedObjFile: 'nested-obj.ts', - filename: 'asts.ts', - }, - wrappedAstHelpers: { - enabled: false, - filename: 'wrapped-asts.ts' - } - }, - types: { - enabled: false, - filename: 'types.ts', - optionalFields: true, - enumsSource: './enums', - wrappedNodeTypeExport: true - }, + outDir: join(process.cwd(), 'out'), + includeHeader: true, + exclude: [], + utils: { enums: { - enabled: false, - filename: 'enums.ts', - enumsAsTypeUnion: true, - - enumMap: { - enabled: false, - format: 'ts', - toIntOutFile: 'enums2int.ts', - toStrOutFile: 'enums2str.ts' - }, - removeUndefinedAt0: true + enabled: false, + filename: 'utils.ts', + unidirectional: false, + toIntFilename: 'enum-to-int.ts', + toStringFilename: 'enum-to-string.ts', + outputFormat: 'switchStatements' }, - runtimeSchema: { - enabled: false, - filename: 'runtime-schema', - format: 'json' + astHelpers: { + enabled: false, + typesSource: './types', + inlineNestedObj: false, + nestedObjFile: 'nested-obj.ts', + filename: 'asts.ts', }, - parser: { - keepCase: false, - alternateCommentMode: true, - preferTrailingComment: false + wrappedAstHelpers: { + enabled: false, + filename: 'wrapped-asts.ts' } + }, + types: { + enabled: false, + filename: 'types.ts', + optionalFields: true, + enumsSource: './enums', + wrappedNodeTypeExport: true + }, + enums: { + enabled: false, + filename: 'enums.ts', + enumsAsTypeUnion: true, + + enumMap: { + enabled: false, + format: 'ts', + toIntOutFile: 'enums2int.ts', + toStrOutFile: 'enums2str.ts' + }, + removeUndefinedAt0: true + }, + runtimeSchema: { + enabled: false, + filename: 'runtime-schema', + format: 'json' + }, + parser: { + keepCase: false, + alternateCommentMode: true, + preferTrailingComment: false + } }; export const getOptionsWithDefaults = (options: PgProtoParserOptions): PgProtoParserOptions => { - // If an element at the same key is present for both x and y in deepmerge(x,y), the value from y will appear in the result. - options = deepmerge(defaultPgProtoParserOptions, options ?? {}); - return options; + // If an element at the same key is present for both x and y in deepmerge(x,y), the value from y will appear in the result. + options = deepmerge(defaultPgProtoParserOptions, options ?? {}); + return options; }; diff --git a/packages/proto-parser/src/package.ts b/packages/proto-parser/src/package.ts index 74d39ab3..d13fda90 100644 --- a/packages/proto-parser/src/package.ts +++ b/packages/proto-parser/src/package.ts @@ -1,5 +1,5 @@ -import { existsSync,readFileSync } from "fs"; -import { dirname,join } from "path"; +import { existsSync,readFileSync } from 'fs'; +import { dirname,join } from 'path'; // need to search due to the dist/ folder and src/, etc. function findPackageJson(currentDir: string): string { diff --git a/packages/proto-parser/src/parser.ts b/packages/proto-parser/src/parser.ts index 64573a1b..dc024e80 100644 --- a/packages/proto-parser/src/parser.ts +++ b/packages/proto-parser/src/parser.ts @@ -1,10 +1,11 @@ import { parse } from '@launchql/protobufjs'; import { readFileSync } from 'fs'; -import { ProtoStore } from './store'; + import { getOptionsWithDefaults, PgProtoParserOptions } from './options'; +import { ProtoStore } from './store'; export class PgProtoParser { inFile: string; diff --git a/packages/proto-parser/src/runtime-schema/generator.ts b/packages/proto-parser/src/runtime-schema/generator.ts index d342839b..4deb86d5 100644 --- a/packages/proto-parser/src/runtime-schema/generator.ts +++ b/packages/proto-parser/src/runtime-schema/generator.ts @@ -1,5 +1,6 @@ -import { Type, Field, Enum, Namespace, ReflectionObject } from '@launchql/protobufjs'; -import { NodeSpec, FieldSpec } from './types'; +import { Field, Namespace,Type } from '@launchql/protobufjs'; + +import { FieldSpec,NodeSpec } from './types'; export class RuntimeSchemaGenerator { private root: Namespace; diff --git a/packages/proto-parser/src/runtime-schema/index.ts b/packages/proto-parser/src/runtime-schema/index.ts index 24b8cc1a..58939c3e 100644 --- a/packages/proto-parser/src/runtime-schema/index.ts +++ b/packages/proto-parser/src/runtime-schema/index.ts @@ -1,2 +1,2 @@ export { RuntimeSchemaGenerator } from './generator'; -export type { NodeSpec, FieldSpec, RuntimeSchemaOptions } from './types'; +export type { FieldSpec, NodeSpec, RuntimeSchemaOptions } from './types'; diff --git a/packages/proto-parser/src/store.ts b/packages/proto-parser/src/store.ts index 46f281d4..2d68b245 100644 --- a/packages/proto-parser/src/store.ts +++ b/packages/proto-parser/src/store.ts @@ -1,15 +1,16 @@ -import { Service, Type, Field, Enum, Namespace, ReflectionObject } from '@launchql/protobufjs'; -import { generateEnumImports, generateAstHelperMethods, generateWrappedAstHelperMethods, generateTypeImportSpecifiers, generateEnumValueFunctions, generateEnumToIntFunctions, generateEnumToStringFunctions, generateEnumToIntFunctionsNested, generateEnumToStringFunctionsNested, convertEnumToTsUnionType, convertEnumToTsEnumDeclaration, generateNodeUnionType, convertTypeToTsInterface } from './ast'; -import { RuntimeSchemaGenerator } from './runtime-schema'; -import { generateEnum2IntJSON, generateEnum2StrJSON } from './ast/enums/enums-json'; -import { jsStringify } from 'strfy-js'; +import * as t from '@babel/types'; +import { Enum, Field, Namespace, ReflectionObject,Service, Type } from '@launchql/protobufjs'; import { mkdirSync } from 'fs'; -import { join, dirname } from 'path'; +import { dirname,join } from 'path'; +import { jsStringify } from 'strfy-js'; + +import { convertEnumToTsEnumDeclaration, convertEnumToTsUnionType, convertTypeToTsInterface,generateAstHelperMethods, generateEnumImports, generateEnumToIntFunctions, generateEnumToIntFunctionsNested, generateEnumToStringFunctions, generateEnumToStringFunctionsNested, generateEnumValueFunctions, generateNodeUnionType, generateTypeImportSpecifiers, generateWrappedAstHelperMethods } from './ast'; +import { generateEnum2IntJSON, generateEnum2StrJSON } from './ast/enums/enums-json'; +import { NODE_TYPE } from './constants'; +import { nestedObjCode } from './inline-helpers'; import { getOptionsWithDefaults, PgProtoStoreOptions } from './options'; +import { RuntimeSchemaGenerator } from './runtime-schema'; import { cloneAndNameNode, convertAstToCode, createDefaultImport, getUndefinedKey, hasUndefinedInitialValue, stripExtension, writeFileToDisk } from './utils'; -import { nestedObjCode } from './inline-helpers'; -import * as t from '@babel/types'; -import { NODE_TYPE } from './constants'; interface IProtoStore { options: PgProtoStoreOptions; @@ -158,7 +159,7 @@ export class ProtoStore implements IProtoStore { const node = generateNodeUnionType(this.options, typesToProcess); const enumImports = generateEnumImports(enumsToProcess, this.options.types.enumsSource); const types = typesToProcess.reduce((m, type) => { - return [...m, convertTypeToTsInterface(type, this.options)] + return [...m, convertTypeToTsInterface(type, this.options)]; }, []); const filename = this.ensureCorrectExtension(this.options.types.filename, '.ts'); this.writeCodeToFile(filename, [ diff --git a/packages/proto-parser/src/utils/deps.ts b/packages/proto-parser/src/utils/deps.ts index 86e1ec46..27c180c4 100644 --- a/packages/proto-parser/src/utils/deps.ts +++ b/packages/proto-parser/src/utils/deps.ts @@ -1,86 +1,87 @@ -import { Type, Enum, Field } from '@launchql/protobufjs'; -import { isPrimitiveType } from './types'; +import { Enum, Field,Type } from '@launchql/protobufjs'; + import { NODE_TYPE } from '../constants'; +import { isPrimitiveType } from './types'; const dependenciesResolve = (types: Type[], enums: Enum[], symbolName: string, resolved: string[], unresolved: string[]) => { - if (symbolName === NODE_TYPE) return; + if (symbolName === NODE_TYPE) return; - unresolved.push(symbolName); + unresolved.push(symbolName); - let dep = [...types, ...enums].find(dep => dep.name === symbolName); - if (!dep) { - throw new Error(`Dependency Not Found ${symbolName}`) - } + let dep = [...types, ...enums].find(dep => dep.name === symbolName); + if (!dep) { + throw new Error(`Dependency Not Found ${symbolName}`); + } - const depAsType = types.find(t => t.name === dep.name); + const depAsType = types.find(t => t.name === dep.name); - if (depAsType) { - const fields = Object.values(depAsType.fields); - for (let i = 0; i < fields.length; i++) { - const childDep = fields[i]; - if (!resolved.includes(childDep.type)) { - if (unresolved.includes(childDep.type)) { - // console.warn(`Circular reference detected ${symbolName}, ${dep}`); - continue; - } - if (!isPrimitiveType(childDep.type)) { - dependenciesResolve(types, enums, childDep.type, resolved, unresolved); - } - } - } - } - resolved.push(symbolName); - const index = unresolved.indexOf(symbolName); - unresolved.splice(index); -} + if (depAsType) { + const fields = Object.values(depAsType.fields); + for (let i = 0; i < fields.length; i++) { + const childDep = fields[i]; + if (!resolved.includes(childDep.type)) { + if (unresolved.includes(childDep.type)) { + // console.warn(`Circular reference detected ${symbolName}, ${dep}`); + continue; + } + if (!isPrimitiveType(childDep.type)) { + dependenciesResolve(types, enums, childDep.type, resolved, unresolved); + } + } + } + } + resolved.push(symbolName); + const index = unresolved.indexOf(symbolName); + unresolved.splice(index); +}; export const getDependencies = (name: string, types: Type[], enums: Enum[]) => { - const resolved: string[] = []; - const unresolved: string[] = []; - dependenciesResolve(types, enums, name, resolved, unresolved); - return resolved; -} + const resolved: string[] = []; + const unresolved: string[] = []; + dependenciesResolve(types, enums, name, resolved, unresolved); + return resolved; +}; const dependentsResolve = (types: Type[], enums: Enum[], symbolName: string, resolved: string[], unresolved: string[]) => { - if (symbolName === NODE_TYPE) return; - - unresolved.push(symbolName); + if (symbolName === NODE_TYPE) return; - [...types, ...enums].forEach(dep => { - if (resolved.includes(dep.name) || unresolved.includes(dep.name)) { - return; - } + unresolved.push(symbolName); - const depAsType = types.find(t => t.name === dep.name); + [...types, ...enums].forEach(dep => { + if (resolved.includes(dep.name) || unresolved.includes(dep.name)) { + return; + } - let isDependent = false; - if (depAsType) { - const fields: Field[] = Object.values(depAsType.fields); - isDependent = fields.some(field => field.type === symbolName); - } + const depAsType = types.find(t => t.name === dep.name); - if (isDependent) { - if (unresolved.includes(dep.name)) { - throw new Error(`Circular reference detected: ${symbolName} <-> ${dep.name}`); - } + let isDependent = false; + if (depAsType) { + const fields: Field[] = Object.values(depAsType.fields); + isDependent = fields.some(field => field.type === symbolName); + } - dependentsResolve(types, enums, dep.name, resolved, unresolved); - } - }); + if (isDependent) { + if (unresolved.includes(dep.name)) { + throw new Error(`Circular reference detected: ${symbolName} <-> ${dep.name}`); + } - if (!resolved.includes(symbolName)) { - resolved.push(symbolName); + dependentsResolve(types, enums, dep.name, resolved, unresolved); } + }); - const index = unresolved.indexOf(symbolName); - if (index !== -1) { - unresolved.splice(index, 1); - } + if (!resolved.includes(symbolName)) { + resolved.push(symbolName); + } + + const index = unresolved.indexOf(symbolName); + if (index !== -1) { + unresolved.splice(index, 1); + } }; export const getDependents = (symbolName: string, types: Type[], enums: Enum[]) => { - const resolved: string[] = []; - const unresolved: string[] = []; - dependentsResolve(types, enums, symbolName, resolved, unresolved); - return resolved.filter(name => name !== symbolName); // Exclude the symbol itself from its dependents + const resolved: string[] = []; + const unresolved: string[] = []; + dependentsResolve(types, enums, symbolName, resolved, unresolved); + return resolved.filter(name => name !== symbolName); // Exclude the symbol itself from its dependents }; diff --git a/packages/proto-parser/src/utils/index.ts b/packages/proto-parser/src/utils/index.ts index 90f2e32b..8c8823da 100644 --- a/packages/proto-parser/src/utils/index.ts +++ b/packages/proto-parser/src/utils/index.ts @@ -1,5 +1,5 @@ -export * from './utils'; export * from './babel'; export * from './deps'; +export * from './meta'; export * from './types'; -export * from './meta'; \ No newline at end of file +export * from './utils'; \ No newline at end of file diff --git a/packages/proto-parser/src/utils/meta.ts b/packages/proto-parser/src/utils/meta.ts index e43914ca..4fa02e0a 100644 --- a/packages/proto-parser/src/utils/meta.ts +++ b/packages/proto-parser/src/utils/meta.ts @@ -1,6 +1,7 @@ -import { toSpecialCamelCase } from './index'; import * as t from '@babel/types'; -import { NodeSpec, FieldSpec } from '../runtime-schema/types'; + +import {NodeSpec } from '../runtime-schema/types'; +import { toSpecialCamelCase } from './index'; /** * Converts an AST (Abstract Syntax Tree) representation of a SQL query into @@ -11,145 +12,145 @@ import { NodeSpec, FieldSpec } from '../runtime-schema/types'; * the original SQL AST. */ -// TODO — handle TypeName and SPECIAL_TYPES cases +// TODO — handle TypeName and SPECIAL_TYPES cases export function generateTsAstCodeFromPgAst(ast: any, runtimeSchema: NodeSpec[]): any { - const schemaMap = new Map(); - runtimeSchema.forEach(spec => { - schemaMap.set(spec.name, spec); - }); + const schemaMap = new Map(); + runtimeSchema.forEach(spec => { + schemaMap.set(spec.name, spec); + }); - function createAstNode(functionName: string, properties: any, isWrapped: boolean = true) { - const args = properties.map(([propKey, propValue]: [string, any]) => { - if (propValue && typeof propValue === 'object' && propValue.type) { - return t.objectProperty(t.identifier(propKey), propValue); - } - return t.objectProperty(t.identifier(propKey), getValueNode(propValue)); - }); + function createAstNode(functionName: string, properties: any, isWrapped: boolean = true) { + const args = properties.map(([propKey, propValue]: [string, any]) => { + if (propValue && typeof propValue === 'object' && propValue.type) { + return t.objectProperty(t.identifier(propKey), propValue); + } + return t.objectProperty(t.identifier(propKey), getValueNode(propValue)); + }); - const builderPath = isWrapped ? 'nodes' : 'ast'; - return t.callExpression( - t.memberExpression( - t.memberExpression(t.identifier('t'), t.identifier(builderPath)), - t.identifier(functionName) - ), - [t.objectExpression(args)] - ); - } + const builderPath = isWrapped ? 'nodes' : 'ast'; + return t.callExpression( + t.memberExpression( + t.memberExpression(t.identifier('t'), t.identifier(builderPath)), + t.identifier(functionName) + ), + [t.objectExpression(args)] + ); + } - function getValueNode(value: any, parentNodeType?: string, fieldName?: string): t.Expression { - if (Array.isArray(value)) { - return t.arrayExpression(value.map(item => getValueNode(item, parentNodeType, fieldName))); - } else if (typeof value === 'object') { - if (value === null) return t.nullLiteral(); + function getValueNode(value: any, parentNodeType?: string, fieldName?: string): t.Expression { + if (Array.isArray(value)) { + return t.arrayExpression(value.map(item => getValueNode(item, parentNodeType, fieldName))); + } else if (typeof value === 'object') { + if (value === null) return t.nullLiteral(); - if (parentNodeType && fieldName) { - const parentSpec = schemaMap.get(parentNodeType); - if (parentSpec) { - const fieldSpec = parentSpec.fields.find(f => f.name === fieldName); + if (parentNodeType && fieldName) { + const parentSpec = schemaMap.get(parentNodeType); + if (parentSpec) { + const fieldSpec = parentSpec.fields.find(f => f.name === fieldName); - } - } - - return traverse(value, parentNodeType, fieldName); - } - switch (typeof value) { - case 'boolean': - return t.booleanLiteral(value); - case 'number': - return t.numericLiteral(value); - case 'string': - return t.stringLiteral(value); - default: - return t.stringLiteral(String(value)); // Fallback for other types } + } + + return traverse(value, parentNodeType, fieldName); + } + switch (typeof value) { + case 'boolean': + return t.booleanLiteral(value); + case 'number': + return t.numericLiteral(value); + case 'string': + return t.stringLiteral(value); + default: + return t.stringLiteral(String(value)); // Fallback for other types } + } - function findNodeTypeByFields(fieldNames: string[]): NodeSpec | null { - for (const nodeSpec of runtimeSchema) { - const specFieldNames = nodeSpec.fields.map(f => f.name).sort(); - const sortedFieldNames = [...fieldNames].sort(); + function findNodeTypeByFields(fieldNames: string[]): NodeSpec | null { + for (const nodeSpec of runtimeSchema) { + const specFieldNames = nodeSpec.fields.map(f => f.name).sort(); + const sortedFieldNames = [...fieldNames].sort(); - const hasAllRequiredFields = specFieldNames.every(fieldName => - sortedFieldNames.includes(fieldName) || + const hasAllRequiredFields = specFieldNames.every(fieldName => + sortedFieldNames.includes(fieldName) || nodeSpec.fields.find(f => f.name === fieldName)?.optional - ); - const hasOnlyValidFields = sortedFieldNames.every(fieldName => - specFieldNames.includes(fieldName) - ); + ); + const hasOnlyValidFields = sortedFieldNames.every(fieldName => + specFieldNames.includes(fieldName) + ); - if (hasAllRequiredFields && hasOnlyValidFields && sortedFieldNames.length > 0) { - return nodeSpec; - } - } - return null; + if (hasAllRequiredFields && hasOnlyValidFields && sortedFieldNames.length > 0) { + return nodeSpec; + } } + return null; + } - function traverse(node: any, parentNodeType?: string, fieldName?: string): t.Expression { - if (Array.isArray(node)) { - return t.arrayExpression(node.map(item => traverse(item, parentNodeType, fieldName))); - } else if (node && typeof node === 'object') { - const entries = Object.entries(node); - if (entries.length === 0) return t.objectExpression([]); + function traverse(node: any, parentNodeType?: string, fieldName?: string): t.Expression { + if (Array.isArray(node)) { + return t.arrayExpression(node.map(item => traverse(item, parentNodeType, fieldName))); + } else if (node && typeof node === 'object') { + const entries = Object.entries(node); + if (entries.length === 0) return t.objectExpression([]); - if (entries.length === 1) { - const [key, value] = entries[0]; - const functionName = toSpecialCamelCase(key); + if (entries.length === 1) { + const [key, value] = entries[0]; + const functionName = toSpecialCamelCase(key); - let isWrapped = true; + let isWrapped = true; - if (parentNodeType && fieldName) { - const parentSpec = schemaMap.get(parentNodeType); - if (parentSpec) { - const fieldSpec = parentSpec.fields.find(f => f.name === fieldName); - if (fieldSpec && fieldSpec.type !== 'Node' && schemaMap.has(fieldSpec.type)) { - isWrapped = false; - } - } - } + if (parentNodeType && fieldName) { + const parentSpec = schemaMap.get(parentNodeType); + if (parentSpec) { + const fieldSpec = parentSpec.fields.find(f => f.name === fieldName); + if (fieldSpec && fieldSpec.type !== 'Node' && schemaMap.has(fieldSpec.type)) { + isWrapped = false; + } + } + } - const processedProperties = Object.entries(value).map(([propKey, propValue]) => { - return [propKey, getValueNode(propValue, key, propKey)]; - }); + const processedProperties = Object.entries(value).map(([propKey, propValue]) => { + return [propKey, getValueNode(propValue, key, propKey)]; + }); - return createAstNode(functionName, processedProperties, isWrapped); - } else { - const fieldNames = entries.map(([key]) => key); - const matchingNodeSpec = findNodeTypeByFields(fieldNames); + return createAstNode(functionName, processedProperties, isWrapped); + } else { + const fieldNames = entries.map(([key]) => key); + const matchingNodeSpec = findNodeTypeByFields(fieldNames); - if (matchingNodeSpec) { - const functionName = toSpecialCamelCase(matchingNodeSpec.name); + if (matchingNodeSpec) { + const functionName = toSpecialCamelCase(matchingNodeSpec.name); - let isWrapped = true; - if (parentNodeType && fieldName) { - const parentSpec = schemaMap.get(parentNodeType); - if (parentSpec) { - const parentFieldSpec = parentSpec.fields.find(f => f.name === fieldName); - if (parentFieldSpec && parentFieldSpec.type !== 'Node' && schemaMap.has(parentFieldSpec.type)) { - isWrapped = false; - } - } - } + let isWrapped = true; + if (parentNodeType && fieldName) { + const parentSpec = schemaMap.get(parentNodeType); + if (parentSpec) { + const parentFieldSpec = parentSpec.fields.find(f => f.name === fieldName); + if (parentFieldSpec && parentFieldSpec.type !== 'Node' && schemaMap.has(parentFieldSpec.type)) { + isWrapped = false; + } + } + } - const processedProperties = entries.map(([propKey, propValue]) => { - return [propKey, traverse(propValue, matchingNodeSpec.name, propKey)]; - }); + const processedProperties = entries.map(([propKey, propValue]) => { + return [propKey, traverse(propValue, matchingNodeSpec.name, propKey)]; + }); - return createAstNode(functionName, processedProperties, isWrapped); - } else { - const properties = entries.map(([propKey, propValue]) => { - return t.objectProperty(t.identifier(propKey), traverse(propValue, parentNodeType, propKey)); - }); - return t.objectExpression(properties); - } - } + return createAstNode(functionName, processedProperties, isWrapped); + } else { + const properties = entries.map(([propKey, propValue]) => { + return t.objectProperty(t.identifier(propKey), traverse(propValue, parentNodeType, propKey)); + }); + return t.objectExpression(properties); } - - return getValueNode(node, parentNodeType, fieldName); + } } - return traverse(ast); + return getValueNode(node, parentNodeType, fieldName); + } + + return traverse(ast); } \ No newline at end of file diff --git a/packages/proto-parser/src/utils/types.ts b/packages/proto-parser/src/utils/types.ts index eaf6c4fe..163e4416 100644 --- a/packages/proto-parser/src/utils/types.ts +++ b/packages/proto-parser/src/utils/types.ts @@ -1,22 +1,22 @@ export const isPrimitiveType = (type: string) => { - switch (type) { - case 'string': - case 'double': - case 'float': - case 'int32': - case 'uint32': - case 'sint32': - case 'fixed32': - case 'sfixed32': - case 'int64': - case 'uint64': - case 'sint64': - case 'fixed64': - case 'sfixed64': - case 'bytes': - case 'bool': - return true; - default: - return false; - }; - }; \ No newline at end of file + switch (type) { + case 'string': + case 'double': + case 'float': + case 'int32': + case 'uint32': + case 'sint32': + case 'fixed32': + case 'sfixed32': + case 'int64': + case 'uint64': + case 'sint64': + case 'fixed64': + case 'sfixed64': + case 'bytes': + case 'bool': + return true; + default: + return false; + }; +}; \ No newline at end of file diff --git a/packages/proto-parser/src/utils/utils.ts b/packages/proto-parser/src/utils/utils.ts index 1d1aec08..44bd02d3 100644 --- a/packages/proto-parser/src/utils/utils.ts +++ b/packages/proto-parser/src/utils/utils.ts @@ -1,7 +1,8 @@ import { Enum, Field, ReflectionObject } from '@launchql/protobufjs'; -import { PgProtoParserOptions } from '../options'; import { writeFileSync } from 'fs'; -import { extname, basename } from 'path'; +import { basename,extname } from 'path'; + +import { PgProtoParserOptions } from '../options'; import { readAndParsePackageJson } from '../package'; const pkg = readAndParsePackageJson(); @@ -21,16 +22,16 @@ export const getUndefinedKey = (enumName: string) => { const upperSnakeCase = processedParts.join('_').toUpperCase(); return `${upperSnakeCase}_UNDEFINED`; -} +}; export const toSpecialCamelCase = (s: string) => { return s - .replace(/_+/g, '') // Remove all underscores - .replace(/([A-Z]+)([A-Z][a-z]|$)/g, (match: string, p1: string, p2: string) => - p1.toLowerCase() + p2 // Lowercase all but the last letter of consecutive caps - ) - .replace(/^./, (match: string) => match.toLowerCase()); // Ensure the first character is lowercase -} + .replace(/_+/g, '') // Remove all underscores + .replace(/([A-Z]+)([A-Z][a-z]|$)/g, (match: string, p1: string, p2: string) => + p1.toLowerCase() + p2 // Lowercase all but the last letter of consecutive caps + ) + .replace(/^./, (match: string) => match.toLowerCase()); // Ensure the first character is lowercase +}; export const hasUndefinedInitialValue = (enumData: Enum) => { const entries = Object.entries(enumData.values); @@ -39,19 +40,19 @@ export const hasUndefinedInitialValue = (enumData: Enum) => { const undefinedKey = getUndefinedKey(enumData.name); const firstEntry = entries[0]; return firstEntry[0] === undefinedKey && firstEntry[1] === 0; -} +}; export const cloneAndNameNode = (node: ReflectionObject, name: string) => { const clone = JSON.parse(JSON.stringify(node)); return { name, ...clone - } -} + }; +}; export const getFieldName = (field: Field, fallbackName: string) => { - return field.options?.json_name ? field.options.json_name : fallbackName; -} + return field.options?.json_name ? field.options.json_name : fallbackName; +}; export const getHeader = () => { const version = process.env.NODE_ENV === 'test' ? 'latest' : pkg.version; @@ -66,10 +67,10 @@ export const getHeader = () => { export const writeFileToDisk = (path: string, contents: string, options: PgProtoParserOptions) => { const c = (options.includeHeader && extname(path) === '.ts') ? `${getHeader()}${contents}` : contents; writeFileSync(path, c); -} +}; export const stripExtension = (filename: string) => { const extension = extname(filename); return basename(filename, extension); -} +}; diff --git a/packages/quotes/__tests__/kwlist.test.ts b/packages/quotes/__tests__/kwlist.test.ts index dc918b78..906f19b6 100644 --- a/packages/quotes/__tests__/kwlist.test.ts +++ b/packages/quotes/__tests__/kwlist.test.ts @@ -1,10 +1,10 @@ import { + COL_NAME_KEYWORDS, keywordKindOf, kwlist, RESERVED_KEYWORDS, - UNRESERVED_KEYWORDS, - COL_NAME_KEYWORDS, TYPE_FUNC_NAME_KEYWORDS, + UNRESERVED_KEYWORDS, } from '../src/kwlist'; describe('kwlist', () => { diff --git a/packages/quotes/jest.config.js b/packages/quotes/jest.config.js index 71c60301..057a9420 100644 --- a/packages/quotes/jest.config.js +++ b/packages/quotes/jest.config.js @@ -1,18 +1,18 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", + preset: 'ts-jest', + testEnvironment: 'node', transform: { - "^.+\\.tsx?$": [ - "ts-jest", + '^.+\\.tsx?$': [ + 'ts-jest', { babelConfig: false, - tsconfig: "tsconfig.json", + tsconfig: 'tsconfig.json', }, ], }, transformIgnorePatterns: [`/node_modules/*`], - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - modulePathIgnorePatterns: ["dist/*"] + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + modulePathIgnorePatterns: ['dist/*'] }; diff --git a/packages/quotes/src/index.ts b/packages/quotes/src/index.ts index b006bf89..e4fd8e45 100644 --- a/packages/quotes/src/index.ts +++ b/packages/quotes/src/index.ts @@ -1,10 +1,10 @@ -export { QuoteUtils } from './quote-utils'; +export type { KeywordKind } from './kwlist'; export { + COL_NAME_KEYWORDS, keywordKindOf, kwlist, RESERVED_KEYWORDS, - UNRESERVED_KEYWORDS, - COL_NAME_KEYWORDS, TYPE_FUNC_NAME_KEYWORDS, + UNRESERVED_KEYWORDS, } from './kwlist'; -export type { KeywordKind } from './kwlist'; +export { QuoteUtils } from './quote-utils'; diff --git a/packages/scripts/__tests__/invert.test.ts b/packages/scripts/__tests__/invert.test.ts index d2cd3931..e6ce9397 100644 --- a/packages/scripts/__tests__/invert.test.ts +++ b/packages/scripts/__tests__/invert.test.ts @@ -135,7 +135,7 @@ describe('revertFor', () => { }); it('never guesses for DML', () => { - const result = revert("INSERT INTO app.users (id) VALUES (1);"); + const result = revert('INSERT INTO app.users (id) VALUES (1);'); expect(result.sql).toEqual('-- revert not derivable: DML is not mechanically invertible'); expect(result.warnings).toEqual(['revert not derivable: DML is not mechanically invertible']); }); @@ -147,7 +147,7 @@ describe('revertFor', () => { }); it('warns instead of using CASCADE for ALTER ... SET (prior value unknown)', () => { - const result = revert("ALTER TABLE app.users ALTER COLUMN id SET DEFAULT 0;"); + const result = revert('ALTER TABLE app.users ALTER COLUMN id SET DEFAULT 0;'); expect(result.sql).toContain('-- revert not derivable: ALTER TABLE app.users AT_ColumnDefault'); expect(result.warnings).toHaveLength(1); }); @@ -237,7 +237,7 @@ describe('verifyFor', () => { it('checks added columns via information_schema.columns', () => { expect(verify('ALTER TABLE app.users ADD COLUMN age int;').sql) .toEqual( - "SELECT 1/(CASE WHEN EXISTS (SELECT 1 FROM information_schema.columns WHERE " + + 'SELECT 1/(CASE WHEN EXISTS (SELECT 1 FROM information_schema.columns WHERE ' + "table_name = 'users' AND column_name = 'age' AND table_schema = 'app') THEN 1 ELSE 0 END);" ); }); @@ -245,7 +245,7 @@ describe('verifyFor', () => { it('checks added constraints via information_schema.table_constraints', () => { expect(verify('ALTER TABLE app.users ADD CONSTRAINT age_ck CHECK (age > 0);').sql) .toEqual( - "SELECT 1/(CASE WHEN EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE " + + 'SELECT 1/(CASE WHEN EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE ' + "table_name = 'users' AND constraint_name = 'age_ck' AND table_schema = 'app') THEN 1 ELSE 0 END);" ); }); @@ -259,7 +259,7 @@ describe('verifyFor', () => { it('checks RLS via pg_class.relrowsecurity', () => { expect(verify('ALTER TABLE app.users ENABLE ROW LEVEL SECURITY;').sql) .toEqual( - "SELECT 1/(CASE WHEN EXISTS (SELECT 1 FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace " + + 'SELECT 1/(CASE WHEN EXISTS (SELECT 1 FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace ' + "WHERE c.relname = 'users' AND n.nspname = 'app' AND c.relrowsecurity) THEN 1 ELSE 0 END);" ); expect(verify('ALTER TABLE app.users FORCE ROW LEVEL SECURITY;').sql) @@ -288,9 +288,9 @@ describe('verifyFor', () => { it('checks role membership grants via pg_auth_members', () => { expect(verify('GRANT reader TO alice;').sql) .toEqual( - "SELECT 1/(CASE WHEN EXISTS (SELECT 1 FROM pg_auth_members m " + - "JOIN pg_roles granted ON granted.oid = m.roleid " + - "JOIN pg_roles member ON member.oid = m.member " + + 'SELECT 1/(CASE WHEN EXISTS (SELECT 1 FROM pg_auth_members m ' + + 'JOIN pg_roles granted ON granted.oid = m.roleid ' + + 'JOIN pg_roles member ON member.oid = m.member ' + "WHERE granted.rolname = 'reader' AND member.rolname = 'alice') THEN 1 ELSE 0 END);" ); }); @@ -304,7 +304,7 @@ describe('verifyFor', () => { it('emits nothing for comments and seed DML', () => { expect(verify("COMMENT ON TABLE app.users IS 'x';")).toEqual({ sql: '', warnings: [] }); - expect(verify("INSERT INTO app.users (id) VALUES (1);")).toEqual({ sql: '', warnings: [] }); + expect(verify('INSERT INTO app.users (id) VALUES (1);')).toEqual({ sql: '', warnings: [] }); }); it('quotes identifiers and escapes literals in generated checks', () => { @@ -407,9 +407,9 @@ describe('verifyFor — extended vocabulary', () => { }); it('checks foreign servers and user mappings via catalogs', () => { - expect(verify("CREATE SERVER films_server FOREIGN DATA WRAPPER postgres_fdw;").sql) + expect(verify('CREATE SERVER films_server FOREIGN DATA WRAPPER postgres_fdw;').sql) .toEqual("SELECT 1/(CASE WHEN EXISTS (SELECT 1 FROM pg_foreign_server WHERE srvname = 'films_server') THEN 1 ELSE 0 END);"); - expect(verify("CREATE USER MAPPING FOR bob SERVER films_server;").sql) + expect(verify('CREATE USER MAPPING FOR bob SERVER films_server;').sql) .toEqual("SELECT 1/(CASE WHEN EXISTS (SELECT 1 FROM pg_user_mappings WHERE srvname = 'films_server' AND usename = 'bob') THEN 1 ELSE 0 END);"); }); diff --git a/packages/scripts/src/invert.ts b/packages/scripts/src/invert.ts index 145b3bc4..28486433 100644 --- a/packages/scripts/src/invert.ts +++ b/packages/scripts/src/invert.ts @@ -134,231 +134,231 @@ function emitInverse(facts: StatementFacts, warnings: string[]): Emitted[] { } switch (facts.nodeTag) { - case 'CreateSchemaStmt': - return [{ stmt: dropStmt('OBJECT_SCHEMA', [strNode(node.schemaname)]) }]; - case 'CreateStmt': - return [{ stmt: dropStmt('OBJECT_TABLE', [{ List: { items: nameItems(node.relation) } }]) }]; - case 'CreateTableAsStmt': { - if (node.objtype !== 'OBJECT_MATVIEW' && node.objtype !== 'OBJECT_TABLE') { - return notDerivable(`no inverse known for CREATE ... AS with objtype ${node.objtype}`); - } - return [{ - stmt: dropStmt(node.objtype, [{ List: { items: nameItems(node.into.rel) } }]) - }]; - } - case 'ViewStmt': - return [{ stmt: dropStmt('OBJECT_VIEW', [{ List: { items: nameItems(node.view) } }]) }]; - case 'IndexStmt': { - const items: AnyNode[] = []; - if (node.relation?.schemaname) items.push(strNode(node.relation.schemaname)); - items.push(strNode(node.idxname)); - return [{ stmt: dropStmt('OBJECT_INDEX', [{ List: { items } }]) }]; - } - case 'CreateSeqStmt': - return [{ stmt: dropStmt('OBJECT_SEQUENCE', [{ List: { items: nameItems(node.sequence) } }]) }]; - case 'CompositeTypeStmt': - return [{ - stmt: dropStmt('OBJECT_TYPE', [{ TypeName: { names: nameItems(node.typevar), typemod: -1 } }]) - }]; - case 'CreateEnumStmt': - case 'CreateRangeStmt': - return [{ - stmt: dropStmt('OBJECT_TYPE', [{ TypeName: { names: clone(node.typeName), typemod: -1 } }]) - }]; - case 'CreateDomainStmt': - return [{ - stmt: dropStmt('OBJECT_DOMAIN', [{ TypeName: { names: clone(node.domainname), typemod: -1 } }]) - }]; - case 'CreateFunctionStmt': - return [{ - stmt: dropStmt( - node.is_procedure ? 'OBJECT_PROCEDURE' : 'OBJECT_FUNCTION', - [clone(functionObject(node))] - ) - }]; - case 'CreateTrigStmt': { - const items = [...nameItems(node.relation), strNode(node.trigname)]; - return [{ stmt: dropStmt('OBJECT_TRIGGER', [{ List: { items } }]) }]; + case 'CreateSchemaStmt': + return [{ stmt: dropStmt('OBJECT_SCHEMA', [strNode(node.schemaname)]) }]; + case 'CreateStmt': + return [{ stmt: dropStmt('OBJECT_TABLE', [{ List: { items: nameItems(node.relation) } }]) }]; + case 'CreateTableAsStmt': { + if (node.objtype !== 'OBJECT_MATVIEW' && node.objtype !== 'OBJECT_TABLE') { + return notDerivable(`no inverse known for CREATE ... AS with objtype ${node.objtype}`); } - case 'CreatePolicyStmt': { - const items = [...nameItems(node.table), strNode(node.policy_name)]; - return [{ stmt: dropStmt('OBJECT_POLICY', [{ List: { items } }]) }]; - } - case 'CreateExtensionStmt': - return [{ stmt: dropStmt('OBJECT_EXTENSION', [strNode(node.extname)]) }]; - case 'CreateForeignServerStmt': - return [{ stmt: dropStmt('OBJECT_FOREIGN_SERVER', [strNode(node.servername)]) }]; - case 'CreateForeignTableStmt': - return [{ - stmt: dropStmt('OBJECT_FOREIGN_TABLE', [{ List: { items: nameItems(node.base.relation) } }]) - }]; - case 'CreateUserMappingStmt': - return [{ - stmt: { - DropUserMappingStmt: { - user: clone(node.user), - servername: node.servername - } + return [{ + stmt: dropStmt(node.objtype, [{ List: { items: nameItems(node.into.rel) } }]) + }]; + } + case 'ViewStmt': + return [{ stmt: dropStmt('OBJECT_VIEW', [{ List: { items: nameItems(node.view) } }]) }]; + case 'IndexStmt': { + const items: AnyNode[] = []; + if (node.relation?.schemaname) items.push(strNode(node.relation.schemaname)); + items.push(strNode(node.idxname)); + return [{ stmt: dropStmt('OBJECT_INDEX', [{ List: { items } }]) }]; + } + case 'CreateSeqStmt': + return [{ stmt: dropStmt('OBJECT_SEQUENCE', [{ List: { items: nameItems(node.sequence) } }]) }]; + case 'CompositeTypeStmt': + return [{ + stmt: dropStmt('OBJECT_TYPE', [{ TypeName: { names: nameItems(node.typevar), typemod: -1 } }]) + }]; + case 'CreateEnumStmt': + case 'CreateRangeStmt': + return [{ + stmt: dropStmt('OBJECT_TYPE', [{ TypeName: { names: clone(node.typeName), typemod: -1 } }]) + }]; + case 'CreateDomainStmt': + return [{ + stmt: dropStmt('OBJECT_DOMAIN', [{ TypeName: { names: clone(node.domainname), typemod: -1 } }]) + }]; + case 'CreateFunctionStmt': + return [{ + stmt: dropStmt( + node.is_procedure ? 'OBJECT_PROCEDURE' : 'OBJECT_FUNCTION', + [clone(functionObject(node))] + ) + }]; + case 'CreateTrigStmt': { + const items = [...nameItems(node.relation), strNode(node.trigname)]; + return [{ stmt: dropStmt('OBJECT_TRIGGER', [{ List: { items } }]) }]; + } + case 'CreatePolicyStmt': { + const items = [...nameItems(node.table), strNode(node.policy_name)]; + return [{ stmt: dropStmt('OBJECT_POLICY', [{ List: { items } }]) }]; + } + case 'CreateExtensionStmt': + return [{ stmt: dropStmt('OBJECT_EXTENSION', [strNode(node.extname)]) }]; + case 'CreateForeignServerStmt': + return [{ stmt: dropStmt('OBJECT_FOREIGN_SERVER', [strNode(node.servername)]) }]; + case 'CreateForeignTableStmt': + return [{ + stmt: dropStmt('OBJECT_FOREIGN_TABLE', [{ List: { items: nameItems(node.base.relation) } }]) + }]; + case 'CreateUserMappingStmt': + return [{ + stmt: { + DropUserMappingStmt: { + user: clone(node.user), + servername: node.servername } - }]; - case 'DefineStmt': - return invertDefine(node, notDerivable); - case 'CreateCastStmt': - return [{ - stmt: dropStmt('OBJECT_CAST', [ - { List: { items: [{ TypeName: clone(node.sourcetype) }, { TypeName: clone(node.targettype) }] } } - ]) - }]; - case 'CreatePublicationStmt': - return [{ stmt: dropStmt('OBJECT_PUBLICATION', [strNode(node.pubname)]) }]; - case 'CreateSubscriptionStmt': - return [{ - stmt: { DropSubscriptionStmt: { subname: node.subname, behavior: 'DROP_RESTRICT' } } - }]; - case 'CreateStatsStmt': - return [{ - stmt: dropStmt('OBJECT_STATISTIC_EXT', [{ List: { items: clone(node.defnames) } }]) - }]; - case 'CreateEventTrigStmt': - return [{ stmt: dropStmt('OBJECT_EVENT_TRIGGER', [strNode(node.trigname)]) }]; - case 'RuleStmt': { - const items = [...nameItems(node.relation), strNode(node.rulename)]; - return [{ stmt: dropStmt('OBJECT_RULE', [{ List: { items } }]) }]; - } - case 'AlterEnumStmt': - return notDerivable( - `enum value ${JSON.stringify(node.newVal)} cannot be dropped (Postgres has no DROP VALUE)` - ); - case 'AlterDefaultPrivilegesStmt': { - if (node.action?.is_grant !== true) { - return notDerivable('ALTER DEFAULT PRIVILEGES REVOKE has no mechanical inverse (prior grants unknown)'); } - const inverted = clone(node); - delete inverted.action.is_grant; - delete inverted.action.grant_option; - delete inverted.action.grantor; - return [{ stmt: { AlterDefaultPrivilegesStmt: inverted } }]; - } - case 'SecLabelStmt': { - const nulled = clone(node); - delete nulled.label; - return [{ stmt: { SecLabelStmt: nulled } }]; + }]; + case 'DefineStmt': + return invertDefine(node, notDerivable); + case 'CreateCastStmt': + return [{ + stmt: dropStmt('OBJECT_CAST', [ + { List: { items: [{ TypeName: clone(node.sourcetype) }, { TypeName: clone(node.targettype) }] } } + ]) + }]; + case 'CreatePublicationStmt': + return [{ stmt: dropStmt('OBJECT_PUBLICATION', [strNode(node.pubname)]) }]; + case 'CreateSubscriptionStmt': + return [{ + stmt: { DropSubscriptionStmt: { subname: node.subname, behavior: 'DROP_RESTRICT' } } + }]; + case 'CreateStatsStmt': + return [{ + stmt: dropStmt('OBJECT_STATISTIC_EXT', [{ List: { items: clone(node.defnames) } }]) + }]; + case 'CreateEventTrigStmt': + return [{ stmt: dropStmt('OBJECT_EVENT_TRIGGER', [strNode(node.trigname)]) }]; + case 'RuleStmt': { + const items = [...nameItems(node.relation), strNode(node.rulename)]; + return [{ stmt: dropStmt('OBJECT_RULE', [{ List: { items } }]) }]; + } + case 'AlterEnumStmt': + return notDerivable( + `enum value ${JSON.stringify(node.newVal)} cannot be dropped (Postgres has no DROP VALUE)` + ); + case 'AlterDefaultPrivilegesStmt': { + if (node.action?.is_grant !== true) { + return notDerivable('ALTER DEFAULT PRIVILEGES REVOKE has no mechanical inverse (prior grants unknown)'); } - case 'CreateFdwStmt': - return [{ stmt: dropStmt('OBJECT_FDW', [strNode(node.fdwname)]) }]; - case 'CreateConversionStmt': - return [{ - stmt: dropStmt('OBJECT_CONVERSION', [{ List: { items: clone(node.conversion_name) } }]) - }]; - case 'CreateAmStmt': - return [{ stmt: dropStmt('OBJECT_ACCESS_METHOD', [strNode(node.amname)]) }]; - case 'CreateTransformStmt': - return [{ - stmt: dropStmt('OBJECT_TRANSFORM', [ - { List: { items: [{ TypeName: clone(node.type_name) }, strNode(node.lang)] } } - ]) - }]; - case 'CreateOpClassStmt': - return [{ - stmt: dropStmt('OBJECT_OPCLASS', [ - { List: { items: [strNode(node.amname), ...clone(node.opclassname)] } } - ]) - }]; - case 'CreateOpFamilyStmt': - return [{ - stmt: dropStmt('OBJECT_OPFAMILY', [ - { List: { items: [strNode(node.amname), ...clone(node.opfamilyname)] } } - ]) - }]; - case 'CreateTableSpaceStmt': - return [{ stmt: { DropTableSpaceStmt: { tablespacename: node.tablespacename } } }]; - case 'RenameStmt': - return invertRename(node, notDerivable); - case 'AlterObjectSchemaStmt': - return invertSetSchema(node, notDerivable); - case 'CreateRoleStmt': - return [{ - stmt: { - DropRoleStmt: { - roles: [{ RoleSpec: { roletype: 'ROLESPEC_CSTRING', rolename: node.role } }] - } + const inverted = clone(node); + delete inverted.action.is_grant; + delete inverted.action.grant_option; + delete inverted.action.grantor; + return [{ stmt: { AlterDefaultPrivilegesStmt: inverted } }]; + } + case 'SecLabelStmt': { + const nulled = clone(node); + delete nulled.label; + return [{ stmt: { SecLabelStmt: nulled } }]; + } + case 'CreateFdwStmt': + return [{ stmt: dropStmt('OBJECT_FDW', [strNode(node.fdwname)]) }]; + case 'CreateConversionStmt': + return [{ + stmt: dropStmt('OBJECT_CONVERSION', [{ List: { items: clone(node.conversion_name) } }]) + }]; + case 'CreateAmStmt': + return [{ stmt: dropStmt('OBJECT_ACCESS_METHOD', [strNode(node.amname)]) }]; + case 'CreateTransformStmt': + return [{ + stmt: dropStmt('OBJECT_TRANSFORM', [ + { List: { items: [{ TypeName: clone(node.type_name) }, strNode(node.lang)] } } + ]) + }]; + case 'CreateOpClassStmt': + return [{ + stmt: dropStmt('OBJECT_OPCLASS', [ + { List: { items: [strNode(node.amname), ...clone(node.opclassname)] } } + ]) + }]; + case 'CreateOpFamilyStmt': + return [{ + stmt: dropStmt('OBJECT_OPFAMILY', [ + { List: { items: [strNode(node.amname), ...clone(node.opfamilyname)] } } + ]) + }]; + case 'CreateTableSpaceStmt': + return [{ stmt: { DropTableSpaceStmt: { tablespacename: node.tablespacename } } }]; + case 'RenameStmt': + return invertRename(node, notDerivable); + case 'AlterObjectSchemaStmt': + return invertSetSchema(node, notDerivable); + case 'CreateRoleStmt': + return [{ + stmt: { + DropRoleStmt: { + roles: [{ RoleSpec: { roletype: 'ROLESPEC_CSTRING', rolename: node.role } }] } - }]; - case 'GrantStmt': { - if (node.is_grant !== true) { - return notDerivable('REVOKE has no mechanical inverse (prior grants unknown)'); } - const revoke = clone(node); - delete revoke.is_grant; - delete revoke.grant_option; - delete revoke.grantor; - return [{ stmt: { GrantStmt: revoke } }]; + }]; + case 'GrantStmt': { + if (node.is_grant !== true) { + return notDerivable('REVOKE has no mechanical inverse (prior grants unknown)'); } - case 'GrantRoleStmt': { - if (node.is_grant !== true) { - return notDerivable('REVOKE has no mechanical inverse (prior grants unknown)'); - } - const revoke = clone(node); - delete revoke.is_grant; - delete revoke.opt; - delete revoke.grantor; - return [{ stmt: { GrantRoleStmt: revoke } }]; - } - case 'CommentStmt': { - const nulled = clone(node); - delete nulled.comment; - return [{ stmt: { CommentStmt: nulled } }]; + const revoke = clone(node); + delete revoke.is_grant; + delete revoke.grant_option; + delete revoke.grantor; + return [{ stmt: { GrantStmt: revoke } }]; + } + case 'GrantRoleStmt': { + if (node.is_grant !== true) { + return notDerivable('REVOKE has no mechanical inverse (prior grants unknown)'); } - case 'AlterTableStmt': - return invertAlterTable(node, warnings); - case 'InsertStmt': - case 'UpdateStmt': - case 'DeleteStmt': - return notDerivable('DML is not mechanically invertible'); - default: - return notDerivable(`no inverse known for ${facts.nodeTag}`); + const revoke = clone(node); + delete revoke.is_grant; + delete revoke.opt; + delete revoke.grantor; + return [{ stmt: { GrantRoleStmt: revoke } }]; + } + case 'CommentStmt': { + const nulled = clone(node); + delete nulled.comment; + return [{ stmt: { CommentStmt: nulled } }]; + } + case 'AlterTableStmt': + return invertAlterTable(node, warnings); + case 'InsertStmt': + case 'UpdateStmt': + case 'DeleteStmt': + return notDerivable('DML is not mechanically invertible'); + default: + return notDerivable(`no inverse known for ${facts.nodeTag}`); } } /** Inverses for `DefineStmt` objects: collations, aggregates, operators. */ function invertDefine(node: AnyNode, notDerivable: (reason: string) => Emitted[]): Emitted[] { switch (node.kind) { - case 'OBJECT_COLLATION': - return [{ - stmt: dropStmt('OBJECT_COLLATION', [{ List: { items: clone(node.defnames) } }]) - }]; - case 'OBJECT_AGGREGATE': { - const objargs = defineArgs(node).map((p: AnyNode) => ({ TypeName: clone(p.argType) })); - return [{ - stmt: dropStmt('OBJECT_AGGREGATE', [{ - ObjectWithArgs: { objname: clone(node.defnames), objargs, args_unspecified: false } - }]) - }]; - } - case 'OBJECT_OPERATOR': { - const left = defElem(node.definition, 'leftarg'); - const right = defElem(node.definition, 'rightarg'); - if (!left?.arg?.TypeName || !right?.arg?.TypeName) { - return notDerivable('prefix operators are not supported (binary LEFTARG/RIGHTARG required)'); - } - return [{ - stmt: dropStmt('OBJECT_OPERATOR', [{ - ObjectWithArgs: { - objname: clone(node.defnames), - objargs: [{ TypeName: clone(left.arg.TypeName) }, { TypeName: clone(right.arg.TypeName) }] - } - }]) - }]; + case 'OBJECT_COLLATION': + return [{ + stmt: dropStmt('OBJECT_COLLATION', [{ List: { items: clone(node.defnames) } }]) + }]; + case 'OBJECT_AGGREGATE': { + const objargs = defineArgs(node).map((p: AnyNode) => ({ TypeName: clone(p.argType) })); + return [{ + stmt: dropStmt('OBJECT_AGGREGATE', [{ + ObjectWithArgs: { objname: clone(node.defnames), objargs, args_unspecified: false } + }]) + }]; + } + case 'OBJECT_OPERATOR': { + const left = defElem(node.definition, 'leftarg'); + const right = defElem(node.definition, 'rightarg'); + if (!left?.arg?.TypeName || !right?.arg?.TypeName) { + return notDerivable('prefix operators are not supported (binary LEFTARG/RIGHTARG required)'); } - case 'OBJECT_TSCONFIGURATION': - case 'OBJECT_TSDICTIONARY': - case 'OBJECT_TSPARSER': - case 'OBJECT_TSTEMPLATE': - return [{ - stmt: dropStmt(node.kind, [{ List: { items: clone(node.defnames) } }]) - }]; - default: - return notDerivable(`no inverse known for CREATE (DefineStmt) with kind ${node.kind}`); + return [{ + stmt: dropStmt('OBJECT_OPERATOR', [{ + ObjectWithArgs: { + objname: clone(node.defnames), + objargs: [{ TypeName: clone(left.arg.TypeName) }, { TypeName: clone(right.arg.TypeName) }] + } + }]) + }]; + } + case 'OBJECT_TSCONFIGURATION': + case 'OBJECT_TSDICTIONARY': + case 'OBJECT_TSPARSER': + case 'OBJECT_TSTEMPLATE': + return [{ + stmt: dropStmt(node.kind, [{ List: { items: clone(node.defnames) } }]) + }]; + default: + return notDerivable(`no inverse known for CREATE (DefineStmt) with kind ${node.kind}`); } } @@ -369,39 +369,39 @@ function invertDefine(node: AnyNode, notDerivable: (reason: string) => Emitted[] function invertRename(node: AnyNode, notDerivable: (reason: string) => Emitted[]): Emitted[] { const inverted = clone(node); switch (node.renameType) { - case 'OBJECT_TABLE': - case 'OBJECT_INDEX': - case 'OBJECT_SEQUENCE': - case 'OBJECT_VIEW': - case 'OBJECT_MATVIEW': - case 'OBJECT_FOREIGN_TABLE': - inverted.relation.relname = node.newname; - inverted.newname = node.relation.relname; - break; - case 'OBJECT_COLUMN': - case 'OBJECT_SCHEMA': - inverted.subname = node.newname; - inverted.newname = node.subname; - break; - case 'OBJECT_TYPE': - case 'OBJECT_DOMAIN': { - const items = inverted.object?.List?.items; - if (!items?.length) return notDerivable(`RENAME ${node.renameType} without a qualified name`); - inverted.newname = items[items.length - 1].String.sval; - items[items.length - 1] = strNode(node.newname); - break; - } - case 'OBJECT_FUNCTION': - case 'OBJECT_PROCEDURE': - case 'OBJECT_AGGREGATE': { - const objname = inverted.object?.ObjectWithArgs?.objname; - if (!objname?.length) return notDerivable(`RENAME ${node.renameType} without a function name`); - inverted.newname = objname[objname.length - 1].String.sval; - objname[objname.length - 1] = strNode(node.newname); - break; - } - default: - return notDerivable(`no inverse known for RENAME ${node.renameType}`); + case 'OBJECT_TABLE': + case 'OBJECT_INDEX': + case 'OBJECT_SEQUENCE': + case 'OBJECT_VIEW': + case 'OBJECT_MATVIEW': + case 'OBJECT_FOREIGN_TABLE': + inverted.relation.relname = node.newname; + inverted.newname = node.relation.relname; + break; + case 'OBJECT_COLUMN': + case 'OBJECT_SCHEMA': + inverted.subname = node.newname; + inverted.newname = node.subname; + break; + case 'OBJECT_TYPE': + case 'OBJECT_DOMAIN': { + const items = inverted.object?.List?.items; + if (!items?.length) return notDerivable(`RENAME ${node.renameType} without a qualified name`); + inverted.newname = items[items.length - 1].String.sval; + items[items.length - 1] = strNode(node.newname); + break; + } + case 'OBJECT_FUNCTION': + case 'OBJECT_PROCEDURE': + case 'OBJECT_AGGREGATE': { + const objname = inverted.object?.ObjectWithArgs?.objname; + if (!objname?.length) return notDerivable(`RENAME ${node.renameType} without a function name`); + inverted.newname = objname[objname.length - 1].String.sval; + objname[objname.length - 1] = strNode(node.newname); + break; + } + default: + return notDerivable(`no inverse known for RENAME ${node.renameType}`); } return [{ stmt: { RenameStmt: inverted } }]; } @@ -459,47 +459,47 @@ function invertAlterTable(node: AnyNode, warnings: string[]): Emitted[] { const cmd = wrapped?.AlterTableCmd; if (!cmd) continue; switch (cmd.subtype) { - case 'AT_AddColumn': - out.push(alterWith({ - subtype: 'AT_DropColumn', - name: cmd.def?.ColumnDef?.colname, - behavior: 'DROP_RESTRICT' - })); - break; - case 'AT_AddConstraint': { - const conname = cmd.def?.Constraint?.conname; - if (!conname) { - out.push(notDerivable(`unnamed constraint on ${table} (Postgres assigns the name at deploy time)`)); - break; - } - out.push(alterWith({ - subtype: 'AT_DropConstraint', - name: conname, - behavior: 'DROP_RESTRICT' - })); + case 'AT_AddColumn': + out.push(alterWith({ + subtype: 'AT_DropColumn', + name: cmd.def?.ColumnDef?.colname, + behavior: 'DROP_RESTRICT' + })); + break; + case 'AT_AddConstraint': { + const conname = cmd.def?.Constraint?.conname; + if (!conname) { + out.push(notDerivable(`unnamed constraint on ${table} (Postgres assigns the name at deploy time)`)); break; } - case 'AT_EnableRowSecurity': - out.push(alterWith({ subtype: 'AT_DisableRowSecurity' })); - break; - case 'AT_ForceRowSecurity': - out.push(alterWith({ subtype: 'AT_NoForceRowSecurity' })); - break; - case 'AT_AttachPartition': { - const partition = cmd.def?.PartitionCmd?.name; - if (!partition) { - out.push(notDerivable(`ATTACH PARTITION on ${table} without a partition name`)); - break; - } - out.push(alterWith({ - subtype: 'AT_DetachPartition', - def: { PartitionCmd: { name: { RangeVar: clone(partition) } } }, - behavior: 'DROP_RESTRICT' - })); + out.push(alterWith({ + subtype: 'AT_DropConstraint', + name: conname, + behavior: 'DROP_RESTRICT' + })); + break; + } + case 'AT_EnableRowSecurity': + out.push(alterWith({ subtype: 'AT_DisableRowSecurity' })); + break; + case 'AT_ForceRowSecurity': + out.push(alterWith({ subtype: 'AT_NoForceRowSecurity' })); + break; + case 'AT_AttachPartition': { + const partition = cmd.def?.PartitionCmd?.name; + if (!partition) { + out.push(notDerivable(`ATTACH PARTITION on ${table} without a partition name`)); break; } - default: - out.push(notDerivable(`ALTER TABLE ${table} ${cmd.subtype} (prior state unknown)`)); + out.push(alterWith({ + subtype: 'AT_DetachPartition', + def: { PartitionCmd: { name: { RangeVar: clone(partition) } } }, + behavior: 'DROP_RESTRICT' + })); + break; + } + default: + out.push(notDerivable(`ALTER TABLE ${table} ${cmd.subtype} (prior state unknown)`)); } } return out; @@ -547,174 +547,174 @@ function emitChecks(facts: StatementFacts, warnings: string[]): string[] { } switch (facts.nodeTag) { - case 'CreateSchemaStmt': - return [check( - `EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = ${lit(node.schemaname)})` - )]; - case 'CreateStmt': - return [check(`to_regclass(${lit(qname(node.relation.schemaname, node.relation.relname))}) IS NOT NULL`)]; - case 'ViewStmt': - return [check(`to_regclass(${lit(qname(node.view.schemaname, node.view.relname))}) IS NOT NULL`)]; - case 'CreateSeqStmt': - return [check(`to_regclass(${lit(qname(node.sequence.schemaname, node.sequence.relname))}) IS NOT NULL`)]; - case 'IndexStmt': - return [check(`to_regclass(${lit(qname(node.relation?.schemaname, node.idxname))}) IS NOT NULL`)]; - case 'CompositeTypeStmt': - return [check(`to_regtype(${lit(qname(node.typevar.schemaname, node.typevar.relname))}) IS NOT NULL`)]; - case 'CreateEnumStmt': - case 'CreateRangeStmt': { - const created = facts.creates[0]; - if (!created) return notDerivable(`no created type recorded for ${facts.nodeTag}`); - return [check(`to_regtype(${lit(qname(created.schema, created.name))}) IS NOT NULL`)]; - } - case 'CreateDomainStmt': { - const created = facts.creates[0]; - if (!created) return notDerivable('no created domain recorded'); - return [check(`to_regtype(${lit(qname(created.schema, created.name))}) IS NOT NULL`)]; - } - case 'CreateFunctionStmt': - return [check(`to_regprocedure(${lit(functionSignatureText(node))}) IS NOT NULL`)]; - case 'CreateTrigStmt': { - const table = qname(node.relation.schemaname, node.relation.relname); - return [check( - `EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = ${lit(node.trigname)} ` + + case 'CreateSchemaStmt': + return [check( + `EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = ${lit(node.schemaname)})` + )]; + case 'CreateStmt': + return [check(`to_regclass(${lit(qname(node.relation.schemaname, node.relation.relname))}) IS NOT NULL`)]; + case 'ViewStmt': + return [check(`to_regclass(${lit(qname(node.view.schemaname, node.view.relname))}) IS NOT NULL`)]; + case 'CreateSeqStmt': + return [check(`to_regclass(${lit(qname(node.sequence.schemaname, node.sequence.relname))}) IS NOT NULL`)]; + case 'IndexStmt': + return [check(`to_regclass(${lit(qname(node.relation?.schemaname, node.idxname))}) IS NOT NULL`)]; + case 'CompositeTypeStmt': + return [check(`to_regtype(${lit(qname(node.typevar.schemaname, node.typevar.relname))}) IS NOT NULL`)]; + case 'CreateEnumStmt': + case 'CreateRangeStmt': { + const created = facts.creates[0]; + if (!created) return notDerivable(`no created type recorded for ${facts.nodeTag}`); + return [check(`to_regtype(${lit(qname(created.schema, created.name))}) IS NOT NULL`)]; + } + case 'CreateDomainStmt': { + const created = facts.creates[0]; + if (!created) return notDerivable('no created domain recorded'); + return [check(`to_regtype(${lit(qname(created.schema, created.name))}) IS NOT NULL`)]; + } + case 'CreateFunctionStmt': + return [check(`to_regprocedure(${lit(functionSignatureText(node))}) IS NOT NULL`)]; + case 'CreateTrigStmt': { + const table = qname(node.relation.schemaname, node.relation.relname); + return [check( + `EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = ${lit(node.trigname)} ` + `AND tgrelid = ${lit(table)}::regclass AND NOT tgisinternal)` - )]; - } - case 'CreatePolicyStmt': { - const conds = [`policyname = ${lit(node.policy_name)}`, `tablename = ${lit(node.table.relname)}`]; - if (node.table.schemaname) conds.push(`schemaname = ${lit(node.table.schemaname)}`); - return [check(`EXISTS (SELECT 1 FROM pg_policies WHERE ${conds.join(' AND ')})`)]; - } - case 'CreateExtensionStmt': - return [check(`EXISTS (SELECT 1 FROM pg_extension WHERE extname = ${lit(node.extname)})`)]; - case 'CreateRoleStmt': - return [check(`EXISTS (SELECT 1 FROM pg_roles WHERE rolname = ${lit(node.role)})`)]; - case 'CreateTableAsStmt': { - if (node.objtype !== 'OBJECT_MATVIEW' && node.objtype !== 'OBJECT_TABLE') { - return notDerivable(`no existence check known for CREATE ... AS with objtype ${node.objtype}`); - } - return [check(`to_regclass(${lit(qname(node.into.rel.schemaname, node.into.rel.relname))}) IS NOT NULL`)]; + )]; + } + case 'CreatePolicyStmt': { + const conds = [`policyname = ${lit(node.policy_name)}`, `tablename = ${lit(node.table.relname)}`]; + if (node.table.schemaname) conds.push(`schemaname = ${lit(node.table.schemaname)}`); + return [check(`EXISTS (SELECT 1 FROM pg_policies WHERE ${conds.join(' AND ')})`)]; + } + case 'CreateExtensionStmt': + return [check(`EXISTS (SELECT 1 FROM pg_extension WHERE extname = ${lit(node.extname)})`)]; + case 'CreateRoleStmt': + return [check(`EXISTS (SELECT 1 FROM pg_roles WHERE rolname = ${lit(node.role)})`)]; + case 'CreateTableAsStmt': { + if (node.objtype !== 'OBJECT_MATVIEW' && node.objtype !== 'OBJECT_TABLE') { + return notDerivable(`no existence check known for CREATE ... AS with objtype ${node.objtype}`); } - case 'CreateForeignServerStmt': - return [check(`EXISTS (SELECT 1 FROM pg_foreign_server WHERE srvname = ${lit(node.servername)})`)]; - case 'CreateForeignTableStmt': - return [check( - `to_regclass(${lit(qname(node.base.relation.schemaname, node.base.relation.relname))}) IS NOT NULL` - )]; - case 'CreateUserMappingStmt': { - const user = node.user?.roletype === 'ROLESPEC_PUBLIC' ? 'public' : node.user?.rolename; - if (!user) return notDerivable('CREATE USER MAPPING without a resolvable user'); - return [check( - `EXISTS (SELECT 1 FROM pg_user_mappings WHERE srvname = ${lit(node.servername)} ` + + return [check(`to_regclass(${lit(qname(node.into.rel.schemaname, node.into.rel.relname))}) IS NOT NULL`)]; + } + case 'CreateForeignServerStmt': + return [check(`EXISTS (SELECT 1 FROM pg_foreign_server WHERE srvname = ${lit(node.servername)})`)]; + case 'CreateForeignTableStmt': + return [check( + `to_regclass(${lit(qname(node.base.relation.schemaname, node.base.relation.relname))}) IS NOT NULL` + )]; + case 'CreateUserMappingStmt': { + const user = node.user?.roletype === 'ROLESPEC_PUBLIC' ? 'public' : node.user?.rolename; + if (!user) return notDerivable('CREATE USER MAPPING without a resolvable user'); + return [check( + `EXISTS (SELECT 1 FROM pg_user_mappings WHERE srvname = ${lit(node.servername)} ` + `AND usename = ${lit(user)})` - )]; - } - case 'DefineStmt': - return verifyDefine(node, notDerivable); - case 'CreateCastStmt': { - const source = Deparser.deparse({ TypeName: node.sourcetype }); - const target = Deparser.deparse({ TypeName: node.targettype }); - return [check( - `EXISTS (SELECT 1 FROM pg_cast WHERE castsource = ${lit(source)}::regtype ` + + )]; + } + case 'DefineStmt': + return verifyDefine(node, notDerivable); + case 'CreateCastStmt': { + const source = Deparser.deparse({ TypeName: node.sourcetype }); + const target = Deparser.deparse({ TypeName: node.targettype }); + return [check( + `EXISTS (SELECT 1 FROM pg_cast WHERE castsource = ${lit(source)}::regtype ` + `AND casttarget = ${lit(target)}::regtype)` - )]; - } - case 'CreatePublicationStmt': - return [check(`EXISTS (SELECT 1 FROM pg_publication WHERE pubname = ${lit(node.pubname)})`)]; - case 'CreateSubscriptionStmt': - return [check(`EXISTS (SELECT 1 FROM pg_subscription WHERE subname = ${lit(node.subname)})`)]; - case 'CreateStatsStmt': - return [check( - `EXISTS (SELECT 1 FROM pg_statistic_ext s JOIN pg_namespace n ON n.oid = s.stxnamespace ` + + )]; + } + case 'CreatePublicationStmt': + return [check(`EXISTS (SELECT 1 FROM pg_publication WHERE pubname = ${lit(node.pubname)})`)]; + case 'CreateSubscriptionStmt': + return [check(`EXISTS (SELECT 1 FROM pg_subscription WHERE subname = ${lit(node.subname)})`)]; + case 'CreateStatsStmt': + return [check( + `EXISTS (SELECT 1 FROM pg_statistic_ext s JOIN pg_namespace n ON n.oid = s.stxnamespace ` + `WHERE s.stxname = ${lit(defNameOnly(node.defnames))}${defNamespaceCond(node.defnames)})` - )]; - case 'CreateEventTrigStmt': - return [check(`EXISTS (SELECT 1 FROM pg_event_trigger WHERE evtname = ${lit(node.trigname)})`)]; - case 'RuleStmt': { - const conds = [`rulename = ${lit(node.rulename)}`, `tablename = ${lit(node.relation.relname)}`]; - if (node.relation.schemaname) conds.push(`schemaname = ${lit(node.relation.schemaname)}`); - return [check(`EXISTS (SELECT 1 FROM pg_rules WHERE ${conds.join(' AND ')})`)]; - } - case 'AlterEnumStmt': { - if (!node.newVal) return notDerivable('ALTER TYPE without ADD VALUE has nothing to verify'); - return [check( - `EXISTS (SELECT 1 FROM pg_enum WHERE enumtypid = ${lit(nameListText(node.typeName))}::regtype ` + + )]; + case 'CreateEventTrigStmt': + return [check(`EXISTS (SELECT 1 FROM pg_event_trigger WHERE evtname = ${lit(node.trigname)})`)]; + case 'RuleStmt': { + const conds = [`rulename = ${lit(node.rulename)}`, `tablename = ${lit(node.relation.relname)}`]; + if (node.relation.schemaname) conds.push(`schemaname = ${lit(node.relation.schemaname)}`); + return [check(`EXISTS (SELECT 1 FROM pg_rules WHERE ${conds.join(' AND ')})`)]; + } + case 'AlterEnumStmt': { + if (!node.newVal) return notDerivable('ALTER TYPE without ADD VALUE has nothing to verify'); + return [check( + `EXISTS (SELECT 1 FROM pg_enum WHERE enumtypid = ${lit(nameListText(node.typeName))}::regtype ` + `AND enumlabel = ${lit(node.newVal)})` - )]; - } - case 'AlterDefaultPrivilegesStmt': - return verifyDefaultPrivileges(node, warnings); - case 'CreateFdwStmt': - return [check(`EXISTS (SELECT 1 FROM pg_foreign_data_wrapper WHERE fdwname = ${lit(node.fdwname)})`)]; - case 'CreateConversionStmt': - return [check( - `EXISTS (SELECT 1 FROM pg_conversion c JOIN pg_namespace n ON n.oid = c.connamespace ` + + )]; + } + case 'AlterDefaultPrivilegesStmt': + return verifyDefaultPrivileges(node, warnings); + case 'CreateFdwStmt': + return [check(`EXISTS (SELECT 1 FROM pg_foreign_data_wrapper WHERE fdwname = ${lit(node.fdwname)})`)]; + case 'CreateConversionStmt': + return [check( + `EXISTS (SELECT 1 FROM pg_conversion c JOIN pg_namespace n ON n.oid = c.connamespace ` + `WHERE c.conname = ${lit(defNameOnly(node.conversion_name))}${defNamespaceCond(node.conversion_name)})` - )]; - case 'CreateAmStmt': - return [check(`EXISTS (SELECT 1 FROM pg_am WHERE amname = ${lit(node.amname)})`)]; - case 'CreateTransformStmt': { - const type = Deparser.deparse({ TypeName: node.type_name }); - return [check( - `EXISTS (SELECT 1 FROM pg_transform t JOIN pg_language l ON l.oid = t.trflang ` + + )]; + case 'CreateAmStmt': + return [check(`EXISTS (SELECT 1 FROM pg_am WHERE amname = ${lit(node.amname)})`)]; + case 'CreateTransformStmt': { + const type = Deparser.deparse({ TypeName: node.type_name }); + return [check( + `EXISTS (SELECT 1 FROM pg_transform t JOIN pg_language l ON l.oid = t.trflang ` + `WHERE t.trftype = ${lit(type)}::regtype AND l.lanname = ${lit(node.lang)})` - )]; - } - case 'CreateOpClassStmt': - return [check( - `EXISTS (SELECT 1 FROM pg_opclass c JOIN pg_am am ON am.oid = c.opcmethod ` + + )]; + } + case 'CreateOpClassStmt': + return [check( + `EXISTS (SELECT 1 FROM pg_opclass c JOIN pg_am am ON am.oid = c.opcmethod ` + `JOIN pg_namespace n ON n.oid = c.opcnamespace ` + `WHERE c.opcname = ${lit(defNameOnly(node.opclassname))} AND am.amname = ${lit(node.amname)}` + `${defNamespaceCond(node.opclassname)})` - )]; - case 'CreateOpFamilyStmt': - return [check( - `EXISTS (SELECT 1 FROM pg_opfamily f JOIN pg_am am ON am.oid = f.opfmethod ` + + )]; + case 'CreateOpFamilyStmt': + return [check( + `EXISTS (SELECT 1 FROM pg_opfamily f JOIN pg_am am ON am.oid = f.opfmethod ` + `JOIN pg_namespace n ON n.oid = f.opfnamespace ` + `WHERE f.opfname = ${lit(defNameOnly(node.opfamilyname))} AND am.amname = ${lit(node.amname)}` + `${defNamespaceCond(node.opfamilyname)})` - )]; - case 'CreateTableSpaceStmt': - return [check(`EXISTS (SELECT 1 FROM pg_tablespace WHERE spcname = ${lit(node.tablespacename)})`)]; - case 'RenameStmt': - return verifyRename(node, notDerivable); - case 'AlterObjectSchemaStmt': - return verifySetSchema(node, notDerivable); - case 'SecLabelStmt': - // Like comments: metadata only, nothing comes into existence. - return []; - case 'GrantStmt': - return verifyGrant(node, warnings); - case 'GrantRoleStmt': { - if (node.is_grant !== true) return []; - const out: string[] = []; - for (const granted of node.granted_roles ?? []) { - const roleName = granted?.AccessPriv?.priv_name; - if (!roleName) continue; - for (const grantee of node.grantee_roles ?? []) { - const member = grantee?.RoleSpec?.rolename; - if (!member) continue; - out.push(check( - `EXISTS (SELECT 1 FROM pg_auth_members m ` + + )]; + case 'CreateTableSpaceStmt': + return [check(`EXISTS (SELECT 1 FROM pg_tablespace WHERE spcname = ${lit(node.tablespacename)})`)]; + case 'RenameStmt': + return verifyRename(node, notDerivable); + case 'AlterObjectSchemaStmt': + return verifySetSchema(node, notDerivable); + case 'SecLabelStmt': + // Like comments: metadata only, nothing comes into existence. + return []; + case 'GrantStmt': + return verifyGrant(node, warnings); + case 'GrantRoleStmt': { + if (node.is_grant !== true) return []; + const out: string[] = []; + for (const granted of node.granted_roles ?? []) { + const roleName = granted?.AccessPriv?.priv_name; + if (!roleName) continue; + for (const grantee of node.grantee_roles ?? []) { + const member = grantee?.RoleSpec?.rolename; + if (!member) continue; + out.push(check( + `EXISTS (SELECT 1 FROM pg_auth_members m ` + `JOIN pg_roles granted ON granted.oid = m.roleid ` + `JOIN pg_roles member ON member.oid = m.member ` + `WHERE granted.rolname = ${lit(roleName)} AND member.rolname = ${lit(member)})` - )); - } + )); } - return out; } - case 'AlterTableStmt': - return verifyAlterTable(node, warnings); - case 'CommentStmt': - case 'InsertStmt': - case 'UpdateStmt': - case 'DeleteStmt': - // No object comes into existence; nothing to verify. - return []; - default: - return notDerivable(`no existence check known for ${facts.nodeTag}`); + return out; + } + case 'AlterTableStmt': + return verifyAlterTable(node, warnings); + case 'CommentStmt': + case 'InsertStmt': + case 'UpdateStmt': + case 'DeleteStmt': + // No object comes into existence; nothing to verify. + return []; + default: + return notDerivable(`no existence check known for ${facts.nodeTag}`); } } @@ -737,138 +737,138 @@ const defNamespaceCond = (defnames: AnyNode[] | undefined): string => { /** Existence checks for DefineStmt objects: collations, aggregates, operators. */ function verifyDefine(node: AnyNode, notDerivable: (reason: string) => string[]): string[] { switch (node.kind) { - case 'OBJECT_COLLATION': - return [check( - `EXISTS (SELECT 1 FROM pg_collation c JOIN pg_namespace n ON n.oid = c.collnamespace ` + + case 'OBJECT_COLLATION': + return [check( + `EXISTS (SELECT 1 FROM pg_collation c JOIN pg_namespace n ON n.oid = c.collnamespace ` + `WHERE c.collname = ${lit(defNameOnly(node.defnames))}${defNamespaceCond(node.defnames)})` - )]; - case 'OBJECT_AGGREGATE': { - const args = defineArgs(node).map((p: AnyNode) => Deparser.deparse({ TypeName: p.argType })); - const signature = `${nameListText(node.defnames)}(${args.join(', ')})`; - return [check(`to_regprocedure(${lit(signature)}) IS NOT NULL`)]; + )]; + case 'OBJECT_AGGREGATE': { + const args = defineArgs(node).map((p: AnyNode) => Deparser.deparse({ TypeName: p.argType })); + const signature = `${nameListText(node.defnames)}(${args.join(', ')})`; + return [check(`to_regprocedure(${lit(signature)}) IS NOT NULL`)]; + } + case 'OBJECT_OPERATOR': { + const left = defElem(node.definition, 'leftarg'); + const right = defElem(node.definition, 'rightarg'); + if (!left?.arg?.TypeName || !right?.arg?.TypeName) { + return notDerivable('prefix operators are not supported (binary LEFTARG/RIGHTARG required)'); } - case 'OBJECT_OPERATOR': { - const left = defElem(node.definition, 'leftarg'); - const right = defElem(node.definition, 'rightarg'); - if (!left?.arg?.TypeName || !right?.arg?.TypeName) { - return notDerivable('prefix operators are not supported (binary LEFTARG/RIGHTARG required)'); - } - const args = [left.arg.TypeName, right.arg.TypeName] - .map((t: AnyNode) => Deparser.deparse({ TypeName: t })); + const args = [left.arg.TypeName, right.arg.TypeName] + .map((t: AnyNode) => Deparser.deparse({ TypeName: t })); // Operator names are not identifiers: never quote them. - const parts = (node.defnames ?? []) - .map((n: AnyNode) => n?.String?.sval) - .filter((s: any) => typeof s === 'string'); - const op = parts[parts.length - 1] ?? ''; - const qualified = parts.length > 1 ? `${qname(null, parts[parts.length - 2])}.${op}` : op; - return [check(`to_regoperator(${lit(`${qualified}(${args.join(', ')})`)}) IS NOT NULL`)]; - } - case 'OBJECT_TSCONFIGURATION': - return [check( - `EXISTS (SELECT 1 FROM pg_ts_config c JOIN pg_namespace n ON n.oid = c.cfgnamespace ` + + const parts = (node.defnames ?? []) + .map((n: AnyNode) => n?.String?.sval) + .filter((s: any) => typeof s === 'string'); + const op = parts[parts.length - 1] ?? ''; + const qualified = parts.length > 1 ? `${qname(null, parts[parts.length - 2])}.${op}` : op; + return [check(`to_regoperator(${lit(`${qualified}(${args.join(', ')})`)}) IS NOT NULL`)]; + } + case 'OBJECT_TSCONFIGURATION': + return [check( + `EXISTS (SELECT 1 FROM pg_ts_config c JOIN pg_namespace n ON n.oid = c.cfgnamespace ` + `WHERE c.cfgname = ${lit(defNameOnly(node.defnames))}${defNamespaceCond(node.defnames)})` - )]; - case 'OBJECT_TSDICTIONARY': - return [check( - `EXISTS (SELECT 1 FROM pg_ts_dict d JOIN pg_namespace n ON n.oid = d.dictnamespace ` + + )]; + case 'OBJECT_TSDICTIONARY': + return [check( + `EXISTS (SELECT 1 FROM pg_ts_dict d JOIN pg_namespace n ON n.oid = d.dictnamespace ` + `WHERE d.dictname = ${lit(defNameOnly(node.defnames))}${defNamespaceCond(node.defnames)})` - )]; - case 'OBJECT_TSPARSER': - return [check( - `EXISTS (SELECT 1 FROM pg_ts_parser p JOIN pg_namespace n ON n.oid = p.prsnamespace ` + + )]; + case 'OBJECT_TSPARSER': + return [check( + `EXISTS (SELECT 1 FROM pg_ts_parser p JOIN pg_namespace n ON n.oid = p.prsnamespace ` + `WHERE p.prsname = ${lit(defNameOnly(node.defnames))}${defNamespaceCond(node.defnames)})` - )]; - case 'OBJECT_TSTEMPLATE': - return [check( - `EXISTS (SELECT 1 FROM pg_ts_template t JOIN pg_namespace n ON n.oid = t.tmplnamespace ` + + )]; + case 'OBJECT_TSTEMPLATE': + return [check( + `EXISTS (SELECT 1 FROM pg_ts_template t JOIN pg_namespace n ON n.oid = t.tmplnamespace ` + `WHERE t.tmplname = ${lit(defNameOnly(node.defnames))}${defNamespaceCond(node.defnames)})` - )]; - default: - return notDerivable(`no existence check known for CREATE (DefineStmt) with kind ${node.kind}`); + )]; + default: + return notDerivable(`no existence check known for CREATE (DefineStmt) with kind ${node.kind}`); } } /** Existence checks for RENAME: the object exists under its new name. */ function verifyRename(node: AnyNode, notDerivable: (reason: string) => string[]): string[] { switch (node.renameType) { - case 'OBJECT_TABLE': - case 'OBJECT_INDEX': - case 'OBJECT_SEQUENCE': - case 'OBJECT_VIEW': - case 'OBJECT_MATVIEW': - case 'OBJECT_FOREIGN_TABLE': - return [check(`to_regclass(${lit(qname(node.relation.schemaname, node.newname))}) IS NOT NULL`)]; - case 'OBJECT_COLUMN': { - const conds = [`table_name = ${lit(node.relation.relname)}`, `column_name = ${lit(node.newname)}`]; - if (node.relation.schemaname) conds.push(`table_schema = ${lit(node.relation.schemaname)}`); - return [check(`EXISTS (SELECT 1 FROM information_schema.columns WHERE ${conds.join(' AND ')})`)]; - } - case 'OBJECT_SCHEMA': - return [check( - `EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = ${lit(node.newname)})` - )]; - case 'OBJECT_TYPE': - case 'OBJECT_DOMAIN': { - const items = node.object?.List?.items; - if (!items?.length) return notDerivable(`RENAME ${node.renameType} without a qualified name`); - const parts = items - .map((n: AnyNode) => n?.String?.sval) - .filter((s: any) => typeof s === 'string'); - const schema = parts.length > 1 ? parts[parts.length - 2] : null; - return [check(`to_regtype(${lit(qname(schema, node.newname))}) IS NOT NULL`)]; - } - case 'OBJECT_FUNCTION': - case 'OBJECT_PROCEDURE': - case 'OBJECT_AGGREGATE': { - const owa = node.object?.ObjectWithArgs; - if (!owa?.objname?.length) return notDerivable(`RENAME ${node.renameType} without a function name`); - const parts = owa.objname - .map((n: AnyNode) => n?.String?.sval) - .filter((s: any) => typeof s === 'string'); - const schema = parts.length > 1 ? parts[parts.length - 2] : null; - const args = (owa.objargs ?? []).map((t: AnyNode) => Deparser.deparse(t)); - return [check( - `to_regprocedure(${lit(`${qname(schema, node.newname)}(${args.join(', ')})`)}) IS NOT NULL` - )]; - } - default: - return notDerivable(`no existence check known for RENAME ${node.renameType}`); + case 'OBJECT_TABLE': + case 'OBJECT_INDEX': + case 'OBJECT_SEQUENCE': + case 'OBJECT_VIEW': + case 'OBJECT_MATVIEW': + case 'OBJECT_FOREIGN_TABLE': + return [check(`to_regclass(${lit(qname(node.relation.schemaname, node.newname))}) IS NOT NULL`)]; + case 'OBJECT_COLUMN': { + const conds = [`table_name = ${lit(node.relation.relname)}`, `column_name = ${lit(node.newname)}`]; + if (node.relation.schemaname) conds.push(`table_schema = ${lit(node.relation.schemaname)}`); + return [check(`EXISTS (SELECT 1 FROM information_schema.columns WHERE ${conds.join(' AND ')})`)]; + } + case 'OBJECT_SCHEMA': + return [check( + `EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = ${lit(node.newname)})` + )]; + case 'OBJECT_TYPE': + case 'OBJECT_DOMAIN': { + const items = node.object?.List?.items; + if (!items?.length) return notDerivable(`RENAME ${node.renameType} without a qualified name`); + const parts = items + .map((n: AnyNode) => n?.String?.sval) + .filter((s: any) => typeof s === 'string'); + const schema = parts.length > 1 ? parts[parts.length - 2] : null; + return [check(`to_regtype(${lit(qname(schema, node.newname))}) IS NOT NULL`)]; + } + case 'OBJECT_FUNCTION': + case 'OBJECT_PROCEDURE': + case 'OBJECT_AGGREGATE': { + const owa = node.object?.ObjectWithArgs; + if (!owa?.objname?.length) return notDerivable(`RENAME ${node.renameType} without a function name`); + const parts = owa.objname + .map((n: AnyNode) => n?.String?.sval) + .filter((s: any) => typeof s === 'string'); + const schema = parts.length > 1 ? parts[parts.length - 2] : null; + const args = (owa.objargs ?? []).map((t: AnyNode) => Deparser.deparse(t)); + return [check( + `to_regprocedure(${lit(`${qname(schema, node.newname)}(${args.join(', ')})`)}) IS NOT NULL` + )]; + } + default: + return notDerivable(`no existence check known for RENAME ${node.renameType}`); } } /** Existence checks for SET SCHEMA: the object exists in the new schema. */ function verifySetSchema(node: AnyNode, notDerivable: (reason: string) => string[]): string[] { switch (node.objectType) { - case 'OBJECT_TABLE': - case 'OBJECT_SEQUENCE': - case 'OBJECT_VIEW': - case 'OBJECT_MATVIEW': - case 'OBJECT_FOREIGN_TABLE': - return [check(`to_regclass(${lit(qname(node.newschema, node.relation.relname))}) IS NOT NULL`)]; - case 'OBJECT_TYPE': - case 'OBJECT_DOMAIN': { - const items = node.object?.List?.items; - if (!items?.length) return notDerivable(`SET SCHEMA ${node.objectType} without a name`); - const parts = items - .map((n: AnyNode) => n?.String?.sval) - .filter((s: any) => typeof s === 'string'); - return [check(`to_regtype(${lit(qname(node.newschema, parts[parts.length - 1]))}) IS NOT NULL`)]; - } - case 'OBJECT_FUNCTION': - case 'OBJECT_PROCEDURE': - case 'OBJECT_AGGREGATE': { - const owa = node.object?.ObjectWithArgs; - if (!owa?.objname?.length) return notDerivable(`SET SCHEMA ${node.objectType} without a function name`); - const parts = owa.objname - .map((n: AnyNode) => n?.String?.sval) - .filter((s: any) => typeof s === 'string'); - const args = (owa.objargs ?? []).map((t: AnyNode) => Deparser.deparse(t)); - return [check( - `to_regprocedure(${lit(`${qname(node.newschema, parts[parts.length - 1])}(${args.join(', ')})`)}) IS NOT NULL` - )]; - } - default: - return notDerivable(`no existence check known for SET SCHEMA on ${node.objectType}`); + case 'OBJECT_TABLE': + case 'OBJECT_SEQUENCE': + case 'OBJECT_VIEW': + case 'OBJECT_MATVIEW': + case 'OBJECT_FOREIGN_TABLE': + return [check(`to_regclass(${lit(qname(node.newschema, node.relation.relname))}) IS NOT NULL`)]; + case 'OBJECT_TYPE': + case 'OBJECT_DOMAIN': { + const items = node.object?.List?.items; + if (!items?.length) return notDerivable(`SET SCHEMA ${node.objectType} without a name`); + const parts = items + .map((n: AnyNode) => n?.String?.sval) + .filter((s: any) => typeof s === 'string'); + return [check(`to_regtype(${lit(qname(node.newschema, parts[parts.length - 1]))}) IS NOT NULL`)]; + } + case 'OBJECT_FUNCTION': + case 'OBJECT_PROCEDURE': + case 'OBJECT_AGGREGATE': { + const owa = node.object?.ObjectWithArgs; + if (!owa?.objname?.length) return notDerivable(`SET SCHEMA ${node.objectType} without a function name`); + const parts = owa.objname + .map((n: AnyNode) => n?.String?.sval) + .filter((s: any) => typeof s === 'string'); + const args = (owa.objargs ?? []).map((t: AnyNode) => Deparser.deparse(t)); + return [check( + `to_regprocedure(${lit(`${qname(node.newschema, parts[parts.length - 1])}(${args.join(', ')})`)}) IS NOT NULL` + )]; + } + default: + return notDerivable(`no existence check known for SET SCHEMA on ${node.objectType}`); } } @@ -980,46 +980,46 @@ function verifyGrant(node: AnyNode, warnings: string[]): string[] { for (const priv of privNames) { const privilege = priv.toUpperCase(); switch (node.objtype) { - case 'OBJECT_TABLE': - case 'OBJECT_SEQUENCE': { - const fn = node.objtype === 'OBJECT_SEQUENCE' ? 'has_sequence_privilege' : 'has_table_privilege'; - for (const obj of node.objects ?? []) { - const rel = obj?.RangeVar; - if (!rel) continue; - out.push(check( - `${fn}(${lit(grantee)}, ${lit(qname(rel.schemaname, rel.relname))}, ${lit(privilege)})` - )); - } - break; + case 'OBJECT_TABLE': + case 'OBJECT_SEQUENCE': { + const fn = node.objtype === 'OBJECT_SEQUENCE' ? 'has_sequence_privilege' : 'has_table_privilege'; + for (const obj of node.objects ?? []) { + const rel = obj?.RangeVar; + if (!rel) continue; + out.push(check( + `${fn}(${lit(grantee)}, ${lit(qname(rel.schemaname, rel.relname))}, ${lit(privilege)})` + )); + } + break; + } + case 'OBJECT_FUNCTION': + case 'OBJECT_PROCEDURE': + for (const obj of node.objects ?? []) { + const owa = obj?.ObjectWithArgs; + if (!owa) continue; + const parts = (owa.objname ?? []) + .map((n: AnyNode) => n?.String?.sval) + .filter((s: any) => typeof s === 'string'); + const name = parts.length > 1 + ? qname(parts[parts.length - 2], parts[parts.length - 1]) + : qname(null, parts[0] ?? ''); + const args = (owa.objargs ?? []).map((t: AnyNode) => Deparser.deparse(t)); + out.push(check( + `has_function_privilege(${lit(grantee)}, ${lit(`${name}(${args.join(', ')})`)}, ${lit(privilege)})` + )); } - case 'OBJECT_FUNCTION': - case 'OBJECT_PROCEDURE': - for (const obj of node.objects ?? []) { - const owa = obj?.ObjectWithArgs; - if (!owa) continue; - const parts = (owa.objname ?? []) - .map((n: AnyNode) => n?.String?.sval) - .filter((s: any) => typeof s === 'string'); - const name = parts.length > 1 - ? qname(parts[parts.length - 2], parts[parts.length - 1]) - : qname(null, parts[0] ?? ''); - const args = (owa.objargs ?? []).map((t: AnyNode) => Deparser.deparse(t)); - out.push(check( - `has_function_privilege(${lit(grantee)}, ${lit(`${name}(${args.join(', ')})`)}, ${lit(privilege)})` - )); - } - break; - case 'OBJECT_SCHEMA': - for (const obj of node.objects ?? []) { - const schema = obj?.String?.sval; - if (!schema) continue; - out.push(check( - `has_schema_privilege(${lit(grantee)}, ${lit(qname(null, schema))}, ${lit(privilege)})` - )); - } - break; - default: - warnings.push(`verify not derivable: GRANT on ${node.objtype ?? 'unknown object type'}`); + break; + case 'OBJECT_SCHEMA': + for (const obj of node.objects ?? []) { + const schema = obj?.String?.sval; + if (!schema) continue; + out.push(check( + `has_schema_privilege(${lit(grantee)}, ${lit(qname(null, schema))}, ${lit(privilege)})` + )); + } + break; + default: + warnings.push(`verify not derivable: GRANT on ${node.objtype ?? 'unknown object type'}`); } } } @@ -1042,44 +1042,44 @@ function verifyAlterTable(node: AnyNode, warnings: string[]): string[] { const cmd = wrapped?.AlterTableCmd; if (!cmd) continue; switch (cmd.subtype) { - case 'AT_AddColumn': { - const colname = cmd.def?.ColumnDef?.colname; - if (!colname) break; - const conds = [`table_name = ${lit(rel.relname)}`, `column_name = ${lit(colname)}`]; - if (rel.schemaname) conds.push(`table_schema = ${lit(rel.schemaname)}`); - out.push(check(`EXISTS (SELECT 1 FROM information_schema.columns WHERE ${conds.join(' AND ')})`)); - break; - } - case 'AT_AddConstraint': { - const conname = cmd.def?.Constraint?.conname; - if (!conname) { - warnings.push(`verify not derivable: unnamed constraint on ${table} (Postgres assigns the name at deploy time)`); - break; - } - const conds = [`table_name = ${lit(rel.relname)}`, `constraint_name = ${lit(conname)}`]; - if (rel.schemaname) conds.push(`table_schema = ${lit(rel.schemaname)}`); - out.push(check(`EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE ${conds.join(' AND ')})`)); + case 'AT_AddColumn': { + const colname = cmd.def?.ColumnDef?.colname; + if (!colname) break; + const conds = [`table_name = ${lit(rel.relname)}`, `column_name = ${lit(colname)}`]; + if (rel.schemaname) conds.push(`table_schema = ${lit(rel.schemaname)}`); + out.push(check(`EXISTS (SELECT 1 FROM information_schema.columns WHERE ${conds.join(' AND ')})`)); + break; + } + case 'AT_AddConstraint': { + const conname = cmd.def?.Constraint?.conname; + if (!conname) { + warnings.push(`verify not derivable: unnamed constraint on ${table} (Postgres assigns the name at deploy time)`); break; } - case 'AT_EnableRowSecurity': - out.push(check(relCondition('c.relrowsecurity'))); - break; - case 'AT_ForceRowSecurity': - out.push(check(relCondition('c.relforcerowsecurity'))); - break; - case 'AT_AttachPartition': { - const partition = cmd.def?.PartitionCmd?.name; - if (!partition) break; - out.push(check( - `EXISTS (SELECT 1 FROM pg_inherits WHERE ` + + const conds = [`table_name = ${lit(rel.relname)}`, `constraint_name = ${lit(conname)}`]; + if (rel.schemaname) conds.push(`table_schema = ${lit(rel.schemaname)}`); + out.push(check(`EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE ${conds.join(' AND ')})`)); + break; + } + case 'AT_EnableRowSecurity': + out.push(check(relCondition('c.relrowsecurity'))); + break; + case 'AT_ForceRowSecurity': + out.push(check(relCondition('c.relforcerowsecurity'))); + break; + case 'AT_AttachPartition': { + const partition = cmd.def?.PartitionCmd?.name; + if (!partition) break; + out.push(check( + `EXISTS (SELECT 1 FROM pg_inherits WHERE ` + `inhrelid = ${lit(qname(partition.schemaname, partition.relname))}::regclass ` + `AND inhparent = ${lit(table)}::regclass)` - )); - break; - } - default: - // Nothing verifiable comes into existence. - break; + )); + break; + } + default: + // Nothing verifiable comes into existence. + break; } } return out; diff --git a/packages/transform-ast/__tests__/direct-transformers.test.ts b/packages/transform-ast/__tests__/direct-transformers.test.ts index 5a7a2c9e..0bb2023e 100644 --- a/packages/transform-ast/__tests__/direct-transformers.test.ts +++ b/packages/transform-ast/__tests__/direct-transformers.test.ts @@ -1,4 +1,5 @@ import { Parser } from '@pgsql/parser'; + import { PG13ToPG17Transformer, PG14ToPG17Transformer, diff --git a/packages/transform-ast/__tests__/full-transform-flow.test.ts b/packages/transform-ast/__tests__/full-transform-flow.test.ts index e810a74f..2ceda19a 100644 --- a/packages/transform-ast/__tests__/full-transform-flow.test.ts +++ b/packages/transform-ast/__tests__/full-transform-flow.test.ts @@ -25,31 +25,31 @@ const testFiles = [ 'original/upstream/plpgsql-221.sql', 'original/upstream/plpgsql-222.sql', 'original/upstream/plpgsql-223.sql', - "pretty/misc-1.sql", - "pretty/misc-2.sql", - "pretty/misc-3.sql", - "pretty/misc-4.sql", + 'pretty/misc-1.sql', + 'pretty/misc-2.sql', + 'pretty/misc-3.sql', + 'pretty/misc-4.sql', // "pretty/misc-5.sql", - "pretty/misc-6.sql", - "pretty/misc-7.sql", - "pretty/misc-8.sql", - "pretty/misc-9.sql", - "pretty/misc-10.sql", - "pretty/misc-11.sql", - "pretty/misc-12.sql", - "pretty/misc-13.sql", - "pretty/create_table-1.sql", - "pretty/create_table-2.sql", - "pretty/create_table-3.sql", - "pretty/create_table-4.sql", - "pretty/create_table-5.sql", - "pretty/create_policy-1.sql", - "pretty/create_policy-2.sql", - "pretty/create_policy-3.sql", - "pretty/create_policy-4.sql", - "pretty/constraints-1.sql", - "pretty/constraints-2.sql", - "pretty/constraints-4.sql", + 'pretty/misc-6.sql', + 'pretty/misc-7.sql', + 'pretty/misc-8.sql', + 'pretty/misc-9.sql', + 'pretty/misc-10.sql', + 'pretty/misc-11.sql', + 'pretty/misc-12.sql', + 'pretty/misc-13.sql', + 'pretty/create_table-1.sql', + 'pretty/create_table-2.sql', + 'pretty/create_table-3.sql', + 'pretty/create_table-4.sql', + 'pretty/create_table-5.sql', + 'pretty/create_policy-1.sql', + 'pretty/create_policy-2.sql', + 'pretty/create_policy-3.sql', + 'pretty/create_policy-4.sql', + 'pretty/constraints-1.sql', + 'pretty/constraints-2.sql', + 'pretty/constraints-4.sql', ].filter(filename => !skipTests.some(([from, to, f]) => filename === f)); describe('Full Transform Flow Tests', () => { diff --git a/packages/transform-ast/jest.config.js b/packages/transform-ast/jest.config.js index 0aa3aaa4..057a9420 100644 --- a/packages/transform-ast/jest.config.js +++ b/packages/transform-ast/jest.config.js @@ -1,18 +1,18 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", - transform: { - "^.+\\.tsx?$": [ - "ts-jest", - { - babelConfig: false, - tsconfig: "tsconfig.json", - }, - ], - }, - transformIgnorePatterns: [`/node_modules/*`], - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - modulePathIgnorePatterns: ["dist/*"] + preset: 'ts-jest', + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + babelConfig: false, + tsconfig: 'tsconfig.json', + }, + ], + }, + transformIgnorePatterns: [`/node_modules/*`], + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + modulePathIgnorePatterns: ['dist/*'] }; diff --git a/packages/transform-ast/scripts/make-kitchen-sink.ts b/packages/transform-ast/scripts/make-kitchen-sink.ts index 46ef81da..98404c93 100644 --- a/packages/transform-ast/scripts/make-kitchen-sink.ts +++ b/packages/transform-ast/scripts/make-kitchen-sink.ts @@ -1,9 +1,9 @@ #!/usr/bin/env ts-node -import * as path from 'path'; +import { ParseResult, RawStmt } from '@pgsql/types'; import * as fs from 'fs'; import { sync as globSync } from 'glob'; import { parse } from 'libpg-query'; -import { ParseResult, RawStmt } from '@pgsql/types'; +import * as path from 'path'; const FIXTURE_DIR = path.join(__dirname, '../../../__fixtures__/kitchen-sink'); const OUT_DIR = path.join(__dirname, '../__tests__/kitchen-sink'); @@ -22,7 +22,7 @@ const fixtures = new FixtureTestUtils(${versionPrevious}, ${versionNext}); it('${name}', async () => { await fixtures.runFixtureTests(${JSON.stringify(tests, null, 2)}); }); -` +`; }; const fixtures = globSync(path.join(FIXTURE_DIR, '**/*.sql')); diff --git a/packages/transform-ast/scripts/pg-proto-parser.ts b/packages/transform-ast/scripts/pg-proto-parser.ts index e6ce600b..5a42a0b0 100644 --- a/packages/transform-ast/scripts/pg-proto-parser.ts +++ b/packages/transform-ast/scripts/pg-proto-parser.ts @@ -1,5 +1,5 @@ +import { join,resolve } from 'path'; import { PgProtoParser, PgProtoParserOptions } from 'pg-proto-parser'; -import { resolve, join } from 'path'; const versions = ['13', '14', '15', '16', '17', '18']; const baseDir = resolve(join(__dirname, '../../../__fixtures__/proto')); diff --git a/packages/transform-ast/scripts/test-ast.ts b/packages/transform-ast/scripts/test-ast.ts index ebf43551..fdb932a9 100644 --- a/packages/transform-ast/scripts/test-ast.ts +++ b/packages/transform-ast/scripts/test-ast.ts @@ -1,6 +1,7 @@ import { v13, v14, v15, v16, v17 } from '@pgsql/parser'; import { readFileSync, writeFileSync } from 'fs'; import { join } from 'path'; + import { cleanTree } from '../test-utils/clean-tree'; async function testAst() { diff --git a/packages/transform-ast/src/index.ts b/packages/transform-ast/src/index.ts index 54f5c5ce..11b315c1 100644 --- a/packages/transform-ast/src/index.ts +++ b/packages/transform-ast/src/index.ts @@ -1,34 +1,30 @@ import { Node as PG13Node } from './13/types'; -import { Node as PG14Node } from './14/types'; -import { Node as PG15Node } from './15/types'; -import { Node as PG16Node } from './16/types'; -import { Node as PG17Node } from './17/types'; -import { Node as PG18Node } from './18/types'; - import * as PG13Types from './13/types'; +import { Node as PG14Node } from './14/types'; import * as PG14Types from './14/types'; +import { Node as PG15Node } from './15/types'; import * as PG15Types from './15/types'; +import { Node as PG16Node } from './16/types'; import * as PG16Types from './16/types'; +import { Node as PG17Node } from './17/types'; import * as PG17Types from './17/types'; +import { Node as PG18Node } from './18/types'; import * as PG18Types from './18/types'; export { ASTTransformer } from './multi-version-transformer'; - export { V13ToV14Transformer } from './transformers/v13-to-v14'; export { V14ToV15Transformer } from './transformers/v14-to-v15'; export { V15ToV16Transformer } from './transformers/v15-to-v16'; export { V16ToV17Transformer } from './transformers/v16-to-v17'; export { V17ToV18Transformer } from './transformers/v17-to-v18'; - export { PG13ToPG17Transformer } from './transformers-direct/v13-to-v17'; -export { PG14ToPG17Transformer } from './transformers-direct/v14-to-v17'; -export { PG15ToPG17Transformer } from './transformers-direct/v15-to-v17'; -export { PG16ToPG17Transformer } from './transformers-direct/v16-to-v17'; - export { PG13ToPG18Transformer } from './transformers-direct/v13-to-v18'; +export { PG14ToPG17Transformer } from './transformers-direct/v14-to-v17'; export { PG14ToPG18Transformer } from './transformers-direct/v14-to-v18'; +export { PG15ToPG17Transformer } from './transformers-direct/v15-to-v17'; export { PG15ToPG18Transformer } from './transformers-direct/v15-to-v18'; +export { PG16ToPG17Transformer } from './transformers-direct/v16-to-v17'; export { PG16ToPG18Transformer } from './transformers-direct/v16-to-v18'; export { PG17ToPG18Transformer } from './transformers-direct/v17-to-v18'; -export { PG13Node, PG14Node, PG15Node, PG16Node, PG17Node, PG18Node, PG13Types, PG14Types, PG15Types, PG16Types, PG17Types, PG18Types }; +export { PG13Node, PG13Types, PG14Node, PG14Types, PG15Node, PG15Types, PG16Node, PG16Types, PG17Node, PG17Types, PG18Node, PG18Types }; diff --git a/packages/transform-ast/src/multi-version-transformer.ts b/packages/transform-ast/src/multi-version-transformer.ts index 3d92c0f3..276732f5 100644 --- a/packages/transform-ast/src/multi-version-transformer.ts +++ b/packages/transform-ast/src/multi-version-transformer.ts @@ -31,23 +31,23 @@ export class ASTTransformer { // Use explicit switch to avoid complex union types switch (transformerKey) { - case '13-14': - currentAst = this.transformers['13-14'].transform(currentAst, { parentNodeTypes: [] }); - break; - case '14-15': - currentAst = this.transformers['14-15'].transform(currentAst, { parentNodeTypes: [] }); - break; - case '15-16': - currentAst = this.transformers['15-16'].transform(currentAst, { parentNodeTypes: [] }); - break; - case '16-17': - currentAst = this.transformers['16-17'].transform(currentAst, { parentNodeTypes: [] }); - break; - case '17-18': - currentAst = this.transformers['17-18'].transform(currentAst, { parentNodeTypes: [] }); - break; - default: - throw new Error(`No transformer available for v${currentVersion} to v${nextVersion}`); + case '13-14': + currentAst = this.transformers['13-14'].transform(currentAst, { parentNodeTypes: [] }); + break; + case '14-15': + currentAst = this.transformers['14-15'].transform(currentAst, { parentNodeTypes: [] }); + break; + case '15-16': + currentAst = this.transformers['15-16'].transform(currentAst, { parentNodeTypes: [] }); + break; + case '16-17': + currentAst = this.transformers['16-17'].transform(currentAst, { parentNodeTypes: [] }); + break; + case '17-18': + currentAst = this.transformers['17-18'].transform(currentAst, { parentNodeTypes: [] }); + break; + default: + throw new Error(`No transformer available for v${currentVersion} to v${nextVersion}`); } currentVersion = nextVersion; diff --git a/packages/transform-ast/src/transformers-direct/index.ts b/packages/transform-ast/src/transformers-direct/index.ts index b831078b..14ffe4f8 100644 --- a/packages/transform-ast/src/transformers-direct/index.ts +++ b/packages/transform-ast/src/transformers-direct/index.ts @@ -4,12 +4,11 @@ */ export { PG13ToPG17Transformer } from './v13-to-v17'; -export { PG14ToPG17Transformer } from './v14-to-v17'; -export { PG15ToPG17Transformer } from './v15-to-v17'; -export { PG16ToPG17Transformer } from './v16-to-v17'; - export { PG13ToPG18Transformer } from './v13-to-v18'; +export { PG14ToPG17Transformer } from './v14-to-v17'; export { PG14ToPG18Transformer } from './v14-to-v18'; +export { PG15ToPG17Transformer } from './v15-to-v17'; export { PG15ToPG18Transformer } from './v15-to-v18'; +export { PG16ToPG17Transformer } from './v16-to-v17'; export { PG16ToPG18Transformer } from './v16-to-v18'; export { PG17ToPG18Transformer } from './v17-to-v18'; diff --git a/packages/transform-ast/src/transformers/v13-to-v14.ts b/packages/transform-ast/src/transformers/v13-to-v14.ts index 7babf93f..ecfbb091 100644 --- a/packages/transform-ast/src/transformers/v13-to-v14.ts +++ b/packages/transform-ast/src/transformers/v13-to-v14.ts @@ -587,12 +587,12 @@ export class V13ToV14Transformer { }; result.objects = Array.isArray(result.objects) ? result.objects.map((item: any) => { - const transformedItem = this.transform(item, childContext); + const transformedItem = this.transform(item, childContext); - return transformedItem; - }) + return transformedItem; + }) : this.transform(result.objects, childContext); } @@ -2130,7 +2130,7 @@ export class V13ToV14Transformer { result.objfuncargs = Array.isArray(result.objargs) ? result.objargs.map((arg: any, index: number) => { - const transformedArgType = this.visit(arg, context); + const transformedArgType = this.visit(arg, context); // Check if there's an existing objfuncargs with original mode information let mode = 'FUNC_PARAM_DEFAULT'; @@ -2184,15 +2184,15 @@ export class V13ToV14Transformer { return parameter; }) - : [{ + : [{ FunctionParameter: { argType: this.visit(result.objargs, context), mode: (originalObjfuncargs && originalObjfuncargs[0] && originalObjfuncargs[0].FunctionParameter && originalObjfuncargs[0].FunctionParameter.mode) ? this.mapFunctionParameterMode(originalObjfuncargs[0].FunctionParameter.mode, context) : (() => { - const isVariadic = this.isVariadicParameterType(result.objargs, 0, [result.objargs], context); - return isVariadic ? 'FUNC_PARAM_VARIADIC' : 'FUNC_PARAM_DEFAULT'; - })() + const isVariadic = this.isVariadicParameterType(result.objargs, 0, [result.objargs], context); + return isVariadic ? 'FUNC_PARAM_VARIADIC' : 'FUNC_PARAM_DEFAULT'; + })() } }]; } @@ -2442,7 +2442,7 @@ export class V13ToV14Transformer { // Check if this should be a variadic parameter const isVariadic = this.isVariadicParameterType(typeNameNode, index, undefined, context); - let mode = isVariadic ? "FUNC_PARAM_VARIADIC" : "FUNC_PARAM_DEFAULT"; + let mode = isVariadic ? 'FUNC_PARAM_VARIADIC' : 'FUNC_PARAM_DEFAULT'; const functionParam: any = { argType: argType, @@ -2484,22 +2484,22 @@ export class V13ToV14Transformer { private transformA_Expr_Kind(kind: string): string { const pg13ToP14Map: { [key: string]: string } = { - 'AEXPR_OP': 'AEXPR_OP', - 'AEXPR_OP_ANY': 'AEXPR_OP_ANY', - 'AEXPR_OP_ALL': 'AEXPR_OP_ALL', - 'AEXPR_DISTINCT': 'AEXPR_DISTINCT', - 'AEXPR_NOT_DISTINCT': 'AEXPR_NOT_DISTINCT', - 'AEXPR_NULLIF': 'AEXPR_NULLIF', - 'AEXPR_OF': 'AEXPR_IN', // AEXPR_OF removed, map to AEXPR_IN - 'AEXPR_IN': 'AEXPR_IN', - 'AEXPR_LIKE': 'AEXPR_LIKE', - 'AEXPR_ILIKE': 'AEXPR_ILIKE', - 'AEXPR_SIMILAR': 'AEXPR_SIMILAR', - 'AEXPR_BETWEEN': 'AEXPR_BETWEEN', - 'AEXPR_NOT_BETWEEN': 'AEXPR_NOT_BETWEEN', - 'AEXPR_BETWEEN_SYM': 'AEXPR_BETWEEN_SYM', - 'AEXPR_NOT_BETWEEN_SYM': 'AEXPR_NOT_BETWEEN_SYM', - 'AEXPR_PAREN': 'AEXPR_OP' // AEXPR_PAREN removed, map to AEXPR_OP + AEXPR_OP: 'AEXPR_OP', + AEXPR_OP_ANY: 'AEXPR_OP_ANY', + AEXPR_OP_ALL: 'AEXPR_OP_ALL', + AEXPR_DISTINCT: 'AEXPR_DISTINCT', + AEXPR_NOT_DISTINCT: 'AEXPR_NOT_DISTINCT', + AEXPR_NULLIF: 'AEXPR_NULLIF', + AEXPR_OF: 'AEXPR_IN', // AEXPR_OF removed, map to AEXPR_IN + AEXPR_IN: 'AEXPR_IN', + AEXPR_LIKE: 'AEXPR_LIKE', + AEXPR_ILIKE: 'AEXPR_ILIKE', + AEXPR_SIMILAR: 'AEXPR_SIMILAR', + AEXPR_BETWEEN: 'AEXPR_BETWEEN', + AEXPR_NOT_BETWEEN: 'AEXPR_NOT_BETWEEN', + AEXPR_BETWEEN_SYM: 'AEXPR_BETWEEN_SYM', + AEXPR_NOT_BETWEEN_SYM: 'AEXPR_NOT_BETWEEN_SYM', + AEXPR_PAREN: 'AEXPR_OP' // AEXPR_PAREN removed, map to AEXPR_OP }; return pg13ToP14Map[kind] || kind; @@ -2507,10 +2507,10 @@ export class V13ToV14Transformer { private transformRoleSpecType(type: string): string { const pg13ToP14Map: { [key: string]: string } = { - 'ROLESPEC_CSTRING': 'ROLESPEC_CSTRING', - 'ROLESPEC_CURRENT_USER': 'ROLESPEC_CURRENT_USER', - 'ROLESPEC_SESSION_USER': 'ROLESPEC_SESSION_USER', - 'ROLESPEC_PUBLIC': 'ROLESPEC_PUBLIC' + ROLESPEC_CSTRING: 'ROLESPEC_CSTRING', + ROLESPEC_CURRENT_USER: 'ROLESPEC_CURRENT_USER', + ROLESPEC_SESSION_USER: 'ROLESPEC_SESSION_USER', + ROLESPEC_PUBLIC: 'ROLESPEC_PUBLIC' }; return pg13ToP14Map[type] || type; @@ -2590,10 +2590,10 @@ export class V13ToV14Transformer { const result: any = {}; if (node.kind !== undefined) { - if (node.kind === "AEXPR_OF") { - result.kind = "AEXPR_IN"; - } else if (node.kind === "AEXPR_PAREN") { - result.kind = "AEXPR_OP"; + if (node.kind === 'AEXPR_OF') { + result.kind = 'AEXPR_IN'; + } else if (node.kind === 'AEXPR_PAREN') { + result.kind = 'AEXPR_OP'; } else { result.kind = node.kind; } @@ -3048,43 +3048,43 @@ export class V13ToV14Transformer { if (node.exprs !== undefined) { result.exprs = Array.isArray(node.exprs) ? node.exprs.map((item: any) => { - // Check if this is a simple column reference - if (item && item.ColumnRef && item.ColumnRef.fields && + // Check if this is a simple column reference + if (item && item.ColumnRef && item.ColumnRef.fields && Array.isArray(item.ColumnRef.fields) && item.ColumnRef.fields.length === 1 && item.ColumnRef.fields[0] && item.ColumnRef.fields[0].String) { - return { - StatsElem: { - name: item.ColumnRef.fields[0].String.str || item.ColumnRef.fields[0].String.sval - } - }; - } else { - const transformedExpr = this.transform(item as any, context); - return { - StatsElem: { - expr: transformedExpr - } - }; - } - }) + return { + StatsElem: { + name: item.ColumnRef.fields[0].String.str || item.ColumnRef.fields[0].String.sval + } + }; + } else { + const transformedExpr = this.transform(item as any, context); + return { + StatsElem: { + expr: transformedExpr + } + }; + } + }) : (() => { - // Handle single expression case - if (node.exprs && node.exprs.ColumnRef && node.exprs.ColumnRef.fields && + // Handle single expression case + if (node.exprs && node.exprs.ColumnRef && node.exprs.ColumnRef.fields && Array.isArray(node.exprs.ColumnRef.fields) && node.exprs.ColumnRef.fields.length === 1 && node.exprs.ColumnRef.fields[0] && node.exprs.ColumnRef.fields[0].String) { - return { - StatsElem: { - name: node.exprs.ColumnRef.fields[0].String.str || node.exprs.ColumnRef.fields[0].String.sval - } - }; - } else { - const transformedExpr = this.transform(node.exprs as any, context); - return { - StatsElem: { - expr: transformedExpr - } - }; - } - })(); + return { + StatsElem: { + name: node.exprs.ColumnRef.fields[0].String.str || node.exprs.ColumnRef.fields[0].String.sval + } + }; + } else { + const transformedExpr = this.transform(node.exprs as any, context); + return { + StatsElem: { + expr: transformedExpr + } + }; + } + })(); } if (node.relations !== undefined) { @@ -3344,30 +3344,30 @@ export class V13ToV14Transformer { private mapFunctionParameterMode(pg13Mode: string, context?: TransformerContext, hasParameterName?: boolean): string { // Handle specific mode mappings between PG13 and PG14 switch (pg13Mode) { - case 'FUNC_PARAM_VARIADIC': - return 'FUNC_PARAM_VARIADIC'; - case 'FUNC_PARAM_IN': - if (context && context.parentNodeTypes?.includes('DropStmt')) { - return 'FUNC_PARAM_IN'; - } + case 'FUNC_PARAM_VARIADIC': + return 'FUNC_PARAM_VARIADIC'; + case 'FUNC_PARAM_IN': + if (context && context.parentNodeTypes?.includes('DropStmt')) { + return 'FUNC_PARAM_IN'; + } - if (context && + if (context && ((context as any).functionHasExplicitModes && !(context as any).hasExplicitInParameters && (context as any).allParametersHaveExplicitModes === false)) { - return 'FUNC_PARAM_DEFAULT'; - } + return 'FUNC_PARAM_DEFAULT'; + } - // Convert implicit IN parameters to DEFAULT for functions with only IN parameters - if (context && + // Convert implicit IN parameters to DEFAULT for functions with only IN parameters + if (context && !(context as any).functionHasExplicitModes && !(context as any).hasExplicitInParameters) { - return 'FUNC_PARAM_DEFAULT'; - } + return 'FUNC_PARAM_DEFAULT'; + } - return 'FUNC_PARAM_IN'; - default: - return pg13Mode; + return 'FUNC_PARAM_IN'; + default: + return pg13Mode; } } diff --git a/packages/transform-ast/src/transformers/v15-to-v16.ts b/packages/transform-ast/src/transformers/v15-to-v16.ts index 722d07a0..454f5ae2 100644 --- a/packages/transform-ast/src/transformers/v15-to-v16.ts +++ b/packages/transform-ast/src/transformers/v15-to-v16.ts @@ -960,12 +960,12 @@ export class V15ToV16Transformer { if (node.items !== undefined) { result.items = Array.isArray(node.items) ? node.items.map((item: any) => { - const transformed = this.transform(item as any, context); - if (transformed === null) { - return {}; - } - return transformed; - }) + const transformed = this.transform(item as any, context); + if (transformed === null) { + return {}; + } + return transformed; + }) : this.transform(node.items as any, context); } @@ -1001,9 +1001,9 @@ export class V15ToV16Transformer { if (partspec.strategy !== undefined) { const strategyMap: Record = { - 'range': 'PARTITION_STRATEGY_RANGE', - 'list': 'PARTITION_STRATEGY_LIST', - 'hash': 'PARTITION_STRATEGY_HASH' + range: 'PARTITION_STRATEGY_RANGE', + list: 'PARTITION_STRATEGY_LIST', + hash: 'PARTITION_STRATEGY_HASH' }; partspec.strategy = strategyMap[partspec.strategy] || partspec.strategy; } @@ -3319,13 +3319,13 @@ export class V15ToV16Transformer { result.opt = [ { DefElem: { - defname: "admin", + defname: 'admin', arg: { Boolean: { boolval: true } }, - defaction: "DEFELEM_UNSPEC" + defaction: 'DEFELEM_UNSPEC' } } ]; diff --git a/packages/transform-ast/src/transformers/v16-to-v17.ts b/packages/transform-ast/src/transformers/v16-to-v17.ts index 1debe8aa..f252712d 100644 --- a/packages/transform-ast/src/transformers/v16-to-v17.ts +++ b/packages/transform-ast/src/transformers/v16-to-v17.ts @@ -150,8 +150,8 @@ export class V16ToV17Transformer { }; result.valuesLists = Array.isArray(node.valuesLists) ? node.valuesLists.map(item => Array.isArray(item) - ? item.map(subItem => this.transform(subItem as any, valuesContext)) - : this.transform(item as any, valuesContext)) + ? item.map(subItem => this.transform(subItem as any, valuesContext)) + : this.transform(item as any, valuesContext)) : this.transform(node.valuesLists as any, valuesContext); } if (node.sortClause !== undefined) { diff --git a/packages/transform-ast/test-utils/clean-tree.ts b/packages/transform-ast/test-utils/clean-tree.ts index e2cdcdf6..6b6a3779 100644 --- a/packages/transform-ast/test-utils/clean-tree.ts +++ b/packages/transform-ast/test-utils/clean-tree.ts @@ -1,86 +1,86 @@ -/* eslint-disable no-restricted-syntax */ + export const cleanLines = (sql: string) => { - return sql - .split('\n') - .map((l) => l.trim()) - .filter((a) => a) - .join('\n'); - }; + return sql + .split('\n') + .map((l) => l.trim()) + .filter((a) => a) + .join('\n'); +}; - export const transform = (obj: any, props: any): any => { - let copy: any = null; - // Handle the 3 simple types, and null or undefined - if (obj == null || typeof obj !== 'object') { - return obj; - } +export const transform = (obj: any, props: any): any => { + let copy: any = null; + // Handle the 3 simple types, and null or undefined + if (obj == null || typeof obj !== 'object') { + return obj; + } - // Handle Date - if (obj instanceof Date) { - copy = new Date(); - copy.setTime(obj.getTime()); - return copy; - } + // Handle Date + if (obj instanceof Date) { + copy = new Date(); + copy.setTime(obj.getTime()); + return copy; + } - // Handle Array - if (obj instanceof Array) { - copy = []; - for (let i = 0, len = obj.length; i < len; i++) { - copy[i] = transform(obj[i], props); - } - return copy; + // Handle Array + if (obj instanceof Array) { + copy = []; + for (let i = 0, len = obj.length; i < len; i++) { + copy[i] = transform(obj[i], props); } + return copy; + } - // Handle Object - if (obj instanceof Object || typeof obj === 'object') { - copy = {}; - for (const attr in obj) { - if (obj.hasOwnProperty(attr)) { - if (props.hasOwnProperty(attr)) { - if (typeof props[attr] === 'function') { - const transformedValue = props[attr](obj[attr]); - // Only add the property if the transformer doesn't return undefined - if (transformedValue !== undefined) { - copy[attr] = transformedValue; - } - } else if (props[attr].hasOwnProperty(obj[attr])) { - copy[attr] = props[attr][obj[attr]]; - } else { - copy[attr] = transform(obj[attr], props); + // Handle Object + if (obj instanceof Object || typeof obj === 'object') { + copy = {}; + for (const attr in obj) { + if (Object.prototype.hasOwnProperty.call(obj, attr)) { + if (Object.prototype.hasOwnProperty.call(props, attr)) { + if (typeof props[attr] === 'function') { + const transformedValue = props[attr](obj[attr]); + // Only add the property if the transformer doesn't return undefined + if (transformedValue !== undefined) { + copy[attr] = transformedValue; } + } else if (Object.prototype.hasOwnProperty.call(props[attr], obj[attr])) { + copy[attr] = props[attr][obj[attr]]; } else { copy[attr] = transform(obj[attr], props); } } else { copy[attr] = transform(obj[attr], props); } + } else { + copy[attr] = transform(obj[attr], props); } - return copy; } + return copy; + } - throw new Error("Unable to copy obj! Its type isn't supported."); - }; + throw new Error("Unable to copy obj! Its type isn't supported."); +}; - const noop = (): undefined => undefined; - const removeUndefined = (value: any): undefined => undefined; +const noop = (): undefined => undefined; +const removeUndefined = (value: any): undefined => undefined; - export const cleanTree = (tree: any) => { - return transform(tree, { - stmt_len: noop, - stmt_location: noop, - location: removeUndefined, - typemod: removeUndefined, - rexpr_list_start: noop, - rexpr_list_end: noop, - list_start: noop, - list_end: noop - }); - }; +export const cleanTree = (tree: any) => { + return transform(tree, { + stmt_len: noop, + stmt_location: noop, + location: removeUndefined, + typemod: removeUndefined, + rexpr_list_start: noop, + rexpr_list_end: noop, + list_start: noop, + list_end: noop + }); +}; - export const cleanTreeWithStmt = (tree: any) => { - return transform(tree, { - stmt_location: noop, - location: noop - }); - }; +export const cleanTreeWithStmt = (tree: any) => { + return transform(tree, { + stmt_location: noop, + location: noop + }); +}; \ No newline at end of file diff --git a/packages/transform-ast/test-utils/expect-ast.ts b/packages/transform-ast/test-utils/expect-ast.ts index bc25a340..f2ea0598 100644 --- a/packages/transform-ast/test-utils/expect-ast.ts +++ b/packages/transform-ast/test-utils/expect-ast.ts @@ -1,5 +1,5 @@ -import { cleanTree } from './clean-tree'; import { ASTTransformer } from '../src/multi-version-transformer'; +import { cleanTree } from './clean-tree'; export async function expectOldAstToTransformToNewAst( oldAst: any, diff --git a/packages/transform-ast/test-utils/full-transform-flow.ts b/packages/transform-ast/test-utils/full-transform-flow.ts index 228776ab..97105425 100644 --- a/packages/transform-ast/test-utils/full-transform-flow.ts +++ b/packages/transform-ast/test-utils/full-transform-flow.ts @@ -1,10 +1,11 @@ import { Parser } from '@pgsql/parser'; +import { readFileSync } from 'fs'; import { parse as parse18 } from 'libpg-query'; +import * as path from 'path'; import { deparse } from 'pgsql-deparser'; -import { cleanTree } from './clean-tree'; + import { PG13ToPG18Transformer } from '../src/transformers-direct/v13-to-v18'; -import { readFileSync } from 'fs'; -import * as path from 'path'; +import { cleanTree } from './clean-tree'; /** * Result of the full transformation flow diff --git a/packages/transform-ast/test-utils/index.ts b/packages/transform-ast/test-utils/index.ts index ccd5ee78..d39a5eec 100644 --- a/packages/transform-ast/test-utils/index.ts +++ b/packages/transform-ast/test-utils/index.ts @@ -1,9 +1,10 @@ import { Parser } from '@pgsql/parser'; -import { parse as parse18 } from 'libpg-query'; -import { cleanTree } from './clean-tree'; import { readFileSync } from 'fs'; -import * as path from 'path'; import { diff } from 'jest-diff'; +import { parse as parse18 } from 'libpg-query'; +import * as path from 'path'; + +import { cleanTree } from './clean-tree'; import { skipTests } from './skip-tests'; const parser13 = new Parser({ version: 13 }); const parser14 = new Parser({ version: 14 }); @@ -27,28 +28,28 @@ export function getParsersForVersions(versionPrevious: number, versionNext: numb let parserNext; switch (versionPrevious) { - case 13: - parserPrevious = parser13; - parserNext = parser14; - break; - case 14: - parserPrevious = parser14; - parserNext = parser15; - break; - case 15: - parserPrevious = parser15; - parserNext = parser16; - break; - case 16: - parserPrevious = parser16; - parserNext = parser17; - break; - case 17: - parserPrevious = parser17; - parserNext = parser18; - break; - default: - throw new Error('Unsupported version'); + case 13: + parserPrevious = parser13; + parserNext = parser14; + break; + case 14: + parserPrevious = parser14; + parserNext = parser15; + break; + case 15: + parserPrevious = parser15; + parserNext = parser16; + break; + case 16: + parserPrevious = parser16; + parserNext = parser17; + break; + case 17: + parserPrevious = parser17; + parserNext = parser18; + break; + default: + throw new Error('Unsupported version'); } return { parserPrevious, parserNext }; diff --git a/packages/transform-ast/test-utils/skip-tests/index.ts b/packages/transform-ast/test-utils/skip-tests/index.ts index e2f3d4b1..2c77ba8f 100644 --- a/packages/transform-ast/test-utils/skip-tests/index.ts +++ b/packages/transform-ast/test-utils/skip-tests/index.ts @@ -1,10 +1,10 @@ +import { knownIssues } from './known-issues'; import { parserErrors } from './parser-errors'; import { transformerErrors } from './transformer-errors'; -import { knownIssues } from './known-issues'; import { SkipTest } from './types'; // Combined export for backward compatibility export const skipTests: SkipTest[] = [ - ...parserErrors, - ...transformerErrors, - ...knownIssues + ...parserErrors, + ...transformerErrors, + ...knownIssues ]; diff --git a/packages/transform-ast/test-utils/skip-tests/known-issues.ts b/packages/transform-ast/test-utils/skip-tests/known-issues.ts index 1c69538b..d30dbab9 100644 --- a/packages/transform-ast/test-utils/skip-tests/known-issues.ts +++ b/packages/transform-ast/test-utils/skip-tests/known-issues.ts @@ -1,32 +1,32 @@ -import { SkipTest } from "./types"; +import { SkipTest } from './types'; export const knownIssues: SkipTest[] = [ - // PG13-PG16 treated \v as 'v' - // PG17 treats \v as '\u000b' - // So yes — PG17 fixed a real bug, and the current output with \u000b is the spec-compliant behavior. - [16, 17, "misc/quotes_etc-26.sql", "16-17 Parser-level \v character escape sequence difference: PG16 parser outputs 'v' but PG17 parser outputs '\u000b' (vertical tab)"], + // PG13-PG16 treated \v as 'v' + // PG17 treats \v as '\u000b' + // So yes — PG17 fixed a real bug, and the current output with \u000b is the spec-compliant behavior. + [16, 17, 'misc/quotes_etc-26.sql', "16-17 Parser-level \v character escape sequence difference: PG16 parser outputs 'v' but PG17 parser outputs '\u000b' (vertical tab)"], - // PG18 marks the special-form syntaxes SET TIME ZONE / SET XML OPTION with jumble_args, - // but the v17 AST is identical for both the special form and the generic SET name TO value - // form, so the transformer cannot recover which syntax was used - [17, 18, "original/upstream/horology-90.sql", "17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)"], - [17, 18, "original/upstream/json-62.sql", "17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)"], - [17, 18, "original/upstream/jsonb-51.sql", "17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)"], - [17, 18, "original/upstream/xml-90.sql", "17-18 v17 AST cannot distinguish SET XML OPTION from SET xmloption TO (jumble_args)"], - [17, 18, "original/upstream/horology-223.sql", "17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)"], - [17, 18, "original/upstream/json-64.sql", "17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)"], - [17, 18, "original/upstream/jsonb-53.sql", "17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)"], - [17, 18, "original/upstream/xml-93.sql", "17-18 v17 AST cannot distinguish SET XML OPTION from SET xmloption TO (jumble_args)"], - [17, 18, "original/upstream/horology-224.sql", "17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)"], + // PG18 marks the special-form syntaxes SET TIME ZONE / SET XML OPTION with jumble_args, + // but the v17 AST is identical for both the special form and the generic SET name TO value + // form, so the transformer cannot recover which syntax was used + [17, 18, 'original/upstream/horology-90.sql', '17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)'], + [17, 18, 'original/upstream/json-62.sql', '17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)'], + [17, 18, 'original/upstream/jsonb-51.sql', '17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)'], + [17, 18, 'original/upstream/xml-90.sql', '17-18 v17 AST cannot distinguish SET XML OPTION from SET xmloption TO (jumble_args)'], + [17, 18, 'original/upstream/horology-223.sql', '17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)'], + [17, 18, 'original/upstream/json-64.sql', '17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)'], + [17, 18, 'original/upstream/jsonb-53.sql', '17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)'], + [17, 18, 'original/upstream/xml-93.sql', '17-18 v17 AST cannot distinguish SET XML OPTION from SET xmloption TO (jumble_args)'], + [17, 18, 'original/upstream/horology-224.sql', '17-18 v17 AST cannot distinguish SET TIME ZONE from SET timezone TO (jumble_args)'], - // PG14 distinguishes explicit IN parameters (FUNC_PARAM_IN) from implicit ones - // (FUNC_PARAM_DEFAULT), but PG13 reports FUNC_PARAM_IN for both, so the - // transformer cannot recover which syntax was used - [13, 14, "pretty/formatting-7.sql", "13-14 v13 AST cannot distinguish explicit IN parameters from implicit ones"], - [13, 14, "pretty/formatting-8.sql", "13-14 v13 AST cannot distinguish explicit IN parameters from implicit ones"], + // PG14 distinguishes explicit IN parameters (FUNC_PARAM_IN) from implicit ones + // (FUNC_PARAM_DEFAULT), but PG13 reports FUNC_PARAM_IN for both, so the + // transformer cannot recover which syntax was used + [13, 14, 'pretty/formatting-7.sql', '13-14 v13 AST cannot distinguish explicit IN parameters from implicit ones'], + [13, 14, 'pretty/formatting-8.sql', '13-14 v13 AST cannot distinguish explicit IN parameters from implicit ones'], - // PG14 strips the pg_catalog prefix for unquoted substring() calls but keeps it - // for quoted pg_catalog.\"substring\"() calls; PG13 produces the same AST for both, - // so the transformer cannot recover which syntax was used - [13, 14, "pretty/quoting-7.sql", "13-14 v13 AST cannot distinguish quoted pg_catalog.\"substring\"() from unquoted substring()"], + // PG14 strips the pg_catalog prefix for unquoted substring() calls but keeps it + // for quoted pg_catalog.\"substring\"() calls; PG13 produces the same AST for both, + // so the transformer cannot recover which syntax was used + [13, 14, 'pretty/quoting-7.sql', '13-14 v13 AST cannot distinguish quoted pg_catalog."substring"() from unquoted substring()'], ]; \ No newline at end of file diff --git a/packages/transform-ast/test-utils/skip-tests/parser-errors.ts b/packages/transform-ast/test-utils/skip-tests/parser-errors.ts index eeb5ba78..2eadc5b1 100644 --- a/packages/transform-ast/test-utils/skip-tests/parser-errors.ts +++ b/packages/transform-ast/test-utils/skip-tests/parser-errors.ts @@ -1,240 +1,240 @@ -import { SkipTest } from "./types"; +import { SkipTest } from './types'; export const parserErrors: SkipTest[] = [ - [13, 14, "misc/merge-seclabel-1.sql", "PG13 parser fails: syntax error at or near 'MERGE'"], - [13, 14, "misc/merge-seclabel-2.sql", "PG13 parser fails: syntax error at or near 'MERGE'"], - [13, 14, "misc/merge-seclabel-3.sql", "PG13 parser fails: syntax error at or near 'MERGE'"], - [13, 14, "misc/merge-seclabel-4.sql", "PG13 parser fails: syntax error at or near 'MERGE'"], - [13, 14, "misc/merge-seclabel-5.sql", "PG13 parser fails: syntax error at or near 'MERGE'"], - [13, 14, "misc/generated-columns-6.sql", "PG13 parser fails: syntax error at or near 'EXPRESSION'"], - [14, 15, "misc/merge-seclabel-1.sql", "PG14 parser fails: syntax error at or near 'MERGE'"], - [14, 15, "misc/merge-seclabel-2.sql", "PG14 parser fails: syntax error at or near 'MERGE'"], - [14, 15, "misc/merge-seclabel-3.sql", "PG14 parser fails: syntax error at or near 'MERGE'"], - [14, 15, "misc/merge-seclabel-4.sql", "PG14 parser fails: syntax error at or near 'MERGE'"], - [14, 15, "misc/merge-seclabel-5.sql", "PG14 parser fails: syntax error at or near 'MERGE'"], - [14, 15, "misc/generated-columns-6.sql", "PG14 parser fails: syntax error at or near 'EXPRESSION'"], - [15, 16, "misc/merge-seclabel-3.sql", "PG15 parser fails: syntax error at or near 'BY'"], - [15, 16, "misc/merge-seclabel-5.sql", "PG15 parser fails: syntax error at or near 'RETURNING'"], - [15, 16, "misc/generated-columns-6.sql", "PG15 parser fails: syntax error at or near 'EXPRESSION'"], - [16, 17, "misc/merge-seclabel-3.sql", "PG16 parser fails: syntax error at or near 'BY'"], - [16, 17, "misc/merge-seclabel-5.sql", "PG16 parser fails: syntax error at or near 'RETURNING'"], - [16, 17, "misc/generated-columns-6.sql", "PG16 parser fails: syntax error at or near 'EXPRESSION'"], + [13, 14, 'misc/merge-seclabel-1.sql', "PG13 parser fails: syntax error at or near 'MERGE'"], + [13, 14, 'misc/merge-seclabel-2.sql', "PG13 parser fails: syntax error at or near 'MERGE'"], + [13, 14, 'misc/merge-seclabel-3.sql', "PG13 parser fails: syntax error at or near 'MERGE'"], + [13, 14, 'misc/merge-seclabel-4.sql', "PG13 parser fails: syntax error at or near 'MERGE'"], + [13, 14, 'misc/merge-seclabel-5.sql', "PG13 parser fails: syntax error at or near 'MERGE'"], + [13, 14, 'misc/generated-columns-6.sql', "PG13 parser fails: syntax error at or near 'EXPRESSION'"], + [14, 15, 'misc/merge-seclabel-1.sql', "PG14 parser fails: syntax error at or near 'MERGE'"], + [14, 15, 'misc/merge-seclabel-2.sql', "PG14 parser fails: syntax error at or near 'MERGE'"], + [14, 15, 'misc/merge-seclabel-3.sql', "PG14 parser fails: syntax error at or near 'MERGE'"], + [14, 15, 'misc/merge-seclabel-4.sql', "PG14 parser fails: syntax error at or near 'MERGE'"], + [14, 15, 'misc/merge-seclabel-5.sql', "PG14 parser fails: syntax error at or near 'MERGE'"], + [14, 15, 'misc/generated-columns-6.sql', "PG14 parser fails: syntax error at or near 'EXPRESSION'"], + [15, 16, 'misc/merge-seclabel-3.sql', "PG15 parser fails: syntax error at or near 'BY'"], + [15, 16, 'misc/merge-seclabel-5.sql', "PG15 parser fails: syntax error at or near 'RETURNING'"], + [15, 16, 'misc/generated-columns-6.sql', "PG15 parser fails: syntax error at or near 'EXPRESSION'"], + [16, 17, 'misc/merge-seclabel-3.sql', "PG16 parser fails: syntax error at or near 'BY'"], + [16, 17, 'misc/merge-seclabel-5.sql', "PG16 parser fails: syntax error at or near 'RETURNING'"], + [16, 17, 'misc/generated-columns-6.sql', "PG16 parser fails: syntax error at or near 'EXPRESSION'"], - [13, 14, "misc/pg18-1.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-2.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-3.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-4.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-7.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-8.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-9.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-10.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-11.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-12.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-13.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-14.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-15.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-18.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-19.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-20.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-21.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-22.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-23.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-24.sql", "PG13 parser fails: PG18-only syntax"], - [13, 14, "misc/pg18-25.sql", "PG13 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-1.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-2.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-3.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-4.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-7.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-8.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-9.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-10.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-11.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-12.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-13.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-14.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-15.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-18.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-19.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-20.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-21.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-22.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-23.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-24.sql", "PG14 parser fails: PG18-only syntax"], - [14, 15, "misc/pg18-25.sql", "PG14 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-1.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-2.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-3.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-4.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-7.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-8.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-9.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-10.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-11.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-12.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-13.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-14.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-15.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-18.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-19.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-20.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-21.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-22.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-23.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-24.sql", "PG15 parser fails: PG18-only syntax"], - [15, 16, "misc/pg18-25.sql", "PG15 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-1.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-2.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-3.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-4.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-7.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-8.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-9.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-10.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-11.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-12.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-13.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-14.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-15.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-18.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-19.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-20.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-21.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-22.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-23.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-24.sql", "PG16 parser fails: PG18-only syntax"], - [16, 17, "misc/pg18-25.sql", "PG16 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-1.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-2.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-3.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-4.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-7.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-8.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-9.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-10.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-11.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-12.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-13.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-14.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-15.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-18.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-19.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-20.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-21.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-22.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-23.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-24.sql", "PG17 parser fails: PG18-only syntax"], - [17, 18, "misc/pg18-25.sql", "PG17 parser fails: PG18-only syntax"], + [13, 14, 'misc/pg18-1.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-2.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-3.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-4.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-7.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-8.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-9.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-10.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-11.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-12.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-13.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-14.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-15.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-18.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-19.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-20.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-21.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-22.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-23.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-24.sql', 'PG13 parser fails: PG18-only syntax'], + [13, 14, 'misc/pg18-25.sql', 'PG13 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-1.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-2.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-3.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-4.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-7.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-8.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-9.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-10.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-11.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-12.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-13.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-14.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-15.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-18.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-19.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-20.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-21.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-22.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-23.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-24.sql', 'PG14 parser fails: PG18-only syntax'], + [14, 15, 'misc/pg18-25.sql', 'PG14 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-1.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-2.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-3.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-4.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-7.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-8.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-9.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-10.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-11.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-12.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-13.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-14.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-15.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-18.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-19.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-20.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-21.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-22.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-23.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-24.sql', 'PG15 parser fails: PG18-only syntax'], + [15, 16, 'misc/pg18-25.sql', 'PG15 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-1.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-2.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-3.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-4.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-7.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-8.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-9.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-10.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-11.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-12.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-13.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-14.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-15.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-18.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-19.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-20.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-21.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-22.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-23.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-24.sql', 'PG16 parser fails: PG18-only syntax'], + [16, 17, 'misc/pg18-25.sql', 'PG16 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-1.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-2.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-3.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-4.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-7.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-8.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-9.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-10.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-11.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-12.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-13.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-14.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-15.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-18.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-19.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-20.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-21.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-22.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-23.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-24.sql', 'PG17 parser fails: PG18-only syntax'], + [17, 18, 'misc/pg18-25.sql', 'PG17 parser fails: PG18-only syntax'], - [16, 17, "latest/postgres/create_am-62.sql", "16-17 parser fails with 'syntax error at or near 'DEFAULT'"], + [16, 17, 'latest/postgres/create_am-62.sql', "16-17 parser fails with 'syntax error at or near 'DEFAULT'"], - [15, 16, "latest/postgres/create_role-83.sql", "PG15 parser fails with \"syntax error at or near 'INHERIT'\""], - [15, 16, "latest/postgres/create_role-80.sql", "PG15 parser fails with \"syntax error at or near 'OPTION'\""], - [15, 16, "latest/postgres/create_am-96.sql", "PG15 parser fails with 'syntax error at or near 'DEFAULT'"], - [15, 16, "latest/postgres/create_am-74.sql", "PG15 parser fails with 'syntax error at or near 'DEFAULT'"], - [15, 16, "latest/postgres/create_am-65.sql", "PG15 parser fails with 'syntax error at or near 'DEFAULT'"], - [15, 16, "latest/postgres/create_am-62.sql", "PG15 parser fails with 'syntax error at or near 'DEFAULT'"], - [15, 16, "latest/postgres/create_am-109.sql", "PG15 parser fails with 'syntax error at or near 'DEFAULT'"], - [15, 16, "latest/postgres/create_am-106.sql", "PG15 parser fails with 'syntax error at or near 'DEFAULT'"], + [15, 16, 'latest/postgres/create_role-83.sql', "PG15 parser fails with \"syntax error at or near 'INHERIT'\""], + [15, 16, 'latest/postgres/create_role-80.sql', "PG15 parser fails with \"syntax error at or near 'OPTION'\""], + [15, 16, 'latest/postgres/create_am-96.sql', "PG15 parser fails with 'syntax error at or near 'DEFAULT'"], + [15, 16, 'latest/postgres/create_am-74.sql', "PG15 parser fails with 'syntax error at or near 'DEFAULT'"], + [15, 16, 'latest/postgres/create_am-65.sql', "PG15 parser fails with 'syntax error at or near 'DEFAULT'"], + [15, 16, 'latest/postgres/create_am-62.sql', "PG15 parser fails with 'syntax error at or near 'DEFAULT'"], + [15, 16, 'latest/postgres/create_am-109.sql', "PG15 parser fails with 'syntax error at or near 'DEFAULT'"], + [15, 16, 'latest/postgres/create_am-106.sql', "PG15 parser fails with 'syntax error at or near 'DEFAULT'"], - [14, 15, "misc/issues-5.sql", "PG14 parser fails with \"syntax error at or near 'NULLS'\""], - [14, 15, "misc/issues-3.sql", "PG14 parser fails with \"syntax error at or near 'NULLS'\""], - [14, 15, "latest/postgres/create_role-83.sql", "PG14 parser fails with \"syntax error at or near 'INHERIT'\""], - [14, 15, "latest/postgres/create_role-80.sql", "PG14 parser fails with \"syntax error at or near 'OPTION'\""], - [14, 15, "latest/postgres/create_index-85.sql", "PG14 parser fails with \"syntax error at or near 'NULLS'\""], - [14, 15, "latest/postgres/create_index-83.sql", "PG14 parser fails with \"syntax error at or near 'NULLS'\""], - [14, 15, "latest/postgres/create_index-82.sql", "PG14 parser fails with \"syntax error at or near 'NULLS'\""], - [14, 15, "latest/postgres/create_index-72.sql", "PG14 parser fails with \"syntax error at or near 'NULLS'\""], - [14, 15, "latest/postgres/create_index-71.sql", "PG14 parser fails with \"syntax error at or near 'NULLS'\""], - [14, 15, "latest/postgres/create_index-326.sql", "PG14 parser fails with \"syntax error at end of input\""], - [14, 15, "latest/postgres/create_index-184.sql", "PG14 parser fails with \"syntax error at or near 'NULLS'\""], - [14, 15, "latest/postgres/create_am-96.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-94.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-90.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-86.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-75.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-74.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-73.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-70.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-65.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-62.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-57.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-55.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-53.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-112.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-109.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-106.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [14, 15, "latest/postgres/create_am-104.sql", "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'misc/issues-5.sql', "PG14 parser fails with \"syntax error at or near 'NULLS'\""], + [14, 15, 'misc/issues-3.sql', "PG14 parser fails with \"syntax error at or near 'NULLS'\""], + [14, 15, 'latest/postgres/create_role-83.sql', "PG14 parser fails with \"syntax error at or near 'INHERIT'\""], + [14, 15, 'latest/postgres/create_role-80.sql', "PG14 parser fails with \"syntax error at or near 'OPTION'\""], + [14, 15, 'latest/postgres/create_index-85.sql', "PG14 parser fails with \"syntax error at or near 'NULLS'\""], + [14, 15, 'latest/postgres/create_index-83.sql', "PG14 parser fails with \"syntax error at or near 'NULLS'\""], + [14, 15, 'latest/postgres/create_index-82.sql', "PG14 parser fails with \"syntax error at or near 'NULLS'\""], + [14, 15, 'latest/postgres/create_index-72.sql', "PG14 parser fails with \"syntax error at or near 'NULLS'\""], + [14, 15, 'latest/postgres/create_index-71.sql', "PG14 parser fails with \"syntax error at or near 'NULLS'\""], + [14, 15, 'latest/postgres/create_index-326.sql', 'PG14 parser fails with "syntax error at end of input"'], + [14, 15, 'latest/postgres/create_index-184.sql', "PG14 parser fails with \"syntax error at or near 'NULLS'\""], + [14, 15, 'latest/postgres/create_am-96.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-94.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-90.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-86.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-75.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-74.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-73.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-70.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-65.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-62.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-57.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-55.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-53.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-112.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-109.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-106.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], + [14, 15, 'latest/postgres/create_am-104.sql', "PG14 parser fails with \"syntax error at or near 'ACCESS'\""], - [13, 14, "misc/issues-5.sql", "PG13 parser fails with \"syntax error at or near 'NULLS'\""], - [13, 14, "misc/issues-3.sql", "PG13 parser fails with \"syntax error at or near 'NULLS'\""], - [13, 14, "latest/postgres/create_view-281.sql", "PG13 parser fails with \"syntax error at or near 'f'\""], - [13, 14, "latest/postgres/create_view-132.sql", "PG13 parser fails with \"syntax error at or near 'as'\""], - [13, 14, "latest/postgres/create_view-130.sql", "PG13 parser fails with \"syntax error at or near 'as'\""], - [13, 14, "latest/postgres/create_schema-9.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-8.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-27.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-26.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-25.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-24.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-23.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-22.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-21.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-20.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-19.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-18.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-17.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-16.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-15.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-14.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-13.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-12.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-11.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_schema-10.sql", "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], - [13, 14, "latest/postgres/create_role-83.sql", "PG13 parser fails with \"syntax error at or near 'INHERIT'\""], - [13, 14, "latest/postgres/create_role-80.sql", "PG13 parser fails with \"syntax error at or near 'OPTION'\""], - [13, 14, "latest/postgres/create_procedure-49.sql", "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], - [13, 14, "latest/postgres/create_procedure-16.sql", "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], - [13, 14, "latest/postgres/create_procedure-12.sql", "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], - [13, 14, "latest/postgres/create_index-85.sql", "PG13 parser fails with \"syntax error at or near 'NULLS'\""], - [13, 14, "latest/postgres/create_index-83.sql", "PG13 parser fails with \"syntax error at or near 'NULLS'\""], - [13, 14, "latest/postgres/create_index-82.sql", "PG13 parser fails with \"syntax error at or near 'NULLS'\""], - [13, 14, "latest/postgres/create_index-72.sql", "PG13 parser fails with \"syntax error at or near 'NULLS'\""], - [13, 14, "latest/postgres/create_index-71.sql", "PG13 parser fails with \"syntax error at or near 'NULLS'\""], - [13, 14, "latest/postgres/create_index-326.sql", "PG13 parser fails with \"syntax error at or near 'CONCURRENTLY'\""], - [13, 14, "latest/postgres/create_index-325.sql", "PG13 parser fails with \"syntax error at or near 'CONCURRENTLY'\""], - [13, 14, "latest/postgres/create_index-210.sql", "PG13 parser fails with \"syntax error at or near 'CONCURRENTLY'\""], - [13, 14, "latest/postgres/create_index-184.sql", "PG13 parser fails with \"syntax error at or near 'NULLS'\""], - [13, 14, "latest/postgres/create_function_sql-98.sql", "PG13 parser fails with \"syntax error at or near 'RETURN'\""], - [13, 14, "latest/postgres/create_function_sql-86.sql", "PG13 parser fails with \"syntax error at or near 'RETURN'\""], - [13, 14, "latest/postgres/create_function_sql-68.sql", "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], - [13, 14, "latest/postgres/create_function_sql-67.sql", "PG13 parser fails with \"syntax error at or near 'RETURN'\""], - [13, 14, "latest/postgres/create_function_sql-66.sql", "PG13 parser fails with \"syntax error at or near 'RETURN'\""], - [13, 14, "latest/postgres/create_function_sql-65.sql", "PG13 parser fails with \"syntax error at or near 'RETURN'\""], - [13, 14, "latest/postgres/create_function_sql-64.sql", "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], - [13, 14, "latest/postgres/create_function_sql-62.sql", "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], - [13, 14, "latest/postgres/create_function_sql-61.sql", "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], - [13, 14, "latest/postgres/create_function_sql-60.sql", "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], - [13, 14, "latest/postgres/create_function_sql-59.sql", "PG13 parser fails with \"syntax error at or near 'RETURN'\""], - [13, 14, "latest/postgres/create_function_sql-58.sql", "PG13 parser fails with \"syntax error at or near 'RETURN'\""], - [13, 14, "latest/postgres/create_function_sql-57.sql", "PG13 parser fails with \"syntax error at or near 'RETURN'\""], - [13, 14, "latest/postgres/create_function_sql-121.sql", "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], - [13, 14, "latest/postgres/create_function_sql-100.sql", "PG13 parser fails with \"syntax error at or near 'RETURN'\""], - [13, 14, "latest/postgres/create_am-96.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-94.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-90.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-86.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-75.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-74.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-73.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-70.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-65.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-62.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-57.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-55.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-53.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-112.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-109.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-106.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], - [13, 14, "latest/postgres/create_am-104.sql", "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'misc/issues-5.sql', "PG13 parser fails with \"syntax error at or near 'NULLS'\""], + [13, 14, 'misc/issues-3.sql', "PG13 parser fails with \"syntax error at or near 'NULLS'\""], + [13, 14, 'latest/postgres/create_view-281.sql', "PG13 parser fails with \"syntax error at or near 'f'\""], + [13, 14, 'latest/postgres/create_view-132.sql', "PG13 parser fails with \"syntax error at or near 'as'\""], + [13, 14, 'latest/postgres/create_view-130.sql', "PG13 parser fails with \"syntax error at or near 'as'\""], + [13, 14, 'latest/postgres/create_schema-9.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-8.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-27.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-26.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-25.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-24.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-23.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-22.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-21.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-20.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-19.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-18.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-17.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-16.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-15.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-14.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-13.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-12.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-11.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_schema-10.sql', "PG13 parser fails with \"syntax error at or near 'CURRENT_ROLE'\""], + [13, 14, 'latest/postgres/create_role-83.sql', "PG13 parser fails with \"syntax error at or near 'INHERIT'\""], + [13, 14, 'latest/postgres/create_role-80.sql', "PG13 parser fails with \"syntax error at or near 'OPTION'\""], + [13, 14, 'latest/postgres/create_procedure-49.sql', "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], + [13, 14, 'latest/postgres/create_procedure-16.sql', "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], + [13, 14, 'latest/postgres/create_procedure-12.sql', "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], + [13, 14, 'latest/postgres/create_index-85.sql', "PG13 parser fails with \"syntax error at or near 'NULLS'\""], + [13, 14, 'latest/postgres/create_index-83.sql', "PG13 parser fails with \"syntax error at or near 'NULLS'\""], + [13, 14, 'latest/postgres/create_index-82.sql', "PG13 parser fails with \"syntax error at or near 'NULLS'\""], + [13, 14, 'latest/postgres/create_index-72.sql', "PG13 parser fails with \"syntax error at or near 'NULLS'\""], + [13, 14, 'latest/postgres/create_index-71.sql', "PG13 parser fails with \"syntax error at or near 'NULLS'\""], + [13, 14, 'latest/postgres/create_index-326.sql', "PG13 parser fails with \"syntax error at or near 'CONCURRENTLY'\""], + [13, 14, 'latest/postgres/create_index-325.sql', "PG13 parser fails with \"syntax error at or near 'CONCURRENTLY'\""], + [13, 14, 'latest/postgres/create_index-210.sql', "PG13 parser fails with \"syntax error at or near 'CONCURRENTLY'\""], + [13, 14, 'latest/postgres/create_index-184.sql', "PG13 parser fails with \"syntax error at or near 'NULLS'\""], + [13, 14, 'latest/postgres/create_function_sql-98.sql', "PG13 parser fails with \"syntax error at or near 'RETURN'\""], + [13, 14, 'latest/postgres/create_function_sql-86.sql', "PG13 parser fails with \"syntax error at or near 'RETURN'\""], + [13, 14, 'latest/postgres/create_function_sql-68.sql', "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], + [13, 14, 'latest/postgres/create_function_sql-67.sql', "PG13 parser fails with \"syntax error at or near 'RETURN'\""], + [13, 14, 'latest/postgres/create_function_sql-66.sql', "PG13 parser fails with \"syntax error at or near 'RETURN'\""], + [13, 14, 'latest/postgres/create_function_sql-65.sql', "PG13 parser fails with \"syntax error at or near 'RETURN'\""], + [13, 14, 'latest/postgres/create_function_sql-64.sql', "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], + [13, 14, 'latest/postgres/create_function_sql-62.sql', "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], + [13, 14, 'latest/postgres/create_function_sql-61.sql', "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], + [13, 14, 'latest/postgres/create_function_sql-60.sql', "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], + [13, 14, 'latest/postgres/create_function_sql-59.sql', "PG13 parser fails with \"syntax error at or near 'RETURN'\""], + [13, 14, 'latest/postgres/create_function_sql-58.sql', "PG13 parser fails with \"syntax error at or near 'RETURN'\""], + [13, 14, 'latest/postgres/create_function_sql-57.sql', "PG13 parser fails with \"syntax error at or near 'RETURN'\""], + [13, 14, 'latest/postgres/create_function_sql-121.sql', "PG13 parser fails with \"syntax error at or near 'BEGIN'\""], + [13, 14, 'latest/postgres/create_function_sql-100.sql', "PG13 parser fails with \"syntax error at or near 'RETURN'\""], + [13, 14, 'latest/postgres/create_am-96.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-94.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-90.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-86.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-75.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-74.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-73.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-70.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-65.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-62.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-57.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-55.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-53.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-112.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-109.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-106.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], + [13, 14, 'latest/postgres/create_am-104.sql', "PG13 parser fails with 'syntax error at or near 'ACCESS'"], ]; \ No newline at end of file diff --git a/packages/transform-ast/test-utils/skip-tests/transformer-errors.ts b/packages/transform-ast/test-utils/skip-tests/transformer-errors.ts index 4b6ff8bc..f140f076 100644 --- a/packages/transform-ast/test-utils/skip-tests/transformer-errors.ts +++ b/packages/transform-ast/test-utils/skip-tests/transformer-errors.ts @@ -1,84 +1,84 @@ -import { SkipTest } from "./types"; +import { SkipTest } from './types'; export const transformerErrors: SkipTest[] = [ - [16, 17, "pretty/misc-5.sql", "16-17 transformer fails WITH clause TypeCast prefix issue: transformer adds pg_catalog prefix to JSON types when expected output has none"], - [16, 17, "latest/postgres/create_am-96.sql", "16-17 transformer fails with 'syntax error at or near 'DEFAULT'"], - [16, 17, "latest/postgres/create_am-74.sql", "16-17 transformer fails with 'syntax error at or near 'DEFAULT'"], - [16, 17, "latest/postgres/create_am-65.sql", "16-17 transformer fails with 'syntax error at or near 'DEFAULT'"], - [16, 17, "latest/postgres/create_am-109.sql", "16-17 transformer fails with 'syntax error at or near 'DEFAULT'"], - [16, 17, "latest/postgres/create_am-106.sql", "16-17 transformer fails with 'syntax error at or near 'DEFAULT'"], + [16, 17, 'pretty/misc-5.sql', '16-17 transformer fails WITH clause TypeCast prefix issue: transformer adds pg_catalog prefix to JSON types when expected output has none'], + [16, 17, 'latest/postgres/create_am-96.sql', "16-17 transformer fails with 'syntax error at or near 'DEFAULT'"], + [16, 17, 'latest/postgres/create_am-74.sql', "16-17 transformer fails with 'syntax error at or near 'DEFAULT'"], + [16, 17, 'latest/postgres/create_am-65.sql', "16-17 transformer fails with 'syntax error at or near 'DEFAULT'"], + [16, 17, 'latest/postgres/create_am-109.sql', "16-17 transformer fails with 'syntax error at or near 'DEFAULT'"], + [16, 17, 'latest/postgres/create_am-106.sql', "16-17 transformer fails with 'syntax error at or near 'DEFAULT'"], - [15, 16, "original/upstream/json-102.sql", "15-16 transformer fails with function name transformation - adds pg_catalog schema qualification"], - [15, 16, "latest/postgres/create_view-281.sql", "15-16 transformer fails with AST transformation mismatch"], - [15, 16, "latest/postgres/create_index-326.sql", "15-16 transformer fails with syntax error at end of input"], + [15, 16, 'original/upstream/json-102.sql', '15-16 transformer fails with function name transformation - adds pg_catalog schema qualification'], + [15, 16, 'latest/postgres/create_view-281.sql', '15-16 transformer fails with AST transformation mismatch'], + [15, 16, 'latest/postgres/create_index-326.sql', '15-16 transformer fails with syntax error at end of input'], - [13, 14, "original/upstream/rangetypes-300.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN for function parameters"], - [13, 14, "original/upstream/rangetypes-294.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN for function parameters"], - [13, 14, "original/upstream/rangetypes-281.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN for function parameters"], - [13, 14, "original/upstream/rangefuncs-295.sql", "AST transformer bug - removes parameter names from function parameters in DROP FUNCTION statements"], - [13, 14, "original/upstream/rangefuncs-290.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements"], - [13, 14, "original/upstream/rangefuncs-257.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements"], - [13, 14, "original/upstream/rangefuncs-247.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements"], - [13, 14, "original/upstream/rangefuncs-246.sql", "AST transformer bug - converts FUNC_PARAM_IN/FUNC_PARAM_INOUT to FUNC_PARAM_DEFAULT and removes parameter names"], - [13, 14, "original/upstream/rangefuncs-245.sql", "AST transformer bug - incorrectly handles function parameters in DROP FUNCTION statements, removes parameters and changes modes"], - [13, 14, "original/upstream/polymorphism-243.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], - [13, 14, "original/upstream/polymorphism-242.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], - [13, 14, "original/upstream/polymorphism-237.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], - [13, 14, "original/upstream/polymorphism-236.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], - [13, 14, "original/upstream/polymorphism-227.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], - [13, 14, "original/upstream/polymorphism-195.sql", "AST transformer bug - converts FUNC_PARAM_VARIADIC to FUNC_PARAM_DEFAULT and removes parameter names in DROP FUNCTION statements with variadic parameters"], - [13, 14, "original/upstream/polymorphism-157.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], - [13, 14, "original/upstream/plpgsql-828.sql", "AST transformer bug - incorrectly removes parameter names from objfuncargs in DROP FUNCTION statements with multiple parameters"], - [13, 14, "original/upstream/plpgsql-732.sql", "AST transformer bug - incorrectly removes parameter names from objfuncargs in DROP FUNCTION statements"], - [13, 14, "original/upstream/plpgsql-709.sql", "AST transformer bug - converts FUNC_PARAM_IN to FUNC_PARAM_DEFAULT in CREATE FUNCTION statements with default parameter values"], - [13, 14, "original/upstream/groupingsets-6.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], - [13, 14, "original/upstream/create_function_3-52.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], - [13, 14, "original/upstream/create_function_3-51.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], - [13, 14, "latest/postgres/create_procedure-84.sql", "AST transformer bug - incorrectly converts objname structure from array to object with numbered keys in ALTER PROCEDURE statements"], - [13, 14, "latest/postgres/create_procedure-80.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE PROCEDURE statements with default parameter values"], - [13, 14, "latest/postgres/create_procedure-72.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE PROCEDURE statements with default parameter values"], - [13, 14, "latest/postgres/create_procedure-68.sql", "AST transformer bug - incorrectly handles function parameters in DROP PROCEDURE statements, adds extra parameters and changes modes"], - [13, 14, "latest/postgres/create_procedure-64.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE PROCEDURE statements with default parameter values"], - [13, 14, "latest/postgres/create_procedure-41.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE PROCEDURE statements with default parameter values"], - [13, 14, "latest/postgres/create_procedure-102.sql", "AST transformer bug - incorrectly removes objfuncargs array from DROP ROUTINE statements"], - [13, 14, "latest/postgres/create_index-403.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-378.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-373.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-372.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-368.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-366.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-365.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-351.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-338.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-337.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-334.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-327.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-324.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-323.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-322.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-321.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-320.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-318.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-311.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-302.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-300.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-296.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-285.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-283.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-279.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-278.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-276.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-275.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-256.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-250.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-243.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-237.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-229.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-228.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-227.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-223.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_index-222.sql", "AST transformer bug - missing params array with concurrently DefElem in ReindexStmt"], - [13, 14, "latest/postgres/create_function_sql-91.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], - [13, 14, "latest/postgres/create_function_sql-90.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], - [13, 14, "latest/postgres/create_function_sql-115.sql", "AST transformer bug - incorrectly adds parameter names to objfuncargs in DROP FUNCTION statements"], + [13, 14, 'original/upstream/rangetypes-300.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN for function parameters'], + [13, 14, 'original/upstream/rangetypes-294.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN for function parameters'], + [13, 14, 'original/upstream/rangetypes-281.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN for function parameters'], + [13, 14, 'original/upstream/rangefuncs-295.sql', 'AST transformer bug - removes parameter names from function parameters in DROP FUNCTION statements'], + [13, 14, 'original/upstream/rangefuncs-290.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements'], + [13, 14, 'original/upstream/rangefuncs-257.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements'], + [13, 14, 'original/upstream/rangefuncs-247.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements'], + [13, 14, 'original/upstream/rangefuncs-246.sql', 'AST transformer bug - converts FUNC_PARAM_IN/FUNC_PARAM_INOUT to FUNC_PARAM_DEFAULT and removes parameter names'], + [13, 14, 'original/upstream/rangefuncs-245.sql', 'AST transformer bug - incorrectly handles function parameters in DROP FUNCTION statements, removes parameters and changes modes'], + [13, 14, 'original/upstream/polymorphism-243.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values'], + [13, 14, 'original/upstream/polymorphism-242.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values'], + [13, 14, 'original/upstream/polymorphism-237.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values'], + [13, 14, 'original/upstream/polymorphism-236.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values'], + [13, 14, 'original/upstream/polymorphism-227.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values'], + [13, 14, 'original/upstream/polymorphism-195.sql', 'AST transformer bug - converts FUNC_PARAM_VARIADIC to FUNC_PARAM_DEFAULT and removes parameter names in DROP FUNCTION statements with variadic parameters'], + [13, 14, 'original/upstream/polymorphism-157.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values'], + [13, 14, 'original/upstream/plpgsql-828.sql', 'AST transformer bug - incorrectly removes parameter names from objfuncargs in DROP FUNCTION statements with multiple parameters'], + [13, 14, 'original/upstream/plpgsql-732.sql', 'AST transformer bug - incorrectly removes parameter names from objfuncargs in DROP FUNCTION statements'], + [13, 14, 'original/upstream/plpgsql-709.sql', 'AST transformer bug - converts FUNC_PARAM_IN to FUNC_PARAM_DEFAULT in CREATE FUNCTION statements with default parameter values'], + [13, 14, 'original/upstream/groupingsets-6.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values'], + [13, 14, 'original/upstream/create_function_3-52.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values'], + [13, 14, 'original/upstream/create_function_3-51.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values'], + [13, 14, 'latest/postgres/create_procedure-84.sql', 'AST transformer bug - incorrectly converts objname structure from array to object with numbered keys in ALTER PROCEDURE statements'], + [13, 14, 'latest/postgres/create_procedure-80.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE PROCEDURE statements with default parameter values'], + [13, 14, 'latest/postgres/create_procedure-72.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE PROCEDURE statements with default parameter values'], + [13, 14, 'latest/postgres/create_procedure-68.sql', 'AST transformer bug - incorrectly handles function parameters in DROP PROCEDURE statements, adds extra parameters and changes modes'], + [13, 14, 'latest/postgres/create_procedure-64.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE PROCEDURE statements with default parameter values'], + [13, 14, 'latest/postgres/create_procedure-41.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE PROCEDURE statements with default parameter values'], + [13, 14, 'latest/postgres/create_procedure-102.sql', 'AST transformer bug - incorrectly removes objfuncargs array from DROP ROUTINE statements'], + [13, 14, 'latest/postgres/create_index-403.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-378.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-373.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-372.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-368.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-366.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-365.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-351.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-338.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-337.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-334.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-327.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-324.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-323.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-322.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-321.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-320.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-318.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-311.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-302.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-300.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-296.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-285.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-283.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-279.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-278.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-276.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-275.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-256.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-250.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-243.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-237.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-229.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-228.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-227.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-223.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_index-222.sql', 'AST transformer bug - missing params array with concurrently DefElem in ReindexStmt'], + [13, 14, 'latest/postgres/create_function_sql-91.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values'], + [13, 14, 'latest/postgres/create_function_sql-90.sql', 'AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values'], + [13, 14, 'latest/postgres/create_function_sql-115.sql', 'AST transformer bug - incorrectly adds parameter names to objfuncargs in DROP FUNCTION statements'], ]; \ No newline at end of file diff --git a/packages/transform/scripts/hunt-plpgsql-bugs.js b/packages/transform/scripts/hunt-plpgsql-bugs.js index 34b4de63..2af47039 100644 --- a/packages/transform/scripts/hunt-plpgsql-bugs.js +++ b/packages/transform/scripts/hunt-plpgsql-bugs.js @@ -1,4 +1,4 @@ -/* eslint-disable */ + // Bug-hunt sweep: run esoteric PL/pgSQL shapes through transformSql with // roundTrip:true, and also check that key tokens survive in the output. const { loadModule } = require('plpgsql-parser'); diff --git a/packages/transform/scripts/scan-corpus.js b/packages/transform/scripts/scan-corpus.js index f4dd287a..23ba51e2 100644 --- a/packages/transform/scripts/scan-corpus.js +++ b/packages/transform/scripts/scan-corpus.js @@ -1,4 +1,4 @@ -/* eslint-disable */ + // Coverage audit tool: enumerate every SQL statement node type and PL/pgSQL // node type present in a generated corpus, with an example file + frequency for // each. Use it to confirm the transform visitor + round-trip tests diff --git a/packages/transform/src/extension-transform.ts b/packages/transform/src/extension-transform.ts index 3cb7493e..772b7795 100644 --- a/packages/transform/src/extension-transform.ts +++ b/packages/transform/src/extension-transform.ts @@ -18,7 +18,7 @@ import { walk, walkSqlAst } from '@pgsql/traverse'; import { Deparser, parseSql, transformSync } from 'plpgsql-parser'; -import type { ExtensionRouteSpec, ExtensionRouterOptions, ExtensionSymbolNamespace } from './extension-router'; +import type { ExtensionRouterOptions, ExtensionRouteSpec, ExtensionSymbolNamespace } from './extension-router'; import { ExtensionRouter } from './extension-router'; /** What an extension transform changed. */ diff --git a/packages/transform/src/facts.ts b/packages/transform/src/facts.ts index e3242160..5fa31d16 100644 --- a/packages/transform/src/facts.ts +++ b/packages/transform/src/facts.ts @@ -301,143 +301,143 @@ function classifyOne(nodeTag: string, node: any): StatementFacts { }; switch (nodeTag) { - case 'CreateSchemaStmt': - facts.creates.push(qn(null, node.schemaname)); - break; - case 'CreateExtensionStmt': - facts.extension = { - name: node.extname, - schema: extensionSchemaOption(node.options), - action: 'create', - ifNotExists: node.if_not_exists === true - }; - break; - case 'CreateStmt': - case 'ViewStmt': { - const rel = nodeTag === 'ViewStmt' ? node.view : node.relation; - if (rel) facts.creates.push(qn(rel.schemaname ?? null, rel.relname)); - break; + case 'CreateSchemaStmt': + facts.creates.push(qn(null, node.schemaname)); + break; + case 'CreateExtensionStmt': + facts.extension = { + name: node.extname, + schema: extensionSchemaOption(node.options), + action: 'create', + ifNotExists: node.if_not_exists === true + }; + break; + case 'CreateStmt': + case 'ViewStmt': { + const rel = nodeTag === 'ViewStmt' ? node.view : node.relation; + if (rel) facts.creates.push(qn(rel.schemaname ?? null, rel.relname)); + break; + } + case 'IndexStmt': + if (node.relation) { + facts.creates.push(qn(node.relation.schemaname ?? null, node.idxname ?? node.relation.relname)); } - case 'IndexStmt': - if (node.relation) { - facts.creates.push(qn(node.relation.schemaname ?? null, node.idxname ?? node.relation.relname)); - } - break; - case 'CreateFunctionStmt': { - const name = nameListToQualified(node.funcname); - if (name) facts.creates.push(name); - for (const opt of node.options ?? []) { - const def = opt?.DefElem; - if (def?.defname === 'security' && def?.arg?.Boolean?.boolval === true) { - facts.securityDefiner = true; - } + break; + case 'CreateFunctionStmt': { + const name = nameListToQualified(node.funcname); + if (name) facts.creates.push(name); + for (const opt of node.options ?? []) { + const def = opt?.DefElem; + if (def?.defname === 'security' && def?.arg?.Boolean?.boolval === true) { + facts.securityDefiner = true; } - break; } - case 'CreateTrigStmt': - if (node.relation) { - // Trigger names are only unique per table; qualify with the table. - facts.creates.push( - qn(node.relation.schemaname ?? null, `${node.relation.relname}.${node.trigname}`) - ); - } - pushRef(facts.references, nameListToQualified(node.funcname)); - break; - case 'CreatePolicyStmt': - case 'AlterPolicyStmt': - if (node.table) { - // Policy names are only unique per table; qualify with the table. - facts.creates.push( - qn(node.table.schemaname ?? null, `${node.table.relname}.${node.policy_name}`) - ); - // The guarded table lives on `node.table`; the generic RangeVar walker - // does not descend into it, so capture the reference explicitly. - if (node.table.schemaname) { - pushRef(facts.references, qn(node.table.schemaname, node.table.relname)); - } - } - break; - case 'CreateSeqStmt': - if (node.sequence) { - facts.creates.push(qn(node.sequence.schemaname ?? null, node.sequence.relname)); - } - break; - case 'CompositeTypeStmt': - if (node.typevar) { - facts.creates.push(qn(node.typevar.schemaname ?? null, node.typevar.relname)); + break; + } + case 'CreateTrigStmt': + if (node.relation) { + // Trigger names are only unique per table; qualify with the table. + facts.creates.push( + qn(node.relation.schemaname ?? null, `${node.relation.relname}.${node.trigname}`) + ); + } + pushRef(facts.references, nameListToQualified(node.funcname)); + break; + case 'CreatePolicyStmt': + case 'AlterPolicyStmt': + if (node.table) { + // Policy names are only unique per table; qualify with the table. + facts.creates.push( + qn(node.table.schemaname ?? null, `${node.table.relname}.${node.policy_name}`) + ); + // The guarded table lives on `node.table`; the generic RangeVar walker + // does not descend into it, so capture the reference explicitly. + if (node.table.schemaname) { + pushRef(facts.references, qn(node.table.schemaname, node.table.relname)); } - break; - case 'CreateEnumStmt': - case 'CreateRangeStmt': { - const name = nameListToQualified(node.typeName); - if (name) facts.creates.push(name); - break; } - case 'CreateDomainStmt': { - // `typeName` on a domain is the base type; the name is `domainname`. - const name = nameListToQualified(node.domainname); - if (name) facts.creates.push(name); - break; + break; + case 'CreateSeqStmt': + if (node.sequence) { + facts.creates.push(qn(node.sequence.schemaname ?? null, node.sequence.relname)); } - case 'AlterObjectSchemaStmt': - // ALTER EXTENSION SET SCHEMA . Other object types - // (TABLE/TYPE/FUNCTION ... SET SCHEMA) keep their default classification. - if (node.objectType === 'OBJECT_EXTENSION') { - const name = node.object?.String?.sval; - if (typeof name === 'string') { - facts.kind = 'extension'; - facts.extension = { - name, - schema: typeof node.newschema === 'string' ? node.newschema : null, - action: 'set_schema' - }; - } - } - break; - case 'DropStmt': - // DROP EXTENSION [, ...]. Extension names are bare String nodes. - // Other DROP object types keep their default classification. When - // several extensions are dropped in one statement the first names the - // fact; the full list stays available via the raw node. - if (node.removeType === 'OBJECT_EXTENSION' && Array.isArray(node.objects)) { - const name = node.objects[0]?.String?.sval; - if (typeof name === 'string') { - facts.kind = 'extension'; - facts.extension = { name, schema: null, action: 'drop' }; - } + break; + case 'CompositeTypeStmt': + if (node.typevar) { + facts.creates.push(qn(node.typevar.schemaname ?? null, node.typevar.relname)); + } + break; + case 'CreateEnumStmt': + case 'CreateRangeStmt': { + const name = nameListToQualified(node.typeName); + if (name) facts.creates.push(name); + break; + } + case 'CreateDomainStmt': { + // `typeName` on a domain is the base type; the name is `domainname`. + const name = nameListToQualified(node.domainname); + if (name) facts.creates.push(name); + break; + } + case 'AlterObjectSchemaStmt': + // ALTER EXTENSION SET SCHEMA . Other object types + // (TABLE/TYPE/FUNCTION ... SET SCHEMA) keep their default classification. + if (node.objectType === 'OBJECT_EXTENSION') { + const name = node.object?.String?.sval; + if (typeof name === 'string') { + facts.kind = 'extension'; + facts.extension = { + name, + schema: typeof node.newschema === 'string' ? node.newschema : null, + action: 'set_schema' + }; } - break; - case 'AlterTableStmt': { - if (node.relation) { - facts.creates.push(qn(node.relation.schemaname ?? null, node.relation.relname)); + } + break; + case 'DropStmt': + // DROP EXTENSION [, ...]. Extension names are bare String nodes. + // Other DROP object types keep their default classification. When + // several extensions are dropped in one statement the first names the + // fact; the full list stays available via the raw node. + if (node.removeType === 'OBJECT_EXTENSION' && Array.isArray(node.objects)) { + const name = node.objects[0]?.String?.sval; + if (typeof name === 'string') { + facts.kind = 'extension'; + facts.extension = { name, schema: null, action: 'drop' }; } - const cmds: any[] = node.cmds ?? []; - for (const cmd of cmds) { - const subtype = cmd?.AlterTableCmd?.subtype; - if (subtype === 'AT_EnableRowSecurity' || subtype === 'AT_ForceRowSecurity' || + } + break; + case 'AlterTableStmt': { + if (node.relation) { + facts.creates.push(qn(node.relation.schemaname ?? null, node.relation.relname)); + } + const cmds: any[] = node.cmds ?? []; + for (const cmd of cmds) { + const subtype = cmd?.AlterTableCmd?.subtype; + if (subtype === 'AT_EnableRowSecurity' || subtype === 'AT_ForceRowSecurity' || subtype === 'AT_DisableRowSecurity' || subtype === 'AT_NoForceRowSecurity') { - facts.kind = 'rls_enable'; - facts.securityRelevant = true; - } else if (subtype === 'AT_AddConstraint') { - const contype = cmd?.AlterTableCmd?.def?.Constraint?.contype; - facts.kind = contype === 'CONSTR_FOREIGN' ? 'fk_constraint' : 'constraint'; - } else if (subtype === 'AT_ChangeOwner') { - facts.securityRelevant = true; - const owner = cmd?.AlterTableCmd?.newowner?.rolename; - if (owner && !facts.roles.includes(owner)) facts.roles.push(owner); - } + facts.kind = 'rls_enable'; + facts.securityRelevant = true; + } else if (subtype === 'AT_AddConstraint') { + const contype = cmd?.AlterTableCmd?.def?.Constraint?.contype; + facts.kind = contype === 'CONSTR_FOREIGN' ? 'fk_constraint' : 'constraint'; + } else if (subtype === 'AT_ChangeOwner') { + facts.securityRelevant = true; + const owner = cmd?.AlterTableCmd?.newowner?.rolename; + if (owner && !facts.roles.includes(owner)) facts.roles.push(owner); } - break; } - case 'InsertStmt': - case 'UpdateStmt': - case 'DeleteStmt': - if (node.relation) { - facts.creates.push(qn(node.relation.schemaname ?? null, node.relation.relname)); - } - break; - default: - break; + break; + } + case 'InsertStmt': + case 'UpdateStmt': + case 'DeleteStmt': + if (node.relation) { + facts.creates.push(qn(node.relation.schemaname ?? null, node.relation.relname)); + } + break; + default: + break; } collectRoles(node, facts.roles); diff --git a/packages/transform/src/index.ts b/packages/transform/src/index.ts index 1078f782..e867f280 100644 --- a/packages/transform/src/index.ts +++ b/packages/transform/src/index.ts @@ -1,3 +1,19 @@ +export type { + ExtensionDefinition, + ExtensionRoute, + ExtensionRouterOptions, + ExtensionRouteSpec, + ExtensionSymbol, + ExtensionSymbolNamespace, + SymbolRewrite, +} from './extension-router'; +export { COMMON_EXTENSIONS, ExtensionRouter } from './extension-router'; +export type { ExtensionTransformResult } from './extension-transform'; +export { + createExtensionResult, + createExtensionVisitor, + transformExtensions, +} from './extension-transform'; export type { ExtensionAction, ExtensionFact, @@ -18,36 +34,6 @@ export type { ObjectIdentityKind, } from './naming'; export { identityOf } from './naming'; -export type { - Granularity, - RestructureOptions, - RestructureResult, -} from './restructure'; -export { orderStatements, restructureSql } from './restructure'; -export type { - ExtensionDefinition, - ExtensionRoute, - ExtensionRouteSpec, - ExtensionRouterOptions, - ExtensionSymbol, - ExtensionSymbolNamespace, - SymbolRewrite, -} from './extension-router'; -export { COMMON_EXTENSIONS, ExtensionRouter } from './extension-router'; -export type { ExtensionTransformResult } from './extension-transform'; -export { - createExtensionResult, - createExtensionVisitor, - transformExtensions, -} from './extension-transform'; -export type { RoleRouteSpec } from './role-router'; -export { RoleRouter } from './role-router'; -export type { RoleTransformResult } from './role-transform'; -export { - createRoleResult, - createRoleVisitor, - transformRoles, -} from './role-transform'; export type { ObjectInventory, QualifyResult, @@ -62,14 +48,19 @@ export { qualifyUnqualified, } from './qualify'; export type { - ObjectNamespace, - ObjectRoute, - ObjectRouteTarget, - RouteNamespace, - RouteSpec, - SchemaRoute, -} from './router'; -export { SchemaRouter } from './router'; + Granularity, + RestructureOptions, + RestructureResult, +} from './restructure'; +export { orderStatements, restructureSql } from './restructure'; +export type { RoleRouteSpec } from './role-router'; +export { RoleRouter } from './role-router'; +export type { RoleTransformResult } from './role-transform'; +export { + createRoleResult, + createRoleVisitor, + transformRoles, +} from './role-transform'; export type { CapturedAsts } from './round-trip'; export { captureAstsFromSql, @@ -85,6 +76,15 @@ export { normalizeTree, trimDefElemBody, } from './round-trip-core'; +export type { + ObjectNamespace, + ObjectRoute, + ObjectRouteTarget, + RouteNamespace, + RouteSpec, + SchemaRoute, +} from './router'; +export { SchemaRouter } from './router'; export type { SchemaMappingInput, SchemaTransformPass, diff --git a/packages/transform/src/naming.ts b/packages/transform/src/naming.ts index 35d1c5c6..ceb36b2e 100644 --- a/packages/transform/src/naming.ts +++ b/packages/transform/src/naming.ts @@ -66,51 +66,51 @@ export function identityOf(facts: StatementFacts): ObjectIdentity | null { if (!created) return null; switch (facts.kind) { - case 'schema': - return { kind: 'schema', schema: null, name: created.name }; - case 'trigger': - case 'policy': { - const dot = created.name.indexOf('.'); - if (dot > 0) { - return { - kind: facts.kind, - schema: created.schema, - name: created.name.slice(dot + 1), - table: created.name.slice(0, dot) - }; - } - return { kind: facts.kind, schema: created.schema, name: created.name }; - } - case 'index': { - // IndexStmt records the index name in creates and the indexed relation - // in references (same-schema RangeVar). - const rel = facts.references.find(r => r.schema === created.schema) ?? facts.references[0]; + case 'schema': + return { kind: 'schema', schema: null, name: created.name }; + case 'trigger': + case 'policy': { + const dot = created.name.indexOf('.'); + if (dot > 0) { return { - kind: 'index', + kind: facts.kind, schema: created.schema, - name: created.name, - table: rel?.name + name: created.name.slice(dot + 1), + table: created.name.slice(0, dot) }; } - case 'fk_constraint': - case 'constraint': - case 'rls_enable': - // ALTER TABLE statements target their table. - return { kind: 'constraint', schema: created.schema, name: created.name, table: created.name }; - case 'seed_dml': - return { kind: 'seed_dml', schema: created.schema, name: created.name, table: created.name }; - case 'table': - // AlterTableStmt facts also classify as `table`-targeting; the created - // name is the table either way. - return { kind: 'table', schema: created.schema, name: created.name }; - case 'view': - case 'function': - case 'type': - return { kind: facts.kind, schema: created.schema, name: created.name }; - default: - if (facts.nodeTag === 'CreateSeqStmt') { - return { kind: 'sequence', schema: created.schema, name: created.name }; - } - return { kind: 'other', schema: created.schema, name: created.name }; + return { kind: facts.kind, schema: created.schema, name: created.name }; + } + case 'index': { + // IndexStmt records the index name in creates and the indexed relation + // in references (same-schema RangeVar). + const rel = facts.references.find(r => r.schema === created.schema) ?? facts.references[0]; + return { + kind: 'index', + schema: created.schema, + name: created.name, + table: rel?.name + }; + } + case 'fk_constraint': + case 'constraint': + case 'rls_enable': + // ALTER TABLE statements target their table. + return { kind: 'constraint', schema: created.schema, name: created.name, table: created.name }; + case 'seed_dml': + return { kind: 'seed_dml', schema: created.schema, name: created.name, table: created.name }; + case 'table': + // AlterTableStmt facts also classify as `table`-targeting; the created + // name is the table either way. + return { kind: 'table', schema: created.schema, name: created.name }; + case 'view': + case 'function': + case 'type': + return { kind: facts.kind, schema: created.schema, name: created.name }; + default: + if (facts.nodeTag === 'CreateSeqStmt') { + return { kind: 'sequence', schema: created.schema, name: created.name }; + } + return { kind: 'other', schema: created.schema, name: created.name }; } } diff --git a/packages/transform/src/restructure.ts b/packages/transform/src/restructure.ts index 5b6bb0a5..b80197a0 100644 --- a/packages/transform/src/restructure.ts +++ b/packages/transform/src/restructure.ts @@ -209,20 +209,20 @@ function foldStatements( let foldable = false; switch (cmd.subtype) { - case 'AT_AddColumn': - foldable = !!cmd.def?.ColumnDef; - break; - case 'AT_ColumnDefault': - foldable = !!cmd.name && cmd.def !== undefined; - break; - case 'AT_SetNotNull': - foldable = !!cmd.name; - break; - case 'AT_AddConstraint': - foldable = isFk ? selfFk || inlineFks : true; - break; - default: - foldable = false; + case 'AT_AddColumn': + foldable = !!cmd.def?.ColumnDef; + break; + case 'AT_ColumnDefault': + foldable = !!cmd.name && cmd.def !== undefined; + break; + case 'AT_SetNotNull': + foldable = !!cmd.name; + break; + case 'AT_AddConstraint': + foldable = isFk ? selfFk || inlineFks : true; + break; + default: + foldable = false; } if (foldable && !selfFk && !safeToFold(j, i)) { @@ -263,28 +263,28 @@ function applyFold(create: AnyNode, cmd: AnyNode): boolean { create.tableElts.find((e: AnyNode) => e?.ColumnDef?.colname === name)?.ColumnDef; switch (cmd.subtype) { - case 'AT_AddColumn': - create.tableElts.push({ ColumnDef: cmd.def.ColumnDef }); - return true; - case 'AT_ColumnDefault': { - const col = findColumn(cmd.name); - if (!col) return false; - col.constraints = col.constraints ?? []; - col.constraints.push({ Constraint: { contype: 'CONSTR_DEFAULT', raw_expr: cmd.def } }); - return true; - } - case 'AT_SetNotNull': { - const col = findColumn(cmd.name); - if (!col) return false; - col.constraints = col.constraints ?? []; - col.constraints.push({ Constraint: { contype: 'CONSTR_NOTNULL' } }); - return true; - } - case 'AT_AddConstraint': - create.tableElts.push({ Constraint: cmd.def.Constraint }); - return true; - default: - return false; + case 'AT_AddColumn': + create.tableElts.push({ ColumnDef: cmd.def.ColumnDef }); + return true; + case 'AT_ColumnDefault': { + const col = findColumn(cmd.name); + if (!col) return false; + col.constraints = col.constraints ?? []; + col.constraints.push({ Constraint: { contype: 'CONSTR_DEFAULT', raw_expr: cmd.def } }); + return true; + } + case 'AT_SetNotNull': { + const col = findColumn(cmd.name); + if (!col) return false; + col.constraints = col.constraints ?? []; + col.constraints.push({ Constraint: { contype: 'CONSTR_NOTNULL' } }); + return true; + } + case 'AT_AddConstraint': + create.tableElts.push({ Constraint: cmd.def.Constraint }); + return true; + default: + return false; } } @@ -377,13 +377,13 @@ function explodeStatements(stmts: AnyNode[]): ExplodeResult { function columnConstraintToTable(constraint: AnyNode, colname: string): AnyNode { const strNode = (sval: string): AnyNode => ({ String: { sval } }); switch (constraint.contype) { - case 'CONSTR_PRIMARY': - case 'CONSTR_UNIQUE': - return { ...constraint, keys: [strNode(colname)] }; - case 'CONSTR_FOREIGN': - return { ...constraint, fk_attrs: [strNode(colname)] }; - default: - // CHECK and others are valid table constraints as-is. - return constraint; + case 'CONSTR_PRIMARY': + case 'CONSTR_UNIQUE': + return { ...constraint, keys: [strNode(colname)] }; + case 'CONSTR_FOREIGN': + return { ...constraint, fk_attrs: [strNode(colname)] }; + default: + // CHECK and others are valid table constraints as-is. + return constraint; } } diff --git a/packages/transform/src/transform.ts b/packages/transform/src/transform.ts index 937e5c27..56ca556e 100644 --- a/packages/transform/src/transform.ts +++ b/packages/transform/src/transform.ts @@ -26,7 +26,7 @@ import { QuoteUtils } from '@pgsql/quotes'; import { walk, walkSqlAst } from '@pgsql/traverse'; -import { Deparser,parseSql, transformSync, walkPlpgsqlAst } from 'plpgsql-parser'; +import { Deparser,parseSql, transformSync } from 'plpgsql-parser'; import type { QualifyUnqualifiedOptions } from './qualify'; import { qualifyUnqualified } from './qualify'; @@ -337,23 +337,23 @@ export function createSqlVisitor( // object routes apply to DROP TABLE/FUNCTION/TYPE (e.g. revert scripts). const namespaceOfObjectType = (objType: string | undefined): RouteNamespace => { switch (objType) { - case 'OBJECT_TABLE': - case 'OBJECT_VIEW': - case 'OBJECT_SEQUENCE': - case 'OBJECT_MATVIEW': - case 'OBJECT_FOREIGN_TABLE': - case 'OBJECT_INDEX': - return 'relation'; - case 'OBJECT_FUNCTION': - case 'OBJECT_PROCEDURE': - case 'OBJECT_AGGREGATE': - case 'OBJECT_ROUTINE': - return 'function'; - case 'OBJECT_TYPE': - case 'OBJECT_DOMAIN': - return 'type'; - default: - return 'unknown'; + case 'OBJECT_TABLE': + case 'OBJECT_VIEW': + case 'OBJECT_SEQUENCE': + case 'OBJECT_MATVIEW': + case 'OBJECT_FOREIGN_TABLE': + case 'OBJECT_INDEX': + return 'relation'; + case 'OBJECT_FUNCTION': + case 'OBJECT_PROCEDURE': + case 'OBJECT_AGGREGATE': + case 'OBJECT_ROUTINE': + return 'function'; + case 'OBJECT_TYPE': + case 'OBJECT_DOMAIN': + return 'type'; + default: + return 'unknown'; } }; diff --git a/packages/traverse/src/plpgsql.ts b/packages/traverse/src/plpgsql.ts index 9f0a92a9..b6cd7ca6 100644 --- a/packages/traverse/src/plpgsql.ts +++ b/packages/traverse/src/plpgsql.ts @@ -10,42 +10,33 @@ * parser, which keeps this package free of the WASM parser dependency. */ -import type { NodePath as SqlNodePath,Visitor as SqlVisitor, Walker as SqlWalker } from './traverse'; -import { walkSqlAst } from './traverse'; import type { - PLpgSQLParseResult, - PLpgSQLFunctionNode, PLpgSQL_function, - PLpgSQLDatum, - PLpgSQLStmtNode, - PLpgSQLExprNode, - PLpgSQLTypeNode, PLpgSQL_stmt_block, - PLpgSQL_stmt_if, PLpgSQL_stmt_case, - PLpgSQL_stmt_loop, - PLpgSQL_stmt_while, - PLpgSQL_stmt_fori, - PLpgSQL_stmt_fors, - PLpgSQL_stmt_forc, - PLpgSQL_stmt_foreach_a, - PLpgSQL_stmt_return_query, - PLpgSQL_stmt_raise, PLpgSQL_stmt_dynexecute, PLpgSQL_stmt_dynfors, + PLpgSQL_stmt_forc, + PLpgSQL_stmt_foreach_a, + PLpgSQL_stmt_fori, + PLpgSQL_stmt_fors, + PLpgSQL_stmt_if, + PLpgSQL_stmt_loop, PLpgSQL_stmt_open, - PLpgSQLElsifNode, - PLpgSQLCaseWhenNode, - PLpgSQLException, - PLpgSQLRaiseOption, + PLpgSQL_stmt_raise, + PLpgSQL_stmt_return_query, + PLpgSQL_stmt_while, } from 'plpgsql-deparser'; import type { + HydratedExprAssign, HydratedExprQuery, - HydratedExprSqlStmt, HydratedExprSqlExpr, - HydratedExprAssign, + HydratedExprSqlStmt, } from 'plpgsql-deparser'; +import type {Visitor as SqlVisitor, Walker as SqlWalker } from './traverse'; +import { walkSqlAst } from './traverse'; + // PL/pgSQL node tag types export type PlpgsqlNodeTag = | 'PLpgSQL_function' @@ -153,10 +144,10 @@ export function walkPlpgsqlAst( const actualCallback: PlpgsqlWalker = typeof callback === 'function' ? callback : (path: PlpgsqlNodePath) => { - const visitor = callback as PlpgsqlVisitor; - const visitFn = visitor[path.tag]; - return visitFn ? visitFn(path) : undefined; - }; + const visitor = callback as PlpgsqlVisitor; + const visitFn = visitor[path.tag]; + return visitFn ? visitFn(path) : undefined; + }; if (Array.isArray(root)) { root.forEach((node, index) => { @@ -227,426 +218,426 @@ export function walkPlpgsqlAst( parentPath: PlpgsqlNodePath ) { switch (tag) { - case 'PLpgSQL_function': { - const fn = nodeData as PLpgSQL_function; - if (fn.datums) { - fn.datums.forEach((datum, i) => { - walkPlpgsqlAst(datum, cb, opts, parentPath, [...parentPath.keyPath, 'datums', i]); - }); - } - if (fn.action) { - walkPlpgsqlAst(fn.action, cb, opts, parentPath, [...parentPath.keyPath, 'action']); - } - break; + case 'PLpgSQL_function': { + const fn = nodeData as PLpgSQL_function; + if (fn.datums) { + fn.datums.forEach((datum, i) => { + walkPlpgsqlAst(datum, cb, opts, parentPath, [...parentPath.keyPath, 'datums', i]); + }); + } + if (fn.action) { + walkPlpgsqlAst(fn.action, cb, opts, parentPath, [...parentPath.keyPath, 'action']); } + break; + } - case 'PLpgSQL_var': { - if (nodeData.datatype) { - walkPlpgsqlAst(nodeData.datatype, cb, opts, parentPath, [...parentPath.keyPath, 'datatype']); - } - if (nodeData.default_val) { - walkPlpgsqlAst(nodeData.default_val, cb, opts, parentPath, [...parentPath.keyPath, 'default_val']); - } - if (nodeData.cursor_explicit_expr) { - walkPlpgsqlAst(nodeData.cursor_explicit_expr, cb, opts, parentPath, [...parentPath.keyPath, 'cursor_explicit_expr']); - } - break; + case 'PLpgSQL_var': { + if (nodeData.datatype) { + walkPlpgsqlAst(nodeData.datatype, cb, opts, parentPath, [...parentPath.keyPath, 'datatype']); } + if (nodeData.default_val) { + walkPlpgsqlAst(nodeData.default_val, cb, opts, parentPath, [...parentPath.keyPath, 'default_val']); + } + if (nodeData.cursor_explicit_expr) { + walkPlpgsqlAst(nodeData.cursor_explicit_expr, cb, opts, parentPath, [...parentPath.keyPath, 'cursor_explicit_expr']); + } + break; + } - case 'PLpgSQL_expr': { - // This is where we recurse into SQL expressions - walkHydratedExpr(nodeData, parentPath); - break; + case 'PLpgSQL_expr': { + // This is where we recurse into SQL expressions + walkHydratedExpr(nodeData, parentPath); + break; + } + + case 'PLpgSQL_stmt_block': { + const block = nodeData as PLpgSQL_stmt_block; + if (block.body) { + block.body.forEach((stmt, i) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); + }); + } + if (block.exceptions?.exc_list) { + block.exceptions.exc_list.forEach((exc, i) => { + walkPlpgsqlAst(exc, cb, opts, parentPath, [...parentPath.keyPath, 'exceptions', 'exc_list', i]); + }); } + break; + } - case 'PLpgSQL_stmt_block': { - const block = nodeData as PLpgSQL_stmt_block; - if (block.body) { - block.body.forEach((stmt, i) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); - }); - } - if (block.exceptions?.exc_list) { - block.exceptions.exc_list.forEach((exc, i) => { - walkPlpgsqlAst(exc, cb, opts, parentPath, [...parentPath.keyPath, 'exceptions', 'exc_list', i]); - }); - } - break; + case 'PLpgSQL_stmt_assign': { + if (nodeData.expr) { + walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); } + break; + } - case 'PLpgSQL_stmt_assign': { - if (nodeData.expr) { - walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); - } - break; + case 'PLpgSQL_stmt_if': { + const ifStmt = nodeData as PLpgSQL_stmt_if; + if (ifStmt.cond) { + walkPlpgsqlAst(ifStmt.cond, cb, opts, parentPath, [...parentPath.keyPath, 'cond']); + } + if (ifStmt.then_body) { + ifStmt.then_body.forEach((stmt, i) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'then_body', i]); + }); } + if (ifStmt.elsif_list) { + ifStmt.elsif_list.forEach((elsif, i) => { + walkPlpgsqlAst(elsif, cb, opts, parentPath, [...parentPath.keyPath, 'elsif_list', i]); + }); + } + if (ifStmt.else_body) { + ifStmt.else_body.forEach((stmt, i) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'else_body', i]); + }); + } + break; + } - case 'PLpgSQL_stmt_if': { - const ifStmt = nodeData as PLpgSQL_stmt_if; - if (ifStmt.cond) { - walkPlpgsqlAst(ifStmt.cond, cb, opts, parentPath, [...parentPath.keyPath, 'cond']); - } - if (ifStmt.then_body) { - ifStmt.then_body.forEach((stmt, i) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'then_body', i]); - }); - } - if (ifStmt.elsif_list) { - ifStmt.elsif_list.forEach((elsif, i) => { - walkPlpgsqlAst(elsif, cb, opts, parentPath, [...parentPath.keyPath, 'elsif_list', i]); - }); - } - if (ifStmt.else_body) { - ifStmt.else_body.forEach((stmt, i) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'else_body', i]); - }); - } - break; + case 'PLpgSQL_if_elsif': { + if (nodeData.cond) { + walkPlpgsqlAst(nodeData.cond, cb, opts, parentPath, [...parentPath.keyPath, 'cond']); + } + if (nodeData.stmts) { + nodeData.stmts.forEach((stmt: any, i: number) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'stmts', i]); + }); } + break; + } - case 'PLpgSQL_if_elsif': { - if (nodeData.cond) { - walkPlpgsqlAst(nodeData.cond, cb, opts, parentPath, [...parentPath.keyPath, 'cond']); - } - if (nodeData.stmts) { - nodeData.stmts.forEach((stmt: any, i: number) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'stmts', i]); - }); - } - break; + case 'PLpgSQL_stmt_case': { + const caseStmt = nodeData as PLpgSQL_stmt_case; + if (caseStmt.t_expr) { + walkPlpgsqlAst(caseStmt.t_expr, cb, opts, parentPath, [...parentPath.keyPath, 't_expr']); } + if (caseStmt.case_when_list) { + caseStmt.case_when_list.forEach((when, i) => { + walkPlpgsqlAst(when, cb, opts, parentPath, [...parentPath.keyPath, 'case_when_list', i]); + }); + } + if (caseStmt.else_stmts) { + caseStmt.else_stmts.forEach((stmt, i) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'else_stmts', i]); + }); + } + break; + } - case 'PLpgSQL_stmt_case': { - const caseStmt = nodeData as PLpgSQL_stmt_case; - if (caseStmt.t_expr) { - walkPlpgsqlAst(caseStmt.t_expr, cb, opts, parentPath, [...parentPath.keyPath, 't_expr']); - } - if (caseStmt.case_when_list) { - caseStmt.case_when_list.forEach((when, i) => { - walkPlpgsqlAst(when, cb, opts, parentPath, [...parentPath.keyPath, 'case_when_list', i]); - }); - } - if (caseStmt.else_stmts) { - caseStmt.else_stmts.forEach((stmt, i) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'else_stmts', i]); - }); - } - break; + case 'PLpgSQL_case_when': { + if (nodeData.expr) { + walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); } + if (nodeData.stmts) { + nodeData.stmts.forEach((stmt: any, i: number) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'stmts', i]); + }); + } + break; + } - case 'PLpgSQL_case_when': { - if (nodeData.expr) { - walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); - } - if (nodeData.stmts) { - nodeData.stmts.forEach((stmt: any, i: number) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'stmts', i]); - }); - } - break; + case 'PLpgSQL_stmt_loop': { + const loop = nodeData as PLpgSQL_stmt_loop; + if (loop.body) { + loop.body.forEach((stmt, i) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); + }); } + break; + } - case 'PLpgSQL_stmt_loop': { - const loop = nodeData as PLpgSQL_stmt_loop; - if (loop.body) { - loop.body.forEach((stmt, i) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); - }); - } - break; + case 'PLpgSQL_stmt_while': { + const whileStmt = nodeData as PLpgSQL_stmt_while; + if (whileStmt.cond) { + walkPlpgsqlAst(whileStmt.cond, cb, opts, parentPath, [...parentPath.keyPath, 'cond']); + } + if (whileStmt.body) { + whileStmt.body.forEach((stmt, i) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); + }); } + break; + } - case 'PLpgSQL_stmt_while': { - const whileStmt = nodeData as PLpgSQL_stmt_while; - if (whileStmt.cond) { - walkPlpgsqlAst(whileStmt.cond, cb, opts, parentPath, [...parentPath.keyPath, 'cond']); - } - if (whileStmt.body) { - whileStmt.body.forEach((stmt, i) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); - }); - } - break; + case 'PLpgSQL_stmt_fori': { + const fori = nodeData as PLpgSQL_stmt_fori; + if (fori.var) { + walkPlpgsqlAst(fori.var, cb, opts, parentPath, [...parentPath.keyPath, 'var']); + } + if (fori.lower) { + walkPlpgsqlAst(fori.lower, cb, opts, parentPath, [...parentPath.keyPath, 'lower']); + } + if (fori.upper) { + walkPlpgsqlAst(fori.upper, cb, opts, parentPath, [...parentPath.keyPath, 'upper']); } + if (fori.step) { + walkPlpgsqlAst(fori.step, cb, opts, parentPath, [...parentPath.keyPath, 'step']); + } + if (fori.body) { + fori.body.forEach((stmt, i) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); + }); + } + break; + } - case 'PLpgSQL_stmt_fori': { - const fori = nodeData as PLpgSQL_stmt_fori; - if (fori.var) { - walkPlpgsqlAst(fori.var, cb, opts, parentPath, [...parentPath.keyPath, 'var']); - } - if (fori.lower) { - walkPlpgsqlAst(fori.lower, cb, opts, parentPath, [...parentPath.keyPath, 'lower']); - } - if (fori.upper) { - walkPlpgsqlAst(fori.upper, cb, opts, parentPath, [...parentPath.keyPath, 'upper']); - } - if (fori.step) { - walkPlpgsqlAst(fori.step, cb, opts, parentPath, [...parentPath.keyPath, 'step']); - } - if (fori.body) { - fori.body.forEach((stmt, i) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); - }); - } - break; + case 'PLpgSQL_stmt_fors': { + const fors = nodeData as PLpgSQL_stmt_fors; + if (fors.var) { + walkPlpgsqlAst(fors.var, cb, opts, parentPath, [...parentPath.keyPath, 'var']); + } + if (fors.query) { + walkPlpgsqlAst(fors.query, cb, opts, parentPath, [...parentPath.keyPath, 'query']); + } + if (fors.body) { + fors.body.forEach((stmt, i) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); + }); } + break; + } - case 'PLpgSQL_stmt_fors': { - const fors = nodeData as PLpgSQL_stmt_fors; - if (fors.var) { - walkPlpgsqlAst(fors.var, cb, opts, parentPath, [...parentPath.keyPath, 'var']); - } - if (fors.query) { - walkPlpgsqlAst(fors.query, cb, opts, parentPath, [...parentPath.keyPath, 'query']); - } - if (fors.body) { - fors.body.forEach((stmt, i) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); - }); - } - break; + case 'PLpgSQL_stmt_forc': { + const forc = nodeData as PLpgSQL_stmt_forc; + if (forc.var) { + walkPlpgsqlAst(forc.var, cb, opts, parentPath, [...parentPath.keyPath, 'var']); + } + if (forc.argquery) { + walkPlpgsqlAst(forc.argquery, cb, opts, parentPath, [...parentPath.keyPath, 'argquery']); } + if (forc.body) { + forc.body.forEach((stmt, i) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); + }); + } + break; + } - case 'PLpgSQL_stmt_forc': { - const forc = nodeData as PLpgSQL_stmt_forc; - if (forc.var) { - walkPlpgsqlAst(forc.var, cb, opts, parentPath, [...parentPath.keyPath, 'var']); - } - if (forc.argquery) { - walkPlpgsqlAst(forc.argquery, cb, opts, parentPath, [...parentPath.keyPath, 'argquery']); - } - if (forc.body) { - forc.body.forEach((stmt, i) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); - }); - } - break; + case 'PLpgSQL_stmt_foreach_a': { + const foreach = nodeData as PLpgSQL_stmt_foreach_a; + if (foreach.expr) { + walkPlpgsqlAst(foreach.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); } + if (foreach.body) { + foreach.body.forEach((stmt, i) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); + }); + } + break; + } - case 'PLpgSQL_stmt_foreach_a': { - const foreach = nodeData as PLpgSQL_stmt_foreach_a; - if (foreach.expr) { - walkPlpgsqlAst(foreach.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); - } - if (foreach.body) { - foreach.body.forEach((stmt, i) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); - }); - } - break; + case 'PLpgSQL_stmt_exit': { + if (nodeData.cond) { + walkPlpgsqlAst(nodeData.cond, cb, opts, parentPath, [...parentPath.keyPath, 'cond']); } + break; + } - case 'PLpgSQL_stmt_exit': { - if (nodeData.cond) { - walkPlpgsqlAst(nodeData.cond, cb, opts, parentPath, [...parentPath.keyPath, 'cond']); - } - break; + case 'PLpgSQL_stmt_return': { + if (nodeData.expr) { + walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); } + break; + } - case 'PLpgSQL_stmt_return': { - if (nodeData.expr) { - walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); - } - break; + case 'PLpgSQL_stmt_return_next': { + if (nodeData.expr) { + walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); } + break; + } - case 'PLpgSQL_stmt_return_next': { - if (nodeData.expr) { - walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); - } - break; + case 'PLpgSQL_stmt_return_query': { + const retQuery = nodeData as PLpgSQL_stmt_return_query; + if (retQuery.query) { + walkPlpgsqlAst(retQuery.query, cb, opts, parentPath, [...parentPath.keyPath, 'query']); + } + if (retQuery.dynquery) { + walkPlpgsqlAst(retQuery.dynquery, cb, opts, parentPath, [...parentPath.keyPath, 'dynquery']); } + if (retQuery.params) { + retQuery.params.forEach((param, i) => { + walkPlpgsqlAst(param, cb, opts, parentPath, [...parentPath.keyPath, 'params', i]); + }); + } + break; + } - case 'PLpgSQL_stmt_return_query': { - const retQuery = nodeData as PLpgSQL_stmt_return_query; - if (retQuery.query) { - walkPlpgsqlAst(retQuery.query, cb, opts, parentPath, [...parentPath.keyPath, 'query']); - } - if (retQuery.dynquery) { - walkPlpgsqlAst(retQuery.dynquery, cb, opts, parentPath, [...parentPath.keyPath, 'dynquery']); - } - if (retQuery.params) { - retQuery.params.forEach((param, i) => { - walkPlpgsqlAst(param, cb, opts, parentPath, [...parentPath.keyPath, 'params', i]); - }); - } - break; + case 'PLpgSQL_stmt_raise': { + const raise = nodeData as PLpgSQL_stmt_raise; + if (raise.params) { + raise.params.forEach((param, i) => { + walkPlpgsqlAst(param, cb, opts, parentPath, [...parentPath.keyPath, 'params', i]); + }); } + if (raise.options) { + raise.options.forEach((opt, i) => { + walkPlpgsqlAst(opt, cb, opts, parentPath, [...parentPath.keyPath, 'options', i]); + }); + } + break; + } - case 'PLpgSQL_stmt_raise': { - const raise = nodeData as PLpgSQL_stmt_raise; - if (raise.params) { - raise.params.forEach((param, i) => { - walkPlpgsqlAst(param, cb, opts, parentPath, [...parentPath.keyPath, 'params', i]); - }); - } - if (raise.options) { - raise.options.forEach((opt, i) => { - walkPlpgsqlAst(opt, cb, opts, parentPath, [...parentPath.keyPath, 'options', i]); - }); - } - break; + case 'PLpgSQL_raise_option': { + if (nodeData.expr) { + walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); } + break; + } - case 'PLpgSQL_raise_option': { - if (nodeData.expr) { - walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); - } - break; + case 'PLpgSQL_stmt_assert': { + if (nodeData.cond) { + walkPlpgsqlAst(nodeData.cond, cb, opts, parentPath, [...parentPath.keyPath, 'cond']); + } + if (nodeData.message) { + walkPlpgsqlAst(nodeData.message, cb, opts, parentPath, [...parentPath.keyPath, 'message']); } + break; + } - case 'PLpgSQL_stmt_assert': { - if (nodeData.cond) { - walkPlpgsqlAst(nodeData.cond, cb, opts, parentPath, [...parentPath.keyPath, 'cond']); - } - if (nodeData.message) { - walkPlpgsqlAst(nodeData.message, cb, opts, parentPath, [...parentPath.keyPath, 'message']); - } - break; + case 'PLpgSQL_stmt_execsql': { + if (nodeData.sqlstmt) { + walkPlpgsqlAst(nodeData.sqlstmt, cb, opts, parentPath, [...parentPath.keyPath, 'sqlstmt']); } + if (nodeData.target) { + walkPlpgsqlAst(nodeData.target, cb, opts, parentPath, [...parentPath.keyPath, 'target']); + } + break; + } - case 'PLpgSQL_stmt_execsql': { - if (nodeData.sqlstmt) { - walkPlpgsqlAst(nodeData.sqlstmt, cb, opts, parentPath, [...parentPath.keyPath, 'sqlstmt']); - } - if (nodeData.target) { - walkPlpgsqlAst(nodeData.target, cb, opts, parentPath, [...parentPath.keyPath, 'target']); - } - break; + case 'PLpgSQL_stmt_dynexecute': { + const dynexec = nodeData as PLpgSQL_stmt_dynexecute; + if (dynexec.query) { + walkPlpgsqlAst(dynexec.query, cb, opts, parentPath, [...parentPath.keyPath, 'query']); + } + if (dynexec.target) { + walkPlpgsqlAst(dynexec.target, cb, opts, parentPath, [...parentPath.keyPath, 'target']); } + if (dynexec.params) { + dynexec.params.forEach((param, i) => { + walkPlpgsqlAst(param, cb, opts, parentPath, [...parentPath.keyPath, 'params', i]); + }); + } + break; + } - case 'PLpgSQL_stmt_dynexecute': { - const dynexec = nodeData as PLpgSQL_stmt_dynexecute; - if (dynexec.query) { - walkPlpgsqlAst(dynexec.query, cb, opts, parentPath, [...parentPath.keyPath, 'query']); - } - if (dynexec.target) { - walkPlpgsqlAst(dynexec.target, cb, opts, parentPath, [...parentPath.keyPath, 'target']); - } - if (dynexec.params) { - dynexec.params.forEach((param, i) => { - walkPlpgsqlAst(param, cb, opts, parentPath, [...parentPath.keyPath, 'params', i]); - }); - } - break; + case 'PLpgSQL_stmt_dynfors': { + const dynfors = nodeData as PLpgSQL_stmt_dynfors; + if (dynfors.var) { + walkPlpgsqlAst(dynfors.var, cb, opts, parentPath, [...parentPath.keyPath, 'var']); + } + if (dynfors.query) { + walkPlpgsqlAst(dynfors.query, cb, opts, parentPath, [...parentPath.keyPath, 'query']); + } + if (dynfors.params) { + dynfors.params.forEach((param, i) => { + walkPlpgsqlAst(param, cb, opts, parentPath, [...parentPath.keyPath, 'params', i]); + }); + } + if (dynfors.body) { + dynfors.body.forEach((stmt, i) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); + }); } + break; + } - case 'PLpgSQL_stmt_dynfors': { - const dynfors = nodeData as PLpgSQL_stmt_dynfors; - if (dynfors.var) { - walkPlpgsqlAst(dynfors.var, cb, opts, parentPath, [...parentPath.keyPath, 'var']); - } - if (dynfors.query) { - walkPlpgsqlAst(dynfors.query, cb, opts, parentPath, [...parentPath.keyPath, 'query']); - } - if (dynfors.params) { - dynfors.params.forEach((param, i) => { - walkPlpgsqlAst(param, cb, opts, parentPath, [...parentPath.keyPath, 'params', i]); - }); - } - if (dynfors.body) { - dynfors.body.forEach((stmt, i) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'body', i]); - }); - } - break; + case 'PLpgSQL_stmt_open': { + const open = nodeData as PLpgSQL_stmt_open; + if (open.argquery) { + walkPlpgsqlAst(open.argquery, cb, opts, parentPath, [...parentPath.keyPath, 'argquery']); + } + if (open.query) { + walkPlpgsqlAst(open.query, cb, opts, parentPath, [...parentPath.keyPath, 'query']); + } + if (open.dynquery) { + walkPlpgsqlAst(open.dynquery, cb, opts, parentPath, [...parentPath.keyPath, 'dynquery']); } + if (open.params) { + open.params.forEach((param, i) => { + walkPlpgsqlAst(param, cb, opts, parentPath, [...parentPath.keyPath, 'params', i]); + }); + } + break; + } - case 'PLpgSQL_stmt_open': { - const open = nodeData as PLpgSQL_stmt_open; - if (open.argquery) { - walkPlpgsqlAst(open.argquery, cb, opts, parentPath, [...parentPath.keyPath, 'argquery']); - } - if (open.query) { - walkPlpgsqlAst(open.query, cb, opts, parentPath, [...parentPath.keyPath, 'query']); - } - if (open.dynquery) { - walkPlpgsqlAst(open.dynquery, cb, opts, parentPath, [...parentPath.keyPath, 'dynquery']); - } - if (open.params) { - open.params.forEach((param, i) => { - walkPlpgsqlAst(param, cb, opts, parentPath, [...parentPath.keyPath, 'params', i]); - }); - } - break; + case 'PLpgSQL_stmt_fetch': { + if (nodeData.target) { + walkPlpgsqlAst(nodeData.target, cb, opts, parentPath, [...parentPath.keyPath, 'target']); + } + if (nodeData.expr) { + walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); } + break; + } - case 'PLpgSQL_stmt_fetch': { - if (nodeData.target) { - walkPlpgsqlAst(nodeData.target, cb, opts, parentPath, [...parentPath.keyPath, 'target']); - } - if (nodeData.expr) { - walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); - } - break; + case 'PLpgSQL_stmt_perform': { + if (nodeData.expr) { + walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); } + break; + } - case 'PLpgSQL_stmt_perform': { - if (nodeData.expr) { - walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); - } - break; + case 'PLpgSQL_stmt_call': { + if (nodeData.expr) { + walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); + } + if (nodeData.target) { + walkPlpgsqlAst(nodeData.target, cb, opts, parentPath, [...parentPath.keyPath, 'target']); } + break; + } - case 'PLpgSQL_stmt_call': { - if (nodeData.expr) { - walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); - } - if (nodeData.target) { - walkPlpgsqlAst(nodeData.target, cb, opts, parentPath, [...parentPath.keyPath, 'target']); - } - break; + case 'PLpgSQL_stmt_set': { + if (nodeData.expr) { + walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); } + break; + } - case 'PLpgSQL_stmt_set': { - if (nodeData.expr) { - walkPlpgsqlAst(nodeData.expr, cb, opts, parentPath, [...parentPath.keyPath, 'expr']); - } - break; + case 'PLpgSQL_exception': { + if (nodeData.conditions) { + nodeData.conditions.forEach((cond: any, i: number) => { + walkPlpgsqlAst(cond, cb, opts, parentPath, [...parentPath.keyPath, 'conditions', i]); + }); + } + if (nodeData.action) { + nodeData.action.forEach((stmt: any, i: number) => { + walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'action', i]); + }); } + break; + } - case 'PLpgSQL_exception': { - if (nodeData.conditions) { - nodeData.conditions.forEach((cond: any, i: number) => { - walkPlpgsqlAst(cond, cb, opts, parentPath, [...parentPath.keyPath, 'conditions', i]); - }); - } - if (nodeData.action) { - nodeData.action.forEach((stmt: any, i: number) => { - walkPlpgsqlAst(stmt, cb, opts, parentPath, [...parentPath.keyPath, 'action', i]); + // Nodes with no children to traverse + case 'PLpgSQL_rec': + case 'PLpgSQL_row': + case 'PLpgSQL_recfield': + case 'PLpgSQL_type': + case 'PLpgSQL_stmt_getdiag': + case 'PLpgSQL_stmt_close': + case 'PLpgSQL_stmt_commit': + case 'PLpgSQL_stmt_rollback': + case 'PLpgSQL_condition': + case 'PLpgSQL_diag_item': + // No children to traverse + break; + + default: + // Unknown node type - try to traverse any object/array children + for (const key in nodeData) { + const value = nodeData[key]; + if (Array.isArray(value)) { + value.forEach((item, index) => { + if (typeof item === 'object' && item !== null) { + walkPlpgsqlAst(item, cb, opts, parentPath, [...parentPath.keyPath, key, index]); + } }); + } else if (typeof value === 'object' && value !== null) { + walkPlpgsqlAst(value, cb, opts, parentPath, [...parentPath.keyPath, key]); } - break; - } - - // Nodes with no children to traverse - case 'PLpgSQL_rec': - case 'PLpgSQL_row': - case 'PLpgSQL_recfield': - case 'PLpgSQL_type': - case 'PLpgSQL_stmt_getdiag': - case 'PLpgSQL_stmt_close': - case 'PLpgSQL_stmt_commit': - case 'PLpgSQL_stmt_rollback': - case 'PLpgSQL_condition': - case 'PLpgSQL_diag_item': - // No children to traverse - break; - - default: - // Unknown node type - try to traverse any object/array children - for (const key in nodeData) { - const value = nodeData[key]; - if (Array.isArray(value)) { - value.forEach((item, index) => { - if (typeof item === 'object' && item !== null) { - walkPlpgsqlAst(item, cb, opts, parentPath, [...parentPath.keyPath, key, index]); - } - }); - } else if (typeof value === 'object' && value !== null) { - walkPlpgsqlAst(value, cb, opts, parentPath, [...parentPath.keyPath, key]); - } - } + } } } } diff --git a/packages/traverse/src/walk.ts b/packages/traverse/src/walk.ts index ad474722..7d5692d6 100644 --- a/packages/traverse/src/walk.ts +++ b/packages/traverse/src/walk.ts @@ -180,13 +180,13 @@ export function walk( const ctx = isWrite || isRead ? makeContext({ - stmtTag: tag, - stmtIndex: inherited.stmtIndex, - isWrite, - isRead, - insideFunction: inherited.insideFunction, - functionName: inherited.functionName, - }) + stmtTag: tag, + stmtIndex: inherited.stmtIndex, + isWrite, + isRead, + insideFunction: inherited.insideFunction, + functionName: inherited.functionName, + }) : inherited; contexts.set(path, ctx); diff --git a/packages/utils/__test__/utils.test.ts b/packages/utils/__test__/utils.test.ts index ff47941f..ffb085cf 100644 --- a/packages/utils/__test__/utils.test.ts +++ b/packages/utils/__test__/utils.test.ts @@ -1,7 +1,8 @@ -import * as t from '../src'; import { RangeVar, SelectStmt } from '@pgsql/types'; import { deparseSync as deparse } from 'pgsql-deparser'; +import * as t from '../src'; + it('simple SelectStmt', () => { const stmt: { SelectStmt: SelectStmt } = t.nodes.selectStmt({ targetList: [ @@ -112,12 +113,12 @@ it('queries', () => { it('dynamic creation of tables', () => { // Example JSON schema const schema = { - "tableName": "users", - "columns": [ - { "name": "id", "type": "int", "constraints": ["PRIMARY KEY"] }, - { "name": "username", "type": "text" }, - { "name": "email", "type": "text", "constraints": ["UNIQUE"] }, - { "name": "created_at", "type": "timestamp", "constraints": ["NOT NULL"] } + tableName: 'users', + columns: [ + { name: 'id', type: 'int', constraints: ['PRIMARY KEY'] }, + { name: 'username', type: 'text' }, + { name: 'email', type: 'text', constraints: ['UNIQUE'] }, + { name: 'created_at', type: 'timestamp', constraints: ['NOT NULL'] } ] }; @@ -135,7 +136,7 @@ it('dynamic creation of tables', () => { }), constraints: column.constraints?.map(constraint => t.nodes.constraint({ - contype: constraint === "PRIMARY KEY" ? "CONSTR_PRIMARY" : constraint === "UNIQUE" ? "CONSTR_UNIQUE" : "CONSTR_NOTNULL" + contype: constraint === 'PRIMARY KEY' ? 'CONSTR_PRIMARY' : constraint === 'UNIQUE' ? 'CONSTR_UNIQUE' : 'CONSTR_NOTNULL' }) ) })) @@ -144,4 +145,4 @@ it('dynamic creation of tables', () => { // `deparse` function converts AST to SQL string const sql = deparse(createStmt, { pretty: false }); expect(sql).toMatchSnapshot(); -}) +}); diff --git a/packages/utils/jest.config.js b/packages/utils/jest.config.js index 0aa3aaa4..057a9420 100644 --- a/packages/utils/jest.config.js +++ b/packages/utils/jest.config.js @@ -1,18 +1,18 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", - transform: { - "^.+\\.tsx?$": [ - "ts-jest", - { - babelConfig: false, - tsconfig: "tsconfig.json", - }, - ], - }, - transformIgnorePatterns: [`/node_modules/*`], - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - modulePathIgnorePatterns: ["dist/*"] + preset: 'ts-jest', + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + babelConfig: false, + tsconfig: 'tsconfig.json', + }, + ], + }, + transformIgnorePatterns: [`/node_modules/*`], + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + modulePathIgnorePatterns: ['dist/*'] }; diff --git a/packages/utils/scripts/pg-proto-parser.ts b/packages/utils/scripts/pg-proto-parser.ts index 2c7603b3..92d66910 100644 --- a/packages/utils/scripts/pg-proto-parser.ts +++ b/packages/utils/scripts/pg-proto-parser.ts @@ -1,5 +1,5 @@ +import { join,resolve } from 'path'; import { PgProtoParser, PgProtoParserOptions } from 'pg-proto-parser'; -import { resolve, join } from 'path'; const inFile: string = join(__dirname, '../../../__fixtures__/proto/18-latest.proto'); const outDir: string = resolve(join(__dirname, '../src')); diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 379197c3..ddb0a016 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -3,6 +3,6 @@ import nodes from './wrapped'; export { nodes }; export { ast }; export default { - nodes, - ast -} \ No newline at end of file + nodes, + ast +}; \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c38c1746..2f435e90 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,22 +1,26 @@ -lockfileVersion: "9.0" +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false importers: + .: devDependencies: - "@types/jest": + '@constructive-io/eslint-config': + specifier: ^0.2.0 + version: 0.2.0(eslint@9.39.1)(typescript@5.9.3) + '@types/jest': specifier: ^30.0.0 version: 30.0.0 - "@types/node": + '@types/node': specifier: ^20.12.7 version: 20.19.25 - "@typescript-eslint/eslint-plugin": + '@typescript-eslint/eslint-plugin': specifier: ^8.47.0 version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) - "@typescript-eslint/parser": + '@typescript-eslint/parser': specifier: ^8.47.0 version: 8.47.0(eslint@9.39.1)(typescript@5.9.3) copyfiles: @@ -73,10 +77,10 @@ importers: packages/deparser: dependencies: - "@pgsql/quotes": + '@pgsql/quotes': specifier: workspace:* version: link:../quotes/dist - "@pgsql/types": + '@pgsql/types': specifier: ^18.0.0 version: 18.0.0 devDependencies: @@ -88,37 +92,9 @@ importers: version: 0.1.8 publishDirectory: dist - packages/deparser/versions/13: - dependencies: - "@pgsql/types": - specifier: ^13.11.1 - version: 13.11.1 - publishDirectory: dist - - packages/deparser/versions/14: - dependencies: - "@pgsql/types": - specifier: ^14.1.1 - version: 14.1.1 - publishDirectory: dist - - packages/deparser/versions/15: - dependencies: - "@pgsql/types": - specifier: ^15.1.1 - version: 15.1.1 - publishDirectory: dist - - packages/deparser/versions/16: - dependencies: - "@pgsql/types": - specifier: ^16.1.1 - version: 16.1.1 - publishDirectory: dist - packages/parse: dependencies: - "@pgsql/types": + '@pgsql/types': specifier: ^18.0.0 version: 18.0.0 libpg-query: @@ -135,7 +111,7 @@ importers: packages/parser: dependencies: - "@pgsql/types": + '@pgsql/types': specifier: ^18.0.0 version: 18.0.0 libpg-query: @@ -150,77 +126,12 @@ importers: version: 0.1.8 publishDirectory: dist - packages/parser/versions/13: - dependencies: - "@pgsql/types": - specifier: 13.11.1 - version: 13.11.1 - libpg-query: - specifier: 13.6.0 - version: 13.6.0 - pgsql-deparser: - specifier: 13.19.1 - version: 13.19.1 - publishDirectory: dist - - packages/parser/versions/14: - dependencies: - "@pgsql/types": - specifier: 14.1.1 - version: 14.1.1 - libpg-query: - specifier: 14.3.0 - version: 14.3.0 - pgsql-deparser: - specifier: 14.1.1 - version: 14.1.1 - publishDirectory: dist - - packages/parser/versions/15: - dependencies: - "@pgsql/types": - specifier: 15.1.1 - version: 15.1.1 - libpg-query: - specifier: 15.5.0 - version: 15.5.0 - pgsql-deparser: - specifier: 15.1.1 - version: 15.1.1 - publishDirectory: dist - - packages/parser/versions/16: - dependencies: - "@pgsql/types": - specifier: 16.1.1 - version: 16.1.1 - libpg-query: - specifier: 16.6.0 - version: 16.6.0 - pgsql-deparser: - specifier: 16.1.1 - version: 16.1.1 - publishDirectory: dist - - packages/parser/versions/17: - dependencies: - "@pgsql/types": - specifier: 17.6.1 - version: 17.6.1 - libpg-query: - specifier: 17.6.0 - version: 17.6.0 - pgsql-deparser: - specifier: 17.12.2 - version: 17.12.2 - publishDirectory: dist - packages/pgsql-cli: dependencies: - "@launchql/protobufjs": + '@launchql/protobufjs': specifier: 7.2.6 version: 7.2.6 - "@launchql/protobufjs-cli": + '@launchql/protobufjs-cli': specifier: 1.1.5 version: 1.1.5(@launchql/protobufjs@7.2.6) chalk: @@ -248,7 +159,7 @@ importers: specifier: workspace:* version: link:../parser/dist devDependencies: - "@types/minimist": + '@types/minimist': specifier: ^1.2.5 version: 1.2.5 makage: @@ -257,13 +168,13 @@ importers: packages/pgsql-types: dependencies: - "@pgsql/enums": + '@pgsql/enums': specifier: ^18.0.0 version: 18.0.0 - "@pgsql/types": + '@pgsql/types': specifier: ^18.0.0 version: 18.0.0 - "@pgsql/utils": + '@pgsql/utils': specifier: workspace:^ version: link:../utils/dist devDependencies: @@ -277,7 +188,7 @@ importers: packages/plpgsql-deparser: dependencies: - "@pgsql/types": + '@pgsql/types': specifier: ^18.0.0 version: 18.0.0 pgsql-deparser: @@ -294,7 +205,7 @@ importers: packages/plpgsql-parse: dependencies: - "@pgsql/types": + '@pgsql/types': specifier: ^18.0.0 version: 18.0.0 libpg-query: @@ -317,10 +228,10 @@ importers: packages/plpgsql-parser: dependencies: - "@pgsql/traverse": + '@pgsql/traverse': specifier: workspace:* version: link:../traverse/dist - "@pgsql/types": + '@pgsql/types': specifier: ^18.0.0 version: 18.0.0 libpg-query: @@ -340,19 +251,19 @@ importers: packages/proto-parser: dependencies: - "@babel/generator": + '@babel/generator': specifier: ^7.23.6 version: 7.28.5 - "@babel/parser": + '@babel/parser': specifier: ^7.23.6 version: 7.28.5 - "@babel/traverse": + '@babel/traverse': specifier: 7.28.5 version: 7.28.5 - "@babel/types": + '@babel/types': specifier: 7.28.5 version: 7.28.5 - "@launchql/protobufjs": + '@launchql/protobufjs': specifier: 7.2.6 version: 7.2.6 case: @@ -368,10 +279,10 @@ importers: specifier: ^3.1.5 version: 3.1.5 devDependencies: - "@pgsql/types": + '@pgsql/types': specifier: ^17.6.2 version: 17.6.2 - "@types/babel__generator": + '@types/babel__generator': specifier: ^7.27.0 version: 7.27.0 makage: @@ -391,10 +302,10 @@ importers: packages/scripts: dependencies: - "@pgsql/quotes": + '@pgsql/quotes': specifier: workspace:* version: link:../quotes/dist - "@pgsql/transform": + '@pgsql/transform': specifier: workspace:* version: link:../transform/dist plpgsql-parser: @@ -408,10 +319,10 @@ importers: packages/transform: dependencies: - "@pgsql/quotes": + '@pgsql/quotes': specifier: workspace:* version: link:../quotes/dist - "@pgsql/traverse": + '@pgsql/traverse': specifier: workspace:* version: link:../traverse/dist plpgsql-parser: @@ -425,10 +336,10 @@ importers: packages/transform-ast: devDependencies: - "@pgsql/parser": + '@pgsql/parser': specifier: ^1.2.1 version: 1.2.1 - "@pgsql/types": + '@pgsql/types': specifier: ^18.0.0 version: 18.0.0 libpg-query: @@ -447,7 +358,7 @@ importers: packages/traverse: dependencies: - "@pgsql/types": + '@pgsql/types': specifier: ^18.0.0 version: 18.0.0 pg-proto-parser: @@ -464,7 +375,7 @@ importers: packages/utils: dependencies: - "@pgsql/types": + '@pgsql/types': specifier: ^18.0.0 version: 18.0.0 nested-obj: @@ -483,2392 +394,1464 @@ importers: publishDirectory: dist packages: - "@babel/code-frame@7.27.1": - resolution: - { - integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==, - } - engines: { node: ">=6.9.0" } - - "@babel/compat-data@7.28.5": - resolution: - { - integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==, - } - engines: { node: ">=6.9.0" } - - "@babel/core@7.28.5": - resolution: - { - integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==, - } - engines: { node: ">=6.9.0" } - - "@babel/generator@7.28.5": - resolution: - { - integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-compilation-targets@7.27.2": - resolution: - { - integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-globals@7.28.0": - resolution: - { - integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-module-imports@7.27.1": - resolution: - { - integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-module-transforms@7.28.3": - resolution: - { - integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==, - } - engines: { node: ">=6.9.0" } + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/helper-plugin-utils@7.27.1": - resolution: - { - integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-string-parser@7.27.1": - resolution: - { - integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-identifier@7.28.5": - resolution: - { - integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-option@7.27.1": - resolution: - { - integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==, - } - engines: { node: ">=6.9.0" } - - "@babel/helpers@7.28.4": - resolution: - { - integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==, - } - engines: { node: ">=6.9.0" } - - "@babel/parser@7.28.5": - resolution: - { - integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==, - } - engines: { node: ">=6.0.0" } + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} hasBin: true - "@babel/plugin-syntax-async-generators@7.8.4": - resolution: - { - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, - } + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: - "@babel/core": ^7.0.0-0 + '@babel/core': ^7.0.0-0 - "@babel/plugin-syntax-bigint@7.8.3": - resolution: - { - integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, - } + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: - "@babel/core": ^7.0.0-0 + '@babel/core': ^7.0.0-0 - "@babel/plugin-syntax-class-properties@7.12.13": - resolution: - { - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, - } + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-class-static-block@7.14.5": - resolution: - { - integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-import-attributes@7.27.1": - resolution: - { - integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 + '@babel/core': ^7.0.0-0 - "@babel/plugin-syntax-import-meta@7.10.4": - resolution: - { - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, - } + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: - "@babel/core": ^7.0.0-0 + '@babel/core': ^7.0.0-0 - "@babel/plugin-syntax-json-strings@7.8.3": - resolution: - { - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, - } + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-jsx@7.27.1": - resolution: - { - integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 + '@babel/core': ^7.0.0-0 - "@babel/plugin-syntax-logical-assignment-operators@7.10.4": - resolution: - { - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, - } + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: - "@babel/core": ^7.0.0-0 + '@babel/core': ^7.0.0-0 - "@babel/plugin-syntax-nullish-coalescing-operator@7.8.3": - resolution: - { - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, - } + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: - "@babel/core": ^7.0.0-0 + '@babel/core': ^7.0.0-0 - "@babel/plugin-syntax-numeric-separator@7.10.4": - resolution: - { - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, - } + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: - "@babel/core": ^7.0.0-0 + '@babel/core': ^7.0.0-0 - "@babel/plugin-syntax-object-rest-spread@7.8.3": - resolution: - { - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, - } + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: - "@babel/core": ^7.0.0-0 + '@babel/core': ^7.0.0-0 - "@babel/plugin-syntax-optional-catch-binding@7.8.3": - resolution: - { - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, - } + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: - "@babel/core": ^7.0.0-0 + '@babel/core': ^7.0.0-0 - "@babel/plugin-syntax-optional-chaining@7.8.3": - resolution: - { - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, - } + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-private-property-in-object@7.14.5": - resolution: - { - integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-top-level-await@7.14.5": - resolution: - { - integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-typescript@7.27.1": - resolution: - { - integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/template@7.27.2": - resolution: - { - integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==, - } - engines: { node: ">=6.9.0" } - - "@babel/traverse@7.28.5": - resolution: - { - integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/types@7.28.5": - resolution: - { - integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==, - } - engines: { node: ">=6.9.0" } - - "@bcoe/v8-coverage@0.2.3": - resolution: - { - integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, - } - - "@cspotcode/source-map-support@0.8.1": - resolution: - { - integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, - } - engines: { node: ">=12" } - - "@emnapi/core@1.7.1": - resolution: - { - integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==, - } - - "@emnapi/runtime@1.7.1": - resolution: - { - integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==, - } - - "@emnapi/wasi-threads@1.1.0": - resolution: - { - integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==, - } - - "@eslint-community/eslint-utils@4.9.0": - resolution: - { - integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@constructive-io/eslint-config@0.2.0': + resolution: {integrity: sha512-BaIBn/3Oi+DcyzNqMyUQmelSD7z7MMnFQtlKr4vVrgAv8PXVkYXaY2IlfZH4MeqYactf3mDunS11+7ndOf9oVw==} + peerDependencies: + eslint: ^9 + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - "@eslint-community/regexpp@4.12.2": - resolution: - { - integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - - "@eslint/config-array@0.21.1": - resolution: - { - integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/config-helpers@0.4.2": - resolution: - { - integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/core@0.17.0": - resolution: - { - integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/eslintrc@3.3.1": - resolution: - { - integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/js@9.39.1": - resolution: - { - integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/object-schema@2.1.7": - resolution: - { - integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/plugin-kit@0.4.1": - resolution: - { - integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@humanfs/core@0.19.1": - resolution: - { - integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, - } - engines: { node: ">=18.18.0" } - - "@humanfs/node@0.16.7": - resolution: - { - integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==, - } - engines: { node: ">=18.18.0" } - - "@humanwhocodes/module-importer@1.0.1": - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: ">=12.22" } - - "@humanwhocodes/retry@0.4.3": - resolution: - { - integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==, - } - engines: { node: ">=18.18" } - - "@hutson/parse-repository-url@3.0.2": - resolution: - { - integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==, - } - engines: { node: ">=6.9.0" } - - "@inquirer/external-editor@1.0.3": - resolution: - { - integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==, - } - engines: { node: ">=18" } + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - "@types/node": ">=18" + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.1': + resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.5': + resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@hutson/parse-repository-url@3.0.2': + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' peerDependenciesMeta: - "@types/node": + '@types/node': optional: true - "@isaacs/balanced-match@4.0.1": - resolution: - { - integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==, - } - engines: { node: 20 || >=22 } - - "@isaacs/brace-expansion@5.0.0": - resolution: - { - integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==, - } - engines: { node: 20 || >=22 } - - "@isaacs/cliui@8.0.2": - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: ">=12" } - - "@isaacs/string-locale-compare@1.1.0": - resolution: - { - integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==, - } - - "@istanbuljs/load-nyc-config@1.1.0": - resolution: - { - integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, - } - engines: { node: ">=8" } - - "@istanbuljs/schema@0.1.3": - resolution: - { - integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, - } - engines: { node: ">=8" } - - "@jest/console@30.2.0": - resolution: - { - integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/core@30.2.0": - resolution: - { - integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/string-locale-compare@1.1.0': + resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@30.2.0': + resolution: {integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/core@30.2.0': + resolution: {integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - "@jest/diff-sequences@30.0.1": - resolution: - { - integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/environment@30.2.0": - resolution: - { - integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/expect-utils@30.2.0": - resolution: - { - integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/expect@30.2.0": - resolution: - { - integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/fake-timers@30.2.0": - resolution: - { - integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/get-type@30.1.0": - resolution: - { - integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/globals@30.2.0": - resolution: - { - integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/pattern@30.0.1": - resolution: - { - integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/reporters@30.2.0": - resolution: - { - integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/environment@30.2.0': + resolution: {integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@30.2.0': + resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect@30.2.0': + resolution: {integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/fake-timers@30.2.0': + resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.1.0': + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/globals@30.2.0': + resolution: {integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.0.1': + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.2.0': + resolution: {integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - "@jest/schemas@29.6.3": - resolution: - { - integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - "@jest/schemas@30.0.5": - resolution: - { - integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/snapshot-utils@30.2.0": - resolution: - { - integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/source-map@30.0.1": - resolution: - { - integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/test-result@30.2.0": - resolution: - { - integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/test-sequencer@30.2.0": - resolution: - { - integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/transform@30.2.0": - resolution: - { - integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jest/types@30.2.0": - resolution: - { - integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - - "@jridgewell/gen-mapping@0.3.13": - resolution: - { - integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==, - } - - "@jridgewell/remapping@2.3.5": - resolution: - { - integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==, - } - - "@jridgewell/resolve-uri@3.1.2": - resolution: - { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, - } - engines: { node: ">=6.0.0" } - - "@jridgewell/sourcemap-codec@1.5.5": - resolution: - { - integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, - } - - "@jridgewell/trace-mapping@0.3.31": - resolution: - { - integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, - } - - "@jridgewell/trace-mapping@0.3.9": - resolution: - { - integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, - } - - "@jsdoc/salty@0.2.9": - resolution: - { - integrity: sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==, - } - engines: { node: ">=v12.0.0" } - - "@launchql/protobufjs-cli@1.1.5": - resolution: - { - integrity: sha512-k9Zr2Ny0CKlBGV5w+1ZBgsN2sQMKdbCwYSM1Ogo/het+S3YgYFbddyIz8us/z/2EDuuexGNCVaXsU8+wRTCDng==, - } - engines: { node: ">=12.0.0" } + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/snapshot-utils@30.2.0': + resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/source-map@30.0.1': + resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-result@30.2.0': + resolution: {integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-sequencer@30.2.0': + resolution: {integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/transform@30.2.0': + resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/types@30.2.0': + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@jsdoc/salty@0.2.9': + resolution: {integrity: sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==} + engines: {node: '>=v12.0.0'} + + '@launchql/protobufjs-cli@1.1.5': + resolution: {integrity: sha512-k9Zr2Ny0CKlBGV5w+1ZBgsN2sQMKdbCwYSM1Ogo/het+S3YgYFbddyIz8us/z/2EDuuexGNCVaXsU8+wRTCDng==} + engines: {node: '>=12.0.0'} hasBin: true peerDependencies: - "@launchql/protobufjs": ^7.0.0 - - "@launchql/protobufjs@7.2.6": - resolution: - { - integrity: sha512-vwi1nG2/heVFsIMHQU1KxTjUp5c757CTtRAZn/jutApCkFlle1iv8tzM/DHlSZJKDldxaYqnNYTg0pTyp8Bbtg==, - } - engines: { node: ">=12.0.0" } - - "@lerna/create@8.2.4": - resolution: - { - integrity: sha512-A8AlzetnS2WIuhijdAzKUyFpR5YbLLfV3luQ4lzBgIBgRfuoBDZeF+RSZPhra+7A6/zTUlrbhKZIOi/MNhqgvQ==, - } - engines: { node: ">=18.0.0" } + '@launchql/protobufjs': ^7.0.0 + + '@launchql/protobufjs@7.2.6': + resolution: {integrity: sha512-vwi1nG2/heVFsIMHQU1KxTjUp5c757CTtRAZn/jutApCkFlle1iv8tzM/DHlSZJKDldxaYqnNYTg0pTyp8Bbtg==} + engines: {node: '>=12.0.0'} + + '@lerna/create@8.2.4': + resolution: {integrity: sha512-A8AlzetnS2WIuhijdAzKUyFpR5YbLLfV3luQ4lzBgIBgRfuoBDZeF+RSZPhra+7A6/zTUlrbhKZIOi/MNhqgvQ==} + engines: {node: '>=18.0.0'} deprecated: This package is an implementation detail of Lerna and is no longer published separately. - "@napi-rs/wasm-runtime@0.2.12": - resolution: - { - integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==, - } - - "@napi-rs/wasm-runtime@0.2.4": - resolution: - { - integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==, - } - - "@nodelib/fs.scandir@2.1.5": - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - - "@nodelib/fs.stat@2.0.5": - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - "@nodelib/fs.walk@1.2.8": - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - - "@npmcli/agent@2.2.2": - resolution: - { - integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@npmcli/arborist@7.5.4": - resolution: - { - integrity: sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@napi-rs/wasm-runtime@0.2.4': + resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/agent@2.2.2': + resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/arborist@7.5.4': + resolution: {integrity: sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true - "@npmcli/fs@3.1.1": - resolution: - { - integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - - "@npmcli/git@5.0.8": - resolution: - { - integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@npmcli/installed-package-contents@2.1.0": - resolution: - { - integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + '@npmcli/fs@3.1.1': + resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/git@5.0.8': + resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/installed-package-contents@2.1.0': + resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true - "@npmcli/map-workspaces@3.0.6": - resolution: - { - integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - - "@npmcli/metavuln-calculator@7.1.1": - resolution: - { - integrity: sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@npmcli/name-from-folder@2.0.0": - resolution: - { - integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - - "@npmcli/node-gyp@3.0.0": - resolution: - { - integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - - "@npmcli/package-json@5.2.0": - resolution: - { - integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@npmcli/promise-spawn@7.0.2": - resolution: - { - integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@npmcli/query@3.1.0": - resolution: - { - integrity: sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - - "@npmcli/redact@2.0.1": - resolution: - { - integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@npmcli/run-script@8.1.0": - resolution: - { - integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@nx/devkit@20.8.3": - resolution: - { - integrity: sha512-5lbfJ6ICFOiGeirldQOU5fQ/W/VQ8L3dfWnmHG4UgpWSLoK/YFdRf4lTB4rS0aDXsBL0gyWABz3sZGLPGNYnPA==, - } + '@npmcli/map-workspaces@3.0.6': + resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/metavuln-calculator@7.1.1': + resolution: {integrity: sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/name-from-folder@2.0.0': + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/node-gyp@3.0.0': + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@5.2.0': + resolution: {integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/promise-spawn@7.0.2': + resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/query@3.1.0': + resolution: {integrity: sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/redact@2.0.1': + resolution: {integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/run-script@8.1.0': + resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@nx/devkit@20.8.3': + resolution: {integrity: sha512-5lbfJ6ICFOiGeirldQOU5fQ/W/VQ8L3dfWnmHG4UgpWSLoK/YFdRf4lTB4rS0aDXsBL0gyWABz3sZGLPGNYnPA==} peerDependencies: - nx: ">= 19 <= 21" - - "@nx/nx-darwin-arm64@20.8.3": - resolution: - { - integrity: sha512-BeYnPAcnaerg6q+qR0bAb0nebwwrsvm4STSVqqVlaqLmmQpU3Bfpx44CEa5d6T9b0V11ZqVE/bkmRhMqhUcrhw==, - } - engines: { node: ">= 10" } + nx: '>= 19 <= 21' + + '@nx/nx-darwin-arm64@20.8.3': + resolution: {integrity: sha512-BeYnPAcnaerg6q+qR0bAb0nebwwrsvm4STSVqqVlaqLmmQpU3Bfpx44CEa5d6T9b0V11ZqVE/bkmRhMqhUcrhw==} + engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - "@nx/nx-darwin-x64@20.8.3": - resolution: - { - integrity: sha512-RIFg1VkQ4jhI+ErqEZuIeGBcJGD8t+u9J5CdQBDIASd8QRhtudBkiYLYCJb+qaQly09G7nVfxuyItlS2uRW3qA==, - } - engines: { node: ">= 10" } + '@nx/nx-darwin-x64@20.8.3': + resolution: {integrity: sha512-RIFg1VkQ4jhI+ErqEZuIeGBcJGD8t+u9J5CdQBDIASd8QRhtudBkiYLYCJb+qaQly09G7nVfxuyItlS2uRW3qA==} + engines: {node: '>= 10'} cpu: [x64] os: [darwin] - "@nx/nx-freebsd-x64@20.8.3": - resolution: - { - integrity: sha512-boQTgMUdnqpZhHMrV/xgnp/dTg5dfxw8I4d16NBwmW4j+Sez7zi/dydgsJpfZsj8TicOHvPu6KK4W5wzp82NPw==, - } - engines: { node: ">= 10" } + '@nx/nx-freebsd-x64@20.8.3': + resolution: {integrity: sha512-boQTgMUdnqpZhHMrV/xgnp/dTg5dfxw8I4d16NBwmW4j+Sez7zi/dydgsJpfZsj8TicOHvPu6KK4W5wzp82NPw==} + engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - "@nx/nx-linux-arm-gnueabihf@20.8.3": - resolution: - { - integrity: sha512-wpiNyY1igx1rLN3EsTLum2lDtblFijdBZB9/9u/6UDub4z9CaQ4yaC4h9n5v7yFYILwfL44YTsQKzrE+iv0y1Q==, - } - engines: { node: ">= 10" } + '@nx/nx-linux-arm-gnueabihf@20.8.3': + resolution: {integrity: sha512-wpiNyY1igx1rLN3EsTLum2lDtblFijdBZB9/9u/6UDub4z9CaQ4yaC4h9n5v7yFYILwfL44YTsQKzrE+iv0y1Q==} + engines: {node: '>= 10'} cpu: [arm] os: [linux] - "@nx/nx-linux-arm64-gnu@20.8.3": - resolution: - { - integrity: sha512-nbi/eZtJfWxuDwdUCiP+VJolFubtrz6XxVtB26eMAkODnREOKELHZtMOrlm8JBZCdtWCvTqibq9Az74XsqSfdA==, - } - engines: { node: ">= 10" } + '@nx/nx-linux-arm64-gnu@20.8.3': + resolution: {integrity: sha512-nbi/eZtJfWxuDwdUCiP+VJolFubtrz6XxVtB26eMAkODnREOKELHZtMOrlm8JBZCdtWCvTqibq9Az74XsqSfdA==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] - "@nx/nx-linux-arm64-musl@20.8.3": - resolution: - { - integrity: sha512-LTTGzI8YVPlF1v0YlVf+exM+1q7rpsiUbjTTHJcfHFRU5t4BsiZD54K19Y1UBg1XFx5cwhEaIomSmJ88RwPPVQ==, - } - engines: { node: ">= 10" } + '@nx/nx-linux-arm64-musl@20.8.3': + resolution: {integrity: sha512-LTTGzI8YVPlF1v0YlVf+exM+1q7rpsiUbjTTHJcfHFRU5t4BsiZD54K19Y1UBg1XFx5cwhEaIomSmJ88RwPPVQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] - "@nx/nx-linux-x64-gnu@20.8.3": - resolution: - { - integrity: sha512-SlA4GtXvQbSzSIWLgiIiLBOjdINPOUR/im+TUbaEMZ8wiGrOY8cnk0PVt95TIQJVBeXBCeb5HnoY0lHJpMOODg==, - } - engines: { node: ">= 10" } + '@nx/nx-linux-x64-gnu@20.8.3': + resolution: {integrity: sha512-SlA4GtXvQbSzSIWLgiIiLBOjdINPOUR/im+TUbaEMZ8wiGrOY8cnk0PVt95TIQJVBeXBCeb5HnoY0lHJpMOODg==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] - "@nx/nx-linux-x64-musl@20.8.3": - resolution: - { - integrity: sha512-MNzkEwPktp5SQH9dJDH2wP9hgG9LsBDhKJXJfKw6sUI/6qz5+/aAjFziKy+zBnhU4AO1yXt5qEWzR8lDcIriVQ==, - } - engines: { node: ">= 10" } + '@nx/nx-linux-x64-musl@20.8.3': + resolution: {integrity: sha512-MNzkEwPktp5SQH9dJDH2wP9hgG9LsBDhKJXJfKw6sUI/6qz5+/aAjFziKy+zBnhU4AO1yXt5qEWzR8lDcIriVQ==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] - "@nx/nx-win32-arm64-msvc@20.8.3": - resolution: - { - integrity: sha512-qUV7CyXKwRCM/lkvyS6Xa1MqgAuK5da6w27RAehh7LATBUKn1I4/M7DGn6L7ERCxpZuh1TrDz9pUzEy0R+Ekkg==, - } - engines: { node: ">= 10" } + '@nx/nx-win32-arm64-msvc@20.8.3': + resolution: {integrity: sha512-qUV7CyXKwRCM/lkvyS6Xa1MqgAuK5da6w27RAehh7LATBUKn1I4/M7DGn6L7ERCxpZuh1TrDz9pUzEy0R+Ekkg==} + engines: {node: '>= 10'} cpu: [arm64] os: [win32] - "@nx/nx-win32-x64-msvc@20.8.3": - resolution: - { - integrity: sha512-gX1G8u6W6EPX6PO/wv07+B++UHyCHBXyVWXITA3Kv6HoSajOxIa2Kk1rv1iDQGmX1WWxBaj3bUyYJAFBDITe4w==, - } - engines: { node: ">= 10" } + '@nx/nx-win32-x64-msvc@20.8.3': + resolution: {integrity: sha512-gX1G8u6W6EPX6PO/wv07+B++UHyCHBXyVWXITA3Kv6HoSajOxIa2Kk1rv1iDQGmX1WWxBaj3bUyYJAFBDITe4w==} + engines: {node: '>= 10'} cpu: [x64] os: [win32] - "@octokit/auth-token@4.0.0": - resolution: - { - integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==, - } - engines: { node: ">= 18" } - - "@octokit/core@5.2.2": - resolution: - { - integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==, - } - engines: { node: ">= 18" } - - "@octokit/endpoint@9.0.6": - resolution: - { - integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==, - } - engines: { node: ">= 18" } - - "@octokit/graphql@7.1.1": - resolution: - { - integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==, - } - engines: { node: ">= 18" } - - "@octokit/openapi-types@24.2.0": - resolution: - { - integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==, - } - - "@octokit/plugin-enterprise-rest@6.0.1": - resolution: - { - integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==, - } - - "@octokit/plugin-paginate-rest@11.4.4-cjs.2": - resolution: - { - integrity: sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==, - } - engines: { node: ">= 18" } + '@octokit/auth-token@4.0.0': + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} + + '@octokit/core@5.2.2': + resolution: {integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==} + engines: {node: '>= 18'} + + '@octokit/endpoint@9.0.6': + resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} + engines: {node: '>= 18'} + + '@octokit/graphql@7.1.1': + resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@24.2.0': + resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} + + '@octokit/plugin-enterprise-rest@6.0.1': + resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} + + '@octokit/plugin-paginate-rest@11.4.4-cjs.2': + resolution: {integrity: sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==} + engines: {node: '>= 18'} peerDependencies: - "@octokit/core": "5" - - "@octokit/plugin-request-log@4.0.1": - resolution: - { - integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==, - } - engines: { node: ">= 18" } + '@octokit/core': '5' + + '@octokit/plugin-request-log@4.0.1': + resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==} + engines: {node: '>= 18'} peerDependencies: - "@octokit/core": "5" - - "@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1": - resolution: - { - integrity: sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==, - } - engines: { node: ">= 18" } + '@octokit/core': '5' + + '@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1': + resolution: {integrity: sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==} + engines: {node: '>= 18'} peerDependencies: - "@octokit/core": ^5 - - "@octokit/request-error@5.1.1": - resolution: - { - integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==, - } - engines: { node: ">= 18" } - - "@octokit/request@8.4.1": - resolution: - { - integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==, - } - engines: { node: ">= 18" } - - "@octokit/rest@20.1.2": - resolution: - { - integrity: sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==, - } - engines: { node: ">= 18" } - - "@octokit/types@13.10.0": - resolution: - { - integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==, - } - - "@pgsql/enums@18.0.0": - resolution: - { - integrity: sha512-s3NgG+w3Vd4viPkgj9+RvrIN1UCNL+YnvuZbTMdpsF2oR73kiB+G8xY8jUUIhf95ZYMRgLvdgWvev2HLegfHsQ==, - } - - "@pgsql/parser@1.2.1": - resolution: - { - integrity: sha512-PxP4YFLKik6HLb4BObzMqHblyMCyPnXzDAYgLidEm62Q+0YE6uplDehsnyE+mvYnzMkXxTK5EqLTWKRPMKinAQ==, - } - - "@pgsql/types@13.11.1": - resolution: - { - integrity: sha512-5JeN7DZYCVbxPPFI47Z370Jzr3eHZpqgwCdutYWV8e8XtuhxF7UuvWvOsx2oPJe9KnQen0vzJWnVq/61bRvxmw==, - } - - "@pgsql/types@14.1.1": - resolution: - { - integrity: sha512-b5Pfo8uzB42nw2nA6FAe5ChbqyQwykCJZ1/tx1pZMespbGJF2qmuTn7/YXp0IWMuqZQLpP4P7KKb2v4ASekOyA==, - } - - "@pgsql/types@15.1.1": - resolution: - { - integrity: sha512-sPoz8XEeeh6lDoEmsKexak+ijGSm+ioLgQ1HmIXzIh/0QbNIp0Cy8M+d9jUjlIMNnFQCn6tPHzlzvmDL2vOcgw==, - } - - "@pgsql/types@16.1.1": - resolution: - { - integrity: sha512-7ZAYUEs7hkNURh+ZnRYI/XtJzqtsXdOHQ7O7Gm/VXfnPrOzwi1/apyCMPmfqLqoT+B3r526440rUyz7bxWzVrA==, - } - - "@pgsql/types@17.6.1": - resolution: - { - integrity: sha512-Hk51+nyOxS7Dy5oySWywyNZxo5HndX1VDXT4ZEBD+p+vvMFM2Vc+sKSuByCiI8banou4edbgdnOC251IOuq7QQ==, - } - - "@pgsql/types@17.6.2": - resolution: - { - integrity: sha512-1UtbELdbqNdyOShhrVfSz3a1gDi0s9XXiQemx+6QqtsrXe62a6zOGU+vjb2GRfG5jeEokI1zBBcfD42enRv0Rw==, - } - - "@pgsql/types@18.0.0": - resolution: - { - integrity: sha512-jtAY4JU7jdVYZ/Vv3zlZqVP+FRWZokyCLKPPCnAApiaJAElpyyiMC3HRiquBu29kSrVs+rkqZD50SUIb/zyEGw==, - } - - "@pkgjs/parseargs@0.11.0": - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: ">=14" } - - "@pkgr/core@0.2.9": - resolution: - { - integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==, - } - engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } - - "@protobufjs/aspromise@1.1.2": - resolution: - { - integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==, - } - - "@protobufjs/base64@1.1.2": - resolution: - { - integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==, - } - - "@protobufjs/codegen@2.0.4": - resolution: - { - integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==, - } - - "@protobufjs/eventemitter@1.1.0": - resolution: - { - integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==, - } - - "@protobufjs/fetch@1.1.0": - resolution: - { - integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==, - } - - "@protobufjs/float@1.0.2": - resolution: - { - integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==, - } - - "@protobufjs/inquire@1.1.0": - resolution: - { - integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==, - } - - "@protobufjs/path@1.1.2": - resolution: - { - integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==, - } - - "@protobufjs/pool@1.1.0": - resolution: - { - integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==, - } - - "@protobufjs/utf8@1.1.0": - resolution: - { - integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==, - } - - "@sigstore/bundle@2.3.2": - resolution: - { - integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@sigstore/core@1.1.0": - resolution: - { - integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@sigstore/protobuf-specs@0.3.3": - resolution: - { - integrity: sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==, - } - engines: { node: ^18.17.0 || >=20.5.0 } - - "@sigstore/sign@2.3.2": - resolution: - { - integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@sigstore/tuf@2.3.4": - resolution: - { - integrity: sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@sigstore/verify@1.2.1": - resolution: - { - integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@sinclair/typebox@0.27.8": - resolution: - { - integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, - } - - "@sinclair/typebox@0.34.41": - resolution: - { - integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==, - } - - "@sinonjs/commons@3.0.1": - resolution: - { - integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==, - } - - "@sinonjs/fake-timers@13.0.5": - resolution: - { - integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==, - } - - "@tsconfig/node10@1.0.12": - resolution: - { - integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==, - } - - "@tsconfig/node12@1.0.11": - resolution: - { - integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, - } - - "@tsconfig/node14@1.0.3": - resolution: - { - integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, - } - - "@tsconfig/node16@1.0.4": - resolution: - { - integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==, - } - - "@tufjs/canonical-json@2.0.0": - resolution: - { - integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@tufjs/models@2.0.1": - resolution: - { - integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - "@tybys/wasm-util@0.10.1": - resolution: - { - integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==, - } - - "@tybys/wasm-util@0.9.0": - resolution: - { - integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==, - } - - "@types/babel__core@7.20.5": - resolution: - { - integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, - } - - "@types/babel__generator@7.27.0": - resolution: - { - integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==, - } - - "@types/babel__template@7.4.4": - resolution: - { - integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, - } - - "@types/babel__traverse@7.28.0": - resolution: - { - integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==, - } - - "@types/estree@1.0.8": - resolution: - { - integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, - } - - "@types/istanbul-lib-coverage@2.0.6": - resolution: - { - integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, - } - - "@types/istanbul-lib-report@3.0.3": - resolution: - { - integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, - } - - "@types/istanbul-reports@3.0.4": - resolution: - { - integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, - } - - "@types/jest@30.0.0": - resolution: - { - integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==, - } - - "@types/json-schema@7.0.15": - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } - - "@types/linkify-it@5.0.0": - resolution: - { - integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==, - } - - "@types/markdown-it@14.1.2": - resolution: - { - integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==, - } - - "@types/mdurl@2.0.0": - resolution: - { - integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==, - } - - "@types/minimatch@3.0.5": - resolution: - { - integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==, - } - - "@types/minimist@1.2.5": - resolution: - { - integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==, - } - - "@types/node@20.19.25": - resolution: - { - integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==, - } - - "@types/normalize-package-data@2.4.4": - resolution: - { - integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, - } - - "@types/stack-utils@2.0.3": - resolution: - { - integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, - } - - "@types/yargs-parser@21.0.3": - resolution: - { - integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, - } - - "@types/yargs@17.0.35": - resolution: - { - integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==, - } - - "@typescript-eslint/eslint-plugin@8.47.0": - resolution: - { - integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@octokit/core': ^5 + + '@octokit/request-error@5.1.1': + resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} + engines: {node: '>= 18'} + + '@octokit/request@8.4.1': + resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} + engines: {node: '>= 18'} + + '@octokit/rest@20.1.2': + resolution: {integrity: sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==} + engines: {node: '>= 18'} + + '@octokit/types@13.10.0': + resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} + + '@pgsql/enums@18.0.0': + resolution: {integrity: sha512-s3NgG+w3Vd4viPkgj9+RvrIN1UCNL+YnvuZbTMdpsF2oR73kiB+G8xY8jUUIhf95ZYMRgLvdgWvev2HLegfHsQ==} + + '@pgsql/parser@1.2.1': + resolution: {integrity: sha512-PxP4YFLKik6HLb4BObzMqHblyMCyPnXzDAYgLidEm62Q+0YE6uplDehsnyE+mvYnzMkXxTK5EqLTWKRPMKinAQ==} + + '@pgsql/types@17.6.2': + resolution: {integrity: sha512-1UtbELdbqNdyOShhrVfSz3a1gDi0s9XXiQemx+6QqtsrXe62a6zOGU+vjb2GRfG5jeEokI1zBBcfD42enRv0Rw==} + + '@pgsql/types@18.0.0': + resolution: {integrity: sha512-jtAY4JU7jdVYZ/Vv3zlZqVP+FRWZokyCLKPPCnAApiaJAElpyyiMC3HRiquBu29kSrVs+rkqZD50SUIb/zyEGw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@sigstore/bundle@2.3.2': + resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/core@1.1.0': + resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/protobuf-specs@0.3.3': + resolution: {integrity: sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@sigstore/sign@2.3.2': + resolution: {integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/tuf@2.3.4': + resolution: {integrity: sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/verify@1.2.1': + resolution: {integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinclair/typebox@0.34.41': + resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tufjs/canonical-json@2.0.0': + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@tufjs/models@2.0.1': + resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/minimatch@3.0.5': + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node@20.19.25': + resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + + '@typescript-eslint/eslint-plugin@8.47.0': + resolution: {integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - "@typescript-eslint/parser": ^8.47.0 + '@typescript-eslint/parser': ^8.47.0 eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <6.0.0" - - "@typescript-eslint/parser@8.47.0": - resolution: - { - integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/eslint-plugin@8.65.0': + resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.65.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.47.0': + resolution: {integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <6.0.0" - - "@typescript-eslint/project-service@8.47.0": - resolution: - { - integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.65.0': + resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: ">=4.8.4 <6.0.0" - - "@typescript-eslint/scope-manager@8.47.0": - resolution: - { - integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@typescript-eslint/tsconfig-utils@8.47.0": - resolution: - { - integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.47.0': + resolution: {integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.65.0': + resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: ">=4.8.4 <6.0.0" - - "@typescript-eslint/type-utils@8.47.0": - resolution: - { - integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.47.0': + resolution: {integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/scope-manager@8.65.0': + resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.47.0': + resolution: {integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/tsconfig-utils@8.65.0': + resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.47.0': + resolution: {integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <6.0.0" - - "@typescript-eslint/types@8.47.0": - resolution: - { - integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@typescript-eslint/typescript-estree@8.47.0": - resolution: - { - integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.65.0': + resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: ">=4.8.4 <6.0.0" - - "@typescript-eslint/utils@8.47.0": - resolution: - { - integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.47.0': + resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.65.0': + resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.47.0': + resolution: {integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/typescript-estree@8.65.0': + resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.47.0': + resolution: {integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <6.0.0" - - "@typescript-eslint/visitor-keys@8.47.0": - resolution: - { - integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@ungap/structured-clone@1.3.0": - resolution: - { - integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==, - } - - "@unrs/resolver-binding-android-arm-eabi@1.11.1": - resolution: - { - integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==, - } + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.65.0': + resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.47.0': + resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.65.0': + resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] os: [android] - "@unrs/resolver-binding-android-arm64@1.11.1": - resolution: - { - integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==, - } + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} cpu: [arm64] os: [android] - "@unrs/resolver-binding-darwin-arm64@1.11.1": - resolution: - { - integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==, - } + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} cpu: [arm64] os: [darwin] - "@unrs/resolver-binding-darwin-x64@1.11.1": - resolution: - { - integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==, - } + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} cpu: [x64] os: [darwin] - "@unrs/resolver-binding-freebsd-x64@1.11.1": - resolution: - { - integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==, - } + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} cpu: [x64] os: [freebsd] - "@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1": - resolution: - { - integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==, - } + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} cpu: [arm] os: [linux] - "@unrs/resolver-binding-linux-arm-musleabihf@1.11.1": - resolution: - { - integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==, - } + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} cpu: [arm] os: [linux] - "@unrs/resolver-binding-linux-arm64-gnu@1.11.1": - resolution: - { - integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==, - } + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] - "@unrs/resolver-binding-linux-arm64-musl@1.11.1": - resolution: - { - integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==, - } + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] - "@unrs/resolver-binding-linux-ppc64-gnu@1.11.1": - resolution: - { - integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==, - } + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] - "@unrs/resolver-binding-linux-riscv64-gnu@1.11.1": - resolution: - { - integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==, - } + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] - "@unrs/resolver-binding-linux-riscv64-musl@1.11.1": - resolution: - { - integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==, - } + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] - "@unrs/resolver-binding-linux-s390x-gnu@1.11.1": - resolution: - { - integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==, - } + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] - "@unrs/resolver-binding-linux-x64-gnu@1.11.1": - resolution: - { - integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==, - } + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] - "@unrs/resolver-binding-linux-x64-musl@1.11.1": - resolution: - { - integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==, - } + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] - "@unrs/resolver-binding-wasm32-wasi@1.11.1": - resolution: - { - integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==, - } - engines: { node: ">=14.0.0" } + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} cpu: [wasm32] - "@unrs/resolver-binding-win32-arm64-msvc@1.11.1": - resolution: - { - integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==, - } + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} cpu: [arm64] os: [win32] - "@unrs/resolver-binding-win32-ia32-msvc@1.11.1": - resolution: - { - integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==, - } + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} cpu: [ia32] os: [win32] - "@unrs/resolver-binding-win32-x64-msvc@1.11.1": - resolution: - { - integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==, - } + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} cpu: [x64] os: [win32] - "@yarnpkg/lockfile@1.1.0": - resolution: - { - integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==, - } - - "@yarnpkg/parsers@3.0.2": - resolution: - { - integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==, - } - engines: { node: ">=18.12.0" } - - "@zkochan/js-yaml@0.0.7": - resolution: - { - integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==, - } + '@yarnpkg/lockfile@1.1.0': + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + + '@yarnpkg/parsers@3.0.2': + resolution: {integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==} + engines: {node: '>=18.12.0'} + + '@zkochan/js-yaml@0.0.7': + resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} hasBin: true JSONStream@1.3.5: - resolution: - { - integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, - } + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true abbrev@2.0.0: - resolution: - { - integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} acorn-jsx@5.3.2: - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn-walk@8.3.4: - resolution: - { - integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==, - } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} acorn@8.15.0: - resolution: - { - integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, - } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} hasBin: true add-stream@1.0.0: - resolution: - { - integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==, - } + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} agent-base@7.1.4: - resolution: - { - integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} aggregate-error@3.1.0: - resolution: - { - integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ansi-colors@4.1.3: - resolution: - { - integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} ansi-escapes@4.3.2: - resolution: - { - integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} ansi-regex@6.2.2: - resolution: - { - integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} ansi-styles@5.2.0: - resolution: - { - integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} ansi-styles@6.2.3: - resolution: - { - integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} aproba@2.0.0: - resolution: - { - integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==, - } + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} arg@4.1.3: - resolution: - { - integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, - } + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} argparse@1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - } + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} array-differ@3.0.0: - resolution: - { - integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} array-ify@1.0.0: - resolution: - { - integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, - } + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} arrify@1.0.1: - resolution: - { - integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} arrify@2.0.1: - resolution: - { - integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} ast-types@0.16.1: - resolution: - { - integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} async@3.2.6: - resolution: - { - integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==, - } + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} axios@1.13.2: - resolution: - { - integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==, - } + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} babel-jest@30.2.0: - resolution: - { - integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - "@babel/core": ^7.11.0 || ^8.0.0-0 + '@babel/core': ^7.11.0 || ^8.0.0-0 babel-plugin-istanbul@7.0.1: - resolution: - { - integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} + engines: {node: '>=12'} babel-plugin-jest-hoist@30.2.0: - resolution: - { - integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} babel-preset-current-node-syntax@1.2.0: - resolution: - { - integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==, - } + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - "@babel/core": ^7.0.0 || ^8.0.0-0 + '@babel/core': ^7.0.0 || ^8.0.0-0 babel-preset-jest@30.2.0: - resolution: - { - integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - "@babel/core": ^7.11.0 || ^8.0.0-beta.1 + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} baseline-browser-mapping@2.8.30: - resolution: - { - integrity: sha512-aTUKW4ptQhS64+v2d6IkPzymEzzhw+G0bA1g3uBRV3+ntkH+svttKseW5IOR4Ed6NUVKqnY7qT3dKvzQ7io4AA==, - } + resolution: {integrity: sha512-aTUKW4ptQhS64+v2d6IkPzymEzzhw+G0bA1g3uBRV3+ntkH+svttKseW5IOR4Ed6NUVKqnY7qT3dKvzQ7io4AA==} hasBin: true before-after-hook@2.2.3: - resolution: - { - integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, - } + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} bin-links@4.0.4: - resolution: - { - integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} binary-extensions@2.3.0: - resolution: - { - integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} bl@4.1.0: - resolution: - { - integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, - } + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} bluebird@3.7.2: - resolution: - { - integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==, - } + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} brace-expansion@1.1.12: - resolution: - { - integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==, - } + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} brace-expansion@2.0.2: - resolution: - { - integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==, - } + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} braces@3.0.3: - resolution: - { - integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} browserslist@4.28.0: - resolution: - { - integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true bs-logger@0.2.6: - resolution: - { - integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} bser@2.1.1: - resolution: - { - integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, - } + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} byte-size@8.1.1: - resolution: - { - integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==, - } - engines: { node: ">=12.17" } + resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} + engines: {node: '>=12.17'} cacache@18.0.4: - resolution: - { - integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} + engines: {node: ^16.14.0 || >=18.0.0} call-bind-apply-helpers@1.0.2: - resolution: - { - integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} camelcase-keys@6.2.2: - resolution: - { - integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} camelcase@5.3.1: - resolution: - { - integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} camelcase@6.3.0: - resolution: - { - integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} caniuse-lite@1.0.30001756: - resolution: - { - integrity: sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==, - } + resolution: {integrity: sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==} case@1.6.3: - resolution: - { - integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} + engines: {node: '>= 0.8.0'} catharsis@0.9.0: - resolution: - { - integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==, - } - engines: { node: ">= 10" } + resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} + engines: {node: '>= 10'} chalk@4.1.0: - resolution: - { - integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} + engines: {node: '>=10'} chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} char-regex@1.0.2: - resolution: - { - integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} chardet@2.1.1: - resolution: - { - integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==, - } + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} chokidar@3.6.0: - resolution: - { - integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, - } - engines: { node: ">= 8.10.0" } + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} chownr@2.0.0: - resolution: - { - integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} ci-info@3.9.0: - resolution: - { - integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} ci-info@4.3.1: - resolution: - { - integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} cjs-module-lexer@2.1.1: - resolution: - { - integrity: sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ==, - } + resolution: {integrity: sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ==} clean-stack@2.2.0: - resolution: - { - integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} cli-cursor@3.1.0: - resolution: - { - integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} cli-spinners@2.6.1: - resolution: - { - integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} cli-spinners@2.9.2: - resolution: - { - integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} cli-width@3.0.0: - resolution: - { - integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, - } - engines: { node: ">= 10" } + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} cliui@7.0.4: - resolution: - { - integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, - } + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} cliui@8.0.1: - resolution: - { - integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} clone-deep@4.0.1: - resolution: - { - integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} clone@1.0.4: - resolution: - { - integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, - } - engines: { node: ">=0.8" } + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} cmd-shim@6.0.3: - resolution: - { - integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} co@4.6.0: - resolution: - { - integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, - } - engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} collect-v8-coverage@1.0.3: - resolution: - { - integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==, - } + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-support@1.1.3: - resolution: - { - integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==, - } + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true columnify@1.6.0: - resolution: - { - integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==, - } - engines: { node: ">=8.0.0" } + resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} + engines: {node: '>=8.0.0'} combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} common-ancestor-path@1.0.1: - resolution: - { - integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==, - } + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} compare-func@2.0.0: - resolution: - { - integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, - } + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} concat-stream@2.0.0: - resolution: - { - integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==, - } - engines: { "0": node >= 6.0 } + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} console-control-strings@1.1.0: - resolution: - { - integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==, - } + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} conventional-changelog-angular@7.0.0: - resolution: - { - integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} conventional-changelog-core@5.0.1: - resolution: - { - integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==} + engines: {node: '>=14'} conventional-changelog-preset-loader@3.0.0: - resolution: - { - integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} + engines: {node: '>=14'} conventional-changelog-writer@6.0.1: - resolution: - { - integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} + engines: {node: '>=14'} hasBin: true conventional-commits-filter@3.0.0: - resolution: - { - integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} + engines: {node: '>=14'} conventional-commits-parser@4.0.0: - resolution: - { - integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} hasBin: true conventional-recommended-bump@7.0.1: - resolution: - { - integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} + engines: {node: '>=14'} hasBin: true convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - } + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} copyfiles@2.4.1: - resolution: - { - integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==, - } + resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} cosmiconfig@9.0.0: - resolution: - { - integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} peerDependencies: - typescript: ">=4.9.5" + typescript: '>=4.9.5' peerDependenciesMeta: typescript: optional: true create-require@1.1.1: - resolution: - { - integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, - } + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} cross-spawn@7.0.6: - resolution: - { - integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} cssesc@3.0.0: - resolution: - { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} hasBin: true dargs@7.0.0: - resolution: - { - integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} dateformat@3.0.3: - resolution: - { - integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, - } + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} debug@4.4.3: - resolution: - { - integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, - } - engines: { node: ">=6.0" } + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true decamelize-keys@1.1.1: - resolution: - { - integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} decamelize@1.2.0: - resolution: - { - integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} dedent@1.5.3: - resolution: - { - integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==, - } + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -2876,10 +1859,7 @@ packages: optional: true dedent@1.7.0: - resolution: - { - integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==, - } + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -2887,459 +1867,268 @@ packages: optional: true deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} defaults@1.0.4: - resolution: - { - integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, - } + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} define-lazy-prop@2.0.0: - resolution: - { - integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} deprecation@2.3.1: - resolution: - { - integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, - } + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} detect-indent@5.0.0: - resolution: - { - integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} + engines: {node: '>=4'} detect-newline@3.1.0: - resolution: - { - integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} diff-sequences@29.6.3: - resolution: - { - integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} diff@4.0.2: - resolution: - { - integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, - } - engines: { node: ">=0.3.1" } + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} dot-prop@5.3.0: - resolution: - { - integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} dotenv-expand@11.0.7: - resolution: - { - integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} dotenv@16.4.7: - resolution: - { - integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} dunder-proto@1.0.1: - resolution: - { - integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} ejs@3.1.10: - resolution: - { - integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} hasBin: true electron-to-chromium@1.5.259: - resolution: - { - integrity: sha512-I+oLXgpEJzD6Cwuwt1gYjxsDmu/S/Kd41mmLA3O+/uH2pFRO/DvOjUyGozL8j3KeLV6WyZ7ssPwELMsXCcsJAQ==, - } + resolution: {integrity: sha512-I+oLXgpEJzD6Cwuwt1gYjxsDmu/S/Kd41mmLA3O+/uH2pFRO/DvOjUyGozL8j3KeLV6WyZ7ssPwELMsXCcsJAQ==} emittery@0.13.1: - resolution: - { - integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} encoding@0.1.13: - resolution: - { - integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, - } + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} end-of-stream@1.4.5: - resolution: - { - integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==, - } + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} enquirer@2.3.6: - resolution: - { - integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==, - } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: ">=0.12" } + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} env-paths@2.2.1: - resolution: - { - integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} envinfo@7.13.0: - resolution: - { - integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} + engines: {node: '>=4'} hasBin: true err-code@2.0.3: - resolution: - { - integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==, - } + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} error-ex@1.3.4: - resolution: - { - integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==, - } + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} es-define-property@1.0.1: - resolution: - { - integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} es-errors@1.3.0: - resolution: - { - integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} es-object-atoms@1.1.1: - resolution: - { - integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: - resolution: - { - integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} escalade@3.2.0: - resolution: - { - integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} escape-string-regexp@1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, - } - engines: { node: ">=0.8.0" } + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} escape-string-regexp@2.0.0: - resolution: - { - integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} escodegen@1.14.3: - resolution: - { - integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==, - } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} hasBin: true eslint-config-prettier@10.1.8: - resolution: - { - integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==, - } + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: - eslint: ">=7.0.0" + eslint: '>=7.0.0' eslint-plugin-simple-import-sort@12.1.1: - resolution: - { - integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==, - } + resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} peerDependencies: - eslint: ">=5.0.0" + eslint: '>=5.0.0' eslint-plugin-unused-imports@4.3.0: - resolution: - { - integrity: sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==, - } + resolution: {integrity: sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==} peerDependencies: - "@typescript-eslint/eslint-plugin": ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 eslint: ^9.0.0 || ^8.0.0 peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": + '@typescript-eslint/eslint-plugin': optional: true eslint-scope@8.4.0: - resolution: - { - integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@4.2.1: - resolution: - { - integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint@9.39.1: - resolution: - { - integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: - jiti: "*" + jiti: '*' peerDependenciesMeta: jiti: optional: true espree@10.4.0: - resolution: - { - integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} esprima@4.0.1: - resolution: - { - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} hasBin: true esquery@1.6.0: - resolution: - { - integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, - } - engines: { node: ">=0.10" } + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} estraverse@4.3.0: - resolution: - { - integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, - } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} eventemitter3@4.0.7: - resolution: - { - integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, - } + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} execa@5.0.0: - resolution: - { - integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} + engines: {node: '>=10'} execa@5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} exit-x@0.2.2: - resolution: - { - integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} + engines: {node: '>= 0.8.0'} expect@30.2.0: - resolution: - { - integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} exponential-backoff@3.1.3: - resolution: - { - integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==, - } + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-glob@3.3.3: - resolution: - { - integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, - } - engines: { node: ">=8.6.0" } + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fastq@1.19.1: - resolution: - { - integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==, - } + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fb-watchman@2.0.2: - resolution: - { - integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, - } + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} fdir@6.5.0: - resolution: - { - integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -3347,839 +2136,483 @@ packages: optional: true figures@3.2.0: - resolution: - { - integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} file-entry-cache@8.0.0: - resolution: - { - integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, - } - engines: { node: ">=16.0.0" } + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} filelist@1.0.4: - resolution: - { - integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, - } + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} fill-range@7.1.1: - resolution: - { - integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} find-up@2.1.0: - resolution: - { - integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} find-up@4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} flat-cache@4.0.1: - resolution: - { - integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flat@5.0.2: - resolution: - { - integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, - } + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true flatted@3.3.3: - resolution: - { - integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, - } + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} follow-redirects@1.15.11: - resolution: - { - integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==, - } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} peerDependencies: - debug: "*" + debug: '*' peerDependenciesMeta: debug: optional: true foreground-child@3.3.1: - resolution: - { - integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} form-data@4.0.5: - resolution: - { - integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} front-matter@4.0.2: - resolution: - { - integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==, - } + resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} fs-extra@11.3.2: - resolution: - { - integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==, - } - engines: { node: ">=14.14" } + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} + engines: {node: '>=14.14'} fs-minipass@2.1.0: - resolution: - { - integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} fs-minipass@3.0.3: - resolution: - { - integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - } - engines: { node: ">=6.9.0" } + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} get-caller-file@2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - } - engines: { node: 6.* || 8.* || >= 10.* } + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} get-intrinsic@1.3.0: - resolution: - { - integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} get-package-type@0.1.0: - resolution: - { - integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, - } - engines: { node: ">=8.0.0" } + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} get-pkg-repo@4.2.1: - resolution: - { - integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==, - } - engines: { node: ">=6.9.0" } + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} hasBin: true get-port@5.1.1: - resolution: - { - integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} get-proto@1.0.1: - resolution: - { - integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} get-stream@6.0.0: - resolution: - { - integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} + engines: {node: '>=10'} get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} git-raw-commits@3.0.0: - resolution: - { - integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} + engines: {node: '>=14'} deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. hasBin: true git-remote-origin-url@2.0.0: - resolution: - { - integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} git-semver-tags@5.0.1: - resolution: - { - integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} + engines: {node: '>=14'} deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. hasBin: true git-up@7.0.0: - resolution: - { - integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==, - } + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} git-url-parse@14.0.0: - resolution: - { - integrity: sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==, - } + resolution: {integrity: sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==} gitconfiglocal@1.0.0: - resolution: - { - integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==, - } + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} glob@10.5.0: - resolution: - { - integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==, - } + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@11.1.0: - resolution: - { - integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@13.0.0: - resolution: - { - integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.0.3: - resolution: - { - integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==} + engines: {node: '>=12'} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@9.3.5: - resolution: - { - integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globals@14.0.0: - resolution: - { - integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@17.8.0: + resolution: {integrity: sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==} + engines: {node: '>=18'} gopd@1.2.0: - resolution: - { - integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} handlebars@4.7.8: - resolution: - { - integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==, - } - engines: { node: ">=0.4.7" } + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} hasBin: true hard-rejection@2.1.0: - resolution: - { - integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} has-flag@3.0.0: - resolution: - { - integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} has-symbols@1.1.0: - resolution: - { - integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} has-tostringtag@1.0.2: - resolution: - { - integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} has-unicode@2.0.1: - resolution: - { - integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==, - } + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} hosted-git-info@2.8.9: - resolution: - { - integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, - } + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} hosted-git-info@4.1.0: - resolution: - { - integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} hosted-git-info@7.0.2: - resolution: - { - integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} html-escaper@2.0.2: - resolution: - { - integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, - } + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} http-cache-semantics@4.2.0: - resolution: - { - integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==, - } + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-proxy-agent@7.0.2: - resolution: - { - integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} https-proxy-agent@7.0.6: - resolution: - { - integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: ">=10.17.0" } + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} iconv-lite@0.7.0: - resolution: - { - integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} ignore-by-default@1.0.1: - resolution: - { - integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==, - } + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} ignore-walk@6.0.5: - resolution: - { - integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} ignore@5.3.2: - resolution: - { - integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} ignore@7.0.5: - resolution: - { - integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} import-fresh@3.3.1: - resolution: - { - integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} import-local@3.1.0: - resolution: - { - integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} hasBin: true import-local@3.2.0: - resolution: - { - integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} hasBin: true imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: ">=0.8.19" } + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} indent-string@4.0.0: - resolution: - { - integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} ini@4.1.3: - resolution: - { - integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} init-package-json@6.0.3: - resolution: - { - integrity: sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==} + engines: {node: ^16.14.0 || >=18.0.0} inquirer@8.2.7: - resolution: - { - integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==} + engines: {node: '>=12.0.0'} ip-address@10.1.0: - resolution: - { - integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==, - } - engines: { node: ">= 12" } + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} is-arrayish@0.2.1: - resolution: - { - integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, - } + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} is-ci@3.0.1: - resolution: - { - integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==, - } + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true is-core-module@2.16.1: - resolution: - { - integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} hasBin: true is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} is-generator-fn@2.1.0: - resolution: - { - integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} is-interactive@1.0.0: - resolution: - { - integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} is-lambda@1.0.1: - resolution: - { - integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==, - } + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} is-obj@2.0.0: - resolution: - { - integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} is-plain-obj@1.1.0: - resolution: - { - integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} is-plain-object@2.0.4: - resolution: - { - integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} is-ssh@1.4.1: - resolution: - { - integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==, - } + resolution: {integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==} is-stream@2.0.0: - resolution: - { - integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} + engines: {node: '>=8'} is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} is-text-path@1.0.1: - resolution: - { - integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} is-unicode-supported@0.1.0: - resolution: - { - integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} isarray@0.0.1: - resolution: - { - integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==, - } + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} isexe@3.1.1: - resolution: - { - integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} isobject@3.0.1: - resolution: - { - integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} istanbul-lib-coverage@3.2.2: - resolution: - { - integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} istanbul-lib-instrument@6.0.3: - resolution: - { - integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} istanbul-lib-report@3.0.1: - resolution: - { - integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} istanbul-lib-source-maps@5.0.6: - resolution: - { - integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} istanbul-reports@3.2.0: - resolution: - { - integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} jackspeak@3.4.3: - resolution: - { - integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, - } + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jackspeak@4.1.1: - resolution: - { - integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} jake@10.9.4: - resolution: - { - integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} hasBin: true jest-changed-files@30.2.0: - resolution: - { - integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-circus@30.2.0: - resolution: - { - integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-cli@30.2.0: - resolution: - { - integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -4188,17 +2621,14 @@ packages: optional: true jest-config@30.2.0: - resolution: - { - integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - "@types/node": "*" - esbuild-register: ">=3.4.0" - ts-node: ">=9.0.0" + '@types/node': '*' + esbuild-register: '>=3.4.0' + ts-node: '>=9.0.0' peerDependenciesMeta: - "@types/node": + '@types/node': optional: true esbuild-register: optional: true @@ -4206,170 +2636,101 @@ packages: optional: true jest-diff@29.7.0: - resolution: - { - integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-diff@30.2.0: - resolution: - { - integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-docblock@30.2.0: - resolution: - { - integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-each@30.2.0: - resolution: - { - integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-environment-node@30.2.0: - resolution: - { - integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-get-type@29.6.3: - resolution: - { - integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-haste-map@30.2.0: - resolution: - { - integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-leak-detector@30.2.0: - resolution: - { - integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-matcher-utils@30.2.0: - resolution: - { - integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-message-util@30.2.0: - resolution: - { - integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-mock@30.2.0: - resolution: - { - integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-pnp-resolver@1.2.3: - resolution: - { - integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} peerDependencies: - jest-resolve: "*" + jest-resolve: '*' peerDependenciesMeta: jest-resolve: optional: true jest-regex-util@30.0.1: - resolution: - { - integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-resolve-dependencies@30.2.0: - resolution: - { - integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-resolve@30.2.0: - resolution: - { - integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-runner@30.2.0: - resolution: - { - integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-runtime@30.2.0: - resolution: - { - integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-snapshot@30.2.0: - resolution: - { - integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-util@30.2.0: - resolution: - { - integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-validate@30.2.0: - resolution: - { - integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-watcher@30.2.0: - resolution: - { - integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-worker@30.2.0: - resolution: - { - integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest@30.2.0: - resolution: - { - integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -4378,721 +2739,389 @@ packages: optional: true js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@3.14.2: - resolution: - { - integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==, - } + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true js-yaml@4.1.1: - resolution: - { - integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==, - } + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true js2xmlparser@4.0.2: - resolution: - { - integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==, - } + resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==} jsdoc@4.0.5: - resolution: - { - integrity: sha512-P4C6MWP9yIlMiK8nwoZvxN84vb6MsnXcHuy7XzVOvQoCizWX5JFCBsWIIWKXBltpoRZXddUOVQmCTOZt9yDj9g==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-P4C6MWP9yIlMiK8nwoZvxN84vb6MsnXcHuy7XzVOvQoCizWX5JFCBsWIIWKXBltpoRZXddUOVQmCTOZt9yDj9g==} + engines: {node: '>=12.0.0'} hasBin: true jsesc@3.1.0: - resolution: - { - integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-parse-better-errors@1.0.2: - resolution: - { - integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, - } + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} json-parse-even-better-errors@2.3.1: - resolution: - { - integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, - } + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} json-parse-even-better-errors@3.0.2: - resolution: - { - integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} json-stringify-nice@1.1.4: - resolution: - { - integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==, - } + resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} json-stringify-safe@5.0.1: - resolution: - { - integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, - } + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true jsonc-parser@3.2.0: - resolution: - { - integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, - } + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} jsonfile@6.2.0: - resolution: - { - integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==, - } + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsonparse@1.3.1: - resolution: - { - integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, - } - engines: { "0": node >= 0.2.0 } + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} just-diff-apply@5.5.0: - resolution: - { - integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==, - } + resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} just-diff@6.0.2: - resolution: - { - integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==, - } + resolution: {integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==} keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} kind-of@6.0.3: - resolution: - { - integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} klaw@3.0.0: - resolution: - { - integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==, - } + resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} lerna@8.2.4: - resolution: - { - integrity: sha512-0gaVWDIVT7fLfprfwpYcQajb7dBJv3EGavjG7zvJ+TmGx3/wovl5GklnSwM2/WeE0Z2wrIz7ndWhBcDUHVjOcQ==, - } - engines: { node: ">=18.0.0" } + resolution: {integrity: sha512-0gaVWDIVT7fLfprfwpYcQajb7dBJv3EGavjG7zvJ+TmGx3/wovl5GklnSwM2/WeE0Z2wrIz7ndWhBcDUHVjOcQ==} + engines: {node: '>=18.0.0'} hasBin: true leven@3.1.0: - resolution: - { - integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} levn@0.3.0: - resolution: - { - integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} libnpmaccess@8.0.6: - resolution: - { - integrity: sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==} + engines: {node: ^16.14.0 || >=18.0.0} libnpmpublish@9.0.9: - resolution: - { - integrity: sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==, - } - engines: { node: ^16.14.0 || >=18.0.0 } - - libpg-query@13.6.0: - resolution: - { - integrity: sha512-zaCGweMgNiPRGRfNVR8wO+XNCl2jZOx8eOXTbaIPgkePI6UJ2FKbHrRSHO5qJSvLxGm5j/5ry7uAdFw3lCn7gw==, - } - - libpg-query@14.3.0: - resolution: - { - integrity: sha512-1EXJl0jnbBNOmnElRl0iBCIMJutNVYRrCd6K4Qb0bCVQBEg/GZIy3nahEkhyNu304FuKrdvpXjPSwbF3SA8l5g==, - } - - libpg-query@15.5.0: - resolution: - { - integrity: sha512-BICQ93a3lS//ADwh9QBAvb0zqhK0FORYgce3sOLF+OUTJXzB5XT1BKSx/ZGaVW81pKQS7yUz9983uO9xc2n+Iw==, - } - - libpg-query@16.6.0: - resolution: - { - integrity: sha512-9nFUiRa+0Qysh/UYKi2k3xGkZrKHjc8iUd4xY2u+M4iGYO2HBfgb1QfIFlGlG/HE5/nRQF2rp8nIOgDnugEN6g==, - } - - libpg-query@17.6.0: - resolution: - { - integrity: sha512-r4zOTcLTGYS5PlLQAicJ6Yi/tvZFag42YUuNEO8pi8bwt/ZZ4kj514J4QV5bOx0mZzPLF6agbfNXQVxGgmHR8g==, - } + resolution: {integrity: sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==} + engines: {node: ^16.14.0 || >=18.0.0} libpg-query@18.1.2: - resolution: - { - integrity: sha512-8epkLd4hMoUVfYu2RlXWiUTxnGw1S6adm6/rMgWqlUB6+KsVb5BmJrDY8CjaPB9NWbEt6OnvQnfGxol2iBxn4A==, - } + resolution: {integrity: sha512-8epkLd4hMoUVfYu2RlXWiUTxnGw1S6adm6/rMgWqlUB6+KsVb5BmJrDY8CjaPB9NWbEt6OnvQnfGxol2iBxn4A==} lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} lines-and-columns@2.0.3: - resolution: - { - integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} linkify-it@5.0.0: - resolution: - { - integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==, - } + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} load-json-file@4.0.0: - resolution: - { - integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} load-json-file@6.2.0: - resolution: - { - integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} + engines: {node: '>=8'} locate-path@2.0.0: - resolution: - { - integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} locate-path@5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} lodash.ismatch@4.4.0: - resolution: - { - integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==, - } + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} lodash.memoize@4.1.2: - resolution: - { - integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, - } + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} log-symbols@4.1.0: - resolution: - { - integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} long@5.3.2: - resolution: - { - integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==, - } + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} lru-cache@10.4.3: - resolution: - { - integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, - } + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@11.2.2: - resolution: - { - integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} makage@0.1.8: - resolution: - { - integrity: sha512-tuiW9YKY1v6hFakrFoNh0+Qn3PafiV6+LY1ZiIFvJQ6VmkbqbWbSZrSj3IdZI24EO5jPIyL2tgiwboBtlRrlbQ==, - } + resolution: {integrity: sha512-tuiW9YKY1v6hFakrFoNh0+Qn3PafiV6+LY1ZiIFvJQ6VmkbqbWbSZrSj3IdZI24EO5jPIyL2tgiwboBtlRrlbQ==} hasBin: true make-dir@2.1.0: - resolution: - { - integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} make-dir@4.0.0: - resolution: - { - integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} make-error@1.3.6: - resolution: - { - integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, - } + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} make-fetch-happen@13.0.1: - resolution: - { - integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} + engines: {node: ^16.14.0 || >=18.0.0} makeerror@1.0.12: - resolution: - { - integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, - } + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} map-obj@1.0.1: - resolution: - { - integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} map-obj@4.3.0: - resolution: - { - integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} markdown-it-anchor@8.6.7: - resolution: - { - integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==, - } + resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} peerDependencies: - "@types/markdown-it": "*" - markdown-it: "*" + '@types/markdown-it': '*' + markdown-it: '*' markdown-it@14.1.0: - resolution: - { - integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==, - } + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true marked@4.3.0: - resolution: - { - integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==, - } - engines: { node: ">= 12" } + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} hasBin: true math-intrinsics@1.1.0: - resolution: - { - integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} mdurl@2.0.0: - resolution: - { - integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==, - } + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} meow@8.1.2: - resolution: - { - integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} merge-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} micromatch@4.0.8: - resolution: - { - integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, - } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} mimic-fn@2.1.0: - resolution: - { - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} min-indent@1.0.1: - resolution: - { - integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} minimatch@10.1.1: - resolution: - { - integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} minimatch@3.0.5: - resolution: - { - integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==, - } + resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} minimatch@8.0.4: - resolution: - { - integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} minimatch@9.0.3: - resolution: - { - integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} minimatch@9.0.5: - resolution: - { - integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minimist-options@4.1.0: - resolution: - { - integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} minipass-collect@2.0.1: - resolution: - { - integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} minipass-fetch@3.0.5: - resolution: - { - integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} minipass-flush@1.0.5: - resolution: - { - integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} minipass-pipeline@1.2.4: - resolution: - { - integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} minipass-sized@1.0.3: - resolution: - { - integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} minipass@3.3.6: - resolution: - { - integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} minipass@4.2.8: - resolution: - { - integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} minipass@5.0.0: - resolution: - { - integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} minipass@7.1.2: - resolution: - { - integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} minizlib@2.1.2: - resolution: - { - integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} mkdirp@1.0.4: - resolution: - { - integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} hasBin: true mkdirp@3.0.1: - resolution: - { - integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} hasBin: true modify-values@1.0.1: - resolution: - { - integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} multimatch@5.0.0: - resolution: - { - integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} mute-stream@0.0.8: - resolution: - { - integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, - } + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} mute-stream@1.0.0: - resolution: - { - integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} napi-postinstall@0.3.4: - resolution: - { - integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==, - } - engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} negotiator@0.6.4: - resolution: - { - integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} neo-async@2.6.2: - resolution: - { - integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, - } + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} nested-obj@0.2.2: - resolution: - { - integrity: sha512-M1etu+T6Ai9Bo06L3K3nWD0ytZWltggBGsrxJlOGvMNGlCA4fokUVlbPKoWzsiiRX+PXq6Cb1xFEn4chiyC7MQ==, - } + resolution: {integrity: sha512-M1etu+T6Ai9Bo06L3K3nWD0ytZWltggBGsrxJlOGvMNGlCA4fokUVlbPKoWzsiiRX+PXq6Cb1xFEn4chiyC7MQ==} node-fetch@2.6.7: - resolution: - { - integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, - } - engines: { node: 4.x || >=6.0.0 } + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -5100,1329 +3129,755 @@ packages: optional: true node-gyp@10.3.1: - resolution: - { - integrity: sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true node-int64@0.4.0: - resolution: - { - integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, - } + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} node-machine-id@1.1.12: - resolution: - { - integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==, - } + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} node-releases@2.0.27: - resolution: - { - integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==, - } + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} nodemon@3.1.11: - resolution: - { - integrity: sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==} + engines: {node: '>=10'} hasBin: true noms@0.0.0: - resolution: - { - integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==, - } + resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} nopt@7.2.1: - resolution: - { - integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true normalize-package-data@2.5.0: - resolution: - { - integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, - } + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} normalize-package-data@3.0.3: - resolution: - { - integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} normalize-package-data@6.0.2: - resolution: - { - integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} npm-bundled@3.0.1: - resolution: - { - integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-install-checks@6.3.0: - resolution: - { - integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-normalize-package-bin@3.0.1: - resolution: - { - integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-package-arg@11.0.2: - resolution: - { - integrity: sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==} + engines: {node: ^16.14.0 || >=18.0.0} npm-packlist@8.0.2: - resolution: - { - integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-pick-manifest@9.1.0: - resolution: - { - integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} + engines: {node: ^16.14.0 || >=18.0.0} npm-registry-fetch@17.1.0: - resolution: - { - integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} + engines: {node: ^16.14.0 || >=18.0.0} npm-run-path@4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} nx@20.8.3: - resolution: - { - integrity: sha512-8w815WSMWar3A/LFzwtmEY+E8cVW62lMiFuPDXje+C8O8hFndfvscP56QHNMn2Zdhz3q0+BZUe+se4Em1BKYdA==, - } + resolution: {integrity: sha512-8w815WSMWar3A/LFzwtmEY+E8cVW62lMiFuPDXje+C8O8hFndfvscP56QHNMn2Zdhz3q0+BZUe+se4Em1BKYdA==} hasBin: true peerDependencies: - "@swc-node/register": ^1.8.0 - "@swc/core": ^1.3.85 + '@swc-node/register': ^1.8.0 + '@swc/core': ^1.3.85 peerDependenciesMeta: - "@swc-node/register": + '@swc-node/register': optional: true - "@swc/core": + '@swc/core': optional: true once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} open@8.4.2: - resolution: - { - integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} optionator@0.8.3: - resolution: - { - integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} optionator@0.9.4: - resolution: - { - integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} ora@5.3.0: - resolution: - { - integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} + engines: {node: '>=10'} ora@5.4.1: - resolution: - { - integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} p-finally@1.0.0: - resolution: - { - integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} p-limit@1.3.0: - resolution: - { - integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} p-limit@2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} p-locate@2.0.0: - resolution: - { - integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} p-locate@4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} p-map-series@2.1.0: - resolution: - { - integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} + engines: {node: '>=8'} p-map@4.0.0: - resolution: - { - integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} p-pipe@3.1.0: - resolution: - { - integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} + engines: {node: '>=8'} p-queue@6.6.2: - resolution: - { - integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} p-reduce@2.1.0: - resolution: - { - integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} + engines: {node: '>=8'} p-timeout@3.2.0: - resolution: - { - integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} p-try@1.0.0: - resolution: - { - integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} p-waterfall@2.1.1: - resolution: - { - integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} + engines: {node: '>=8'} package-json-from-dist@1.0.1: - resolution: - { - integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, - } + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} pacote@18.0.6: - resolution: - { - integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} parse-conflict-json@3.0.1: - resolution: - { - integrity: sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} parse-json@4.0.0: - resolution: - { - integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} parse-json@5.2.0: - resolution: - { - integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} parse-path@7.1.0: - resolution: - { - integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==, - } + resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} parse-url@8.1.0: - resolution: - { - integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==, - } + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} path-exists@3.0.0: - resolution: - { - integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-scurry@1.11.1: - resolution: - { - integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, - } - engines: { node: ">=16 || 14 >=14.18" } + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-scurry@2.0.1: - resolution: - { - integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} path-type@3.0.0: - resolution: - { - integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, - } - engines: { node: ">=4" } - - pgsql-deparser@13.19.1: - resolution: - { - integrity: sha512-iCkE5h6wrXtRjT8ygdj7YktDVE3TwTYOLDmpEGT+8WWY47722584Zcr8kN/mk+2nA8mMVqH1Wwzwuu+aAdvjpQ==, - } - - pgsql-deparser@14.1.1: - resolution: - { - integrity: sha512-Oc6Q5XnKYI6GwmgwVAGQ9K5jV7HViw9yNZGXuMoJ4I6vHB9osEFcbYLYIyCeVXRIo+jwdu9vKfNq0SsH/lo8cw==, - } - - pgsql-deparser@15.1.1: - resolution: - { - integrity: sha512-tz+wcxIhgyGO7Ns8cdoup9X8hKK/2bTCtocwiXkO/Ore9n5aLIJNL/4Vc2cbSrkszqaEm2CJl+/0VX+tYqPi2A==, - } - - pgsql-deparser@16.1.1: - resolution: - { - integrity: sha512-57YaGD+aBDa6Bz3WwP58aEwXMzq8Y9O8OaPJJYG3XpF3z9DVNiGW5PX/UpSClMfPjaEm0aGnQuTfMXrC0Bx5Ug==, - } - - pgsql-deparser@17.12.2: - resolution: - { - integrity: sha512-R/2BFqeAhUWK64c8RluoXR2f2+U/UZAPRG7KFsTXzrTX3HUQsYK/IYaWRyzJCST/HmeGXMLtXq3UeSd7xTUmOw==, - } + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} picocolors@1.1.1: - resolution: - { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, - } + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} picomatch@4.0.3: - resolution: - { - integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} pify@2.3.0: - resolution: - { - integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} pify@3.0.0: - resolution: - { - integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} pify@4.0.1: - resolution: - { - integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} pify@5.0.0: - resolution: - { - integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} pirates@4.0.7: - resolution: - { - integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} pkg-dir@4.2.0: - resolution: - { - integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} postcss-selector-parser@6.1.2: - resolution: - { - integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} prelude-ls@1.1.2: - resolution: - { - integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} prettier@3.6.2: - resolution: - { - integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} hasBin: true pretty-format@29.7.0: - resolution: - { - integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} pretty-format@30.2.0: - resolution: - { - integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} proc-log@4.2.0: - resolution: - { - integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} proggy@2.0.0: - resolution: - { - integrity: sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} promise-all-reject-late@1.0.1: - resolution: - { - integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==, - } + resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} promise-call-limit@3.0.2: - resolution: - { - integrity: sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==, - } + resolution: {integrity: sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==} promise-inflight@1.0.1: - resolution: - { - integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==, - } + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: - bluebird: "*" + bluebird: '*' peerDependenciesMeta: bluebird: optional: true promise-retry@2.0.1: - resolution: - { - integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} promzard@1.0.2: - resolution: - { - integrity: sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} protocols@2.0.2: - resolution: - { - integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==, - } + resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} pstree.remy@1.1.8: - resolution: - { - integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==, - } + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} punycode.js@2.3.1: - resolution: - { - integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} pure-rand@7.0.1: - resolution: - { - integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==, - } + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} quick-lru@4.0.1: - resolution: - { - integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} react-is@18.3.1: - resolution: - { - integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, - } + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} read-cmd-shim@4.0.0: - resolution: - { - integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} read-package-json-fast@3.0.2: - resolution: - { - integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} read-pkg-up@3.0.0: - resolution: - { - integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} read-pkg-up@7.0.1: - resolution: - { - integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} read-pkg@3.0.0: - resolution: - { - integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} read-pkg@5.2.0: - resolution: - { - integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} read@3.0.1: - resolution: - { - integrity: sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} readable-stream@1.0.34: - resolution: - { - integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==, - } + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - } + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} recast@0.23.11: - resolution: - { - integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} redent@3.0.0: - resolution: - { - integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} requizzle@0.2.4: - resolution: - { - integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==, - } + resolution: {integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==} resolve-cwd@3.0.0: - resolution: - { - integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} resolve.exports@2.0.3: - resolution: - { - integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} resolve@1.22.11: - resolution: - { - integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} hasBin: true restore-cursor@3.1.0: - resolution: - { - integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} retry@0.12.0: - resolution: - { - integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} reusify@1.1.0: - resolution: - { - integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rimraf@4.4.1: - resolution: - { - integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} hasBin: true rimraf@6.1.2: - resolution: - { - integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} + engines: {node: 20 || >=22} hasBin: true run-async@2.4.1: - resolution: - { - integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, - } - engines: { node: ">=0.12.0" } + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} rxjs@7.8.2: - resolution: - { - integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==, - } + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} semver@5.7.2: - resolution: - { - integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, - } + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true semver@7.7.3: - resolution: - { - integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} hasBin: true set-blocking@2.0.0: - resolution: - { - integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, - } + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} shallow-clone@3.0.1: - resolution: - { - integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} sigstore@2.3.1: - resolution: - { - integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} + engines: {node: ^16.14.0 || >=18.0.0} simple-update-notifier@2.0.0: - resolution: - { - integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} smart-buffer@4.2.0: - resolution: - { - integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, - } - engines: { node: ">= 6.0.0", npm: ">= 3.0.0" } + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} socks-proxy-agent@8.0.5: - resolution: - { - integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} socks@2.8.7: - resolution: - { - integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==, - } - engines: { node: ">= 10.0.0", npm: ">= 3.0.0" } + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sort-keys@2.0.0: - resolution: - { - integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} + engines: {node: '>=4'} source-map-support@0.5.13: - resolution: - { - integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, - } + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} spdx-correct@3.2.0: - resolution: - { - integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, - } + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} spdx-exceptions@2.5.0: - resolution: - { - integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, - } + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} spdx-expression-parse@3.0.1: - resolution: - { - integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, - } + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} spdx-license-ids@3.0.22: - resolution: - { - integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==, - } + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} split2@3.2.2: - resolution: - { - integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, - } + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} split@1.0.1: - resolution: - { - integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, - } + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} sprintf-js@1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - } + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} ssri@10.0.6: - resolution: - { - integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} stack-utils@2.0.6: - resolution: - { - integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} strfy-js@3.1.5: - resolution: - { - integrity: sha512-FsH+1Y+6AeJuw+yMNpxrAHDzkezgAzoL5txSj+DUoTvmZxq3hOFFsiTI0+IC6Y4nt6o4HPQqLeWL3lstTjKoHA==, - } + resolution: {integrity: sha512-FsH+1Y+6AeJuw+yMNpxrAHDzkezgAzoL5txSj+DUoTvmZxq3hOFFsiTI0+IC6Y4nt6o4HPQqLeWL3lstTjKoHA==} string-length@4.0.2: - resolution: - { - integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} string-width@5.1.2: - resolution: - { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} string_decoder@0.10.31: - resolution: - { - integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==, - } + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} strip-ansi@7.1.2: - resolution: - { - integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} strip-bom@3.0.0: - resolution: - { - integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} strip-bom@4.0.0: - resolution: - { - integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} strip-final-newline@2.0.0: - resolution: - { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} strip-indent@3.0.0: - resolution: - { - integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} supports-color@5.5.0: - resolution: - { - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} supports-color@8.1.1: - resolution: - { - integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} synckit@0.11.11: - resolution: - { - integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} tar@6.2.1: - resolution: - { - integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me temp-dir@1.0.0: - resolution: - { - integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} + engines: {node: '>=4'} test-exclude@6.0.0: - resolution: - { - integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} text-extensions@1.9.0: - resolution: - { - integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, - } - engines: { node: ">=0.10" } + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} through2@2.0.5: - resolution: - { - integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, - } + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} through@2.3.8: - resolution: - { - integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, - } + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} tiny-invariant@1.3.3: - resolution: - { - integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==, - } + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} tinyglobby@0.2.12: - resolution: - { - integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} tmp@0.2.5: - resolution: - { - integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==, - } - engines: { node: ">=14.14" } + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} tmpl@1.0.5: - resolution: - { - integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, - } + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} touch@3.1.1: - resolution: - { - integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==, - } + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} hasBin: true tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} treeverse@3.0.0: - resolution: - { - integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} trim-newlines@3.0.1: - resolution: - { - integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} ts-api-utils@2.1.0: - resolution: - { - integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==, - } - engines: { node: ">=18.12" } + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} peerDependencies: - typescript: ">=4.8.4" + typescript: '>=4.8.4' + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' ts-jest@29.4.6: - resolution: - { - integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0 } + resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - "@babel/core": ">=7.0.0-beta.0 <8" - "@jest/transform": ^29.0.0 || ^30.0.0 - "@jest/types": ^29.0.0 || ^30.0.0 + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 babel-jest: ^29.0.0 || ^30.0.0 - esbuild: "*" + esbuild: '*' jest: ^29.0.0 || ^30.0.0 jest-util: ^29.0.0 || ^30.0.0 - typescript: ">=4.3 <6" + typescript: '>=4.3 <6' peerDependenciesMeta: - "@babel/core": + '@babel/core': optional: true - "@jest/transform": + '@jest/transform': optional: true - "@jest/types": + '@jest/types': optional: true babel-jest: optional: true @@ -6432,474 +3887,280 @@ packages: optional: true ts-node@10.9.2: - resolution: - { - integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==, - } + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' peerDependenciesMeta: - "@swc/core": + '@swc/core': optional: true - "@swc/wasm": + '@swc/wasm': optional: true tsconfig-paths@4.2.0: - resolution: - { - integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} tslib@2.8.1: - resolution: - { - integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, - } + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tuf-js@2.2.1: - resolution: - { - integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} + engines: {node: ^16.14.0 || >=18.0.0} type-check@0.3.2: - resolution: - { - integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} type-detect@4.0.8: - resolution: - { - integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} type-fest@0.18.1: - resolution: - { - integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} type-fest@0.21.3: - resolution: - { - integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} type-fest@0.4.1: - resolution: - { - integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} + engines: {node: '>=6'} type-fest@0.6.0: - resolution: - { - integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} type-fest@0.8.1: - resolution: - { - integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} type-fest@4.41.0: - resolution: - { - integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} typedarray@0.0.6: - resolution: - { - integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, - } + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} typescript@5.9.3: - resolution: - { - integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==, - } - engines: { node: ">=14.17" } + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} hasBin: true uc.micro@2.1.0: - resolution: - { - integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==, - } + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} uglify-js@3.19.3: - resolution: - { - integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==, - } - engines: { node: ">=0.8.0" } + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} hasBin: true undefsafe@2.0.5: - resolution: - { - integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==, - } + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} underscore@1.13.7: - resolution: - { - integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==, - } + resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} undici-types@6.21.0: - resolution: - { - integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, - } + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} unique-filename@3.0.0: - resolution: - { - integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} unique-slug@4.0.0: - resolution: - { - integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} universal-user-agent@6.0.1: - resolution: - { - integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==, - } + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} universalify@2.0.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: ">= 10.0.0" } + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} unrs-resolver@1.11.1: - resolution: - { - integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==, - } + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} untildify@4.0.0: - resolution: - { - integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} upath@2.0.1: - resolution: - { - integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} update-browserslist-db@1.1.4: - resolution: - { - integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==, - } + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} hasBin: true peerDependencies: - browserslist: ">= 4.21.0" + browserslist: '>= 4.21.0' uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} uuid@10.0.0: - resolution: - { - integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==, - } + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true v8-compile-cache-lib@3.0.1: - resolution: - { - integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, - } + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} v8-to-istanbul@9.3.0: - resolution: - { - integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==, - } - engines: { node: ">=10.12.0" } + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} validate-npm-package-license@3.0.4: - resolution: - { - integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, - } + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} validate-npm-package-name@5.0.1: - resolution: - { - integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} walk-up-path@3.0.1: - resolution: - { - integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==, - } + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} walker@1.0.8: - resolution: - { - integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, - } + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} wcwidth@1.0.1: - resolution: - { - integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, - } + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true which@4.0.0: - resolution: - { - integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==, - } - engines: { node: ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} hasBin: true wide-align@1.1.5: - resolution: - { - integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==, - } + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} word-wrap@1.2.5: - resolution: - { - integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} wordwrap@1.0.0: - resolution: - { - integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, - } + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} wrap-ansi@6.2.0: - resolution: - { - integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} write-file-atomic@2.4.3: - resolution: - { - integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==, - } + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} write-file-atomic@5.0.1: - resolution: - { - integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} write-json-file@3.2.0: - resolution: - { - integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} + engines: {node: '>=6'} write-pkg@4.0.0: - resolution: - { - integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} + engines: {node: '>=8'} xmlcreate@2.0.4: - resolution: - { - integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==, - } + resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} xtend@4.0.2: - resolution: - { - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, - } - engines: { node: ">=0.4" } + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} y18n@5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - } + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} yaml@2.8.1: - resolution: - { - integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==, - } - engines: { node: ">= 14.6" } + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@20.2.9: - resolution: - { - integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} yargs-parser@21.1.1: - resolution: - { - integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} yargs@16.2.0: - resolution: - { - integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} yargs@17.7.2: - resolution: - { - integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} yn@3.1.1: - resolution: - { - integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} snapshots: - "@babel/code-frame@7.27.1": + + '@babel/code-frame@7.27.1': dependencies: - "@babel/helper-validator-identifier": 7.28.5 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - "@babel/compat-data@7.28.5": {} + '@babel/compat-data@7.28.5': {} - "@babel/core@7.28.5": + '@babel/core@7.28.5': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/generator": 7.28.5 - "@babel/helper-compilation-targets": 7.27.2 - "@babel/helper-module-transforms": 7.28.3(@babel/core@7.28.5) - "@babel/helpers": 7.28.4 - "@babel/parser": 7.28.5 - "@babel/template": 7.27.2 - "@babel/traverse": 7.28.5 - "@babel/types": 7.28.5 - "@jridgewell/remapping": 2.3.5 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@5.5.0) gensync: 1.0.0-beta.2 @@ -6908,208 +4169,227 @@ snapshots: transitivePeerDependencies: - supports-color - "@babel/generator@7.28.5": + '@babel/generator@7.28.5': dependencies: - "@babel/parser": 7.28.5 - "@babel/types": 7.28.5 - "@jridgewell/gen-mapping": 0.3.13 - "@jridgewell/trace-mapping": 0.3.31 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - "@babel/helper-compilation-targets@7.27.2": + '@babel/helper-compilation-targets@7.27.2': dependencies: - "@babel/compat-data": 7.28.5 - "@babel/helper-validator-option": 7.27.1 + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 browserslist: 4.28.0 lru-cache: 5.1.1 semver: 6.3.1 - "@babel/helper-globals@7.28.0": {} + '@babel/helper-globals@7.28.0': {} - "@babel/helper-module-imports@7.27.1": + '@babel/helper-module-imports@7.27.1': dependencies: - "@babel/traverse": 7.28.5 - "@babel/types": 7.28.5 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - "@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)": + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-module-imports": 7.27.1 - "@babel/helper-validator-identifier": 7.28.5 - "@babel/traverse": 7.28.5 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - "@babel/helper-plugin-utils@7.27.1": {} + '@babel/helper-plugin-utils@7.27.1': {} - "@babel/helper-string-parser@7.27.1": {} + '@babel/helper-string-parser@7.27.1': {} - "@babel/helper-validator-identifier@7.28.5": {} + '@babel/helper-validator-identifier@7.28.5': {} - "@babel/helper-validator-option@7.27.1": {} + '@babel/helper-validator-option@7.27.1': {} - "@babel/helpers@7.28.4": + '@babel/helpers@7.28.4': dependencies: - "@babel/template": 7.27.2 - "@babel/types": 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 - "@babel/parser@7.28.5": + '@babel/parser@7.28.5': dependencies: - "@babel/types": 7.28.5 + '@babel/types': 7.28.5 - "@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5)": + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5)": + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5)": + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5)": + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)": + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)": + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5)": + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)": + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5)": + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5)": + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5)": + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5)": + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5)": + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5)": + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5)": + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5)": + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)": + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/template@7.27.2": + '@babel/template@7.27.2': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/parser": 7.28.5 - "@babel/types": 7.28.5 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - "@babel/traverse@7.28.5": + '@babel/traverse@7.28.5': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/generator": 7.28.5 - "@babel/helper-globals": 7.28.0 - "@babel/parser": 7.28.5 - "@babel/template": 7.27.2 - "@babel/types": 7.28.5 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color - "@babel/types@7.28.5": + '@babel/types@7.28.5': dependencies: - "@babel/helper-string-parser": 7.27.1 - "@babel/helper-validator-identifier": 7.28.5 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - "@bcoe/v8-coverage@0.2.3": {} + '@bcoe/v8-coverage@0.2.3': {} - "@cspotcode/source-map-support@0.8.1": + '@constructive-io/eslint-config@0.2.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - "@jridgewell/trace-mapping": 0.3.9 + '@eslint/js': 9.39.5 + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.65.0(eslint@9.39.1)(typescript@5.9.3) + eslint: 9.39.1 + eslint-config-prettier: 10.1.8(eslint@9.39.1) + eslint-plugin-simple-import-sort: 12.1.1(eslint@9.39.1) + eslint-plugin-unused-imports: 4.3.0(@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) + globals: 17.8.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 - "@emnapi/core@1.7.1": + '@emnapi/core@1.7.1': dependencies: - "@emnapi/wasi-threads": 1.1.0 + '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 - "@emnapi/runtime@1.7.1": + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 - "@emnapi/wasi-threads@1.1.0": + '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 - "@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)": + '@eslint-community/eslint-utils@4.10.1(eslint@9.39.1)': dependencies: eslint: 9.39.1 eslint-visitor-keys: 3.4.3 - "@eslint-community/regexpp@4.12.2": {} + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': + dependencies: + eslint: 9.39.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} - "@eslint/config-array@0.21.1": + '@eslint/config-array@0.21.1': dependencies: - "@eslint/object-schema": 2.1.7 + '@eslint/object-schema': 2.1.7 debug: 4.4.3(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - "@eslint/config-helpers@0.4.2": + '@eslint/config-helpers@0.4.2': dependencies: - "@eslint/core": 0.17.0 + '@eslint/core': 0.17.0 - "@eslint/core@0.17.0": + '@eslint/core@0.17.0': dependencies: - "@types/json-schema": 7.0.15 + '@types/json-schema': 7.0.15 - "@eslint/eslintrc@3.3.1": + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.3(supports-color@5.5.0) @@ -7123,42 +4403,44 @@ snapshots: transitivePeerDependencies: - supports-color - "@eslint/js@9.39.1": {} + '@eslint/js@9.39.1': {} + + '@eslint/js@9.39.5': {} - "@eslint/object-schema@2.1.7": {} + '@eslint/object-schema@2.1.7': {} - "@eslint/plugin-kit@0.4.1": + '@eslint/plugin-kit@0.4.1': dependencies: - "@eslint/core": 0.17.0 + '@eslint/core': 0.17.0 levn: 0.4.1 - "@humanfs/core@0.19.1": {} + '@humanfs/core@0.19.1': {} - "@humanfs/node@0.16.7": + '@humanfs/node@0.16.7': dependencies: - "@humanfs/core": 0.19.1 - "@humanwhocodes/retry": 0.4.3 + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 - "@humanwhocodes/module-importer@1.0.1": {} + '@humanwhocodes/module-importer@1.0.1': {} - "@humanwhocodes/retry@0.4.3": {} + '@humanwhocodes/retry@0.4.3': {} - "@hutson/parse-repository-url@3.0.2": {} + '@hutson/parse-repository-url@3.0.2': {} - "@inquirer/external-editor@1.0.3(@types/node@20.19.25)": + '@inquirer/external-editor@1.0.3(@types/node@20.19.25)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.0 optionalDependencies: - "@types/node": 20.19.25 + '@types/node': 20.19.25 - "@isaacs/balanced-match@4.0.1": {} + '@isaacs/balanced-match@4.0.1': {} - "@isaacs/brace-expansion@5.0.0": + '@isaacs/brace-expansion@5.0.0': dependencies: - "@isaacs/balanced-match": 4.0.1 + '@isaacs/balanced-match': 4.0.1 - "@isaacs/cliui@8.0.2": + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 @@ -7167,9 +4449,9 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - "@isaacs/string-locale-compare@1.1.0": {} + '@isaacs/string-locale-compare@1.1.0': {} - "@istanbuljs/load-nyc-config@1.1.0": + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 find-up: 4.1.0 @@ -7177,26 +4459,26 @@ snapshots: js-yaml: 3.14.2 resolve-from: 5.0.0 - "@istanbuljs/schema@0.1.3": {} + '@istanbuljs/schema@0.1.3': {} - "@jest/console@30.2.0": + '@jest/console@30.2.0': dependencies: - "@jest/types": 30.2.0 - "@types/node": 20.19.25 + '@jest/types': 30.2.0 + '@types/node': 20.19.25 chalk: 4.1.2 jest-message-util: 30.2.0 jest-util: 30.2.0 slash: 3.0.0 - "@jest/core@30.2.0(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3))": + '@jest/core@30.2.0(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3))': dependencies: - "@jest/console": 30.2.0 - "@jest/pattern": 30.0.1 - "@jest/reporters": 30.2.0 - "@jest/test-result": 30.2.0 - "@jest/transform": 30.2.0 - "@jest/types": 30.2.0 - "@types/node": 20.19.25 + '@jest/console': 30.2.0 + '@jest/pattern': 30.0.1 + '@jest/reporters': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 20.19.25 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.3.1 @@ -7224,60 +4506,60 @@ snapshots: - supports-color - ts-node - "@jest/diff-sequences@30.0.1": {} + '@jest/diff-sequences@30.0.1': {} - "@jest/environment@30.2.0": + '@jest/environment@30.2.0': dependencies: - "@jest/fake-timers": 30.2.0 - "@jest/types": 30.2.0 - "@types/node": 20.19.25 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 20.19.25 jest-mock: 30.2.0 - "@jest/expect-utils@30.2.0": + '@jest/expect-utils@30.2.0': dependencies: - "@jest/get-type": 30.1.0 + '@jest/get-type': 30.1.0 - "@jest/expect@30.2.0": + '@jest/expect@30.2.0': dependencies: expect: 30.2.0 jest-snapshot: 30.2.0 transitivePeerDependencies: - supports-color - "@jest/fake-timers@30.2.0": + '@jest/fake-timers@30.2.0': dependencies: - "@jest/types": 30.2.0 - "@sinonjs/fake-timers": 13.0.5 - "@types/node": 20.19.25 + '@jest/types': 30.2.0 + '@sinonjs/fake-timers': 13.0.5 + '@types/node': 20.19.25 jest-message-util: 30.2.0 jest-mock: 30.2.0 jest-util: 30.2.0 - "@jest/get-type@30.1.0": {} + '@jest/get-type@30.1.0': {} - "@jest/globals@30.2.0": + '@jest/globals@30.2.0': dependencies: - "@jest/environment": 30.2.0 - "@jest/expect": 30.2.0 - "@jest/types": 30.2.0 + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/types': 30.2.0 jest-mock: 30.2.0 transitivePeerDependencies: - supports-color - "@jest/pattern@30.0.1": + '@jest/pattern@30.0.1': dependencies: - "@types/node": 20.19.25 + '@types/node': 20.19.25 jest-regex-util: 30.0.1 - "@jest/reporters@30.2.0": + '@jest/reporters@30.2.0': dependencies: - "@bcoe/v8-coverage": 0.2.3 - "@jest/console": 30.2.0 - "@jest/test-result": 30.2.0 - "@jest/transform": 30.2.0 - "@jest/types": 30.2.0 - "@jridgewell/trace-mapping": 0.3.31 - "@types/node": 20.19.25 + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/node': 20.19.25 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit-x: 0.2.2 @@ -7297,46 +4579,46 @@ snapshots: transitivePeerDependencies: - supports-color - "@jest/schemas@29.6.3": + '@jest/schemas@29.6.3': dependencies: - "@sinclair/typebox": 0.27.8 + '@sinclair/typebox': 0.27.8 - "@jest/schemas@30.0.5": + '@jest/schemas@30.0.5': dependencies: - "@sinclair/typebox": 0.34.41 + '@sinclair/typebox': 0.34.41 - "@jest/snapshot-utils@30.2.0": + '@jest/snapshot-utils@30.2.0': dependencies: - "@jest/types": 30.2.0 + '@jest/types': 30.2.0 chalk: 4.1.2 graceful-fs: 4.2.11 natural-compare: 1.4.0 - "@jest/source-map@30.0.1": + '@jest/source-map@30.0.1': dependencies: - "@jridgewell/trace-mapping": 0.3.31 + '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 - "@jest/test-result@30.2.0": + '@jest/test-result@30.2.0': dependencies: - "@jest/console": 30.2.0 - "@jest/types": 30.2.0 - "@types/istanbul-lib-coverage": 2.0.6 + '@jest/console': 30.2.0 + '@jest/types': 30.2.0 + '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.3 - "@jest/test-sequencer@30.2.0": + '@jest/test-sequencer@30.2.0': dependencies: - "@jest/test-result": 30.2.0 + '@jest/test-result': 30.2.0 graceful-fs: 4.2.11 jest-haste-map: 30.2.0 slash: 3.0.0 - "@jest/transform@30.2.0": + '@jest/transform@30.2.0': dependencies: - "@babel/core": 7.28.5 - "@jest/types": 30.2.0 - "@jridgewell/trace-mapping": 0.3.31 + '@babel/core': 7.28.5 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 7.0.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -7352,47 +4634,47 @@ snapshots: transitivePeerDependencies: - supports-color - "@jest/types@30.2.0": + '@jest/types@30.2.0': dependencies: - "@jest/pattern": 30.0.1 - "@jest/schemas": 30.0.5 - "@types/istanbul-lib-coverage": 2.0.6 - "@types/istanbul-reports": 3.0.4 - "@types/node": 20.19.25 - "@types/yargs": 17.0.35 + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.19.25 + '@types/yargs': 17.0.35 chalk: 4.1.2 - "@jridgewell/gen-mapping@0.3.13": + '@jridgewell/gen-mapping@0.3.13': dependencies: - "@jridgewell/sourcemap-codec": 1.5.5 - "@jridgewell/trace-mapping": 0.3.31 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - "@jridgewell/remapping@2.3.5": + '@jridgewell/remapping@2.3.5': dependencies: - "@jridgewell/gen-mapping": 0.3.13 - "@jridgewell/trace-mapping": 0.3.31 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - "@jridgewell/resolve-uri@3.1.2": {} + '@jridgewell/resolve-uri@3.1.2': {} - "@jridgewell/sourcemap-codec@1.5.5": {} + '@jridgewell/sourcemap-codec@1.5.5': {} - "@jridgewell/trace-mapping@0.3.31": + '@jridgewell/trace-mapping@0.3.31': dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.5.5 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - "@jridgewell/trace-mapping@0.3.9": + '@jridgewell/trace-mapping@0.3.9': dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.5.5 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - "@jsdoc/salty@0.2.9": + '@jsdoc/salty@0.2.9': dependencies: lodash: 4.17.21 - "@launchql/protobufjs-cli@1.1.5(@launchql/protobufjs@7.2.6)": + '@launchql/protobufjs-cli@1.1.5(@launchql/protobufjs@7.2.6)': dependencies: - "@launchql/protobufjs": 7.2.6 + '@launchql/protobufjs': 7.2.6 chalk: 4.1.2 escodegen: 1.14.3 espree: 9.6.1 @@ -7404,29 +4686,29 @@ snapshots: tmp: 0.2.5 uglify-js: 3.19.3 - "@launchql/protobufjs@7.2.6": - dependencies: - "@protobufjs/aspromise": 1.1.2 - "@protobufjs/base64": 1.1.2 - "@protobufjs/codegen": 2.0.4 - "@protobufjs/eventemitter": 1.1.0 - "@protobufjs/fetch": 1.1.0 - "@protobufjs/float": 1.0.2 - "@protobufjs/inquire": 1.1.0 - "@protobufjs/path": 1.1.2 - "@protobufjs/pool": 1.1.0 - "@protobufjs/utf8": 1.1.0 - "@types/node": 20.19.25 + '@launchql/protobufjs@7.2.6': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.19.25 long: 5.3.2 - "@lerna/create@8.2.4(@types/node@20.19.25)(encoding@0.1.13)(typescript@5.9.3)": + '@lerna/create@8.2.4(@types/node@20.19.25)(encoding@0.1.13)(typescript@5.9.3)': dependencies: - "@npmcli/arborist": 7.5.4 - "@npmcli/package-json": 5.2.0 - "@npmcli/run-script": 8.1.0 - "@nx/devkit": 20.8.3(nx@20.8.3) - "@octokit/plugin-enterprise-rest": 6.0.1 - "@octokit/rest": 20.1.2 + '@npmcli/arborist': 7.5.4 + '@npmcli/package-json': 5.2.0 + '@npmcli/run-script': 8.1.0 + '@nx/devkit': 20.8.3(nx@20.8.3) + '@octokit/plugin-enterprise-rest': 6.0.1 + '@octokit/rest': 20.1.2 aproba: 2.0.0 byte-size: 8.1.1 chalk: 4.1.0 @@ -7491,9 +4773,9 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 transitivePeerDependencies: - - "@swc-node/register" - - "@swc/core" - - "@types/node" + - '@swc-node/register' + - '@swc/core' + - '@types/node' - babel-plugin-macros - bluebird - debug @@ -7501,32 +4783,32 @@ snapshots: - supports-color - typescript - "@napi-rs/wasm-runtime@0.2.12": + '@napi-rs/wasm-runtime@0.2.12': dependencies: - "@emnapi/core": 1.7.1 - "@emnapi/runtime": 1.7.1 - "@tybys/wasm-util": 0.10.1 + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 optional: true - "@napi-rs/wasm-runtime@0.2.4": + '@napi-rs/wasm-runtime@0.2.4': dependencies: - "@emnapi/core": 1.7.1 - "@emnapi/runtime": 1.7.1 - "@tybys/wasm-util": 0.9.0 + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.9.0 - "@nodelib/fs.scandir@2.1.5": + '@nodelib/fs.scandir@2.1.5': dependencies: - "@nodelib/fs.stat": 2.0.5 + '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - "@nodelib/fs.stat@2.0.5": {} + '@nodelib/fs.stat@2.0.5': {} - "@nodelib/fs.walk@1.2.8": + '@nodelib/fs.walk@1.2.8': dependencies: - "@nodelib/fs.scandir": 2.1.5 + '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - "@npmcli/agent@2.2.2": + '@npmcli/agent@2.2.2': dependencies: agent-base: 7.1.4 http-proxy-agent: 7.0.2 @@ -7536,19 +4818,19 @@ snapshots: transitivePeerDependencies: - supports-color - "@npmcli/arborist@7.5.4": - dependencies: - "@isaacs/string-locale-compare": 1.1.0 - "@npmcli/fs": 3.1.1 - "@npmcli/installed-package-contents": 2.1.0 - "@npmcli/map-workspaces": 3.0.6 - "@npmcli/metavuln-calculator": 7.1.1 - "@npmcli/name-from-folder": 2.0.0 - "@npmcli/node-gyp": 3.0.0 - "@npmcli/package-json": 5.2.0 - "@npmcli/query": 3.1.0 - "@npmcli/redact": 2.0.1 - "@npmcli/run-script": 8.1.0 + '@npmcli/arborist@7.5.4': + dependencies: + '@isaacs/string-locale-compare': 1.1.0 + '@npmcli/fs': 3.1.1 + '@npmcli/installed-package-contents': 2.1.0 + '@npmcli/map-workspaces': 3.0.6 + '@npmcli/metavuln-calculator': 7.1.1 + '@npmcli/name-from-folder': 2.0.0 + '@npmcli/node-gyp': 3.0.0 + '@npmcli/package-json': 5.2.0 + '@npmcli/query': 3.1.0 + '@npmcli/redact': 2.0.1 + '@npmcli/run-script': 8.1.0 bin-links: 4.0.4 cacache: 18.0.4 common-ancestor-path: 1.0.1 @@ -7577,13 +4859,13 @@ snapshots: - bluebird - supports-color - "@npmcli/fs@3.1.1": + '@npmcli/fs@3.1.1': dependencies: semver: 7.7.3 - "@npmcli/git@5.0.8": + '@npmcli/git@5.0.8': dependencies: - "@npmcli/promise-spawn": 7.0.2 + '@npmcli/promise-spawn': 7.0.2 ini: 4.1.3 lru-cache: 10.4.3 npm-pick-manifest: 9.1.0 @@ -7595,19 +4877,19 @@ snapshots: transitivePeerDependencies: - bluebird - "@npmcli/installed-package-contents@2.1.0": + '@npmcli/installed-package-contents@2.1.0': dependencies: npm-bundled: 3.0.1 npm-normalize-package-bin: 3.0.1 - "@npmcli/map-workspaces@3.0.6": + '@npmcli/map-workspaces@3.0.6': dependencies: - "@npmcli/name-from-folder": 2.0.0 + '@npmcli/name-from-folder': 2.0.0 glob: 10.5.0 minimatch: 9.0.5 read-package-json-fast: 3.0.2 - "@npmcli/metavuln-calculator@7.1.1": + '@npmcli/metavuln-calculator@7.1.1': dependencies: cacache: 18.0.4 json-parse-even-better-errors: 3.0.2 @@ -7618,13 +4900,13 @@ snapshots: - bluebird - supports-color - "@npmcli/name-from-folder@2.0.0": {} + '@npmcli/name-from-folder@2.0.0': {} - "@npmcli/node-gyp@3.0.0": {} + '@npmcli/node-gyp@3.0.0': {} - "@npmcli/package-json@5.2.0": + '@npmcli/package-json@5.2.0': dependencies: - "@npmcli/git": 5.0.8 + '@npmcli/git': 5.0.8 glob: 10.5.0 hosted-git-info: 7.0.2 json-parse-even-better-errors: 3.0.2 @@ -7634,21 +4916,21 @@ snapshots: transitivePeerDependencies: - bluebird - "@npmcli/promise-spawn@7.0.2": + '@npmcli/promise-spawn@7.0.2': dependencies: which: 4.0.0 - "@npmcli/query@3.1.0": + '@npmcli/query@3.1.0': dependencies: postcss-selector-parser: 6.1.2 - "@npmcli/redact@2.0.1": {} + '@npmcli/redact@2.0.1': {} - "@npmcli/run-script@8.1.0": + '@npmcli/run-script@8.1.0': dependencies: - "@npmcli/node-gyp": 3.0.0 - "@npmcli/package-json": 5.2.0 - "@npmcli/promise-spawn": 7.0.2 + '@npmcli/node-gyp': 3.0.0 + '@npmcli/package-json': 5.2.0 + '@npmcli/promise-spawn': 7.0.2 node-gyp: 10.3.1 proc-log: 4.2.0 which: 4.0.0 @@ -7656,7 +4938,7 @@ snapshots: - bluebird - supports-color - "@nx/devkit@20.8.3(nx@20.8.3)": + '@nx/devkit@20.8.3(nx@20.8.3)': dependencies: ejs: 3.1.10 enquirer: 2.3.6 @@ -7668,290 +4950,280 @@ snapshots: tslib: 2.8.1 yargs-parser: 21.1.1 - "@nx/nx-darwin-arm64@20.8.3": + '@nx/nx-darwin-arm64@20.8.3': optional: true - "@nx/nx-darwin-x64@20.8.3": + '@nx/nx-darwin-x64@20.8.3': optional: true - "@nx/nx-freebsd-x64@20.8.3": + '@nx/nx-freebsd-x64@20.8.3': optional: true - "@nx/nx-linux-arm-gnueabihf@20.8.3": + '@nx/nx-linux-arm-gnueabihf@20.8.3': optional: true - "@nx/nx-linux-arm64-gnu@20.8.3": + '@nx/nx-linux-arm64-gnu@20.8.3': optional: true - "@nx/nx-linux-arm64-musl@20.8.3": + '@nx/nx-linux-arm64-musl@20.8.3': optional: true - "@nx/nx-linux-x64-gnu@20.8.3": + '@nx/nx-linux-x64-gnu@20.8.3': optional: true - "@nx/nx-linux-x64-musl@20.8.3": + '@nx/nx-linux-x64-musl@20.8.3': optional: true - "@nx/nx-win32-arm64-msvc@20.8.3": + '@nx/nx-win32-arm64-msvc@20.8.3': optional: true - "@nx/nx-win32-x64-msvc@20.8.3": + '@nx/nx-win32-x64-msvc@20.8.3': optional: true - "@octokit/auth-token@4.0.0": {} + '@octokit/auth-token@4.0.0': {} - "@octokit/core@5.2.2": + '@octokit/core@5.2.2': dependencies: - "@octokit/auth-token": 4.0.0 - "@octokit/graphql": 7.1.1 - "@octokit/request": 8.4.1 - "@octokit/request-error": 5.1.1 - "@octokit/types": 13.10.0 + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.1.1 + '@octokit/request': 8.4.1 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 - "@octokit/endpoint@9.0.6": + '@octokit/endpoint@9.0.6': dependencies: - "@octokit/types": 13.10.0 + '@octokit/types': 13.10.0 universal-user-agent: 6.0.1 - "@octokit/graphql@7.1.1": + '@octokit/graphql@7.1.1': dependencies: - "@octokit/request": 8.4.1 - "@octokit/types": 13.10.0 + '@octokit/request': 8.4.1 + '@octokit/types': 13.10.0 universal-user-agent: 6.0.1 - "@octokit/openapi-types@24.2.0": {} + '@octokit/openapi-types@24.2.0': {} - "@octokit/plugin-enterprise-rest@6.0.1": {} + '@octokit/plugin-enterprise-rest@6.0.1': {} - "@octokit/plugin-paginate-rest@11.4.4-cjs.2(@octokit/core@5.2.2)": + '@octokit/plugin-paginate-rest@11.4.4-cjs.2(@octokit/core@5.2.2)': dependencies: - "@octokit/core": 5.2.2 - "@octokit/types": 13.10.0 + '@octokit/core': 5.2.2 + '@octokit/types': 13.10.0 - "@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.2)": + '@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.2)': dependencies: - "@octokit/core": 5.2.2 + '@octokit/core': 5.2.2 - "@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1(@octokit/core@5.2.2)": + '@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1(@octokit/core@5.2.2)': dependencies: - "@octokit/core": 5.2.2 - "@octokit/types": 13.10.0 + '@octokit/core': 5.2.2 + '@octokit/types': 13.10.0 - "@octokit/request-error@5.1.1": + '@octokit/request-error@5.1.1': dependencies: - "@octokit/types": 13.10.0 + '@octokit/types': 13.10.0 deprecation: 2.3.1 once: 1.4.0 - "@octokit/request@8.4.1": + '@octokit/request@8.4.1': dependencies: - "@octokit/endpoint": 9.0.6 - "@octokit/request-error": 5.1.1 - "@octokit/types": 13.10.0 + '@octokit/endpoint': 9.0.6 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 universal-user-agent: 6.0.1 - "@octokit/rest@20.1.2": + '@octokit/rest@20.1.2': dependencies: - "@octokit/core": 5.2.2 - "@octokit/plugin-paginate-rest": 11.4.4-cjs.2(@octokit/core@5.2.2) - "@octokit/plugin-request-log": 4.0.1(@octokit/core@5.2.2) - "@octokit/plugin-rest-endpoint-methods": 13.3.2-cjs.1(@octokit/core@5.2.2) + '@octokit/core': 5.2.2 + '@octokit/plugin-paginate-rest': 11.4.4-cjs.2(@octokit/core@5.2.2) + '@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.2) + '@octokit/plugin-rest-endpoint-methods': 13.3.2-cjs.1(@octokit/core@5.2.2) - "@octokit/types@13.10.0": + '@octokit/types@13.10.0': dependencies: - "@octokit/openapi-types": 24.2.0 - - "@pgsql/enums@18.0.0": {} - - "@pgsql/parser@1.2.1": {} + '@octokit/openapi-types': 24.2.0 - "@pgsql/types@13.11.1": {} + '@pgsql/enums@18.0.0': {} - "@pgsql/types@14.1.1": {} + '@pgsql/parser@1.2.1': {} - "@pgsql/types@15.1.1": {} + '@pgsql/types@17.6.2': {} - "@pgsql/types@16.1.1": {} + '@pgsql/types@18.0.0': {} - "@pgsql/types@17.6.1": {} - - "@pgsql/types@17.6.2": {} - - "@pgsql/types@18.0.0": {} - - "@pkgjs/parseargs@0.11.0": + '@pkgjs/parseargs@0.11.0': optional: true - "@pkgr/core@0.2.9": {} + '@pkgr/core@0.2.9': {} - "@protobufjs/aspromise@1.1.2": {} + '@protobufjs/aspromise@1.1.2': {} - "@protobufjs/base64@1.1.2": {} + '@protobufjs/base64@1.1.2': {} - "@protobufjs/codegen@2.0.4": {} + '@protobufjs/codegen@2.0.4': {} - "@protobufjs/eventemitter@1.1.0": {} + '@protobufjs/eventemitter@1.1.0': {} - "@protobufjs/fetch@1.1.0": + '@protobufjs/fetch@1.1.0': dependencies: - "@protobufjs/aspromise": 1.1.2 - "@protobufjs/inquire": 1.1.0 + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 - "@protobufjs/float@1.0.2": {} + '@protobufjs/float@1.0.2': {} - "@protobufjs/inquire@1.1.0": {} + '@protobufjs/inquire@1.1.0': {} - "@protobufjs/path@1.1.2": {} + '@protobufjs/path@1.1.2': {} - "@protobufjs/pool@1.1.0": {} + '@protobufjs/pool@1.1.0': {} - "@protobufjs/utf8@1.1.0": {} + '@protobufjs/utf8@1.1.0': {} - "@sigstore/bundle@2.3.2": + '@sigstore/bundle@2.3.2': dependencies: - "@sigstore/protobuf-specs": 0.3.3 + '@sigstore/protobuf-specs': 0.3.3 - "@sigstore/core@1.1.0": {} + '@sigstore/core@1.1.0': {} - "@sigstore/protobuf-specs@0.3.3": {} + '@sigstore/protobuf-specs@0.3.3': {} - "@sigstore/sign@2.3.2": + '@sigstore/sign@2.3.2': dependencies: - "@sigstore/bundle": 2.3.2 - "@sigstore/core": 1.1.0 - "@sigstore/protobuf-specs": 0.3.3 + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.3 make-fetch-happen: 13.0.1 proc-log: 4.2.0 promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - "@sigstore/tuf@2.3.4": + '@sigstore/tuf@2.3.4': dependencies: - "@sigstore/protobuf-specs": 0.3.3 + '@sigstore/protobuf-specs': 0.3.3 tuf-js: 2.2.1 transitivePeerDependencies: - supports-color - "@sigstore/verify@1.2.1": + '@sigstore/verify@1.2.1': dependencies: - "@sigstore/bundle": 2.3.2 - "@sigstore/core": 1.1.0 - "@sigstore/protobuf-specs": 0.3.3 + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.3 - "@sinclair/typebox@0.27.8": {} + '@sinclair/typebox@0.27.8': {} - "@sinclair/typebox@0.34.41": {} + '@sinclair/typebox@0.34.41': {} - "@sinonjs/commons@3.0.1": + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - "@sinonjs/fake-timers@13.0.5": + '@sinonjs/fake-timers@13.0.5': dependencies: - "@sinonjs/commons": 3.0.1 + '@sinonjs/commons': 3.0.1 - "@tsconfig/node10@1.0.12": {} + '@tsconfig/node10@1.0.12': {} - "@tsconfig/node12@1.0.11": {} + '@tsconfig/node12@1.0.11': {} - "@tsconfig/node14@1.0.3": {} + '@tsconfig/node14@1.0.3': {} - "@tsconfig/node16@1.0.4": {} + '@tsconfig/node16@1.0.4': {} - "@tufjs/canonical-json@2.0.0": {} + '@tufjs/canonical-json@2.0.0': {} - "@tufjs/models@2.0.1": + '@tufjs/models@2.0.1': dependencies: - "@tufjs/canonical-json": 2.0.0 + '@tufjs/canonical-json': 2.0.0 minimatch: 9.0.5 - "@tybys/wasm-util@0.10.1": + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true - "@tybys/wasm-util@0.9.0": + '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 - "@types/babel__core@7.20.5": + '@types/babel__core@7.20.5': dependencies: - "@babel/parser": 7.28.5 - "@babel/types": 7.28.5 - "@types/babel__generator": 7.27.0 - "@types/babel__template": 7.4.4 - "@types/babel__traverse": 7.28.0 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 - "@types/babel__generator@7.27.0": + '@types/babel__generator@7.27.0': dependencies: - "@babel/types": 7.28.5 + '@babel/types': 7.28.5 - "@types/babel__template@7.4.4": + '@types/babel__template@7.4.4': dependencies: - "@babel/parser": 7.28.5 - "@babel/types": 7.28.5 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - "@types/babel__traverse@7.28.0": + '@types/babel__traverse@7.28.0': dependencies: - "@babel/types": 7.28.5 + '@babel/types': 7.28.5 - "@types/estree@1.0.8": {} + '@types/estree@1.0.8': {} - "@types/istanbul-lib-coverage@2.0.6": {} + '@types/istanbul-lib-coverage@2.0.6': {} - "@types/istanbul-lib-report@3.0.3": + '@types/istanbul-lib-report@3.0.3': dependencies: - "@types/istanbul-lib-coverage": 2.0.6 + '@types/istanbul-lib-coverage': 2.0.6 - "@types/istanbul-reports@3.0.4": + '@types/istanbul-reports@3.0.4': dependencies: - "@types/istanbul-lib-report": 3.0.3 + '@types/istanbul-lib-report': 3.0.3 - "@types/jest@30.0.0": + '@types/jest@30.0.0': dependencies: expect: 30.2.0 pretty-format: 30.2.0 - "@types/json-schema@7.0.15": {} + '@types/json-schema@7.0.15': {} - "@types/linkify-it@5.0.0": {} + '@types/linkify-it@5.0.0': {} - "@types/markdown-it@14.1.2": + '@types/markdown-it@14.1.2': dependencies: - "@types/linkify-it": 5.0.0 - "@types/mdurl": 2.0.0 + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 - "@types/mdurl@2.0.0": {} + '@types/mdurl@2.0.0': {} - "@types/minimatch@3.0.5": {} + '@types/minimatch@3.0.5': {} - "@types/minimist@1.2.5": {} + '@types/minimist@1.2.5': {} - "@types/node@20.19.25": + '@types/node@20.19.25': dependencies: undici-types: 6.21.0 - "@types/normalize-package-data@2.4.4": {} + '@types/normalize-package-data@2.4.4': {} - "@types/stack-utils@2.0.3": {} + '@types/stack-utils@2.0.3': {} - "@types/yargs-parser@21.0.3": {} + '@types/yargs-parser@21.0.3': {} - "@types/yargs@17.0.35": + '@types/yargs@17.0.35': dependencies: - "@types/yargs-parser": 21.0.3 + '@types/yargs-parser': 21.0.3 - "@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)": + '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': dependencies: - "@eslint-community/regexpp": 4.12.2 - "@typescript-eslint/parser": 8.47.0(eslint@9.39.1)(typescript@5.9.3) - "@typescript-eslint/scope-manager": 8.47.0 - "@typescript-eslint/type-utils": 8.47.0(eslint@9.39.1)(typescript@5.9.3) - "@typescript-eslint/utils": 8.47.0(eslint@9.39.1)(typescript@5.9.3) - "@typescript-eslint/visitor-keys": 8.47.0 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.47.0 + '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.47.0 eslint: 9.39.1 graphemer: 1.4.0 ignore: 7.0.5 @@ -7961,41 +5233,87 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3)": + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': dependencies: - "@typescript-eslint/scope-manager": 8.47.0 - "@typescript-eslint/types": 8.47.0 - "@typescript-eslint/typescript-estree": 8.47.0(typescript@5.9.3) - "@typescript-eslint/visitor-keys": 8.47.0 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.65.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/type-utils': 8.65.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.65.0 + eslint: 9.39.1 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.47.0 + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.47.0 + debug: 4.4.3(supports-color@5.5.0) + eslint: 9.39.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.65.0(eslint@9.39.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3(supports-color@5.5.0) eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/project-service@8.47.0(typescript@5.9.3)": + '@typescript-eslint/project-service@8.47.0(typescript@5.9.3)': dependencies: - "@typescript-eslint/tsconfig-utils": 8.47.0(typescript@5.9.3) - "@typescript-eslint/types": 8.47.0 + '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) + '@typescript-eslint/types': 8.47.0 debug: 4.4.3(supports-color@5.5.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/scope-manager@8.47.0": + '@typescript-eslint/project-service@8.65.0(typescript@5.9.3)': dependencies: - "@typescript-eslint/types": 8.47.0 - "@typescript-eslint/visitor-keys": 8.47.0 + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 + debug: 4.4.3(supports-color@5.5.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - "@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)": + '@typescript-eslint/scope-manager@8.47.0': + dependencies: + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/visitor-keys': 8.47.0 + + '@typescript-eslint/scope-manager@8.65.0': + dependencies: + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + + '@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - "@typescript-eslint/type-utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)": + '@typescript-eslint/tsconfig-utils@8.65.0(typescript@5.9.3)': dependencies: - "@typescript-eslint/types": 8.47.0 - "@typescript-eslint/typescript-estree": 8.47.0(typescript@5.9.3) - "@typescript-eslint/utils": 8.47.0(eslint@9.39.1)(typescript@5.9.3) + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) debug: 4.4.3(supports-color@5.5.0) eslint: 9.39.1 ts-api-utils: 2.1.0(typescript@5.9.3) @@ -8003,14 +5321,28 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/types@8.47.0": {} + '@typescript-eslint/type-utils@8.65.0(eslint@9.39.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@9.39.1)(typescript@5.9.3) + debug: 4.4.3(supports-color@5.5.0) + eslint: 9.39.1 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.47.0': {} - "@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)": + '@typescript-eslint/types@8.65.0': {} + + '@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)': dependencies: - "@typescript-eslint/project-service": 8.47.0(typescript@5.9.3) - "@typescript-eslint/tsconfig-utils": 8.47.0(typescript@5.9.3) - "@typescript-eslint/types": 8.47.0 - "@typescript-eslint/visitor-keys": 8.47.0 + '@typescript-eslint/project-service': 8.47.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/visitor-keys': 8.47.0 debug: 4.4.3(supports-color@5.5.0) fast-glob: 3.3.3 is-glob: 4.0.3 @@ -8021,91 +5353,122 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)": + '@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.65.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + debug: 4.4.3(supports-color@5.5.0) + minimatch: 10.2.6 + semver: 7.7.3 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@typescript-eslint/scope-manager': 8.47.0 + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + eslint: 9.39.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.65.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - "@eslint-community/eslint-utils": 4.9.0(eslint@9.39.1) - "@typescript-eslint/scope-manager": 8.47.0 - "@typescript-eslint/types": 8.47.0 - "@typescript-eslint/typescript-estree": 8.47.0(typescript@5.9.3) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.1) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/visitor-keys@8.47.0": + '@typescript-eslint/visitor-keys@8.47.0': dependencies: - "@typescript-eslint/types": 8.47.0 + '@typescript-eslint/types': 8.47.0 eslint-visitor-keys: 4.2.1 - "@ungap/structured-clone@1.3.0": {} + '@typescript-eslint/visitor-keys@8.65.0': + dependencies: + '@typescript-eslint/types': 8.65.0 + eslint-visitor-keys: 5.0.1 + + '@ungap/structured-clone@1.3.0': {} - "@unrs/resolver-binding-android-arm-eabi@1.11.1": + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true - "@unrs/resolver-binding-android-arm64@1.11.1": + '@unrs/resolver-binding-android-arm64@1.11.1': optional: true - "@unrs/resolver-binding-darwin-arm64@1.11.1": + '@unrs/resolver-binding-darwin-arm64@1.11.1': optional: true - "@unrs/resolver-binding-darwin-x64@1.11.1": + '@unrs/resolver-binding-darwin-x64@1.11.1': optional: true - "@unrs/resolver-binding-freebsd-x64@1.11.1": + '@unrs/resolver-binding-freebsd-x64@1.11.1': optional: true - "@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1": + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': optional: true - "@unrs/resolver-binding-linux-arm-musleabihf@1.11.1": + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': optional: true - "@unrs/resolver-binding-linux-arm64-gnu@1.11.1": + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': optional: true - "@unrs/resolver-binding-linux-arm64-musl@1.11.1": + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': optional: true - "@unrs/resolver-binding-linux-ppc64-gnu@1.11.1": + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': optional: true - "@unrs/resolver-binding-linux-riscv64-gnu@1.11.1": + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': optional: true - "@unrs/resolver-binding-linux-riscv64-musl@1.11.1": + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': optional: true - "@unrs/resolver-binding-linux-s390x-gnu@1.11.1": + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': optional: true - "@unrs/resolver-binding-linux-x64-gnu@1.11.1": + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': optional: true - "@unrs/resolver-binding-linux-x64-musl@1.11.1": + '@unrs/resolver-binding-linux-x64-musl@1.11.1': optional: true - "@unrs/resolver-binding-wasm32-wasi@1.11.1": + '@unrs/resolver-binding-wasm32-wasi@1.11.1': dependencies: - "@napi-rs/wasm-runtime": 0.2.12 + '@napi-rs/wasm-runtime': 0.2.12 optional: true - "@unrs/resolver-binding-win32-arm64-msvc@1.11.1": + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': optional: true - "@unrs/resolver-binding-win32-ia32-msvc@1.11.1": + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': optional: true - "@unrs/resolver-binding-win32-x64-msvc@1.11.1": + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - "@yarnpkg/lockfile@1.1.0": {} + '@yarnpkg/lockfile@1.1.0': {} - "@yarnpkg/parsers@3.0.2": + '@yarnpkg/parsers@3.0.2': dependencies: js-yaml: 3.14.2 tslib: 2.8.1 - "@zkochan/js-yaml@0.0.7": + '@zkochan/js-yaml@0.0.7': dependencies: argparse: 2.0.1 @@ -8203,9 +5566,9 @@ snapshots: babel-jest@30.2.0(@babel/core@7.28.5): dependencies: - "@babel/core": 7.28.5 - "@jest/transform": 30.2.0 - "@types/babel__core": 7.20.5 + '@babel/core': 7.28.5 + '@jest/transform': 30.2.0 + '@types/babel__core': 7.20.5 babel-plugin-istanbul: 7.0.1 babel-preset-jest: 30.2.0(@babel/core@7.28.5) chalk: 4.1.2 @@ -8216,9 +5579,9 @@ snapshots: babel-plugin-istanbul@7.0.1: dependencies: - "@babel/helper-plugin-utils": 7.27.1 - "@istanbuljs/load-nyc-config": 1.1.0 - "@istanbuljs/schema": 0.1.3 + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 6.0.3 test-exclude: 6.0.0 transitivePeerDependencies: @@ -8226,35 +5589,37 @@ snapshots: babel-plugin-jest-hoist@30.2.0: dependencies: - "@types/babel__core": 7.20.5 + '@types/babel__core': 7.20.5 babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5): dependencies: - "@babel/core": 7.28.5 - "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.28.5) - "@babel/plugin-syntax-bigint": 7.8.3(@babel/core@7.28.5) - "@babel/plugin-syntax-class-properties": 7.12.13(@babel/core@7.28.5) - "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.28.5) - "@babel/plugin-syntax-import-attributes": 7.27.1(@babel/core@7.28.5) - "@babel/plugin-syntax-import-meta": 7.10.4(@babel/core@7.28.5) - "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.28.5) - "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.28.5) - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.28.5) - "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.28.5) - "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.28.5) - "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.28.5) - "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.28.5) - "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.28.5) - "@babel/plugin-syntax-top-level-await": 7.14.5(@babel/core@7.28.5) + '@babel/core': 7.28.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5) babel-preset-jest@30.2.0(@babel/core@7.28.5): dependencies: - "@babel/core": 7.28.5 + '@babel/core': 7.28.5 babel-plugin-jest-hoist: 30.2.0 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5) balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base64-js@1.5.1: {} baseline-browser-mapping@2.8.30: {} @@ -8287,6 +5652,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.9: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -8318,7 +5687,7 @@ snapshots: cacache@18.0.4: dependencies: - "@npmcli/fs": 3.1.1 + '@npmcli/fs': 3.1.1 fs-minipass: 3.0.3 glob: 10.5.0 lru-cache: 10.4.3 @@ -8690,7 +6059,13 @@ snapshots: dependencies: eslint: 9.39.1 optionalDependencies: - "@typescript-eslint/eslint-plugin": 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + + eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): + dependencies: + eslint: 9.39.1 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) eslint-scope@8.4.0: dependencies: @@ -8701,20 +6076,22 @@ snapshots: eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.1: {} + eslint@9.39.1: dependencies: - "@eslint-community/eslint-utils": 4.9.0(eslint@9.39.1) - "@eslint-community/regexpp": 4.12.2 - "@eslint/config-array": 0.21.1 - "@eslint/config-helpers": 0.4.2 - "@eslint/core": 0.17.0 - "@eslint/eslintrc": 3.3.1 - "@eslint/js": 9.39.1 - "@eslint/plugin-kit": 0.4.1 - "@humanfs/node": 0.16.7 - "@humanwhocodes/module-importer": 1.0.1 - "@humanwhocodes/retry": 0.4.3 - "@types/estree": 1.0.8 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.39.1 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -8798,8 +6175,8 @@ snapshots: expect@30.2.0: dependencies: - "@jest/expect-utils": 30.2.0 - "@jest/get-type": 30.1.0 + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 jest-matcher-utils: 30.2.0 jest-message-util: 30.2.0 jest-mock: 30.2.0 @@ -8811,8 +6188,8 @@ snapshots: fast-glob@3.3.3: dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 @@ -8833,6 +6210,10 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -8935,7 +6316,7 @@ snapshots: get-pkg-repo@4.2.1: dependencies: - "@hutson/parse-repository-url": 3.0.2 + '@hutson/parse-repository-url': 3.0.2 hosted-git-info: 4.1.0 through2: 2.0.5 yargs: 16.2.0 @@ -9038,6 +6419,8 @@ snapshots: globals@14.0.0: {} + globals@17.8.0: {} + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -9154,7 +6537,7 @@ snapshots: init-package-json@6.0.3: dependencies: - "@npmcli/package-json": 5.2.0 + '@npmcli/package-json': 5.2.0 npm-package-arg: 11.0.2 promzard: 1.0.2 read: 3.0.1 @@ -9166,7 +6549,7 @@ snapshots: inquirer@8.2.7(@types/node@20.19.25): dependencies: - "@inquirer/external-editor": 1.0.3(@types/node@20.19.25) + '@inquirer/external-editor': 1.0.3(@types/node@20.19.25) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -9182,7 +6565,7 @@ snapshots: through: 2.3.8 wrap-ansi: 6.2.0 transitivePeerDependencies: - - "@types/node" + - '@types/node' ip-address@10.1.0: {} @@ -9258,9 +6641,9 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - "@babel/core": 7.28.5 - "@babel/parser": 7.28.5 - "@istanbuljs/schema": 0.1.3 + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.3 transitivePeerDependencies: @@ -9274,7 +6657,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - "@jridgewell/trace-mapping": 0.3.31 + '@jridgewell/trace-mapping': 0.3.31 debug: 4.4.3(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: @@ -9287,13 +6670,13 @@ snapshots: jackspeak@3.4.3: dependencies: - "@isaacs/cliui": 8.0.2 + '@isaacs/cliui': 8.0.2 optionalDependencies: - "@pkgjs/parseargs": 0.11.0 + '@pkgjs/parseargs': 0.11.0 jackspeak@4.1.1: dependencies: - "@isaacs/cliui": 8.0.2 + '@isaacs/cliui': 8.0.2 jake@10.9.4: dependencies: @@ -9309,11 +6692,11 @@ snapshots: jest-circus@30.2.0: dependencies: - "@jest/environment": 30.2.0 - "@jest/expect": 30.2.0 - "@jest/test-result": 30.2.0 - "@jest/types": 30.2.0 - "@types/node": 20.19.25 + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 20.19.25 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.0 @@ -9335,9 +6718,9 @@ snapshots: jest-cli@30.2.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)): dependencies: - "@jest/core": 30.2.0(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) - "@jest/test-result": 30.2.0 - "@jest/types": 30.2.0 + '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 @@ -9346,7 +6729,7 @@ snapshots: jest-validate: 30.2.0 yargs: 17.7.2 transitivePeerDependencies: - - "@types/node" + - '@types/node' - babel-plugin-macros - esbuild-register - supports-color @@ -9354,11 +6737,11 @@ snapshots: jest-config@30.2.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)): dependencies: - "@babel/core": 7.28.5 - "@jest/get-type": 30.1.0 - "@jest/pattern": 30.0.1 - "@jest/test-sequencer": 30.2.0 - "@jest/types": 30.2.0 + '@babel/core': 7.28.5 + '@jest/get-type': 30.1.0 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.2.0 + '@jest/types': 30.2.0 babel-jest: 30.2.0(@babel/core@7.28.5) chalk: 4.1.2 ci-info: 4.3.1 @@ -9379,7 +6762,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - "@types/node": 20.19.25 + '@types/node': 20.19.25 ts-node: 10.9.2(@types/node@20.19.25)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros @@ -9394,8 +6777,8 @@ snapshots: jest-diff@30.2.0: dependencies: - "@jest/diff-sequences": 30.0.1 - "@jest/get-type": 30.1.0 + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.1.0 chalk: 4.1.2 pretty-format: 30.2.0 @@ -9405,18 +6788,18 @@ snapshots: jest-each@30.2.0: dependencies: - "@jest/get-type": 30.1.0 - "@jest/types": 30.2.0 + '@jest/get-type': 30.1.0 + '@jest/types': 30.2.0 chalk: 4.1.2 jest-util: 30.2.0 pretty-format: 30.2.0 jest-environment-node@30.2.0: dependencies: - "@jest/environment": 30.2.0 - "@jest/fake-timers": 30.2.0 - "@jest/types": 30.2.0 - "@types/node": 20.19.25 + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 20.19.25 jest-mock: 30.2.0 jest-util: 30.2.0 jest-validate: 30.2.0 @@ -9425,8 +6808,8 @@ snapshots: jest-haste-map@30.2.0: dependencies: - "@jest/types": 30.2.0 - "@types/node": 20.19.25 + '@jest/types': 30.2.0 + '@types/node': 20.19.25 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -9440,21 +6823,21 @@ snapshots: jest-leak-detector@30.2.0: dependencies: - "@jest/get-type": 30.1.0 + '@jest/get-type': 30.1.0 pretty-format: 30.2.0 jest-matcher-utils@30.2.0: dependencies: - "@jest/get-type": 30.1.0 + '@jest/get-type': 30.1.0 chalk: 4.1.2 jest-diff: 30.2.0 pretty-format: 30.2.0 jest-message-util@30.2.0: dependencies: - "@babel/code-frame": 7.27.1 - "@jest/types": 30.2.0 - "@types/stack-utils": 2.0.3 + '@babel/code-frame': 7.27.1 + '@jest/types': 30.2.0 + '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.8 @@ -9464,8 +6847,8 @@ snapshots: jest-mock@30.2.0: dependencies: - "@jest/types": 30.2.0 - "@types/node": 20.19.25 + '@jest/types': 30.2.0 + '@types/node': 20.19.25 jest-util: 30.2.0 jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): @@ -9494,12 +6877,12 @@ snapshots: jest-runner@30.2.0: dependencies: - "@jest/console": 30.2.0 - "@jest/environment": 30.2.0 - "@jest/test-result": 30.2.0 - "@jest/transform": 30.2.0 - "@jest/types": 30.2.0 - "@types/node": 20.19.25 + '@jest/console': 30.2.0 + '@jest/environment': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 20.19.25 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -9521,14 +6904,14 @@ snapshots: jest-runtime@30.2.0: dependencies: - "@jest/environment": 30.2.0 - "@jest/fake-timers": 30.2.0 - "@jest/globals": 30.2.0 - "@jest/source-map": 30.0.1 - "@jest/test-result": 30.2.0 - "@jest/transform": 30.2.0 - "@jest/types": 30.2.0 - "@types/node": 20.19.25 + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/globals': 30.2.0 + '@jest/source-map': 30.0.1 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 20.19.25 chalk: 4.1.2 cjs-module-lexer: 2.1.1 collect-v8-coverage: 1.0.3 @@ -9548,16 +6931,16 @@ snapshots: jest-snapshot@30.2.0: dependencies: - "@babel/core": 7.28.5 - "@babel/generator": 7.28.5 - "@babel/plugin-syntax-jsx": 7.27.1(@babel/core@7.28.5) - "@babel/plugin-syntax-typescript": 7.27.1(@babel/core@7.28.5) - "@babel/types": 7.28.5 - "@jest/expect-utils": 30.2.0 - "@jest/get-type": 30.1.0 - "@jest/snapshot-utils": 30.2.0 - "@jest/transform": 30.2.0 - "@jest/types": 30.2.0 + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + '@babel/types': 7.28.5 + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + '@jest/snapshot-utils': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5) chalk: 4.1.2 expect: 30.2.0 @@ -9574,8 +6957,8 @@ snapshots: jest-util@30.2.0: dependencies: - "@jest/types": 30.2.0 - "@types/node": 20.19.25 + '@jest/types': 30.2.0 + '@types/node': 20.19.25 chalk: 4.1.2 ci-info: 4.3.1 graceful-fs: 4.2.11 @@ -9583,8 +6966,8 @@ snapshots: jest-validate@30.2.0: dependencies: - "@jest/get-type": 30.1.0 - "@jest/types": 30.2.0 + '@jest/get-type': 30.1.0 + '@jest/types': 30.2.0 camelcase: 6.3.0 chalk: 4.1.2 leven: 3.1.0 @@ -9592,9 +6975,9 @@ snapshots: jest-watcher@30.2.0: dependencies: - "@jest/test-result": 30.2.0 - "@jest/types": 30.2.0 - "@types/node": 20.19.25 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 20.19.25 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -9603,20 +6986,20 @@ snapshots: jest-worker@30.2.0: dependencies: - "@types/node": 20.19.25 - "@ungap/structured-clone": 1.3.0 + '@types/node': 20.19.25 + '@ungap/structured-clone': 1.3.0 jest-util: 30.2.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest@30.2.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)): dependencies: - "@jest/core": 30.2.0(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) - "@jest/types": 30.2.0 + '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) + '@jest/types': 30.2.0 import-local: 3.2.0 jest-cli: 30.2.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) transitivePeerDependencies: - - "@types/node" + - '@types/node' - babel-plugin-macros - esbuild-register - supports-color @@ -9643,9 +7026,9 @@ snapshots: jsdoc@4.0.5: dependencies: - "@babel/parser": 7.28.5 - "@jsdoc/salty": 0.2.9 - "@types/markdown-it": 14.1.2 + '@babel/parser': 7.28.5 + '@jsdoc/salty': 0.2.9 + '@types/markdown-it': 14.1.2 bluebird: 3.7.2 catharsis: 0.9.0 escape-string-regexp: 2.0.0 @@ -9705,13 +7088,13 @@ snapshots: lerna@8.2.4(@types/node@20.19.25)(encoding@0.1.13): dependencies: - "@lerna/create": 8.2.4(@types/node@20.19.25)(encoding@0.1.13)(typescript@5.9.3) - "@npmcli/arborist": 7.5.4 - "@npmcli/package-json": 5.2.0 - "@npmcli/run-script": 8.1.0 - "@nx/devkit": 20.8.3(nx@20.8.3) - "@octokit/plugin-enterprise-rest": 6.0.1 - "@octokit/rest": 20.1.2 + '@lerna/create': 8.2.4(@types/node@20.19.25)(encoding@0.1.13)(typescript@5.9.3) + '@npmcli/arborist': 7.5.4 + '@npmcli/package-json': 5.2.0 + '@npmcli/run-script': 8.1.0 + '@nx/devkit': 20.8.3(nx@20.8.3) + '@octokit/plugin-enterprise-rest': 6.0.1 + '@octokit/rest': 20.1.2 aproba: 2.0.0 byte-size: 8.1.1 chalk: 4.1.0 @@ -9785,9 +7168,9 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 transitivePeerDependencies: - - "@swc-node/register" - - "@swc/core" - - "@types/node" + - '@swc-node/register' + - '@swc/core' + - '@types/node' - babel-plugin-macros - bluebird - debug @@ -9826,29 +7209,9 @@ snapshots: transitivePeerDependencies: - supports-color - libpg-query@13.6.0: - dependencies: - "@pgsql/types": 13.11.1 - - libpg-query@14.3.0: - dependencies: - "@pgsql/types": 14.1.1 - - libpg-query@15.5.0: - dependencies: - "@pgsql/types": 15.1.1 - - libpg-query@16.6.0: - dependencies: - "@pgsql/types": 16.1.1 - - libpg-query@17.6.0: - dependencies: - "@pgsql/types": 17.6.2 - libpg-query@18.1.2: dependencies: - "@pgsql/types": 18.0.0 + '@pgsql/types': 18.0.0 lines-and-columns@1.2.4: {} @@ -9929,7 +7292,7 @@ snapshots: make-fetch-happen@13.0.1: dependencies: - "@npmcli/agent": 2.2.2 + '@npmcli/agent': 2.2.2 cacache: 18.0.4 http-cache-semantics: 4.2.0 is-lambda: 1.0.1 @@ -9954,7 +7317,7 @@ snapshots: markdown-it-anchor@8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0): dependencies: - "@types/markdown-it": 14.1.2 + '@types/markdown-it': 14.1.2 markdown-it: 14.1.0 markdown-it@14.1.0: @@ -9974,7 +7337,7 @@ snapshots: meow@8.1.2: dependencies: - "@types/minimist": 1.2.5 + '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 decamelize-keys: 1.1.1 hard-rejection: 2.1.0 @@ -10007,7 +7370,11 @@ snapshots: minimatch@10.1.1: dependencies: - "@isaacs/brace-expansion": 5.0.0 + '@isaacs/brace-expansion': 5.0.0 + + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.9 minimatch@3.0.5: dependencies: @@ -10090,7 +7457,7 @@ snapshots: multimatch@5.0.0: dependencies: - "@types/minimatch": 3.0.5 + '@types/minimatch': 3.0.5 array-differ: 3.0.0 array-union: 2.1.0 arrify: 2.0.1 @@ -10211,7 +7578,7 @@ snapshots: npm-registry-fetch@17.1.0: dependencies: - "@npmcli/redact": 2.0.1 + '@npmcli/redact': 2.0.1 jsonparse: 1.3.1 make-fetch-happen: 13.0.1 minipass: 7.1.2 @@ -10228,10 +7595,10 @@ snapshots: nx@20.8.3: dependencies: - "@napi-rs/wasm-runtime": 0.2.4 - "@yarnpkg/lockfile": 1.1.0 - "@yarnpkg/parsers": 3.0.2 - "@zkochan/js-yaml": 0.0.7 + '@napi-rs/wasm-runtime': 0.2.4 + '@yarnpkg/lockfile': 1.1.0 + '@yarnpkg/parsers': 3.0.2 + '@zkochan/js-yaml': 0.0.7 axios: 1.13.2 chalk: 4.1.0 cli-cursor: 3.1.0 @@ -10263,16 +7630,16 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - "@nx/nx-darwin-arm64": 20.8.3 - "@nx/nx-darwin-x64": 20.8.3 - "@nx/nx-freebsd-x64": 20.8.3 - "@nx/nx-linux-arm-gnueabihf": 20.8.3 - "@nx/nx-linux-arm64-gnu": 20.8.3 - "@nx/nx-linux-arm64-musl": 20.8.3 - "@nx/nx-linux-x64-gnu": 20.8.3 - "@nx/nx-linux-x64-musl": 20.8.3 - "@nx/nx-win32-arm64-msvc": 20.8.3 - "@nx/nx-win32-x64-msvc": 20.8.3 + '@nx/nx-darwin-arm64': 20.8.3 + '@nx/nx-darwin-x64': 20.8.3 + '@nx/nx-freebsd-x64': 20.8.3 + '@nx/nx-linux-arm-gnueabihf': 20.8.3 + '@nx/nx-linux-arm64-gnu': 20.8.3 + '@nx/nx-linux-arm64-musl': 20.8.3 + '@nx/nx-linux-x64-gnu': 20.8.3 + '@nx/nx-linux-x64-musl': 20.8.3 + '@nx/nx-win32-arm64-msvc': 20.8.3 + '@nx/nx-win32-x64-msvc': 20.8.3 transitivePeerDependencies: - debug @@ -10388,11 +7755,11 @@ snapshots: pacote@18.0.6: dependencies: - "@npmcli/git": 5.0.8 - "@npmcli/installed-package-contents": 2.1.0 - "@npmcli/package-json": 5.2.0 - "@npmcli/promise-spawn": 7.0.2 - "@npmcli/run-script": 8.1.0 + '@npmcli/git': 5.0.8 + '@npmcli/installed-package-contents': 2.1.0 + '@npmcli/package-json': 5.2.0 + '@npmcli/promise-spawn': 7.0.2 + '@npmcli/run-script': 8.1.0 cacache: 18.0.4 fs-minipass: 3.0.3 minipass: 7.1.2 @@ -10426,7 +7793,7 @@ snapshots: parse-json@5.2.0: dependencies: - "@babel/code-frame": 7.27.1 + '@babel/code-frame': 7.27.1 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -10463,32 +7830,14 @@ snapshots: dependencies: pify: 3.0.0 - pgsql-deparser@13.19.1: - dependencies: - "@pgsql/types": 13.11.1 - - pgsql-deparser@14.1.1: - dependencies: - "@pgsql/types": 14.1.1 - - pgsql-deparser@15.1.1: - dependencies: - "@pgsql/types": 15.1.1 - - pgsql-deparser@16.1.1: - dependencies: - "@pgsql/types": 16.1.1 - - pgsql-deparser@17.12.2: - dependencies: - "@pgsql/types": 17.6.2 - picocolors@1.1.1: {} picomatch@2.3.1: {} picomatch@4.0.3: {} + picomatch@4.0.5: {} + pify@2.3.0: {} pify@3.0.0: {} @@ -10516,13 +7865,13 @@ snapshots: pretty-format@29.7.0: dependencies: - "@jest/schemas": 29.6.3 + '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.3.1 pretty-format@30.2.0: dependencies: - "@jest/schemas": 30.0.5 + '@jest/schemas': 30.0.5 ansi-styles: 5.2.0 react-is: 18.3.1 @@ -10591,7 +7940,7 @@ snapshots: read-pkg@5.2.0: dependencies: - "@types/normalize-package-data": 2.4.4 + '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 @@ -10720,12 +8069,12 @@ snapshots: sigstore@2.3.1: dependencies: - "@sigstore/bundle": 2.3.2 - "@sigstore/core": 1.1.0 - "@sigstore/protobuf-specs": 0.3.3 - "@sigstore/sign": 2.3.2 - "@sigstore/tuf": 2.3.4 - "@sigstore/verify": 1.2.1 + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.3 + '@sigstore/sign': 2.3.2 + '@sigstore/tuf': 2.3.4 + '@sigstore/verify': 1.2.1 transitivePeerDependencies: - supports-color @@ -10860,7 +8209,7 @@ snapshots: synckit@0.11.11: dependencies: - "@pkgr/core": 0.2.9 + '@pkgr/core': 0.2.9 tar-stream@2.2.0: dependencies: @@ -10883,7 +8232,7 @@ snapshots: test-exclude@6.0.0: dependencies: - "@istanbuljs/schema": 0.1.3 + '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 @@ -10903,6 +8252,11 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + tmp@0.2.5: {} tmpl@1.0.5: {} @@ -10923,6 +8277,10 @@ snapshots: dependencies: typescript: 5.9.3 + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-jest@29.4.6(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(jest-util@30.2.0)(jest@30.2.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 @@ -10937,20 +8295,20 @@ snapshots: typescript: 5.9.3 yargs-parser: 21.1.1 optionalDependencies: - "@babel/core": 7.28.5 - "@jest/transform": 30.2.0 - "@jest/types": 30.2.0 + '@babel/core': 7.28.5 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 babel-jest: 30.2.0(@babel/core@7.28.5) jest-util: 30.2.0 ts-node@10.9.2(@types/node@20.19.25)(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": 20.19.25 + '@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': 20.19.25 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -10971,7 +8329,7 @@ snapshots: tuf-js@2.2.1: dependencies: - "@tufjs/models": 2.0.1 + '@tufjs/models': 2.0.1 debug: 4.4.3(supports-color@5.5.0) make-fetch-happen: 13.0.1 transitivePeerDependencies: @@ -11029,25 +8387,25 @@ snapshots: dependencies: napi-postinstall: 0.3.4 optionalDependencies: - "@unrs/resolver-binding-android-arm-eabi": 1.11.1 - "@unrs/resolver-binding-android-arm64": 1.11.1 - "@unrs/resolver-binding-darwin-arm64": 1.11.1 - "@unrs/resolver-binding-darwin-x64": 1.11.1 - "@unrs/resolver-binding-freebsd-x64": 1.11.1 - "@unrs/resolver-binding-linux-arm-gnueabihf": 1.11.1 - "@unrs/resolver-binding-linux-arm-musleabihf": 1.11.1 - "@unrs/resolver-binding-linux-arm64-gnu": 1.11.1 - "@unrs/resolver-binding-linux-arm64-musl": 1.11.1 - "@unrs/resolver-binding-linux-ppc64-gnu": 1.11.1 - "@unrs/resolver-binding-linux-riscv64-gnu": 1.11.1 - "@unrs/resolver-binding-linux-riscv64-musl": 1.11.1 - "@unrs/resolver-binding-linux-s390x-gnu": 1.11.1 - "@unrs/resolver-binding-linux-x64-gnu": 1.11.1 - "@unrs/resolver-binding-linux-x64-musl": 1.11.1 - "@unrs/resolver-binding-wasm32-wasi": 1.11.1 - "@unrs/resolver-binding-win32-arm64-msvc": 1.11.1 - "@unrs/resolver-binding-win32-ia32-msvc": 1.11.1 - "@unrs/resolver-binding-win32-x64-msvc": 1.11.1 + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 untildify@4.0.0: {} @@ -11071,8 +8429,8 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - "@jridgewell/trace-mapping": 0.3.31 - "@types/istanbul-lib-coverage": 2.0.6 + '@jridgewell/trace-mapping': 0.3.31 + '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 validate-npm-package-license@3.0.4: