@syntopica/db-quality 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/audit/isSupabaseHost.ts","../src/config/ConfigError.ts","../src/audit/auditPlan.ts","../src/audit/resolveAuditTarget.ts","../src/adapters/soda/runSoda.ts","../src/adapters/soda/dataSourceType.ts","../src/config/isDisabled.ts","../src/model/fingerprintFinding.ts","../src/adapters/soda/parseSodaResults.ts","../src/adapters/soda/renderSodaConfiguration.ts","../src/tools/ToolMissingError.ts","../src/adapters/supabase/ADVISOR_SEVERITY.ts","../src/adapters/supabase/parseAdvisorReport.ts","../src/adapters/supabase/parseCliError.ts","../src/adapters/supabase/supabaseJson.ts","../src/audit/targetArgs.ts","../src/adapters/supabase/runAdvisors.ts","../src/adapters/supabase/parseBloat.ts","../src/adapters/supabase/parseIndexStats.ts","../src/adapters/supabase/runInspect.ts","../src/model/compareFindings.ts","../src/audit/runAudit.ts","../src/check/renderFindings.ts","../src/check/renderFindingsJson.ts","../src/commands/parseCommandArgs.ts","../src/model/ExitCode.ts","../src/commands/reportCommandError.ts","../src/config/CONFIG_FILENAME.ts","../src/config/legacyConfigNotice.ts","../src/config/readConfig.ts","../src/config/expectConfig.ts","../src/config/auditSectionFrom.ts","../src/config/CONFIG_KEYS.ts","../src/config/configSection.ts","../src/config/LEGACY_DISABLE_REASON.ts","../src/config/disableEntryFrom.ts","../src/config/disableEntriesFrom.ts","../src/config/isPositiveInteger.ts","../src/config/isStringList.ts","../src/config/PERF_DEFAULTS.ts","../src/config/ROLE_NAME_PATTERN.ts","../src/config/perfSectionFrom.ts","../src/config/drizzleSectionFrom.ts","../src/config/postgrestSectionFrom.ts","../src/config/stackSectionsFrom.ts","../src/config/configFromDocument.ts","../src/commands/auditCommand.ts","../src/commands/baselineCommand.ts","../src/baseline/BASELINE_FILENAME.ts","../src/baseline/BASELINE_USAGE.ts","../src/baseline/baselineActionFrom.ts","../src/baseline/classifyFindings.ts","../src/baseline/readBaseline.ts","../src/baseline/renderClassified.ts","../src/baseline/writeBaseline.ts","../src/adapters/drizzle/parseEslintReport.ts","../src/assetPath.ts","../src/adapters/drizzle/runDrizzleLint.ts","../src/adapters/prisma/parsePrismaLintReport.ts","../src/adapters/prisma/runPrismaLint.ts","../src/adapters/sqlite/sqliteFinding.ts","../src/adapters/sqlite/sqliteQuery.ts","../src/adapters/sqlite/sqliteRows.ts","../src/adapters/sqlite/foreignKeyFindings.ts","../src/adapters/sqlite/integrityFindings.ts","../src/adapters/sqlite/hasPrimaryKey.ts","../src/adapters/sqlite/primaryKeyFindings.ts","../src/adapters/sqlite/runSqliteChecks.ts","../src/model/normalizeSqlText.ts","../src/sql/statementAtLine.ts","../src/adapters/squawk/parseSquawkReport.ts","../src/adapters/squawk/SUPABASE_SQUAWK_EXCLUDES.ts","../src/adapters/squawk/runSquawk.ts","../src/postgrest/runPostgrestRules.ts","../src/postgrest/ITERATION_METHODS.ts","../src/postgrest/isIterationCallback.ts","../src/postgrest/isInsideLoop.ts","../src/postgrest/isStorageReceiver.ts","../src/postgrest/isStringLiteralArgument.ts","../src/postgrest/literalArgument.ts","../src/postgrest/chainFromCall.ts","../src/postgrest/isInnerCall.ts","../src/postgrest/collectPostgrestChains.ts","../src/postgrest/loadTypeScript.ts","../src/postgrest/chainSelectCall.ts","../src/postgrest/makePostgrestFinding.ts","../src/postgrest/exactCountUnbounded.ts","../src/postgrest/FILTER_METHODS.ts","../src/postgrest/filterWithoutIndex.ts","../src/postgrest/queryInLoop.ts","../src/postgrest/starSelect.ts","../src/postgrest/BOUNDING_METHODS.ts","../src/postgrest/isBounded.ts","../src/postgrest/unboundedList.ts","../src/postgrest/POSTGREST_RULES.ts","../src/postgrest/sourceFilesUnder.ts","../src/config/isDirectory.ts","../src/postgrest/SKIPPED_SOURCE_DIRS.ts","../src/sql/qualifiedName.ts","../src/rules/matchedTables.ts","../src/rules/createdTables.ts","../src/rules/ALTER_KEY_PATTERN.ts","../src/rules/leadingColumn.ts","../src/rules/recordAlterKey.ts","../src/rules/CREATE_INDEX_PATTERN.ts","../src/rules/recordCreateIndex.ts","../src/rules/CREATE_TABLE_PATTERN.ts","../src/rules/inlineKeyColumns.ts","../src/rules/recordCreateTable.ts","../src/rules/indexedColumns.ts","../src/rules/makeSqlFinding.ts","../src/rules/policyTable.ts","../src/rules/authUidNotWrapped.ts","../src/rules/definerWithoutSearchPath.ts","../src/rules/permissivePolicy.ts","../src/rules/policyTables.ts","../src/rules/rlsEnabledTables.ts","../src/rules/rlsEnabledNoPolicy.ts","../src/rules/tableWithoutRls.ts","../src/rules/SQL_RULES.ts","../src/rules/runSqlRules.ts","../src/sql/readMigrationSet.ts","../src/sql/quotedSpanEnd.ts","../src/sql/stripSqlComments.ts","../src/sql/splitSqlStatements.ts","../src/check/runCheck.ts","../src/packageVersion.ts","../src/commands/checkCommand.ts","../src/gate/gateExitCode.ts","../src/gate/gateStages.ts","../src/gate/perfStage.ts","../src/bench/BENCH_RECORD_FILENAME.ts","../src/bench/readBenchRecord.ts","../src/bench/benchFinding.ts","../src/bench/ESTIMATE_RATIO_LIMIT.ts","../src/perf/REGRESSION_FLOOR_MS.ts","../src/bench/benchFindings.ts","../src/bench/readBenchQueries.ts","../src/bench/RUNS_HEADER.ts","../src/bench/median.ts","../src/bench/ESTIMATE_MIN_ROWS.ts","../src/bench/walkPlan.ts","../src/bench/summarizeExplain.ts","../src/bench/runBenchQuery.ts","../src/bench/runBench.ts","../src/postgres/dollarTag.ts","../src/postgres/PLAN_SETTING.ts","../src/postgres/ROLLBACK_SQLSTATE.ts","../src/postgres/explainDoBlock.ts","../src/postgres/psqlArguments.ts","../src/postgres/redactConnectionSecrets.ts","../src/postgres/psqlSession.ts","../src/gate/perfBenchFindings.ts","../src/perf/statementSubject.ts","../src/perf/improvementsIn.ts","../src/perf/isRegression.ts","../src/perf/perfFinding.ts","../src/perf/statementContext.ts","../src/perf/statementRegressionFinding.ts","../src/perf/statementSlowFinding.ts","../src/perf/statementSpillFinding.ts","../src/perf/statementFindings.ts","../src/perf/tableFindings.ts","../src/perf/windowStatements.ts","../src/perf/windowTables.ts","../src/perf/diffSnapshots.ts","../src/perf/QUERY_TIMEOUT_MS.ts","../src/perf/readPerfSnapshot.ts","../src/perf/PERF_SNAPSHOT_FILENAME.ts","../src/perf/PLATFORM_NOISE.ts","../src/perf/isPlatformNoise.ts","../src/perf/statementStatsSql.ts","../src/perf/readStatementStats.ts","../src/perf/STATS_RESET_SQL.ts","../src/perf/readStatsReset.ts","../src/perf/TABLE_STATS_SQL.ts","../src/perf/readTableStats.ts","../src/perf/takePerfSnapshot.ts","../src/gate/perfDiffFindings.ts","../src/postgres/resolvePostgresTarget.ts","../src/postgres/DB_PASSWORD_ENV.ts","../src/postgres/POOLER_URL_FILE.ts","../src/postgres/parsedUrl.ts","../src/postgres/refuseTransactionPooler.ts","../src/postgres/takeUrlPassword.ts","../src/postgres/targetFromUrl.ts","../src/gate/renderGateReport.ts","../src/gate/runStage.ts","../src/gate/runGate.ts","../src/commands/gateCommand.ts","../src/init/adoptionPhase.ts","../src/init/baselineStep.ts","../src/init/adoptionStanding.ts","../src/init/applyInit.ts","../src/init/planBenchReadme.ts","../src/init/BENCH_README.ts","../src/init/planConfigFile.ts","../src/config/detectStacks.ts","../src/config/findSqliteFiles.ts","../src/config/hasSupabaseJsDependency.ts","../src/init/PERF_INIT_SECTION.ts","../src/init/upgradedConfigDocument.ts","../src/init/planPackageScript.ts","../src/init/PACKAGE_MANIFEST.ts","../src/init/planWorkflow.ts","../src/init/sha256Of.ts","../src/init/SHIPPED_WORKFLOW_HASHES.ts","../src/init/planInit.ts","../src/init/ADOPTION_LADDER.ts","../src/init/renderAdoptionPhase.ts","../src/init/renderInitPlan.ts","../src/commands/initCommand.ts","../src/bench/renderBench.ts","../src/bench/renderBenchJson.ts","../src/bench/writeBenchRecord.ts","../src/commands/perfBenchAction.ts","../src/perf/renderImprovements.ts","../src/perf/renderPerfDiff.ts","../src/perf/renderPerfDiffJson.ts","../src/commands/perfDiffAction.ts","../src/perf/writePerfSnapshot.ts","../src/commands/perfSnapshotAction.ts","../src/perf/PERF_USAGE.ts","../src/perf/perfActionFrom.ts","../src/postgres/requirePostgresTarget.ts","../src/commands/perfCommand.ts","../src/cli/COMMANDS.ts","../src/cli/USAGE.ts","../src/cli/runCli.ts","../src/tools/spawnRunner.ts","../src/tools/packageBinPath.ts"],"sourcesContent":["import { argv, cwd, exit, stderr, stdout } from 'node:process'\n\nimport { runCli } from '@/cli/runCli.js'\nimport { spawnRunner } from '@/tools/spawnRunner.js'\n\nexit(\n runCli(argv.slice(2), {\n root: cwd(),\n runner: spawnRunner,\n stdout: (text) => {\n stdout.write(text)\n },\n stderr: (text) => {\n stderr.write(text)\n },\n }),\n)\n","/** Whether a database URL points at a Supabase project, where advisors and inspect can answer. */\nexport const isSupabaseHost = (dbUrl: string): boolean => {\n try {\n const { hostname } = new URL(dbUrl)\n return (\n hostname.endsWith('.supabase.co') ||\n hostname.endsWith('.pooler.supabase.com')\n )\n } catch {\n return false\n }\n}\n","/** Invalid or missing configuration: exit code 2. */\nexport class ConfigError extends Error {}\n","import type { AuditTarget } from '@/audit/AuditTarget.js'\nimport { isSupabaseHost } from '@/audit/isSupabaseHost.js'\nimport { ConfigError } from '@/config/ConfigError.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\n\n/**\n * Which live adapters a target can run. Advisors and inspect need a Supabase\n * project; Soda needs a URL with a password, which a linked target lacks.\n * A target that can run neither is a configuration error, not a clean pass.\n */\nexport const auditPlan = (\n config: DbQualityConfig,\n target: AuditTarget,\n): { supabase: boolean; soda: boolean; skipped: string[] } => {\n const supabase = 'linked' in target || isSupabaseHost(target.dbUrl)\n const soda = config.audit.soda !== undefined && 'dbUrl' in target\n const skipped = [\n ...(supabase\n ? []\n : ['supabase: skipped, --db-url is not a Supabase project host']),\n ...(config.audit.soda !== undefined && !soda\n ? [\n 'soda: skipped, a linked target carries no database password; pass --db-url',\n ]\n : []),\n ]\n if (!supabase && !soda) {\n throw new ConfigError(\n 'nothing to audit: not a Supabase host and audit.soda is not configured',\n )\n }\n return { supabase, soda, skipped }\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { AuditTarget } from '@/audit/AuditTarget.js'\nimport type { AuditTargetFlags } from '@/audit/AuditTargetFlags.js'\nimport { ConfigError } from '@/config/ConfigError.js'\n\nexport const resolveAuditTarget = (\n root: string,\n values: AuditTargetFlags,\n): AuditTarget => {\n if (values['db-url']) return { dbUrl: values['db-url'] }\n if (values.linked) {\n if (!existsSync(join(root, 'supabase/.temp/project-ref'))) {\n throw new ConfigError(\n 'project is not linked; run \"supabase link\" or pass --db-url',\n )\n }\n return { linked: true }\n }\n throw new ConfigError('audit needs --linked or --db-url')\n}\n","import {\n existsSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\n\nimport { dataSourceType } from '@/adapters/soda/dataSourceType.js'\nimport { parseSodaResults } from '@/adapters/soda/parseSodaResults.js'\nimport { renderSodaConfiguration } from '@/adapters/soda/renderSodaConfiguration.js'\nimport type { SodaTarget } from '@/adapters/soda/SodaTarget.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\n// `--with setuptools` and SETUPTOOLS_USE_DISTUTILS are not optional: Soda 4.25\n// imports distutils, which Python 3.12 removed. Measured 2026-09-25.\nexport const runSoda = (\n runner: CommandRunner,\n root: string,\n soda: SodaTarget,\n disabled: DisableEntry[],\n): Finding[] => {\n const scratch = mkdtempSync(join(tmpdir(), 'codeality-db-soda-'))\n try {\n const configuration = join(scratch, 'configuration.yml')\n const results = join(scratch, 'results.json')\n writeFileSync(configuration, renderSodaConfiguration('codeality', soda.url))\n const result = runner(\n 'uvx',\n [\n '--with',\n 'setuptools',\n '--from',\n `soda-core-${dataSourceType(soda.url)}`,\n 'soda',\n 'scan',\n '-d',\n 'codeality',\n '-c',\n configuration,\n '-srf',\n results,\n `${soda.dir}/checks.yml`,\n ],\n { cwd: root, env: { SETUPTOOLS_USE_DISTUTILS: 'local' } },\n )\n if (result.missing) throw new ToolMissingError('uvx', 'install uv')\n if (!existsSync(results)) {\n const tail = result.stderr.trim().slice(-500)\n throw new Error(\n `soda scan produced no results (exit ${String(result.status)}): ${tail}`,\n )\n }\n return parseSodaResults(readFileSync(results, 'utf8'), soda.dir, disabled)\n } finally {\n rmSync(scratch, { recursive: true, force: true })\n }\n}\n","import { ConfigError } from '@/config/ConfigError.js'\n\nexport const dataSourceType = (url: string): 'postgres' | 'mysql' => {\n const scheme = url.split(':')[0] ?? ''\n if (scheme === 'postgres' || scheme === 'postgresql') return 'postgres'\n if (scheme === 'mysql') return 'mysql'\n throw new ConfigError(\n `Soda supports postgres and mysql URLs, not \"${scheme}\"`,\n )\n}\n","import type { DisableEntry } from '@/config/DisableEntry.js'\n\nexport const isDisabled = (code: string, disabled: DisableEntry[]): boolean =>\n disabled.some((entry) => entry.code === code)\n","import { createHash } from 'node:crypto'\n\nimport type { Finding } from '@/model/Finding.js'\n\n// The line is deliberately excluded: a migration inserted above must not\n// renew every finding below it. The context (the normalised statement, or the\n// tool's message) is what tells two findings on one path apart.\nexport const fingerprintFinding = (\n finding: Omit<Finding, 'fingerprint'>,\n context: string,\n): string =>\n createHash('sha256')\n .update(['1', finding.code, finding.path, context].join('|'))\n .digest('hex')\n .slice(0, 16)\n","import type { SodaCheckResult } from '@/adapters/soda/SodaCheckResult.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\nexport const parseSodaResults = (\n json: string,\n sodaDir: string,\n disabled: DisableEntry[],\n): Finding[] => {\n const { checks } = JSON.parse(json) as { checks: SodaCheckResult[] }\n return checks.flatMap((check) => {\n if (check.outcome !== 'fail' && check.outcome !== 'warn') return []\n const code = `BDB700/${check.name}`\n if (isDisabled(code, disabled)) return []\n const partial = {\n code,\n severity:\n check.outcome === 'fail' ? ('error' as const) : ('warn' as const),\n path: `${sodaDir}/checks.yml`,\n line: 0,\n message: `check ${check.outcome === 'fail' ? 'failed' : 'warned'}: ${check.name}`,\n subject: [check.table, check.column].filter(Boolean).join('.'),\n }\n return [\n { ...partial, fingerprint: fingerprintFinding(partial, check.name) },\n ]\n })\n}\n","import { dataSourceType } from '@/adapters/soda/dataSourceType.js'\n\nexport const renderSodaConfiguration = (name: string, url: string): string => {\n const type = dataSourceType(url)\n const parsed = new URL(url)\n const lines = [\n `data_source ${name}:`,\n ` type: ${type}`,\n ` host: ${parsed.hostname}`,\n ` port: ${parsed.port || (type === 'postgres' ? '5432' : '3306')}`,\n ` username: ${decodeURIComponent(parsed.username)}`,\n ` password: ${JSON.stringify(decodeURIComponent(parsed.password))}`,\n ` database: ${parsed.pathname.slice(1)}`,\n ...(type === 'postgres' ? [' schema: public'] : []),\n ]\n return `${lines.join('\\n')}\\n`\n}\n","/** A required executable is absent: exit code 3, never a skip. */\nexport class ToolMissingError extends Error {\n constructor(tool: string, hint: string) {\n super(`${tool} is not installed or not on PATH; ${hint}`)\n }\n}\n","import type { AdvisorEntry } from '@/adapters/supabase/AdvisorEntry.js'\nimport type { Severity } from '@/model/Severity.js'\n\n// Strict mode has no info severity: an advisor's INFO-level entry still\n// blocks the gate, so it is treated as a warn like everything else that is\n// not an outright error.\nexport const ADVISOR_SEVERITY: Record<AdvisorEntry['level'], Severity> = {\n ERROR: 'error',\n WARN: 'warn',\n INFO: 'warn',\n}\n","import { ADVISOR_SEVERITY } from '@/adapters/supabase/ADVISOR_SEVERITY.js'\nimport type { AdvisorEntry } from '@/adapters/supabase/AdvisorEntry.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\nexport const parseAdvisorReport = (\n stdout: string,\n disabled: DisableEntry[],\n): Finding[] => {\n const { results } = JSON.parse(stdout) as { results: AdvisorEntry[] }\n return results.flatMap((entry) => {\n const code = `BDB500/${entry.name}`\n if (isDisabled(code, disabled)) return []\n const subject =\n entry.metadata?.schema && entry.metadata.name\n ? `${entry.metadata.schema}.${entry.metadata.name}`\n : ''\n const partial = {\n code,\n severity: ADVISOR_SEVERITY[entry.level],\n path: 'supabase',\n line: 0,\n message: entry.detail.replaceAll('\\\\`', '`'),\n subject,\n }\n return [\n { ...partial, fingerprint: fingerprintFinding(partial, entry.detail) },\n ]\n })\n}\n","import type { CliError } from '@/adapters/supabase/CliError.js'\n\n// The CLI prints progress lines before the document and may print more after\n// it, so the JSON is searched for and parsed up to each closing brace in turn\n// rather than from the first byte to the last.\nexport const parseCliError = (text: string): CliError | undefined => {\n const start = text.indexOf('{\"_tag\":\"Error\"')\n if (start === -1) return undefined\n for (\n let end = text.indexOf('}', start);\n end !== -1;\n end = text.indexOf('}', end + 1)\n ) {\n try {\n const { error } = JSON.parse(text.slice(start, end + 1)) as {\n error: CliError\n }\n return { code: error.code, message: error.message }\n } catch {\n // Not the closing brace of the document yet; try the next one.\n }\n }\n return { code: 'unknown', message: text.slice(start, start + 200) }\n}\n","import { parseCliError } from '@/adapters/supabase/parseCliError.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\n/**\n * Runs one Supabase CLI command that answers with a JSON document and returns\n * that document's text. The CLI reports its own failures, an expired login or\n * a project of another account among them, as a `{\"_tag\":\"Error\"}` document.\n */\nexport const supabaseJson = (\n runner: CommandRunner,\n root: string,\n args: string[],\n label: string,\n): string => {\n const result = runner('supabase', args, { cwd: root })\n if (result.missing)\n throw new ToolMissingError('supabase', 'install the Supabase CLI')\n const failure = parseCliError(`${result.stdout}\\n${result.stderr}`)\n if (failure || result.status !== 0) {\n const code = failure?.code ?? String(result.status)\n throw new Error(\n `${label} failed: ${code}: ${failure?.message ?? result.stderr.trim()}`,\n )\n }\n return result.stdout.slice(result.stdout.indexOf('{'))\n}\n","import type { AuditTarget } from '@/audit/AuditTarget.js'\n\n/** The Supabase CLI flags that name the database to inspect. */\nexport const targetArgs = (target: AuditTarget): string[] =>\n 'dbUrl' in target ? ['--db-url', target.dbUrl] : ['--linked']\n","import { parseAdvisorReport } from '@/adapters/supabase/parseAdvisorReport.js'\nimport { supabaseJson } from '@/adapters/supabase/supabaseJson.js'\nimport type { AuditTarget } from '@/audit/AuditTarget.js'\nimport { targetArgs } from '@/audit/targetArgs.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\nexport const runAdvisors = (\n runner: CommandRunner,\n root: string,\n target: AuditTarget,\n disabled: DisableEntry[],\n): Finding[] =>\n parseAdvisorReport(\n supabaseJson(\n runner,\n root,\n [\n 'db',\n 'advisors',\n '--type',\n 'all',\n '--output-format',\n 'json',\n ...targetArgs(target),\n ],\n 'supabase advisors',\n ),\n disabled,\n )\n","import type { BloatRow } from '@/adapters/supabase/BloatRow.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\nexport const parseBloat = (\n stdout: string,\n threshold: number,\n disabled: DisableEntry[],\n): Finding[] => {\n if (isDisabled('BDB602', disabled)) return []\n const { rows } = JSON.parse(stdout) as { rows: BloatRow[] }\n return rows\n .filter((row) => Number(row.bloat) > threshold)\n .map((row) => {\n const partial = {\n code: 'BDB602',\n severity: 'warn' as const,\n path: 'supabase',\n line: 0,\n message: `bloat factor ${row.bloat}, ${row.waste} wasted`,\n subject: row.name,\n }\n return { ...partial, fingerprint: fingerprintFinding(partial, row.name) }\n })\n}\n","import type { IndexStatRow } from '@/adapters/supabase/IndexStatRow.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\n// A primary key index is never \"unused\" in a way anyone can act on.\nexport const parseIndexStats = (\n stdout: string,\n disabled: DisableEntry[],\n): Finding[] => {\n if (isDisabled('BDB601', disabled)) return []\n const { rows } = JSON.parse(stdout) as { rows: IndexStatRow[] }\n return rows\n .filter(\n (row) =>\n (row.unused || row.index_scans === '0') && !row.name.endsWith('_pkey'),\n )\n .map((row) => {\n const partial = {\n code: 'BDB601',\n severity: 'warn' as const,\n path: 'supabase',\n line: 0,\n message: `index has never been scanned (${row.size})`,\n subject: row.name,\n }\n return { ...partial, fingerprint: fingerprintFinding(partial, row.name) }\n })\n}\n","import { parseBloat } from '@/adapters/supabase/parseBloat.js'\nimport { parseIndexStats } from '@/adapters/supabase/parseIndexStats.js'\nimport { supabaseJson } from '@/adapters/supabase/supabaseJson.js'\nimport type { AuditTarget } from '@/audit/AuditTarget.js'\nimport { targetArgs } from '@/audit/targetArgs.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\nexport const runInspect = (\n runner: CommandRunner,\n root: string,\n target: AuditTarget,\n config: Pick<DbQualityConfig, 'audit' | 'disable'>,\n): Finding[] => {\n const query = (report: string): string =>\n supabaseJson(\n runner,\n root,\n [\n 'inspect',\n 'db',\n report,\n '--output-format',\n 'json',\n ...targetArgs(target),\n ],\n `supabase inspect ${report}`,\n )\n return [\n ...parseIndexStats(query('index-stats'), config.disable),\n ...parseBloat(query('bloat'), config.audit.bloatThreshold, config.disable),\n ]\n}\n","import type { Finding } from '@/model/Finding.js'\n\nexport const compareFindings = (a: Finding, b: Finding): number =>\n a.path.localeCompare(b.path) ||\n a.line - b.line ||\n a.code.localeCompare(b.code)\n","import { runSoda } from '@/adapters/soda/runSoda.js'\nimport { runAdvisors } from '@/adapters/supabase/runAdvisors.js'\nimport { runInspect } from '@/adapters/supabase/runInspect.js'\nimport type { AuditContext } from '@/audit/AuditContext.js'\nimport { auditPlan } from '@/audit/auditPlan.js'\nimport { compareFindings } from '@/model/compareFindings.js'\nimport type { Finding } from '@/model/Finding.js'\n\nexport const runAudit = ({\n root,\n config,\n runner,\n target,\n}: AuditContext): Finding[] => {\n const plan = auditPlan(config, target)\n const findings: Finding[] = []\n if (plan.soda && 'dbUrl' in target && config.audit.soda !== undefined) {\n const soda = { dir: config.audit.soda, url: target.dbUrl }\n findings.push(...runSoda(runner, root, soda, config.disable))\n }\n if (plan.supabase) {\n findings.push(\n ...runAdvisors(runner, root, target, config.disable),\n ...runInspect(runner, root, target, config),\n )\n }\n return findings.sort(compareFindings)\n}\n","import type { Finding } from '@/model/Finding.js'\n\nexport const renderFindings = (findings: Finding[]): string =>\n [\n ...findings.map(\n (f) =>\n `${f.path}:${String(f.line)}: ${f.code} ${f.message}${f.subject ? ` (${f.subject})` : ''}`,\n ),\n `${String(findings.length)} findings`,\n ].join('\\n')\n","import type { Finding } from '@/model/Finding.js'\n\nexport const renderFindingsJson = (findings: Finding[]): string =>\n JSON.stringify({ schemaVersion: 1, findings }, null, 2)\n","import { parseArgs } from 'node:util'\n\nimport type { ParsedArgs } from '@/commands/ParsedArgs.js'\nimport { ConfigError } from '@/config/ConfigError.js'\n\nexport const parseCommandArgs = (\n argv: string[],\n options: Record<string, { type: 'boolean' | 'string' }>,\n): ParsedArgs => {\n try {\n const parsed = parseArgs({\n args: argv,\n options,\n allowPositionals: true,\n strict: true,\n })\n return { values: parsed.values, positionals: parsed.positionals }\n } catch (error) {\n throw new ConfigError((error as Error).message)\n }\n}\n","/** The four exit codes the CLI ever returns. A skipped required tool is never OK. */\nexport const ExitCode = {\n OK: 0,\n FINDINGS: 1,\n CONFIGURATION: 2,\n INFRASTRUCTURE: 3,\n} as const\n","import { ConfigError } from '@/config/ConfigError.js'\nimport { ExitCode } from '@/model/ExitCode.js'\n\n/** Prints the failure and returns its exit code: 2 for configuration, 3 for everything else. */\nexport const reportCommandError = (\n error: unknown,\n stderr: (text: string) => void,\n): number => {\n const configuration = error instanceof ConfigError\n const message = error instanceof Error ? error.message : String(error)\n stderr(`${configuration ? 'configuration error' : 'error'}: ${message}\\n`)\n return configuration ? ExitCode.CONFIGURATION : ExitCode.INFRASTRUCTURE\n}\n","export const CONFIG_FILENAME = 'codeality-db.json'\n","import { CONFIG_FILENAME } from '@/config/CONFIG_FILENAME.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\n\n/** One line for stderr when the file predates the strict mode; nothing under schemaVersion 2. */\nexport const legacyConfigNotice = (\n config: DbQualityConfig,\n): string | undefined =>\n config.schemaVersion === 1\n ? `${CONFIG_FILENAME} is schemaVersion 1; \"codeality-db init --apply\" upgrades it to 2 and asks a reason for every disabled rule`\n : undefined\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { CONFIG_FILENAME } from '@/config/CONFIG_FILENAME.js'\nimport { ConfigError } from '@/config/ConfigError.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport { configFromDocument } from '@/config/configFromDocument.js'\n\nexport const readConfig = (root: string): DbQualityConfig => {\n const path = join(root, CONFIG_FILENAME)\n if (!existsSync(path)) {\n throw new ConfigError(\n `${CONFIG_FILENAME} not found in ${root}; run \"codeality-db init\"`,\n )\n }\n let document: unknown\n try {\n document = JSON.parse(readFileSync(path, 'utf8'))\n } catch (error) {\n throw new ConfigError(\n `${CONFIG_FILENAME} is not valid JSON: ${(error as Error).message}`,\n )\n }\n return configFromDocument(document)\n}\n","import { ConfigError } from '@/config/ConfigError.js'\n\nexport const expectConfig = (condition: boolean, message: string): void => {\n if (!condition) throw new ConfigError(message)\n}\n","import type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport { expectConfig } from '@/config/expectConfig.js'\n\nexport const auditSectionFrom = (\n audit: Record<string, unknown> | undefined,\n): DbQualityConfig['audit'] => {\n const inGate = audit?.['inGate'] ?? true\n const bloatThreshold = audit?.['bloatThreshold'] ?? 5\n const soda = audit?.['soda']\n expectConfig(typeof inGate === 'boolean', 'audit.inGate must be a boolean')\n expectConfig(\n typeof bloatThreshold === 'number',\n 'audit.bloatThreshold must be a number',\n )\n expectConfig(\n soda === undefined || typeof soda === 'string',\n 'audit.soda must be a string',\n )\n return {\n inGate: inGate as boolean,\n bloatThreshold: bloatThreshold as number,\n ...(soda === undefined ? {} : { soda: soda as string }),\n }\n}\n","export const CONFIG_KEYS = new Set([\n 'schemaVersion',\n 'supabase',\n 'prisma',\n 'drizzle',\n 'sqlite',\n 'postgrest',\n 'audit',\n 'perf',\n 'disable',\n])\n","import { ConfigError } from '@/config/ConfigError.js'\n\n/** The named section as an object, undefined when absent, ConfigError when it is not an object. */\nexport const configSection = (\n raw: Record<string, unknown>,\n name: string,\n): Record<string, unknown> | undefined => {\n const value = raw[name]\n if (value === undefined) return undefined\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new ConfigError(`${name} must be an object`)\n }\n return value as Record<string, unknown>\n}\n","export const LEGACY_DISABLE_REASON =\n 'carried over from schemaVersion 1; write the real reason'\n","import { ConfigError } from '@/config/ConfigError.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { LEGACY_DISABLE_REASON } from '@/config/LEGACY_DISABLE_REASON.js'\n\n/** One raw `disable` entry, validated against its schemaVersion's shape. */\nexport const disableEntryFrom = (\n raw: unknown,\n schemaVersion: 1 | 2,\n): DisableEntry => {\n if (typeof raw === 'string') {\n if (schemaVersion === 1) return { code: raw, reason: LEGACY_DISABLE_REASON }\n throw new ConfigError(\n `disable entries must be { \"code\": \"${raw}\", \"reason\": \"why\" } under schemaVersion 2`,\n )\n }\n if (typeof raw !== 'object' || raw === null)\n throw new ConfigError('disable entries must be objects')\n const { code, reason } = raw as Record<string, unknown>\n if (typeof code !== 'string')\n throw new ConfigError('disable code must be a string')\n if (typeof reason !== 'string' || reason.trim() === '')\n throw new ConfigError(`disable reason must not be empty (${code})`)\n return { code, reason }\n}\n","import { ConfigError } from '@/config/ConfigError.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { disableEntryFrom } from '@/config/disableEntryFrom.js'\n\nexport const disableEntriesFrom = (\n raw: unknown,\n schemaVersion: 1 | 2,\n): DisableEntry[] => {\n if (raw === undefined) return []\n if (!Array.isArray(raw)) throw new ConfigError('disable must be a list')\n return raw.map((entry) => disableEntryFrom(entry, schemaVersion))\n}\n","export const isPositiveInteger = (value: unknown): value is number =>\n typeof value === 'number' && Number.isInteger(value) && value > 0\n","export const isStringList = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((item) => typeof item === 'string')\n","import type { PerfConfig } from '@/config/PerfConfig.js'\n\nexport const PERF_DEFAULTS: PerfConfig = {\n inGate: false,\n slowMs: 100,\n regressionPercent: 20,\n minCalls: 20,\n seqScanRows: 10000,\n benchDir: 'db-quality/bench',\n benchRuns: 5,\n benchTimeoutMs: 60000,\n roles: ['authenticator', 'service_role', 'postgres'],\n ignore: [],\n}\n","/** A Postgres role name that can be interpolated into a query without quoting. */\nexport const ROLE_NAME_PATTERN = /^[a-z_][a-z0-9_]*$/\n","import { ConfigError } from '@/config/ConfigError.js'\nimport { expectConfig } from '@/config/expectConfig.js'\nimport { isPositiveInteger } from '@/config/isPositiveInteger.js'\nimport { isStringList } from '@/config/isStringList.js'\nimport { PERF_DEFAULTS } from '@/config/PERF_DEFAULTS.js'\nimport type { PerfConfig } from '@/config/PerfConfig.js'\nimport { ROLE_NAME_PATTERN } from '@/config/ROLE_NAME_PATTERN.js'\n\nexport const perfSectionFrom = (\n raw: Record<string, unknown> | undefined,\n): PerfConfig => {\n const merged: Record<string, unknown> = { ...PERF_DEFAULTS, ...raw }\n for (const key of [\n 'slowMs',\n 'regressionPercent',\n 'minCalls',\n 'seqScanRows',\n 'benchRuns',\n 'benchTimeoutMs',\n ])\n expectConfig(\n typeof merged[key] === 'number',\n `perf.${key} must be a number`,\n )\n for (const key of ['minCalls', 'benchRuns', 'benchTimeoutMs'])\n expectConfig(\n isPositiveInteger(merged[key]),\n `perf.${key} must be a positive integer`,\n )\n expectConfig(\n typeof merged['inGate'] === 'boolean',\n 'perf.inGate must be a boolean',\n )\n expectConfig(\n typeof merged['benchDir'] === 'string',\n 'perf.benchDir must be a string',\n )\n expectConfig(\n isStringList(merged['roles']),\n 'perf.roles must be a list of strings',\n )\n expectConfig(\n isStringList(merged['ignore']),\n 'perf.ignore must be a list of strings',\n )\n const roles = merged['roles'] as string[]\n expectConfig(roles.length > 0, 'perf.roles must name at least one role')\n const bad = roles.find((role) => !ROLE_NAME_PATTERN.test(role))\n if (bad !== undefined)\n throw new ConfigError(\n `perf.roles entries must match ${ROLE_NAME_PATTERN.source}: \"${bad}\"`,\n )\n return merged as PerfConfig\n}\n","import { ConfigError } from '@/config/ConfigError.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport { isStringList } from '@/config/isStringList.js'\n\nexport const drizzleSectionFrom = (\n drizzle: Record<string, unknown>,\n): NonNullable<DbQualityConfig['drizzle']> => {\n const roots = drizzle['roots']\n const objectNames = drizzle['objectNames'] ?? ['db', 'tx']\n if (!isStringList(roots))\n throw new ConfigError('drizzle.roots must be a list of strings')\n if (!isStringList(objectNames)) {\n throw new ConfigError('drizzle.objectNames must be a list of strings')\n }\n return { roots, objectNames }\n}\n","import { ConfigError } from '@/config/ConfigError.js'\nimport { isStringList } from '@/config/isStringList.js'\nimport type { PostgrestConfig } from '@/config/PostgrestConfig.js'\n\nexport const postgrestSectionFrom = (\n raw: Record<string, unknown>,\n): PostgrestConfig => {\n const roots = raw['roots']\n if (!isStringList(roots))\n throw new ConfigError('postgrest.roots must be a list of strings')\n if (roots.length === 0)\n throw new ConfigError('postgrest.roots must name at least one directory')\n return { roots }\n}\n","import { ConfigError } from '@/config/ConfigError.js'\nimport { configSection } from '@/config/configSection.js'\nimport { drizzleSectionFrom } from '@/config/drizzleSectionFrom.js'\nimport { isStringList } from '@/config/isStringList.js'\nimport { postgrestSectionFrom } from '@/config/postgrestSectionFrom.js'\nimport type { StackSections } from '@/config/StackSections.js'\n\nexport const stackSectionsFrom = (\n raw: Record<string, unknown>,\n): StackSections => {\n const stacks: StackSections = {}\n const supabase = configSection(raw, 'supabase')\n if (supabase) {\n const migrations = supabase['migrations']\n if (typeof migrations !== 'string')\n throw new ConfigError('supabase.migrations must be a string')\n stacks.supabase = { migrations }\n }\n const prisma = configSection(raw, 'prisma')\n if (prisma) {\n const schema = prisma['schema']\n if (typeof schema !== 'string')\n throw new ConfigError('prisma.schema must be a string')\n stacks.prisma = { schema }\n }\n const drizzle = configSection(raw, 'drizzle')\n if (drizzle) stacks.drizzle = drizzleSectionFrom(drizzle)\n const sqlite = configSection(raw, 'sqlite')\n if (sqlite) {\n const files = sqlite['files']\n if (!isStringList(files))\n throw new ConfigError('sqlite.files must be a list of strings')\n stacks.sqlite = { files }\n }\n const postgrest = configSection(raw, 'postgrest')\n if (postgrest) stacks.postgrest = postgrestSectionFrom(postgrest)\n return stacks\n}\n","import { auditSectionFrom } from '@/config/auditSectionFrom.js'\nimport { CONFIG_KEYS } from '@/config/CONFIG_KEYS.js'\nimport { ConfigError } from '@/config/ConfigError.js'\nimport { configSection } from '@/config/configSection.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport { disableEntriesFrom } from '@/config/disableEntriesFrom.js'\nimport { perfSectionFrom } from '@/config/perfSectionFrom.js'\nimport { stackSectionsFrom } from '@/config/stackSectionsFrom.js'\n\n/** Validates a parsed codeality-db.json and fills its defaults; ConfigError on any defect. */\nexport const configFromDocument = (document: unknown): DbQualityConfig => {\n if (\n typeof document !== 'object' ||\n document === null ||\n Array.isArray(document)\n ) {\n throw new ConfigError('configuration must be an object')\n }\n const raw = document as Record<string, unknown>\n for (const key of Object.keys(raw)) {\n if (!CONFIG_KEYS.has(key)) throw new ConfigError(`unknown key \"${key}\"`)\n }\n const schemaVersion = raw['schemaVersion']\n if (schemaVersion !== 1 && schemaVersion !== 2)\n throw new ConfigError('schemaVersion must be 1 or 2')\n return {\n schemaVersion,\n ...stackSectionsFrom(raw),\n audit: auditSectionFrom(configSection(raw, 'audit')),\n perf: perfSectionFrom(configSection(raw, 'perf')),\n disable: disableEntriesFrom(raw['disable'], schemaVersion),\n }\n}\n","import { auditPlan } from '@/audit/auditPlan.js'\nimport { resolveAuditTarget } from '@/audit/resolveAuditTarget.js'\nimport { runAudit } from '@/audit/runAudit.js'\nimport { renderFindings } from '@/check/renderFindings.js'\nimport { renderFindingsJson } from '@/check/renderFindingsJson.js'\nimport type { CommandIo } from '@/commands/CommandIo.js'\nimport { parseCommandArgs } from '@/commands/parseCommandArgs.js'\nimport { reportCommandError } from '@/commands/reportCommandError.js'\nimport { legacyConfigNotice } from '@/config/legacyConfigNotice.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { ExitCode } from '@/model/ExitCode.js'\n\nexport const auditCommand = (argv: string[], io: CommandIo): number => {\n try {\n const { values } = parseCommandArgs(argv, {\n json: { type: 'boolean' },\n linked: { type: 'boolean' },\n 'db-url': { type: 'string' },\n })\n const config = readConfig(io.root)\n const notice = legacyConfigNotice(config)\n if (notice) io.stderr(`${notice}\\n`)\n const target = resolveAuditTarget(io.root, {\n linked: values['linked'] === true,\n 'db-url': values['db-url'] as string | undefined,\n })\n for (const notice of auditPlan(config, target).skipped)\n io.stderr(`${notice}\\n`)\n const findings = runAudit({\n root: io.root,\n config,\n runner: io.runner,\n target,\n })\n io.stdout(\n `${values['json'] === true ? renderFindingsJson(findings) : renderFindings(findings)}\\n`,\n )\n return findings.length > 0 ? ExitCode.FINDINGS : ExitCode.OK\n } catch (error) {\n return reportCommandError(error, io.stderr)\n }\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BASELINE_FILENAME } from '@/baseline/BASELINE_FILENAME.js'\nimport { baselineActionFrom } from '@/baseline/baselineActionFrom.js'\nimport { classifyFindings } from '@/baseline/classifyFindings.js'\nimport { readBaseline } from '@/baseline/readBaseline.js'\nimport { renderClassified } from '@/baseline/renderClassified.js'\nimport { writeBaseline } from '@/baseline/writeBaseline.js'\nimport { runCheck } from '@/check/runCheck.js'\nimport type { CommandIo } from '@/commands/CommandIo.js'\nimport { parseCommandArgs } from '@/commands/parseCommandArgs.js'\nimport { reportCommandError } from '@/commands/reportCommandError.js'\nimport { ConfigError } from '@/config/ConfigError.js'\nimport { legacyConfigNotice } from '@/config/legacyConfigNotice.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { ExitCode } from '@/model/ExitCode.js'\nimport { PACKAGE_VERSION } from '@/packageVersion.js'\n\nexport const baselineCommand = (argv: string[], io: CommandIo): number => {\n try {\n const { values, positionals } = parseCommandArgs(argv, {\n 'check-stale': { type: 'boolean' },\n })\n const action = baselineActionFrom(positionals)\n if (action === 'create' && existsSync(join(io.root, BASELINE_FILENAME))) {\n throw new ConfigError(\n `${BASELINE_FILENAME} exists; use \"baseline update\" to rewrite it`,\n )\n }\n const config = readConfig(io.root)\n const notice = legacyConfigNotice(config)\n if (notice) io.stderr(`${notice}\\n`)\n const findings = runCheck({\n root: io.root,\n config,\n runner: io.runner,\n })\n if (action !== 'check') {\n const entries = findings.map((f) => f.fingerprint)\n writeBaseline(io.root, {\n schemaVersion: 1,\n toolVersion: PACKAGE_VERSION,\n entries,\n })\n io.stdout(\n `recorded ${String(findings.length)} findings in ${BASELINE_FILENAME}\\n`,\n )\n return ExitCode.OK\n }\n const classified = classifyFindings(findings, readBaseline(io.root))\n io.stdout(`${renderClassified(classified)}\\n`)\n const stale =\n values['check-stale'] === true && classified.resolved.length > 0\n return classified.new.length > 0 || stale ? ExitCode.FINDINGS : ExitCode.OK\n } catch (error) {\n return reportCommandError(error, io.stderr)\n }\n}\n","export const BASELINE_FILENAME = '.codeality-db-baseline.json'\n","export const BASELINE_USAGE =\n 'usage: codeality-db baseline create|update|check [--check-stale]'\n","import { BASELINE_USAGE } from '@/baseline/BASELINE_USAGE.js'\nimport type { BaselineAction } from '@/baseline/BaselineAction.js'\nimport { ConfigError } from '@/config/ConfigError.js'\n\nexport const baselineActionFrom = (positionals: string[]): BaselineAction => {\n const action = positionals[0]\n if (action === 'create' || action === 'update' || action === 'check')\n return action\n throw new ConfigError(BASELINE_USAGE)\n}\n","import type { BaselineFile } from '@/baseline/BaselineFile.js'\nimport type { ClassifiedFindings } from '@/baseline/ClassifiedFindings.js'\nimport type { Finding } from '@/model/Finding.js'\n\n// A baseline entry nothing reports any more is resolved, and reporting it is\n// what stops dead debt being carried forever.\nexport const classifyFindings = (\n findings: Finding[],\n baseline: BaselineFile,\n): ClassifiedFindings => {\n const entries = new Set(baseline.entries)\n const current = new Set(findings.map((finding) => finding.fingerprint))\n return {\n new: findings.filter((finding) => !entries.has(finding.fingerprint)),\n known: findings.filter((finding) => entries.has(finding.fingerprint)),\n resolved: baseline.entries.filter((entry) => !current.has(entry)).sort(),\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BASELINE_FILENAME } from '@/baseline/BASELINE_FILENAME.js'\nimport type { BaselineFile } from '@/baseline/BaselineFile.js'\nimport { ConfigError } from '@/config/ConfigError.js'\n\nexport const readBaseline = (root: string): BaselineFile => {\n const path = join(root, BASELINE_FILENAME)\n if (!existsSync(path)) {\n throw new ConfigError(\n `${BASELINE_FILENAME} not found; run \"codeality-db baseline create\"`,\n )\n }\n const document = JSON.parse(\n readFileSync(path, 'utf8'),\n ) as Partial<BaselineFile>\n if (document.schemaVersion !== 1 || !Array.isArray(document.entries)) {\n throw new ConfigError(`${BASELINE_FILENAME} is not a version 1 baseline`)\n }\n return {\n schemaVersion: 1,\n toolVersion: document.toolVersion ?? '',\n entries: [...document.entries].sort(),\n }\n}\n","import type { ClassifiedFindings } from '@/baseline/ClassifiedFindings.js'\nimport { renderFindings } from '@/check/renderFindings.js'\n\n/** The counts line, then the new findings when there are any. */\nexport const renderClassified = (classified: ClassifiedFindings): string => {\n const counts = `${String(classified.new.length)} new, ${String(classified.known.length)} known, ${String(classified.resolved.length)} resolved`\n return classified.new.length > 0\n ? `${counts}\\n${renderFindings(classified.new)}`\n : counts\n}\n","import { renameSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BASELINE_FILENAME } from '@/baseline/BASELINE_FILENAME.js'\nimport type { BaselineFile } from '@/baseline/BaselineFile.js'\n\n/** Writes the baseline atomically: a temporary file, then a rename over the target. */\nexport const writeBaseline = (root: string, baseline: BaselineFile): void => {\n const path = join(root, BASELINE_FILENAME)\n const document = {\n schemaVersion: 1,\n toolVersion: baseline.toolVersion,\n entries: [...baseline.entries].sort(),\n }\n writeFileSync(`${path}.tmp`, `${JSON.stringify(document, null, 2)}\\n`)\n renameSync(`${path}.tmp`, path)\n}\n","import { relative } from 'node:path'\n\nimport type { EslintFileResult } from '@/adapters/drizzle/EslintFileResult.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\nexport const parseEslintReport = (\n stdout: string,\n root: string,\n disabled: DisableEntry[],\n): Finding[] => {\n if (!stdout.trim()) return []\n let files: EslintFileResult[]\n try {\n files = JSON.parse(stdout) as EslintFileResult[]\n } catch {\n throw new Error(`eslint produced no JSON report: ${stdout.slice(0, 200)}`)\n }\n return files.flatMap((file) =>\n file.messages.flatMap((message) => {\n if (!message.ruleId?.startsWith('drizzle/')) return []\n const rule = message.ruleId.slice('drizzle/'.length)\n const code = `BDB300/${rule}`\n if (isDisabled(code, disabled)) return []\n const partial = {\n code,\n severity: 'error' as const,\n path: relative(root, file.filePath).replaceAll('\\\\', '/'),\n line: message.line,\n message: message.message,\n subject: rule,\n }\n return [\n {\n ...partial,\n fingerprint: fingerprintFinding(partial, message.message),\n },\n ]\n }),\n )\n}\n","import { fileURLToPath } from 'node:url'\n\n// `assets/` is one level up from both `dist/cli.js` (the bundle) and `src/`.\nexport const assetPath = (name: string): string =>\n fileURLToPath(new URL(`../assets/${name}`, import.meta.url))\n","import { parseEslintReport } from '@/adapters/drizzle/parseEslintReport.js'\nimport { assetPath } from '@/assetPath.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\n// Runs from the project root: ESLint ignores any file outside its cwd, which\n// is what an earlier attempt from another directory reported as \"all files\n// matching the pattern are ignored\".\n// `--no-config-lookup` does not stop ESLint reading the project's own\n// eslint-suppressions.json, and an entry there that no longer matches makes\n// it exit 2 with no report; the flag turns that into a pass (measured on a\n// project whose suppressions had gone stale, 2026-09-25).\nexport const runDrizzleLint = (\n runner: CommandRunner,\n root: string,\n drizzle: NonNullable<DbQualityConfig['drizzle']>,\n disabled: DisableEntry[],\n): Finding[] => {\n const result = runner(\n 'eslint',\n [\n '--no-config-lookup',\n '-c',\n assetPath('drizzle-eslint.config.mjs'),\n '-f',\n 'json',\n '--pass-on-unpruned-suppressions',\n ...drizzle.roots,\n ],\n {\n cwd: root,\n env: { CODEALITY_DB_DRIZZLE_OBJECTS: drizzle.objectNames.join(',') },\n },\n )\n if (result.missing) {\n throw new ToolMissingError(\n 'eslint',\n 'add eslint, eslint-plugin-drizzle and typescript-eslint as devDependencies',\n )\n }\n if (result.status !== 0 && result.status !== 1) {\n throw new Error(\n `eslint exited ${String(result.status)}: ${result.stderr.trim()}`,\n )\n }\n return parseEslintReport(result.stdout, root, disabled)\n}\n","import type { PrismaViolation } from '@/adapters/prisma/PrismaViolation.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\nexport const parsePrismaLintReport = (\n stderr: string,\n disabled: DisableEntry[],\n): Finding[] => {\n if (!stderr.trim()) return []\n let violations: PrismaViolation[]\n try {\n violations = (JSON.parse(stderr) as { violations: PrismaViolation[] })\n .violations\n } catch {\n throw new Error(\n `prisma-lint produced no JSON report: ${stderr.slice(0, 200)}`,\n )\n }\n return violations.flatMap((violation) => {\n const code = `BDB200/${violation.ruleName}`\n if (isDisabled(code, disabled)) return []\n const partial = {\n code,\n severity: 'warn' as const,\n path: violation.fileName,\n line: violation.location.startLine,\n message: violation.message,\n subject: /Field \"([^\"]+)\"/.exec(violation.message)?.[1] ?? '',\n }\n return [\n {\n ...partial,\n fingerprint: fingerprintFinding(partial, violation.message),\n },\n ]\n })\n}\n","import { parsePrismaLintReport } from '@/adapters/prisma/parsePrismaLintReport.js'\nimport { assetPath } from '@/assetPath.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\n// prisma-lint writes its JSON report to stderr, and exits 1 whenever it has\n// one violation to report. Both are its documented behaviour, not a bug here.\nexport const runPrismaLint = (\n runner: CommandRunner,\n root: string,\n schemaPath: string,\n disabled: DisableEntry[],\n): Finding[] => {\n const result = runner(\n 'prisma-lint',\n ['-c', assetPath('prisma-lint.json'), '-o', 'json', schemaPath],\n { cwd: root },\n )\n if (result.missing) {\n throw new ToolMissingError(\n 'prisma-lint',\n 'add prisma-lint as a devDependency',\n )\n }\n if (result.status !== 0 && result.status !== 1) {\n throw new Error(\n `prisma-lint exited ${String(result.status)}: ${result.stderr.trim()}`,\n )\n }\n return parsePrismaLintReport(result.stderr, disabled)\n}\n","import type { SqliteFindingInput } from '@/adapters/sqlite/SqliteFindingInput.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\n/** Zero or one finding on a SQLite file: none when the code is disabled. Line is always 0. */\nexport const sqliteFinding = (\n input: SqliteFindingInput,\n disabled: DisableEntry[],\n): Finding[] => {\n if (isDisabled(input.code, disabled)) return []\n const partial = {\n code: input.code,\n severity: input.severity,\n path: input.file,\n line: 0,\n message: input.message,\n subject: input.subject,\n }\n return [\n { ...partial, fingerprint: fingerprintFinding(partial, input.context) },\n ]\n}\n","import type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\nexport const sqliteQuery = (\n runner: CommandRunner,\n root: string,\n file: string,\n sql: string,\n): string => {\n const result = runner('sqlite3', ['-json', '-readonly', file, sql], {\n cwd: root,\n })\n if (result.missing) {\n throw new ToolMissingError(\n 'sqlite3',\n 'install the sqlite3 command line shell',\n )\n }\n if (result.status !== 0)\n throw new Error(`sqlite3 failed on ${file}: ${result.stderr.trim()}`)\n return result.stdout\n}\n","import { sqliteQuery } from '@/adapters/sqlite/sqliteQuery.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\n/** The rows of one read-only query, as `sqlite3 -json` prints them; none when it prints nothing. */\nexport const sqliteRows = <T>(\n runner: CommandRunner,\n root: string,\n file: string,\n sql: string,\n): T[] => {\n const out = sqliteQuery(runner, root, file, sql).trim()\n return out ? (JSON.parse(out) as T[]) : []\n}\n","import { sqliteFinding } from '@/adapters/sqlite/sqliteFinding.js'\nimport { sqliteRows } from '@/adapters/sqlite/sqliteRows.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\n/** BDB402: one finding per row `PRAGMA foreign_key_check` reports. */\nexport const foreignKeyFindings = (\n runner: CommandRunner,\n root: string,\n file: string,\n disabled: DisableEntry[],\n): Finding[] =>\n sqliteRows<{ table: string; rowid: number; parent: string }>(\n runner,\n root,\n file,\n 'PRAGMA foreign_key_check',\n ).flatMap((row) =>\n sqliteFinding(\n {\n code: 'BDB402',\n severity: 'error',\n file,\n subject: row.table,\n message: `row ${String(row.rowid)} references missing ${row.parent}`,\n context: `${row.table}:${String(row.rowid)}:${row.parent}`,\n },\n disabled,\n ),\n )\n","import { sqliteFinding } from '@/adapters/sqlite/sqliteFinding.js'\nimport { sqliteRows } from '@/adapters/sqlite/sqliteRows.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\n/** BDB401: `PRAGMA integrity_check` answered anything but a single `ok`. */\nexport const integrityFindings = (\n runner: CommandRunner,\n root: string,\n file: string,\n disabled: DisableEntry[],\n): Finding[] => {\n const rows = sqliteRows<{ integrity_check: string }>(\n runner,\n root,\n file,\n 'PRAGMA integrity_check',\n )\n const first = rows[0]?.integrity_check ?? 'no result'\n if (rows.length === 1 && first === 'ok') return []\n return sqliteFinding(\n {\n code: 'BDB401',\n severity: 'error',\n file,\n subject: '',\n message: `integrity_check: ${first}`,\n context: first,\n },\n disabled,\n )\n}\n","export const hasPrimaryKey = (createSql: string): boolean => {\n const text = createSql.toLowerCase()\n return text.startsWith('create virtual table') || text.includes('primary key')\n}\n","import { hasPrimaryKey } from '@/adapters/sqlite/hasPrimaryKey.js'\nimport { sqliteFinding } from '@/adapters/sqlite/sqliteFinding.js'\nimport { sqliteRows } from '@/adapters/sqlite/sqliteRows.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\n/** BDB403: every user table whose CREATE statement declares no primary key. */\nexport const primaryKeyFindings = (\n runner: CommandRunner,\n root: string,\n file: string,\n disabled: DisableEntry[],\n): Finding[] =>\n sqliteRows<{ name: string; sql: string }>(\n runner,\n root,\n file,\n \"select name, sql from sqlite_master where type = 'table' and name not like 'sqlite_%'\",\n ).flatMap((row) =>\n hasPrimaryKey(row.sql)\n ? []\n : sqliteFinding(\n {\n code: 'BDB403',\n severity: 'warn',\n file,\n subject: row.name,\n message: 'table has no primary key',\n context: row.name,\n },\n disabled,\n ),\n )\n","import { foreignKeyFindings } from '@/adapters/sqlite/foreignKeyFindings.js'\nimport { integrityFindings } from '@/adapters/sqlite/integrityFindings.js'\nimport { primaryKeyFindings } from '@/adapters/sqlite/primaryKeyFindings.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\nexport const runSqliteChecks = (\n runner: CommandRunner,\n root: string,\n files: string[],\n disabled: DisableEntry[],\n): Finding[] =>\n files.flatMap((file) => [\n ...integrityFindings(runner, root, file, disabled),\n ...foreignKeyFindings(runner, root, file, disabled),\n ...primaryKeyFindings(runner, root, file, disabled),\n ])\n","export const normalizeSqlText = (text: string): string =>\n text.toLowerCase().replaceAll(/\\s+/g, ' ').trim()\n","import type { MigrationFile } from '@/sql/MigrationFile.js'\nimport type { SqlStatement } from '@/sql/SqlStatement.js'\n\nexport const statementAtLine = (\n file: MigrationFile,\n line: number,\n): SqlStatement | undefined =>\n [...file.statements].reverse().find((statement) => statement.line <= line)\n","import type { SquawkEntry } from '@/adapters/squawk/SquawkEntry.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\nimport { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\nimport { statementAtLine } from '@/sql/statementAtLine.js'\n\nexport const parseSquawkReport = (\n stdout: string,\n set: MigrationFile[],\n disabled: DisableEntry[],\n): Finding[] => {\n if (!stdout.trim()) return []\n let entries: SquawkEntry[]\n try {\n entries = JSON.parse(stdout) as SquawkEntry[]\n } catch {\n throw new Error(`squawk produced no JSON report: ${stdout.slice(0, 200)}`)\n }\n return entries.flatMap((entry) => {\n const code = `BDB100/${entry.rule_name}`\n if (isDisabled(code, disabled)) return []\n const file = set.find((candidate) => candidate.path === entry.file)\n const statement = file ? statementAtLine(file, entry.line) : undefined\n const partial = {\n code,\n severity:\n entry.level === 'Error' ? ('error' as const) : ('warn' as const),\n path: entry.file,\n line: entry.line,\n message: entry.message,\n subject: entry.rule_name,\n }\n const context = statement ? normalizeSqlText(statement.text) : entry.message\n return [{ ...partial, fingerprint: fingerprintFinding(partial, context) }]\n })\n}\n","// Supabase applies each migration inside one transaction with the CLI's own\n// timeouts, so the lock, timeout and CONCURRENTLY rules describe a deployment\n// model these projects do not have. Measured 2026-09-25 over six repositories:\n// these four were 80% of every squawk line and none of them was actionable.\nexport const SUPABASE_SQUAWK_EXCLUDES = [\n 'prefer-robust-stmts',\n 'require-lock-timeout',\n 'require-statement-timeout',\n 'require-concurrent-index-creation',\n]\n","import { parseSquawkReport } from '@/adapters/squawk/parseSquawkReport.js'\nimport { SUPABASE_SQUAWK_EXCLUDES } from '@/adapters/squawk/SUPABASE_SQUAWK_EXCLUDES.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\nexport const runSquawk = (\n runner: CommandRunner,\n root: string,\n set: MigrationFile[],\n disabled: DisableEntry[],\n): Finding[] => {\n const result = runner(\n 'squawk',\n [\n '--reporter',\n 'json',\n '--exclude',\n SUPABASE_SQUAWK_EXCLUDES.join(','),\n ...set.map((f) => f.path),\n ],\n { cwd: root },\n )\n if (result.missing)\n throw new ToolMissingError('squawk', 'add squawk-cli as a devDependency')\n if (result.status !== 0 && result.status !== 1) {\n throw new Error(\n `squawk exited ${String(result.status)}: ${result.stderr.trim()}`,\n )\n }\n return parseSquawkReport(result.stdout, set, disabled)\n}\n","import { readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport { compareFindings } from '@/model/compareFindings.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { collectPostgrestChains } from '@/postgrest/collectPostgrestChains.js'\nimport { loadTypeScript } from '@/postgrest/loadTypeScript.js'\nimport { POSTGREST_RULES } from '@/postgrest/POSTGREST_RULES.js'\nimport { sourceFilesUnder } from '@/postgrest/sourceFilesUnder.js'\nimport type { TableKnowledge } from '@/rules/TableKnowledge.js'\n\nexport const runPostgrestRules = (\n root: string,\n roots: string[],\n knowledge: Map<string, TableKnowledge>,\n disabled: DisableEntry[],\n): Finding[] => {\n const rules = POSTGREST_RULES.filter(\n (rule) => !isDisabled(rule.code, disabled),\n )\n const context = { knowledge }\n const compiler = loadTypeScript([join(root, 'package.json'), import.meta.url])\n return sourceFilesUnder(root, roots)\n .flatMap((path) =>\n collectPostgrestChains(\n compiler,\n path,\n readFileSync(join(root, path), 'utf8'),\n ),\n )\n .flatMap((chain) => rules.map((rule) => rule.run(chain, context)))\n .filter((finding): finding is Finding => finding !== undefined)\n .sort(compareFindings)\n}\n","export const ITERATION_METHODS = new Set([\n 'map',\n 'forEach',\n 'reduce',\n 'filter',\n 'flatMap',\n])\n","import type ts from 'typescript'\n\nimport { ITERATION_METHODS } from '@/postgrest/ITERATION_METHODS.js'\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\nexport const isIterationCallback = (\n compiler: TypeScriptModule,\n node: ts.Node,\n): boolean =>\n (compiler.isArrowFunction(node) || compiler.isFunctionExpression(node)) &&\n compiler.isCallExpression(node.parent) &&\n compiler.isPropertyAccessExpression(node.parent.expression) &&\n ITERATION_METHODS.has(node.parent.expression.name.text)\n","import type ts from 'typescript'\n\nimport { isIterationCallback } from '@/postgrest/isIterationCallback.js'\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\n/** Walks up to the enclosing function; a loop statement or an iteration callback on the way means the query runs once per item. */\nexport const isInsideLoop = (\n compiler: TypeScriptModule,\n node: ts.Node,\n): boolean => {\n let current: ts.Node = node.parent\n while (!compiler.isSourceFile(current)) {\n if (compiler.isIterationStatement(current, false)) return true\n if (isIterationCallback(compiler, current)) return true\n if (compiler.isFunctionLike(current)) return false\n current = current.parent\n }\n return false\n}\n","import type ts from 'typescript'\n\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\n/** True when a chain root's receiver is `<expr>.storage`, e.g. `supabase.storage.from('bucket')`: Supabase Storage, not PostgREST. */\nexport const isStorageReceiver = (\n compiler: TypeScriptModule,\n expression: ts.Expression,\n): boolean =>\n compiler.isPropertyAccessExpression(expression) &&\n expression.name.text === 'storage'\n","import type ts from 'typescript'\n\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\n/** True when `node` is a string literal or a no-substitution template literal: the only forms a `.from()`/`.rpc()` root target may take. */\nexport const isStringLiteralArgument = (\n compiler: TypeScriptModule,\n node: ts.Expression | undefined,\n): boolean =>\n node !== undefined &&\n (compiler.isStringLiteral(node) ||\n compiler.isNoSubstitutionTemplateLiteral(node))\n","import type ts from 'typescript'\n\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\n/** A string literal verbatim, an object literal as `{key:value}` pairs, anything else as `?`. */\nexport const literalArgument = (\n compiler: TypeScriptModule,\n node: ts.Expression,\n): string => {\n if (\n compiler.isStringLiteral(node) ||\n compiler.isNoSubstitutionTemplateLiteral(node)\n )\n return node.text\n if (!compiler.isObjectLiteralExpression(node)) return '?'\n const pairs = node.properties.map((property) => {\n if (!compiler.isPropertyAssignment(property)) return '?'\n const key =\n compiler.isIdentifier(property.name) ||\n compiler.isStringLiteral(property.name)\n ? property.name.text\n : '?'\n const value = property.initializer\n const text =\n compiler.isStringLiteral(value) || compiler.isNumericLiteral(value)\n ? value.text\n : value.kind === compiler.SyntaxKind.TrueKeyword\n ? 'true'\n : value.kind === compiler.SyntaxKind.FalseKeyword\n ? 'false'\n : '?'\n return `${key}:${text}`\n })\n return `{${pairs.join(',')}}`\n}\n","import type ts from 'typescript'\n\nimport type { CollectedCall } from '@/postgrest/CollectedCall.js'\nimport { isInsideLoop } from '@/postgrest/isInsideLoop.js'\nimport { isStorageReceiver } from '@/postgrest/isStorageReceiver.js'\nimport { isStringLiteralArgument } from '@/postgrest/isStringLiteralArgument.js'\nimport { literalArgument } from '@/postgrest/literalArgument.js'\nimport type { PostgrestCall } from '@/postgrest/PostgrestCall.js'\nimport type { PostgrestChain } from '@/postgrest/PostgrestChain.js'\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\n/** The chain ending at `outer`, or undefined when no `.from('x')`/`.rpc('f')` with a literal sits in it. */\nexport const chainFromCall = (\n compiler: TypeScriptModule,\n outer: ts.CallExpression,\n file: ts.SourceFile,\n path: string,\n): PostgrestChain | undefined => {\n const calls: CollectedCall[] = []\n let current: ts.Expression = outer\n while (\n compiler.isCallExpression(current) &&\n compiler.isPropertyAccessExpression(current.expression)\n ) {\n calls.unshift({\n name: current.expression.name.text,\n args: current.arguments.map((node) => literalArgument(compiler, node)),\n node: current,\n })\n current = current.expression.expression\n }\n const rootIndex = calls.findIndex(\n (call) =>\n (call.name === 'from' || call.name === 'rpc') &&\n isStringLiteralArgument(compiler, call.node.arguments[0]),\n )\n const root = calls[rootIndex]\n if (!root) return undefined\n if (rootIndex === 0 && isStorageReceiver(compiler, current)) return undefined\n const rest: PostgrestCall[] = calls\n .slice(rootIndex + 1)\n .map(({ name, args }) => ({ name, args }))\n return {\n path,\n line: file.getLineAndCharacterOfPosition(root.node.getStart(file)).line + 1,\n root: root.name as 'from' | 'rpc',\n target: root.args[0] ?? '',\n calls: rest,\n inLoop: isInsideLoop(compiler, outer),\n text: outer.getText(file).replaceAll(/\\s+/g, ' '),\n }\n}\n","import type ts from 'typescript'\n\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\n/** True when the call continues into a longer chain (`a.b().c()`: `b()` is inner, `c()` is not). */\nexport const isInnerCall = (\n compiler: TypeScriptModule,\n node: ts.CallExpression,\n): boolean =>\n compiler.isPropertyAccessExpression(node.parent) &&\n compiler.isCallExpression(node.parent.parent) &&\n node.parent.parent.expression === node.parent\n","import type ts from 'typescript'\n\nimport { chainFromCall } from '@/postgrest/chainFromCall.js'\nimport { isInnerCall } from '@/postgrest/isInnerCall.js'\nimport type { PostgrestChain } from '@/postgrest/PostgrestChain.js'\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\nexport const collectPostgrestChains = (\n compiler: TypeScriptModule,\n path: string,\n source: string,\n): PostgrestChain[] => {\n const file = compiler.createSourceFile(\n path,\n source,\n compiler.ScriptTarget.Latest,\n true,\n path.endsWith('.tsx') ? compiler.ScriptKind.TSX : compiler.ScriptKind.TS,\n )\n const chains: PostgrestChain[] = []\n const visit = (node: ts.Node): void => {\n if (compiler.isCallExpression(node) && !isInnerCall(compiler, node)) {\n const chain = chainFromCall(compiler, node, file, path)\n if (chain) chains.push(chain)\n }\n compiler.forEachChild(node, visit)\n }\n visit(file)\n return chains\n}\n","import { createRequire } from 'node:module'\n\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\n/**\n * The project's typescript, else the one installed next to this package.\n * An optional peer: only the PostgREST rules need it, so it is never imported\n * statically and its absence is exit 3, not a crash of every command.\n */\nexport const loadTypeScript = (bases: string[]): TypeScriptModule => {\n for (const base of bases) {\n try {\n return createRequire(base)('typescript') as TypeScriptModule\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'MODULE_NOT_FOUND')\n throw error\n }\n }\n throw new ToolMissingError(\n 'typescript',\n 'install typescript in the project to run the PostgREST rules',\n )\n}\n","import type { PostgrestCall } from '@/postgrest/PostgrestCall.js'\nimport type { PostgrestChain } from '@/postgrest/PostgrestChain.js'\n\n/** The `select` call when the chain is a read (select first after the root); undefined for writes and rpc. */\nexport const chainSelectCall = (\n chain: PostgrestChain,\n): PostgrestCall | undefined => {\n const first = chain.calls[0]\n return chain.root === 'from' && first?.name === 'select' ? first : undefined\n}\n","import type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\nimport type { PostgrestChain } from '@/postgrest/PostgrestChain.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\n\nexport const makePostgrestFinding = (\n rule: Pick<PostgrestRule, 'code' | 'severity'>,\n chain: PostgrestChain,\n subject: string,\n message: string,\n): Finding => {\n const partial = {\n code: rule.code,\n severity: rule.severity,\n path: chain.path,\n line: chain.line,\n message,\n subject,\n }\n return { ...partial, fingerprint: fingerprintFinding(partial, chain.text) }\n}\n","import { chainSelectCall } from '@/postgrest/chainSelectCall.js'\nimport { makePostgrestFinding } from '@/postgrest/makePostgrestFinding.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\n\nexport const exactCountUnbounded: PostgrestRule = {\n code: 'BDB805',\n name: 'exact-count-unbounded',\n severity: 'warn',\n run: (chain) => {\n const options = chainSelectCall(chain)?.args[1] ?? ''\n if (!options.includes('count:exact') || options.includes('head:true'))\n return undefined\n if (\n chain.calls.some((call) => call.name === 'limit' || call.name === 'range')\n )\n return undefined\n return makePostgrestFinding(\n exactCountUnbounded,\n chain,\n chain.target,\n 'count: exact with no limit or range counts and returns the whole table; use head: true for the count alone or bound the rows',\n )\n },\n}\n","/** PostgREST filter methods that take a column name as their first argument. */\nexport const FILTER_METHODS = new Set([\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'like',\n 'ilike',\n 'is',\n 'in',\n 'contains',\n 'containedBy',\n 'overlaps',\n 'textSearch',\n])\n","import { FILTER_METHODS } from '@/postgrest/FILTER_METHODS.js'\nimport { makePostgrestFinding } from '@/postgrest/makePostgrestFinding.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\n\nexport const filterWithoutIndex: PostgrestRule = {\n code: 'BDB803',\n name: 'filter-without-index',\n severity: 'warn',\n run: (chain, context) => {\n if (chain.root !== 'from') return undefined\n const knowledge = context.knowledge.get(`public.${chain.target}`)\n if (!knowledge) return undefined\n const filter = chain.calls.find(\n (call) =>\n FILTER_METHODS.has(call.name) &&\n call.args[0] !== undefined &&\n call.args[0] !== '?' &&\n !call.args[0].includes('.') &&\n !knowledge.indexed.has(call.args[0].toLowerCase()),\n )\n if (!filter) return undefined\n const column = filter.args[0] ?? ''\n return makePostgrestFinding(\n filterWithoutIndex,\n chain,\n `${chain.target}.${column}`,\n `${filter.name}('${column}') filters a column no migration indexes: a sequential scan on every call`,\n )\n },\n}\n","import { makePostgrestFinding } from '@/postgrest/makePostgrestFinding.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\n\nexport const queryInLoop: PostgrestRule = {\n code: 'BDB804',\n name: 'query-in-loop',\n severity: 'warn',\n run: (chain) =>\n chain.inLoop\n ? makePostgrestFinding(\n queryInLoop,\n chain,\n chain.target,\n 'query runs once per iteration: fetch the set with .in() or a join, or move the query out of the loop',\n )\n : undefined,\n}\n","import { chainSelectCall } from '@/postgrest/chainSelectCall.js'\nimport { makePostgrestFinding } from '@/postgrest/makePostgrestFinding.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\n\nexport const starSelect: PostgrestRule = {\n code: 'BDB801',\n name: 'select-star',\n severity: 'warn',\n run: (chain) => {\n const select = chainSelectCall(chain)\n if (!select) return undefined\n const list = select.args[0]\n if (list !== undefined && list !== '?' && !list.includes('*'))\n return undefined\n if (list === '?') return undefined\n return makePostgrestFinding(\n starSelect,\n chain,\n chain.target,\n 'select fetches every column: name the columns the caller reads, so a new wide column never travels for free',\n )\n },\n}\n","/** PostgREST methods that cap the rows a chain can return. */\nexport const BOUNDING_METHODS = new Set([\n 'limit',\n 'range',\n 'single',\n 'maybeSingle',\n 'csv',\n])\n","import { BOUNDING_METHODS } from '@/postgrest/BOUNDING_METHODS.js'\nimport { chainSelectCall } from '@/postgrest/chainSelectCall.js'\nimport type { PostgrestChain } from '@/postgrest/PostgrestChain.js'\nimport type { RuleContext } from '@/postgrest/RuleContext.js'\n\nexport const isBounded = (\n chain: PostgrestChain,\n context: RuleContext,\n): boolean => {\n if (chain.calls.some((call) => BOUNDING_METHODS.has(call.name))) return true\n if (chainSelectCall(chain)?.args[1]?.includes('head:true')) return true\n const unique = context.knowledge.get(`public.${chain.target}`)?.unique\n return chain.calls.some(\n (call) =>\n call.name === 'eq' &&\n call.args[0] !== undefined &&\n unique?.has(call.args[0].toLowerCase()) === true,\n )\n}\n","import { chainSelectCall } from '@/postgrest/chainSelectCall.js'\nimport { isBounded } from '@/postgrest/isBounded.js'\nimport { makePostgrestFinding } from '@/postgrest/makePostgrestFinding.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\n\nexport const unboundedList: PostgrestRule = {\n code: 'BDB802',\n name: 'unbounded-list',\n severity: 'warn',\n run: (chain, context) => {\n if (\n !chainSelectCall(chain) ||\n !context.knowledge.has(`public.${chain.target}`)\n )\n return undefined\n if (isBounded(chain, context)) return undefined\n return makePostgrestFinding(\n unboundedList,\n chain,\n chain.target,\n 'read has no limit, range, single or unique-key equality: it returns the whole table as it grows',\n )\n },\n}\n","import { exactCountUnbounded } from '@/postgrest/exactCountUnbounded.js'\nimport { filterWithoutIndex } from '@/postgrest/filterWithoutIndex.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\nimport { queryInLoop } from '@/postgrest/queryInLoop.js'\nimport { starSelect } from '@/postgrest/starSelect.js'\nimport { unboundedList } from '@/postgrest/unboundedList.js'\n\nexport const POSTGREST_RULES: PostgrestRule[] = [\n starSelect,\n unboundedList,\n filterWithoutIndex,\n queryInLoop,\n exactCountUnbounded,\n]\n","import { readdirSync } from 'node:fs'\nimport { join, relative } from 'node:path'\n\nimport { ConfigError } from '@/config/ConfigError.js'\nimport { isDirectory } from '@/config/isDirectory.js'\nimport { SKIPPED_SOURCE_DIRS } from '@/postgrest/SKIPPED_SOURCE_DIRS.js'\n\n/** Every .ts/.tsx under the roots, relative to root, tests and declarations excluded, sorted. */\nexport const sourceFilesUnder = (root: string, roots: string[]): string[] => {\n for (const base of roots) {\n if (!isDirectory(join(root, base)))\n throw new ConfigError(`postgrest.roots: \"${base}\" is not a directory`)\n }\n const files: string[] = []\n const walk = (dir: string): void => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n if (!SKIPPED_SOURCE_DIRS.has(entry.name) && !entry.name.startsWith('.'))\n walk(join(dir, entry.name))\n continue\n }\n const name = entry.name\n if (\n !/\\.tsx?$/.test(name) ||\n name.endsWith('.d.ts') ||\n /\\.(?:test|spec)\\.tsx?$/.test(name)\n )\n continue\n files.push(relative(root, join(dir, name)))\n }\n }\n for (const base of roots) walk(join(root, base))\n return files.sort()\n}\n","import { existsSync, statSync } from 'node:fs'\n\nexport const isDirectory = (path: string): boolean =>\n existsSync(path) && statSync(path).isDirectory()\n","/** Directories never worth walking for application source: build output, dependencies, test doubles. */\nexport const SKIPPED_SOURCE_DIRS = new Set([\n 'node_modules',\n 'dist',\n 'build',\n '.next',\n 'coverage',\n '__tests__',\n '__mocks__',\n])\n","export const qualifiedName = (raw: string): string => {\n const parts = raw\n .trim()\n .split('.')\n .map((part) => part.replaceAll('\"', '').toLowerCase())\n return parts.length === 1 ? `public.${parts[0] ?? ''}` : parts.join('.')\n}\n","import { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport type { StatementRef } from '@/rules/StatementRef.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\nimport { qualifiedName } from '@/sql/qualifiedName.js'\n\n/** Qualified names captured by group 1 of `pattern`, each mapped to its first statement. */\nexport const matchedTables = (\n set: MigrationFile[],\n pattern: RegExp,\n): Map<string, StatementRef> => {\n const tables = new Map<string, StatementRef>()\n for (const file of set)\n for (const statement of file.statements) {\n const match = pattern.exec(normalizeSqlText(statement.text))\n if (!match?.[1]) continue\n const name = qualifiedName(match[1])\n if (!tables.has(name)) tables.set(name, { file, statement })\n }\n return tables\n}\n","import { matchedTables } from '@/rules/matchedTables.js'\nimport type { StatementRef } from '@/rules/StatementRef.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\n\n/** Tables created in `public`, each mapped to the statement that creates it. */\nexport const createdTables = (\n set: MigrationFile[],\n): Map<string, StatementRef> =>\n new Map(\n [\n ...matchedTables(\n set,\n /^create (?:unlogged |temp(?:orary)? )?table (?:if not exists )?((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?)/,\n ),\n ].filter(([name]) => name.startsWith('public.')),\n )\n","/** Matches `alter table <table> add [constraint <name>] primary key|unique (<columns>)`, capturing the qualified table name, the constraint kind, and the column list. */\nexport const ALTER_KEY_PATTERN =\n /^alter table (?:if exists )?(?:only )?((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?) add (?:constraint \\S+ )?(primary key|unique)\\s*\\(([^)]*)\\)/\n","/** The first column of a parenthesised column list, or undefined when it is an expression. */\nexport const leadingColumn = (list: string): string | undefined => {\n const first = list.split(',')[0]?.trim() ?? ''\n const match =\n /^(?:\"([^\"]+)\"|([a-z_][\\w$]*))(?:\\s+(?:asc|desc|nulls|[a-z_]+_ops)\\b.*)?$/i.exec(\n first,\n )\n if (!match) return undefined\n return (match[1] ?? match[2] ?? '').toLowerCase()\n}\n","import { ALTER_KEY_PATTERN } from '@/rules/ALTER_KEY_PATTERN.js'\nimport { leadingColumn } from '@/rules/leadingColumn.js'\nimport type { TableKnowledge } from '@/rules/TableKnowledge.js'\nimport { qualifiedName } from '@/sql/qualifiedName.js'\n\n/** Records an `alter table ... add primary key|unique` statement's leading column; reports whether it matched. */\nexport const recordAlterKey = (\n text: string,\n entry: (table: string) => TableKnowledge,\n): boolean => {\n const match = ALTER_KEY_PATTERN.exec(text)\n if (!match?.[1] || match[3] === undefined) return false\n const column = leadingColumn(match[3])\n if (column === undefined) return true\n const table = entry(qualifiedName(match[1]))\n table.indexed.add(column)\n table.unique.add(column)\n return true\n}\n","/** Matches `create [unique] index ... on <table> [using <method>] (<columns>)`, capturing uniqueness, the qualified table name, and the column list. */\nexport const CREATE_INDEX_PATTERN =\n /^create (unique )?index (?:concurrently )?(?:if not exists )?(?:\\S+ )?on (?:only )?((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?)(?: using \\w+)?\\s*\\(([^)]*)\\)/\n","import { CREATE_INDEX_PATTERN } from '@/rules/CREATE_INDEX_PATTERN.js'\nimport { leadingColumn } from '@/rules/leadingColumn.js'\nimport type { TableKnowledge } from '@/rules/TableKnowledge.js'\nimport { qualifiedName } from '@/sql/qualifiedName.js'\n\n/** Records a `create index` statement's leading column, as unique when the index is; reports whether it matched. */\nexport const recordCreateIndex = (\n text: string,\n entry: (table: string) => TableKnowledge,\n): boolean => {\n const match = CREATE_INDEX_PATTERN.exec(text)\n if (!match?.[2] || match[3] === undefined) return false\n const column = leadingColumn(match[3])\n if (column === undefined) return true\n const table = entry(qualifiedName(match[2]))\n table.indexed.add(column)\n if (match[1]) table.unique.add(column)\n return true\n}\n","/** Matches `create table ... (<body>)`, capturing the qualified name and the full column-and-constraint body. */\nexport const CREATE_TABLE_PATTERN =\n /^create (?:unlogged |temp(?:orary)? )?table (?:if not exists )?((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?)\\s*\\(([\\s\\S]*)\\)/\n","/** Columns declared `primary key` or `unique` inside a create table body, plus its table-level constraints. */\nexport const inlineKeyColumns = (body: string): string[] => {\n const columns: string[] = []\n for (const part of body.split(/,(?![^(]*\\))/)) {\n const item = part.trim()\n const constraint =\n /^(?:constraint\\s+\\S+\\s+)?(?:primary key|unique)\\s*\\(([^)]*)\\)/i.exec(\n item,\n )\n if (constraint?.[1]) {\n const head = constraint[1]\n .split(',')[0]\n ?.trim()\n .replaceAll('\"', '')\n .toLowerCase()\n if (head) columns.push(head)\n continue\n }\n const column =\n /^(?:\"([^\"]+)\"|([a-z_][\\w$]*))\\s[^,]*\\b(?:primary key|unique)\\b/i.exec(\n item,\n )\n if (column) columns.push((column[1] ?? column[2] ?? '').toLowerCase())\n }\n return columns\n}\n","import { CREATE_TABLE_PATTERN } from '@/rules/CREATE_TABLE_PATTERN.js'\nimport { inlineKeyColumns } from '@/rules/inlineKeyColumns.js'\nimport type { TableKnowledge } from '@/rules/TableKnowledge.js'\nimport { qualifiedName } from '@/sql/qualifiedName.js'\n\n/** Records a `create table` statement's inline and table-level key columns; reports whether it matched. */\nexport const recordCreateTable = (\n text: string,\n entry: (table: string) => TableKnowledge,\n): boolean => {\n const match = CREATE_TABLE_PATTERN.exec(text)\n if (!match?.[1] || match[2] === undefined) return false\n const table = entry(qualifiedName(match[1]))\n for (const column of inlineKeyColumns(match[2])) {\n table.indexed.add(column)\n table.unique.add(column)\n }\n return true\n}\n","import { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport { createdTables } from '@/rules/createdTables.js'\nimport { recordAlterKey } from '@/rules/recordAlterKey.js'\nimport { recordCreateIndex } from '@/rules/recordCreateIndex.js'\nimport { recordCreateTable } from '@/rules/recordCreateTable.js'\nimport type { TableKnowledge } from '@/rules/TableKnowledge.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\n\n/** Every table `createdTables` knows, mapped to which of its columns the migrations index or constrain unique. */\nexport const indexedColumns = (\n set: MigrationFile[],\n): Map<string, TableKnowledge> => {\n const knowledge = new Map<string, TableKnowledge>()\n const entry = (table: string): TableKnowledge => {\n const existing = knowledge.get(table)\n if (existing) return existing\n const fresh: TableKnowledge = { indexed: new Set(), unique: new Set() }\n knowledge.set(table, fresh)\n return fresh\n }\n for (const table of createdTables(set).keys()) entry(table)\n for (const file of set)\n for (const statement of file.statements) {\n const text = normalizeSqlText(statement.text)\n if (recordCreateTable(text, entry)) continue\n if (recordCreateIndex(text, entry)) continue\n recordAlterKey(text, entry)\n }\n return knowledge\n}\n","import type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\nimport { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\nimport type { StatementRef } from '@/rules/StatementRef.js'\n\nexport const makeSqlFinding = (\n rule: Pick<SqlRule, 'code' | 'severity'>,\n { file, statement }: StatementRef,\n subject: string,\n message: string,\n): Finding => {\n const partial = {\n code: rule.code,\n severity: rule.severity,\n path: file.path,\n line: statement.line,\n message,\n subject,\n }\n return {\n ...partial,\n fingerprint: fingerprintFinding(partial, normalizeSqlText(statement.text)),\n }\n}\n","import { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport { qualifiedName } from '@/sql/qualifiedName.js'\nimport type { SqlStatement } from '@/sql/SqlStatement.js'\n\nexport const policyTable = (statement: SqlStatement): string | undefined => {\n const match =\n /^create policy .+? on ((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?)/.exec(\n normalizeSqlText(statement.text),\n )\n return match?.[1] === undefined ? undefined : qualifiedName(match[1])\n}\n","import { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport { makeSqlFinding } from '@/rules/makeSqlFinding.js'\nimport { policyTable } from '@/rules/policyTable.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\n\nexport const authUidNotWrapped: SqlRule = {\n code: 'BDB004',\n name: 'auth-uid-not-wrapped',\n severity: 'warn',\n run: (set) =>\n set.flatMap((file) =>\n file.statements\n .filter((statement) => {\n const text = normalizeSqlText(statement.text)\n return (\n text.startsWith('create policy') &&\n /(?<!\\(select )auth\\.(?:uid|jwt)\\(\\)/.test(text)\n )\n })\n .map((statement) =>\n makeSqlFinding(\n authUidNotWrapped,\n { file, statement },\n policyTable(statement) ?? '',\n 'auth.uid() or auth.jwt() is re-evaluated per row; wrap it as (select auth.uid()) so Postgres caches it as an initplan',\n ),\n ),\n ),\n}\n","import { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport { makeSqlFinding } from '@/rules/makeSqlFinding.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\nimport { qualifiedName } from '@/sql/qualifiedName.js'\n\nexport const definerWithoutSearchPath: SqlRule = {\n code: 'BDB005',\n name: 'definer-without-search-path',\n severity: 'warn',\n run: (set) =>\n set.flatMap((file) =>\n file.statements.flatMap((statement) => {\n const text = normalizeSqlText(statement.text)\n const head =\n /^create (?:or replace )?(?:function|procedure) ((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?)\\s*\\(/.exec(\n text,\n )\n if (\n !head?.[1] ||\n !text.includes(' security definer') ||\n text.includes(' set search_path')\n ) {\n return []\n }\n return [\n makeSqlFinding(\n definerWithoutSearchPath,\n { file, statement },\n qualifiedName(head[1]),\n 'SECURITY DEFINER function without \"set search_path\": a caller can shadow the objects it touches',\n ),\n ]\n }),\n ),\n}\n","import { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport { makeSqlFinding } from '@/rules/makeSqlFinding.js'\nimport { policyTable } from '@/rules/policyTable.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\n\nexport const permissivePolicy: SqlRule = {\n code: 'BDB001',\n name: 'permissive-policy',\n severity: 'warn',\n run: (set) =>\n set.flatMap((file) =>\n file.statements\n .filter((statement) => {\n const text = normalizeSqlText(statement.text)\n return (\n text.startsWith('create policy') &&\n /(?:using|with check) \\( ?true ?\\)/.test(text)\n )\n })\n .map((statement) =>\n makeSqlFinding(\n permissivePolicy,\n { file, statement },\n policyTable(statement) ?? '',\n 'policy is permissive: using (true) or with check (true) lets every row through for the granted role',\n ),\n ),\n ),\n}\n","import { policyTable } from '@/rules/policyTable.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\n\nexport const policyTables = (set: MigrationFile[]): Set<string> => {\n const tables = new Set<string>()\n for (const file of set)\n for (const statement of file.statements) {\n const table = policyTable(statement)\n if (table) tables.add(table)\n }\n return tables\n}\n","import { matchedTables } from '@/rules/matchedTables.js'\nimport type { StatementRef } from '@/rules/StatementRef.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\n\n/** Tables whose row level security a migration enables, mapped to that statement. */\nexport const rlsEnabledTables = (\n set: MigrationFile[],\n): Map<string, StatementRef> =>\n matchedTables(\n set,\n /^alter table (?:if exists )?(?:only )?((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?) enable row level security/,\n )\n","import { makeSqlFinding } from '@/rules/makeSqlFinding.js'\nimport { policyTables } from '@/rules/policyTables.js'\nimport { rlsEnabledTables } from '@/rules/rlsEnabledTables.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\n\nexport const rlsEnabledNoPolicy: SqlRule = {\n code: 'BDB002',\n name: 'rls-enabled-no-policy',\n severity: 'warn',\n run: (set) => {\n const withPolicy = policyTables(set)\n return [...rlsEnabledTables(set)]\n .filter(([table]) => !withPolicy.has(table))\n .map(([table, ref]) =>\n makeSqlFinding(\n rlsEnabledNoPolicy,\n ref,\n table,\n 'RLS is enabled but no migration defines a policy: only the service role can reach this table',\n ),\n )\n },\n}\n","import { createdTables } from '@/rules/createdTables.js'\nimport { makeSqlFinding } from '@/rules/makeSqlFinding.js'\nimport { rlsEnabledTables } from '@/rules/rlsEnabledTables.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\n\nexport const tableWithoutRls: SqlRule = {\n code: 'BDB003',\n name: 'table-without-rls',\n severity: 'warn',\n run: (set) => {\n const enabled = rlsEnabledTables(set)\n return [...createdTables(set)]\n .filter(([table]) => !enabled.has(table))\n .map(([table, ref]) =>\n makeSqlFinding(\n tableWithoutRls,\n ref,\n table,\n 'table in public never enables row level security: it is readable through the Data API by anyone holding the anon key',\n ),\n )\n },\n}\n","import { authUidNotWrapped } from '@/rules/authUidNotWrapped.js'\nimport { definerWithoutSearchPath } from '@/rules/definerWithoutSearchPath.js'\nimport { permissivePolicy } from '@/rules/permissivePolicy.js'\nimport { rlsEnabledNoPolicy } from '@/rules/rlsEnabledNoPolicy.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\nimport { tableWithoutRls } from '@/rules/tableWithoutRls.js'\n\nexport const SQL_RULES: SqlRule[] = [\n permissivePolicy,\n rlsEnabledNoPolicy,\n tableWithoutRls,\n authUidNotWrapped,\n definerWithoutSearchPath,\n]\n","import type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport { compareFindings } from '@/model/compareFindings.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { SQL_RULES } from '@/rules/SQL_RULES.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\n\nexport const runSqlRules = (\n set: MigrationFile[],\n disabled: DisableEntry[],\n): Finding[] =>\n SQL_RULES.filter((rule) => !isDisabled(rule.code, disabled))\n .flatMap((rule) => rule.run(set))\n .sort(compareFindings)\n","import { readdirSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\nimport { splitSqlStatements } from '@/sql/splitSqlStatements.js'\n\nexport const readMigrationSet = (\n root: string,\n migrationsDir: string,\n): MigrationFile[] =>\n readdirSync(join(root, migrationsDir))\n .filter((name) => name.endsWith('.sql'))\n .sort()\n .map((name) => ({\n path: `${migrationsDir.replaceAll('\\\\', '/')}/${name}`,\n statements: splitSqlStatements(\n readFileSync(join(root, migrationsDir, name), 'utf8'),\n ),\n }))\n","/**\n * End offset (exclusive) of the string, quoted identifier or dollar-quoted\n * body that starts at `index`, or undefined when nothing quoted starts there.\n * An unterminated span runs to the end of the text.\n */\nexport const quotedSpanEnd = (\n sql: string,\n index: number,\n): number | undefined => {\n const dollar = /^\\$[a-z_]*\\$/i.exec(sql.slice(index, index + 64))\n if (dollar) {\n const end = sql.indexOf(dollar[0], index + dollar[0].length)\n return end === -1 ? sql.length : end + dollar[0].length\n }\n const quote = sql[index]\n if (quote !== \"'\" && quote !== '\"') return undefined\n const end = sql.indexOf(quote, index + 1)\n return end === -1 ? sql.length : end + 1\n}\n","import { quotedSpanEnd } from '@/sql/quotedSpanEnd.js'\n\n// Comments become nothing but their newlines, so the line numbers of what\n// follows are unchanged. Strings, quoted identifiers and dollar-quoted bodies\n// are copied through untouched: a `--` inside them is data.\nexport const stripSqlComments = (sql: string): string => {\n let out = ''\n let index = 0\n while (index < sql.length) {\n const quoted = quotedSpanEnd(sql, index)\n if (quoted !== undefined) {\n out += sql.slice(index, quoted)\n index = quoted\n } else if (sql.startsWith('--', index)) {\n const end = sql.indexOf('\\n', index)\n index = end === -1 ? sql.length : end\n } else if (sql.startsWith('/*', index)) {\n const end = sql.indexOf('*/', index + 2)\n const stop = end === -1 ? sql.length : end + 2\n out += sql.slice(index, stop).replaceAll(/[^\\n]/g, '')\n index = stop\n } else {\n out += sql.charAt(index)\n index += 1\n }\n }\n return out\n}\n","import { quotedSpanEnd } from '@/sql/quotedSpanEnd.js'\nimport type { SqlStatement } from '@/sql/SqlStatement.js'\nimport { stripSqlComments } from '@/sql/stripSqlComments.js'\n\nexport const splitSqlStatements = (sql: string): SqlStatement[] => {\n const text = stripSqlComments(sql)\n const statements: SqlStatement[] = []\n let start = 0\n const flush = (end: number): void => {\n const raw = text.slice(start, end)\n const leading = raw.length - raw.trimStart().length\n const body = raw.trim()\n if (body) {\n const line =\n 1 + (text.slice(0, start + leading).match(/\\n/g)?.length ?? 0)\n statements.push({ text: body, line })\n }\n start = end + 1\n }\n let index = 0\n while (index < text.length) {\n const quoted = quotedSpanEnd(text, index)\n if (quoted !== undefined) index = quoted\n else {\n if (text[index] === ';') flush(index)\n index += 1\n }\n }\n flush(text.length)\n return statements\n}\n","import { runDrizzleLint } from '@/adapters/drizzle/runDrizzleLint.js'\nimport { runPrismaLint } from '@/adapters/prisma/runPrismaLint.js'\nimport { runSqliteChecks } from '@/adapters/sqlite/runSqliteChecks.js'\nimport { runSquawk } from '@/adapters/squawk/runSquawk.js'\nimport type { CheckContext } from '@/check/CheckContext.js'\nimport { compareFindings } from '@/model/compareFindings.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { runPostgrestRules } from '@/postgrest/runPostgrestRules.js'\nimport { indexedColumns } from '@/rules/indexedColumns.js'\nimport { runSqlRules } from '@/rules/runSqlRules.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\nimport { readMigrationSet } from '@/sql/readMigrationSet.js'\n\n/** Every static adapter the configuration enables, in one sorted list. Errors propagate. */\nexport const runCheck = ({ root, config, runner }: CheckContext): Finding[] => {\n const findings: Finding[] = []\n const set: MigrationFile[] = config.supabase\n ? readMigrationSet(root, config.supabase.migrations)\n : []\n if (config.supabase) {\n findings.push(\n ...runSqlRules(set, config.disable),\n ...runSquawk(runner, root, set, config.disable),\n )\n }\n if (config.prisma) {\n findings.push(\n ...runPrismaLint(runner, root, config.prisma.schema, config.disable),\n )\n }\n if (config.drizzle)\n findings.push(\n ...runDrizzleLint(runner, root, config.drizzle, config.disable),\n )\n if (config.sqlite) {\n findings.push(\n ...runSqliteChecks(runner, root, config.sqlite.files, config.disable),\n )\n }\n if (config.postgrest) {\n findings.push(\n ...runPostgrestRules(\n root,\n config.postgrest.roots,\n indexedColumns(set),\n config.disable,\n ),\n )\n }\n return findings.sort(compareFindings)\n}\n","import { createRequire } from 'node:module'\n\n// Read at runtime from the package's own manifest so the bundle never carries\n// a copy that drifts from `package.json`. Both `dist/cli.js` and `src/` sit\n// one level below the package root.\nexport const PACKAGE_VERSION: string = (\n createRequire(import.meta.url)('../package.json') as { version: string }\n).version\n","import { renderFindings } from '@/check/renderFindings.js'\nimport { renderFindingsJson } from '@/check/renderFindingsJson.js'\nimport { runCheck } from '@/check/runCheck.js'\nimport type { CommandIo } from '@/commands/CommandIo.js'\nimport { parseCommandArgs } from '@/commands/parseCommandArgs.js'\nimport { reportCommandError } from '@/commands/reportCommandError.js'\nimport { legacyConfigNotice } from '@/config/legacyConfigNotice.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { ExitCode } from '@/model/ExitCode.js'\n\nexport const checkCommand = (argv: string[], io: CommandIo): number => {\n try {\n const { values } = parseCommandArgs(argv, { json: { type: 'boolean' } })\n const config = readConfig(io.root)\n const notice = legacyConfigNotice(config)\n if (notice) io.stderr(`${notice}\\n`)\n const findings = runCheck({\n root: io.root,\n config,\n runner: io.runner,\n })\n io.stdout(\n `${values['json'] === true ? renderFindingsJson(findings) : renderFindings(findings)}\\n`,\n )\n return findings.length > 0 ? ExitCode.FINDINGS : ExitCode.OK\n } catch (error) {\n return reportCommandError(error, io.stderr)\n }\n}\n","import type { StageResult } from '@/gate/StageResult.js'\nimport { ExitCode } from '@/model/ExitCode.js'\n\nexport const gateExitCode = (results: StageResult[]): number => {\n if (results.some((result) => result.status === 'failed-to-run'))\n return ExitCode.INFRASTRUCTURE\n if (results.some((result) => result.status === 'findings'))\n return ExitCode.FINDINGS\n return ExitCode.OK\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { runAudit } from '@/audit/runAudit.js'\nimport { BASELINE_FILENAME } from '@/baseline/BASELINE_FILENAME.js'\nimport { classifyFindings } from '@/baseline/classifyFindings.js'\nimport { readBaseline } from '@/baseline/readBaseline.js'\nimport type { CheckContext } from '@/check/CheckContext.js'\nimport { runCheck } from '@/check/runCheck.js'\nimport { perfStage } from '@/gate/perfStage.js'\nimport type { Stage } from '@/gate/Stage.js'\n\n// A recorded baseline is the migration plan; the gate must honour it, or\n// recording debt could never turn the gate green. Audit runs when the project\n// is linked unless the configuration says otherwise: a linked project whose\n// CI has no token must switch it off explicitly rather than pass by accident.\nexport const gateStages = (context: CheckContext): Stage[] => {\n const hasBaseline = existsSync(join(context.root, BASELINE_FILENAME))\n const linked = existsSync(join(context.root, 'supabase/.temp/project-ref'))\n return [\n hasBaseline\n ? {\n name: 'baseline-check',\n run: () =>\n classifyFindings(runCheck(context), readBaseline(context.root)).new,\n }\n : { name: 'check', run: () => runCheck(context) },\n {\n name: 'audit',\n run: () =>\n context.config.audit.inGate && linked\n ? runAudit({ ...context, target: { linked: true } })\n : 'not-applicable',\n },\n perfStage(context),\n ]\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BENCH_RECORD_FILENAME } from '@/bench/BENCH_RECORD_FILENAME.js'\nimport type { CheckContext } from '@/check/CheckContext.js'\nimport { perfBenchFindings } from '@/gate/perfBenchFindings.js'\nimport { perfDiffFindings } from '@/gate/perfDiffFindings.js'\nimport type { Stage } from '@/gate/Stage.js'\nimport type { StageOutcome } from '@/gate/StageOutcome.js'\nimport { PERF_SNAPSHOT_FILENAME } from '@/perf/PERF_SNAPSHOT_FILENAME.js'\nimport { resolvePostgresTarget } from '@/postgres/resolvePostgresTarget.js'\n\n// The stage says what it did not measure: a green stage that measured\n// nothing is exactly the false comfort the gate exists to remove.\nexport const perfStage = (context: CheckContext): Stage => ({\n name: 'perf',\n run: (): StageOutcome => {\n if (!context.config.perf.inGate) return 'not-applicable'\n const target = resolvePostgresTarget(context.root, {})\n if (!target)\n return {\n skipped: 'no linked project with SUPABASE_DB_PASSWORD',\n }\n const hasSnapshot = existsSync(join(context.root, PERF_SNAPSHOT_FILENAME))\n const hasRecord = existsSync(join(context.root, BENCH_RECORD_FILENAME))\n if (!hasSnapshot && !hasRecord)\n return {\n skipped:\n 'no perf snapshot and no bench record; run \"perf snapshot\" or \"perf bench --record\"',\n }\n return [\n ...(hasSnapshot ? perfDiffFindings(context, target) : []),\n ...(hasRecord ? perfBenchFindings(context, target) : []),\n ]\n },\n})\n","export const BENCH_RECORD_FILENAME = '.codeality-db-bench.json'\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BENCH_RECORD_FILENAME } from '@/bench/BENCH_RECORD_FILENAME.js'\nimport type { BenchRecord } from '@/bench/BenchRecord.js'\nimport { ConfigError } from '@/config/ConfigError.js'\n\n/** `undefined` when the record is absent: the caller decides what that means. */\nexport const readBenchRecord = (root: string): BenchRecord | undefined => {\n const path = join(root, BENCH_RECORD_FILENAME)\n if (!existsSync(path)) return undefined\n const document = JSON.parse(\n readFileSync(path, 'utf8'),\n ) as Partial<BenchRecord>\n if (document.schemaVersion !== 1)\n throw new ConfigError(\n `${BENCH_RECORD_FILENAME} is not a version 1 bench record`,\n )\n return {\n schemaVersion: 1,\n toolVersion: document.toolVersion ?? '',\n takenAt: document.takenAt ?? '',\n host: document.host ?? '',\n entries: document.entries ?? {},\n }\n}\n","import type { BenchFindingsInput } from '@/bench/BenchFindingsInput.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\n// BDB913 warns; the other two bench codes fail the gate. The fingerprint\n// context is the query file, not the line: it is always 1, so a line would\n// tell two findings on the same file apart no better than the code already does.\nexport const benchFinding = (\n input: BenchFindingsInput,\n code: string,\n subject: string,\n message: string,\n): Finding => {\n const partial = {\n code,\n severity: code === 'BDB913' ? ('warn' as const) : ('error' as const),\n path: `${input.benchDir}/${input.file}`,\n line: 1,\n message,\n subject,\n }\n return { ...partial, fingerprint: fingerprintFinding(partial, input.file) }\n}\n","/** BDB913 fires when the planner's row estimate is off from the actual rows by this factor or more. */\nexport const ESTIMATE_RATIO_LIMIT = 100\n","/** A regression (BDB901, BDB911) must add at least this many milliseconds: a percentage of a sub-millisecond time is noise. */\nexport const REGRESSION_FLOOR_MS = 5\n","import type { BenchEntry } from '@/bench/BenchEntry.js'\nimport { benchFinding } from '@/bench/benchFinding.js'\nimport type { BenchFindingsInput } from '@/bench/BenchFindingsInput.js'\nimport type { BenchJudgement } from '@/bench/BenchJudgement.js'\nimport { ESTIMATE_RATIO_LIMIT } from '@/bench/ESTIMATE_RATIO_LIMIT.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { REGRESSION_FLOOR_MS } from '@/perf/REGRESSION_FLOOR_MS.js'\n\n// Three codes: BDB911 a query that got materially slower against its record,\n// BDB912 a sequential scan the record did not have (over a big table, or over\n// a relation the record used to reach by index), BDB913 a planner estimate\n// far off from what actually happened.\nexport const benchFindings = (\n input: BenchFindingsInput,\n recorded: BenchEntry | undefined,\n current: BenchEntry,\n judgement: BenchJudgement,\n): Finding[] => {\n const { perf, disabled } = judgement\n const findings: Finding[] = []\n const add = (code: string, subject: string, message: string): void => {\n findings.push(benchFinding(input, code, subject, message))\n }\n const slower =\n recorded &&\n current.medianMs >=\n recorded.medianMs * (1 + perf.regressionPercent / 100) &&\n current.medianMs - recorded.medianMs >= REGRESSION_FLOOR_MS\n if (slower)\n add(\n 'BDB911',\n input.file,\n `median ${recorded.medianMs.toFixed(2)} ms -> ${current.medianMs.toFixed(2)} ms (+${String(Math.round((current.medianMs / recorded.medianMs - 1) * 100))}%) over ${String(current.runs)} runs`,\n )\n const newScans = recorded\n ? current.seqScans.filter(\n (scan) =>\n !recorded.seqScans.some((r) => r.relation === scan.relation) &&\n (scan.rows >= perf.seqScanRows ||\n recorded.indexScans.includes(scan.relation)),\n )\n : []\n for (const scan of newScans)\n add(\n 'BDB912',\n scan.relation,\n `sequential scan over ${scan.rows.toLocaleString('en-US')} rows of \"${scan.relation}\" where the record had ${recorded?.indexScans.includes(scan.relation) ? 'an index scan' : 'none'}`,\n )\n if (current.worstEstimateRatio >= ESTIMATE_RATIO_LIMIT)\n add(\n 'BDB913',\n input.file,\n `planner estimate off by ${String(Math.round(current.worstEstimateRatio))}x: run ANALYZE or raise the statistics target`,\n )\n return findings.filter((f) => !isDisabled(f.code, disabled))\n}\n","import { readdirSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { BenchQuery } from '@/bench/BenchQuery.js'\nimport { RUNS_HEADER } from '@/bench/RUNS_HEADER.js'\nimport { ConfigError } from '@/config/ConfigError.js'\nimport { isDirectory } from '@/config/isDirectory.js'\nimport { isPositiveInteger } from '@/config/isPositiveInteger.js'\nimport { splitSqlStatements } from '@/sql/splitSqlStatements.js'\n\nexport const readBenchQueries = (\n root: string,\n benchDir: string,\n defaultRuns: number,\n): BenchQuery[] => {\n const dir = join(root, benchDir)\n if (!isDirectory(dir)) throw new ConfigError(`${benchDir} is not a directory`)\n return readdirSync(dir)\n .filter((name) => name.endsWith('.sql'))\n .sort()\n .map((name) => {\n const raw = readFileSync(join(dir, name), 'utf8')\n const match = RUNS_HEADER.exec(raw)\n const runs = match?.[1] ? Number(match[1]) : defaultRuns\n if (!isPositiveInteger(runs))\n throw new ConfigError(`${name}: -- runs: must be a positive integer`)\n const statements = splitSqlStatements(raw)\n const sql = statements[0]?.text\n if (sql === undefined) throw new ConfigError(`${name} holds no statement`)\n // A clear message, not the boundary: the server enforces that one.\n if (statements.length > 1)\n throw new ConfigError(\n `${name} holds more than one statement; a bench file is one statement`,\n )\n return { file: name, sql, runs }\n })\n}\n","/** A first line such as `-- runs: 20` overriding a bench query's default run count; the value is checked by the reader. */\nexport const RUNS_HEADER = /^--\\s*runs:\\s*(\\S+)/\n","export const median = (values: number[]): number => {\n const sorted = [...values].sort((a, b) => a - b)\n const mid = Math.floor(sorted.length / 2)\n if (sorted.length % 2 === 1) return sorted[mid] ?? 0\n return ((sorted[mid - 1] ?? 0) + (sorted[mid] ?? 0)) / 2\n}\n","/** A plan node counts toward `worstEstimateRatio` only once its plan or actual rows reach this floor; a stale estimate on a handful of rows never matters. */\nexport const ESTIMATE_MIN_ROWS = 1000\n","import type { PlanNode } from '@/bench/PlanNode.js'\n\nexport const walkPlan = (\n node: PlanNode,\n visit: (node: PlanNode) => void,\n): void => {\n visit(node)\n for (const child of node.Plans ?? []) walkPlan(child, visit)\n}\n","import { ESTIMATE_MIN_ROWS } from '@/bench/ESTIMATE_MIN_ROWS.js'\nimport type { ExplainDocument } from '@/bench/ExplainDocument.js'\nimport type { ExplainSummary } from '@/bench/ExplainSummary.js'\nimport type { SeqScanStat } from '@/bench/SeqScanStat.js'\nimport { walkPlan } from '@/bench/walkPlan.js'\n\nexport const summarizeExplain = (explainJson: string): ExplainSummary => {\n const scanKinds = ['Index Scan', 'Index Only Scan', 'Bitmap Heap Scan']\n const parsed: unknown = JSON.parse(explainJson)\n const first = Array.isArray(parsed) ? (parsed[0] as unknown) : undefined\n if (\n typeof first !== 'object' ||\n first === null ||\n !('Plan' in first) ||\n !('Execution Time' in first)\n )\n throw new Error('psql output is not an EXPLAIN document')\n const document = first as ExplainDocument\n const seqScans: SeqScanStat[] = []\n const indexScans: string[] = []\n let worstEstimateRatio = 0\n walkPlan(document.Plan, (node) => {\n const relation = node['Relation Name']\n if (node['Node Type'] === 'Seq Scan' && relation)\n seqScans.push({\n relation,\n rows:\n (node['Actual Rows'] + (node['Rows Removed by Filter'] ?? 0)) *\n node['Actual Loops'],\n })\n if (relation && scanKinds.includes(node['Node Type']))\n indexScans.push(relation)\n const plan = node['Plan Rows']\n const actual = node['Actual Rows']\n if (plan > 0 && actual > 0 && Math.max(plan, actual) >= ESTIMATE_MIN_ROWS) {\n const ratio = Math.max(\n (plan + 1) / (actual + 1),\n (actual + 1) / (plan + 1),\n )\n if (ratio > worstEstimateRatio) worstEstimateRatio = ratio\n }\n })\n return {\n executionMs: document['Execution Time'],\n seqScans,\n indexScans,\n worstEstimateRatio,\n }\n}\n","import type { BenchEntry } from '@/bench/BenchEntry.js'\nimport type { BenchQuery } from '@/bench/BenchQuery.js'\nimport type { ExplainSummary } from '@/bench/ExplainSummary.js'\nimport { median } from '@/bench/median.js'\nimport { summarizeExplain } from '@/bench/summarizeExplain.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\n\n/** Runs the query once as a warm-up (discarded), then `query.runs` times, taking the median. A failure names the file. */\nexport const runBenchQuery = (\n session: PsqlSession,\n query: BenchQuery,\n): BenchEntry => {\n const times: number[] = []\n let last: ExplainSummary | undefined\n try {\n session.explain(query.sql)\n for (let run = 0; run < query.runs; run += 1) {\n last = summarizeExplain(session.explain(query.sql))\n times.push(last.executionMs)\n }\n } catch (error) {\n throw new Error(`${query.file}: ${(error as Error).message}`, {\n cause: error,\n })\n }\n if (!last) throw new Error(`${query.file}: zero runs`)\n return {\n medianMs: median(times),\n minMs: Math.min(...times),\n runs: query.runs,\n seqScans: last.seqScans,\n indexScans: last.indexScans,\n worstEstimateRatio: last.worstEstimateRatio,\n }\n}\n","import type { BenchEntry } from '@/bench/BenchEntry.js'\nimport { benchFindings } from '@/bench/benchFindings.js'\nimport type { BenchJudgement } from '@/bench/BenchJudgement.js'\nimport type { BenchRecord } from '@/bench/BenchRecord.js'\nimport type { BenchResult } from '@/bench/BenchResult.js'\nimport { readBenchQueries } from '@/bench/readBenchQueries.js'\nimport { runBenchQuery } from '@/bench/runBenchQuery.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { Improvement } from '@/perf/Improvement.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\n\nexport const runBench = (\n session: PsqlSession,\n root: string,\n recorded: BenchRecord | undefined,\n judgement: BenchJudgement,\n): BenchResult => {\n const { perf } = judgement\n const queries = readBenchQueries(root, perf.benchDir, perf.benchRuns)\n const entries: Record<string, BenchEntry> = {}\n const findings: Finding[] = []\n const improvements: Improvement[] = []\n for (const query of queries) {\n const entry = runBenchQuery(session, query)\n entries[query.file] = entry\n const recordedEntry = recorded?.entries[query.file]\n findings.push(\n ...benchFindings(\n { file: query.file, benchDir: perf.benchDir },\n recordedEntry,\n entry,\n judgement,\n ),\n )\n if (\n recordedEntry &&\n entry.medianMs <=\n recordedEntry.medianMs * (1 - perf.regressionPercent / 100)\n )\n improvements.push({\n subject: query.file,\n previousMs: recordedEntry.medianMs,\n currentMs: entry.medianMs,\n calls: entry.runs,\n savedMs: recordedEntry.medianMs - entry.medianMs,\n })\n }\n return { entries, findings, improvements }\n}\n","import { randomBytes } from 'node:crypto'\n\n/** A random `dbq_<hex>` dollar-quote tag whose `$tag$` never occurs in `text`, so quoting `text` with it cannot end early. */\nexport const dollarTag = (\n text: string,\n next: () => string = () => randomBytes(8).toString('hex'),\n): string => {\n for (;;) {\n const tag = `dbq_${next()}`\n if (!text.includes(`$${tag}$`)) return tag\n }\n}\n","/** The session setting a bench plan is handed back through, from inside the DO block to the next statement. */\nexport const PLAN_SETTING = 'dbq.plan'\n","/** The SQLSTATE the bench DO block raises, and catches, to roll back whatever the explained statement did. */\nexport const ROLLBACK_SQLSTATE = 'DBQRB'\n","import { dollarTag } from '@/postgres/dollarTag.js'\nimport { PLAN_SETTING } from '@/postgres/PLAN_SETTING.js'\nimport { ROLLBACK_SQLSTATE } from '@/postgres/ROLLBACK_SQLSTATE.js'\n\n/**\n * EXPLAIN ANALYZE of `sql` run through a PL/pgSQL cursor inside a DO block.\n * The server, not a lexer here, keeps it to one statement: a cursor over a\n * multi-statement string is refused (\"cannot open multi-query plan as\n * cursor\"), so nothing after the EXPLAIN ever runs. It runs in an inner\n * block that always ends by raising ROLLBACK_SQLSTATE, so its subtransaction\n * is rolled back: EXPLAIN ANALYZE of CREATE TABLE AS, SELECT INTO or CREATE\n * MATERIALIZED VIEW writes even in a read-only transaction, and this undoes\n * it. The plan survives in a PL/pgSQL variable and comes back through a\n * session setting, read by the next statement.\n */\nexport const explainDoBlock = (sql: string): string => {\n const quote = dollarTag(sql)\n const body = dollarTag(`${sql}$${quote}$`)\n return `do $${body}$ declare c refcursor; p text; begin begin open c for execute 'explain (analyze, buffers, format json) ' || $${quote}$${sql}$${quote}$; fetch c into p; close c; raise exception using errcode = '${ROLLBACK_SQLSTATE}'; exception when sqlstate '${ROLLBACK_SQLSTATE}' then null; end; if p is null then raise exception 'the statement produced no plan'; end if; perform set_config('${PLAN_SETTING}', p, false); end $${body}$`\n}\n","/** The `psql` argument vector for one session: read-only and timed out before the statements run, every call. */\nexport const psqlArguments = (\n url: string,\n timeoutMs: number,\n statements: string[],\n): string[] => [\n url,\n '-X',\n '-q',\n '-A',\n '-t',\n '-v',\n 'ON_ERROR_STOP=1',\n '-c',\n 'set default_transaction_read_only = on',\n '-c',\n `set statement_timeout = ${String(timeoutMs)}`,\n ...statements.flatMap((statement) => ['-c', statement]),\n]\n","/** Replaces the password in any `scheme://user:password@host` occurrence with `***`, so a connection string psql echoes back in an error never carries a real credential. */\nexport const redactConnectionSecrets = (text: string): string =>\n text.replace(/(\\w+:\\/\\/[^:/\\s@]+:)[^@\\s]+@/g, '$1***@')\n","import { explainDoBlock } from '@/postgres/explainDoBlock.js'\nimport { PLAN_SETTING } from '@/postgres/PLAN_SETTING.js'\nimport type { PostgresTarget } from '@/postgres/PostgresTarget.js'\nimport { psqlArguments } from '@/postgres/psqlArguments.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\nimport { redactConnectionSecrets } from '@/postgres/redactConnectionSecrets.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\n// Every call is one psql process: the pooler ignores PGOPTIONS, so the\n// read-only mode is a session SET sent before the query, every time. The\n// password travels in the environment and never in an argument or a message.\nexport const psqlSession = (\n runner: CommandRunner,\n root: string,\n target: PostgresTarget,\n timeoutMs: number,\n): PsqlSession => {\n const run = (statements: string[]): string => {\n const result = runner(\n 'psql',\n psqlArguments(target.url, timeoutMs, statements),\n {\n cwd: root,\n systemPathOnly: true,\n env: {\n ...(target.password === undefined\n ? {}\n : { PGPASSWORD: target.password }),\n PGCONNECT_TIMEOUT: '10',\n },\n },\n )\n if (result.missing)\n throw new ToolMissingError('psql', 'install the PostgreSQL client')\n if (result.status !== 0)\n throw new Error(\n `psql failed: ${redactConnectionSecrets(result.stderr.trim())}`,\n )\n return result.stdout\n }\n return {\n rows: (sql) => {\n const out = run([\n `select coalesce(json_agg(t), '[]'::json) from (${sql}) t`,\n ]).trim()\n return out === '' ? [] : (JSON.parse(out) as unknown[])\n },\n explain: (sql) =>\n run([\n explainDoBlock(sql),\n `select current_setting('${PLAN_SETTING}')`,\n ]).trim(),\n }\n}\n","import { readBenchRecord } from '@/bench/readBenchRecord.js'\nimport { runBench } from '@/bench/runBench.js'\nimport type { CheckContext } from '@/check/CheckContext.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { PostgresTarget } from '@/postgres/PostgresTarget.js'\nimport { psqlSession } from '@/postgres/psqlSession.js'\n\n/** The gate's own bench: replays the recorded queries and compares against the recorded medians. */\nexport const perfBenchFindings = (\n { root, config, runner }: CheckContext,\n target: PostgresTarget,\n): Finding[] => {\n const session = psqlSession(runner, root, target, config.perf.benchTimeoutMs)\n return runBench(session, root, readBenchRecord(root), {\n perf: config.perf,\n disabled: config.disable,\n }).findings\n}\n","import type { StatementWindow } from '@/perf/StatementWindow.js'\n\nexport const statementSubject = (window: StatementWindow): string =>\n `${window.role}: ${window.text.slice(0, 80)}`\n","import type { PerfConfig } from '@/config/PerfConfig.js'\nimport type { Improvement } from '@/perf/Improvement.js'\nimport { statementSubject } from '@/perf/statementSubject.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\nexport const improvementsIn = (\n windows: StatementWindow[],\n perf: PerfConfig,\n): Improvement[] =>\n windows.reduce<Improvement[]>((improvements, window) => {\n if (\n window.previousMeanMs === null ||\n window.calls < perf.minCalls ||\n window.meanMs > window.previousMeanMs * (1 - perf.regressionPercent / 100)\n )\n return improvements\n return [\n ...improvements,\n {\n subject: statementSubject(window),\n previousMs: window.previousMeanMs,\n currentMs: window.meanMs,\n calls: window.calls,\n savedMs: (window.previousMeanMs - window.meanMs) * window.calls,\n },\n ]\n }, [])\n","import type { PerfConfig } from '@/config/PerfConfig.js'\nimport { REGRESSION_FLOOR_MS } from '@/perf/REGRESSION_FLOOR_MS.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\nexport const isRegression = (\n window: StatementWindow,\n perf: PerfConfig,\n): boolean =>\n window.previousMeanMs !== null &&\n window.meanMs >= REGRESSION_FLOOR_MS &&\n window.meanMs >= window.previousMeanMs * (1 + perf.regressionPercent / 100) &&\n window.meanMs - window.previousMeanMs >= REGRESSION_FLOOR_MS\n","import type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\n// Severity follows from the code alone: BDB901 (a regression) is the only\n// perf rule that fails the gate; the rest warn. Keeping severity out of the\n// parameter list holds this at 4 params, the monorepo's max-params budget.\nexport const perfFinding = (\n code: string,\n subject: string,\n context: string,\n message: string,\n): Finding => {\n const partial = {\n code,\n severity: code === 'BDB901' ? ('error' as const) : ('warn' as const),\n path: 'postgres',\n line: 0,\n message,\n subject,\n }\n return { ...partial, fingerprint: fingerprintFinding(partial, context) }\n}\n","import type { StatementWindow } from '@/perf/StatementWindow.js'\n\nexport const statementContext = (window: StatementWindow): string =>\n `${window.role}|${window.queryId}`\n","import type { PerfConfig } from '@/config/PerfConfig.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { isRegression } from '@/perf/isRegression.js'\nimport { perfFinding } from '@/perf/perfFinding.js'\nimport { statementContext } from '@/perf/statementContext.js'\nimport { statementSubject } from '@/perf/statementSubject.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\n// BDB901: the mean crossed from a real previous reading into a materially\n// slower one. `isRegression` narrows out `previousMeanMs === null` at\n// runtime, but not for the type checker, so the guard is repeated here.\nexport const statementRegressionFinding = (\n window: StatementWindow,\n perf: PerfConfig,\n): Finding | null => {\n if (!isRegression(window, perf) || window.previousMeanMs === null) return null\n const percent = Math.round((window.meanMs / window.previousMeanMs - 1) * 100)\n const sign = percent >= 0 ? '+' : ''\n return perfFinding(\n 'BDB901',\n statementSubject(window),\n statementContext(window),\n `mean ${window.previousMeanMs.toFixed(2)} ms -> ${window.meanMs.toFixed(2)} ms (${sign}${String(percent)}%) over ${window.calls.toLocaleString('en-US')} calls`,\n )\n}\n","import type { PerfConfig } from '@/config/PerfConfig.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { perfFinding } from '@/perf/perfFinding.js'\nimport { statementContext } from '@/perf/statementContext.js'\nimport { statementSubject } from '@/perf/statementSubject.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\n// BDB902: the statement is simply slow on its own terms, independent of\n// whether it regressed against its previous reading.\nexport const statementSlowFinding = (\n window: StatementWindow,\n perf: PerfConfig,\n): Finding | null => {\n if (window.meanMs < perf.slowMs) return null\n return perfFinding(\n 'BDB902',\n statementSubject(window),\n statementContext(window),\n `mean ${window.meanMs.toFixed(2)} ms over ${window.calls.toLocaleString('en-US')} calls, threshold ${perf.slowMs.toLocaleString('en-US')} ms`,\n )\n}\n","import type { Finding } from '@/model/Finding.js'\nimport { perfFinding } from '@/perf/perfFinding.js'\nimport { statementContext } from '@/perf/statementContext.js'\nimport { statementSubject } from '@/perf/statementSubject.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\n// BDB904: any temp blocks written mean a sort or hash spilled to disk during\n// the window.\nexport const statementSpillFinding = (\n window: StatementWindow,\n): Finding | null => {\n if (window.tempBlksWritten <= 0) return null\n return perfFinding(\n 'BDB904',\n statementSubject(window),\n statementContext(window),\n `wrote ${window.tempBlksWritten.toLocaleString('en-US')} temp blocks over ${window.calls.toLocaleString('en-US')} calls: a sort or hash spilled to disk`,\n )\n}\n","import type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { PerfConfig } from '@/config/PerfConfig.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { statementRegressionFinding } from '@/perf/statementRegressionFinding.js'\nimport { statementSlowFinding } from '@/perf/statementSlowFinding.js'\nimport { statementSpillFinding } from '@/perf/statementSpillFinding.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\nexport const statementFindings = (\n windows: StatementWindow[],\n perf: PerfConfig,\n disabled: DisableEntry[],\n): Finding[] =>\n windows\n .filter((window) => window.calls >= perf.minCalls)\n .flatMap((window) => [\n statementRegressionFinding(window, perf),\n statementSlowFinding(window, perf),\n statementSpillFinding(window),\n ])\n .filter((finding): finding is Finding => finding !== null)\n .filter((finding) => !isDisabled(finding.code, disabled))\n","import type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { PerfConfig } from '@/config/PerfConfig.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { perfFinding } from '@/perf/perfFinding.js'\nimport type { TableWindow } from '@/perf/TableWindow.js'\n\nexport const tableFindings = (\n windows: TableWindow[],\n perf: PerfConfig,\n disabled: DisableEntry[],\n): Finding[] =>\n windows\n .filter(\n (window) =>\n window.liveRows >= perf.seqScanRows && window.seqScan > window.idxScan,\n )\n .map((window) =>\n perfFinding(\n 'BDB903',\n window.name,\n window.name,\n `${window.seqScan.toLocaleString('en-US')} sequential scans against ${window.idxScan.toLocaleString('en-US')} index scans on ${window.liveRows.toLocaleString('en-US')} live rows`,\n ),\n )\n .filter((finding) => !isDisabled(finding.code, disabled))\n","import type { PerfSnapshot } from '@/perf/PerfSnapshot.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\n// A reset loses the old mean too, since the old totals were measured against\n// a different history; a new statement has nothing to regress from; a\n// counter falling back means the server-side stat itself reset underneath\n// us. All three cases fall back to the current absolute values.\nexport const windowStatements = (\n previous: PerfSnapshot,\n current: PerfSnapshot,\n): StatementWindow[] => {\n const reset = current.statsReset !== previous.statsReset\n return current.statements.map((statement): StatementWindow => {\n const match = previous.statements.find(\n (candidate) =>\n candidate.role === statement.role &&\n candidate.queryId === statement.queryId,\n )\n const fell =\n match !== undefined &&\n (statement.calls < match.calls ||\n statement.totalMs < match.totalMs ||\n statement.tempBlksWritten < match.tempBlksWritten)\n if (reset || match === undefined || fell) {\n const { calls, totalMs, tempBlksWritten } = statement\n return {\n role: statement.role,\n queryId: statement.queryId,\n text: statement.text,\n calls,\n totalMs,\n tempBlksWritten,\n meanMs: calls === 0 ? 0 : totalMs / calls,\n previousMeanMs: null,\n }\n }\n const calls = statement.calls - match.calls\n const totalMs = statement.totalMs - match.totalMs\n return {\n role: statement.role,\n queryId: statement.queryId,\n text: statement.text,\n calls,\n totalMs,\n tempBlksWritten: statement.tempBlksWritten - match.tempBlksWritten,\n meanMs: calls === 0 ? 0 : totalMs / calls,\n previousMeanMs: match.calls === 0 ? null : match.totalMs / match.calls,\n }\n })\n}\n","import type { PerfSnapshot } from '@/perf/PerfSnapshot.js'\nimport type { TableWindow } from '@/perf/TableWindow.js'\n\n// Same reset/new/fell rule as windowStatements, but liveRows is a live count\n// rather than a cumulative counter, so it is always the current absolute\n// value: only seqScan and idxScan are ever deltas.\nexport const windowTables = (\n previous: PerfSnapshot,\n current: PerfSnapshot,\n): TableWindow[] => {\n const reset = current.statsReset !== previous.statsReset\n return current.tables.map((table): TableWindow => {\n const match = previous.tables.find(\n (candidate) => candidate.name === table.name,\n )\n const fell =\n match !== undefined &&\n (table.seqScan < match.seqScan || table.idxScan < match.idxScan)\n if (reset || match === undefined || fell) {\n return {\n name: table.name,\n liveRows: table.liveRows,\n seqScan: table.seqScan,\n idxScan: table.idxScan,\n }\n }\n return {\n name: table.name,\n liveRows: table.liveRows,\n seqScan: table.seqScan - match.seqScan,\n idxScan: table.idxScan - match.idxScan,\n }\n })\n}\n","import type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { PerfConfig } from '@/config/PerfConfig.js'\nimport { compareFindings } from '@/model/compareFindings.js'\nimport { improvementsIn } from '@/perf/improvementsIn.js'\nimport { isRegression } from '@/perf/isRegression.js'\nimport type { PerfDiff } from '@/perf/PerfDiff.js'\nimport type { PerfSnapshot } from '@/perf/PerfSnapshot.js'\nimport { statementFindings } from '@/perf/statementFindings.js'\nimport { tableFindings } from '@/perf/tableFindings.js'\nimport { windowStatements } from '@/perf/windowStatements.js'\nimport { windowTables } from '@/perf/windowTables.js'\n\nexport const diffSnapshots = (\n previous: PerfSnapshot,\n current: PerfSnapshot,\n perf: PerfConfig,\n disabled: DisableEntry[],\n): PerfDiff => {\n const statementWindows = windowStatements(previous, current)\n const eligible = statementWindows.filter(\n (window) => window.calls >= perf.minCalls,\n )\n const improvements = improvementsIn(statementWindows, perf)\n const findings = [\n ...statementFindings(statementWindows, perf, disabled),\n ...tableFindings(windowTables(previous, current), perf, disabled),\n ].sort(compareFindings)\n return {\n from: previous.takenAt,\n to: current.takenAt,\n improvements,\n findings,\n savedMs: improvements.reduce(\n (sum, improvement) => sum + improvement.savedMs,\n 0,\n ),\n lostMs: eligible\n .filter((window) => isRegression(window, perf))\n .reduce(\n (sum, window) =>\n sum +\n (window.previousMeanMs === null\n ? 0\n : (window.meanMs - window.previousMeanMs) * window.calls),\n 0,\n ),\n }\n}\n","/** The read-only session timeout for the snapshot and diff queries against pg_stat views. */\nexport const QUERY_TIMEOUT_MS = 30000\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { ConfigError } from '@/config/ConfigError.js'\nimport { PERF_SNAPSHOT_FILENAME } from '@/perf/PERF_SNAPSHOT_FILENAME.js'\nimport type { PerfSnapshot } from '@/perf/PerfSnapshot.js'\n\nexport const readPerfSnapshot = (root: string): PerfSnapshot => {\n const path = join(root, PERF_SNAPSHOT_FILENAME)\n if (!existsSync(path)) {\n throw new ConfigError(\n `${PERF_SNAPSHOT_FILENAME} not found; run \"codeality-db perf snapshot\"`,\n )\n }\n const document = JSON.parse(\n readFileSync(path, 'utf8'),\n ) as Partial<PerfSnapshot>\n if (document.schemaVersion !== 1) {\n throw new ConfigError(\n `${PERF_SNAPSHOT_FILENAME} is not a version 1 snapshot`,\n )\n }\n return {\n schemaVersion: 1,\n toolVersion: document.toolVersion ?? '',\n takenAt: document.takenAt ?? '',\n host: document.host ?? '',\n statsReset: document.statsReset ?? null,\n statements: document.statements ?? [],\n tables: document.tables ?? [],\n }\n}\n","export const PERF_SNAPSHOT_FILENAME = '.codeality-db-perf.json'\n","/** Statements Supabase, PostgREST and this tool run on their own; none of them is the application's. */\nexport const PLATFORM_NOISE: RegExp[] = [\n /^select pg_sleep\\(/i,\n /pg_timezone_names/i,\n /pg_stat_statements/i,\n /^WITH -- Recursively get the base types of domains/,\n /^SELECT wal->>/,\n /^COPY /i,\n /^select coalesce\\(json_agg\\(t\\)/i,\n]\n","import { PLATFORM_NOISE } from '@/perf/PLATFORM_NOISE.js'\n\n/** Built-in noise by pattern; `perf.ignore` entries are plain substrings of the normalized text. */\nexport const isPlatformNoise = (text: string, ignore: string[]): boolean =>\n PLATFORM_NOISE.some((pattern) => pattern.test(text)) ||\n ignore.some((fragment) => text.includes(fragment))\n","/**\n * Top-level plannable DML of the application's roles; roles are validated\n * identifiers (ROLE_NAME_PATTERN), so quoting them is enough. pg_stat_statements\n * replaces constants only in plannable statements: utility text (CREATE ROLE\n * ... PASSWORD, SET, function bodies) is stored verbatim, so it never enters\n * the snapshot, and neither does the tool's own EXPLAIN.\n */\nexport const statementStatsSql = (roles: string[]): string =>\n `select r.rolname as role, s.queryid::text as query_id,\n left(regexp_replace(s.query, '\\\\s+', ' ', 'g'), 200) as text,\n s.calls::bigint as calls, s.total_exec_time as total_ms, s.rows::bigint as rows,\n s.shared_blks_read::bigint as shared_blks_read, s.temp_blks_written::bigint as temp_blks_written\n from pg_stat_statements s join pg_roles r on r.oid = s.userid\n where s.toplevel and r.rolname in (${roles.map((role) => `'${role}'`).join(', ')})\n and s.query ~* '^\\\\s*(select|with|insert|update|delete|merge|values|table)\\\\y'\n and s.query !~* '^\\\\s*explain'\n and s.dbid = (select oid from pg_database where datname = current_database())`\n","import type { PerfConfig } from '@/config/PerfConfig.js'\nimport { isPlatformNoise } from '@/perf/isPlatformNoise.js'\nimport type { StatementStat } from '@/perf/StatementStat.js'\nimport { statementStatsSql } from '@/perf/statementStatsSql.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\n\nexport const readStatementStats = (\n session: PsqlSession,\n perf: PerfConfig,\n): StatementStat[] => {\n const rows = session.rows(statementStatsSql(perf.roles)) as Record<\n string,\n unknown\n >[]\n return rows\n .map((row) => ({\n role: String(row['role']),\n queryId: String(row['query_id']),\n text: String(row['text']),\n calls: Number(row['calls']),\n totalMs: Number(row['total_ms']),\n rows: Number(row['rows']),\n sharedBlksRead: Number(row['shared_blks_read']),\n tempBlksWritten: Number(row['temp_blks_written']),\n }))\n .filter((statement) => !isPlatformNoise(statement.text, perf.ignore))\n .sort(\n (a, b) =>\n perf.roles.indexOf(a.role) - perf.roles.indexOf(b.role) ||\n a.queryId.localeCompare(b.queryId),\n )\n}\n","export const STATS_RESET_SQL =\n 'select stats_reset::text as stats_reset from pg_stat_statements_info()'\n","import { STATS_RESET_SQL } from '@/perf/STATS_RESET_SQL.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\n\nexport const readStatsReset = (session: PsqlSession): string | null => {\n const rows = session.rows(STATS_RESET_SQL) as Record<string, unknown>[]\n const value = rows[0]?.['stats_reset']\n return typeof value === 'string' ? value : null\n}\n","export const TABLE_STATS_SQL = `select schemaname || '.' || relname as name, n_live_tup::bigint as live_rows,\n seq_scan::bigint as seq_scan, coalesce(idx_scan, 0)::bigint as idx_scan, pg_total_relation_size(relid)::bigint as bytes\n from pg_stat_user_tables where schemaname = 'public'`\n","import { TABLE_STATS_SQL } from '@/perf/TABLE_STATS_SQL.js'\nimport type { TableStat } from '@/perf/TableStat.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\n\nexport const readTableStats = (session: PsqlSession): TableStat[] => {\n const rows = session.rows(TABLE_STATS_SQL) as Record<string, unknown>[]\n return rows\n .map((row) => ({\n name: String(row['name']),\n liveRows: Number(row['live_rows']),\n seqScan: Number(row['seq_scan']),\n idxScan: Number(row['idx_scan']),\n bytes: Number(row['bytes']),\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n","import type { PerfConfig } from '@/config/PerfConfig.js'\nimport { PACKAGE_VERSION } from '@/packageVersion.js'\nimport type { PerfSnapshot } from '@/perf/PerfSnapshot.js'\nimport { readStatementStats } from '@/perf/readStatementStats.js'\nimport { readStatsReset } from '@/perf/readStatsReset.js'\nimport { readTableStats } from '@/perf/readTableStats.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\n\nexport const takePerfSnapshot = (\n session: PsqlSession,\n perf: PerfConfig,\n host: string,\n takenAt: string,\n): PerfSnapshot => {\n const statements = readStatementStats(session, perf)\n const tables = readTableStats(session)\n const statsReset = readStatsReset(session)\n return {\n schemaVersion: 1,\n toolVersion: PACKAGE_VERSION,\n takenAt,\n host,\n statsReset,\n statements,\n tables,\n }\n}\n","import type { CheckContext } from '@/check/CheckContext.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { diffSnapshots } from '@/perf/diffSnapshots.js'\nimport { QUERY_TIMEOUT_MS } from '@/perf/QUERY_TIMEOUT_MS.js'\nimport { readPerfSnapshot } from '@/perf/readPerfSnapshot.js'\nimport { takePerfSnapshot } from '@/perf/takePerfSnapshot.js'\nimport type { PostgresTarget } from '@/postgres/PostgresTarget.js'\nimport { psqlSession } from '@/postgres/psqlSession.js'\n\n/** The gate's own diff: takes a fresh snapshot and compares it against the recorded one, never writing it. */\nexport const perfDiffFindings = (\n { root, config, runner }: CheckContext,\n target: PostgresTarget,\n): Finding[] => {\n const session = psqlSession(runner, root, target, QUERY_TIMEOUT_MS)\n const current = takePerfSnapshot(\n session,\n config.perf,\n target.host,\n new Date().toISOString(),\n )\n return diffSnapshots(\n readPerfSnapshot(root),\n current,\n config.perf,\n config.disable,\n ).findings\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { env } from 'node:process'\n\nimport { DB_PASSWORD_ENV } from '@/postgres/DB_PASSWORD_ENV.js'\nimport { POOLER_URL_FILE } from '@/postgres/POOLER_URL_FILE.js'\nimport type { PostgresTarget } from '@/postgres/PostgresTarget.js'\nimport type { PostgresTargetFlags } from '@/postgres/PostgresTargetFlags.js'\nimport { targetFromUrl } from '@/postgres/targetFromUrl.js'\n\n/** --db-url first; then the linked pooler url with the password from the environment; undefined when neither applies. */\nexport const resolvePostgresTarget = (\n root: string,\n flags: PostgresTargetFlags,\n): PostgresTarget | undefined => {\n const explicit = flags['db-url']\n if (explicit !== undefined) return targetFromUrl(explicit, '--db-url')\n const poolerPath = join(root, POOLER_URL_FILE)\n const password = env[DB_PASSWORD_ENV]\n if (!existsSync(poolerPath) || password === undefined || password === '')\n return undefined\n return targetFromUrl(\n readFileSync(poolerPath, 'utf8').trim(),\n POOLER_URL_FILE,\n password,\n )\n}\n","/** The variable the Supabase CLI itself reads for a linked project's database password. */\nexport const DB_PASSWORD_ENV = 'SUPABASE_DB_PASSWORD'\n","/** Written by `supabase link`: user and host of the session pooler, never the password. */\nexport const POOLER_URL_FILE = 'supabase/.temp/pooler-url'\n","import { ConfigError } from '@/config/ConfigError.js'\n\n/** `raw` as a URL, or a ConfigError naming where it came from. */\nexport const parsedUrl = (raw: string, source: string): URL => {\n try {\n return new URL(raw)\n } catch {\n throw new ConfigError(`${source} is not a valid url`)\n }\n}\n","import { ConfigError } from '@/config/ConfigError.js'\n\n/**\n * A transaction pooler hands each statement to whichever backend is free, so\n * the read-only SET and the query can land on different connections, and the\n * SET stays behind on a connection the application shares.\n */\nexport const refuseTransactionPooler = (url: URL, source: string): void => {\n if (url.port !== '6543' && url.searchParams.get('pgbouncer') !== 'true')\n return\n throw new ConfigError(\n `${source} points at a transaction pooler (port 6543 or pgbouncer=true), where the read-only setting does not hold; use the session pooler (port 5432) or a direct connection`,\n )\n}\n","import { ConfigError } from '@/config/ConfigError.js'\n\n/**\n * Removes the password from `url`, whether in the user info or in a\n * `?password=` parameter, and returns it decoded; undefined when there is none.\n */\nexport const takeUrlPassword = (\n url: URL,\n source: string,\n): string | undefined => {\n const query = url.searchParams.get('password') ?? undefined\n url.searchParams.delete('password')\n const encoded = url.password\n url.password = ''\n if (!encoded) return query\n try {\n return decodeURIComponent(encoded)\n } catch {\n throw new ConfigError(`${source} password is not valid percent-encoding`)\n }\n}\n","import type { PostgresTarget } from '@/postgres/PostgresTarget.js'\nimport { parsedUrl } from '@/postgres/parsedUrl.js'\nimport { refuseTransactionPooler } from '@/postgres/refuseTransactionPooler.js'\nimport { takeUrlPassword } from '@/postgres/takeUrlPassword.js'\n\n/** A connection url as a target whose url no longer carries the password: psql gets it through PGPASSWORD, never on its argument vector. */\nexport const targetFromUrl = (\n raw: string,\n source: string,\n fallbackPassword?: string,\n): PostgresTarget => {\n const url = parsedUrl(raw, source)\n refuseTransactionPooler(url, source)\n const password = takeUrlPassword(url, source) ?? fallbackPassword\n return {\n url: url.toString(),\n host: url.hostname,\n ...(password === undefined ? {} : { password }),\n }\n}\n","import type { StageResult } from '@/gate/StageResult.js'\n\nexport const renderGateReport = (results: StageResult[]): string =>\n results\n .flatMap((result) => [\n `${result.status.padStart(22)} ${result.name.padEnd(14)}${result.durationSeconds.toFixed(2).padStart(8)}s`,\n ...(result.status === 'passed' || !result.detail\n ? []\n : result.detail.split('\\n').map((line) => ` ${line}`)),\n ])\n .join('\\n')\n","import { performance } from 'node:perf_hooks'\n\nimport { renderFindings } from '@/check/renderFindings.js'\nimport type { Stage } from '@/gate/Stage.js'\nimport type { StageResult } from '@/gate/StageResult.js'\nimport type { StageStatus } from '@/gate/StageStatus.js'\n\nexport const runStage = (stage: Stage): StageResult => {\n const started = performance.now()\n const done = (status: StageStatus, detail: string): StageResult => ({\n name: stage.name,\n status,\n durationSeconds: (performance.now() - started) / 1000,\n detail,\n })\n try {\n const outcome = stage.run()\n if (outcome === 'not-applicable') return done('skipped-not-applicable', '')\n if (!Array.isArray(outcome))\n return done('skipped-not-applicable', outcome.skipped)\n return outcome.length === 0\n ? done('passed', '')\n : done('findings', renderFindings(outcome))\n } catch (error) {\n return done(\n 'failed-to-run',\n error instanceof Error ? error.message : String(error),\n )\n }\n}\n","import { runStage } from '@/gate/runStage.js'\nimport type { Stage } from '@/gate/Stage.js'\nimport type { StageResult } from '@/gate/StageResult.js'\n\n// Every stage runs: stopping at the first failure means the same tool is\n// fixed over and over and the rest of the picture never appears.\nexport const runGate = (stages: Stage[]): StageResult[] => stages.map(runStage)\n","import type { CommandIo } from '@/commands/CommandIo.js'\nimport { parseCommandArgs } from '@/commands/parseCommandArgs.js'\nimport { reportCommandError } from '@/commands/reportCommandError.js'\nimport { legacyConfigNotice } from '@/config/legacyConfigNotice.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { gateExitCode } from '@/gate/gateExitCode.js'\nimport { gateStages } from '@/gate/gateStages.js'\nimport { renderGateReport } from '@/gate/renderGateReport.js'\nimport { runGate } from '@/gate/runGate.js'\n\nexport const gateCommand = (argv: string[], io: CommandIo): number => {\n try {\n const { values } = parseCommandArgs(argv, { json: { type: 'boolean' } })\n const config = readConfig(io.root)\n const notice = legacyConfigNotice(config)\n if (notice) io.stderr(`${notice}\\n`)\n const results = runGate(\n gateStages({\n root: io.root,\n config,\n runner: io.runner,\n }),\n )\n const report =\n values['json'] === true\n ? JSON.stringify({ schemaVersion: 1, stages: results }, null, 2)\n : renderGateReport(results)\n io.stdout(`${report}\\n`)\n return gateExitCode(results)\n } catch (error) {\n return reportCommandError(error, io.stderr)\n }\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BENCH_RECORD_FILENAME } from '@/bench/BENCH_RECORD_FILENAME.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport type { AdoptionPhaseNumber } from '@/init/AdoptionPhaseNumber.js'\nimport { PERF_SNAPSHOT_FILENAME } from '@/perf/PERF_SNAPSHOT_FILENAME.js'\n\n/** Where a project stands on the phased adoption ladder, from its config and its recorded files. */\nexport const adoptionPhase = (\n root: string,\n config: DbQualityConfig,\n): AdoptionPhaseNumber => {\n if (config.schemaVersion !== 2) return 0\n const hasSnapshot = existsSync(join(root, PERF_SNAPSHOT_FILENAME))\n const hasBench = existsSync(join(root, BENCH_RECORD_FILENAME))\n if (config.perf.inGate && (hasSnapshot || hasBench)) return 4\n if (hasBench) return 3\n if (hasSnapshot) return 2\n return 1\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BASELINE_FILENAME } from '@/baseline/BASELINE_FILENAME.js'\nimport { classifyFindings } from '@/baseline/classifyFindings.js'\nimport { readBaseline } from '@/baseline/readBaseline.js'\nimport type { CheckContext } from '@/check/CheckContext.js'\nimport { runCheck } from '@/check/runCheck.js'\nimport type { BaselineStep } from '@/init/BaselineStepType.js'\n\n/** Runs `check` and says whether the baseline covers every finding it reports. */\nexport const baselineStep = (context: CheckContext): BaselineStep => {\n const findings = runCheck(context)\n if (findings.length === 0) return 'covered'\n if (!existsSync(join(context.root, BASELINE_FILENAME))) return 'create'\n const classified = classifyFindings(findings, readBaseline(context.root))\n return classified.new.length > 0 ? 'update' : 'covered'\n}\n","import type { CheckContext } from '@/check/CheckContext.js'\nimport { adoptionPhase } from '@/init/adoptionPhase.js'\nimport type { AdoptionStanding } from '@/init/AdoptionStandingType.js'\nimport { baselineStep } from '@/init/baselineStep.js'\nimport type { BaselineStep } from '@/init/BaselineStepType.js'\n\n/**\n * The phase from the recorded files, held at 1 while `check` reports findings\n * the baseline does not cover: committing the init output alone must never\n * turn CI red. A check that cannot run holds phase 1 too, naming why, and\n * never changes init's own exit code.\n */\nexport const adoptionStanding = (context: CheckContext): AdoptionStanding => {\n const phase = adoptionPhase(context.root, context.config)\n if (phase === 0) return { phase }\n let step: BaselineStep\n try {\n step = baselineStep(context)\n } catch (error) {\n return { phase: 1, next: `make check run: ${(error as Error).message}` }\n }\n return step === 'covered'\n ? { phase }\n : { phase: 1, next: `codeality-db baseline ${step}` }\n}\n","import { mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\n\nimport type { ManagedFile } from '@/init/ManagedFile.js'\n\nexport const applyInit = (root: string, plan: ManagedFile[]): void => {\n for (const file of plan) {\n const writes = file.disposition === 'create' || file.disposition === 'merge'\n if (!writes || file.content === undefined) continue\n mkdirSync(dirname(join(root, file.path)), { recursive: true })\n writeFileSync(join(root, file.path), file.content)\n }\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { PERF_DEFAULTS } from '@/config/PERF_DEFAULTS.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { BENCH_README } from '@/init/BENCH_README.js'\nimport type { ManagedFile } from '@/init/ManagedFile.js'\n\n/** Plans the bench directory's README, under whatever `perf.benchDir` the project already has. */\nexport const planBenchReadme = (root: string): ManagedFile => {\n const benchDir = (() => {\n try {\n return readConfig(root).perf.benchDir\n } catch {\n return PERF_DEFAULTS.benchDir\n }\n })()\n const relative = `${benchDir}/README.md`\n if (existsSync(join(root, relative))) {\n return { path: relative, disposition: 'unchanged', detail: 'present' }\n }\n return {\n path: relative,\n disposition: 'create',\n detail: 'explains the bench convention',\n content: BENCH_README,\n }\n}\n","import { BENCH_RECORD_FILENAME } from '@/bench/BENCH_RECORD_FILENAME.js'\n\n/** Explains the bench directory convention to whoever finds it next. */\nexport const BENCH_README = `# Bench queries\n\nEach \\`.sql\\` file in this directory holds one statement to benchmark. Write\nliteral values inline; the session that runs them has no way to bind\nparameters.\n\nAn optional first line \\`-- runs: N\\` overrides how many times the statement\nruns before the median is recorded, in place of \\`perf.benchRuns\\` in\ncodeality-db.json.\n\nA file holding more than one statement is refused. The statement runs\ninside a read-only transaction it cannot leave, and whatever it did is\nrolled back, so a statement that writes is refused or undone instead of\ntouching the database.\n\nRun \\`codeality-db perf bench --record\\` once to write the reference numbers\nto ${BENCH_RECORD_FILENAME}. Run \\`codeality-db perf bench\\` afterwards to\ncompare a new run against that reference.\n`\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { CONFIG_FILENAME } from '@/config/CONFIG_FILENAME.js'\nimport { configFromDocument } from '@/config/configFromDocument.js'\nimport { detectStacks } from '@/config/detectStacks.js'\nimport type { ManagedFile } from '@/init/ManagedFile.js'\nimport { PERF_INIT_SECTION } from '@/init/PERF_INIT_SECTION.js'\nimport { upgradedConfigDocument } from '@/init/upgradedConfigDocument.js'\n\nexport const planConfigFile = (root: string, force: boolean): ManagedFile => {\n const path = join(root, CONFIG_FILENAME)\n const freshContent = `${JSON.stringify(\n { schemaVersion: 2, ...detectStacks(root), perf: PERF_INIT_SECTION },\n null,\n 2,\n )}\\n`\n if (!existsSync(path)) {\n return {\n path: CONFIG_FILENAME,\n disposition: 'create',\n detail: 'from the detected stacks',\n content: freshContent,\n }\n }\n try {\n const raw = JSON.parse(readFileSync(path, 'utf8')) as Record<\n string,\n unknown\n >\n const config = configFromDocument(raw)\n if (config.schemaVersion === 1) {\n return {\n path: CONFIG_FILENAME,\n disposition: 'merge',\n detail: 'upgraded to schemaVersion 2',\n content: `${JSON.stringify(\n upgradedConfigDocument(raw, detectStacks(root)),\n null,\n 2,\n )}\\n`,\n }\n }\n return { path: CONFIG_FILENAME, disposition: 'unchanged', detail: 'valid' }\n } catch (error) {\n return force\n ? {\n path: CONFIG_FILENAME,\n disposition: 'merge',\n detail: 'replaced (--force)',\n content: freshContent,\n }\n : {\n path: CONFIG_FILENAME,\n disposition: 'conflict',\n detail: (error as Error).message,\n }\n }\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { findSqliteFiles } from '@/config/findSqliteFiles.js'\nimport { hasSupabaseJsDependency } from '@/config/hasSupabaseJsDependency.js'\nimport { isDirectory } from '@/config/isDirectory.js'\nimport type { StackSections } from '@/config/StackSections.js'\n\nexport const detectStacks = (root: string): StackSections => {\n const sqliteFiles = findSqliteFiles(root)\n const hasDrizzle = ['ts', 'js', 'mjs'].some((ext) =>\n existsSync(join(root, `drizzle.config.${ext}`)),\n )\n const drizzleRoots = ['src', 'server', 'app', 'lib', 'db'].filter((name) =>\n isDirectory(join(root, name)),\n )\n const postgrestRoots = ['src', 'app', 'supabase/functions'].filter((name) =>\n isDirectory(join(root, name)),\n )\n return {\n ...(isDirectory(join(root, 'supabase/migrations'))\n ? { supabase: { migrations: 'supabase/migrations' } }\n : {}),\n ...(existsSync(join(root, 'prisma/schema.prisma'))\n ? { prisma: { schema: 'prisma/schema.prisma' } }\n : {}),\n ...(hasDrizzle\n ? { drizzle: { roots: drizzleRoots, objectNames: ['db', 'tx'] } }\n : {}),\n ...(sqliteFiles.length > 0 ? { sqlite: { files: sqliteFiles } } : {}),\n ...(hasSupabaseJsDependency(root) && postgrestRoots.length > 0\n ? { postgrest: { roots: postgrestRoots } }\n : {}),\n }\n}\n","import { readdirSync } from 'node:fs'\nimport { join, relative } from 'node:path'\n\n/** SQLite files at depth <= 2 under the root, as sorted root-relative paths. */\nexport const findSqliteFiles = (root: string): string[] => {\n // Hidden directories hold tool state, never the project's data: a pnpm\n // store keeps an index.db, and .git, .codegraph and friends keep their own.\n const skipped = new Set(['node_modules', 'dist', 'coverage'])\n const found: string[] = []\n const walk = (directory: string, depth: number): void => {\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n if (skipped.has(entry.name) || entry.name.startsWith('.')) continue\n const path = join(directory, entry.name)\n if (entry.isDirectory() && depth < 2) walk(path, depth + 1)\n else if (entry.isFile() && /\\.(?:db|sqlite|sqlite3)$/.test(entry.name)) {\n found.push(relative(root, path).replaceAll('\\\\', '/'))\n }\n }\n }\n walk(root, 0)\n return found.sort()\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { PackageManifest } from '@/config/PackageManifest.js'\n\nexport const hasSupabaseJsDependency = (root: string): boolean => {\n const manifestPath = join(root, 'package.json')\n if (!existsSync(manifestPath)) return false\n const manifest = JSON.parse(\n readFileSync(manifestPath, 'utf8'),\n ) as PackageManifest\n const dependencies = { ...manifest.dependencies, ...manifest.devDependencies }\n return '@supabase/supabase-js' in dependencies\n}\n","import { PERF_DEFAULTS } from '@/config/PERF_DEFAULTS.js'\nimport type { PerfConfig } from '@/config/PerfConfig.js'\n\n/** The perf section `init` writes: the usual defaults, but out of the gate until adopted. */\nexport const PERF_INIT_SECTION: PerfConfig = { ...PERF_DEFAULTS, inGate: false }\n","import { LEGACY_DISABLE_REASON } from '@/config/LEGACY_DISABLE_REASON.js'\nimport type { StackSections } from '@/config/StackSections.js'\nimport { PERF_INIT_SECTION } from '@/init/PERF_INIT_SECTION.js'\n\n/** Upgrades a valid schemaVersion 1 document to 2, keeping every section already present. */\nexport const upgradedConfigDocument = (\n raw: Record<string, unknown>,\n detected: StackSections,\n): Record<string, unknown> => {\n const disable = raw['disable']\n return {\n ...raw,\n schemaVersion: 2,\n ...(Array.isArray(disable)\n ? {\n disable: disable.map((entry: unknown) =>\n typeof entry === 'string'\n ? { code: entry, reason: LEGACY_DISABLE_REASON }\n : entry,\n ),\n }\n : {}),\n ...(raw['postgrest'] === undefined && detected.postgrest !== undefined\n ? { postgrest: detected.postgrest }\n : {}),\n ...(raw['perf'] === undefined ? { perf: PERF_INIT_SECTION } : {}),\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { ManagedFile } from '@/init/ManagedFile.js'\nimport { PACKAGE_MANIFEST } from '@/init/PACKAGE_MANIFEST.js'\n\nexport const planPackageScript = (\n root: string,\n force: boolean,\n): ManagedFile => {\n const path = join(root, PACKAGE_MANIFEST)\n if (!existsSync(path)) {\n return {\n path: PACKAGE_MANIFEST,\n disposition: 'unchanged',\n detail: 'no package.json',\n }\n }\n const manifest = JSON.parse(readFileSync(path, 'utf8')) as {\n scripts?: Record<string, string>\n }\n const current = manifest.scripts?.['db:gate']\n if (current === 'codeality-db gate') {\n return {\n path: PACKAGE_MANIFEST,\n disposition: 'unchanged',\n detail: 'db:gate present',\n }\n }\n if (current !== undefined && !force) {\n return {\n path: PACKAGE_MANIFEST,\n disposition: 'conflict',\n detail: `db:gate is \"${current}\"`,\n }\n }\n const scripts = { ...manifest.scripts, 'db:gate': 'codeality-db gate' }\n const content = `${JSON.stringify({ ...manifest, scripts }, null, 2)}\\n`\n return {\n path: PACKAGE_MANIFEST,\n disposition: 'merge',\n detail: 'add scripts.db:gate',\n content,\n }\n}\n","export const PACKAGE_MANIFEST = 'package.json'\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { assetPath } from '@/assetPath.js'\nimport type { ManagedFile } from '@/init/ManagedFile.js'\nimport { sha256Of } from '@/init/sha256Of.js'\nimport { SHIPPED_WORKFLOW_HASHES } from '@/init/SHIPPED_WORKFLOW_HASHES.js'\n\nexport const planWorkflow = (root: string, force: boolean): ManagedFile => {\n const relative = '.github/workflows/db-quality.yml'\n const content = readFileSync(assetPath('db-quality.yml'), 'utf8')\n const path = join(root, relative)\n if (!existsSync(path)) {\n const detail = 'runs codeality-db gate on push and pull request'\n return { path: relative, disposition: 'create', detail, content }\n }\n const existing = readFileSync(path, 'utf8')\n if (existing === content) {\n return { path: relative, disposition: 'unchanged', detail: 'identical' }\n }\n const shippedVersion = SHIPPED_WORKFLOW_HASHES[sha256Of(existing)]\n if (shippedVersion !== undefined) {\n return {\n path: relative,\n disposition: 'merge',\n detail: `upgraded from the ${shippedVersion} workflow`,\n content,\n }\n }\n return force\n ? {\n path: relative,\n disposition: 'merge',\n detail: 'replaced (--force)',\n content,\n }\n : {\n path: relative,\n disposition: 'conflict',\n detail: 'differs from the shipped workflow',\n }\n}\n","import { createHash } from 'node:crypto'\n\n/** The hex SHA-256 digest of a string's exact bytes. */\nexport const sha256Of = (content: string): string =>\n createHash('sha256').update(content).digest('hex')\n","/** SHA-256 of every workflow asset ever shipped, by the version it shipped with. */\nexport const SHIPPED_WORKFLOW_HASHES: Record<string, string> = {\n '4845c1f1cd3c179701d4a143cb34400c8a6225b73e6e86418408e8f3ae1581c0': '0.1.0',\n}\n","import type { ManagedFile } from '@/init/ManagedFile.js'\nimport { planBenchReadme } from '@/init/planBenchReadme.js'\nimport { planConfigFile } from '@/init/planConfigFile.js'\nimport { planPackageScript } from '@/init/planPackageScript.js'\nimport { planWorkflow } from '@/init/planWorkflow.js'\n\nexport const planInit = (root: string, force: boolean): ManagedFile[] => [\n planConfigFile(root, force),\n planPackageScript(root, force),\n planWorkflow(root, force),\n planBenchReadme(root),\n]\n","import type { AdoptionRung } from '@/init/AdoptionRung.js'\n\n/** The phased adoption ladder: what each phase means and the command that reaches the next one. */\nexport const ADOPTION_LADDER: AdoptionRung[] = [\n { phase: 0, does: 'no configuration', next: 'codeality-db init --apply' },\n {\n phase: 1,\n does: 'strict check and PostgREST rules, baseline covers what exists',\n next: 'codeality-db perf snapshot',\n },\n {\n phase: 2,\n does: 'perf snapshot recorded',\n next: 'codeality-db perf bench --record',\n },\n {\n phase: 3,\n does: 'bench reference recorded',\n next: 'set perf.inGate to true in codeality-db.json',\n },\n {\n phase: 4,\n does: 'the gate measures performance',\n next: 'nothing: the gate measures',\n },\n]\n","import { ADOPTION_LADDER } from '@/init/ADOPTION_LADDER.js'\nimport type { AdoptionStanding } from '@/init/AdoptionStandingType.js'\n\n/** Renders the ladder with the current phase marked and the next step named. */\nexport const renderAdoptionPhase = ({\n phase,\n next,\n}: AdoptionStanding): string => {\n const rungs = ADOPTION_LADDER.map(\n (rung) =>\n `${rung.phase === phase ? '*' : ' '} ${String(rung.phase)} ${rung.does}`,\n )\n const current = ADOPTION_LADDER.find((rung) => rung.phase === phase)\n return [\n `adoption phase ${String(phase)} of 4`,\n ...rungs,\n `next: ${next ?? current?.next ?? ''}`,\n ].join('\\n')\n}\n","import type { ManagedFile } from '@/init/ManagedFile.js'\n\nexport const renderInitPlan = (plan: ManagedFile[]): string =>\n plan\n .map(\n (file) => `${file.disposition.padEnd(9)} ${file.path} ${file.detail}`,\n )\n .join('\\n')\n","import type { CommandIo } from '@/commands/CommandIo.js'\nimport { parseCommandArgs } from '@/commands/parseCommandArgs.js'\nimport { reportCommandError } from '@/commands/reportCommandError.js'\nimport { ConfigError } from '@/config/ConfigError.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { adoptionStanding } from '@/init/adoptionStanding.js'\nimport { applyInit } from '@/init/applyInit.js'\nimport { planInit } from '@/init/planInit.js'\nimport { renderAdoptionPhase } from '@/init/renderAdoptionPhase.js'\nimport { renderInitPlan } from '@/init/renderInitPlan.js'\nimport { ExitCode } from '@/model/ExitCode.js'\n\nexport const initCommand = (argv: string[], io: CommandIo): number => {\n try {\n const { values } = parseCommandArgs(argv, {\n check: { type: 'boolean' },\n apply: { type: 'boolean' },\n force: { type: 'boolean' },\n })\n const force = values['force'] === true\n const plan = planInit(io.root, force)\n io.stdout(`${renderInitPlan(plan)}\\n`)\n let exitCode: number = ExitCode.OK\n if (values['check'] === true) {\n exitCode = plan.every((file) => file.disposition === 'unchanged')\n ? ExitCode.OK\n : ExitCode.FINDINGS\n } else if (values['apply'] === true || force) {\n if (plan.some((file) => file.disposition === 'conflict')) {\n throw new ConfigError('conflicts remain; resolve them or pass --force')\n }\n applyInit(io.root, plan)\n }\n const config = ((): DbQualityConfig | undefined => {\n try {\n return readConfig(io.root)\n } catch {\n return undefined\n }\n })()\n const standing = config\n ? adoptionStanding({ root: io.root, config, runner: io.runner })\n : { phase: 0 as const }\n io.stdout(`${renderAdoptionPhase(standing)}\\n`)\n return exitCode\n } catch (error) {\n return reportCommandError(error, io.stderr)\n }\n}\n","import type { BenchRecord } from '@/bench/BenchRecord.js'\nimport type { BenchResult } from '@/bench/BenchResult.js'\nimport { renderFindings } from '@/check/renderFindings.js'\n\nexport const renderBench = (\n result: BenchResult,\n recorded: BenchRecord | undefined,\n): string => {\n const entries = Object.entries(result.entries)\n const width = Math.max(0, ...entries.map(([file]) => file.length)) + 2\n const runs = new Set(entries.map(([, entry]) => entry.runs))\n const perFile = runs.size > 1\n const lines = entries.map(([file, entry]) => {\n const recordedEntry = recorded?.entries[file]\n const record = recordedEntry\n ? `(record ${recordedEntry.medianMs.toFixed(2)} ms)`\n : '(no record)'\n const count = perFile ? ` ${String(entry.runs)} runs` : ''\n return ` ${file.padEnd(width)}${entry.medianMs.toFixed(2)} ms ${record}${count}`\n })\n const improvementLines =\n result.improvements.length === 0\n ? []\n : [\n 'improvements',\n ...result.improvements.map((improvement) => {\n const percent = Math.round(\n (improvement.currentMs / improvement.previousMs - 1) * 100,\n )\n return ` ${String(percent)}% ${improvement.previousMs.toFixed(2)} ms -> ${improvement.currentMs.toFixed(2)} ms ${improvement.subject}`\n }),\n ]\n return [\n perFile\n ? 'bench (runs per file)'\n : `bench (${String([...runs][0] ?? 0)} runs each)`,\n ...lines,\n ...improvementLines,\n renderFindings(result.findings),\n ].join('\\n')\n}\n","import type { BenchRecord } from '@/bench/BenchRecord.js'\nimport type { BenchResult } from '@/bench/BenchResult.js'\n\nexport const renderBenchJson = (\n result: BenchResult,\n recorded: BenchRecord | undefined,\n): string =>\n JSON.stringify(\n {\n schemaVersion: 1,\n entries: result.entries,\n recorded: recorded?.entries ?? null,\n improvements: result.improvements,\n findings: result.findings,\n },\n null,\n 2,\n )\n","import { renameSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BENCH_RECORD_FILENAME } from '@/bench/BENCH_RECORD_FILENAME.js'\nimport type { BenchRecord } from '@/bench/BenchRecord.js'\n\n/** Writes the record atomically: a temporary file, then a rename over the target. */\nexport const writeBenchRecord = (root: string, record: BenchRecord): void => {\n const path = join(root, BENCH_RECORD_FILENAME)\n writeFileSync(`${path}.tmp`, `${JSON.stringify(record, null, 2)}\\n`)\n renameSync(`${path}.tmp`, path)\n}\n","import { BENCH_RECORD_FILENAME } from '@/bench/BENCH_RECORD_FILENAME.js'\nimport { readBenchRecord } from '@/bench/readBenchRecord.js'\nimport { renderBench } from '@/bench/renderBench.js'\nimport { renderBenchJson } from '@/bench/renderBenchJson.js'\nimport { runBench } from '@/bench/runBench.js'\nimport { writeBenchRecord } from '@/bench/writeBenchRecord.js'\nimport type { PerfActionIo } from '@/commands/PerfActionIo.js'\nimport { ExitCode } from '@/model/ExitCode.js'\nimport { PACKAGE_VERSION } from '@/packageVersion.js'\n\nexport const perfBenchAction = ({\n io,\n config,\n target,\n session,\n json,\n record,\n}: PerfActionIo): number => {\n const recorded = record ? undefined : readBenchRecord(io.root)\n const result = runBench(session, io.root, recorded, {\n perf: config.perf,\n disabled: config.disable,\n })\n if (record) {\n writeBenchRecord(io.root, {\n schemaVersion: 1,\n toolVersion: PACKAGE_VERSION,\n takenAt: new Date().toISOString(),\n host: target.host,\n entries: result.entries,\n })\n io.stdout(\n `recorded ${String(Object.keys(result.entries).length)} bench queries in ${BENCH_RECORD_FILENAME}\\n`,\n )\n return ExitCode.OK\n }\n io.stdout(\n `${json ? renderBenchJson(result, recorded) : renderBench(result, recorded)}\\n`,\n )\n return result.findings.length > 0 ? ExitCode.FINDINGS : ExitCode.OK\n}\n","import type { Improvement } from '@/perf/Improvement.js'\n\nexport const renderImprovements = (improvements: Improvement[]): string[] =>\n improvements.length === 0\n ? []\n : [\n 'improvements',\n ...improvements.map((improvement) => {\n const percent = Math.round(\n (improvement.currentMs / improvement.previousMs - 1) * 100,\n )\n return ` ${String(percent)}% ${improvement.previousMs.toFixed(2)} ms -> ${improvement.currentMs.toFixed(2)} ms x${improvement.calls.toLocaleString('en-US')} ${improvement.subject}`\n }),\n ]\n","import type { PerfDiff } from '@/perf/PerfDiff.js'\nimport { renderImprovements } from '@/perf/renderImprovements.js'\n\nexport const renderPerfDiff = (diff: PerfDiff): string =>\n [\n `perf diff: ${diff.from} -> ${diff.to}`,\n ...renderImprovements(diff.improvements),\n ...(diff.improvements.length > 0 || diff.lostMs > 0\n ? [\n `saved ${diff.savedMs.toLocaleString('en-US')} ms against the previous means; regressions cost ${diff.lostMs.toLocaleString('en-US')} ms`,\n ]\n : []),\n ...diff.findings.map(\n (finding) =>\n `${finding.path}:${String(finding.line)}: ${finding.code} ${finding.message} (${finding.subject})`,\n ),\n `${diff.findings.length.toLocaleString('en-US')} findings`,\n ].join('\\n')\n","import type { PerfDiff } from '@/perf/PerfDiff.js'\n\nexport const renderPerfDiffJson = (diff: PerfDiff): string =>\n JSON.stringify(\n {\n schemaVersion: 1,\n from: diff.from,\n to: diff.to,\n savedMs: diff.savedMs,\n lostMs: diff.lostMs,\n improvements: diff.improvements,\n findings: diff.findings,\n },\n null,\n 2,\n )\n","import type { PerfActionIo } from '@/commands/PerfActionIo.js'\nimport { ExitCode } from '@/model/ExitCode.js'\nimport { diffSnapshots } from '@/perf/diffSnapshots.js'\nimport { readPerfSnapshot } from '@/perf/readPerfSnapshot.js'\nimport { renderPerfDiff } from '@/perf/renderPerfDiff.js'\nimport { renderPerfDiffJson } from '@/perf/renderPerfDiffJson.js'\nimport { takePerfSnapshot } from '@/perf/takePerfSnapshot.js'\n\nexport const perfDiffAction = ({\n io,\n config,\n target,\n session,\n json,\n}: PerfActionIo): number => {\n const previous = readPerfSnapshot(io.root)\n const current = takePerfSnapshot(\n session,\n config.perf,\n target.host,\n new Date().toISOString(),\n )\n const diff = diffSnapshots(previous, current, config.perf, config.disable)\n io.stdout(`${json ? renderPerfDiffJson(diff) : renderPerfDiff(diff)}\\n`)\n return diff.findings.length > 0 ? ExitCode.FINDINGS : ExitCode.OK\n}\n","import { renameSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { PERF_SNAPSHOT_FILENAME } from '@/perf/PERF_SNAPSHOT_FILENAME.js'\nimport type { PerfSnapshot } from '@/perf/PerfSnapshot.js'\n\n/** Writes the snapshot atomically: a temporary file, then a rename over the target. */\nexport const writePerfSnapshot = (\n root: string,\n snapshot: PerfSnapshot,\n): void => {\n const path = join(root, PERF_SNAPSHOT_FILENAME)\n writeFileSync(`${path}.tmp`, `${JSON.stringify(snapshot, null, 2)}\\n`)\n renameSync(`${path}.tmp`, path)\n}\n","import type { PerfActionIo } from '@/commands/PerfActionIo.js'\nimport { ExitCode } from '@/model/ExitCode.js'\nimport { PERF_SNAPSHOT_FILENAME } from '@/perf/PERF_SNAPSHOT_FILENAME.js'\nimport { takePerfSnapshot } from '@/perf/takePerfSnapshot.js'\nimport { writePerfSnapshot } from '@/perf/writePerfSnapshot.js'\n\nexport const perfSnapshotAction = ({\n io,\n config,\n target,\n session,\n}: PerfActionIo): number => {\n const snapshot = takePerfSnapshot(\n session,\n config.perf,\n target.host,\n new Date().toISOString(),\n )\n writePerfSnapshot(io.root, snapshot)\n io.stdout(\n `recorded ${String(snapshot.statements.length)} statements and ${String(snapshot.tables.length)} tables from ${target.host} in ${PERF_SNAPSHOT_FILENAME}\\n`,\n )\n return ExitCode.OK\n}\n","export const PERF_USAGE =\n 'usage: codeality-db perf snapshot|diff|bench [--db-url <url>] [--json] [--record]'\n","import { ConfigError } from '@/config/ConfigError.js'\nimport { PERF_USAGE } from '@/perf/PERF_USAGE.js'\nimport type { PerfAction } from '@/perf/PerfAction.js'\n\nexport const perfActionFrom = (positionals: string[]): PerfAction => {\n const action = positionals[0]\n if (action === 'snapshot' || action === 'diff' || action === 'bench')\n return action\n throw new ConfigError(PERF_USAGE)\n}\n","import { ConfigError } from '@/config/ConfigError.js'\nimport { DB_PASSWORD_ENV } from '@/postgres/DB_PASSWORD_ENV.js'\nimport type { PostgresTarget } from '@/postgres/PostgresTarget.js'\nimport type { PostgresTargetFlags } from '@/postgres/PostgresTargetFlags.js'\nimport { resolvePostgresTarget } from '@/postgres/resolvePostgresTarget.js'\n\n/** Resolves the live target or fails with a configuration error naming both ways to supply one. */\nexport const requirePostgresTarget = (\n root: string,\n flags: PostgresTargetFlags,\n): PostgresTarget => {\n const target = resolvePostgresTarget(root, flags)\n if (target) return target\n throw new ConfigError(\n `perf needs --db-url, or a linked project with ${DB_PASSWORD_ENV} set (the same variable the Supabase CLI reads)`,\n )\n}\n","import type { CommandIo } from '@/commands/CommandIo.js'\nimport { parseCommandArgs } from '@/commands/parseCommandArgs.js'\nimport { perfBenchAction } from '@/commands/perfBenchAction.js'\nimport { perfDiffAction } from '@/commands/perfDiffAction.js'\nimport { perfSnapshotAction } from '@/commands/perfSnapshotAction.js'\nimport { reportCommandError } from '@/commands/reportCommandError.js'\nimport { legacyConfigNotice } from '@/config/legacyConfigNotice.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { perfActionFrom } from '@/perf/perfActionFrom.js'\nimport { QUERY_TIMEOUT_MS } from '@/perf/QUERY_TIMEOUT_MS.js'\nimport { psqlSession } from '@/postgres/psqlSession.js'\nimport { requirePostgresTarget } from '@/postgres/requirePostgresTarget.js'\n\nexport const perfCommand = (argv: string[], io: CommandIo): number => {\n try {\n const { values, positionals } = parseCommandArgs(argv, {\n json: { type: 'boolean' },\n record: { type: 'boolean' },\n 'db-url': { type: 'string' },\n })\n const action = perfActionFrom(positionals)\n const config = readConfig(io.root)\n const notice = legacyConfigNotice(config)\n if (notice) io.stderr(`${notice}\\n`)\n const target = requirePostgresTarget(io.root, {\n 'db-url': values['db-url'] as string | undefined,\n })\n const timeout =\n action === 'bench' ? config.perf.benchTimeoutMs : QUERY_TIMEOUT_MS\n const session = psqlSession(io.runner, io.root, target, timeout)\n const actionIo = {\n io,\n config,\n target,\n session,\n json: values['json'] === true,\n record: values['record'] === true,\n }\n if (action === 'snapshot') return perfSnapshotAction(actionIo)\n if (action === 'diff') return perfDiffAction(actionIo)\n return perfBenchAction(actionIo)\n } catch (error) {\n return reportCommandError(error, io.stderr)\n }\n}\n","import { auditCommand } from '@/commands/auditCommand.js'\nimport { baselineCommand } from '@/commands/baselineCommand.js'\nimport { checkCommand } from '@/commands/checkCommand.js'\nimport type { CommandIo } from '@/commands/CommandIo.js'\nimport { gateCommand } from '@/commands/gateCommand.js'\nimport { initCommand } from '@/commands/initCommand.js'\nimport { perfCommand } from '@/commands/perfCommand.js'\n\nexport const COMMANDS: Record<\n string,\n (argv: string[], io: CommandIo) => number\n> = {\n init: initCommand,\n check: checkCommand,\n audit: auditCommand,\n gate: gateCommand,\n baseline: baselineCommand,\n perf: perfCommand,\n}\n","export const USAGE = `usage: codeality-db [--project <dir>] <command> [options]\n\n init [--check|--apply|--force] detect stacks, write codeality-db.json, the db:gate script and the CI workflow\n check [--json] static findings from the repository alone\n audit --linked|--db-url <url> [--json] findings from the live database\n gate [--json] check (or baseline check) and the linked audit, one exit code\n baseline create|update|check [--check-stale] record, refresh or enforce the debt the project carries\n perf snapshot|diff|bench [--db-url <url>] [--json] [--record] record, compare and benchmark the live database\n\nexit codes: 0 passed, 1 findings, 2 invalid usage or configuration, 3 required tool missing or unusable\n`\n","import { COMMANDS } from '@/cli/COMMANDS.js'\nimport { USAGE } from '@/cli/USAGE.js'\nimport type { CommandIo } from '@/commands/CommandIo.js'\nimport { ExitCode } from '@/model/ExitCode.js'\nimport { PACKAGE_VERSION } from '@/packageVersion.js'\n\n/** Dispatches the argument vector (without the node and script entries) and returns the exit code. */\nexport const runCli = (argv: string[], io: CommandIo): number => {\n const args = [...argv]\n if (args.includes('--version')) {\n io.stdout(`codeality-db ${PACKAGE_VERSION}\\n`)\n return ExitCode.OK\n }\n if (args.includes('--help') || args.includes('-h')) {\n io.stdout(USAGE)\n return ExitCode.OK\n }\n let root = io.root\n if (args[0] === '--project') {\n root = args[1] ?? ''\n args.splice(0, 2)\n }\n const [command, ...rest] = args\n const handler = command === undefined ? undefined : COMMANDS[command]\n if (!handler) {\n io.stderr(USAGE)\n return ExitCode.CONFIGURATION\n }\n return handler(rest, { ...io, root })\n}\n","import { spawnSync } from 'node:child_process'\nimport { delimiter, join } from 'node:path'\nimport { env as processEnv } from 'node:process'\n\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { packageBinPath } from '@/tools/packageBinPath.js'\n\nexport const spawnRunner: CommandRunner = (command, args, options) => {\n // The project's tools win; the package's own follow; the shell's PATH last.\n // A command that receives a credential resolves from the shell's PATH alone.\n const path = options.systemPathOnly\n ? (processEnv['PATH'] ?? '')\n : [\n join(options.cwd, 'node_modules/.bin'),\n packageBinPath(),\n processEnv['PATH'] ?? '',\n ].join(delimiter)\n const child = spawnSync(command, args, {\n cwd: options.cwd,\n encoding: 'utf8',\n maxBuffer: 64 * 1024 * 1024,\n env: { ...processEnv, ...options.env, PATH: path },\n })\n // The typings promise strings, but a spawn that never started hands back null.\n const output: { stdout: string | null; stderr: string | null } = child\n return {\n status: child.status ?? -1,\n stdout: output.stdout ?? '',\n stderr: output.stderr ?? '',\n missing:\n (child.error as NodeJS.ErrnoException | undefined)?.code === 'ENOENT',\n }\n}\n","import { fileURLToPath } from 'node:url'\n\n// The package's own `node_modules/.bin`: one level up from both `dist/cli.js`\n// and `src/tools/`. When a consumer installs the peers next to this package\n// rather than in the project, or runs the bin from a checkout, this is where\n// squawk, prisma-lint and eslint live.\nexport const packageBinPath = (): string =>\n fileURLToPath(new URL('../node_modules/.bin', import.meta.url))\n"],"mappings":";AAAA,SAAS,MAAM,KAAK,MAAM,QAAQ,cAAc;;;ACCzC,IAAM,iBAAiB,CAAC,UAA2B;AACxD,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,IAAI,IAAI,KAAK;AAClC,WACE,SAAS,SAAS,cAAc,KAChC,SAAS,SAAS,sBAAsB;AAAA,EAE5C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACVO,IAAM,cAAN,cAA0B,MAAM;AAAC;;;ACSjC,IAAM,YAAY,CACvB,QACA,WAC4D;AAC5D,QAAM,WAAW,YAAY,UAAU,eAAe,OAAO,KAAK;AAClE,QAAM,OAAO,OAAO,MAAM,SAAS,UAAa,WAAW;AAC3D,QAAM,UAAU;AAAA,IACd,GAAI,WACA,CAAC,IACD,CAAC,4DAA4D;AAAA,IACjE,GAAI,OAAO,MAAM,SAAS,UAAa,CAAC,OACpC;AAAA,MACE;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACA,MAAI,CAAC,YAAY,CAAC,MAAM;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,UAAU,MAAM,QAAQ;AACnC;;;AChCA,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AAMd,IAAM,qBAAqB,CAChC,MACA,WACgB;AAChB,MAAI,OAAO,QAAQ,EAAG,QAAO,EAAE,OAAO,OAAO,QAAQ,EAAE;AACvD,MAAI,OAAO,QAAQ;AACjB,QAAI,CAAC,WAAW,KAAK,MAAM,4BAA4B,CAAC,GAAG;AACzD,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AACA,QAAM,IAAI,YAAY,kCAAkC;AAC1D;;;ACrBA;AAAA,EACE,cAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,QAAAC,aAAY;;;ACNd,IAAM,iBAAiB,CAAC,QAAsC;AACnE,QAAM,SAAS,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK;AACpC,MAAI,WAAW,cAAc,WAAW,aAAc,QAAO;AAC7D,MAAI,WAAW,QAAS,QAAO;AAC/B,QAAM,IAAI;AAAA,IACR,+CAA+C,MAAM;AAAA,EACvD;AACF;;;ACPO,IAAM,aAAa,CAAC,MAAc,aACvC,SAAS,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;;;ACH9C,SAAS,kBAAkB;AAOpB,IAAM,qBAAqB,CAChC,SACA,YAEA,WAAW,QAAQ,EAChB,OAAO,CAAC,KAAK,QAAQ,MAAM,QAAQ,MAAM,OAAO,EAAE,KAAK,GAAG,CAAC,EAC3D,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;;;ACRT,IAAM,mBAAmB,CAC9B,MACA,SACA,aACc;AACd,QAAM,EAAE,OAAO,IAAI,KAAK,MAAM,IAAI;AAClC,SAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,QAAI,MAAM,YAAY,UAAU,MAAM,YAAY,OAAQ,QAAO,CAAC;AAClE,UAAM,OAAO,UAAU,MAAM,IAAI;AACjC,QAAI,WAAW,MAAM,QAAQ,EAAG,QAAO,CAAC;AACxC,UAAM,UAAU;AAAA,MACd;AAAA,MACA,UACE,MAAM,YAAY,SAAU,UAAqB;AAAA,MACnD,MAAM,GAAG,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,SAAS,SAAS,MAAM,YAAY,SAAS,WAAW,QAAQ,KAAK,MAAM,IAAI;AAAA,MAC/E,SAAS,CAAC,MAAM,OAAO,MAAM,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC/D;AACA,WAAO;AAAA,MACL,EAAE,GAAG,SAAS,aAAa,mBAAmB,SAAS,MAAM,IAAI,EAAE;AAAA,IACrE;AAAA,EACF,CAAC;AACH;;;AC3BO,IAAM,0BAA0B,CAAC,MAAc,QAAwB;AAC5E,QAAM,OAAO,eAAe,GAAG;AAC/B,QAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,QAAM,QAAQ;AAAA,IACZ,eAAe,IAAI;AAAA,IACnB,WAAW,IAAI;AAAA,IACf,WAAW,OAAO,QAAQ;AAAA,IAC1B,WAAW,OAAO,SAAS,SAAS,aAAa,SAAS,OAAO;AAAA,IACjE,eAAe,mBAAmB,OAAO,QAAQ,CAAC;AAAA,IAClD,eAAe,KAAK,UAAU,mBAAmB,OAAO,QAAQ,CAAC,CAAC;AAAA,IAClE,eAAe,OAAO,SAAS,MAAM,CAAC,CAAC;AAAA,IACvC,GAAI,SAAS,aAAa,CAAC,kBAAkB,IAAI,CAAC;AAAA,EACpD;AACA,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5B;;;ACfO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C,YAAY,MAAc,MAAc;AACtC,UAAM,GAAG,IAAI,qCAAqC,IAAI,EAAE;AAAA,EAC1D;AACF;;;ANgBO,IAAM,UAAU,CACrB,QACA,MACA,MACA,aACc;AACd,QAAM,UAAU,YAAYC,MAAK,OAAO,GAAG,oBAAoB,CAAC;AAChE,MAAI;AACF,UAAM,gBAAgBA,MAAK,SAAS,mBAAmB;AACvD,UAAM,UAAUA,MAAK,SAAS,cAAc;AAC5C,kBAAc,eAAe,wBAAwB,aAAa,KAAK,GAAG,CAAC;AAC3E,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,eAAe,KAAK,GAAG,CAAC;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG,KAAK,GAAG;AAAA,MACb;AAAA,MACA,EAAE,KAAK,MAAM,KAAK,EAAE,0BAA0B,QAAQ,EAAE;AAAA,IAC1D;AACA,QAAI,OAAO,QAAS,OAAM,IAAI,iBAAiB,OAAO,YAAY;AAClE,QAAI,CAACC,YAAW,OAAO,GAAG;AACxB,YAAM,OAAO,OAAO,OAAO,KAAK,EAAE,MAAM,IAAI;AAC5C,YAAM,IAAI;AAAA,QACR,uCAAuC,OAAO,OAAO,MAAM,CAAC,MAAM,IAAI;AAAA,MACxE;AAAA,IACF;AACA,WAAO,iBAAiB,aAAa,SAAS,MAAM,GAAG,KAAK,KAAK,QAAQ;AAAA,EAC3E,UAAE;AACA,WAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAClD;AACF;;;AOxDO,IAAM,mBAA4D;AAAA,EACvE,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACR;;;ACHO,IAAM,qBAAqB,CAChCC,SACA,aACc;AACd,QAAM,EAAE,QAAQ,IAAI,KAAK,MAAMA,OAAM;AACrC,SAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,UAAM,OAAO,UAAU,MAAM,IAAI;AACjC,QAAI,WAAW,MAAM,QAAQ,EAAG,QAAO,CAAC;AACxC,UAAM,UACJ,MAAM,UAAU,UAAU,MAAM,SAAS,OACrC,GAAG,MAAM,SAAS,MAAM,IAAI,MAAM,SAAS,IAAI,KAC/C;AACN,UAAM,UAAU;AAAA,MACd;AAAA,MACA,UAAU,iBAAiB,MAAM,KAAK;AAAA,MACtC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,MAAM,OAAO,WAAW,OAAO,GAAG;AAAA,MAC3C;AAAA,IACF;AACA,WAAO;AAAA,MACL,EAAE,GAAG,SAAS,aAAa,mBAAmB,SAAS,MAAM,MAAM,EAAE;AAAA,IACvE;AAAA,EACF,CAAC;AACH;;;AC1BO,IAAM,gBAAgB,CAAC,SAAuC;AACnE,QAAM,QAAQ,KAAK,QAAQ,iBAAiB;AAC5C,MAAI,UAAU,GAAI,QAAO;AACzB,WACM,MAAM,KAAK,QAAQ,KAAK,KAAK,GACjC,QAAQ,IACR,MAAM,KAAK,QAAQ,KAAK,MAAM,CAAC,GAC/B;AACA,QAAI;AACF,YAAM,EAAE,MAAM,IAAI,KAAK,MAAM,KAAK,MAAM,OAAO,MAAM,CAAC,CAAC;AAGvD,aAAO,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ;AAAA,IACpD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO,EAAE,MAAM,WAAW,SAAS,KAAK,MAAM,OAAO,QAAQ,GAAG,EAAE;AACpE;;;ACdO,IAAM,eAAe,CAC1B,QACA,MACA,MACA,UACW;AACX,QAAM,SAAS,OAAO,YAAY,MAAM,EAAE,KAAK,KAAK,CAAC;AACrD,MAAI,OAAO;AACT,UAAM,IAAI,iBAAiB,YAAY,0BAA0B;AACnE,QAAM,UAAU,cAAc,GAAG,OAAO,MAAM;AAAA,EAAK,OAAO,MAAM,EAAE;AAClE,MAAI,WAAW,OAAO,WAAW,GAAG;AAClC,UAAM,OAAO,SAAS,QAAQ,OAAO,OAAO,MAAM;AAClD,UAAM,IAAI;AAAA,MACR,GAAG,KAAK,YAAY,IAAI,KAAK,SAAS,WAAW,OAAO,OAAO,KAAK,CAAC;AAAA,IACvE;AAAA,EACF;AACA,SAAO,OAAO,OAAO,MAAM,OAAO,OAAO,QAAQ,GAAG,CAAC;AACvD;;;ACvBO,IAAM,aAAa,CAAC,WACzB,WAAW,SAAS,CAAC,YAAY,OAAO,KAAK,IAAI,CAAC,UAAU;;;ACIvD,IAAM,cAAc,CACzB,QACA,MACA,QACA,aAEA;AAAA,EACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,WAAW,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AAAA,EACA;AACF;;;ACxBK,IAAM,aAAa,CACxBC,SACA,WACA,aACc;AACd,MAAI,WAAW,UAAU,QAAQ,EAAG,QAAO,CAAC;AAC5C,QAAM,EAAE,KAAK,IAAI,KAAK,MAAMA,OAAM;AAClC,SAAO,KACJ,OAAO,CAAC,QAAQ,OAAO,IAAI,KAAK,IAAI,SAAS,EAC7C,IAAI,CAAC,QAAQ;AACZ,UAAM,UAAU;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,gBAAgB,IAAI,KAAK,KAAK,IAAI,KAAK;AAAA,MAChD,SAAS,IAAI;AAAA,IACf;AACA,WAAO,EAAE,GAAG,SAAS,aAAa,mBAAmB,SAAS,IAAI,IAAI,EAAE;AAAA,EAC1E,CAAC;AACL;;;ACnBO,IAAM,kBAAkB,CAC7BC,SACA,aACc;AACd,MAAI,WAAW,UAAU,QAAQ,EAAG,QAAO,CAAC;AAC5C,QAAM,EAAE,KAAK,IAAI,KAAK,MAAMA,OAAM;AAClC,SAAO,KACJ;AAAA,IACC,CAAC,SACE,IAAI,UAAU,IAAI,gBAAgB,QAAQ,CAAC,IAAI,KAAK,SAAS,OAAO;AAAA,EACzE,EACC,IAAI,CAAC,QAAQ;AACZ,UAAM,UAAU;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,iCAAiC,IAAI,IAAI;AAAA,MAClD,SAAS,IAAI;AAAA,IACf;AACA,WAAO,EAAE,GAAG,SAAS,aAAa,mBAAmB,SAAS,IAAI,IAAI,EAAE;AAAA,EAC1E,CAAC;AACL;;;ACpBO,IAAM,aAAa,CACxB,QACA,MACA,QACA,WACc;AACd,QAAM,QAAQ,CAAC,WACb;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,WAAW,MAAM;AAAA,IACtB;AAAA,IACA,oBAAoB,MAAM;AAAA,EAC5B;AACF,SAAO;AAAA,IACL,GAAG,gBAAgB,MAAM,aAAa,GAAG,OAAO,OAAO;AAAA,IACvD,GAAG,WAAW,MAAM,OAAO,GAAG,OAAO,MAAM,gBAAgB,OAAO,OAAO;AAAA,EAC3E;AACF;;;AC/BO,IAAM,kBAAkB,CAAC,GAAY,MAC1C,EAAE,KAAK,cAAc,EAAE,IAAI,KAC3B,EAAE,OAAO,EAAE,QACX,EAAE,KAAK,cAAc,EAAE,IAAI;;;ACGtB,IAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA+B;AAC7B,QAAM,OAAO,UAAU,QAAQ,MAAM;AACrC,QAAM,WAAsB,CAAC;AAC7B,MAAI,KAAK,QAAQ,WAAW,UAAU,OAAO,MAAM,SAAS,QAAW;AACrE,UAAM,OAAO,EAAE,KAAK,OAAO,MAAM,MAAM,KAAK,OAAO,MAAM;AACzD,aAAS,KAAK,GAAG,QAAQ,QAAQ,MAAM,MAAM,OAAO,OAAO,CAAC;AAAA,EAC9D;AACA,MAAI,KAAK,UAAU;AACjB,aAAS;AAAA,MACP,GAAG,YAAY,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,MACnD,GAAG,WAAW,QAAQ,MAAM,QAAQ,MAAM;AAAA,IAC5C;AAAA,EACF;AACA,SAAO,SAAS,KAAK,eAAe;AACtC;;;ACzBO,IAAM,iBAAiB,CAAC,aAC7B;AAAA,EACE,GAAG,SAAS;AAAA,IACV,CAAC,MACC,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,OAAO,GAAG,EAAE,UAAU,KAAK,EAAE,OAAO,MAAM,EAAE;AAAA,EAC5F;AAAA,EACA,GAAG,OAAO,SAAS,MAAM,CAAC;AAC5B,EAAE,KAAK,IAAI;;;ACPN,IAAM,qBAAqB,CAAC,aACjC,KAAK,UAAU,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,CAAC;;;ACHxD,SAAS,iBAAiB;AAKnB,IAAM,mBAAmB,CAC9BC,OACA,YACe;AACf,MAAI;AACF,UAAM,SAAS,UAAU;AAAA,MACvB,MAAMA;AAAA,MACN;AAAA,MACA,kBAAkB;AAAA,MAClB,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,EAAE,QAAQ,OAAO,QAAQ,aAAa,OAAO,YAAY;AAAA,EAClE,SAAS,OAAO;AACd,UAAM,IAAI,YAAa,MAAgB,OAAO;AAAA,EAChD;AACF;;;ACnBO,IAAM,WAAW;AAAA,EACtB,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,eAAe;AAAA,EACf,gBAAgB;AAClB;;;ACFO,IAAM,qBAAqB,CAChC,OACAC,YACW;AACX,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,EAAAA,QAAO,GAAG,gBAAgB,wBAAwB,OAAO,KAAK,OAAO;AAAA,CAAI;AACzE,SAAO,gBAAgB,SAAS,gBAAgB,SAAS;AAC3D;;;ACZO,IAAM,kBAAkB;;;ACIxB,IAAM,qBAAqB,CAChC,WAEA,OAAO,kBAAkB,IACrB,GAAG,eAAe,gHAClB;;;ACTN,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,aAAY;;;ACCd,IAAM,eAAe,CAAC,WAAoB,YAA0B;AACzE,MAAI,CAAC,UAAW,OAAM,IAAI,YAAY,OAAO;AAC/C;;;ACDO,IAAM,mBAAmB,CAC9B,UAC6B;AAC7B,QAAM,SAAS,QAAQ,QAAQ,KAAK;AACpC,QAAM,iBAAiB,QAAQ,gBAAgB,KAAK;AACpD,QAAM,OAAO,QAAQ,MAAM;AAC3B,eAAa,OAAO,WAAW,WAAW,gCAAgC;AAC1E;AAAA,IACE,OAAO,mBAAmB;AAAA,IAC1B;AAAA,EACF;AACA;AAAA,IACE,SAAS,UAAa,OAAO,SAAS;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAqB;AAAA,EACvD;AACF;;;ACvBO,IAAM,cAAc,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;ACPM,IAAM,gBAAgB,CAC3B,KACA,SACwC;AACxC,QAAM,QAAQ,IAAI,IAAI;AACtB,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,UAAM,IAAI,YAAY,GAAG,IAAI,oBAAoB;AAAA,EACnD;AACA,SAAO;AACT;;;ACbO,IAAM,wBACX;;;ACIK,IAAM,mBAAmB,CAC9B,KACA,kBACiB;AACjB,MAAI,OAAO,QAAQ,UAAU;AAC3B,QAAI,kBAAkB,EAAG,QAAO,EAAE,MAAM,KAAK,QAAQ,sBAAsB;AAC3E,UAAM,IAAI;AAAA,MACR,sCAAsC,GAAG;AAAA,IAC3C;AAAA,EACF;AACA,MAAI,OAAO,QAAQ,YAAY,QAAQ;AACrC,UAAM,IAAI,YAAY,iCAAiC;AACzD,QAAM,EAAE,MAAM,OAAO,IAAI;AACzB,MAAI,OAAO,SAAS;AAClB,UAAM,IAAI,YAAY,+BAA+B;AACvD,MAAI,OAAO,WAAW,YAAY,OAAO,KAAK,MAAM;AAClD,UAAM,IAAI,YAAY,qCAAqC,IAAI,GAAG;AACpE,SAAO,EAAE,MAAM,OAAO;AACxB;;;ACnBO,IAAM,qBAAqB,CAChC,KACA,kBACmB;AACnB,MAAI,QAAQ,OAAW,QAAO,CAAC;AAC/B,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,OAAM,IAAI,YAAY,wBAAwB;AACvE,SAAO,IAAI,IAAI,CAAC,UAAU,iBAAiB,OAAO,aAAa,CAAC;AAClE;;;ACXO,IAAM,oBAAoB,CAAC,UAChC,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,QAAQ;;;ACD3D,IAAM,eAAe,CAAC,UAC3B,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ;;;ACCjE,IAAM,gBAA4B;AAAA,EACvC,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,OAAO,CAAC,iBAAiB,gBAAgB,UAAU;AAAA,EACnD,QAAQ,CAAC;AACX;;;ACZO,IAAM,oBAAoB;;;ACO1B,IAAM,kBAAkB,CAC7B,QACe;AACf,QAAM,SAAkC,EAAE,GAAG,eAAe,GAAG,IAAI;AACnE,aAAW,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACE;AAAA,MACE,OAAO,OAAO,GAAG,MAAM;AAAA,MACvB,QAAQ,GAAG;AAAA,IACb;AACF,aAAW,OAAO,CAAC,YAAY,aAAa,gBAAgB;AAC1D;AAAA,MACE,kBAAkB,OAAO,GAAG,CAAC;AAAA,MAC7B,QAAQ,GAAG;AAAA,IACb;AACF;AAAA,IACE,OAAO,OAAO,QAAQ,MAAM;AAAA,IAC5B;AAAA,EACF;AACA;AAAA,IACE,OAAO,OAAO,UAAU,MAAM;AAAA,IAC9B;AAAA,EACF;AACA;AAAA,IACE,aAAa,OAAO,OAAO,CAAC;AAAA,IAC5B;AAAA,EACF;AACA;AAAA,IACE,aAAa,OAAO,QAAQ,CAAC;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,OAAO;AAC5B,eAAa,MAAM,SAAS,GAAG,wCAAwC;AACvE,QAAM,MAAM,MAAM,KAAK,CAAC,SAAS,CAAC,kBAAkB,KAAK,IAAI,CAAC;AAC9D,MAAI,QAAQ;AACV,UAAM,IAAI;AAAA,MACR,iCAAiC,kBAAkB,MAAM,MAAM,GAAG;AAAA,IACpE;AACF,SAAO;AACT;;;ACjDO,IAAM,qBAAqB,CAChC,YAC4C;AAC5C,QAAM,QAAQ,QAAQ,OAAO;AAC7B,QAAM,cAAc,QAAQ,aAAa,KAAK,CAAC,MAAM,IAAI;AACzD,MAAI,CAAC,aAAa,KAAK;AACrB,UAAM,IAAI,YAAY,yCAAyC;AACjE,MAAI,CAAC,aAAa,WAAW,GAAG;AAC9B,UAAM,IAAI,YAAY,+CAA+C;AAAA,EACvE;AACA,SAAO,EAAE,OAAO,YAAY;AAC9B;;;ACXO,IAAM,uBAAuB,CAClC,QACoB;AACpB,QAAM,QAAQ,IAAI,OAAO;AACzB,MAAI,CAAC,aAAa,KAAK;AACrB,UAAM,IAAI,YAAY,2CAA2C;AACnE,MAAI,MAAM,WAAW;AACnB,UAAM,IAAI,YAAY,kDAAkD;AAC1E,SAAO,EAAE,MAAM;AACjB;;;ACNO,IAAM,oBAAoB,CAC/B,QACkB;AAClB,QAAM,SAAwB,CAAC;AAC/B,QAAM,WAAW,cAAc,KAAK,UAAU;AAC9C,MAAI,UAAU;AACZ,UAAM,aAAa,SAAS,YAAY;AACxC,QAAI,OAAO,eAAe;AACxB,YAAM,IAAI,YAAY,sCAAsC;AAC9D,WAAO,WAAW,EAAE,WAAW;AAAA,EACjC;AACA,QAAM,SAAS,cAAc,KAAK,QAAQ;AAC1C,MAAI,QAAQ;AACV,UAAM,SAAS,OAAO,QAAQ;AAC9B,QAAI,OAAO,WAAW;AACpB,YAAM,IAAI,YAAY,gCAAgC;AACxD,WAAO,SAAS,EAAE,OAAO;AAAA,EAC3B;AACA,QAAM,UAAU,cAAc,KAAK,SAAS;AAC5C,MAAI,QAAS,QAAO,UAAU,mBAAmB,OAAO;AACxD,QAAM,SAAS,cAAc,KAAK,QAAQ;AAC1C,MAAI,QAAQ;AACV,UAAM,QAAQ,OAAO,OAAO;AAC5B,QAAI,CAAC,aAAa,KAAK;AACrB,YAAM,IAAI,YAAY,wCAAwC;AAChE,WAAO,SAAS,EAAE,MAAM;AAAA,EAC1B;AACA,QAAM,YAAY,cAAc,KAAK,WAAW;AAChD,MAAI,UAAW,QAAO,YAAY,qBAAqB,SAAS;AAChE,SAAO;AACT;;;AC3BO,IAAM,qBAAqB,CAAC,aAAuC;AACxE,MACE,OAAO,aAAa,YACpB,aAAa,QACb,MAAM,QAAQ,QAAQ,GACtB;AACA,UAAM,IAAI,YAAY,iCAAiC;AAAA,EACzD;AACA,QAAM,MAAM;AACZ,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAAC,YAAY,IAAI,GAAG,EAAG,OAAM,IAAI,YAAY,gBAAgB,GAAG,GAAG;AAAA,EACzE;AACA,QAAM,gBAAgB,IAAI,eAAe;AACzC,MAAI,kBAAkB,KAAK,kBAAkB;AAC3C,UAAM,IAAI,YAAY,8BAA8B;AACtD,SAAO;AAAA,IACL;AAAA,IACA,GAAG,kBAAkB,GAAG;AAAA,IACxB,OAAO,iBAAiB,cAAc,KAAK,OAAO,CAAC;AAAA,IACnD,MAAM,gBAAgB,cAAc,KAAK,MAAM,CAAC;AAAA,IAChD,SAAS,mBAAmB,IAAI,SAAS,GAAG,aAAa;AAAA,EAC3D;AACF;;;AhBxBO,IAAM,aAAa,CAAC,SAAkC;AAC3D,QAAM,OAAOC,MAAK,MAAM,eAAe;AACvC,MAAI,CAACC,YAAW,IAAI,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,GAAG,eAAe,iBAAiB,IAAI;AAAA,IACzC;AAAA,EACF;AACA,MAAI;AACJ,MAAI;AACF,eAAW,KAAK,MAAMC,cAAa,MAAM,MAAM,CAAC;AAAA,EAClD,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,GAAG,eAAe,uBAAwB,MAAgB,OAAO;AAAA,IACnE;AAAA,EACF;AACA,SAAO,mBAAmB,QAAQ;AACpC;;;AiBZO,IAAM,eAAe,CAACC,OAAgB,OAA0B;AACrE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,iBAAiBA,OAAM;AAAA,MACxC,MAAM,EAAE,MAAM,UAAU;AAAA,MACxB,QAAQ,EAAE,MAAM,UAAU;AAAA,MAC1B,UAAU,EAAE,MAAM,SAAS;AAAA,IAC7B,CAAC;AACD,UAAM,SAAS,WAAW,GAAG,IAAI;AACjC,UAAM,SAAS,mBAAmB,MAAM;AACxC,QAAI,OAAQ,IAAG,OAAO,GAAG,MAAM;AAAA,CAAI;AACnC,UAAM,SAAS,mBAAmB,GAAG,MAAM;AAAA,MACzC,QAAQ,OAAO,QAAQ,MAAM;AAAA,MAC7B,UAAU,OAAO,QAAQ;AAAA,IAC3B,CAAC;AACD,eAAWC,WAAU,UAAU,QAAQ,MAAM,EAAE;AAC7C,SAAG,OAAO,GAAGA,OAAM;AAAA,CAAI;AACzB,UAAM,WAAW,SAAS;AAAA,MACxB,MAAM,GAAG;AAAA,MACT;AAAA,MACA,QAAQ,GAAG;AAAA,MACX;AAAA,IACF,CAAC;AACD,OAAG;AAAA,MACD,GAAG,OAAO,MAAM,MAAM,OAAO,mBAAmB,QAAQ,IAAI,eAAe,QAAQ,CAAC;AAAA;AAAA,IACtF;AACA,WAAO,SAAS,SAAS,IAAI,SAAS,WAAW,SAAS;AAAA,EAC5D,SAAS,OAAO;AACd,WAAO,mBAAmB,OAAO,GAAG,MAAM;AAAA,EAC5C;AACF;;;ACzCA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;;;ACDd,IAAM,oBAAoB;;;ACA1B,IAAM,iBACX;;;ACGK,IAAM,qBAAqB,CAAC,gBAA0C;AAC3E,QAAM,SAAS,YAAY,CAAC;AAC5B,MAAI,WAAW,YAAY,WAAW,YAAY,WAAW;AAC3D,WAAO;AACT,QAAM,IAAI,YAAY,cAAc;AACtC;;;ACHO,IAAM,mBAAmB,CAC9B,UACA,aACuB;AACvB,QAAM,UAAU,IAAI,IAAI,SAAS,OAAO;AACxC,QAAM,UAAU,IAAI,IAAI,SAAS,IAAI,CAAC,YAAY,QAAQ,WAAW,CAAC;AACtE,SAAO;AAAA,IACL,KAAK,SAAS,OAAO,CAAC,YAAY,CAAC,QAAQ,IAAI,QAAQ,WAAW,CAAC;AAAA,IACnE,OAAO,SAAS,OAAO,CAAC,YAAY,QAAQ,IAAI,QAAQ,WAAW,CAAC;AAAA,IACpE,UAAU,SAAS,QAAQ,OAAO,CAAC,UAAU,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,KAAK;AAAA,EACzE;AACF;;;ACjBA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,aAAY;AAMd,IAAM,eAAe,CAAC,SAA+B;AAC1D,QAAM,OAAOC,MAAK,MAAM,iBAAiB;AACzC,MAAI,CAACC,YAAW,IAAI,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,GAAG,iBAAiB;AAAA,IACtB;AAAA,EACF;AACA,QAAM,WAAW,KAAK;AAAA,IACpBC,cAAa,MAAM,MAAM;AAAA,EAC3B;AACA,MAAI,SAAS,kBAAkB,KAAK,CAAC,MAAM,QAAQ,SAAS,OAAO,GAAG;AACpE,UAAM,IAAI,YAAY,GAAG,iBAAiB,8BAA8B;AAAA,EAC1E;AACA,SAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAa,SAAS,eAAe;AAAA,IACrC,SAAS,CAAC,GAAG,SAAS,OAAO,EAAE,KAAK;AAAA,EACtC;AACF;;;ACrBO,IAAM,mBAAmB,CAAC,eAA2C;AAC1E,QAAM,SAAS,GAAG,OAAO,WAAW,IAAI,MAAM,CAAC,SAAS,OAAO,WAAW,MAAM,MAAM,CAAC,WAAW,OAAO,WAAW,SAAS,MAAM,CAAC;AACpI,SAAO,WAAW,IAAI,SAAS,IAC3B,GAAG,MAAM;AAAA,EAAK,eAAe,WAAW,GAAG,CAAC,KAC5C;AACN;;;ACTA,SAAS,YAAY,iBAAAC,sBAAqB;AAC1C,SAAS,QAAAC,aAAY;AAMd,IAAM,gBAAgB,CAAC,MAAc,aAAiC;AAC3E,QAAM,OAAOC,MAAK,MAAM,iBAAiB;AACzC,QAAM,WAAW;AAAA,IACf,eAAe;AAAA,IACf,aAAa,SAAS;AAAA,IACtB,SAAS,CAAC,GAAG,SAAS,OAAO,EAAE,KAAK;AAAA,EACtC;AACA,EAAAC,eAAc,GAAG,IAAI,QAAQ,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AACrE,aAAW,GAAG,IAAI,QAAQ,IAAI;AAChC;;;AChBA,SAAS,gBAAgB;AAQlB,IAAM,oBAAoB,CAC/BC,SACA,MACA,aACc;AACd,MAAI,CAACA,QAAO,KAAK,EAAG,QAAO,CAAC;AAC5B,MAAI;AACJ,MAAI;AACF,YAAQ,KAAK,MAAMA,OAAM;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,MAAM,mCAAmCA,QAAO,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EAC3E;AACA,SAAO,MAAM;AAAA,IAAQ,CAAC,SACpB,KAAK,SAAS,QAAQ,CAAC,YAAY;AACjC,UAAI,CAAC,QAAQ,QAAQ,WAAW,UAAU,EAAG,QAAO,CAAC;AACrD,YAAM,OAAO,QAAQ,OAAO,MAAM,WAAW,MAAM;AACnD,YAAM,OAAO,UAAU,IAAI;AAC3B,UAAI,WAAW,MAAM,QAAQ,EAAG,QAAO,CAAC;AACxC,YAAM,UAAU;AAAA,QACd;AAAA,QACA,UAAU;AAAA,QACV,MAAM,SAAS,MAAM,KAAK,QAAQ,EAAE,WAAW,MAAM,GAAG;AAAA,QACxD,MAAM,QAAQ;AAAA,QACd,SAAS,QAAQ;AAAA,QACjB,SAAS;AAAA,MACX;AACA,aAAO;AAAA,QACL;AAAA,UACE,GAAG;AAAA,UACH,aAAa,mBAAmB,SAAS,QAAQ,OAAO;AAAA,QAC1D;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC1CA,SAAS,qBAAqB;AAGvB,IAAM,YAAY,CAAC,SACxB,cAAc,IAAI,IAAI,aAAa,IAAI,IAAI,YAAY,GAAG,CAAC;;;ACWtD,IAAM,iBAAiB,CAC5B,QACA,MACA,SACA,aACc;AACd,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,UAAU,2BAA2B;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,QAAQ;AAAA,IACb;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,KAAK,EAAE,8BAA8B,QAAQ,YAAY,KAAK,GAAG,EAAE;AAAA,IACrE;AAAA,EACF;AACA,MAAI,OAAO,SAAS;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,WAAW,KAAK,OAAO,WAAW,GAAG;AAC9C,UAAM,IAAI;AAAA,MACR,iBAAiB,OAAO,OAAO,MAAM,CAAC,KAAK,OAAO,OAAO,KAAK,CAAC;AAAA,IACjE;AAAA,EACF;AACA,SAAO,kBAAkB,OAAO,QAAQ,MAAM,QAAQ;AACxD;;;AC3CO,IAAM,wBAAwB,CACnCC,SACA,aACc;AACd,MAAI,CAACA,QAAO,KAAK,EAAG,QAAO,CAAC;AAC5B,MAAI;AACJ,MAAI;AACF,iBAAc,KAAK,MAAMA,OAAM,EAC5B;AAAA,EACL,QAAQ;AACN,UAAM,IAAI;AAAA,MACR,wCAAwCA,QAAO,MAAM,GAAG,GAAG,CAAC;AAAA,IAC9D;AAAA,EACF;AACA,SAAO,WAAW,QAAQ,CAAC,cAAc;AACvC,UAAM,OAAO,UAAU,UAAU,QAAQ;AACzC,QAAI,WAAW,MAAM,QAAQ,EAAG,QAAO,CAAC;AACxC,UAAM,UAAU;AAAA,MACd;AAAA,MACA,UAAU;AAAA,MACV,MAAM,UAAU;AAAA,MAChB,MAAM,UAAU,SAAS;AAAA,MACzB,SAAS,UAAU;AAAA,MACnB,SAAS,kBAAkB,KAAK,UAAU,OAAO,IAAI,CAAC,KAAK;AAAA,IAC7D;AACA,WAAO;AAAA,MACL;AAAA,QACE,GAAG;AAAA,QACH,aAAa,mBAAmB,SAAS,UAAU,OAAO;AAAA,MAC5D;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC7BO,IAAM,gBAAgB,CAC3B,QACA,MACA,YACA,aACc;AACd,QAAM,SAAS;AAAA,IACb;AAAA,IACA,CAAC,MAAM,UAAU,kBAAkB,GAAG,MAAM,QAAQ,UAAU;AAAA,IAC9D,EAAE,KAAK,KAAK;AAAA,EACd;AACA,MAAI,OAAO,SAAS;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,WAAW,KAAK,OAAO,WAAW,GAAG;AAC9C,UAAM,IAAI;AAAA,MACR,sBAAsB,OAAO,OAAO,MAAM,CAAC,KAAK,OAAO,OAAO,KAAK,CAAC;AAAA,IACtE;AAAA,EACF;AACA,SAAO,sBAAsB,OAAO,QAAQ,QAAQ;AACtD;;;ACzBO,IAAM,gBAAgB,CAC3B,OACA,aACc;AACd,MAAI,WAAW,MAAM,MAAM,QAAQ,EAAG,QAAO,CAAC;AAC9C,QAAM,UAAU;AAAA,IACd,MAAM,MAAM;AAAA,IACZ,UAAU,MAAM;AAAA,IAChB,MAAM,MAAM;AAAA,IACZ,MAAM;AAAA,IACN,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,EACjB;AACA,SAAO;AAAA,IACL,EAAE,GAAG,SAAS,aAAa,mBAAmB,SAAS,MAAM,OAAO,EAAE;AAAA,EACxE;AACF;;;ACpBO,IAAM,cAAc,CACzB,QACA,MACA,MACA,QACW;AACX,QAAM,SAAS,OAAO,WAAW,CAAC,SAAS,aAAa,MAAM,GAAG,GAAG;AAAA,IAClE,KAAK;AAAA,EACP,CAAC;AACD,MAAI,OAAO,SAAS;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,WAAW;AACpB,UAAM,IAAI,MAAM,qBAAqB,IAAI,KAAK,OAAO,OAAO,KAAK,CAAC,EAAE;AACtE,SAAO,OAAO;AAChB;;;ACjBO,IAAM,aAAa,CACxB,QACA,MACA,MACA,QACQ;AACR,QAAM,MAAM,YAAY,QAAQ,MAAM,MAAM,GAAG,EAAE,KAAK;AACtD,SAAO,MAAO,KAAK,MAAM,GAAG,IAAY,CAAC;AAC3C;;;ACLO,IAAM,qBAAqB,CAChC,QACA,MACA,MACA,aAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE;AAAA,EAAQ,CAAC,QACT;AAAA,IACE;AAAA,MACE,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA,SAAS,IAAI;AAAA,MACb,SAAS,OAAO,OAAO,IAAI,KAAK,CAAC,uBAAuB,IAAI,MAAM;AAAA,MAClE,SAAS,GAAG,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,MAAM;AAAA,IAC1D;AAAA,IACA;AAAA,EACF;AACF;;;ACvBK,IAAM,oBAAoB,CAC/B,QACA,MACA,MACA,aACc;AACd,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,QAAQ,KAAK,CAAC,GAAG,mBAAmB;AAC1C,MAAI,KAAK,WAAW,KAAK,UAAU,KAAM,QAAO,CAAC;AACjD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA,SAAS;AAAA,MACT,SAAS,oBAAoB,KAAK;AAAA,MAClC,SAAS;AAAA,IACX;AAAA,IACA;AAAA,EACF;AACF;;;AChCO,IAAM,gBAAgB,CAAC,cAA+B;AAC3D,QAAM,OAAO,UAAU,YAAY;AACnC,SAAO,KAAK,WAAW,sBAAsB,KAAK,KAAK,SAAS,aAAa;AAC/E;;;ACKO,IAAM,qBAAqB,CAChC,QACA,MACA,MACA,aAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE;AAAA,EAAQ,CAAC,QACT,cAAc,IAAI,GAAG,IACjB,CAAC,IACD;AAAA,IACE;AAAA,MACE,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA,SAAS,IAAI;AAAA,MACb,SAAS;AAAA,MACT,SAAS,IAAI;AAAA,IACf;AAAA,IACA;AAAA,EACF;AACN;;;AC1BK,IAAM,kBAAkB,CAC7B,QACA,MACA,OACA,aAEA,MAAM,QAAQ,CAAC,SAAS;AAAA,EACtB,GAAG,kBAAkB,QAAQ,MAAM,MAAM,QAAQ;AAAA,EACjD,GAAG,mBAAmB,QAAQ,MAAM,MAAM,QAAQ;AAAA,EAClD,GAAG,mBAAmB,QAAQ,MAAM,MAAM,QAAQ;AACpD,CAAC;;;ACjBI,IAAM,mBAAmB,CAAC,SAC/B,KAAK,YAAY,EAAE,WAAW,QAAQ,GAAG,EAAE,KAAK;;;ACE3C,IAAM,kBAAkB,CAC7B,MACA,SAEA,CAAC,GAAG,KAAK,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,cAAc,UAAU,QAAQ,IAAI;;;ACEpE,IAAM,oBAAoB,CAC/BC,SACA,KACA,aACc;AACd,MAAI,CAACA,QAAO,KAAK,EAAG,QAAO,CAAC;AAC5B,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAMA,OAAM;AAAA,EAC7B,QAAQ;AACN,UAAM,IAAI,MAAM,mCAAmCA,QAAO,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EAC3E;AACA,SAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,UAAM,OAAO,UAAU,MAAM,SAAS;AACtC,QAAI,WAAW,MAAM,QAAQ,EAAG,QAAO,CAAC;AACxC,UAAM,OAAO,IAAI,KAAK,CAAC,cAAc,UAAU,SAAS,MAAM,IAAI;AAClE,UAAM,YAAY,OAAO,gBAAgB,MAAM,MAAM,IAAI,IAAI;AAC7D,UAAM,UAAU;AAAA,MACd;AAAA,MACA,UACE,MAAM,UAAU,UAAW,UAAqB;AAAA,MAClD,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,SAAS,MAAM;AAAA,IACjB;AACA,UAAM,UAAU,YAAY,iBAAiB,UAAU,IAAI,IAAI,MAAM;AACrE,WAAO,CAAC,EAAE,GAAG,SAAS,aAAa,mBAAmB,SAAS,OAAO,EAAE,CAAC;AAAA,EAC3E,CAAC;AACH;;;AClCO,IAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACDO,IAAM,YAAY,CACvB,QACA,MACA,KACA,aACc;AACd,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,yBAAyB,KAAK,GAAG;AAAA,MACjC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC1B;AAAA,IACA,EAAE,KAAK,KAAK;AAAA,EACd;AACA,MAAI,OAAO;AACT,UAAM,IAAI,iBAAiB,UAAU,mCAAmC;AAC1E,MAAI,OAAO,WAAW,KAAK,OAAO,WAAW,GAAG;AAC9C,UAAM,IAAI;AAAA,MACR,iBAAiB,OAAO,OAAO,MAAM,CAAC,KAAK,OAAO,OAAO,KAAK,CAAC;AAAA,IACjE;AAAA,EACF;AACA,SAAO,kBAAkB,OAAO,QAAQ,KAAK,QAAQ;AACvD;;;ACjCA,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,QAAAC,aAAY;;;ACDd,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;ACDM,IAAM,sBAAsB,CACjC,UACA,UAEC,SAAS,gBAAgB,IAAI,KAAK,SAAS,qBAAqB,IAAI,MACrE,SAAS,iBAAiB,KAAK,MAAM,KACrC,SAAS,2BAA2B,KAAK,OAAO,UAAU,KAC1D,kBAAkB,IAAI,KAAK,OAAO,WAAW,KAAK,IAAI;;;ACNjD,IAAM,eAAe,CAC1B,UACA,SACY;AACZ,MAAI,UAAmB,KAAK;AAC5B,SAAO,CAAC,SAAS,aAAa,OAAO,GAAG;AACtC,QAAI,SAAS,qBAAqB,SAAS,KAAK,EAAG,QAAO;AAC1D,QAAI,oBAAoB,UAAU,OAAO,EAAG,QAAO;AACnD,QAAI,SAAS,eAAe,OAAO,EAAG,QAAO;AAC7C,cAAU,QAAQ;AAAA,EACpB;AACA,SAAO;AACT;;;ACbO,IAAM,oBAAoB,CAC/B,UACA,eAEA,SAAS,2BAA2B,UAAU,KAC9C,WAAW,KAAK,SAAS;;;ACLpB,IAAM,0BAA0B,CACrC,UACA,SAEA,SAAS,WACR,SAAS,gBAAgB,IAAI,KAC5B,SAAS,gCAAgC,IAAI;;;ACN1C,IAAM,kBAAkB,CAC7B,UACA,SACW;AACX,MACE,SAAS,gBAAgB,IAAI,KAC7B,SAAS,gCAAgC,IAAI;AAE7C,WAAO,KAAK;AACd,MAAI,CAAC,SAAS,0BAA0B,IAAI,EAAG,QAAO;AACtD,QAAM,QAAQ,KAAK,WAAW,IAAI,CAAC,aAAa;AAC9C,QAAI,CAAC,SAAS,qBAAqB,QAAQ,EAAG,QAAO;AACrD,UAAM,MACJ,SAAS,aAAa,SAAS,IAAI,KACnC,SAAS,gBAAgB,SAAS,IAAI,IAClC,SAAS,KAAK,OACd;AACN,UAAM,QAAQ,SAAS;AACvB,UAAM,OACJ,SAAS,gBAAgB,KAAK,KAAK,SAAS,iBAAiB,KAAK,IAC9D,MAAM,OACN,MAAM,SAAS,SAAS,WAAW,cACjC,SACA,MAAM,SAAS,SAAS,WAAW,eACjC,UACA;AACV,WAAO,GAAG,GAAG,IAAI,IAAI;AAAA,EACvB,CAAC;AACD,SAAO,IAAI,MAAM,KAAK,GAAG,CAAC;AAC5B;;;ACtBO,IAAM,gBAAgB,CAC3B,UACA,OACA,MACA,SAC+B;AAC/B,QAAM,QAAyB,CAAC;AAChC,MAAI,UAAyB;AAC7B,SACE,SAAS,iBAAiB,OAAO,KACjC,SAAS,2BAA2B,QAAQ,UAAU,GACtD;AACA,UAAM,QAAQ;AAAA,MACZ,MAAM,QAAQ,WAAW,KAAK;AAAA,MAC9B,MAAM,QAAQ,UAAU,IAAI,CAAC,SAAS,gBAAgB,UAAU,IAAI,CAAC;AAAA,MACrE,MAAM;AAAA,IACR,CAAC;AACD,cAAU,QAAQ,WAAW;AAAA,EAC/B;AACA,QAAM,YAAY,MAAM;AAAA,IACtB,CAAC,UACE,KAAK,SAAS,UAAU,KAAK,SAAS,UACvC,wBAAwB,UAAU,KAAK,KAAK,UAAU,CAAC,CAAC;AAAA,EAC5D;AACA,QAAM,OAAO,MAAM,SAAS;AAC5B,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,cAAc,KAAK,kBAAkB,UAAU,OAAO,EAAG,QAAO;AACpE,QAAM,OAAwB,MAC3B,MAAM,YAAY,CAAC,EACnB,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,EAAE,MAAM,KAAK,EAAE;AAC3C,SAAO;AAAA,IACL;AAAA,IACA,MAAM,KAAK,8BAA8B,KAAK,KAAK,SAAS,IAAI,CAAC,EAAE,OAAO;AAAA,IAC1E,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK,KAAK,CAAC,KAAK;AAAA,IACxB,OAAO;AAAA,IACP,QAAQ,aAAa,UAAU,KAAK;AAAA,IACpC,MAAM,MAAM,QAAQ,IAAI,EAAE,WAAW,QAAQ,GAAG;AAAA,EAClD;AACF;;;AC9CO,IAAM,cAAc,CACzB,UACA,SAEA,SAAS,2BAA2B,KAAK,MAAM,KAC/C,SAAS,iBAAiB,KAAK,OAAO,MAAM,KAC5C,KAAK,OAAO,OAAO,eAAe,KAAK;;;ACJlC,IAAM,yBAAyB,CACpC,UACA,MACA,WACqB;AACrB,QAAM,OAAO,SAAS;AAAA,IACpB;AAAA,IACA;AAAA,IACA,SAAS,aAAa;AAAA,IACtB;AAAA,IACA,KAAK,SAAS,MAAM,IAAI,SAAS,WAAW,MAAM,SAAS,WAAW;AAAA,EACxE;AACA,QAAM,SAA2B,CAAC;AAClC,QAAM,QAAQ,CAAC,SAAwB;AACrC,QAAI,SAAS,iBAAiB,IAAI,KAAK,CAAC,YAAY,UAAU,IAAI,GAAG;AACnE,YAAM,QAAQ,cAAc,UAAU,MAAM,MAAM,IAAI;AACtD,UAAI,MAAO,QAAO,KAAK,KAAK;AAAA,IAC9B;AACA,aAAS,aAAa,MAAM,KAAK;AAAA,EACnC;AACA,QAAM,IAAI;AACV,SAAO;AACT;;;AC7BA,SAAS,qBAAqB;AAUvB,IAAM,iBAAiB,CAAC,UAAsC;AACnE,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,aAAO,cAAc,IAAI,EAAE,YAAY;AAAA,IACzC,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS;AAC5C,cAAM;AAAA,IACV;AAAA,EACF;AACA,QAAM,IAAI;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;;;ACnBO,IAAM,kBAAkB,CAC7B,UAC8B;AAC9B,QAAM,QAAQ,MAAM,MAAM,CAAC;AAC3B,SAAO,MAAM,SAAS,UAAU,OAAO,SAAS,WAAW,QAAQ;AACrE;;;ACJO,IAAM,uBAAuB,CAClC,MACA,OACA,SACA,YACY;AACZ,QAAM,UAAU;AAAA,IACd,MAAM,KAAK;AAAA,IACX,UAAU,KAAK;AAAA,IACf,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACA,SAAO,EAAE,GAAG,SAAS,aAAa,mBAAmB,SAAS,MAAM,IAAI,EAAE;AAC5E;;;AChBO,IAAM,sBAAqC;AAAA,EAChD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK,CAAC,UAAU;AACd,UAAM,UAAU,gBAAgB,KAAK,GAAG,KAAK,CAAC,KAAK;AACnD,QAAI,CAAC,QAAQ,SAAS,aAAa,KAAK,QAAQ,SAAS,WAAW;AAClE,aAAO;AACT,QACE,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,WAAW,KAAK,SAAS,OAAO;AAEzE,aAAO;AACT,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACF;;;ACtBO,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;ACZM,IAAM,qBAAoC;AAAA,EAC/C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK,CAAC,OAAO,YAAY;AACvB,QAAI,MAAM,SAAS,OAAQ,QAAO;AAClC,UAAM,YAAY,QAAQ,UAAU,IAAI,UAAU,MAAM,MAAM,EAAE;AAChE,QAAI,CAAC,UAAW,QAAO;AACvB,UAAM,SAAS,MAAM,MAAM;AAAA,MACzB,CAAC,SACC,eAAe,IAAI,KAAK,IAAI,KAC5B,KAAK,KAAK,CAAC,MAAM,UACjB,KAAK,KAAK,CAAC,MAAM,OACjB,CAAC,KAAK,KAAK,CAAC,EAAE,SAAS,GAAG,KAC1B,CAAC,UAAU,QAAQ,IAAI,KAAK,KAAK,CAAC,EAAE,YAAY,CAAC;AAAA,IACrD;AACA,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,SAAS,OAAO,KAAK,CAAC,KAAK;AACjC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAG,MAAM,MAAM,IAAI,MAAM;AAAA,MACzB,GAAG,OAAO,IAAI,KAAK,MAAM;AAAA,IAC3B;AAAA,EACF;AACF;;;AC1BO,IAAM,cAA6B;AAAA,EACxC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK,CAAC,UACJ,MAAM,SACF;AAAA,IACE;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,EACF,IACA;AACR;;;ACZO,IAAM,aAA4B;AAAA,EACvC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK,CAAC,UAAU;AACd,UAAM,SAAS,gBAAgB,KAAK;AACpC,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,OAAO,OAAO,KAAK,CAAC;AAC1B,QAAI,SAAS,UAAa,SAAS,OAAO,CAAC,KAAK,SAAS,GAAG;AAC1D,aAAO;AACT,QAAI,SAAS,IAAK,QAAO;AACzB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACF;;;ACrBO,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;ACFM,IAAM,YAAY,CACvB,OACA,YACY;AACZ,MAAI,MAAM,MAAM,KAAK,CAAC,SAAS,iBAAiB,IAAI,KAAK,IAAI,CAAC,EAAG,QAAO;AACxE,MAAI,gBAAgB,KAAK,GAAG,KAAK,CAAC,GAAG,SAAS,WAAW,EAAG,QAAO;AACnE,QAAM,SAAS,QAAQ,UAAU,IAAI,UAAU,MAAM,MAAM,EAAE,GAAG;AAChE,SAAO,MAAM,MAAM;AAAA,IACjB,CAAC,SACC,KAAK,SAAS,QACd,KAAK,KAAK,CAAC,MAAM,UACjB,QAAQ,IAAI,KAAK,KAAK,CAAC,EAAE,YAAY,CAAC,MAAM;AAAA,EAChD;AACF;;;ACbO,IAAM,gBAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK,CAAC,OAAO,YAAY;AACvB,QACE,CAAC,gBAAgB,KAAK,KACtB,CAAC,QAAQ,UAAU,IAAI,UAAU,MAAM,MAAM,EAAE;AAE/C,aAAO;AACT,QAAI,UAAU,OAAO,OAAO,EAAG,QAAO;AACtC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACF;;;AChBO,IAAM,kBAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACbA,SAAS,mBAAmB;AAC5B,SAAS,QAAAC,OAAM,YAAAC,iBAAgB;;;ACD/B,SAAS,cAAAC,aAAY,gBAAgB;AAE9B,IAAM,cAAc,CAAC,SAC1BA,YAAW,IAAI,KAAK,SAAS,IAAI,EAAE,YAAY;;;ACF1C,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;AFDM,IAAM,mBAAmB,CAAC,MAAc,UAA8B;AAC3E,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,YAAYC,MAAK,MAAM,IAAI,CAAC;AAC/B,YAAM,IAAI,YAAY,qBAAqB,IAAI,sBAAsB;AAAA,EACzE;AACA,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAO,CAAC,QAAsB;AAClC,eAAW,SAAS,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC7D,UAAI,MAAM,YAAY,GAAG;AACvB,YAAI,CAAC,oBAAoB,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,GAAG;AACpE,eAAKA,MAAK,KAAK,MAAM,IAAI,CAAC;AAC5B;AAAA,MACF;AACA,YAAM,OAAO,MAAM;AACnB,UACE,CAAC,UAAU,KAAK,IAAI,KACpB,KAAK,SAAS,OAAO,KACrB,yBAAyB,KAAK,IAAI;AAElC;AACF,YAAM,KAAKC,UAAS,MAAMD,MAAK,KAAK,IAAI,CAAC,CAAC;AAAA,IAC5C;AAAA,EACF;AACA,aAAW,QAAQ,MAAO,MAAKA,MAAK,MAAM,IAAI,CAAC;AAC/C,SAAO,MAAM,KAAK;AACpB;;;AtBpBO,IAAM,oBAAoB,CAC/B,MACA,OACA,WACA,aACc;AACd,QAAM,QAAQ,gBAAgB;AAAA,IAC5B,CAAC,SAAS,CAAC,WAAW,KAAK,MAAM,QAAQ;AAAA,EAC3C;AACA,QAAM,UAAU,EAAE,UAAU;AAC5B,QAAM,WAAW,eAAe,CAACE,MAAK,MAAM,cAAc,GAAG,YAAY,GAAG,CAAC;AAC7E,SAAO,iBAAiB,MAAM,KAAK,EAChC;AAAA,IAAQ,CAAC,SACR;AAAA,MACE;AAAA,MACA;AAAA,MACAC,cAAaD,MAAK,MAAM,IAAI,GAAG,MAAM;AAAA,IACvC;AAAA,EACF,EACC,QAAQ,CAAC,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,OAAO,OAAO,CAAC,CAAC,EAChE,OAAO,CAAC,YAAgC,YAAY,MAAS,EAC7D,KAAK,eAAe;AACzB;;;AyBnCO,IAAM,gBAAgB,CAAC,QAAwB;AACpD,QAAM,QAAQ,IACX,KAAK,EACL,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,WAAW,KAAK,EAAE,EAAE,YAAY,CAAC;AACvD,SAAO,MAAM,WAAW,IAAI,UAAU,MAAM,CAAC,KAAK,EAAE,KAAK,MAAM,KAAK,GAAG;AACzE;;;ACAO,IAAM,gBAAgB,CAC3B,KACA,YAC8B;AAC9B,QAAM,SAAS,oBAAI,IAA0B;AAC7C,aAAW,QAAQ;AACjB,eAAW,aAAa,KAAK,YAAY;AACvC,YAAM,QAAQ,QAAQ,KAAK,iBAAiB,UAAU,IAAI,CAAC;AAC3D,UAAI,CAAC,QAAQ,CAAC,EAAG;AACjB,YAAM,OAAO,cAAc,MAAM,CAAC,CAAC;AACnC,UAAI,CAAC,OAAO,IAAI,IAAI,EAAG,QAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAAA,IAC7D;AACF,SAAO;AACT;;;ACdO,IAAM,gBAAgB,CAC3B,QAEA,IAAI;AAAA,EACF;AAAA,IACE,GAAG;AAAA,MACD;AAAA,MACA;AAAA,IACF;AAAA,EACF,EAAE,OAAO,CAAC,CAAC,IAAI,MAAM,KAAK,WAAW,SAAS,CAAC;AACjD;;;ACdK,IAAM,oBACX;;;ACDK,IAAM,gBAAgB,CAAC,SAAqC;AACjE,QAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,KAAK;AAC5C,QAAM,QACJ,4EAA4E;AAAA,IAC1E;AAAA,EACF;AACF,MAAI,CAAC,MAAO,QAAO;AACnB,UAAQ,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,IAAI,YAAY;AAClD;;;ACHO,IAAM,iBAAiB,CAC5B,MACA,UACY;AACZ,QAAM,QAAQ,kBAAkB,KAAK,IAAI;AACzC,MAAI,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,MAAM,OAAW,QAAO;AAClD,QAAM,SAAS,cAAc,MAAM,CAAC,CAAC;AACrC,MAAI,WAAW,OAAW,QAAO;AACjC,QAAM,QAAQ,MAAM,cAAc,MAAM,CAAC,CAAC,CAAC;AAC3C,QAAM,QAAQ,IAAI,MAAM;AACxB,QAAM,OAAO,IAAI,MAAM;AACvB,SAAO;AACT;;;ACjBO,IAAM,uBACX;;;ACIK,IAAM,oBAAoB,CAC/B,MACA,UACY;AACZ,QAAM,QAAQ,qBAAqB,KAAK,IAAI;AAC5C,MAAI,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,MAAM,OAAW,QAAO;AAClD,QAAM,SAAS,cAAc,MAAM,CAAC,CAAC;AACrC,MAAI,WAAW,OAAW,QAAO;AACjC,QAAM,QAAQ,MAAM,cAAc,MAAM,CAAC,CAAC,CAAC;AAC3C,QAAM,QAAQ,IAAI,MAAM;AACxB,MAAI,MAAM,CAAC,EAAG,OAAM,OAAO,IAAI,MAAM;AACrC,SAAO;AACT;;;ACjBO,IAAM,uBACX;;;ACDK,IAAM,mBAAmB,CAAC,SAA2B;AAC1D,QAAM,UAAoB,CAAC;AAC3B,aAAW,QAAQ,KAAK,MAAM,cAAc,GAAG;AAC7C,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,aACJ,iEAAiE;AAAA,MAC/D;AAAA,IACF;AACF,QAAI,aAAa,CAAC,GAAG;AACnB,YAAM,OAAO,WAAW,CAAC,EACtB,MAAM,GAAG,EAAE,CAAC,GACX,KAAK,EACN,WAAW,KAAK,EAAE,EAClB,YAAY;AACf,UAAI,KAAM,SAAQ,KAAK,IAAI;AAC3B;AAAA,IACF;AACA,UAAM,SACJ,kEAAkE;AAAA,MAChE;AAAA,IACF;AACF,QAAI,OAAQ,SAAQ,MAAM,OAAO,CAAC,KAAK,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;AAAA,EACvE;AACA,SAAO;AACT;;;ACnBO,IAAM,oBAAoB,CAC/B,MACA,UACY;AACZ,QAAM,QAAQ,qBAAqB,KAAK,IAAI;AAC5C,MAAI,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,MAAM,OAAW,QAAO;AAClD,QAAM,QAAQ,MAAM,cAAc,MAAM,CAAC,CAAC,CAAC;AAC3C,aAAW,UAAU,iBAAiB,MAAM,CAAC,CAAC,GAAG;AAC/C,UAAM,QAAQ,IAAI,MAAM;AACxB,UAAM,OAAO,IAAI,MAAM;AAAA,EACzB;AACA,SAAO;AACT;;;ACTO,IAAM,iBAAiB,CAC5B,QACgC;AAChC,QAAM,YAAY,oBAAI,IAA4B;AAClD,QAAM,QAAQ,CAAC,UAAkC;AAC/C,UAAM,WAAW,UAAU,IAAI,KAAK;AACpC,QAAI,SAAU,QAAO;AACrB,UAAM,QAAwB,EAAE,SAAS,oBAAI,IAAI,GAAG,QAAQ,oBAAI,IAAI,EAAE;AACtE,cAAU,IAAI,OAAO,KAAK;AAC1B,WAAO;AAAA,EACT;AACA,aAAW,SAAS,cAAc,GAAG,EAAE,KAAK,EAAG,OAAM,KAAK;AAC1D,aAAW,QAAQ;AACjB,eAAW,aAAa,KAAK,YAAY;AACvC,YAAM,OAAO,iBAAiB,UAAU,IAAI;AAC5C,UAAI,kBAAkB,MAAM,KAAK,EAAG;AACpC,UAAI,kBAAkB,MAAM,KAAK,EAAG;AACpC,qBAAe,MAAM,KAAK;AAAA,IAC5B;AACF,SAAO;AACT;;;ACvBO,IAAM,iBAAiB,CAC5B,MACA,EAAE,MAAM,UAAU,GAClB,SACA,YACY;AACZ,QAAM,UAAU;AAAA,IACd,MAAM,KAAK;AAAA,IACX,UAAU,KAAK;AAAA,IACf,MAAM,KAAK;AAAA,IACX,MAAM,UAAU;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa,mBAAmB,SAAS,iBAAiB,UAAU,IAAI,CAAC;AAAA,EAC3E;AACF;;;ACpBO,IAAM,cAAc,CAAC,cAAgD;AAC1E,QAAM,QACJ,sEAAsE;AAAA,IACpE,iBAAiB,UAAU,IAAI;AAAA,EACjC;AACF,SAAO,QAAQ,CAAC,MAAM,SAAY,SAAY,cAAc,MAAM,CAAC,CAAC;AACtE;;;ACLO,IAAM,oBAA6B;AAAA,EACxC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK,CAAC,QACJ,IAAI;AAAA,IAAQ,CAAC,SACX,KAAK,WACF,OAAO,CAAC,cAAc;AACrB,YAAM,OAAO,iBAAiB,UAAU,IAAI;AAC5C,aACE,KAAK,WAAW,eAAe,KAC/B,sCAAsC,KAAK,IAAI;AAAA,IAEnD,CAAC,EACA;AAAA,MAAI,CAAC,cACJ;AAAA,QACE;AAAA,QACA,EAAE,MAAM,UAAU;AAAA,QAClB,YAAY,SAAS,KAAK;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACJ;AACJ;;;ACvBO,IAAM,2BAAoC;AAAA,EAC/C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK,CAAC,QACJ,IAAI;AAAA,IAAQ,CAAC,SACX,KAAK,WAAW,QAAQ,CAAC,cAAc;AACrC,YAAM,OAAO,iBAAiB,UAAU,IAAI;AAC5C,YAAM,OACJ,oGAAoG;AAAA,QAClG;AAAA,MACF;AACF,UACE,CAAC,OAAO,CAAC,KACT,CAAC,KAAK,SAAS,mBAAmB,KAClC,KAAK,SAAS,kBAAkB,GAChC;AACA,eAAO,CAAC;AAAA,MACV;AACA,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA,EAAE,MAAM,UAAU;AAAA,UAClB,cAAc,KAAK,CAAC,CAAC;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACJ;;;AC7BO,IAAM,mBAA4B;AAAA,EACvC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK,CAAC,QACJ,IAAI;AAAA,IAAQ,CAAC,SACX,KAAK,WACF,OAAO,CAAC,cAAc;AACrB,YAAM,OAAO,iBAAiB,UAAU,IAAI;AAC5C,aACE,KAAK,WAAW,eAAe,KAC/B,oCAAoC,KAAK,IAAI;AAAA,IAEjD,CAAC,EACA;AAAA,MAAI,CAAC,cACJ;AAAA,QACE;AAAA,QACA,EAAE,MAAM,UAAU;AAAA,QAClB,YAAY,SAAS,KAAK;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACJ;AACJ;;;ACzBO,IAAM,eAAe,CAAC,QAAsC;AACjE,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,QAAQ;AACjB,eAAW,aAAa,KAAK,YAAY;AACvC,YAAM,QAAQ,YAAY,SAAS;AACnC,UAAI,MAAO,QAAO,IAAI,KAAK;AAAA,IAC7B;AACF,SAAO;AACT;;;ACNO,IAAM,mBAAmB,CAC9B,QAEA;AAAA,EACE;AAAA,EACA;AACF;;;ACNK,IAAM,qBAA8B;AAAA,EACzC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK,CAAC,QAAQ;AACZ,UAAM,aAAa,aAAa,GAAG;AACnC,WAAO,CAAC,GAAG,iBAAiB,GAAG,CAAC,EAC7B,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,EAC1C;AAAA,MAAI,CAAC,CAAC,OAAO,GAAG,MACf;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACJ;AACF;;;ACjBO,IAAM,kBAA2B;AAAA,EACtC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK,CAAC,QAAQ;AACZ,UAAM,UAAU,iBAAiB,GAAG;AACpC,WAAO,CAAC,GAAG,cAAc,GAAG,CAAC,EAC1B,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvC;AAAA,MAAI,CAAC,CAAC,OAAO,GAAG,MACf;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACJ;AACF;;;ACfO,IAAM,YAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACNO,IAAM,cAAc,CACzB,KACA,aAEA,UAAU,OAAO,CAAC,SAAS,CAAC,WAAW,KAAK,MAAM,QAAQ,CAAC,EACxD,QAAQ,CAAC,SAAS,KAAK,IAAI,GAAG,CAAC,EAC/B,KAAK,eAAe;;;ACbzB,SAAS,eAAAE,cAAa,gBAAAC,qBAAoB;AAC1C,SAAS,QAAAC,aAAY;;;ACId,IAAM,gBAAgB,CAC3B,KACA,UACuB;AACvB,QAAM,SAAS,gBAAgB,KAAK,IAAI,MAAM,OAAO,QAAQ,EAAE,CAAC;AAChE,MAAI,QAAQ;AACV,UAAMC,OAAM,IAAI,QAAQ,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE,MAAM;AAC3D,WAAOA,SAAQ,KAAK,IAAI,SAASA,OAAM,OAAO,CAAC,EAAE;AAAA,EACnD;AACA,QAAM,QAAQ,IAAI,KAAK;AACvB,MAAI,UAAU,OAAO,UAAU,IAAK,QAAO;AAC3C,QAAM,MAAM,IAAI,QAAQ,OAAO,QAAQ,CAAC;AACxC,SAAO,QAAQ,KAAK,IAAI,SAAS,MAAM;AACzC;;;ACbO,IAAM,mBAAmB,CAAC,QAAwB;AACvD,MAAI,MAAM;AACV,MAAI,QAAQ;AACZ,SAAO,QAAQ,IAAI,QAAQ;AACzB,UAAM,SAAS,cAAc,KAAK,KAAK;AACvC,QAAI,WAAW,QAAW;AACxB,aAAO,IAAI,MAAM,OAAO,MAAM;AAC9B,cAAQ;AAAA,IACV,WAAW,IAAI,WAAW,MAAM,KAAK,GAAG;AACtC,YAAM,MAAM,IAAI,QAAQ,MAAM,KAAK;AACnC,cAAQ,QAAQ,KAAK,IAAI,SAAS;AAAA,IACpC,WAAW,IAAI,WAAW,MAAM,KAAK,GAAG;AACtC,YAAM,MAAM,IAAI,QAAQ,MAAM,QAAQ,CAAC;AACvC,YAAM,OAAO,QAAQ,KAAK,IAAI,SAAS,MAAM;AAC7C,aAAO,IAAI,MAAM,OAAO,IAAI,EAAE,WAAW,UAAU,EAAE;AACrD,cAAQ;AAAA,IACV,OAAO;AACL,aAAO,IAAI,OAAO,KAAK;AACvB,eAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO;AACT;;;ACvBO,IAAM,qBAAqB,CAAC,QAAgC;AACjE,QAAM,OAAO,iBAAiB,GAAG;AACjC,QAAM,aAA6B,CAAC;AACpC,MAAI,QAAQ;AACZ,QAAM,QAAQ,CAAC,QAAsB;AACnC,UAAM,MAAM,KAAK,MAAM,OAAO,GAAG;AACjC,UAAM,UAAU,IAAI,SAAS,IAAI,UAAU,EAAE;AAC7C,UAAM,OAAO,IAAI,KAAK;AACtB,QAAI,MAAM;AACR,YAAM,OACJ,KAAK,KAAK,MAAM,GAAG,QAAQ,OAAO,EAAE,MAAM,KAAK,GAAG,UAAU;AAC9D,iBAAW,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA,IACtC;AACA,YAAQ,MAAM;AAAA,EAChB;AACA,MAAI,QAAQ;AACZ,SAAO,QAAQ,KAAK,QAAQ;AAC1B,UAAM,SAAS,cAAc,MAAM,KAAK;AACxC,QAAI,WAAW,OAAW,SAAQ;AAAA,SAC7B;AACH,UAAI,KAAK,KAAK,MAAM,IAAK,OAAM,KAAK;AACpC,eAAS;AAAA,IACX;AAAA,EACF;AACA,QAAM,KAAK,MAAM;AACjB,SAAO;AACT;;;AHxBO,IAAM,mBAAmB,CAC9B,MACA,kBAEAC,aAAYC,MAAK,MAAM,aAAa,CAAC,EAClC,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,CAAC,EACtC,KAAK,EACL,IAAI,CAAC,UAAU;AAAA,EACd,MAAM,GAAG,cAAc,WAAW,MAAM,GAAG,CAAC,IAAI,IAAI;AAAA,EACpD,YAAY;AAAA,IACVC,cAAaD,MAAK,MAAM,eAAe,IAAI,GAAG,MAAM;AAAA,EACtD;AACF,EAAE;;;AIJC,IAAM,WAAW,CAAC,EAAE,MAAM,QAAQ,OAAO,MAA+B;AAC7E,QAAM,WAAsB,CAAC;AAC7B,QAAM,MAAuB,OAAO,WAChC,iBAAiB,MAAM,OAAO,SAAS,UAAU,IACjD,CAAC;AACL,MAAI,OAAO,UAAU;AACnB,aAAS;AAAA,MACP,GAAG,YAAY,KAAK,OAAO,OAAO;AAAA,MAClC,GAAG,UAAU,QAAQ,MAAM,KAAK,OAAO,OAAO;AAAA,IAChD;AAAA,EACF;AACA,MAAI,OAAO,QAAQ;AACjB,aAAS;AAAA,MACP,GAAG,cAAc,QAAQ,MAAM,OAAO,OAAO,QAAQ,OAAO,OAAO;AAAA,IACrE;AAAA,EACF;AACA,MAAI,OAAO;AACT,aAAS;AAAA,MACP,GAAG,eAAe,QAAQ,MAAM,OAAO,SAAS,OAAO,OAAO;AAAA,IAChE;AACF,MAAI,OAAO,QAAQ;AACjB,aAAS;AAAA,MACP,GAAG,gBAAgB,QAAQ,MAAM,OAAO,OAAO,OAAO,OAAO,OAAO;AAAA,IACtE;AAAA,EACF;AACA,MAAI,OAAO,WAAW;AACpB,aAAS;AAAA,MACP,GAAG;AAAA,QACD;AAAA,QACA,OAAO,UAAU;AAAA,QACjB,eAAe,GAAG;AAAA,QAClB,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO,SAAS,KAAK,eAAe;AACtC;;;AClDA,SAAS,iBAAAE,sBAAqB;AAKvB,IAAM,kBACXA,eAAc,YAAY,GAAG,EAAE,iBAAiB,EAChD;;;A/EYK,IAAM,kBAAkB,CAACC,OAAgB,OAA0B;AACxE,MAAI;AACF,UAAM,EAAE,QAAQ,YAAY,IAAI,iBAAiBA,OAAM;AAAA,MACrD,eAAe,EAAE,MAAM,UAAU;AAAA,IACnC,CAAC;AACD,UAAM,SAAS,mBAAmB,WAAW;AAC7C,QAAI,WAAW,YAAYC,YAAWC,MAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG;AACvE,YAAM,IAAI;AAAA,QACR,GAAG,iBAAiB;AAAA,MACtB;AAAA,IACF;AACA,UAAM,SAAS,WAAW,GAAG,IAAI;AACjC,UAAM,SAAS,mBAAmB,MAAM;AACxC,QAAI,OAAQ,IAAG,OAAO,GAAG,MAAM;AAAA,CAAI;AACnC,UAAM,WAAW,SAAS;AAAA,MACxB,MAAM,GAAG;AAAA,MACT;AAAA,MACA,QAAQ,GAAG;AAAA,IACb,CAAC;AACD,QAAI,WAAW,SAAS;AACtB,YAAM,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,WAAW;AACjD,oBAAc,GAAG,MAAM;AAAA,QACrB,eAAe;AAAA,QACf,aAAa;AAAA,QACb;AAAA,MACF,CAAC;AACD,SAAG;AAAA,QACD,YAAY,OAAO,SAAS,MAAM,CAAC,gBAAgB,iBAAiB;AAAA;AAAA,MACtE;AACA,aAAO,SAAS;AAAA,IAClB;AACA,UAAM,aAAa,iBAAiB,UAAU,aAAa,GAAG,IAAI,CAAC;AACnE,OAAG,OAAO,GAAG,iBAAiB,UAAU,CAAC;AAAA,CAAI;AAC7C,UAAM,QACJ,OAAO,aAAa,MAAM,QAAQ,WAAW,SAAS,SAAS;AACjE,WAAO,WAAW,IAAI,SAAS,KAAK,QAAQ,SAAS,WAAW,SAAS;AAAA,EAC3E,SAAS,OAAO;AACd,WAAO,mBAAmB,OAAO,GAAG,MAAM;AAAA,EAC5C;AACF;;;AgFhDO,IAAM,eAAe,CAACC,OAAgB,OAA0B;AACrE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,iBAAiBA,OAAM,EAAE,MAAM,EAAE,MAAM,UAAU,EAAE,CAAC;AACvE,UAAM,SAAS,WAAW,GAAG,IAAI;AACjC,UAAM,SAAS,mBAAmB,MAAM;AACxC,QAAI,OAAQ,IAAG,OAAO,GAAG,MAAM;AAAA,CAAI;AACnC,UAAM,WAAW,SAAS;AAAA,MACxB,MAAM,GAAG;AAAA,MACT;AAAA,MACA,QAAQ,GAAG;AAAA,IACb,CAAC;AACD,OAAG;AAAA,MACD,GAAG,OAAO,MAAM,MAAM,OAAO,mBAAmB,QAAQ,IAAI,eAAe,QAAQ,CAAC;AAAA;AAAA,IACtF;AACA,WAAO,SAAS,SAAS,IAAI,SAAS,WAAW,SAAS;AAAA,EAC5D,SAAS,OAAO;AACd,WAAO,mBAAmB,OAAO,GAAG,MAAM;AAAA,EAC5C;AACF;;;ACzBO,IAAM,eAAe,CAAC,YAAmC;AAC9D,MAAI,QAAQ,KAAK,CAAC,WAAW,OAAO,WAAW,eAAe;AAC5D,WAAO,SAAS;AAClB,MAAI,QAAQ,KAAK,CAAC,WAAW,OAAO,WAAW,UAAU;AACvD,WAAO,SAAS;AAClB,SAAO,SAAS;AAClB;;;ACTA,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,QAAAC,cAAY;;;ACDrB,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,QAAAC,cAAY;;;ACDd,IAAM,wBAAwB;;;ACArC,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,cAAY;AAOd,IAAM,kBAAkB,CAAC,SAA0C;AACxE,QAAM,OAAOC,OAAK,MAAM,qBAAqB;AAC7C,MAAI,CAACC,YAAW,IAAI,EAAG,QAAO;AAC9B,QAAM,WAAW,KAAK;AAAA,IACpBC,cAAa,MAAM,MAAM;AAAA,EAC3B;AACA,MAAI,SAAS,kBAAkB;AAC7B,UAAM,IAAI;AAAA,MACR,GAAG,qBAAqB;AAAA,IAC1B;AACF,SAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAa,SAAS,eAAe;AAAA,IACrC,SAAS,SAAS,WAAW;AAAA,IAC7B,MAAM,SAAS,QAAQ;AAAA,IACvB,SAAS,SAAS,WAAW,CAAC;AAAA,EAChC;AACF;;;AClBO,IAAM,eAAe,CAC1B,OACA,MACA,SACA,YACY;AACZ,QAAM,UAAU;AAAA,IACd;AAAA,IACA,UAAU,SAAS,WAAY,SAAoB;AAAA,IACnD,MAAM,GAAG,MAAM,QAAQ,IAAI,MAAM,IAAI;AAAA,IACrC,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACA,SAAO,EAAE,GAAG,SAAS,aAAa,mBAAmB,SAAS,MAAM,IAAI,EAAE;AAC5E;;;ACrBO,IAAM,uBAAuB;;;ACA7B,IAAM,sBAAsB;;;ACY5B,IAAM,gBAAgB,CAC3B,OACA,UACA,SACA,cACc;AACd,QAAM,EAAE,MAAM,SAAS,IAAI;AAC3B,QAAM,WAAsB,CAAC;AAC7B,QAAM,MAAM,CAAC,MAAc,SAAiB,YAA0B;AACpE,aAAS,KAAK,aAAa,OAAO,MAAM,SAAS,OAAO,CAAC;AAAA,EAC3D;AACA,QAAM,SACJ,YACA,QAAQ,YACN,SAAS,YAAY,IAAI,KAAK,oBAAoB,QACpD,QAAQ,WAAW,SAAS,YAAY;AAC1C,MAAI;AACF;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN,UAAU,SAAS,SAAS,QAAQ,CAAC,CAAC,UAAU,QAAQ,SAAS,QAAQ,CAAC,CAAC,SAAS,OAAO,KAAK,OAAO,QAAQ,WAAW,SAAS,WAAW,KAAK,GAAG,CAAC,CAAC,WAAW,OAAO,QAAQ,IAAI,CAAC;AAAA,IACzL;AACF,QAAM,WAAW,WACb,QAAQ,SAAS;AAAA,IACf,CAAC,SACC,CAAC,SAAS,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,KAAK,QAAQ,MAC1D,KAAK,QAAQ,KAAK,eACjB,SAAS,WAAW,SAAS,KAAK,QAAQ;AAAA,EAChD,IACA,CAAC;AACL,aAAW,QAAQ;AACjB;AAAA,MACE;AAAA,MACA,KAAK;AAAA,MACL,wBAAwB,KAAK,KAAK,eAAe,OAAO,CAAC,aAAa,KAAK,QAAQ,0BAA0B,UAAU,WAAW,SAAS,KAAK,QAAQ,IAAI,kBAAkB,MAAM;AAAA,IACtL;AACF,MAAI,QAAQ,sBAAsB;AAChC;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN,2BAA2B,OAAO,KAAK,MAAM,QAAQ,kBAAkB,CAAC,CAAC;AAAA,IAC3E;AACF,SAAO,SAAS,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC7D;;;ACxDA,SAAS,eAAAC,cAAa,gBAAAC,qBAAoB;AAC1C,SAAS,QAAAC,cAAY;;;ACAd,IAAM,cAAc;;;ADSpB,IAAM,mBAAmB,CAC9B,MACA,UACA,gBACiB;AACjB,QAAM,MAAMC,OAAK,MAAM,QAAQ;AAC/B,MAAI,CAAC,YAAY,GAAG,EAAG,OAAM,IAAI,YAAY,GAAG,QAAQ,qBAAqB;AAC7E,SAAOC,aAAY,GAAG,EACnB,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,CAAC,EACtC,KAAK,EACL,IAAI,CAAC,SAAS;AACb,UAAM,MAAMC,cAAaF,OAAK,KAAK,IAAI,GAAG,MAAM;AAChD,UAAM,QAAQ,YAAY,KAAK,GAAG;AAClC,UAAM,OAAO,QAAQ,CAAC,IAAI,OAAO,MAAM,CAAC,CAAC,IAAI;AAC7C,QAAI,CAAC,kBAAkB,IAAI;AACzB,YAAM,IAAI,YAAY,GAAG,IAAI,uCAAuC;AACtE,UAAM,aAAa,mBAAmB,GAAG;AACzC,UAAM,MAAM,WAAW,CAAC,GAAG;AAC3B,QAAI,QAAQ,OAAW,OAAM,IAAI,YAAY,GAAG,IAAI,qBAAqB;AAEzE,QAAI,WAAW,SAAS;AACtB,YAAM,IAAI;AAAA,QACR,GAAG,IAAI;AAAA,MACT;AACF,WAAO,EAAE,MAAM,MAAM,KAAK,KAAK;AAAA,EACjC,CAAC;AACL;;;AEpCO,IAAM,SAAS,CAAC,WAA6B;AAClD,QAAM,SAAS,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC/C,QAAM,MAAM,KAAK,MAAM,OAAO,SAAS,CAAC;AACxC,MAAI,OAAO,SAAS,MAAM,EAAG,QAAO,OAAO,GAAG,KAAK;AACnD,WAAS,OAAO,MAAM,CAAC,KAAK,MAAM,OAAO,GAAG,KAAK,MAAM;AACzD;;;ACJO,IAAM,oBAAoB;;;ACC1B,IAAM,WAAW,CACtB,MACA,UACS;AACT,QAAM,IAAI;AACV,aAAW,SAAS,KAAK,SAAS,CAAC,EAAG,UAAS,OAAO,KAAK;AAC7D;;;ACFO,IAAM,mBAAmB,CAAC,gBAAwC;AACvE,QAAM,YAAY,CAAC,cAAc,mBAAmB,kBAAkB;AACtE,QAAM,SAAkB,KAAK,MAAM,WAAW;AAC9C,QAAM,QAAQ,MAAM,QAAQ,MAAM,IAAK,OAAO,CAAC,IAAgB;AAC/D,MACE,OAAO,UAAU,YACjB,UAAU,QACV,EAAE,UAAU,UACZ,EAAE,oBAAoB;AAEtB,UAAM,IAAI,MAAM,wCAAwC;AAC1D,QAAM,WAAW;AACjB,QAAM,WAA0B,CAAC;AACjC,QAAM,aAAuB,CAAC;AAC9B,MAAI,qBAAqB;AACzB,WAAS,SAAS,MAAM,CAAC,SAAS;AAChC,UAAM,WAAW,KAAK,eAAe;AACrC,QAAI,KAAK,WAAW,MAAM,cAAc;AACtC,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,OACG,KAAK,aAAa,KAAK,KAAK,wBAAwB,KAAK,MAC1D,KAAK,cAAc;AAAA,MACvB,CAAC;AACH,QAAI,YAAY,UAAU,SAAS,KAAK,WAAW,CAAC;AAClD,iBAAW,KAAK,QAAQ;AAC1B,UAAM,OAAO,KAAK,WAAW;AAC7B,UAAM,SAAS,KAAK,aAAa;AACjC,QAAI,OAAO,KAAK,SAAS,KAAK,KAAK,IAAI,MAAM,MAAM,KAAK,mBAAmB;AACzE,YAAM,QAAQ,KAAK;AAAA,SAChB,OAAO,MAAM,SAAS;AAAA,SACtB,SAAS,MAAM,OAAO;AAAA,MACzB;AACA,UAAI,QAAQ,mBAAoB,sBAAqB;AAAA,IACvD;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL,aAAa,SAAS,gBAAgB;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACxCO,IAAM,gBAAgB,CAC3B,SACA,UACe;AACf,QAAM,QAAkB,CAAC;AACzB,MAAI;AACJ,MAAI;AACF,YAAQ,QAAQ,MAAM,GAAG;AACzB,aAAS,MAAM,GAAG,MAAM,MAAM,MAAM,OAAO,GAAG;AAC5C,aAAO,iBAAiB,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAClD,YAAM,KAAK,KAAK,WAAW;AAAA,IAC7B;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,GAAG,MAAM,IAAI,KAAM,MAAgB,OAAO,IAAI;AAAA,MAC5D,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,GAAG,MAAM,IAAI,aAAa;AACrD,SAAO;AAAA,IACL,UAAU,OAAO,KAAK;AAAA,IACtB,OAAO,KAAK,IAAI,GAAG,KAAK;AAAA,IACxB,MAAM,MAAM;AAAA,IACZ,UAAU,KAAK;AAAA,IACf,YAAY,KAAK;AAAA,IACjB,oBAAoB,KAAK;AAAA,EAC3B;AACF;;;ACvBO,IAAM,WAAW,CACtB,SACA,MACA,UACA,cACgB;AAChB,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,UAAU,iBAAiB,MAAM,KAAK,UAAU,KAAK,SAAS;AACpE,QAAM,UAAsC,CAAC;AAC7C,QAAM,WAAsB,CAAC;AAC7B,QAAM,eAA8B,CAAC;AACrC,aAAW,SAAS,SAAS;AAC3B,UAAM,QAAQ,cAAc,SAAS,KAAK;AAC1C,YAAQ,MAAM,IAAI,IAAI;AACtB,UAAM,gBAAgB,UAAU,QAAQ,MAAM,IAAI;AAClD,aAAS;AAAA,MACP,GAAG;AAAA,QACD,EAAE,MAAM,MAAM,MAAM,UAAU,KAAK,SAAS;AAAA,QAC5C;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QACE,iBACA,MAAM,YACJ,cAAc,YAAY,IAAI,KAAK,oBAAoB;AAEzD,mBAAa,KAAK;AAAA,QAChB,SAAS,MAAM;AAAA,QACf,YAAY,cAAc;AAAA,QAC1B,WAAW,MAAM;AAAA,QACjB,OAAO,MAAM;AAAA,QACb,SAAS,cAAc,WAAW,MAAM;AAAA,MAC1C,CAAC;AAAA,EACL;AACA,SAAO,EAAE,SAAS,UAAU,aAAa;AAC3C;;;AChDA,SAAS,mBAAmB;AAGrB,IAAM,YAAY,CACvB,MACA,OAAqB,MAAM,YAAY,CAAC,EAAE,SAAS,KAAK,MAC7C;AACX,aAAS;AACP,UAAM,MAAM,OAAO,KAAK,CAAC;AACzB,QAAI,CAAC,KAAK,SAAS,IAAI,GAAG,GAAG,EAAG,QAAO;AAAA,EACzC;AACF;;;ACVO,IAAM,eAAe;;;ACArB,IAAM,oBAAoB;;;ACc1B,IAAM,iBAAiB,CAAC,QAAwB;AACrD,QAAM,QAAQ,UAAU,GAAG;AAC3B,QAAM,OAAO,UAAU,GAAG,GAAG,IAAI,KAAK,GAAG;AACzC,SAAO,OAAO,IAAI,gHAAgH,KAAK,IAAI,GAAG,IAAI,KAAK,gEAAgE,iBAAiB,+BAA+B,iBAAiB,qHAAqH,YAAY,sBAAsB,IAAI;AACrb;;;AClBO,IAAM,gBAAgB,CAC3B,KACA,WACA,eACa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,2BAA2B,OAAO,SAAS,CAAC;AAAA,EAC5C,GAAG,WAAW,QAAQ,CAAC,cAAc,CAAC,MAAM,SAAS,CAAC;AACxD;;;ACjBO,IAAM,0BAA0B,CAAC,SACtC,KAAK,QAAQ,iCAAiC,QAAQ;;;ACUjD,IAAM,cAAc,CACzB,QACA,MACA,QACA,cACgB;AAChB,QAAM,MAAM,CAAC,eAAiC;AAC5C,UAAM,SAAS;AAAA,MACb;AAAA,MACA,cAAc,OAAO,KAAK,WAAW,UAAU;AAAA,MAC/C;AAAA,QACE,KAAK;AAAA,QACL,gBAAgB;AAAA,QAChB,KAAK;AAAA,UACH,GAAI,OAAO,aAAa,SACpB,CAAC,IACD,EAAE,YAAY,OAAO,SAAS;AAAA,UAClC,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO;AACT,YAAM,IAAI,iBAAiB,QAAQ,+BAA+B;AACpE,QAAI,OAAO,WAAW;AACpB,YAAM,IAAI;AAAA,QACR,gBAAgB,wBAAwB,OAAO,OAAO,KAAK,CAAC,CAAC;AAAA,MAC/D;AACF,WAAO,OAAO;AAAA,EAChB;AACA,SAAO;AAAA,IACL,MAAM,CAAC,QAAQ;AACb,YAAM,MAAM,IAAI;AAAA,QACd,kDAAkD,GAAG;AAAA,MACvD,CAAC,EAAE,KAAK;AACR,aAAO,QAAQ,KAAK,CAAC,IAAK,KAAK,MAAM,GAAG;AAAA,IAC1C;AAAA,IACA,SAAS,CAAC,QACR,IAAI;AAAA,MACF,eAAe,GAAG;AAAA,MAClB,2BAA2B,YAAY;AAAA,IACzC,CAAC,EAAE,KAAK;AAAA,EACZ;AACF;;;AC9CO,IAAM,oBAAoB,CAC/B,EAAE,MAAM,QAAQ,OAAO,GACvB,WACc;AACd,QAAM,UAAU,YAAY,QAAQ,MAAM,QAAQ,OAAO,KAAK,cAAc;AAC5E,SAAO,SAAS,SAAS,MAAM,gBAAgB,IAAI,GAAG;AAAA,IACpD,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,EACnB,CAAC,EAAE;AACL;;;ACfO,IAAM,mBAAmB,CAAC,WAC/B,GAAG,OAAO,IAAI,KAAK,OAAO,KAAK,MAAM,GAAG,EAAE,CAAC;;;ACEtC,IAAM,iBAAiB,CAC5B,SACA,SAEA,QAAQ,OAAsB,CAAC,cAAc,WAAW;AACtD,MACE,OAAO,mBAAmB,QAC1B,OAAO,QAAQ,KAAK,YACpB,OAAO,SAAS,OAAO,kBAAkB,IAAI,KAAK,oBAAoB;AAEtE,WAAO;AACT,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,MACE,SAAS,iBAAiB,MAAM;AAAA,MAChC,YAAY,OAAO;AAAA,MACnB,WAAW,OAAO;AAAA,MAClB,OAAO,OAAO;AAAA,MACd,UAAU,OAAO,iBAAiB,OAAO,UAAU,OAAO;AAAA,IAC5D;AAAA,EACF;AACF,GAAG,CAAC,CAAC;;;ACtBA,IAAM,eAAe,CAC1B,QACA,SAEA,OAAO,mBAAmB,QAC1B,OAAO,UAAU,uBACjB,OAAO,UAAU,OAAO,kBAAkB,IAAI,KAAK,oBAAoB,QACvE,OAAO,SAAS,OAAO,kBAAkB;;;ACLpC,IAAM,cAAc,CACzB,MACA,SACA,SACA,YACY;AACZ,QAAM,UAAU;AAAA,IACd;AAAA,IACA,UAAU,SAAS,WAAY,UAAqB;AAAA,IACpD,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACA,SAAO,EAAE,GAAG,SAAS,aAAa,mBAAmB,SAAS,OAAO,EAAE;AACzE;;;ACnBO,IAAM,mBAAmB,CAAC,WAC/B,GAAG,OAAO,IAAI,IAAI,OAAO,OAAO;;;ACQ3B,IAAM,6BAA6B,CACxC,QACA,SACmB;AACnB,MAAI,CAAC,aAAa,QAAQ,IAAI,KAAK,OAAO,mBAAmB,KAAM,QAAO;AAC1E,QAAM,UAAU,KAAK,OAAO,OAAO,SAAS,OAAO,iBAAiB,KAAK,GAAG;AAC5E,QAAM,OAAO,WAAW,IAAI,MAAM;AAClC,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,MAAM;AAAA,IACvB,iBAAiB,MAAM;AAAA,IACvB,QAAQ,OAAO,eAAe,QAAQ,CAAC,CAAC,UAAU,OAAO,OAAO,QAAQ,CAAC,CAAC,QAAQ,IAAI,GAAG,OAAO,OAAO,CAAC,WAAW,OAAO,MAAM,eAAe,OAAO,CAAC;AAAA,EACzJ;AACF;;;ACfO,IAAM,uBAAuB,CAClC,QACA,SACmB;AACnB,MAAI,OAAO,SAAS,KAAK,OAAQ,QAAO;AACxC,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,MAAM;AAAA,IACvB,iBAAiB,MAAM;AAAA,IACvB,QAAQ,OAAO,OAAO,QAAQ,CAAC,CAAC,YAAY,OAAO,MAAM,eAAe,OAAO,CAAC,qBAAqB,KAAK,OAAO,eAAe,OAAO,CAAC;AAAA,EAC1I;AACF;;;ACZO,IAAM,wBAAwB,CACnC,WACmB;AACnB,MAAI,OAAO,mBAAmB,EAAG,QAAO;AACxC,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,MAAM;AAAA,IACvB,iBAAiB,MAAM;AAAA,IACvB,SAAS,OAAO,gBAAgB,eAAe,OAAO,CAAC,qBAAqB,OAAO,MAAM,eAAe,OAAO,CAAC;AAAA,EAClH;AACF;;;ACTO,IAAM,oBAAoB,CAC/B,SACA,MACA,aAEA,QACG,OAAO,CAAC,WAAW,OAAO,SAAS,KAAK,QAAQ,EAChD,QAAQ,CAAC,WAAW;AAAA,EACnB,2BAA2B,QAAQ,IAAI;AAAA,EACvC,qBAAqB,QAAQ,IAAI;AAAA,EACjC,sBAAsB,MAAM;AAC9B,CAAC,EACA,OAAO,CAAC,YAAgC,YAAY,IAAI,EACxD,OAAO,CAAC,YAAY,CAAC,WAAW,QAAQ,MAAM,QAAQ,CAAC;;;ACfrD,IAAM,gBAAgB,CAC3B,SACA,MACA,aAEA,QACG;AAAA,EACC,CAAC,WACC,OAAO,YAAY,KAAK,eAAe,OAAO,UAAU,OAAO;AACnE,EACC;AAAA,EAAI,CAAC,WACJ;AAAA,IACE;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,GAAG,OAAO,QAAQ,eAAe,OAAO,CAAC,6BAA6B,OAAO,QAAQ,eAAe,OAAO,CAAC,mBAAmB,OAAO,SAAS,eAAe,OAAO,CAAC;AAAA,EACxK;AACF,EACC,OAAO,CAAC,YAAY,CAAC,WAAW,QAAQ,MAAM,QAAQ,CAAC;;;AClBrD,IAAM,mBAAmB,CAC9B,UACA,YACsB;AACtB,QAAM,QAAQ,QAAQ,eAAe,SAAS;AAC9C,SAAO,QAAQ,WAAW,IAAI,CAAC,cAA+B;AAC5D,UAAM,QAAQ,SAAS,WAAW;AAAA,MAChC,CAAC,cACC,UAAU,SAAS,UAAU,QAC7B,UAAU,YAAY,UAAU;AAAA,IACpC;AACA,UAAM,OACJ,UAAU,WACT,UAAU,QAAQ,MAAM,SACvB,UAAU,UAAU,MAAM,WAC1B,UAAU,kBAAkB,MAAM;AACtC,QAAI,SAAS,UAAU,UAAa,MAAM;AACxC,YAAM,EAAE,OAAAG,QAAO,SAAAC,UAAS,gBAAgB,IAAI;AAC5C,aAAO;AAAA,QACL,MAAM,UAAU;AAAA,QAChB,SAAS,UAAU;AAAA,QACnB,MAAM,UAAU;AAAA,QAChB,OAAAD;AAAA,QACA,SAAAC;AAAA,QACA;AAAA,QACA,QAAQD,WAAU,IAAI,IAAIC,WAAUD;AAAA,QACpC,gBAAgB;AAAA,MAClB;AAAA,IACF;AACA,UAAM,QAAQ,UAAU,QAAQ,MAAM;AACtC,UAAM,UAAU,UAAU,UAAU,MAAM;AAC1C,WAAO;AAAA,MACL,MAAM,UAAU;AAAA,MAChB,SAAS,UAAU;AAAA,MACnB,MAAM,UAAU;AAAA,MAChB;AAAA,MACA;AAAA,MACA,iBAAiB,UAAU,kBAAkB,MAAM;AAAA,MACnD,QAAQ,UAAU,IAAI,IAAI,UAAU;AAAA,MACpC,gBAAgB,MAAM,UAAU,IAAI,OAAO,MAAM,UAAU,MAAM;AAAA,IACnE;AAAA,EACF,CAAC;AACH;;;AC3CO,IAAM,eAAe,CAC1B,UACA,YACkB;AAClB,QAAM,QAAQ,QAAQ,eAAe,SAAS;AAC9C,SAAO,QAAQ,OAAO,IAAI,CAAC,UAAuB;AAChD,UAAM,QAAQ,SAAS,OAAO;AAAA,MAC5B,CAAC,cAAc,UAAU,SAAS,MAAM;AAAA,IAC1C;AACA,UAAM,OACJ,UAAU,WACT,MAAM,UAAU,MAAM,WAAW,MAAM,UAAU,MAAM;AAC1D,QAAI,SAAS,UAAU,UAAa,MAAM;AACxC,aAAO;AAAA,QACL,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,SAAS,MAAM;AAAA,QACf,SAAS,MAAM;AAAA,MACjB;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM,UAAU,MAAM;AAAA,MAC/B,SAAS,MAAM,UAAU,MAAM;AAAA,IACjC;AAAA,EACF,CAAC;AACH;;;ACrBO,IAAM,gBAAgB,CAC3B,UACA,SACA,MACA,aACa;AACb,QAAM,mBAAmB,iBAAiB,UAAU,OAAO;AAC3D,QAAM,WAAW,iBAAiB;AAAA,IAChC,CAAC,WAAW,OAAO,SAAS,KAAK;AAAA,EACnC;AACA,QAAM,eAAe,eAAe,kBAAkB,IAAI;AAC1D,QAAM,WAAW;AAAA,IACf,GAAG,kBAAkB,kBAAkB,MAAM,QAAQ;AAAA,IACrD,GAAG,cAAc,aAAa,UAAU,OAAO,GAAG,MAAM,QAAQ;AAAA,EAClE,EAAE,KAAK,eAAe;AACtB,SAAO;AAAA,IACL,MAAM,SAAS;AAAA,IACf,IAAI,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,SAAS,aAAa;AAAA,MACpB,CAAC,KAAK,gBAAgB,MAAM,YAAY;AAAA,MACxC;AAAA,IACF;AAAA,IACA,QAAQ,SACL,OAAO,CAAC,WAAW,aAAa,QAAQ,IAAI,CAAC,EAC7C;AAAA,MACC,CAAC,KAAK,WACJ,OACC,OAAO,mBAAmB,OACvB,KACC,OAAO,SAAS,OAAO,kBAAkB,OAAO;AAAA,MACvD;AAAA,IACF;AAAA,EACJ;AACF;;;AC9CO,IAAM,mBAAmB;;;ACDhC,SAAS,cAAAE,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,cAAY;;;ACDd,IAAM,yBAAyB;;;ADO/B,IAAM,mBAAmB,CAAC,SAA+B;AAC9D,QAAM,OAAOC,OAAK,MAAM,sBAAsB;AAC9C,MAAI,CAACC,YAAW,IAAI,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,GAAG,sBAAsB;AAAA,IAC3B;AAAA,EACF;AACA,QAAM,WAAW,KAAK;AAAA,IACpBC,cAAa,MAAM,MAAM;AAAA,EAC3B;AACA,MAAI,SAAS,kBAAkB,GAAG;AAChC,UAAM,IAAI;AAAA,MACR,GAAG,sBAAsB;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAa,SAAS,eAAe;AAAA,IACrC,SAAS,SAAS,WAAW;AAAA,IAC7B,MAAM,SAAS,QAAQ;AAAA,IACvB,YAAY,SAAS,cAAc;AAAA,IACnC,YAAY,SAAS,cAAc,CAAC;AAAA,IACpC,QAAQ,SAAS,UAAU,CAAC;AAAA,EAC9B;AACF;;;AE9BO,IAAM,iBAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACNO,IAAM,kBAAkB,CAAC,MAAc,WAC5C,eAAe,KAAK,CAAC,YAAY,QAAQ,KAAK,IAAI,CAAC,KACnD,OAAO,KAAK,CAAC,aAAa,KAAK,SAAS,QAAQ,CAAC;;;ACE5C,IAAM,oBAAoB,CAAC,UAChC;AAAA;AAAA;AAAA;AAAA;AAAA,uCAKqC,MAAM,IAAI,CAAC,SAAS,IAAI,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;;;ACP3E,IAAM,qBAAqB,CAChC,SACA,SACoB;AACpB,QAAM,OAAO,QAAQ,KAAK,kBAAkB,KAAK,KAAK,CAAC;AAIvD,SAAO,KACJ,IAAI,CAAC,SAAS;AAAA,IACb,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA,IACxB,SAAS,OAAO,IAAI,UAAU,CAAC;AAAA,IAC/B,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA,IACxB,OAAO,OAAO,IAAI,OAAO,CAAC;AAAA,IAC1B,SAAS,OAAO,IAAI,UAAU,CAAC;AAAA,IAC/B,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA,IACxB,gBAAgB,OAAO,IAAI,kBAAkB,CAAC;AAAA,IAC9C,iBAAiB,OAAO,IAAI,mBAAmB,CAAC;AAAA,EAClD,EAAE,EACD,OAAO,CAAC,cAAc,CAAC,gBAAgB,UAAU,MAAM,KAAK,MAAM,CAAC,EACnE;AAAA,IACC,CAAC,GAAG,MACF,KAAK,MAAM,QAAQ,EAAE,IAAI,IAAI,KAAK,MAAM,QAAQ,EAAE,IAAI,KACtD,EAAE,QAAQ,cAAc,EAAE,OAAO;AAAA,EACrC;AACJ;;;AC/BO,IAAM,kBACX;;;ACEK,IAAM,iBAAiB,CAAC,YAAwC;AACrE,QAAM,OAAO,QAAQ,KAAK,eAAe;AACzC,QAAM,QAAQ,KAAK,CAAC,IAAI,aAAa;AACrC,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;;;ACPO,IAAM,kBAAkB;AAAA;AAAA;;;ACIxB,IAAM,iBAAiB,CAAC,YAAsC;AACnE,QAAM,OAAO,QAAQ,KAAK,eAAe;AACzC,SAAO,KACJ,IAAI,CAAC,SAAS;AAAA,IACb,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA,IACxB,UAAU,OAAO,IAAI,WAAW,CAAC;AAAA,IACjC,SAAS,OAAO,IAAI,UAAU,CAAC;AAAA,IAC/B,SAAS,OAAO,IAAI,UAAU,CAAC;AAAA,IAC/B,OAAO,OAAO,IAAI,OAAO,CAAC;AAAA,EAC5B,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAChD;;;ACPO,IAAM,mBAAmB,CAC9B,SACA,MACA,MACA,YACiB;AACjB,QAAM,aAAa,mBAAmB,SAAS,IAAI;AACnD,QAAM,SAAS,eAAe,OAAO;AACrC,QAAM,aAAa,eAAe,OAAO;AACzC,SAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AChBO,IAAM,mBAAmB,CAC9B,EAAE,MAAM,QAAQ,OAAO,GACvB,WACc;AACd,QAAM,UAAU,YAAY,QAAQ,MAAM,QAAQ,gBAAgB;AAClE,QAAM,UAAU;AAAA,IACd;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,KACP,oBAAI,KAAK,GAAE,YAAY;AAAA,EACzB;AACA,SAAO;AAAA,IACL,iBAAiB,IAAI;AAAA,IACrB;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,EACT,EAAE;AACJ;;;AC3BA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,cAAY;AACrB,SAAS,WAAW;;;ACDb,IAAM,kBAAkB;;;ACAxB,IAAM,kBAAkB;;;ACExB,IAAM,YAAY,CAAC,KAAa,WAAwB;AAC7D,MAAI;AACF,WAAO,IAAI,IAAI,GAAG;AAAA,EACpB,QAAQ;AACN,UAAM,IAAI,YAAY,GAAG,MAAM,qBAAqB;AAAA,EACtD;AACF;;;ACFO,IAAM,0BAA0B,CAAC,KAAU,WAAyB;AACzE,MAAI,IAAI,SAAS,UAAU,IAAI,aAAa,IAAI,WAAW,MAAM;AAC/D;AACF,QAAM,IAAI;AAAA,IACR,GAAG,MAAM;AAAA,EACX;AACF;;;ACPO,IAAM,kBAAkB,CAC7B,KACA,WACuB;AACvB,QAAM,QAAQ,IAAI,aAAa,IAAI,UAAU,KAAK;AAClD,MAAI,aAAa,OAAO,UAAU;AAClC,QAAM,UAAU,IAAI;AACpB,MAAI,WAAW;AACf,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI;AACF,WAAO,mBAAmB,OAAO;AAAA,EACnC,QAAQ;AACN,UAAM,IAAI,YAAY,GAAG,MAAM,yCAAyC;AAAA,EAC1E;AACF;;;ACdO,IAAM,gBAAgB,CAC3B,KACA,QACA,qBACmB;AACnB,QAAM,MAAM,UAAU,KAAK,MAAM;AACjC,0BAAwB,KAAK,MAAM;AACnC,QAAM,WAAW,gBAAgB,KAAK,MAAM,KAAK;AACjD,SAAO;AAAA,IACL,KAAK,IAAI,SAAS;AAAA,IAClB,MAAM,IAAI;AAAA,IACV,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,EAC/C;AACF;;;ANRO,IAAM,wBAAwB,CACnC,MACA,UAC+B;AAC/B,QAAM,WAAW,MAAM,QAAQ;AAC/B,MAAI,aAAa,OAAW,QAAO,cAAc,UAAU,UAAU;AACrE,QAAM,aAAaC,OAAK,MAAM,eAAe;AAC7C,QAAM,WAAW,IAAI,eAAe;AACpC,MAAI,CAACC,YAAW,UAAU,KAAK,aAAa,UAAa,aAAa;AACpE,WAAO;AACT,SAAO;AAAA,IACLC,cAAa,YAAY,MAAM,EAAE,KAAK;AAAA,IACtC;AAAA,IACA;AAAA,EACF;AACF;;;AjDZO,IAAM,YAAY,CAAC,aAAkC;AAAA,EAC1D,MAAM;AAAA,EACN,KAAK,MAAoB;AACvB,QAAI,CAAC,QAAQ,OAAO,KAAK,OAAQ,QAAO;AACxC,UAAM,SAAS,sBAAsB,QAAQ,MAAM,CAAC,CAAC;AACrD,QAAI,CAAC;AACH,aAAO;AAAA,QACL,SAAS;AAAA,MACX;AACF,UAAM,cAAcC,aAAWC,OAAK,QAAQ,MAAM,sBAAsB,CAAC;AACzE,UAAM,YAAYD,aAAWC,OAAK,QAAQ,MAAM,qBAAqB,CAAC;AACtE,QAAI,CAAC,eAAe,CAAC;AACnB,aAAO;AAAA,QACL,SACE;AAAA,MACJ;AACF,WAAO;AAAA,MACL,GAAI,cAAc,iBAAiB,SAAS,MAAM,IAAI,CAAC;AAAA,MACvD,GAAI,YAAY,kBAAkB,SAAS,MAAM,IAAI,CAAC;AAAA,IACxD;AAAA,EACF;AACF;;;ADnBO,IAAM,aAAa,CAAC,YAAmC;AAC5D,QAAM,cAAcC,aAAWC,OAAK,QAAQ,MAAM,iBAAiB,CAAC;AACpE,QAAM,SAASD,aAAWC,OAAK,QAAQ,MAAM,4BAA4B,CAAC;AAC1E,SAAO;AAAA,IACL,cACI;AAAA,MACE,MAAM;AAAA,MACN,KAAK,MACH,iBAAiB,SAAS,OAAO,GAAG,aAAa,QAAQ,IAAI,CAAC,EAAE;AAAA,IACpE,IACA,EAAE,MAAM,SAAS,KAAK,MAAM,SAAS,OAAO,EAAE;AAAA,IAClD;AAAA,MACE,MAAM;AAAA,MACN,KAAK,MACH,QAAQ,OAAO,MAAM,UAAU,SAC3B,SAAS,EAAE,GAAG,SAAS,QAAQ,EAAE,QAAQ,KAAK,EAAE,CAAC,IACjD;AAAA,IACR;AAAA,IACA,UAAU,OAAO;AAAA,EACnB;AACF;;;AyDlCO,IAAM,mBAAmB,CAAC,YAC/B,QACG,QAAQ,CAAC,WAAW;AAAA,EACnB,GAAG,OAAO,OAAO,SAAS,EAAE,CAAC,KAAK,OAAO,KAAK,OAAO,EAAE,CAAC,GAAG,OAAO,gBAAgB,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;AAAA,EACxG,GAAI,OAAO,WAAW,YAAY,CAAC,OAAO,SACtC,CAAC,IACD,OAAO,OAAO,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AACzD,CAAC,EACA,KAAK,IAAI;;;ACVd,SAAS,mBAAmB;AAOrB,IAAM,WAAW,CAAC,UAA8B;AACrD,QAAM,UAAU,YAAY,IAAI;AAChC,QAAM,OAAO,CAAC,QAAqB,YAAiC;AAAA,IAClE,MAAM,MAAM;AAAA,IACZ;AAAA,IACA,kBAAkB,YAAY,IAAI,IAAI,WAAW;AAAA,IACjD;AAAA,EACF;AACA,MAAI;AACF,UAAM,UAAU,MAAM,IAAI;AAC1B,QAAI,YAAY,iBAAkB,QAAO,KAAK,0BAA0B,EAAE;AAC1E,QAAI,CAAC,MAAM,QAAQ,OAAO;AACxB,aAAO,KAAK,0BAA0B,QAAQ,OAAO;AACvD,WAAO,QAAQ,WAAW,IACtB,KAAK,UAAU,EAAE,IACjB,KAAK,YAAY,eAAe,OAAO,CAAC;AAAA,EAC9C,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AAAA,EACF;AACF;;;ACvBO,IAAM,UAAU,CAAC,WAAmC,OAAO,IAAI,QAAQ;;;ACIvE,IAAM,cAAc,CAACC,OAAgB,OAA0B;AACpE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,iBAAiBA,OAAM,EAAE,MAAM,EAAE,MAAM,UAAU,EAAE,CAAC;AACvE,UAAM,SAAS,WAAW,GAAG,IAAI;AACjC,UAAM,SAAS,mBAAmB,MAAM;AACxC,QAAI,OAAQ,IAAG,OAAO,GAAG,MAAM;AAAA,CAAI;AACnC,UAAM,UAAU;AAAA,MACd,WAAW;AAAA,QACT,MAAM,GAAG;AAAA,QACT;AAAA,QACA,QAAQ,GAAG;AAAA,MACb,CAAC;AAAA,IACH;AACA,UAAM,SACJ,OAAO,MAAM,MAAM,OACf,KAAK,UAAU,EAAE,eAAe,GAAG,QAAQ,QAAQ,GAAG,MAAM,CAAC,IAC7D,iBAAiB,OAAO;AAC9B,OAAG,OAAO,GAAG,MAAM;AAAA,CAAI;AACvB,WAAO,aAAa,OAAO;AAAA,EAC7B,SAAS,OAAO;AACd,WAAO,mBAAmB,OAAO,GAAG,MAAM;AAAA,EAC5C;AACF;;;AChCA,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,QAAAC,cAAY;AAQd,IAAM,gBAAgB,CAC3B,MACA,WACwB;AACxB,MAAI,OAAO,kBAAkB,EAAG,QAAO;AACvC,QAAM,cAAcC,aAAWC,OAAK,MAAM,sBAAsB,CAAC;AACjE,QAAM,WAAWD,aAAWC,OAAK,MAAM,qBAAqB,CAAC;AAC7D,MAAI,OAAO,KAAK,WAAW,eAAe,UAAW,QAAO;AAC5D,MAAI,SAAU,QAAO;AACrB,MAAI,YAAa,QAAO;AACxB,SAAO;AACT;;;ACpBA,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,QAAAC,cAAY;AAUd,IAAM,eAAe,CAAC,YAAwC;AACnE,QAAM,WAAW,SAAS,OAAO;AACjC,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,MAAI,CAACC,aAAWC,OAAK,QAAQ,MAAM,iBAAiB,CAAC,EAAG,QAAO;AAC/D,QAAM,aAAa,iBAAiB,UAAU,aAAa,QAAQ,IAAI,CAAC;AACxE,SAAO,WAAW,IAAI,SAAS,IAAI,WAAW;AAChD;;;ACLO,IAAM,mBAAmB,CAAC,YAA4C;AAC3E,QAAM,QAAQ,cAAc,QAAQ,MAAM,QAAQ,MAAM;AACxD,MAAI,UAAU,EAAG,QAAO,EAAE,MAAM;AAChC,MAAI;AACJ,MAAI;AACF,WAAO,aAAa,OAAO;AAAA,EAC7B,SAAS,OAAO;AACd,WAAO,EAAE,OAAO,GAAG,MAAM,mBAAoB,MAAgB,OAAO,GAAG;AAAA,EACzE;AACA,SAAO,SAAS,YACZ,EAAE,MAAM,IACR,EAAE,OAAO,GAAG,MAAM,yBAAyB,IAAI,GAAG;AACxD;;;ACxBA,SAAS,WAAW,iBAAAC,sBAAqB;AACzC,SAAS,SAAS,QAAAC,cAAY;AAIvB,IAAM,YAAY,CAAC,MAAc,SAA8B;AACpE,aAAW,QAAQ,MAAM;AACvB,UAAM,SAAS,KAAK,gBAAgB,YAAY,KAAK,gBAAgB;AACrE,QAAI,CAAC,UAAU,KAAK,YAAY,OAAW;AAC3C,cAAU,QAAQA,OAAK,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7D,IAAAD,eAAcC,OAAK,MAAM,KAAK,IAAI,GAAG,KAAK,OAAO;AAAA,EACnD;AACF;;;ACZA,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,QAAAC,cAAY;;;ACEd,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAgBvB,qBAAqB;AAAA;AAAA;;;ADVnB,IAAM,kBAAkB,CAAC,SAA8B;AAC5D,QAAM,YAAY,MAAM;AACtB,QAAI;AACF,aAAO,WAAW,IAAI,EAAE,KAAK;AAAA,IAC/B,QAAQ;AACN,aAAO,cAAc;AAAA,IACvB;AAAA,EACF,GAAG;AACH,QAAMC,YAAW,GAAG,QAAQ;AAC5B,MAAIC,aAAWC,OAAK,MAAMF,SAAQ,CAAC,GAAG;AACpC,WAAO,EAAE,MAAMA,WAAU,aAAa,aAAa,QAAQ,UAAU;AAAA,EACvE;AACA,SAAO;AAAA,IACL,MAAMA;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;;;AE3BA,SAAS,cAAAG,cAAY,gBAAAC,sBAAoB;AACzC,SAAS,QAAAC,cAAY;;;ACDrB,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,QAAAC,cAAY;;;ACDrB,SAAS,eAAAC,oBAAmB;AAC5B,SAAS,QAAAC,QAAM,YAAAC,iBAAgB;AAGxB,IAAM,kBAAkB,CAAC,SAA2B;AAGzD,QAAM,UAAU,oBAAI,IAAI,CAAC,gBAAgB,QAAQ,UAAU,CAAC;AAC5D,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAO,CAAC,WAAmB,UAAwB;AACvD,eAAW,SAASF,aAAY,WAAW,EAAE,eAAe,KAAK,CAAC,GAAG;AACnE,UAAI,QAAQ,IAAI,MAAM,IAAI,KAAK,MAAM,KAAK,WAAW,GAAG,EAAG;AAC3D,YAAM,OAAOC,OAAK,WAAW,MAAM,IAAI;AACvC,UAAI,MAAM,YAAY,KAAK,QAAQ,EAAG,MAAK,MAAM,QAAQ,CAAC;AAAA,eACjD,MAAM,OAAO,KAAK,2BAA2B,KAAK,MAAM,IAAI,GAAG;AACtE,cAAM,KAAKC,UAAS,MAAM,IAAI,EAAE,WAAW,MAAM,GAAG,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AACA,OAAK,MAAM,CAAC;AACZ,SAAO,MAAM,KAAK;AACpB;;;ACrBA,SAAS,cAAAC,cAAY,gBAAAC,sBAAoB;AACzC,SAAS,QAAAC,cAAY;AAId,IAAM,0BAA0B,CAAC,SAA0B;AAChE,QAAM,eAAeA,OAAK,MAAM,cAAc;AAC9C,MAAI,CAACF,aAAW,YAAY,EAAG,QAAO;AACtC,QAAM,WAAW,KAAK;AAAA,IACpBC,eAAa,cAAc,MAAM;AAAA,EACnC;AACA,QAAM,eAAe,EAAE,GAAG,SAAS,cAAc,GAAG,SAAS,gBAAgB;AAC7E,SAAO,2BAA2B;AACpC;;;AFLO,IAAM,eAAe,CAAC,SAAgC;AAC3D,QAAM,cAAc,gBAAgB,IAAI;AACxC,QAAM,aAAa,CAAC,MAAM,MAAM,KAAK,EAAE;AAAA,IAAK,CAAC,QAC3CE,aAAWC,OAAK,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAAA,EAChD;AACA,QAAM,eAAe,CAAC,OAAO,UAAU,OAAO,OAAO,IAAI,EAAE;AAAA,IAAO,CAAC,SACjE,YAAYA,OAAK,MAAM,IAAI,CAAC;AAAA,EAC9B;AACA,QAAM,iBAAiB,CAAC,OAAO,OAAO,oBAAoB,EAAE;AAAA,IAAO,CAAC,SAClE,YAAYA,OAAK,MAAM,IAAI,CAAC;AAAA,EAC9B;AACA,SAAO;AAAA,IACL,GAAI,YAAYA,OAAK,MAAM,qBAAqB,CAAC,IAC7C,EAAE,UAAU,EAAE,YAAY,sBAAsB,EAAE,IAClD,CAAC;AAAA,IACL,GAAID,aAAWC,OAAK,MAAM,sBAAsB,CAAC,IAC7C,EAAE,QAAQ,EAAE,QAAQ,uBAAuB,EAAE,IAC7C,CAAC;AAAA,IACL,GAAI,aACA,EAAE,SAAS,EAAE,OAAO,cAAc,aAAa,CAAC,MAAM,IAAI,EAAE,EAAE,IAC9D,CAAC;AAAA,IACL,GAAI,YAAY,SAAS,IAAI,EAAE,QAAQ,EAAE,OAAO,YAAY,EAAE,IAAI,CAAC;AAAA,IACnE,GAAI,wBAAwB,IAAI,KAAK,eAAe,SAAS,IACzD,EAAE,WAAW,EAAE,OAAO,eAAe,EAAE,IACvC,CAAC;AAAA,EACP;AACF;;;AG9BO,IAAM,oBAAgC,EAAE,GAAG,eAAe,QAAQ,MAAM;;;ACCxE,IAAM,yBAAyB,CACpC,KACA,aAC4B;AAC5B,QAAM,UAAU,IAAI,SAAS;AAC7B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,eAAe;AAAA,IACf,GAAI,MAAM,QAAQ,OAAO,IACrB;AAAA,MACE,SAAS,QAAQ;AAAA,QAAI,CAAC,UACpB,OAAO,UAAU,WACb,EAAE,MAAM,OAAO,QAAQ,sBAAsB,IAC7C;AAAA,MACN;AAAA,IACF,IACA,CAAC;AAAA,IACL,GAAI,IAAI,WAAW,MAAM,UAAa,SAAS,cAAc,SACzD,EAAE,WAAW,SAAS,UAAU,IAChC,CAAC;AAAA,IACL,GAAI,IAAI,MAAM,MAAM,SAAY,EAAE,MAAM,kBAAkB,IAAI,CAAC;AAAA,EACjE;AACF;;;ALjBO,IAAM,iBAAiB,CAAC,MAAc,UAAgC;AAC3E,QAAM,OAAOC,OAAK,MAAM,eAAe;AACvC,QAAM,eAAe,GAAG,KAAK;AAAA,IAC3B,EAAE,eAAe,GAAG,GAAG,aAAa,IAAI,GAAG,MAAM,kBAAkB;AAAA,IACnE;AAAA,IACA;AAAA,EACF,CAAC;AAAA;AACD,MAAI,CAACC,aAAW,IAAI,GAAG;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AACA,MAAI;AACF,UAAM,MAAM,KAAK,MAAMC,eAAa,MAAM,MAAM,CAAC;AAIjD,UAAM,SAAS,mBAAmB,GAAG;AACrC,QAAI,OAAO,kBAAkB,GAAG;AAC9B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,SAAS,GAAG,KAAK;AAAA,UACf,uBAAuB,KAAK,aAAa,IAAI,CAAC;AAAA,UAC9C;AAAA,UACA;AAAA,QACF,CAAC;AAAA;AAAA,MACH;AAAA,IACF;AACA,WAAO,EAAE,MAAM,iBAAiB,aAAa,aAAa,QAAQ,QAAQ;AAAA,EAC5E,SAAS,OAAO;AACd,WAAO,QACH;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAS,MAAgB;AAAA,IAC3B;AAAA,EACN;AACF;;;AM1DA,SAAS,cAAAC,cAAY,gBAAAC,sBAAoB;AACzC,SAAS,QAAAC,cAAY;;;ACDd,IAAM,mBAAmB;;;ADMzB,IAAM,oBAAoB,CAC/B,MACA,UACgB;AAChB,QAAM,OAAOC,OAAK,MAAM,gBAAgB;AACxC,MAAI,CAACC,aAAW,IAAI,GAAG;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF;AACA,QAAM,WAAW,KAAK,MAAMC,eAAa,MAAM,MAAM,CAAC;AAGtD,QAAM,UAAU,SAAS,UAAU,SAAS;AAC5C,MAAI,YAAY,qBAAqB;AACnC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF;AACA,MAAI,YAAY,UAAa,CAAC,OAAO;AACnC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ,eAAe,OAAO;AAAA,IAChC;AAAA,EACF;AACA,QAAM,UAAU,EAAE,GAAG,SAAS,SAAS,WAAW,oBAAoB;AACtE,QAAM,UAAU,GAAG,KAAK,UAAU,EAAE,GAAG,UAAU,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA;AACpE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR;AAAA,EACF;AACF;;;AE5CA,SAAS,cAAAC,cAAY,gBAAAC,sBAAoB;AACzC,SAAS,QAAAC,cAAY;;;ACDrB,SAAS,cAAAC,mBAAkB;AAGpB,IAAM,WAAW,CAAC,YACvBA,YAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;;;ACH5C,IAAM,0BAAkD;AAAA,EAC7D,oEAAoE;AACtE;;;AFKO,IAAM,eAAe,CAAC,MAAc,UAAgC;AACzE,QAAMC,YAAW;AACjB,QAAM,UAAUC,eAAa,UAAU,gBAAgB,GAAG,MAAM;AAChE,QAAM,OAAOC,OAAK,MAAMF,SAAQ;AAChC,MAAI,CAACG,aAAW,IAAI,GAAG;AACrB,UAAM,SAAS;AACf,WAAO,EAAE,MAAMH,WAAU,aAAa,UAAU,QAAQ,QAAQ;AAAA,EAClE;AACA,QAAM,WAAWC,eAAa,MAAM,MAAM;AAC1C,MAAI,aAAa,SAAS;AACxB,WAAO,EAAE,MAAMD,WAAU,aAAa,aAAa,QAAQ,YAAY;AAAA,EACzE;AACA,QAAM,iBAAiB,wBAAwB,SAAS,QAAQ,CAAC;AACjE,MAAI,mBAAmB,QAAW;AAChC,WAAO;AAAA,MACL,MAAMA;AAAA,MACN,aAAa;AAAA,MACb,QAAQ,qBAAqB,cAAc;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACA,SAAO,QACH;AAAA,IACE,MAAMA;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR;AAAA,EACF,IACA;AAAA,IACE,MAAMA;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AACN;;;AGnCO,IAAM,WAAW,CAAC,MAAc,UAAkC;AAAA,EACvE,eAAe,MAAM,KAAK;AAAA,EAC1B,kBAAkB,MAAM,KAAK;AAAA,EAC7B,aAAa,MAAM,KAAK;AAAA,EACxB,gBAAgB,IAAI;AACtB;;;ACRO,IAAM,kBAAkC;AAAA,EAC7C,EAAE,OAAO,GAAG,MAAM,oBAAoB,MAAM,4BAA4B;AAAA,EACxE;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;;;ACrBO,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AACF,MAAgC;AAC9B,QAAM,QAAQ,gBAAgB;AAAA,IAC5B,CAAC,SACC,GAAG,KAAK,UAAU,QAAQ,MAAM,GAAG,IAAI,OAAO,KAAK,KAAK,CAAC,KAAK,KAAK,IAAI;AAAA,EAC3E;AACA,QAAM,UAAU,gBAAgB,KAAK,CAAC,SAAS,KAAK,UAAU,KAAK;AACnE,SAAO;AAAA,IACL,kBAAkB,OAAO,KAAK,CAAC;AAAA,IAC/B,GAAG;AAAA,IACH,SAAS,QAAQ,SAAS,QAAQ,EAAE;AAAA,EACtC,EAAE,KAAK,IAAI;AACb;;;AChBO,IAAM,iBAAiB,CAAC,SAC7B,KACG;AAAA,EACC,CAAC,SAAS,GAAG,KAAK,YAAY,OAAO,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM;AACvE,EACC,KAAK,IAAI;;;ACMP,IAAM,cAAc,CAACI,OAAgB,OAA0B;AACpE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,iBAAiBA,OAAM;AAAA,MACxC,OAAO,EAAE,MAAM,UAAU;AAAA,MACzB,OAAO,EAAE,MAAM,UAAU;AAAA,MACzB,OAAO,EAAE,MAAM,UAAU;AAAA,IAC3B,CAAC;AACD,UAAM,QAAQ,OAAO,OAAO,MAAM;AAClC,UAAM,OAAO,SAAS,GAAG,MAAM,KAAK;AACpC,OAAG,OAAO,GAAG,eAAe,IAAI,CAAC;AAAA,CAAI;AACrC,QAAI,WAAmB,SAAS;AAChC,QAAI,OAAO,OAAO,MAAM,MAAM;AAC5B,iBAAW,KAAK,MAAM,CAAC,SAAS,KAAK,gBAAgB,WAAW,IAC5D,SAAS,KACT,SAAS;AAAA,IACf,WAAW,OAAO,OAAO,MAAM,QAAQ,OAAO;AAC5C,UAAI,KAAK,KAAK,CAAC,SAAS,KAAK,gBAAgB,UAAU,GAAG;AACxD,cAAM,IAAI,YAAY,gDAAgD;AAAA,MACxE;AACA,gBAAU,GAAG,MAAM,IAAI;AAAA,IACzB;AACA,UAAM,UAAU,MAAmC;AACjD,UAAI;AACF,eAAO,WAAW,GAAG,IAAI;AAAA,MAC3B,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,GAAG;AACH,UAAM,WAAW,SACb,iBAAiB,EAAE,MAAM,GAAG,MAAM,QAAQ,QAAQ,GAAG,OAAO,CAAC,IAC7D,EAAE,OAAO,EAAW;AACxB,OAAG,OAAO,GAAG,oBAAoB,QAAQ,CAAC;AAAA,CAAI;AAC9C,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,mBAAmB,OAAO,GAAG,MAAM;AAAA,EAC5C;AACF;;;AC7CO,IAAM,cAAc,CACzB,QACA,aACW;AACX,QAAM,UAAU,OAAO,QAAQ,OAAO,OAAO;AAC7C,QAAM,QAAQ,KAAK,IAAI,GAAG,GAAG,QAAQ,IAAI,CAAC,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI;AACrE,QAAM,OAAO,IAAI,IAAI,QAAQ,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,MAAM,IAAI,CAAC;AAC3D,QAAM,UAAU,KAAK,OAAO;AAC5B,QAAM,QAAQ,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;AAC3C,UAAM,gBAAgB,UAAU,QAAQ,IAAI;AAC5C,UAAM,SAAS,gBACX,WAAW,cAAc,SAAS,QAAQ,CAAC,CAAC,SAC5C;AACJ,UAAM,QAAQ,UAAU,MAAM,OAAO,MAAM,IAAI,CAAC,UAAU;AAC1D,WAAO,KAAK,KAAK,OAAO,KAAK,CAAC,GAAG,MAAM,SAAS,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,KAAK;AAAA,EACnF,CAAC;AACD,QAAM,mBACJ,OAAO,aAAa,WAAW,IAC3B,CAAC,IACD;AAAA,IACE;AAAA,IACA,GAAG,OAAO,aAAa,IAAI,CAAC,gBAAgB;AAC1C,YAAM,UAAU,KAAK;AAAA,SAClB,YAAY,YAAY,YAAY,aAAa,KAAK;AAAA,MACzD;AACA,aAAO,KAAK,OAAO,OAAO,CAAC,OAAO,YAAY,WAAW,QAAQ,CAAC,CAAC,UAAU,YAAY,UAAU,QAAQ,CAAC,CAAC,QAAQ,YAAY,OAAO;AAAA,IAC1I,CAAC;AAAA,EACH;AACN,SAAO;AAAA,IACL,UACI,0BACA,UAAU,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;AAAA,IACvC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,eAAe,OAAO,QAAQ;AAAA,EAChC,EAAE,KAAK,IAAI;AACb;;;ACrCO,IAAM,kBAAkB,CAC7B,QACA,aAEA,KAAK;AAAA,EACH;AAAA,IACE,eAAe;AAAA,IACf,SAAS,OAAO;AAAA,IAChB,UAAU,UAAU,WAAW;AAAA,IAC/B,cAAc,OAAO;AAAA,IACrB,UAAU,OAAO;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF;;;ACjBF,SAAS,cAAAC,aAAY,iBAAAC,sBAAqB;AAC1C,SAAS,QAAAC,cAAY;AAMd,IAAM,mBAAmB,CAAC,MAAc,WAA8B;AAC3E,QAAM,OAAOC,OAAK,MAAM,qBAAqB;AAC7C,EAAAC,eAAc,GAAG,IAAI,QAAQ,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AACnE,EAAAC,YAAW,GAAG,IAAI,QAAQ,IAAI;AAChC;;;ACDO,IAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,QAAM,WAAW,SAAS,SAAY,gBAAgB,GAAG,IAAI;AAC7D,QAAM,SAAS,SAAS,SAAS,GAAG,MAAM,UAAU;AAAA,IAClD,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,EACnB,CAAC;AACD,MAAI,QAAQ;AACV,qBAAiB,GAAG,MAAM;AAAA,MACxB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,MAChC,MAAM,OAAO;AAAA,MACb,SAAS,OAAO;AAAA,IAClB,CAAC;AACD,OAAG;AAAA,MACD,YAAY,OAAO,OAAO,KAAK,OAAO,OAAO,EAAE,MAAM,CAAC,qBAAqB,qBAAqB;AAAA;AAAA,IAClG;AACA,WAAO,SAAS;AAAA,EAClB;AACA,KAAG;AAAA,IACD,GAAG,OAAO,gBAAgB,QAAQ,QAAQ,IAAI,YAAY,QAAQ,QAAQ,CAAC;AAAA;AAAA,EAC7E;AACA,SAAO,OAAO,SAAS,SAAS,IAAI,SAAS,WAAW,SAAS;AACnE;;;ACtCO,IAAM,qBAAqB,CAAC,iBACjC,aAAa,WAAW,IACpB,CAAC,IACD;AAAA,EACE;AAAA,EACA,GAAG,aAAa,IAAI,CAAC,gBAAgB;AACnC,UAAM,UAAU,KAAK;AAAA,OAClB,YAAY,YAAY,YAAY,aAAa,KAAK;AAAA,IACzD;AACA,WAAO,KAAK,OAAO,OAAO,CAAC,OAAO,YAAY,WAAW,QAAQ,CAAC,CAAC,UAAU,YAAY,UAAU,QAAQ,CAAC,CAAC,SAAS,YAAY,MAAM,eAAe,OAAO,CAAC,KAAK,YAAY,OAAO;AAAA,EACzL,CAAC;AACH;;;ACVC,IAAM,iBAAiB,CAAC,SAC7B;AAAA,EACE,cAAc,KAAK,IAAI,OAAO,KAAK,EAAE;AAAA,EACrC,GAAG,mBAAmB,KAAK,YAAY;AAAA,EACvC,GAAI,KAAK,aAAa,SAAS,KAAK,KAAK,SAAS,IAC9C;AAAA,IACE,SAAS,KAAK,QAAQ,eAAe,OAAO,CAAC,oDAAoD,KAAK,OAAO,eAAe,OAAO,CAAC;AAAA,EACtI,IACA,CAAC;AAAA,EACL,GAAG,KAAK,SAAS;AAAA,IACf,CAAC,YACC,GAAG,QAAQ,IAAI,IAAI,OAAO,QAAQ,IAAI,CAAC,KAAK,QAAQ,IAAI,IAAI,QAAQ,OAAO,KAAK,QAAQ,OAAO;AAAA,EACnG;AAAA,EACA,GAAG,KAAK,SAAS,OAAO,eAAe,OAAO,CAAC;AACjD,EAAE,KAAK,IAAI;;;ACfN,IAAM,qBAAqB,CAAC,SACjC,KAAK;AAAA,EACH;AAAA,IACE,eAAe;AAAA,IACf,MAAM,KAAK;AAAA,IACX,IAAI,KAAK;AAAA,IACT,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,cAAc,KAAK;AAAA,IACnB,UAAU,KAAK;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACF;;;ACPK,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,QAAM,WAAW,iBAAiB,GAAG,IAAI;AACzC,QAAM,UAAU;AAAA,IACd;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,KACP,oBAAI,KAAK,GAAE,YAAY;AAAA,EACzB;AACA,QAAM,OAAO,cAAc,UAAU,SAAS,OAAO,MAAM,OAAO,OAAO;AACzE,KAAG,OAAO,GAAG,OAAO,mBAAmB,IAAI,IAAI,eAAe,IAAI,CAAC;AAAA,CAAI;AACvE,SAAO,KAAK,SAAS,SAAS,IAAI,SAAS,WAAW,SAAS;AACjE;;;ACzBA,SAAS,cAAAC,aAAY,iBAAAC,sBAAqB;AAC1C,SAAS,QAAAC,cAAY;AAMd,IAAM,oBAAoB,CAC/B,MACA,aACS;AACT,QAAM,OAAOC,OAAK,MAAM,sBAAsB;AAC9C,EAAAC,eAAc,GAAG,IAAI,QAAQ,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AACrE,EAAAC,YAAW,GAAG,IAAI,QAAQ,IAAI;AAChC;;;ACRO,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,QAAM,WAAW;AAAA,IACf;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,KACP,oBAAI,KAAK,GAAE,YAAY;AAAA,EACzB;AACA,oBAAkB,GAAG,MAAM,QAAQ;AACnC,KAAG;AAAA,IACD,YAAY,OAAO,SAAS,WAAW,MAAM,CAAC,mBAAmB,OAAO,SAAS,OAAO,MAAM,CAAC,gBAAgB,OAAO,IAAI,OAAO,sBAAsB;AAAA;AAAA,EACzJ;AACA,SAAO,SAAS;AAClB;;;ACvBO,IAAM,aACX;;;ACGK,IAAM,iBAAiB,CAAC,gBAAsC;AACnE,QAAM,SAAS,YAAY,CAAC;AAC5B,MAAI,WAAW,cAAc,WAAW,UAAU,WAAW;AAC3D,WAAO;AACT,QAAM,IAAI,YAAY,UAAU;AAClC;;;ACFO,IAAM,wBAAwB,CACnC,MACA,UACmB;AACnB,QAAM,SAAS,sBAAsB,MAAM,KAAK;AAChD,MAAI,OAAQ,QAAO;AACnB,QAAM,IAAI;AAAA,IACR,iDAAiD,eAAe;AAAA,EAClE;AACF;;;ACHO,IAAM,cAAc,CAACC,OAAgB,OAA0B;AACpE,MAAI;AACF,UAAM,EAAE,QAAQ,YAAY,IAAI,iBAAiBA,OAAM;AAAA,MACrD,MAAM,EAAE,MAAM,UAAU;AAAA,MACxB,QAAQ,EAAE,MAAM,UAAU;AAAA,MAC1B,UAAU,EAAE,MAAM,SAAS;AAAA,IAC7B,CAAC;AACD,UAAM,SAAS,eAAe,WAAW;AACzC,UAAM,SAAS,WAAW,GAAG,IAAI;AACjC,UAAM,SAAS,mBAAmB,MAAM;AACxC,QAAI,OAAQ,IAAG,OAAO,GAAG,MAAM;AAAA,CAAI;AACnC,UAAM,SAAS,sBAAsB,GAAG,MAAM;AAAA,MAC5C,UAAU,OAAO,QAAQ;AAAA,IAC3B,CAAC;AACD,UAAM,UACJ,WAAW,UAAU,OAAO,KAAK,iBAAiB;AACpD,UAAM,UAAU,YAAY,GAAG,QAAQ,GAAG,MAAM,QAAQ,OAAO;AAC/D,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,OAAO,MAAM,MAAM;AAAA,MACzB,QAAQ,OAAO,QAAQ,MAAM;AAAA,IAC/B;AACA,QAAI,WAAW,WAAY,QAAO,mBAAmB,QAAQ;AAC7D,QAAI,WAAW,OAAQ,QAAO,eAAe,QAAQ;AACrD,WAAO,gBAAgB,QAAQ;AAAA,EACjC,SAAS,OAAO;AACd,WAAO,mBAAmB,OAAO,GAAG,MAAM;AAAA,EAC5C;AACF;;;ACpCO,IAAM,WAGT;AAAA,EACF,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AACR;;;AClBO,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACOd,IAAM,SAAS,CAACC,OAAgB,OAA0B;AAC/D,QAAM,OAAO,CAAC,GAAGA,KAAI;AACrB,MAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,OAAG,OAAO,gBAAgB,eAAe;AAAA,CAAI;AAC7C,WAAO,SAAS;AAAA,EAClB;AACA,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAClD,OAAG,OAAO,KAAK;AACf,WAAO,SAAS;AAAA,EAClB;AACA,MAAI,OAAO,GAAG;AACd,MAAI,KAAK,CAAC,MAAM,aAAa;AAC3B,WAAO,KAAK,CAAC,KAAK;AAClB,SAAK,OAAO,GAAG,CAAC;AAAA,EAClB;AACA,QAAM,CAAC,SAAS,GAAG,IAAI,IAAI;AAC3B,QAAM,UAAU,YAAY,SAAY,SAAY,SAAS,OAAO;AACpE,MAAI,CAAC,SAAS;AACZ,OAAG,OAAO,KAAK;AACf,WAAO,SAAS;AAAA,EAClB;AACA,SAAO,QAAQ,MAAM,EAAE,GAAG,IAAI,KAAK,CAAC;AACtC;;;AC7BA,SAAS,iBAAiB;AAC1B,SAAS,WAAW,QAAAC,cAAY;AAChC,SAAS,OAAO,kBAAkB;;;ACFlC,SAAS,iBAAAC,sBAAqB;AAMvB,IAAM,iBAAiB,MAC5BA,eAAc,IAAI,IAAI,wBAAwB,YAAY,GAAG,CAAC;;;ADAzD,IAAM,cAA6B,CAAC,SAAS,MAAM,YAAY;AAGpE,QAAM,OAAO,QAAQ,iBAChB,WAAW,MAAM,KAAK,KACvB;AAAA,IACEC,OAAK,QAAQ,KAAK,mBAAmB;AAAA,IACrC,eAAe;AAAA,IACf,WAAW,MAAM,KAAK;AAAA,EACxB,EAAE,KAAK,SAAS;AACpB,QAAM,QAAQ,UAAU,SAAS,MAAM;AAAA,IACrC,KAAK,QAAQ;AAAA,IACb,UAAU;AAAA,IACV,WAAW,KAAK,OAAO;AAAA,IACvB,KAAK,EAAE,GAAG,YAAY,GAAG,QAAQ,KAAK,MAAM,KAAK;AAAA,EACnD,CAAC;AAED,QAAM,SAA2D;AACjE,SAAO;AAAA,IACL,QAAQ,MAAM,UAAU;AAAA,IACxB,QAAQ,OAAO,UAAU;AAAA,IACzB,QAAQ,OAAO,UAAU;AAAA,IACzB,SACG,MAAM,OAA6C,SAAS;AAAA,EACjE;AACF;;;AtO3BA;AAAA,EACE,OAAO,KAAK,MAAM,CAAC,GAAG;AAAA,IACpB,MAAM,IAAI;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ,CAAC,SAAS;AAChB,aAAO,MAAM,IAAI;AAAA,IACnB;AAAA,IACA,QAAQ,CAAC,SAAS;AAChB,aAAO,MAAM,IAAI;AAAA,IACnB;AAAA,EACF,CAAC;AACH;","names":["existsSync","join","join","existsSync","stdout","stdout","stdout","argv","stderr","existsSync","readFileSync","join","join","existsSync","readFileSync","argv","notice","existsSync","join","existsSync","readFileSync","join","join","existsSync","readFileSync","writeFileSync","join","join","writeFileSync","stdout","stderr","stdout","readFileSync","join","join","relative","existsSync","join","relative","join","readFileSync","readdirSync","readFileSync","join","end","readdirSync","join","readFileSync","createRequire","argv","existsSync","join","argv","existsSync","join","existsSync","join","existsSync","readFileSync","join","join","existsSync","readFileSync","readdirSync","readFileSync","join","join","readdirSync","readFileSync","calls","totalMs","existsSync","readFileSync","join","join","existsSync","readFileSync","existsSync","readFileSync","join","join","existsSync","readFileSync","existsSync","join","existsSync","join","argv","existsSync","join","existsSync","join","existsSync","join","existsSync","join","writeFileSync","join","existsSync","join","relative","existsSync","join","existsSync","readFileSync","join","existsSync","join","readdirSync","join","relative","existsSync","readFileSync","join","existsSync","join","join","existsSync","readFileSync","existsSync","readFileSync","join","join","existsSync","readFileSync","existsSync","readFileSync","join","createHash","relative","readFileSync","join","existsSync","argv","renameSync","writeFileSync","join","join","writeFileSync","renameSync","renameSync","writeFileSync","join","join","writeFileSync","renameSync","argv","argv","join","fileURLToPath","join"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/audit/isSupabaseHost.ts","../src/config/ConfigError.ts","../src/audit/auditPlan.ts","../src/audit/resolveAuditTarget.ts","../src/adapters/soda/runSoda.ts","../src/adapters/soda/dataSourceType.ts","../src/config/isDisabled.ts","../src/model/fingerprintFinding.ts","../src/adapters/soda/parseSodaResults.ts","../src/adapters/soda/renderSodaConfiguration.ts","../src/tools/ToolMissingError.ts","../src/adapters/supabase/ADVISOR_SEVERITY.ts","../src/adapters/supabase/parseAdvisorReport.ts","../src/adapters/supabase/parseCliError.ts","../src/adapters/supabase/supabaseJson.ts","../src/audit/targetArgs.ts","../src/adapters/supabase/runAdvisors.ts","../src/adapters/supabase/parseBloat.ts","../src/adapters/supabase/parseIndexStats.ts","../src/adapters/supabase/runInspect.ts","../src/model/compareFindings.ts","../src/audit/runAudit.ts","../src/check/renderFindings.ts","../src/check/renderFindingsJson.ts","../src/commands/parseCommandArgs.ts","../src/model/ExitCode.ts","../src/commands/reportCommandError.ts","../src/config/CONFIG_FILENAME.ts","../src/config/legacyConfigNotice.ts","../src/config/readConfig.ts","../src/config/expectConfig.ts","../src/config/auditSectionFrom.ts","../src/config/CONFIG_KEYS.ts","../src/config/configSection.ts","../src/config/LEGACY_DISABLE_REASON.ts","../src/config/disableEntryFrom.ts","../src/config/disableEntriesFrom.ts","../src/config/isPositiveInteger.ts","../src/config/isStringList.ts","../src/config/PERF_DEFAULTS.ts","../src/config/ROLE_NAME_PATTERN.ts","../src/config/perfSectionFrom.ts","../src/config/drizzleSectionFrom.ts","../src/config/postgrestSectionFrom.ts","../src/config/stackSectionsFrom.ts","../src/config/configFromDocument.ts","../src/commands/auditCommand.ts","../src/commands/baselineCommand.ts","../src/baseline/BASELINE_FILENAME.ts","../src/baseline/BASELINE_USAGE.ts","../src/baseline/baselineActionFrom.ts","../src/baseline/classifyFindings.ts","../src/baseline/readBaseline.ts","../src/baseline/renderClassified.ts","../src/baseline/writeBaseline.ts","../src/adapters/drizzle/parseEslintReport.ts","../src/assetPath.ts","../src/adapters/drizzle/runDrizzleLint.ts","../src/adapters/prisma/parsePrismaLintReport.ts","../src/adapters/prisma/runPrismaLint.ts","../src/adapters/sqlite/sqliteFinding.ts","../src/adapters/sqlite/sqliteQuery.ts","../src/adapters/sqlite/sqliteRows.ts","../src/adapters/sqlite/foreignKeyFindings.ts","../src/adapters/sqlite/integrityFindings.ts","../src/adapters/sqlite/hasPrimaryKey.ts","../src/adapters/sqlite/primaryKeyFindings.ts","../src/adapters/sqlite/runSqliteChecks.ts","../src/model/normalizeSqlText.ts","../src/sql/statementAtLine.ts","../src/adapters/squawk/parseSquawkReport.ts","../src/adapters/squawk/SUPABASE_SQUAWK_EXCLUDES.ts","../src/adapters/squawk/runSquawk.ts","../src/postgrest/runPostgrestRules.ts","../src/postgrest/ITERATION_METHODS.ts","../src/postgrest/isIterationCallback.ts","../src/postgrest/isInsideLoop.ts","../src/postgrest/isStorageReceiver.ts","../src/postgrest/isStringLiteralArgument.ts","../src/postgrest/literalArgument.ts","../src/postgrest/chainFromCall.ts","../src/postgrest/isInnerCall.ts","../src/postgrest/collectPostgrestChains.ts","../src/postgrest/loadTypeScript.ts","../src/postgrest/chainSelectCall.ts","../src/postgrest/makePostgrestFinding.ts","../src/postgrest/exactCountUnbounded.ts","../src/postgrest/FILTER_METHODS.ts","../src/postgrest/filterWithoutIndex.ts","../src/postgrest/queryInLoop.ts","../src/postgrest/starSelect.ts","../src/postgrest/BOUNDING_METHODS.ts","../src/postgrest/isBounded.ts","../src/postgrest/unboundedList.ts","../src/postgrest/POSTGREST_RULES.ts","../src/postgrest/sourceFilesUnder.ts","../src/config/isDirectory.ts","../src/postgrest/SKIPPED_SOURCE_DIRS.ts","../src/sql/qualifiedName.ts","../src/rules/matchedTables.ts","../src/rules/createdTables.ts","../src/rules/ALTER_KEY_PATTERN.ts","../src/rules/leadingColumn.ts","../src/rules/recordAlterKey.ts","../src/rules/CREATE_INDEX_PATTERN.ts","../src/rules/recordCreateIndex.ts","../src/rules/CREATE_TABLE_PATTERN.ts","../src/rules/inlineKeyColumns.ts","../src/rules/recordCreateTable.ts","../src/rules/indexedColumns.ts","../src/rules/makeSqlFinding.ts","../src/rules/policyTable.ts","../src/rules/authUidNotWrapped.ts","../src/rules/definerWithoutSearchPath.ts","../src/rules/permissivePolicy.ts","../src/rules/policyTables.ts","../src/rules/rlsEnabledTables.ts","../src/rules/rlsEnabledNoPolicy.ts","../src/rules/tableWithoutRls.ts","../src/rules/SQL_RULES.ts","../src/rules/runSqlRules.ts","../src/sql/readMigrationSet.ts","../src/sql/quotedSpanEnd.ts","../src/sql/stripSqlComments.ts","../src/sql/splitSqlStatements.ts","../src/check/runCheck.ts","../src/packageVersion.ts","../src/commands/checkCommand.ts","../src/gate/gateExitCode.ts","../src/gate/gateStages.ts","../src/gate/perfStage.ts","../src/bench/BENCH_RECORD_FILENAME.ts","../src/bench/readBenchRecord.ts","../src/bench/benchFinding.ts","../src/bench/ESTIMATE_RATIO_LIMIT.ts","../src/perf/REGRESSION_FLOOR_MS.ts","../src/bench/benchFindings.ts","../src/bench/readBenchQueries.ts","../src/bench/RUNS_HEADER.ts","../src/bench/median.ts","../src/bench/ESTIMATE_MIN_ROWS.ts","../src/bench/walkPlan.ts","../src/bench/summarizeExplain.ts","../src/bench/runBenchQuery.ts","../src/bench/runBench.ts","../src/postgres/dollarTag.ts","../src/postgres/PLAN_SETTING.ts","../src/postgres/ROLLBACK_SQLSTATE.ts","../src/postgres/explainDoBlock.ts","../src/postgres/psqlArguments.ts","../src/postgres/redactConnectionSecrets.ts","../src/postgres/psqlSession.ts","../src/gate/perfBenchFindings.ts","../src/perf/statementSubject.ts","../src/perf/improvementsIn.ts","../src/perf/isRegression.ts","../src/perf/perfFinding.ts","../src/perf/statementContext.ts","../src/perf/statementRegressionFinding.ts","../src/perf/statementSlowFinding.ts","../src/perf/statementSpillFinding.ts","../src/perf/statementFindings.ts","../src/perf/tableFindings.ts","../src/perf/windowStatements.ts","../src/perf/windowTables.ts","../src/perf/diffSnapshots.ts","../src/perf/QUERY_TIMEOUT_MS.ts","../src/perf/readPerfSnapshot.ts","../src/perf/PERF_SNAPSHOT_FILENAME.ts","../src/perf/PLATFORM_NOISE.ts","../src/perf/isPlatformNoise.ts","../src/perf/statementStatsSql.ts","../src/perf/readStatementStats.ts","../src/perf/STATS_RESET_SQL.ts","../src/perf/readStatsReset.ts","../src/perf/TABLE_STATS_SQL.ts","../src/perf/readTableStats.ts","../src/perf/takePerfSnapshot.ts","../src/gate/perfDiffFindings.ts","../src/postgres/resolvePostgresTarget.ts","../src/postgres/DB_PASSWORD_ENV.ts","../src/postgres/POOLER_URL_FILE.ts","../src/postgres/parsedUrl.ts","../src/postgres/refuseTransactionPooler.ts","../src/postgres/takeUrlPassword.ts","../src/postgres/targetFromUrl.ts","../src/gate/renderGateReport.ts","../src/gate/runStage.ts","../src/gate/runGate.ts","../src/commands/gateCommand.ts","../src/init/adoptionPhase.ts","../src/init/baselineStep.ts","../src/init/adoptionStanding.ts","../src/init/applyInit.ts","../src/init/planBenchReadme.ts","../src/init/BENCH_README.ts","../src/init/planConfigFile.ts","../src/config/detectStacks.ts","../src/config/findSqliteFiles.ts","../src/config/hasPostgrestSources.ts","../src/config/hasSupabaseJsDependency.ts","../src/init/PERF_INIT_SECTION.ts","../src/init/upgradedConfigDocument.ts","../src/init/planPackageScript.ts","../src/init/PACKAGE_MANIFEST.ts","../src/init/planWorkflow.ts","../src/init/sha256Of.ts","../src/init/SHIPPED_WORKFLOW_HASHES.ts","../src/init/planInit.ts","../src/init/ADOPTION_LADDER.ts","../src/init/renderAdoptionPhase.ts","../src/init/renderInitPlan.ts","../src/commands/initCommand.ts","../src/bench/renderBench.ts","../src/bench/renderBenchJson.ts","../src/bench/writeBenchRecord.ts","../src/commands/perfBenchAction.ts","../src/perf/renderImprovements.ts","../src/perf/renderPerfDiff.ts","../src/perf/renderPerfDiffJson.ts","../src/commands/perfDiffAction.ts","../src/perf/writePerfSnapshot.ts","../src/commands/perfSnapshotAction.ts","../src/perf/PERF_USAGE.ts","../src/perf/perfActionFrom.ts","../src/postgres/requirePostgresTarget.ts","../src/commands/perfCommand.ts","../src/cli/COMMANDS.ts","../src/cli/USAGE.ts","../src/cli/runCli.ts","../src/tools/spawnRunner.ts","../src/tools/packageBinPath.ts"],"sourcesContent":["import { argv, cwd, exit, stderr, stdout } from 'node:process'\n\nimport { runCli } from '@/cli/runCli.js'\nimport { spawnRunner } from '@/tools/spawnRunner.js'\n\nexit(\n runCli(argv.slice(2), {\n root: cwd(),\n runner: spawnRunner,\n stdout: (text) => {\n stdout.write(text)\n },\n stderr: (text) => {\n stderr.write(text)\n },\n }),\n)\n","/** Whether a database URL points at a Supabase project, where advisors and inspect can answer. */\nexport const isSupabaseHost = (dbUrl: string): boolean => {\n try {\n const { hostname } = new URL(dbUrl)\n return (\n hostname.endsWith('.supabase.co') ||\n hostname.endsWith('.pooler.supabase.com')\n )\n } catch {\n return false\n }\n}\n","/** Invalid or missing configuration: exit code 2. */\nexport class ConfigError extends Error {}\n","import type { AuditTarget } from '@/audit/AuditTarget.js'\nimport { isSupabaseHost } from '@/audit/isSupabaseHost.js'\nimport { ConfigError } from '@/config/ConfigError.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\n\n/**\n * Which live adapters a target can run. Advisors and inspect need a Supabase\n * project; Soda needs a URL with a password, which a linked target lacks.\n * A target that can run neither is a configuration error, not a clean pass.\n */\nexport const auditPlan = (\n config: DbQualityConfig,\n target: AuditTarget,\n): { supabase: boolean; soda: boolean; skipped: string[] } => {\n const supabase = 'linked' in target || isSupabaseHost(target.dbUrl)\n const soda = config.audit.soda !== undefined && 'dbUrl' in target\n const skipped = [\n ...(supabase\n ? []\n : ['supabase: skipped, --db-url is not a Supabase project host']),\n ...(config.audit.soda !== undefined && !soda\n ? [\n 'soda: skipped, a linked target carries no database password; pass --db-url',\n ]\n : []),\n ]\n if (!supabase && !soda) {\n throw new ConfigError(\n 'nothing to audit: not a Supabase host and audit.soda is not configured',\n )\n }\n return { supabase, soda, skipped }\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { AuditTarget } from '@/audit/AuditTarget.js'\nimport type { AuditTargetFlags } from '@/audit/AuditTargetFlags.js'\nimport { ConfigError } from '@/config/ConfigError.js'\n\nexport const resolveAuditTarget = (\n root: string,\n values: AuditTargetFlags,\n): AuditTarget => {\n if (values['db-url']) return { dbUrl: values['db-url'] }\n if (values.linked) {\n if (!existsSync(join(root, 'supabase/.temp/project-ref'))) {\n throw new ConfigError(\n 'project is not linked; run \"supabase link\" or pass --db-url',\n )\n }\n return { linked: true }\n }\n throw new ConfigError('audit needs --linked or --db-url')\n}\n","import {\n existsSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\n\nimport { dataSourceType } from '@/adapters/soda/dataSourceType.js'\nimport { parseSodaResults } from '@/adapters/soda/parseSodaResults.js'\nimport { renderSodaConfiguration } from '@/adapters/soda/renderSodaConfiguration.js'\nimport type { SodaTarget } from '@/adapters/soda/SodaTarget.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\n// `--with setuptools` and SETUPTOOLS_USE_DISTUTILS are not optional: Soda 4.25\n// imports distutils, which Python 3.12 removed. Measured 2026-09-25.\nexport const runSoda = (\n runner: CommandRunner,\n root: string,\n soda: SodaTarget,\n disabled: DisableEntry[],\n): Finding[] => {\n const scratch = mkdtempSync(join(tmpdir(), 'codeality-db-soda-'))\n try {\n const configuration = join(scratch, 'configuration.yml')\n const results = join(scratch, 'results.json')\n writeFileSync(configuration, renderSodaConfiguration('codeality', soda.url))\n const result = runner(\n 'uvx',\n [\n '--with',\n 'setuptools',\n '--from',\n `soda-core-${dataSourceType(soda.url)}`,\n 'soda',\n 'scan',\n '-d',\n 'codeality',\n '-c',\n configuration,\n '-srf',\n results,\n `${soda.dir}/checks.yml`,\n ],\n { cwd: root, env: { SETUPTOOLS_USE_DISTUTILS: 'local' } },\n )\n if (result.missing) throw new ToolMissingError('uvx', 'install uv')\n if (!existsSync(results)) {\n const tail = result.stderr.trim().slice(-500)\n throw new Error(\n `soda scan produced no results (exit ${String(result.status)}): ${tail}`,\n )\n }\n return parseSodaResults(readFileSync(results, 'utf8'), soda.dir, disabled)\n } finally {\n rmSync(scratch, { recursive: true, force: true })\n }\n}\n","import { ConfigError } from '@/config/ConfigError.js'\n\nexport const dataSourceType = (url: string): 'postgres' | 'mysql' => {\n const scheme = url.split(':')[0] ?? ''\n if (scheme === 'postgres' || scheme === 'postgresql') return 'postgres'\n if (scheme === 'mysql') return 'mysql'\n throw new ConfigError(\n `Soda supports postgres and mysql URLs, not \"${scheme}\"`,\n )\n}\n","import type { DisableEntry } from '@/config/DisableEntry.js'\n\nexport const isDisabled = (code: string, disabled: DisableEntry[]): boolean =>\n disabled.some((entry) => entry.code === code)\n","import { createHash } from 'node:crypto'\n\nimport type { Finding } from '@/model/Finding.js'\n\n// The line is deliberately excluded: a migration inserted above must not\n// renew every finding below it. The context (the normalised statement, or the\n// tool's message) is what tells two findings on one path apart.\nexport const fingerprintFinding = (\n finding: Omit<Finding, 'fingerprint'>,\n context: string,\n): string =>\n createHash('sha256')\n .update(['1', finding.code, finding.path, context].join('|'))\n .digest('hex')\n .slice(0, 16)\n","import type { SodaCheckResult } from '@/adapters/soda/SodaCheckResult.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\nexport const parseSodaResults = (\n json: string,\n sodaDir: string,\n disabled: DisableEntry[],\n): Finding[] => {\n const { checks } = JSON.parse(json) as { checks: SodaCheckResult[] }\n return checks.flatMap((check) => {\n if (check.outcome !== 'fail' && check.outcome !== 'warn') return []\n const code = `BDB700/${check.name}`\n if (isDisabled(code, disabled)) return []\n const partial = {\n code,\n severity:\n check.outcome === 'fail' ? ('error' as const) : ('warn' as const),\n path: `${sodaDir}/checks.yml`,\n line: 0,\n message: `check ${check.outcome === 'fail' ? 'failed' : 'warned'}: ${check.name}`,\n subject: [check.table, check.column].filter(Boolean).join('.'),\n }\n return [\n { ...partial, fingerprint: fingerprintFinding(partial, check.name) },\n ]\n })\n}\n","import { dataSourceType } from '@/adapters/soda/dataSourceType.js'\n\nexport const renderSodaConfiguration = (name: string, url: string): string => {\n const type = dataSourceType(url)\n const parsed = new URL(url)\n const lines = [\n `data_source ${name}:`,\n ` type: ${type}`,\n ` host: ${parsed.hostname}`,\n ` port: ${parsed.port || (type === 'postgres' ? '5432' : '3306')}`,\n ` username: ${decodeURIComponent(parsed.username)}`,\n ` password: ${JSON.stringify(decodeURIComponent(parsed.password))}`,\n ` database: ${parsed.pathname.slice(1)}`,\n ...(type === 'postgres' ? [' schema: public'] : []),\n ]\n return `${lines.join('\\n')}\\n`\n}\n","/** A required executable is absent: exit code 3, never a skip. */\nexport class ToolMissingError extends Error {\n constructor(tool: string, hint: string) {\n super(`${tool} is not installed or not on PATH; ${hint}`)\n }\n}\n","import type { AdvisorEntry } from '@/adapters/supabase/AdvisorEntry.js'\nimport type { Severity } from '@/model/Severity.js'\n\n// Strict mode has no info severity: an advisor's INFO-level entry still\n// blocks the gate, so it is treated as a warn like everything else that is\n// not an outright error.\nexport const ADVISOR_SEVERITY: Record<AdvisorEntry['level'], Severity> = {\n ERROR: 'error',\n WARN: 'warn',\n INFO: 'warn',\n}\n","import { ADVISOR_SEVERITY } from '@/adapters/supabase/ADVISOR_SEVERITY.js'\nimport type { AdvisorEntry } from '@/adapters/supabase/AdvisorEntry.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\nexport const parseAdvisorReport = (\n stdout: string,\n disabled: DisableEntry[],\n): Finding[] => {\n const { results } = JSON.parse(stdout) as { results: AdvisorEntry[] }\n return results.flatMap((entry) => {\n const code = `BDB500/${entry.name}`\n if (isDisabled(code, disabled)) return []\n const subject =\n entry.metadata?.schema && entry.metadata.name\n ? `${entry.metadata.schema}.${entry.metadata.name}`\n : ''\n const partial = {\n code,\n severity: ADVISOR_SEVERITY[entry.level],\n path: 'supabase',\n line: 0,\n message: entry.detail.replaceAll('\\\\`', '`'),\n subject,\n }\n return [\n { ...partial, fingerprint: fingerprintFinding(partial, entry.detail) },\n ]\n })\n}\n","import type { CliError } from '@/adapters/supabase/CliError.js'\n\n// The CLI prints progress lines before the document and may print more after\n// it, so the JSON is searched for and parsed up to each closing brace in turn\n// rather than from the first byte to the last.\nexport const parseCliError = (text: string): CliError | undefined => {\n const start = text.indexOf('{\"_tag\":\"Error\"')\n if (start === -1) return undefined\n for (\n let end = text.indexOf('}', start);\n end !== -1;\n end = text.indexOf('}', end + 1)\n ) {\n try {\n const { error } = JSON.parse(text.slice(start, end + 1)) as {\n error: CliError\n }\n return { code: error.code, message: error.message }\n } catch {\n // Not the closing brace of the document yet; try the next one.\n }\n }\n return { code: 'unknown', message: text.slice(start, start + 200) }\n}\n","import { parseCliError } from '@/adapters/supabase/parseCliError.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\n/**\n * Runs one Supabase CLI command that answers with a JSON document and returns\n * that document's text. The CLI reports its own failures, an expired login or\n * a project of another account among them, as a `{\"_tag\":\"Error\"}` document.\n */\nexport const supabaseJson = (\n runner: CommandRunner,\n root: string,\n args: string[],\n label: string,\n): string => {\n const result = runner('supabase', args, { cwd: root })\n if (result.missing)\n throw new ToolMissingError('supabase', 'install the Supabase CLI')\n const failure = parseCliError(`${result.stdout}\\n${result.stderr}`)\n if (failure || result.status !== 0) {\n const code = failure?.code ?? String(result.status)\n throw new Error(\n `${label} failed: ${code}: ${failure?.message ?? result.stderr.trim()}`,\n )\n }\n return result.stdout.slice(result.stdout.indexOf('{'))\n}\n","import type { AuditTarget } from '@/audit/AuditTarget.js'\n\n/** The Supabase CLI flags that name the database to inspect. */\nexport const targetArgs = (target: AuditTarget): string[] =>\n 'dbUrl' in target ? ['--db-url', target.dbUrl] : ['--linked']\n","import { parseAdvisorReport } from '@/adapters/supabase/parseAdvisorReport.js'\nimport { supabaseJson } from '@/adapters/supabase/supabaseJson.js'\nimport type { AuditTarget } from '@/audit/AuditTarget.js'\nimport { targetArgs } from '@/audit/targetArgs.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\nexport const runAdvisors = (\n runner: CommandRunner,\n root: string,\n target: AuditTarget,\n disabled: DisableEntry[],\n): Finding[] =>\n parseAdvisorReport(\n supabaseJson(\n runner,\n root,\n [\n 'db',\n 'advisors',\n '--type',\n 'all',\n '--output-format',\n 'json',\n ...targetArgs(target),\n ],\n 'supabase advisors',\n ),\n disabled,\n )\n","import type { BloatRow } from '@/adapters/supabase/BloatRow.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\nexport const parseBloat = (\n stdout: string,\n threshold: number,\n disabled: DisableEntry[],\n): Finding[] => {\n if (isDisabled('BDB602', disabled)) return []\n const { rows } = JSON.parse(stdout) as { rows: BloatRow[] }\n return rows\n .filter((row) => Number(row.bloat) > threshold)\n .map((row) => {\n const partial = {\n code: 'BDB602',\n severity: 'warn' as const,\n path: 'supabase',\n line: 0,\n message: `bloat factor ${row.bloat}, ${row.waste} wasted`,\n subject: row.name,\n }\n return { ...partial, fingerprint: fingerprintFinding(partial, row.name) }\n })\n}\n","import type { IndexStatRow } from '@/adapters/supabase/IndexStatRow.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\n// A primary key index is never \"unused\" in a way anyone can act on.\nexport const parseIndexStats = (\n stdout: string,\n disabled: DisableEntry[],\n): Finding[] => {\n if (isDisabled('BDB601', disabled)) return []\n const { rows } = JSON.parse(stdout) as { rows: IndexStatRow[] }\n return rows\n .filter(\n (row) =>\n (row.unused || row.index_scans === '0') && !row.name.endsWith('_pkey'),\n )\n .map((row) => {\n const partial = {\n code: 'BDB601',\n severity: 'warn' as const,\n path: 'supabase',\n line: 0,\n message: `index has never been scanned (${row.size})`,\n subject: row.name,\n }\n return { ...partial, fingerprint: fingerprintFinding(partial, row.name) }\n })\n}\n","import { parseBloat } from '@/adapters/supabase/parseBloat.js'\nimport { parseIndexStats } from '@/adapters/supabase/parseIndexStats.js'\nimport { supabaseJson } from '@/adapters/supabase/supabaseJson.js'\nimport type { AuditTarget } from '@/audit/AuditTarget.js'\nimport { targetArgs } from '@/audit/targetArgs.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\nexport const runInspect = (\n runner: CommandRunner,\n root: string,\n target: AuditTarget,\n config: Pick<DbQualityConfig, 'audit' | 'disable'>,\n): Finding[] => {\n const query = (report: string): string =>\n supabaseJson(\n runner,\n root,\n [\n 'inspect',\n 'db',\n report,\n '--output-format',\n 'json',\n ...targetArgs(target),\n ],\n `supabase inspect ${report}`,\n )\n return [\n ...parseIndexStats(query('index-stats'), config.disable),\n ...parseBloat(query('bloat'), config.audit.bloatThreshold, config.disable),\n ]\n}\n","import type { Finding } from '@/model/Finding.js'\n\nexport const compareFindings = (a: Finding, b: Finding): number =>\n a.path.localeCompare(b.path) ||\n a.line - b.line ||\n a.code.localeCompare(b.code)\n","import { runSoda } from '@/adapters/soda/runSoda.js'\nimport { runAdvisors } from '@/adapters/supabase/runAdvisors.js'\nimport { runInspect } from '@/adapters/supabase/runInspect.js'\nimport type { AuditContext } from '@/audit/AuditContext.js'\nimport { auditPlan } from '@/audit/auditPlan.js'\nimport { compareFindings } from '@/model/compareFindings.js'\nimport type { Finding } from '@/model/Finding.js'\n\nexport const runAudit = ({\n root,\n config,\n runner,\n target,\n}: AuditContext): Finding[] => {\n const plan = auditPlan(config, target)\n const findings: Finding[] = []\n if (plan.soda && 'dbUrl' in target && config.audit.soda !== undefined) {\n const soda = { dir: config.audit.soda, url: target.dbUrl }\n findings.push(...runSoda(runner, root, soda, config.disable))\n }\n if (plan.supabase) {\n findings.push(\n ...runAdvisors(runner, root, target, config.disable),\n ...runInspect(runner, root, target, config),\n )\n }\n return findings.sort(compareFindings)\n}\n","import type { Finding } from '@/model/Finding.js'\n\nexport const renderFindings = (findings: Finding[]): string =>\n [\n ...findings.map(\n (f) =>\n `${f.path}:${String(f.line)}: ${f.code} ${f.message}${f.subject ? ` (${f.subject})` : ''}`,\n ),\n `${String(findings.length)} findings`,\n ].join('\\n')\n","import type { Finding } from '@/model/Finding.js'\n\nexport const renderFindingsJson = (findings: Finding[]): string =>\n JSON.stringify({ schemaVersion: 1, findings }, null, 2)\n","import { parseArgs } from 'node:util'\n\nimport type { ParsedArgs } from '@/commands/ParsedArgs.js'\nimport { ConfigError } from '@/config/ConfigError.js'\n\nexport const parseCommandArgs = (\n argv: string[],\n options: Record<string, { type: 'boolean' | 'string' }>,\n): ParsedArgs => {\n try {\n const parsed = parseArgs({\n args: argv,\n options,\n allowPositionals: true,\n strict: true,\n })\n return { values: parsed.values, positionals: parsed.positionals }\n } catch (error) {\n throw new ConfigError((error as Error).message)\n }\n}\n","/** The four exit codes the CLI ever returns. A skipped required tool is never OK. */\nexport const ExitCode = {\n OK: 0,\n FINDINGS: 1,\n CONFIGURATION: 2,\n INFRASTRUCTURE: 3,\n} as const\n","import { ConfigError } from '@/config/ConfigError.js'\nimport { ExitCode } from '@/model/ExitCode.js'\n\n/** Prints the failure and returns its exit code: 2 for configuration, 3 for everything else. */\nexport const reportCommandError = (\n error: unknown,\n stderr: (text: string) => void,\n): number => {\n const configuration = error instanceof ConfigError\n const message = error instanceof Error ? error.message : String(error)\n stderr(`${configuration ? 'configuration error' : 'error'}: ${message}\\n`)\n return configuration ? ExitCode.CONFIGURATION : ExitCode.INFRASTRUCTURE\n}\n","export const CONFIG_FILENAME = 'codeality-db.json'\n","import { CONFIG_FILENAME } from '@/config/CONFIG_FILENAME.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\n\n/** One line for stderr when the file predates the strict mode; nothing under schemaVersion 2. */\nexport const legacyConfigNotice = (\n config: DbQualityConfig,\n): string | undefined =>\n config.schemaVersion === 1\n ? `${CONFIG_FILENAME} is schemaVersion 1; \"codeality-db init --apply\" upgrades it to 2 and asks a reason for every disabled rule`\n : undefined\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { CONFIG_FILENAME } from '@/config/CONFIG_FILENAME.js'\nimport { ConfigError } from '@/config/ConfigError.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport { configFromDocument } from '@/config/configFromDocument.js'\n\nexport const readConfig = (root: string): DbQualityConfig => {\n const path = join(root, CONFIG_FILENAME)\n if (!existsSync(path)) {\n throw new ConfigError(\n `${CONFIG_FILENAME} not found in ${root}; run \"codeality-db init\"`,\n )\n }\n let document: unknown\n try {\n document = JSON.parse(readFileSync(path, 'utf8'))\n } catch (error) {\n throw new ConfigError(\n `${CONFIG_FILENAME} is not valid JSON: ${(error as Error).message}`,\n )\n }\n return configFromDocument(document)\n}\n","import { ConfigError } from '@/config/ConfigError.js'\n\nexport const expectConfig = (condition: boolean, message: string): void => {\n if (!condition) throw new ConfigError(message)\n}\n","import type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport { expectConfig } from '@/config/expectConfig.js'\n\nexport const auditSectionFrom = (\n audit: Record<string, unknown> | undefined,\n): DbQualityConfig['audit'] => {\n const inGate = audit?.['inGate'] ?? true\n const bloatThreshold = audit?.['bloatThreshold'] ?? 5\n const soda = audit?.['soda']\n expectConfig(typeof inGate === 'boolean', 'audit.inGate must be a boolean')\n expectConfig(\n typeof bloatThreshold === 'number',\n 'audit.bloatThreshold must be a number',\n )\n expectConfig(\n soda === undefined || typeof soda === 'string',\n 'audit.soda must be a string',\n )\n return {\n inGate: inGate as boolean,\n bloatThreshold: bloatThreshold as number,\n ...(soda === undefined ? {} : { soda: soda as string }),\n }\n}\n","export const CONFIG_KEYS = new Set([\n 'schemaVersion',\n 'supabase',\n 'prisma',\n 'drizzle',\n 'sqlite',\n 'postgrest',\n 'audit',\n 'perf',\n 'disable',\n])\n","import { ConfigError } from '@/config/ConfigError.js'\n\n/** The named section as an object, undefined when absent, ConfigError when it is not an object. */\nexport const configSection = (\n raw: Record<string, unknown>,\n name: string,\n): Record<string, unknown> | undefined => {\n const value = raw[name]\n if (value === undefined) return undefined\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new ConfigError(`${name} must be an object`)\n }\n return value as Record<string, unknown>\n}\n","export const LEGACY_DISABLE_REASON =\n 'carried over from schemaVersion 1; write the real reason'\n","import { ConfigError } from '@/config/ConfigError.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { LEGACY_DISABLE_REASON } from '@/config/LEGACY_DISABLE_REASON.js'\n\n/** One raw `disable` entry, validated against its schemaVersion's shape. */\nexport const disableEntryFrom = (\n raw: unknown,\n schemaVersion: 1 | 2,\n): DisableEntry => {\n if (typeof raw === 'string') {\n if (schemaVersion === 1) return { code: raw, reason: LEGACY_DISABLE_REASON }\n throw new ConfigError(\n `disable entries must be { \"code\": \"${raw}\", \"reason\": \"why\" } under schemaVersion 2`,\n )\n }\n if (typeof raw !== 'object' || raw === null)\n throw new ConfigError('disable entries must be objects')\n const { code, reason } = raw as Record<string, unknown>\n if (typeof code !== 'string')\n throw new ConfigError('disable code must be a string')\n if (typeof reason !== 'string' || reason.trim() === '')\n throw new ConfigError(`disable reason must not be empty (${code})`)\n return { code, reason }\n}\n","import { ConfigError } from '@/config/ConfigError.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { disableEntryFrom } from '@/config/disableEntryFrom.js'\n\nexport const disableEntriesFrom = (\n raw: unknown,\n schemaVersion: 1 | 2,\n): DisableEntry[] => {\n if (raw === undefined) return []\n if (!Array.isArray(raw)) throw new ConfigError('disable must be a list')\n return raw.map((entry) => disableEntryFrom(entry, schemaVersion))\n}\n","export const isPositiveInteger = (value: unknown): value is number =>\n typeof value === 'number' && Number.isInteger(value) && value > 0\n","export const isStringList = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((item) => typeof item === 'string')\n","import type { PerfConfig } from '@/config/PerfConfig.js'\n\nexport const PERF_DEFAULTS: PerfConfig = {\n inGate: false,\n slowMs: 100,\n regressionPercent: 20,\n minCalls: 20,\n seqScanRows: 10000,\n benchDir: 'db-quality/bench',\n benchRuns: 5,\n benchTimeoutMs: 60000,\n roles: ['authenticator', 'service_role', 'postgres'],\n ignore: [],\n}\n","/** A Postgres role name that can be interpolated into a query without quoting. */\nexport const ROLE_NAME_PATTERN = /^[a-z_][a-z0-9_]*$/\n","import { ConfigError } from '@/config/ConfigError.js'\nimport { expectConfig } from '@/config/expectConfig.js'\nimport { isPositiveInteger } from '@/config/isPositiveInteger.js'\nimport { isStringList } from '@/config/isStringList.js'\nimport { PERF_DEFAULTS } from '@/config/PERF_DEFAULTS.js'\nimport type { PerfConfig } from '@/config/PerfConfig.js'\nimport { ROLE_NAME_PATTERN } from '@/config/ROLE_NAME_PATTERN.js'\n\nexport const perfSectionFrom = (\n raw: Record<string, unknown> | undefined,\n): PerfConfig => {\n const merged: Record<string, unknown> = { ...PERF_DEFAULTS, ...raw }\n for (const key of [\n 'slowMs',\n 'regressionPercent',\n 'minCalls',\n 'seqScanRows',\n 'benchRuns',\n 'benchTimeoutMs',\n ])\n expectConfig(\n typeof merged[key] === 'number',\n `perf.${key} must be a number`,\n )\n for (const key of ['minCalls', 'benchRuns', 'benchTimeoutMs'])\n expectConfig(\n isPositiveInteger(merged[key]),\n `perf.${key} must be a positive integer`,\n )\n expectConfig(\n typeof merged['inGate'] === 'boolean',\n 'perf.inGate must be a boolean',\n )\n expectConfig(\n typeof merged['benchDir'] === 'string',\n 'perf.benchDir must be a string',\n )\n expectConfig(\n isStringList(merged['roles']),\n 'perf.roles must be a list of strings',\n )\n expectConfig(\n isStringList(merged['ignore']),\n 'perf.ignore must be a list of strings',\n )\n const roles = merged['roles'] as string[]\n expectConfig(roles.length > 0, 'perf.roles must name at least one role')\n const bad = roles.find((role) => !ROLE_NAME_PATTERN.test(role))\n if (bad !== undefined)\n throw new ConfigError(\n `perf.roles entries must match ${ROLE_NAME_PATTERN.source}: \"${bad}\"`,\n )\n return merged as PerfConfig\n}\n","import { ConfigError } from '@/config/ConfigError.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport { isStringList } from '@/config/isStringList.js'\n\nexport const drizzleSectionFrom = (\n drizzle: Record<string, unknown>,\n): NonNullable<DbQualityConfig['drizzle']> => {\n const roots = drizzle['roots']\n const objectNames = drizzle['objectNames'] ?? ['db', 'tx']\n if (!isStringList(roots))\n throw new ConfigError('drizzle.roots must be a list of strings')\n if (!isStringList(objectNames)) {\n throw new ConfigError('drizzle.objectNames must be a list of strings')\n }\n return { roots, objectNames }\n}\n","import { ConfigError } from '@/config/ConfigError.js'\nimport { isStringList } from '@/config/isStringList.js'\nimport type { PostgrestConfig } from '@/config/PostgrestConfig.js'\n\nexport const postgrestSectionFrom = (\n raw: Record<string, unknown>,\n): PostgrestConfig => {\n const roots = raw['roots']\n if (!isStringList(roots))\n throw new ConfigError('postgrest.roots must be a list of strings')\n if (roots.length === 0)\n throw new ConfigError('postgrest.roots must name at least one directory')\n return { roots }\n}\n","import { ConfigError } from '@/config/ConfigError.js'\nimport { configSection } from '@/config/configSection.js'\nimport { drizzleSectionFrom } from '@/config/drizzleSectionFrom.js'\nimport { isStringList } from '@/config/isStringList.js'\nimport { postgrestSectionFrom } from '@/config/postgrestSectionFrom.js'\nimport type { StackSections } from '@/config/StackSections.js'\n\nexport const stackSectionsFrom = (\n raw: Record<string, unknown>,\n): StackSections => {\n const stacks: StackSections = {}\n const supabase = configSection(raw, 'supabase')\n if (supabase) {\n const migrations = supabase['migrations']\n if (typeof migrations !== 'string')\n throw new ConfigError('supabase.migrations must be a string')\n stacks.supabase = { migrations }\n }\n const prisma = configSection(raw, 'prisma')\n if (prisma) {\n const schema = prisma['schema']\n if (typeof schema !== 'string')\n throw new ConfigError('prisma.schema must be a string')\n stacks.prisma = { schema }\n }\n const drizzle = configSection(raw, 'drizzle')\n if (drizzle) stacks.drizzle = drizzleSectionFrom(drizzle)\n const sqlite = configSection(raw, 'sqlite')\n if (sqlite) {\n const files = sqlite['files']\n if (!isStringList(files))\n throw new ConfigError('sqlite.files must be a list of strings')\n stacks.sqlite = { files }\n }\n const postgrest = configSection(raw, 'postgrest')\n if (postgrest) stacks.postgrest = postgrestSectionFrom(postgrest)\n return stacks\n}\n","import { auditSectionFrom } from '@/config/auditSectionFrom.js'\nimport { CONFIG_KEYS } from '@/config/CONFIG_KEYS.js'\nimport { ConfigError } from '@/config/ConfigError.js'\nimport { configSection } from '@/config/configSection.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport { disableEntriesFrom } from '@/config/disableEntriesFrom.js'\nimport { perfSectionFrom } from '@/config/perfSectionFrom.js'\nimport { stackSectionsFrom } from '@/config/stackSectionsFrom.js'\n\n/** Validates a parsed codeality-db.json and fills its defaults; ConfigError on any defect. */\nexport const configFromDocument = (document: unknown): DbQualityConfig => {\n if (\n typeof document !== 'object' ||\n document === null ||\n Array.isArray(document)\n ) {\n throw new ConfigError('configuration must be an object')\n }\n const raw = document as Record<string, unknown>\n for (const key of Object.keys(raw)) {\n if (!CONFIG_KEYS.has(key)) throw new ConfigError(`unknown key \"${key}\"`)\n }\n const schemaVersion = raw['schemaVersion']\n if (schemaVersion !== 1 && schemaVersion !== 2)\n throw new ConfigError('schemaVersion must be 1 or 2')\n return {\n schemaVersion,\n ...stackSectionsFrom(raw),\n audit: auditSectionFrom(configSection(raw, 'audit')),\n perf: perfSectionFrom(configSection(raw, 'perf')),\n disable: disableEntriesFrom(raw['disable'], schemaVersion),\n }\n}\n","import { auditPlan } from '@/audit/auditPlan.js'\nimport { resolveAuditTarget } from '@/audit/resolveAuditTarget.js'\nimport { runAudit } from '@/audit/runAudit.js'\nimport { renderFindings } from '@/check/renderFindings.js'\nimport { renderFindingsJson } from '@/check/renderFindingsJson.js'\nimport type { CommandIo } from '@/commands/CommandIo.js'\nimport { parseCommandArgs } from '@/commands/parseCommandArgs.js'\nimport { reportCommandError } from '@/commands/reportCommandError.js'\nimport { legacyConfigNotice } from '@/config/legacyConfigNotice.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { ExitCode } from '@/model/ExitCode.js'\n\nexport const auditCommand = (argv: string[], io: CommandIo): number => {\n try {\n const { values } = parseCommandArgs(argv, {\n json: { type: 'boolean' },\n linked: { type: 'boolean' },\n 'db-url': { type: 'string' },\n })\n const config = readConfig(io.root)\n const notice = legacyConfigNotice(config)\n if (notice) io.stderr(`${notice}\\n`)\n const target = resolveAuditTarget(io.root, {\n linked: values['linked'] === true,\n 'db-url': values['db-url'] as string | undefined,\n })\n for (const notice of auditPlan(config, target).skipped)\n io.stderr(`${notice}\\n`)\n const findings = runAudit({\n root: io.root,\n config,\n runner: io.runner,\n target,\n })\n io.stdout(\n `${values['json'] === true ? renderFindingsJson(findings) : renderFindings(findings)}\\n`,\n )\n return findings.length > 0 ? ExitCode.FINDINGS : ExitCode.OK\n } catch (error) {\n return reportCommandError(error, io.stderr)\n }\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BASELINE_FILENAME } from '@/baseline/BASELINE_FILENAME.js'\nimport { baselineActionFrom } from '@/baseline/baselineActionFrom.js'\nimport { classifyFindings } from '@/baseline/classifyFindings.js'\nimport { readBaseline } from '@/baseline/readBaseline.js'\nimport { renderClassified } from '@/baseline/renderClassified.js'\nimport { writeBaseline } from '@/baseline/writeBaseline.js'\nimport { runCheck } from '@/check/runCheck.js'\nimport type { CommandIo } from '@/commands/CommandIo.js'\nimport { parseCommandArgs } from '@/commands/parseCommandArgs.js'\nimport { reportCommandError } from '@/commands/reportCommandError.js'\nimport { ConfigError } from '@/config/ConfigError.js'\nimport { legacyConfigNotice } from '@/config/legacyConfigNotice.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { ExitCode } from '@/model/ExitCode.js'\nimport { PACKAGE_VERSION } from '@/packageVersion.js'\n\nexport const baselineCommand = (argv: string[], io: CommandIo): number => {\n try {\n const { values, positionals } = parseCommandArgs(argv, {\n 'check-stale': { type: 'boolean' },\n })\n const action = baselineActionFrom(positionals)\n if (action === 'create' && existsSync(join(io.root, BASELINE_FILENAME))) {\n throw new ConfigError(\n `${BASELINE_FILENAME} exists; use \"baseline update\" to rewrite it`,\n )\n }\n const config = readConfig(io.root)\n const notice = legacyConfigNotice(config)\n if (notice) io.stderr(`${notice}\\n`)\n const findings = runCheck({\n root: io.root,\n config,\n runner: io.runner,\n })\n if (action !== 'check') {\n const entries = findings.map((f) => f.fingerprint)\n writeBaseline(io.root, {\n schemaVersion: 1,\n toolVersion: PACKAGE_VERSION,\n entries,\n })\n io.stdout(\n `recorded ${String(findings.length)} findings in ${BASELINE_FILENAME}\\n`,\n )\n return ExitCode.OK\n }\n const classified = classifyFindings(findings, readBaseline(io.root))\n io.stdout(`${renderClassified(classified)}\\n`)\n const stale =\n values['check-stale'] === true && classified.resolved.length > 0\n return classified.new.length > 0 || stale ? ExitCode.FINDINGS : ExitCode.OK\n } catch (error) {\n return reportCommandError(error, io.stderr)\n }\n}\n","export const BASELINE_FILENAME = '.codeality-db-baseline.json'\n","export const BASELINE_USAGE =\n 'usage: codeality-db baseline create|update|check [--check-stale]'\n","import { BASELINE_USAGE } from '@/baseline/BASELINE_USAGE.js'\nimport type { BaselineAction } from '@/baseline/BaselineAction.js'\nimport { ConfigError } from '@/config/ConfigError.js'\n\nexport const baselineActionFrom = (positionals: string[]): BaselineAction => {\n const action = positionals[0]\n if (action === 'create' || action === 'update' || action === 'check')\n return action\n throw new ConfigError(BASELINE_USAGE)\n}\n","import type { BaselineFile } from '@/baseline/BaselineFile.js'\nimport type { ClassifiedFindings } from '@/baseline/ClassifiedFindings.js'\nimport type { Finding } from '@/model/Finding.js'\n\n// A baseline entry nothing reports any more is resolved, and reporting it is\n// what stops dead debt being carried forever.\nexport const classifyFindings = (\n findings: Finding[],\n baseline: BaselineFile,\n): ClassifiedFindings => {\n const entries = new Set(baseline.entries)\n const current = new Set(findings.map((finding) => finding.fingerprint))\n return {\n new: findings.filter((finding) => !entries.has(finding.fingerprint)),\n known: findings.filter((finding) => entries.has(finding.fingerprint)),\n resolved: baseline.entries.filter((entry) => !current.has(entry)).sort(),\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BASELINE_FILENAME } from '@/baseline/BASELINE_FILENAME.js'\nimport type { BaselineFile } from '@/baseline/BaselineFile.js'\nimport { ConfigError } from '@/config/ConfigError.js'\n\nexport const readBaseline = (root: string): BaselineFile => {\n const path = join(root, BASELINE_FILENAME)\n if (!existsSync(path)) {\n throw new ConfigError(\n `${BASELINE_FILENAME} not found; run \"codeality-db baseline create\"`,\n )\n }\n const document = JSON.parse(\n readFileSync(path, 'utf8'),\n ) as Partial<BaselineFile>\n if (document.schemaVersion !== 1 || !Array.isArray(document.entries)) {\n throw new ConfigError(`${BASELINE_FILENAME} is not a version 1 baseline`)\n }\n return {\n schemaVersion: 1,\n toolVersion: document.toolVersion ?? '',\n entries: [...document.entries].sort(),\n }\n}\n","import type { ClassifiedFindings } from '@/baseline/ClassifiedFindings.js'\nimport { renderFindings } from '@/check/renderFindings.js'\n\n/** The counts line, then the new findings when there are any. */\nexport const renderClassified = (classified: ClassifiedFindings): string => {\n const counts = `${String(classified.new.length)} new, ${String(classified.known.length)} known, ${String(classified.resolved.length)} resolved`\n return classified.new.length > 0\n ? `${counts}\\n${renderFindings(classified.new)}`\n : counts\n}\n","import { renameSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BASELINE_FILENAME } from '@/baseline/BASELINE_FILENAME.js'\nimport type { BaselineFile } from '@/baseline/BaselineFile.js'\n\n/** Writes the baseline atomically: a temporary file, then a rename over the target. */\nexport const writeBaseline = (root: string, baseline: BaselineFile): void => {\n const path = join(root, BASELINE_FILENAME)\n const document = {\n schemaVersion: 1,\n toolVersion: baseline.toolVersion,\n entries: [...baseline.entries].sort(),\n }\n writeFileSync(`${path}.tmp`, `${JSON.stringify(document, null, 2)}\\n`)\n renameSync(`${path}.tmp`, path)\n}\n","import { relative } from 'node:path'\n\nimport type { EslintFileResult } from '@/adapters/drizzle/EslintFileResult.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\nexport const parseEslintReport = (\n stdout: string,\n root: string,\n disabled: DisableEntry[],\n): Finding[] => {\n if (!stdout.trim()) return []\n let files: EslintFileResult[]\n try {\n files = JSON.parse(stdout) as EslintFileResult[]\n } catch {\n throw new Error(`eslint produced no JSON report: ${stdout.slice(0, 200)}`)\n }\n return files.flatMap((file) =>\n file.messages.flatMap((message) => {\n if (!message.ruleId?.startsWith('drizzle/')) return []\n const rule = message.ruleId.slice('drizzle/'.length)\n const code = `BDB300/${rule}`\n if (isDisabled(code, disabled)) return []\n const partial = {\n code,\n severity: 'error' as const,\n path: relative(root, file.filePath).replaceAll('\\\\', '/'),\n line: message.line,\n message: message.message,\n subject: rule,\n }\n return [\n {\n ...partial,\n fingerprint: fingerprintFinding(partial, message.message),\n },\n ]\n }),\n )\n}\n","import { fileURLToPath } from 'node:url'\n\n// `assets/` is one level up from both `dist/cli.js` (the bundle) and `src/`.\nexport const assetPath = (name: string): string =>\n fileURLToPath(new URL(`../assets/${name}`, import.meta.url))\n","import { parseEslintReport } from '@/adapters/drizzle/parseEslintReport.js'\nimport { assetPath } from '@/assetPath.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\n// Runs from the project root: ESLint ignores any file outside its cwd, which\n// is what an earlier attempt from another directory reported as \"all files\n// matching the pattern are ignored\".\n// `--no-config-lookup` does not stop ESLint reading the project's own\n// eslint-suppressions.json, and an entry there that no longer matches makes\n// it exit 2 with no report; the flag turns that into a pass (measured on a\n// project whose suppressions had gone stale, 2026-09-25).\nexport const runDrizzleLint = (\n runner: CommandRunner,\n root: string,\n drizzle: NonNullable<DbQualityConfig['drizzle']>,\n disabled: DisableEntry[],\n): Finding[] => {\n const result = runner(\n 'eslint',\n [\n '--no-config-lookup',\n '-c',\n assetPath('drizzle-eslint.config.mjs'),\n '-f',\n 'json',\n '--pass-on-unpruned-suppressions',\n ...drizzle.roots,\n ],\n {\n cwd: root,\n env: { CODEALITY_DB_DRIZZLE_OBJECTS: drizzle.objectNames.join(',') },\n },\n )\n if (result.missing) {\n throw new ToolMissingError(\n 'eslint',\n 'add eslint, eslint-plugin-drizzle and typescript-eslint as devDependencies',\n )\n }\n if (result.status !== 0 && result.status !== 1) {\n throw new Error(\n `eslint exited ${String(result.status)}: ${result.stderr.trim()}`,\n )\n }\n return parseEslintReport(result.stdout, root, disabled)\n}\n","import type { PrismaViolation } from '@/adapters/prisma/PrismaViolation.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\nexport const parsePrismaLintReport = (\n stderr: string,\n disabled: DisableEntry[],\n): Finding[] => {\n if (!stderr.trim()) return []\n let violations: PrismaViolation[]\n try {\n violations = (JSON.parse(stderr) as { violations: PrismaViolation[] })\n .violations\n } catch {\n throw new Error(\n `prisma-lint produced no JSON report: ${stderr.slice(0, 200)}`,\n )\n }\n return violations.flatMap((violation) => {\n const code = `BDB200/${violation.ruleName}`\n if (isDisabled(code, disabled)) return []\n const partial = {\n code,\n severity: 'warn' as const,\n path: violation.fileName,\n line: violation.location.startLine,\n message: violation.message,\n subject: /Field \"([^\"]+)\"/.exec(violation.message)?.[1] ?? '',\n }\n return [\n {\n ...partial,\n fingerprint: fingerprintFinding(partial, violation.message),\n },\n ]\n })\n}\n","import { parsePrismaLintReport } from '@/adapters/prisma/parsePrismaLintReport.js'\nimport { assetPath } from '@/assetPath.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\n// prisma-lint writes its JSON report to stderr, and exits 1 whenever it has\n// one violation to report. Both are its documented behaviour, not a bug here.\nexport const runPrismaLint = (\n runner: CommandRunner,\n root: string,\n schemaPath: string,\n disabled: DisableEntry[],\n): Finding[] => {\n const result = runner(\n 'prisma-lint',\n ['-c', assetPath('prisma-lint.json'), '-o', 'json', schemaPath],\n { cwd: root },\n )\n if (result.missing) {\n throw new ToolMissingError(\n 'prisma-lint',\n 'add prisma-lint as a devDependency',\n )\n }\n if (result.status !== 0 && result.status !== 1) {\n throw new Error(\n `prisma-lint exited ${String(result.status)}: ${result.stderr.trim()}`,\n )\n }\n return parsePrismaLintReport(result.stderr, disabled)\n}\n","import type { SqliteFindingInput } from '@/adapters/sqlite/SqliteFindingInput.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\n/** Zero or one finding on a SQLite file: none when the code is disabled. Line is always 0. */\nexport const sqliteFinding = (\n input: SqliteFindingInput,\n disabled: DisableEntry[],\n): Finding[] => {\n if (isDisabled(input.code, disabled)) return []\n const partial = {\n code: input.code,\n severity: input.severity,\n path: input.file,\n line: 0,\n message: input.message,\n subject: input.subject,\n }\n return [\n { ...partial, fingerprint: fingerprintFinding(partial, input.context) },\n ]\n}\n","import type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\nexport const sqliteQuery = (\n runner: CommandRunner,\n root: string,\n file: string,\n sql: string,\n): string => {\n const result = runner('sqlite3', ['-json', '-readonly', file, sql], {\n cwd: root,\n })\n if (result.missing) {\n throw new ToolMissingError(\n 'sqlite3',\n 'install the sqlite3 command line shell',\n )\n }\n if (result.status !== 0)\n throw new Error(`sqlite3 failed on ${file}: ${result.stderr.trim()}`)\n return result.stdout\n}\n","import { sqliteQuery } from '@/adapters/sqlite/sqliteQuery.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\n/** The rows of one read-only query, as `sqlite3 -json` prints them; none when it prints nothing. */\nexport const sqliteRows = <T>(\n runner: CommandRunner,\n root: string,\n file: string,\n sql: string,\n): T[] => {\n const out = sqliteQuery(runner, root, file, sql).trim()\n return out ? (JSON.parse(out) as T[]) : []\n}\n","import { sqliteFinding } from '@/adapters/sqlite/sqliteFinding.js'\nimport { sqliteRows } from '@/adapters/sqlite/sqliteRows.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\n/** BDB402: one finding per row `PRAGMA foreign_key_check` reports. */\nexport const foreignKeyFindings = (\n runner: CommandRunner,\n root: string,\n file: string,\n disabled: DisableEntry[],\n): Finding[] =>\n sqliteRows<{ table: string; rowid: number; parent: string }>(\n runner,\n root,\n file,\n 'PRAGMA foreign_key_check',\n ).flatMap((row) =>\n sqliteFinding(\n {\n code: 'BDB402',\n severity: 'error',\n file,\n subject: row.table,\n message: `row ${String(row.rowid)} references missing ${row.parent}`,\n context: `${row.table}:${String(row.rowid)}:${row.parent}`,\n },\n disabled,\n ),\n )\n","import { sqliteFinding } from '@/adapters/sqlite/sqliteFinding.js'\nimport { sqliteRows } from '@/adapters/sqlite/sqliteRows.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\n/** BDB401: `PRAGMA integrity_check` answered anything but a single `ok`. */\nexport const integrityFindings = (\n runner: CommandRunner,\n root: string,\n file: string,\n disabled: DisableEntry[],\n): Finding[] => {\n const rows = sqliteRows<{ integrity_check: string }>(\n runner,\n root,\n file,\n 'PRAGMA integrity_check',\n )\n const first = rows[0]?.integrity_check ?? 'no result'\n if (rows.length === 1 && first === 'ok') return []\n return sqliteFinding(\n {\n code: 'BDB401',\n severity: 'error',\n file,\n subject: '',\n message: `integrity_check: ${first}`,\n context: first,\n },\n disabled,\n )\n}\n","export const hasPrimaryKey = (createSql: string): boolean => {\n const text = createSql.toLowerCase()\n return text.startsWith('create virtual table') || text.includes('primary key')\n}\n","import { hasPrimaryKey } from '@/adapters/sqlite/hasPrimaryKey.js'\nimport { sqliteFinding } from '@/adapters/sqlite/sqliteFinding.js'\nimport { sqliteRows } from '@/adapters/sqlite/sqliteRows.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\n/** BDB403: every user table whose CREATE statement declares no primary key. */\nexport const primaryKeyFindings = (\n runner: CommandRunner,\n root: string,\n file: string,\n disabled: DisableEntry[],\n): Finding[] =>\n sqliteRows<{ name: string; sql: string }>(\n runner,\n root,\n file,\n \"select name, sql from sqlite_master where type = 'table' and name not like 'sqlite_%'\",\n ).flatMap((row) =>\n hasPrimaryKey(row.sql)\n ? []\n : sqliteFinding(\n {\n code: 'BDB403',\n severity: 'warn',\n file,\n subject: row.name,\n message: 'table has no primary key',\n context: row.name,\n },\n disabled,\n ),\n )\n","import { foreignKeyFindings } from '@/adapters/sqlite/foreignKeyFindings.js'\nimport { integrityFindings } from '@/adapters/sqlite/integrityFindings.js'\nimport { primaryKeyFindings } from '@/adapters/sqlite/primaryKeyFindings.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\n\nexport const runSqliteChecks = (\n runner: CommandRunner,\n root: string,\n files: string[],\n disabled: DisableEntry[],\n): Finding[] =>\n files.flatMap((file) => [\n ...integrityFindings(runner, root, file, disabled),\n ...foreignKeyFindings(runner, root, file, disabled),\n ...primaryKeyFindings(runner, root, file, disabled),\n ])\n","export const normalizeSqlText = (text: string): string =>\n text.toLowerCase().replaceAll(/\\s+/g, ' ').trim()\n","import type { MigrationFile } from '@/sql/MigrationFile.js'\nimport type { SqlStatement } from '@/sql/SqlStatement.js'\n\nexport const statementAtLine = (\n file: MigrationFile,\n line: number,\n): SqlStatement | undefined =>\n [...file.statements].reverse().find((statement) => statement.line <= line)\n","import type { SquawkEntry } from '@/adapters/squawk/SquawkEntry.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\nimport { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\nimport { statementAtLine } from '@/sql/statementAtLine.js'\n\nexport const parseSquawkReport = (\n stdout: string,\n set: MigrationFile[],\n disabled: DisableEntry[],\n): Finding[] => {\n if (!stdout.trim()) return []\n let entries: SquawkEntry[]\n try {\n entries = JSON.parse(stdout) as SquawkEntry[]\n } catch {\n throw new Error(`squawk produced no JSON report: ${stdout.slice(0, 200)}`)\n }\n return entries.flatMap((entry) => {\n const code = `BDB100/${entry.rule_name}`\n if (isDisabled(code, disabled)) return []\n const file = set.find((candidate) => candidate.path === entry.file)\n const statement = file ? statementAtLine(file, entry.line) : undefined\n const partial = {\n code,\n severity:\n entry.level === 'Error' ? ('error' as const) : ('warn' as const),\n path: entry.file,\n line: entry.line,\n message: entry.message,\n subject: entry.rule_name,\n }\n const context = statement ? normalizeSqlText(statement.text) : entry.message\n return [{ ...partial, fingerprint: fingerprintFinding(partial, context) }]\n })\n}\n","// Supabase applies each migration inside one transaction with the CLI's own\n// timeouts, so the lock, timeout and CONCURRENTLY rules describe a deployment\n// model these projects do not have. Measured 2026-09-25 over six repositories:\n// these four were 80% of every squawk line and none of them was actionable.\nexport const SUPABASE_SQUAWK_EXCLUDES = [\n 'prefer-robust-stmts',\n 'require-lock-timeout',\n 'require-statement-timeout',\n 'require-concurrent-index-creation',\n]\n","import { parseSquawkReport } from '@/adapters/squawk/parseSquawkReport.js'\nimport { SUPABASE_SQUAWK_EXCLUDES } from '@/adapters/squawk/SUPABASE_SQUAWK_EXCLUDES.js'\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\nexport const runSquawk = (\n runner: CommandRunner,\n root: string,\n set: MigrationFile[],\n disabled: DisableEntry[],\n): Finding[] => {\n const result = runner(\n 'squawk',\n [\n '--reporter',\n 'json',\n '--exclude',\n SUPABASE_SQUAWK_EXCLUDES.join(','),\n ...set.map((f) => f.path),\n ],\n { cwd: root },\n )\n if (result.missing)\n throw new ToolMissingError('squawk', 'add squawk-cli as a devDependency')\n if (result.status !== 0 && result.status !== 1) {\n throw new Error(\n `squawk exited ${String(result.status)}: ${result.stderr.trim()}`,\n )\n }\n return parseSquawkReport(result.stdout, set, disabled)\n}\n","import { readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport { compareFindings } from '@/model/compareFindings.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { collectPostgrestChains } from '@/postgrest/collectPostgrestChains.js'\nimport { loadTypeScript } from '@/postgrest/loadTypeScript.js'\nimport { POSTGREST_RULES } from '@/postgrest/POSTGREST_RULES.js'\nimport { sourceFilesUnder } from '@/postgrest/sourceFilesUnder.js'\nimport type { TableKnowledge } from '@/rules/TableKnowledge.js'\n\nexport const runPostgrestRules = (\n root: string,\n roots: string[],\n knowledge: Map<string, TableKnowledge>,\n disabled: DisableEntry[],\n): Finding[] => {\n const rules = POSTGREST_RULES.filter(\n (rule) => !isDisabled(rule.code, disabled),\n )\n const context = { knowledge }\n const compiler = loadTypeScript([join(root, 'package.json'), import.meta.url])\n return sourceFilesUnder(root, roots)\n .flatMap((path) =>\n collectPostgrestChains(\n compiler,\n path,\n readFileSync(join(root, path), 'utf8'),\n ),\n )\n .flatMap((chain) => rules.map((rule) => rule.run(chain, context)))\n .filter((finding): finding is Finding => finding !== undefined)\n .sort(compareFindings)\n}\n","export const ITERATION_METHODS = new Set([\n 'map',\n 'forEach',\n 'reduce',\n 'filter',\n 'flatMap',\n])\n","import type ts from 'typescript'\n\nimport { ITERATION_METHODS } from '@/postgrest/ITERATION_METHODS.js'\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\nexport const isIterationCallback = (\n compiler: TypeScriptModule,\n node: ts.Node,\n): boolean =>\n (compiler.isArrowFunction(node) || compiler.isFunctionExpression(node)) &&\n compiler.isCallExpression(node.parent) &&\n compiler.isPropertyAccessExpression(node.parent.expression) &&\n ITERATION_METHODS.has(node.parent.expression.name.text)\n","import type ts from 'typescript'\n\nimport { isIterationCallback } from '@/postgrest/isIterationCallback.js'\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\n/** Walks up to the enclosing function; a loop statement or an iteration callback on the way means the query runs once per item. */\nexport const isInsideLoop = (\n compiler: TypeScriptModule,\n node: ts.Node,\n): boolean => {\n let current: ts.Node = node.parent\n while (!compiler.isSourceFile(current)) {\n if (compiler.isIterationStatement(current, false)) return true\n if (isIterationCallback(compiler, current)) return true\n if (compiler.isFunctionLike(current)) return false\n current = current.parent\n }\n return false\n}\n","import type ts from 'typescript'\n\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\n/** True when a chain root's receiver is `<expr>.storage`, e.g. `supabase.storage.from('bucket')`: Supabase Storage, not PostgREST. */\nexport const isStorageReceiver = (\n compiler: TypeScriptModule,\n expression: ts.Expression,\n): boolean =>\n compiler.isPropertyAccessExpression(expression) &&\n expression.name.text === 'storage'\n","import type ts from 'typescript'\n\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\n/** True when `node` is a string literal or a no-substitution template literal: the only forms a `.from()`/`.rpc()` root target may take. */\nexport const isStringLiteralArgument = (\n compiler: TypeScriptModule,\n node: ts.Expression | undefined,\n): boolean =>\n node !== undefined &&\n (compiler.isStringLiteral(node) ||\n compiler.isNoSubstitutionTemplateLiteral(node))\n","import type ts from 'typescript'\n\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\n/** A string literal verbatim, an object literal as `{key:value}` pairs, anything else as `?`. */\nexport const literalArgument = (\n compiler: TypeScriptModule,\n node: ts.Expression,\n): string => {\n if (\n compiler.isStringLiteral(node) ||\n compiler.isNoSubstitutionTemplateLiteral(node)\n )\n return node.text\n if (!compiler.isObjectLiteralExpression(node)) return '?'\n const pairs = node.properties.map((property) => {\n if (!compiler.isPropertyAssignment(property)) return '?'\n const key =\n compiler.isIdentifier(property.name) ||\n compiler.isStringLiteral(property.name)\n ? property.name.text\n : '?'\n const value = property.initializer\n const text =\n compiler.isStringLiteral(value) || compiler.isNumericLiteral(value)\n ? value.text\n : value.kind === compiler.SyntaxKind.TrueKeyword\n ? 'true'\n : value.kind === compiler.SyntaxKind.FalseKeyword\n ? 'false'\n : '?'\n return `${key}:${text}`\n })\n return `{${pairs.join(',')}}`\n}\n","import type ts from 'typescript'\n\nimport type { CollectedCall } from '@/postgrest/CollectedCall.js'\nimport { isInsideLoop } from '@/postgrest/isInsideLoop.js'\nimport { isStorageReceiver } from '@/postgrest/isStorageReceiver.js'\nimport { isStringLiteralArgument } from '@/postgrest/isStringLiteralArgument.js'\nimport { literalArgument } from '@/postgrest/literalArgument.js'\nimport type { PostgrestCall } from '@/postgrest/PostgrestCall.js'\nimport type { PostgrestChain } from '@/postgrest/PostgrestChain.js'\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\n/** The chain ending at `outer`, or undefined when no `.from('x')`/`.rpc('f')` with a literal sits in it. */\nexport const chainFromCall = (\n compiler: TypeScriptModule,\n outer: ts.CallExpression,\n file: ts.SourceFile,\n path: string,\n): PostgrestChain | undefined => {\n const calls: CollectedCall[] = []\n let current: ts.Expression = outer\n while (\n compiler.isCallExpression(current) &&\n compiler.isPropertyAccessExpression(current.expression)\n ) {\n calls.unshift({\n name: current.expression.name.text,\n args: current.arguments.map((node) => literalArgument(compiler, node)),\n node: current,\n })\n current = current.expression.expression\n }\n const rootIndex = calls.findIndex(\n (call) =>\n (call.name === 'from' || call.name === 'rpc') &&\n isStringLiteralArgument(compiler, call.node.arguments[0]),\n )\n const root = calls[rootIndex]\n if (!root) return undefined\n if (rootIndex === 0 && isStorageReceiver(compiler, current)) return undefined\n const rest: PostgrestCall[] = calls\n .slice(rootIndex + 1)\n .map(({ name, args }) => ({ name, args }))\n return {\n path,\n line: file.getLineAndCharacterOfPosition(root.node.getStart(file)).line + 1,\n root: root.name as 'from' | 'rpc',\n target: root.args[0] ?? '',\n calls: rest,\n inLoop: isInsideLoop(compiler, outer),\n text: outer.getText(file).replaceAll(/\\s+/g, ' '),\n }\n}\n","import type ts from 'typescript'\n\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\n/** True when the call continues into a longer chain (`a.b().c()`: `b()` is inner, `c()` is not). */\nexport const isInnerCall = (\n compiler: TypeScriptModule,\n node: ts.CallExpression,\n): boolean =>\n compiler.isPropertyAccessExpression(node.parent) &&\n compiler.isCallExpression(node.parent.parent) &&\n node.parent.parent.expression === node.parent\n","import type ts from 'typescript'\n\nimport { chainFromCall } from '@/postgrest/chainFromCall.js'\nimport { isInnerCall } from '@/postgrest/isInnerCall.js'\nimport type { PostgrestChain } from '@/postgrest/PostgrestChain.js'\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\n\nexport const collectPostgrestChains = (\n compiler: TypeScriptModule,\n path: string,\n source: string,\n): PostgrestChain[] => {\n const file = compiler.createSourceFile(\n path,\n source,\n compiler.ScriptTarget.Latest,\n true,\n path.endsWith('.tsx') ? compiler.ScriptKind.TSX : compiler.ScriptKind.TS,\n )\n const chains: PostgrestChain[] = []\n const visit = (node: ts.Node): void => {\n if (compiler.isCallExpression(node) && !isInnerCall(compiler, node)) {\n const chain = chainFromCall(compiler, node, file, path)\n if (chain) chains.push(chain)\n }\n compiler.forEachChild(node, visit)\n }\n visit(file)\n return chains\n}\n","import { createRequire } from 'node:module'\n\nimport type { TypeScriptModule } from '@/postgrest/TypeScriptModule.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\n/**\n * The project's typescript, else the one installed next to this package.\n * An optional peer: only the PostgREST rules need it, so it is never imported\n * statically and its absence is exit 3, not a crash of every command.\n */\nexport const loadTypeScript = (bases: string[]): TypeScriptModule => {\n for (const base of bases) {\n try {\n return createRequire(base)('typescript') as TypeScriptModule\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'MODULE_NOT_FOUND')\n throw error\n }\n }\n throw new ToolMissingError(\n 'typescript',\n 'install typescript in the project to run the PostgREST rules',\n )\n}\n","import type { PostgrestCall } from '@/postgrest/PostgrestCall.js'\nimport type { PostgrestChain } from '@/postgrest/PostgrestChain.js'\n\n/** The `select` call when the chain is a read (select first after the root); undefined for writes and rpc. */\nexport const chainSelectCall = (\n chain: PostgrestChain,\n): PostgrestCall | undefined => {\n const first = chain.calls[0]\n return chain.root === 'from' && first?.name === 'select' ? first : undefined\n}\n","import type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\nimport type { PostgrestChain } from '@/postgrest/PostgrestChain.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\n\nexport const makePostgrestFinding = (\n rule: Pick<PostgrestRule, 'code' | 'severity'>,\n chain: PostgrestChain,\n subject: string,\n message: string,\n): Finding => {\n const partial = {\n code: rule.code,\n severity: rule.severity,\n path: chain.path,\n line: chain.line,\n message,\n subject,\n }\n return { ...partial, fingerprint: fingerprintFinding(partial, chain.text) }\n}\n","import { chainSelectCall } from '@/postgrest/chainSelectCall.js'\nimport { makePostgrestFinding } from '@/postgrest/makePostgrestFinding.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\n\nexport const exactCountUnbounded: PostgrestRule = {\n code: 'BDB805',\n name: 'exact-count-unbounded',\n severity: 'warn',\n run: (chain) => {\n const options = chainSelectCall(chain)?.args[1] ?? ''\n if (!options.includes('count:exact') || options.includes('head:true'))\n return undefined\n if (\n chain.calls.some((call) => call.name === 'limit' || call.name === 'range')\n )\n return undefined\n return makePostgrestFinding(\n exactCountUnbounded,\n chain,\n chain.target,\n 'count: exact with no limit or range counts and returns the whole table; use head: true for the count alone or bound the rows',\n )\n },\n}\n","/** PostgREST filter methods that take a column name as their first argument. */\nexport const FILTER_METHODS = new Set([\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'like',\n 'ilike',\n 'is',\n 'in',\n 'contains',\n 'containedBy',\n 'overlaps',\n 'textSearch',\n])\n","import { FILTER_METHODS } from '@/postgrest/FILTER_METHODS.js'\nimport { makePostgrestFinding } from '@/postgrest/makePostgrestFinding.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\n\nexport const filterWithoutIndex: PostgrestRule = {\n code: 'BDB803',\n name: 'filter-without-index',\n severity: 'warn',\n run: (chain, context) => {\n if (chain.root !== 'from') return undefined\n const knowledge = context.knowledge.get(`public.${chain.target}`)\n if (!knowledge) return undefined\n const filter = chain.calls.find(\n (call) =>\n FILTER_METHODS.has(call.name) &&\n call.args[0] !== undefined &&\n call.args[0] !== '?' &&\n !call.args[0].includes('.') &&\n !knowledge.indexed.has(call.args[0].toLowerCase()),\n )\n if (!filter) return undefined\n const column = filter.args[0] ?? ''\n return makePostgrestFinding(\n filterWithoutIndex,\n chain,\n `${chain.target}.${column}`,\n `${filter.name}('${column}') filters a column no migration indexes: a sequential scan on every call`,\n )\n },\n}\n","import { makePostgrestFinding } from '@/postgrest/makePostgrestFinding.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\n\nexport const queryInLoop: PostgrestRule = {\n code: 'BDB804',\n name: 'query-in-loop',\n severity: 'warn',\n run: (chain) =>\n chain.inLoop\n ? makePostgrestFinding(\n queryInLoop,\n chain,\n chain.target,\n 'query runs once per iteration: fetch the set with .in() or a join, or move the query out of the loop',\n )\n : undefined,\n}\n","import { chainSelectCall } from '@/postgrest/chainSelectCall.js'\nimport { makePostgrestFinding } from '@/postgrest/makePostgrestFinding.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\n\nexport const starSelect: PostgrestRule = {\n code: 'BDB801',\n name: 'select-star',\n severity: 'warn',\n run: (chain) => {\n const select = chainSelectCall(chain)\n if (!select) return undefined\n const list = select.args[0]\n if (list !== undefined && list !== '?' && !list.includes('*'))\n return undefined\n if (list === '?') return undefined\n return makePostgrestFinding(\n starSelect,\n chain,\n chain.target,\n 'select fetches every column: name the columns the caller reads, so a new wide column never travels for free',\n )\n },\n}\n","/** PostgREST methods that cap the rows a chain can return. */\nexport const BOUNDING_METHODS = new Set([\n 'limit',\n 'range',\n 'single',\n 'maybeSingle',\n 'csv',\n])\n","import { BOUNDING_METHODS } from '@/postgrest/BOUNDING_METHODS.js'\nimport { chainSelectCall } from '@/postgrest/chainSelectCall.js'\nimport type { PostgrestChain } from '@/postgrest/PostgrestChain.js'\nimport type { RuleContext } from '@/postgrest/RuleContext.js'\n\nexport const isBounded = (\n chain: PostgrestChain,\n context: RuleContext,\n): boolean => {\n if (chain.calls.some((call) => BOUNDING_METHODS.has(call.name))) return true\n if (chainSelectCall(chain)?.args[1]?.includes('head:true')) return true\n const unique = context.knowledge.get(`public.${chain.target}`)?.unique\n return chain.calls.some(\n (call) =>\n call.name === 'eq' &&\n call.args[0] !== undefined &&\n unique?.has(call.args[0].toLowerCase()) === true,\n )\n}\n","import { chainSelectCall } from '@/postgrest/chainSelectCall.js'\nimport { isBounded } from '@/postgrest/isBounded.js'\nimport { makePostgrestFinding } from '@/postgrest/makePostgrestFinding.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\n\nexport const unboundedList: PostgrestRule = {\n code: 'BDB802',\n name: 'unbounded-list',\n severity: 'warn',\n run: (chain, context) => {\n if (\n !chainSelectCall(chain) ||\n !context.knowledge.has(`public.${chain.target}`)\n )\n return undefined\n if (isBounded(chain, context)) return undefined\n return makePostgrestFinding(\n unboundedList,\n chain,\n chain.target,\n 'read has no limit, range, single or unique-key equality: it returns the whole table as it grows',\n )\n },\n}\n","import { exactCountUnbounded } from '@/postgrest/exactCountUnbounded.js'\nimport { filterWithoutIndex } from '@/postgrest/filterWithoutIndex.js'\nimport type { PostgrestRule } from '@/postgrest/PostgrestRule.js'\nimport { queryInLoop } from '@/postgrest/queryInLoop.js'\nimport { starSelect } from '@/postgrest/starSelect.js'\nimport { unboundedList } from '@/postgrest/unboundedList.js'\n\nexport const POSTGREST_RULES: PostgrestRule[] = [\n starSelect,\n unboundedList,\n filterWithoutIndex,\n queryInLoop,\n exactCountUnbounded,\n]\n","import { readdirSync } from 'node:fs'\nimport { join, relative } from 'node:path'\n\nimport { ConfigError } from '@/config/ConfigError.js'\nimport { isDirectory } from '@/config/isDirectory.js'\nimport { SKIPPED_SOURCE_DIRS } from '@/postgrest/SKIPPED_SOURCE_DIRS.js'\n\n/** Every .ts/.tsx under the roots, relative to root, tests and declarations excluded, sorted. */\nexport const sourceFilesUnder = (root: string, roots: string[]): string[] => {\n for (const base of roots) {\n if (!isDirectory(join(root, base)))\n throw new ConfigError(`postgrest.roots: \"${base}\" is not a directory`)\n }\n const files: string[] = []\n const walk = (dir: string): void => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n if (!SKIPPED_SOURCE_DIRS.has(entry.name) && !entry.name.startsWith('.'))\n walk(join(dir, entry.name))\n continue\n }\n const name = entry.name\n if (\n !/\\.tsx?$/.test(name) ||\n name.endsWith('.d.ts') ||\n /\\.(?:test|spec)\\.tsx?$/.test(name)\n )\n continue\n files.push(relative(root, join(dir, name)))\n }\n }\n for (const base of roots) walk(join(root, base))\n return files.sort()\n}\n","import { existsSync, statSync } from 'node:fs'\n\nexport const isDirectory = (path: string): boolean =>\n existsSync(path) && statSync(path).isDirectory()\n","/** Directories never worth walking for application source: build output, dependencies, test doubles. */\nexport const SKIPPED_SOURCE_DIRS = new Set([\n 'node_modules',\n 'dist',\n 'build',\n '.next',\n 'coverage',\n '__tests__',\n '__mocks__',\n])\n","export const qualifiedName = (raw: string): string => {\n const parts = raw\n .trim()\n .split('.')\n .map((part) => part.replaceAll('\"', '').toLowerCase())\n return parts.length === 1 ? `public.${parts[0] ?? ''}` : parts.join('.')\n}\n","import { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport type { StatementRef } from '@/rules/StatementRef.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\nimport { qualifiedName } from '@/sql/qualifiedName.js'\n\n/** Qualified names captured by group 1 of `pattern`, each mapped to its first statement. */\nexport const matchedTables = (\n set: MigrationFile[],\n pattern: RegExp,\n): Map<string, StatementRef> => {\n const tables = new Map<string, StatementRef>()\n for (const file of set)\n for (const statement of file.statements) {\n const match = pattern.exec(normalizeSqlText(statement.text))\n if (!match?.[1]) continue\n const name = qualifiedName(match[1])\n if (!tables.has(name)) tables.set(name, { file, statement })\n }\n return tables\n}\n","import { matchedTables } from '@/rules/matchedTables.js'\nimport type { StatementRef } from '@/rules/StatementRef.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\n\n/** Tables created in `public`, each mapped to the statement that creates it. */\nexport const createdTables = (\n set: MigrationFile[],\n): Map<string, StatementRef> =>\n new Map(\n [\n ...matchedTables(\n set,\n /^create (?:unlogged |temp(?:orary)? )?table (?:if not exists )?((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?)/,\n ),\n ].filter(([name]) => name.startsWith('public.')),\n )\n","/** Matches `alter table <table> add [constraint <name>] primary key|unique (<columns>)`, capturing the qualified table name, the constraint kind, and the column list. */\nexport const ALTER_KEY_PATTERN =\n /^alter table (?:if exists )?(?:only )?((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?) add (?:constraint \\S+ )?(primary key|unique)\\s*\\(([^)]*)\\)/\n","/** The first column of a parenthesised column list, or undefined when it is an expression. */\nexport const leadingColumn = (list: string): string | undefined => {\n const first = list.split(',')[0]?.trim() ?? ''\n const match =\n /^(?:\"([^\"]+)\"|([a-z_][\\w$]*))(?:\\s+(?:asc|desc|nulls|[a-z_]+_ops)\\b.*)?$/i.exec(\n first,\n )\n if (!match) return undefined\n return (match[1] ?? match[2] ?? '').toLowerCase()\n}\n","import { ALTER_KEY_PATTERN } from '@/rules/ALTER_KEY_PATTERN.js'\nimport { leadingColumn } from '@/rules/leadingColumn.js'\nimport type { TableKnowledge } from '@/rules/TableKnowledge.js'\nimport { qualifiedName } from '@/sql/qualifiedName.js'\n\n/** Records an `alter table ... add primary key|unique` statement's leading column; reports whether it matched. */\nexport const recordAlterKey = (\n text: string,\n entry: (table: string) => TableKnowledge,\n): boolean => {\n const match = ALTER_KEY_PATTERN.exec(text)\n if (!match?.[1] || match[3] === undefined) return false\n const column = leadingColumn(match[3])\n if (column === undefined) return true\n const table = entry(qualifiedName(match[1]))\n table.indexed.add(column)\n table.unique.add(column)\n return true\n}\n","/** Matches `create [unique] index ... on <table> [using <method>] (<columns>)`, capturing uniqueness, the qualified table name, and the column list. */\nexport const CREATE_INDEX_PATTERN =\n /^create (unique )?index (?:concurrently )?(?:if not exists )?(?:\\S+ )?on (?:only )?((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?)(?: using \\w+)?\\s*\\(([^)]*)\\)/\n","import { CREATE_INDEX_PATTERN } from '@/rules/CREATE_INDEX_PATTERN.js'\nimport { leadingColumn } from '@/rules/leadingColumn.js'\nimport type { TableKnowledge } from '@/rules/TableKnowledge.js'\nimport { qualifiedName } from '@/sql/qualifiedName.js'\n\n/** Records a `create index` statement's leading column, as unique when the index is; reports whether it matched. */\nexport const recordCreateIndex = (\n text: string,\n entry: (table: string) => TableKnowledge,\n): boolean => {\n const match = CREATE_INDEX_PATTERN.exec(text)\n if (!match?.[2] || match[3] === undefined) return false\n const column = leadingColumn(match[3])\n if (column === undefined) return true\n const table = entry(qualifiedName(match[2]))\n table.indexed.add(column)\n if (match[1]) table.unique.add(column)\n return true\n}\n","/** Matches `create table ... (<body>)`, capturing the qualified name and the full column-and-constraint body. */\nexport const CREATE_TABLE_PATTERN =\n /^create (?:unlogged |temp(?:orary)? )?table (?:if not exists )?((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?)\\s*\\(([\\s\\S]*)\\)/\n","/** Columns declared `primary key` or `unique` inside a create table body, plus its table-level constraints. */\nexport const inlineKeyColumns = (body: string): string[] => {\n const columns: string[] = []\n for (const part of body.split(/,(?![^(]*\\))/)) {\n const item = part.trim()\n const constraint =\n /^(?:constraint\\s+\\S+\\s+)?(?:primary key|unique)\\s*\\(([^)]*)\\)/i.exec(\n item,\n )\n if (constraint?.[1]) {\n const head = constraint[1]\n .split(',')[0]\n ?.trim()\n .replaceAll('\"', '')\n .toLowerCase()\n if (head) columns.push(head)\n continue\n }\n const column =\n /^(?:\"([^\"]+)\"|([a-z_][\\w$]*))\\s[^,]*\\b(?:primary key|unique)\\b/i.exec(\n item,\n )\n if (column) columns.push((column[1] ?? column[2] ?? '').toLowerCase())\n }\n return columns\n}\n","import { CREATE_TABLE_PATTERN } from '@/rules/CREATE_TABLE_PATTERN.js'\nimport { inlineKeyColumns } from '@/rules/inlineKeyColumns.js'\nimport type { TableKnowledge } from '@/rules/TableKnowledge.js'\nimport { qualifiedName } from '@/sql/qualifiedName.js'\n\n/** Records a `create table` statement's inline and table-level key columns; reports whether it matched. */\nexport const recordCreateTable = (\n text: string,\n entry: (table: string) => TableKnowledge,\n): boolean => {\n const match = CREATE_TABLE_PATTERN.exec(text)\n if (!match?.[1] || match[2] === undefined) return false\n const table = entry(qualifiedName(match[1]))\n for (const column of inlineKeyColumns(match[2])) {\n table.indexed.add(column)\n table.unique.add(column)\n }\n return true\n}\n","import { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport { createdTables } from '@/rules/createdTables.js'\nimport { recordAlterKey } from '@/rules/recordAlterKey.js'\nimport { recordCreateIndex } from '@/rules/recordCreateIndex.js'\nimport { recordCreateTable } from '@/rules/recordCreateTable.js'\nimport type { TableKnowledge } from '@/rules/TableKnowledge.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\n\n/** Every table `createdTables` knows, mapped to which of its columns the migrations index or constrain unique. */\nexport const indexedColumns = (\n set: MigrationFile[],\n): Map<string, TableKnowledge> => {\n const knowledge = new Map<string, TableKnowledge>()\n const entry = (table: string): TableKnowledge => {\n const existing = knowledge.get(table)\n if (existing) return existing\n const fresh: TableKnowledge = { indexed: new Set(), unique: new Set() }\n knowledge.set(table, fresh)\n return fresh\n }\n for (const table of createdTables(set).keys()) entry(table)\n for (const file of set)\n for (const statement of file.statements) {\n const text = normalizeSqlText(statement.text)\n if (recordCreateTable(text, entry)) continue\n if (recordCreateIndex(text, entry)) continue\n recordAlterKey(text, entry)\n }\n return knowledge\n}\n","import type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\nimport { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\nimport type { StatementRef } from '@/rules/StatementRef.js'\n\nexport const makeSqlFinding = (\n rule: Pick<SqlRule, 'code' | 'severity'>,\n { file, statement }: StatementRef,\n subject: string,\n message: string,\n): Finding => {\n const partial = {\n code: rule.code,\n severity: rule.severity,\n path: file.path,\n line: statement.line,\n message,\n subject,\n }\n return {\n ...partial,\n fingerprint: fingerprintFinding(partial, normalizeSqlText(statement.text)),\n }\n}\n","import { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport { qualifiedName } from '@/sql/qualifiedName.js'\nimport type { SqlStatement } from '@/sql/SqlStatement.js'\n\nexport const policyTable = (statement: SqlStatement): string | undefined => {\n const match =\n /^create policy .+? on ((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?)/.exec(\n normalizeSqlText(statement.text),\n )\n return match?.[1] === undefined ? undefined : qualifiedName(match[1])\n}\n","import { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport { makeSqlFinding } from '@/rules/makeSqlFinding.js'\nimport { policyTable } from '@/rules/policyTable.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\n\nexport const authUidNotWrapped: SqlRule = {\n code: 'BDB004',\n name: 'auth-uid-not-wrapped',\n severity: 'warn',\n run: (set) =>\n set.flatMap((file) =>\n file.statements\n .filter((statement) => {\n const text = normalizeSqlText(statement.text)\n return (\n text.startsWith('create policy') &&\n /(?<!\\(select )auth\\.(?:uid|jwt)\\(\\)/.test(text)\n )\n })\n .map((statement) =>\n makeSqlFinding(\n authUidNotWrapped,\n { file, statement },\n policyTable(statement) ?? '',\n 'auth.uid() or auth.jwt() is re-evaluated per row; wrap it as (select auth.uid()) so Postgres caches it as an initplan',\n ),\n ),\n ),\n}\n","import { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport { makeSqlFinding } from '@/rules/makeSqlFinding.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\nimport { qualifiedName } from '@/sql/qualifiedName.js'\n\nexport const definerWithoutSearchPath: SqlRule = {\n code: 'BDB005',\n name: 'definer-without-search-path',\n severity: 'warn',\n run: (set) =>\n set.flatMap((file) =>\n file.statements.flatMap((statement) => {\n const text = normalizeSqlText(statement.text)\n const head =\n /^create (?:or replace )?(?:function|procedure) ((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?)\\s*\\(/.exec(\n text,\n )\n if (\n !head?.[1] ||\n !text.includes(' security definer') ||\n text.includes(' set search_path')\n ) {\n return []\n }\n return [\n makeSqlFinding(\n definerWithoutSearchPath,\n { file, statement },\n qualifiedName(head[1]),\n 'SECURITY DEFINER function without \"set search_path\": a caller can shadow the objects it touches',\n ),\n ]\n }),\n ),\n}\n","import { normalizeSqlText } from '@/model/normalizeSqlText.js'\nimport { makeSqlFinding } from '@/rules/makeSqlFinding.js'\nimport { policyTable } from '@/rules/policyTable.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\n\nexport const permissivePolicy: SqlRule = {\n code: 'BDB001',\n name: 'permissive-policy',\n severity: 'warn',\n run: (set) =>\n set.flatMap((file) =>\n file.statements\n .filter((statement) => {\n const text = normalizeSqlText(statement.text)\n return (\n text.startsWith('create policy') &&\n /(?:using|with check) \\( ?true ?\\)/.test(text)\n )\n })\n .map((statement) =>\n makeSqlFinding(\n permissivePolicy,\n { file, statement },\n policyTable(statement) ?? '',\n 'policy is permissive: using (true) or with check (true) lets every row through for the granted role',\n ),\n ),\n ),\n}\n","import { policyTable } from '@/rules/policyTable.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\n\nexport const policyTables = (set: MigrationFile[]): Set<string> => {\n const tables = new Set<string>()\n for (const file of set)\n for (const statement of file.statements) {\n const table = policyTable(statement)\n if (table) tables.add(table)\n }\n return tables\n}\n","import { matchedTables } from '@/rules/matchedTables.js'\nimport type { StatementRef } from '@/rules/StatementRef.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\n\n/** Tables whose row level security a migration enables, mapped to that statement. */\nexport const rlsEnabledTables = (\n set: MigrationFile[],\n): Map<string, StatementRef> =>\n matchedTables(\n set,\n /^alter table (?:if exists )?(?:only )?((?:\"[^\"]+\"|[\\w$]+)(?:\\.(?:\"[^\"]+\"|[\\w$]+))?) enable row level security/,\n )\n","import { makeSqlFinding } from '@/rules/makeSqlFinding.js'\nimport { policyTables } from '@/rules/policyTables.js'\nimport { rlsEnabledTables } from '@/rules/rlsEnabledTables.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\n\nexport const rlsEnabledNoPolicy: SqlRule = {\n code: 'BDB002',\n name: 'rls-enabled-no-policy',\n severity: 'warn',\n run: (set) => {\n const withPolicy = policyTables(set)\n return [...rlsEnabledTables(set)]\n .filter(([table]) => !withPolicy.has(table))\n .map(([table, ref]) =>\n makeSqlFinding(\n rlsEnabledNoPolicy,\n ref,\n table,\n 'RLS is enabled but no migration defines a policy: only the service role can reach this table',\n ),\n )\n },\n}\n","import { createdTables } from '@/rules/createdTables.js'\nimport { makeSqlFinding } from '@/rules/makeSqlFinding.js'\nimport { rlsEnabledTables } from '@/rules/rlsEnabledTables.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\n\nexport const tableWithoutRls: SqlRule = {\n code: 'BDB003',\n name: 'table-without-rls',\n severity: 'warn',\n run: (set) => {\n const enabled = rlsEnabledTables(set)\n return [...createdTables(set)]\n .filter(([table]) => !enabled.has(table))\n .map(([table, ref]) =>\n makeSqlFinding(\n tableWithoutRls,\n ref,\n table,\n 'table in public never enables row level security: it is readable through the Data API by anyone holding the anon key',\n ),\n )\n },\n}\n","import { authUidNotWrapped } from '@/rules/authUidNotWrapped.js'\nimport { definerWithoutSearchPath } from '@/rules/definerWithoutSearchPath.js'\nimport { permissivePolicy } from '@/rules/permissivePolicy.js'\nimport { rlsEnabledNoPolicy } from '@/rules/rlsEnabledNoPolicy.js'\nimport type { SqlRule } from '@/rules/SqlRule.js'\nimport { tableWithoutRls } from '@/rules/tableWithoutRls.js'\n\nexport const SQL_RULES: SqlRule[] = [\n permissivePolicy,\n rlsEnabledNoPolicy,\n tableWithoutRls,\n authUidNotWrapped,\n definerWithoutSearchPath,\n]\n","import type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport { compareFindings } from '@/model/compareFindings.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { SQL_RULES } from '@/rules/SQL_RULES.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\n\nexport const runSqlRules = (\n set: MigrationFile[],\n disabled: DisableEntry[],\n): Finding[] =>\n SQL_RULES.filter((rule) => !isDisabled(rule.code, disabled))\n .flatMap((rule) => rule.run(set))\n .sort(compareFindings)\n","import { readdirSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\nimport { splitSqlStatements } from '@/sql/splitSqlStatements.js'\n\nexport const readMigrationSet = (\n root: string,\n migrationsDir: string,\n): MigrationFile[] =>\n readdirSync(join(root, migrationsDir))\n .filter((name) => name.endsWith('.sql'))\n .sort()\n .map((name) => ({\n path: `${migrationsDir.replaceAll('\\\\', '/')}/${name}`,\n statements: splitSqlStatements(\n readFileSync(join(root, migrationsDir, name), 'utf8'),\n ),\n }))\n","/**\n * End offset (exclusive) of the string, quoted identifier or dollar-quoted\n * body that starts at `index`, or undefined when nothing quoted starts there.\n * An unterminated span runs to the end of the text.\n */\nexport const quotedSpanEnd = (\n sql: string,\n index: number,\n): number | undefined => {\n const dollar = /^\\$[a-z_]*\\$/i.exec(sql.slice(index, index + 64))\n if (dollar) {\n const end = sql.indexOf(dollar[0], index + dollar[0].length)\n return end === -1 ? sql.length : end + dollar[0].length\n }\n const quote = sql[index]\n if (quote !== \"'\" && quote !== '\"') return undefined\n const end = sql.indexOf(quote, index + 1)\n return end === -1 ? sql.length : end + 1\n}\n","import { quotedSpanEnd } from '@/sql/quotedSpanEnd.js'\n\n// Comments become nothing but their newlines, so the line numbers of what\n// follows are unchanged. Strings, quoted identifiers and dollar-quoted bodies\n// are copied through untouched: a `--` inside them is data.\nexport const stripSqlComments = (sql: string): string => {\n let out = ''\n let index = 0\n while (index < sql.length) {\n const quoted = quotedSpanEnd(sql, index)\n if (quoted !== undefined) {\n out += sql.slice(index, quoted)\n index = quoted\n } else if (sql.startsWith('--', index)) {\n const end = sql.indexOf('\\n', index)\n index = end === -1 ? sql.length : end\n } else if (sql.startsWith('/*', index)) {\n const end = sql.indexOf('*/', index + 2)\n const stop = end === -1 ? sql.length : end + 2\n out += sql.slice(index, stop).replaceAll(/[^\\n]/g, '')\n index = stop\n } else {\n out += sql.charAt(index)\n index += 1\n }\n }\n return out\n}\n","import { quotedSpanEnd } from '@/sql/quotedSpanEnd.js'\nimport type { SqlStatement } from '@/sql/SqlStatement.js'\nimport { stripSqlComments } from '@/sql/stripSqlComments.js'\n\nexport const splitSqlStatements = (sql: string): SqlStatement[] => {\n const text = stripSqlComments(sql)\n const statements: SqlStatement[] = []\n let start = 0\n const flush = (end: number): void => {\n const raw = text.slice(start, end)\n const leading = raw.length - raw.trimStart().length\n const body = raw.trim()\n if (body) {\n const line =\n 1 + (text.slice(0, start + leading).match(/\\n/g)?.length ?? 0)\n statements.push({ text: body, line })\n }\n start = end + 1\n }\n let index = 0\n while (index < text.length) {\n const quoted = quotedSpanEnd(text, index)\n if (quoted !== undefined) index = quoted\n else {\n if (text[index] === ';') flush(index)\n index += 1\n }\n }\n flush(text.length)\n return statements\n}\n","import { runDrizzleLint } from '@/adapters/drizzle/runDrizzleLint.js'\nimport { runPrismaLint } from '@/adapters/prisma/runPrismaLint.js'\nimport { runSqliteChecks } from '@/adapters/sqlite/runSqliteChecks.js'\nimport { runSquawk } from '@/adapters/squawk/runSquawk.js'\nimport type { CheckContext } from '@/check/CheckContext.js'\nimport { compareFindings } from '@/model/compareFindings.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { runPostgrestRules } from '@/postgrest/runPostgrestRules.js'\nimport { indexedColumns } from '@/rules/indexedColumns.js'\nimport { runSqlRules } from '@/rules/runSqlRules.js'\nimport type { MigrationFile } from '@/sql/MigrationFile.js'\nimport { readMigrationSet } from '@/sql/readMigrationSet.js'\n\n/** Every static adapter the configuration enables, in one sorted list. Errors propagate. */\nexport const runCheck = ({ root, config, runner }: CheckContext): Finding[] => {\n const findings: Finding[] = []\n const set: MigrationFile[] = config.supabase\n ? readMigrationSet(root, config.supabase.migrations)\n : []\n if (config.supabase) {\n findings.push(\n ...runSqlRules(set, config.disable),\n ...runSquawk(runner, root, set, config.disable),\n )\n }\n if (config.prisma) {\n findings.push(\n ...runPrismaLint(runner, root, config.prisma.schema, config.disable),\n )\n }\n if (config.drizzle)\n findings.push(\n ...runDrizzleLint(runner, root, config.drizzle, config.disable),\n )\n if (config.sqlite) {\n findings.push(\n ...runSqliteChecks(runner, root, config.sqlite.files, config.disable),\n )\n }\n if (config.postgrest) {\n findings.push(\n ...runPostgrestRules(\n root,\n config.postgrest.roots,\n indexedColumns(set),\n config.disable,\n ),\n )\n }\n return findings.sort(compareFindings)\n}\n","import { createRequire } from 'node:module'\n\n// Read at runtime from the package's own manifest so the bundle never carries\n// a copy that drifts from `package.json`. Both `dist/cli.js` and `src/` sit\n// one level below the package root.\nexport const PACKAGE_VERSION: string = (\n createRequire(import.meta.url)('../package.json') as { version: string }\n).version\n","import { renderFindings } from '@/check/renderFindings.js'\nimport { renderFindingsJson } from '@/check/renderFindingsJson.js'\nimport { runCheck } from '@/check/runCheck.js'\nimport type { CommandIo } from '@/commands/CommandIo.js'\nimport { parseCommandArgs } from '@/commands/parseCommandArgs.js'\nimport { reportCommandError } from '@/commands/reportCommandError.js'\nimport { legacyConfigNotice } from '@/config/legacyConfigNotice.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { ExitCode } from '@/model/ExitCode.js'\n\nexport const checkCommand = (argv: string[], io: CommandIo): number => {\n try {\n const { values } = parseCommandArgs(argv, { json: { type: 'boolean' } })\n const config = readConfig(io.root)\n const notice = legacyConfigNotice(config)\n if (notice) io.stderr(`${notice}\\n`)\n const findings = runCheck({\n root: io.root,\n config,\n runner: io.runner,\n })\n io.stdout(\n `${values['json'] === true ? renderFindingsJson(findings) : renderFindings(findings)}\\n`,\n )\n return findings.length > 0 ? ExitCode.FINDINGS : ExitCode.OK\n } catch (error) {\n return reportCommandError(error, io.stderr)\n }\n}\n","import type { StageResult } from '@/gate/StageResult.js'\nimport { ExitCode } from '@/model/ExitCode.js'\n\nexport const gateExitCode = (results: StageResult[]): number => {\n if (results.some((result) => result.status === 'failed-to-run'))\n return ExitCode.INFRASTRUCTURE\n if (results.some((result) => result.status === 'findings'))\n return ExitCode.FINDINGS\n return ExitCode.OK\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { runAudit } from '@/audit/runAudit.js'\nimport { BASELINE_FILENAME } from '@/baseline/BASELINE_FILENAME.js'\nimport { classifyFindings } from '@/baseline/classifyFindings.js'\nimport { readBaseline } from '@/baseline/readBaseline.js'\nimport type { CheckContext } from '@/check/CheckContext.js'\nimport { runCheck } from '@/check/runCheck.js'\nimport { perfStage } from '@/gate/perfStage.js'\nimport type { Stage } from '@/gate/Stage.js'\n\n// A recorded baseline is the migration plan; the gate must honour it, or\n// recording debt could never turn the gate green. Audit runs when the project\n// is linked unless the configuration says otherwise: a linked project whose\n// CI has no token must switch it off explicitly rather than pass by accident.\nexport const gateStages = (context: CheckContext): Stage[] => {\n const hasBaseline = existsSync(join(context.root, BASELINE_FILENAME))\n const linked = existsSync(join(context.root, 'supabase/.temp/project-ref'))\n return [\n hasBaseline\n ? {\n name: 'baseline-check',\n run: () =>\n classifyFindings(runCheck(context), readBaseline(context.root)).new,\n }\n : { name: 'check', run: () => runCheck(context) },\n {\n name: 'audit',\n run: () =>\n context.config.audit.inGate && linked\n ? runAudit({ ...context, target: { linked: true } })\n : 'not-applicable',\n },\n perfStage(context),\n ]\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BENCH_RECORD_FILENAME } from '@/bench/BENCH_RECORD_FILENAME.js'\nimport type { CheckContext } from '@/check/CheckContext.js'\nimport { perfBenchFindings } from '@/gate/perfBenchFindings.js'\nimport { perfDiffFindings } from '@/gate/perfDiffFindings.js'\nimport type { Stage } from '@/gate/Stage.js'\nimport type { StageOutcome } from '@/gate/StageOutcome.js'\nimport { PERF_SNAPSHOT_FILENAME } from '@/perf/PERF_SNAPSHOT_FILENAME.js'\nimport { resolvePostgresTarget } from '@/postgres/resolvePostgresTarget.js'\n\n// The stage says what it did not measure: a green stage that measured\n// nothing is exactly the false comfort the gate exists to remove.\nexport const perfStage = (context: CheckContext): Stage => ({\n name: 'perf',\n run: (): StageOutcome => {\n if (!context.config.perf.inGate) return 'not-applicable'\n const target = resolvePostgresTarget(context.root, {})\n if (!target)\n return {\n skipped: 'no linked project with SUPABASE_DB_PASSWORD',\n }\n const hasSnapshot = existsSync(join(context.root, PERF_SNAPSHOT_FILENAME))\n const hasRecord = existsSync(join(context.root, BENCH_RECORD_FILENAME))\n if (!hasSnapshot && !hasRecord)\n return {\n skipped:\n 'no perf snapshot and no bench record; run \"perf snapshot\" or \"perf bench --record\"',\n }\n return [\n ...(hasSnapshot ? perfDiffFindings(context, target) : []),\n ...(hasRecord ? perfBenchFindings(context, target) : []),\n ]\n },\n})\n","export const BENCH_RECORD_FILENAME = '.codeality-db-bench.json'\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BENCH_RECORD_FILENAME } from '@/bench/BENCH_RECORD_FILENAME.js'\nimport type { BenchRecord } from '@/bench/BenchRecord.js'\nimport { ConfigError } from '@/config/ConfigError.js'\n\n/** `undefined` when the record is absent: the caller decides what that means. */\nexport const readBenchRecord = (root: string): BenchRecord | undefined => {\n const path = join(root, BENCH_RECORD_FILENAME)\n if (!existsSync(path)) return undefined\n const document = JSON.parse(\n readFileSync(path, 'utf8'),\n ) as Partial<BenchRecord>\n if (document.schemaVersion !== 1)\n throw new ConfigError(\n `${BENCH_RECORD_FILENAME} is not a version 1 bench record`,\n )\n return {\n schemaVersion: 1,\n toolVersion: document.toolVersion ?? '',\n takenAt: document.takenAt ?? '',\n host: document.host ?? '',\n entries: document.entries ?? {},\n }\n}\n","import type { BenchFindingsInput } from '@/bench/BenchFindingsInput.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\n// BDB913 warns; the other two bench codes fail the gate. The fingerprint\n// context is the query file, not the line: it is always 1, so a line would\n// tell two findings on the same file apart no better than the code already does.\nexport const benchFinding = (\n input: BenchFindingsInput,\n code: string,\n subject: string,\n message: string,\n): Finding => {\n const partial = {\n code,\n severity: code === 'BDB913' ? ('warn' as const) : ('error' as const),\n path: `${input.benchDir}/${input.file}`,\n line: 1,\n message,\n subject,\n }\n return { ...partial, fingerprint: fingerprintFinding(partial, input.file) }\n}\n","/** BDB913 fires when the planner's row estimate is off from the actual rows by this factor or more. */\nexport const ESTIMATE_RATIO_LIMIT = 100\n","/** A regression (BDB901, BDB911) must add at least this many milliseconds: a percentage of a sub-millisecond time is noise. */\nexport const REGRESSION_FLOOR_MS = 5\n","import type { BenchEntry } from '@/bench/BenchEntry.js'\nimport { benchFinding } from '@/bench/benchFinding.js'\nimport type { BenchFindingsInput } from '@/bench/BenchFindingsInput.js'\nimport type { BenchJudgement } from '@/bench/BenchJudgement.js'\nimport { ESTIMATE_RATIO_LIMIT } from '@/bench/ESTIMATE_RATIO_LIMIT.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { REGRESSION_FLOOR_MS } from '@/perf/REGRESSION_FLOOR_MS.js'\n\n// Three codes: BDB911 a query that got materially slower against its record,\n// BDB912 a sequential scan the record did not have (over a big table, or over\n// a relation the record used to reach by index), BDB913 a planner estimate\n// far off from what actually happened.\nexport const benchFindings = (\n input: BenchFindingsInput,\n recorded: BenchEntry | undefined,\n current: BenchEntry,\n judgement: BenchJudgement,\n): Finding[] => {\n const { perf, disabled } = judgement\n const findings: Finding[] = []\n const add = (code: string, subject: string, message: string): void => {\n findings.push(benchFinding(input, code, subject, message))\n }\n const slower =\n recorded &&\n current.medianMs >=\n recorded.medianMs * (1 + perf.regressionPercent / 100) &&\n current.medianMs - recorded.medianMs >= REGRESSION_FLOOR_MS\n if (slower)\n add(\n 'BDB911',\n input.file,\n `median ${recorded.medianMs.toFixed(2)} ms -> ${current.medianMs.toFixed(2)} ms (+${String(Math.round((current.medianMs / recorded.medianMs - 1) * 100))}%) over ${String(current.runs)} runs`,\n )\n const newScans = recorded\n ? current.seqScans.filter(\n (scan) =>\n !recorded.seqScans.some((r) => r.relation === scan.relation) &&\n (scan.rows >= perf.seqScanRows ||\n recorded.indexScans.includes(scan.relation)),\n )\n : []\n for (const scan of newScans)\n add(\n 'BDB912',\n scan.relation,\n `sequential scan over ${scan.rows.toLocaleString('en-US')} rows of \"${scan.relation}\" where the record had ${recorded?.indexScans.includes(scan.relation) ? 'an index scan' : 'none'}`,\n )\n if (current.worstEstimateRatio >= ESTIMATE_RATIO_LIMIT)\n add(\n 'BDB913',\n input.file,\n `planner estimate off by ${String(Math.round(current.worstEstimateRatio))}x: run ANALYZE or raise the statistics target`,\n )\n return findings.filter((f) => !isDisabled(f.code, disabled))\n}\n","import { readdirSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { BenchQuery } from '@/bench/BenchQuery.js'\nimport { RUNS_HEADER } from '@/bench/RUNS_HEADER.js'\nimport { ConfigError } from '@/config/ConfigError.js'\nimport { isDirectory } from '@/config/isDirectory.js'\nimport { isPositiveInteger } from '@/config/isPositiveInteger.js'\nimport { splitSqlStatements } from '@/sql/splitSqlStatements.js'\n\nexport const readBenchQueries = (\n root: string,\n benchDir: string,\n defaultRuns: number,\n): BenchQuery[] => {\n const dir = join(root, benchDir)\n if (!isDirectory(dir)) throw new ConfigError(`${benchDir} is not a directory`)\n return readdirSync(dir)\n .filter((name) => name.endsWith('.sql'))\n .sort()\n .map((name) => {\n const raw = readFileSync(join(dir, name), 'utf8')\n const match = RUNS_HEADER.exec(raw)\n const runs = match?.[1] ? Number(match[1]) : defaultRuns\n if (!isPositiveInteger(runs))\n throw new ConfigError(`${name}: -- runs: must be a positive integer`)\n const statements = splitSqlStatements(raw)\n const sql = statements[0]?.text\n if (sql === undefined) throw new ConfigError(`${name} holds no statement`)\n // A clear message, not the boundary: the server enforces that one.\n if (statements.length > 1)\n throw new ConfigError(\n `${name} holds more than one statement; a bench file is one statement`,\n )\n return { file: name, sql, runs }\n })\n}\n","/** A first line such as `-- runs: 20` overriding a bench query's default run count; the value is checked by the reader. */\nexport const RUNS_HEADER = /^--\\s*runs:\\s*(\\S+)/\n","export const median = (values: number[]): number => {\n const sorted = [...values].sort((a, b) => a - b)\n const mid = Math.floor(sorted.length / 2)\n if (sorted.length % 2 === 1) return sorted[mid] ?? 0\n return ((sorted[mid - 1] ?? 0) + (sorted[mid] ?? 0)) / 2\n}\n","/** A plan node counts toward `worstEstimateRatio` only once its plan or actual rows reach this floor; a stale estimate on a handful of rows never matters. */\nexport const ESTIMATE_MIN_ROWS = 1000\n","import type { PlanNode } from '@/bench/PlanNode.js'\n\nexport const walkPlan = (\n node: PlanNode,\n visit: (node: PlanNode) => void,\n): void => {\n visit(node)\n for (const child of node.Plans ?? []) walkPlan(child, visit)\n}\n","import { ESTIMATE_MIN_ROWS } from '@/bench/ESTIMATE_MIN_ROWS.js'\nimport type { ExplainDocument } from '@/bench/ExplainDocument.js'\nimport type { ExplainSummary } from '@/bench/ExplainSummary.js'\nimport type { SeqScanStat } from '@/bench/SeqScanStat.js'\nimport { walkPlan } from '@/bench/walkPlan.js'\n\nexport const summarizeExplain = (explainJson: string): ExplainSummary => {\n const scanKinds = ['Index Scan', 'Index Only Scan', 'Bitmap Heap Scan']\n const parsed: unknown = JSON.parse(explainJson)\n const first = Array.isArray(parsed) ? (parsed[0] as unknown) : undefined\n if (\n typeof first !== 'object' ||\n first === null ||\n !('Plan' in first) ||\n !('Execution Time' in first)\n )\n throw new Error('psql output is not an EXPLAIN document')\n const document = first as ExplainDocument\n const seqScans: SeqScanStat[] = []\n const indexScans: string[] = []\n let worstEstimateRatio = 0\n walkPlan(document.Plan, (node) => {\n const relation = node['Relation Name']\n if (node['Node Type'] === 'Seq Scan' && relation)\n seqScans.push({\n relation,\n rows:\n (node['Actual Rows'] + (node['Rows Removed by Filter'] ?? 0)) *\n node['Actual Loops'],\n })\n if (relation && scanKinds.includes(node['Node Type']))\n indexScans.push(relation)\n const plan = node['Plan Rows']\n const actual = node['Actual Rows']\n if (plan > 0 && actual > 0 && Math.max(plan, actual) >= ESTIMATE_MIN_ROWS) {\n const ratio = Math.max(\n (plan + 1) / (actual + 1),\n (actual + 1) / (plan + 1),\n )\n if (ratio > worstEstimateRatio) worstEstimateRatio = ratio\n }\n })\n return {\n executionMs: document['Execution Time'],\n seqScans,\n indexScans,\n worstEstimateRatio,\n }\n}\n","import type { BenchEntry } from '@/bench/BenchEntry.js'\nimport type { BenchQuery } from '@/bench/BenchQuery.js'\nimport type { ExplainSummary } from '@/bench/ExplainSummary.js'\nimport { median } from '@/bench/median.js'\nimport { summarizeExplain } from '@/bench/summarizeExplain.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\n\n/** Runs the query once as a warm-up (discarded), then `query.runs` times, taking the median. A failure names the file. */\nexport const runBenchQuery = (\n session: PsqlSession,\n query: BenchQuery,\n): BenchEntry => {\n const times: number[] = []\n let last: ExplainSummary | undefined\n try {\n session.explain(query.sql)\n for (let run = 0; run < query.runs; run += 1) {\n last = summarizeExplain(session.explain(query.sql))\n times.push(last.executionMs)\n }\n } catch (error) {\n throw new Error(`${query.file}: ${(error as Error).message}`, {\n cause: error,\n })\n }\n if (!last) throw new Error(`${query.file}: zero runs`)\n return {\n medianMs: median(times),\n minMs: Math.min(...times),\n runs: query.runs,\n seqScans: last.seqScans,\n indexScans: last.indexScans,\n worstEstimateRatio: last.worstEstimateRatio,\n }\n}\n","import type { BenchEntry } from '@/bench/BenchEntry.js'\nimport { benchFindings } from '@/bench/benchFindings.js'\nimport type { BenchJudgement } from '@/bench/BenchJudgement.js'\nimport type { BenchRecord } from '@/bench/BenchRecord.js'\nimport type { BenchResult } from '@/bench/BenchResult.js'\nimport { readBenchQueries } from '@/bench/readBenchQueries.js'\nimport { runBenchQuery } from '@/bench/runBenchQuery.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { Improvement } from '@/perf/Improvement.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\n\nexport const runBench = (\n session: PsqlSession,\n root: string,\n recorded: BenchRecord | undefined,\n judgement: BenchJudgement,\n): BenchResult => {\n const { perf } = judgement\n const queries = readBenchQueries(root, perf.benchDir, perf.benchRuns)\n const entries: Record<string, BenchEntry> = {}\n const findings: Finding[] = []\n const improvements: Improvement[] = []\n for (const query of queries) {\n const entry = runBenchQuery(session, query)\n entries[query.file] = entry\n const recordedEntry = recorded?.entries[query.file]\n findings.push(\n ...benchFindings(\n { file: query.file, benchDir: perf.benchDir },\n recordedEntry,\n entry,\n judgement,\n ),\n )\n if (\n recordedEntry &&\n entry.medianMs <=\n recordedEntry.medianMs * (1 - perf.regressionPercent / 100)\n )\n improvements.push({\n subject: query.file,\n previousMs: recordedEntry.medianMs,\n currentMs: entry.medianMs,\n calls: entry.runs,\n savedMs: recordedEntry.medianMs - entry.medianMs,\n })\n }\n return { entries, findings, improvements }\n}\n","import { randomBytes } from 'node:crypto'\n\n/** A random `dbq_<hex>` dollar-quote tag whose `$tag$` never occurs in `text`, so quoting `text` with it cannot end early. */\nexport const dollarTag = (\n text: string,\n next: () => string = () => randomBytes(8).toString('hex'),\n): string => {\n for (;;) {\n const tag = `dbq_${next()}`\n if (!text.includes(`$${tag}$`)) return tag\n }\n}\n","/** The session setting a bench plan is handed back through, from inside the DO block to the next statement. */\nexport const PLAN_SETTING = 'dbq.plan'\n","/** The SQLSTATE the bench DO block raises, and catches, to roll back whatever the explained statement did. */\nexport const ROLLBACK_SQLSTATE = 'DBQRB'\n","import { dollarTag } from '@/postgres/dollarTag.js'\nimport { PLAN_SETTING } from '@/postgres/PLAN_SETTING.js'\nimport { ROLLBACK_SQLSTATE } from '@/postgres/ROLLBACK_SQLSTATE.js'\n\n/**\n * EXPLAIN ANALYZE of `sql` run through a PL/pgSQL cursor inside a DO block.\n * The server, not a lexer here, keeps it to one statement: a cursor over a\n * multi-statement string is refused (\"cannot open multi-query plan as\n * cursor\"), so nothing after the EXPLAIN ever runs. It runs in an inner\n * block that always ends by raising ROLLBACK_SQLSTATE, so its subtransaction\n * is rolled back: EXPLAIN ANALYZE of CREATE TABLE AS, SELECT INTO or CREATE\n * MATERIALIZED VIEW writes even in a read-only transaction, and this undoes\n * it. The plan survives in a PL/pgSQL variable and comes back through a\n * session setting, read by the next statement.\n */\nexport const explainDoBlock = (sql: string): string => {\n const quote = dollarTag(sql)\n const body = dollarTag(`${sql}$${quote}$`)\n return `do $${body}$ declare c refcursor; p text; begin begin open c for execute 'explain (analyze, buffers, format json) ' || $${quote}$${sql}$${quote}$; fetch c into p; close c; raise exception using errcode = '${ROLLBACK_SQLSTATE}'; exception when sqlstate '${ROLLBACK_SQLSTATE}' then null; end; if p is null then raise exception 'the statement produced no plan'; end if; perform set_config('${PLAN_SETTING}', p, false); end $${body}$`\n}\n","/** The `psql` argument vector for one session: read-only and timed out before the statements run, every call. */\nexport const psqlArguments = (\n url: string,\n timeoutMs: number,\n statements: string[],\n): string[] => [\n url,\n '-X',\n '-q',\n '-A',\n '-t',\n '-v',\n 'ON_ERROR_STOP=1',\n '-c',\n 'set default_transaction_read_only = on',\n '-c',\n `set statement_timeout = ${String(timeoutMs)}`,\n ...statements.flatMap((statement) => ['-c', statement]),\n]\n","/** Replaces the password in any `scheme://user:password@host` occurrence with `***`, so a connection string psql echoes back in an error never carries a real credential. */\nexport const redactConnectionSecrets = (text: string): string =>\n text.replace(/(\\w+:\\/\\/[^:/\\s@]+:)[^@\\s]+@/g, '$1***@')\n","import { explainDoBlock } from '@/postgres/explainDoBlock.js'\nimport { PLAN_SETTING } from '@/postgres/PLAN_SETTING.js'\nimport type { PostgresTarget } from '@/postgres/PostgresTarget.js'\nimport { psqlArguments } from '@/postgres/psqlArguments.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\nimport { redactConnectionSecrets } from '@/postgres/redactConnectionSecrets.js'\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { ToolMissingError } from '@/tools/ToolMissingError.js'\n\n// Every call is one psql process: the pooler ignores PGOPTIONS, so the\n// read-only mode is a session SET sent before the query, every time. The\n// password travels in the environment and never in an argument or a message.\nexport const psqlSession = (\n runner: CommandRunner,\n root: string,\n target: PostgresTarget,\n timeoutMs: number,\n): PsqlSession => {\n const run = (statements: string[]): string => {\n const result = runner(\n 'psql',\n psqlArguments(target.url, timeoutMs, statements),\n {\n cwd: root,\n systemPathOnly: true,\n env: {\n ...(target.password === undefined\n ? {}\n : { PGPASSWORD: target.password }),\n PGCONNECT_TIMEOUT: '10',\n },\n },\n )\n if (result.missing)\n throw new ToolMissingError('psql', 'install the PostgreSQL client')\n if (result.status !== 0)\n throw new Error(\n `psql failed: ${redactConnectionSecrets(result.stderr.trim())}`,\n )\n return result.stdout\n }\n return {\n rows: (sql) => {\n const out = run([\n `select coalesce(json_agg(t), '[]'::json) from (${sql}) t`,\n ]).trim()\n return out === '' ? [] : (JSON.parse(out) as unknown[])\n },\n explain: (sql) =>\n run([\n explainDoBlock(sql),\n `select current_setting('${PLAN_SETTING}')`,\n ]).trim(),\n }\n}\n","import { readBenchRecord } from '@/bench/readBenchRecord.js'\nimport { runBench } from '@/bench/runBench.js'\nimport type { CheckContext } from '@/check/CheckContext.js'\nimport type { Finding } from '@/model/Finding.js'\nimport type { PostgresTarget } from '@/postgres/PostgresTarget.js'\nimport { psqlSession } from '@/postgres/psqlSession.js'\n\n/** The gate's own bench: replays the recorded queries and compares against the recorded medians. */\nexport const perfBenchFindings = (\n { root, config, runner }: CheckContext,\n target: PostgresTarget,\n): Finding[] => {\n const session = psqlSession(runner, root, target, config.perf.benchTimeoutMs)\n return runBench(session, root, readBenchRecord(root), {\n perf: config.perf,\n disabled: config.disable,\n }).findings\n}\n","import type { StatementWindow } from '@/perf/StatementWindow.js'\n\nexport const statementSubject = (window: StatementWindow): string =>\n `${window.role}: ${window.text.slice(0, 80)}`\n","import type { PerfConfig } from '@/config/PerfConfig.js'\nimport type { Improvement } from '@/perf/Improvement.js'\nimport { statementSubject } from '@/perf/statementSubject.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\nexport const improvementsIn = (\n windows: StatementWindow[],\n perf: PerfConfig,\n): Improvement[] =>\n windows.reduce<Improvement[]>((improvements, window) => {\n if (\n window.previousMeanMs === null ||\n window.calls < perf.minCalls ||\n window.meanMs > window.previousMeanMs * (1 - perf.regressionPercent / 100)\n )\n return improvements\n return [\n ...improvements,\n {\n subject: statementSubject(window),\n previousMs: window.previousMeanMs,\n currentMs: window.meanMs,\n calls: window.calls,\n savedMs: (window.previousMeanMs - window.meanMs) * window.calls,\n },\n ]\n }, [])\n","import type { PerfConfig } from '@/config/PerfConfig.js'\nimport { REGRESSION_FLOOR_MS } from '@/perf/REGRESSION_FLOOR_MS.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\nexport const isRegression = (\n window: StatementWindow,\n perf: PerfConfig,\n): boolean =>\n window.previousMeanMs !== null &&\n window.meanMs >= REGRESSION_FLOOR_MS &&\n window.meanMs >= window.previousMeanMs * (1 + perf.regressionPercent / 100) &&\n window.meanMs - window.previousMeanMs >= REGRESSION_FLOOR_MS\n","import type { Finding } from '@/model/Finding.js'\nimport { fingerprintFinding } from '@/model/fingerprintFinding.js'\n\n// Severity follows from the code alone: BDB901 (a regression) is the only\n// perf rule that fails the gate; the rest warn. Keeping severity out of the\n// parameter list holds this at 4 params, the monorepo's max-params budget.\nexport const perfFinding = (\n code: string,\n subject: string,\n context: string,\n message: string,\n): Finding => {\n const partial = {\n code,\n severity: code === 'BDB901' ? ('error' as const) : ('warn' as const),\n path: 'postgres',\n line: 0,\n message,\n subject,\n }\n return { ...partial, fingerprint: fingerprintFinding(partial, context) }\n}\n","import type { StatementWindow } from '@/perf/StatementWindow.js'\n\nexport const statementContext = (window: StatementWindow): string =>\n `${window.role}|${window.queryId}`\n","import type { PerfConfig } from '@/config/PerfConfig.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { isRegression } from '@/perf/isRegression.js'\nimport { perfFinding } from '@/perf/perfFinding.js'\nimport { statementContext } from '@/perf/statementContext.js'\nimport { statementSubject } from '@/perf/statementSubject.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\n// BDB901: the mean crossed from a real previous reading into a materially\n// slower one. `isRegression` narrows out `previousMeanMs === null` at\n// runtime, but not for the type checker, so the guard is repeated here.\nexport const statementRegressionFinding = (\n window: StatementWindow,\n perf: PerfConfig,\n): Finding | null => {\n if (!isRegression(window, perf) || window.previousMeanMs === null) return null\n const percent = Math.round((window.meanMs / window.previousMeanMs - 1) * 100)\n const sign = percent >= 0 ? '+' : ''\n return perfFinding(\n 'BDB901',\n statementSubject(window),\n statementContext(window),\n `mean ${window.previousMeanMs.toFixed(2)} ms -> ${window.meanMs.toFixed(2)} ms (${sign}${String(percent)}%) over ${window.calls.toLocaleString('en-US')} calls`,\n )\n}\n","import type { PerfConfig } from '@/config/PerfConfig.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { perfFinding } from '@/perf/perfFinding.js'\nimport { statementContext } from '@/perf/statementContext.js'\nimport { statementSubject } from '@/perf/statementSubject.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\n// BDB902: the statement is simply slow on its own terms, independent of\n// whether it regressed against its previous reading.\nexport const statementSlowFinding = (\n window: StatementWindow,\n perf: PerfConfig,\n): Finding | null => {\n if (window.meanMs < perf.slowMs) return null\n return perfFinding(\n 'BDB902',\n statementSubject(window),\n statementContext(window),\n `mean ${window.meanMs.toFixed(2)} ms over ${window.calls.toLocaleString('en-US')} calls, threshold ${perf.slowMs.toLocaleString('en-US')} ms`,\n )\n}\n","import type { Finding } from '@/model/Finding.js'\nimport { perfFinding } from '@/perf/perfFinding.js'\nimport { statementContext } from '@/perf/statementContext.js'\nimport { statementSubject } from '@/perf/statementSubject.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\n// BDB904: any temp blocks written mean a sort or hash spilled to disk during\n// the window.\nexport const statementSpillFinding = (\n window: StatementWindow,\n): Finding | null => {\n if (window.tempBlksWritten <= 0) return null\n return perfFinding(\n 'BDB904',\n statementSubject(window),\n statementContext(window),\n `wrote ${window.tempBlksWritten.toLocaleString('en-US')} temp blocks over ${window.calls.toLocaleString('en-US')} calls: a sort or hash spilled to disk`,\n )\n}\n","import type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { PerfConfig } from '@/config/PerfConfig.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { statementRegressionFinding } from '@/perf/statementRegressionFinding.js'\nimport { statementSlowFinding } from '@/perf/statementSlowFinding.js'\nimport { statementSpillFinding } from '@/perf/statementSpillFinding.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\nexport const statementFindings = (\n windows: StatementWindow[],\n perf: PerfConfig,\n disabled: DisableEntry[],\n): Finding[] =>\n windows\n .filter((window) => window.calls >= perf.minCalls)\n .flatMap((window) => [\n statementRegressionFinding(window, perf),\n statementSlowFinding(window, perf),\n statementSpillFinding(window),\n ])\n .filter((finding): finding is Finding => finding !== null)\n .filter((finding) => !isDisabled(finding.code, disabled))\n","import type { DisableEntry } from '@/config/DisableEntry.js'\nimport { isDisabled } from '@/config/isDisabled.js'\nimport type { PerfConfig } from '@/config/PerfConfig.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { perfFinding } from '@/perf/perfFinding.js'\nimport type { TableWindow } from '@/perf/TableWindow.js'\n\nexport const tableFindings = (\n windows: TableWindow[],\n perf: PerfConfig,\n disabled: DisableEntry[],\n): Finding[] =>\n windows\n .filter(\n (window) =>\n window.liveRows >= perf.seqScanRows && window.seqScan > window.idxScan,\n )\n .map((window) =>\n perfFinding(\n 'BDB903',\n window.name,\n window.name,\n `${window.seqScan.toLocaleString('en-US')} sequential scans against ${window.idxScan.toLocaleString('en-US')} index scans on ${window.liveRows.toLocaleString('en-US')} live rows`,\n ),\n )\n .filter((finding) => !isDisabled(finding.code, disabled))\n","import type { PerfSnapshot } from '@/perf/PerfSnapshot.js'\nimport type { StatementWindow } from '@/perf/StatementWindow.js'\n\n// A reset loses the old mean too, since the old totals were measured against\n// a different history; a new statement has nothing to regress from; a\n// counter falling back means the server-side stat itself reset underneath\n// us. All three cases fall back to the current absolute values.\nexport const windowStatements = (\n previous: PerfSnapshot,\n current: PerfSnapshot,\n): StatementWindow[] => {\n const reset = current.statsReset !== previous.statsReset\n return current.statements.map((statement): StatementWindow => {\n const match = previous.statements.find(\n (candidate) =>\n candidate.role === statement.role &&\n candidate.queryId === statement.queryId,\n )\n const fell =\n match !== undefined &&\n (statement.calls < match.calls ||\n statement.totalMs < match.totalMs ||\n statement.tempBlksWritten < match.tempBlksWritten)\n if (reset || match === undefined || fell) {\n const { calls, totalMs, tempBlksWritten } = statement\n return {\n role: statement.role,\n queryId: statement.queryId,\n text: statement.text,\n calls,\n totalMs,\n tempBlksWritten,\n meanMs: calls === 0 ? 0 : totalMs / calls,\n previousMeanMs: null,\n }\n }\n const calls = statement.calls - match.calls\n const totalMs = statement.totalMs - match.totalMs\n return {\n role: statement.role,\n queryId: statement.queryId,\n text: statement.text,\n calls,\n totalMs,\n tempBlksWritten: statement.tempBlksWritten - match.tempBlksWritten,\n meanMs: calls === 0 ? 0 : totalMs / calls,\n previousMeanMs: match.calls === 0 ? null : match.totalMs / match.calls,\n }\n })\n}\n","import type { PerfSnapshot } from '@/perf/PerfSnapshot.js'\nimport type { TableWindow } from '@/perf/TableWindow.js'\n\n// Same reset/new/fell rule as windowStatements, but liveRows is a live count\n// rather than a cumulative counter, so it is always the current absolute\n// value: only seqScan and idxScan are ever deltas.\nexport const windowTables = (\n previous: PerfSnapshot,\n current: PerfSnapshot,\n): TableWindow[] => {\n const reset = current.statsReset !== previous.statsReset\n return current.tables.map((table): TableWindow => {\n const match = previous.tables.find(\n (candidate) => candidate.name === table.name,\n )\n const fell =\n match !== undefined &&\n (table.seqScan < match.seqScan || table.idxScan < match.idxScan)\n if (reset || match === undefined || fell) {\n return {\n name: table.name,\n liveRows: table.liveRows,\n seqScan: table.seqScan,\n idxScan: table.idxScan,\n }\n }\n return {\n name: table.name,\n liveRows: table.liveRows,\n seqScan: table.seqScan - match.seqScan,\n idxScan: table.idxScan - match.idxScan,\n }\n })\n}\n","import type { DisableEntry } from '@/config/DisableEntry.js'\nimport type { PerfConfig } from '@/config/PerfConfig.js'\nimport { compareFindings } from '@/model/compareFindings.js'\nimport { improvementsIn } from '@/perf/improvementsIn.js'\nimport { isRegression } from '@/perf/isRegression.js'\nimport type { PerfDiff } from '@/perf/PerfDiff.js'\nimport type { PerfSnapshot } from '@/perf/PerfSnapshot.js'\nimport { statementFindings } from '@/perf/statementFindings.js'\nimport { tableFindings } from '@/perf/tableFindings.js'\nimport { windowStatements } from '@/perf/windowStatements.js'\nimport { windowTables } from '@/perf/windowTables.js'\n\nexport const diffSnapshots = (\n previous: PerfSnapshot,\n current: PerfSnapshot,\n perf: PerfConfig,\n disabled: DisableEntry[],\n): PerfDiff => {\n const statementWindows = windowStatements(previous, current)\n const eligible = statementWindows.filter(\n (window) => window.calls >= perf.minCalls,\n )\n const improvements = improvementsIn(statementWindows, perf)\n const findings = [\n ...statementFindings(statementWindows, perf, disabled),\n ...tableFindings(windowTables(previous, current), perf, disabled),\n ].sort(compareFindings)\n return {\n from: previous.takenAt,\n to: current.takenAt,\n improvements,\n findings,\n savedMs: improvements.reduce(\n (sum, improvement) => sum + improvement.savedMs,\n 0,\n ),\n lostMs: eligible\n .filter((window) => isRegression(window, perf))\n .reduce(\n (sum, window) =>\n sum +\n (window.previousMeanMs === null\n ? 0\n : (window.meanMs - window.previousMeanMs) * window.calls),\n 0,\n ),\n }\n}\n","/** The read-only session timeout for the snapshot and diff queries against pg_stat views. */\nexport const QUERY_TIMEOUT_MS = 30000\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { ConfigError } from '@/config/ConfigError.js'\nimport { PERF_SNAPSHOT_FILENAME } from '@/perf/PERF_SNAPSHOT_FILENAME.js'\nimport type { PerfSnapshot } from '@/perf/PerfSnapshot.js'\n\nexport const readPerfSnapshot = (root: string): PerfSnapshot => {\n const path = join(root, PERF_SNAPSHOT_FILENAME)\n if (!existsSync(path)) {\n throw new ConfigError(\n `${PERF_SNAPSHOT_FILENAME} not found; run \"codeality-db perf snapshot\"`,\n )\n }\n const document = JSON.parse(\n readFileSync(path, 'utf8'),\n ) as Partial<PerfSnapshot>\n if (document.schemaVersion !== 1) {\n throw new ConfigError(\n `${PERF_SNAPSHOT_FILENAME} is not a version 1 snapshot`,\n )\n }\n return {\n schemaVersion: 1,\n toolVersion: document.toolVersion ?? '',\n takenAt: document.takenAt ?? '',\n host: document.host ?? '',\n statsReset: document.statsReset ?? null,\n statements: document.statements ?? [],\n tables: document.tables ?? [],\n }\n}\n","export const PERF_SNAPSHOT_FILENAME = '.codeality-db-perf.json'\n","/** Statements Supabase, PostgREST and this tool run on their own; none of them is the application's. */\nexport const PLATFORM_NOISE: RegExp[] = [\n /^select pg_sleep\\(/i,\n /pg_timezone_names/i,\n /pg_stat_statements/i,\n /^WITH -- Recursively get the base types of domains/,\n /^SELECT wal->>/,\n /^COPY /i,\n /^select coalesce\\(json_agg\\(t\\)/i,\n]\n","import { PLATFORM_NOISE } from '@/perf/PLATFORM_NOISE.js'\n\n/** Built-in noise by pattern; `perf.ignore` entries are plain substrings of the normalized text. */\nexport const isPlatformNoise = (text: string, ignore: string[]): boolean =>\n PLATFORM_NOISE.some((pattern) => pattern.test(text)) ||\n ignore.some((fragment) => text.includes(fragment))\n","/**\n * Top-level plannable DML of the application's roles; roles are validated\n * identifiers (ROLE_NAME_PATTERN), so quoting them is enough. pg_stat_statements\n * replaces constants only in plannable statements: utility text (CREATE ROLE\n * ... PASSWORD, SET, function bodies) is stored verbatim, so it never enters\n * the snapshot, and neither does the tool's own EXPLAIN.\n */\nexport const statementStatsSql = (roles: string[]): string =>\n `select r.rolname as role, s.queryid::text as query_id,\n left(regexp_replace(s.query, '\\\\s+', ' ', 'g'), 200) as text,\n s.calls::bigint as calls, s.total_exec_time as total_ms, s.rows::bigint as rows,\n s.shared_blks_read::bigint as shared_blks_read, s.temp_blks_written::bigint as temp_blks_written\n from pg_stat_statements s join pg_roles r on r.oid = s.userid\n where s.toplevel and r.rolname in (${roles.map((role) => `'${role}'`).join(', ')})\n and s.query ~* '^\\\\s*(select|with|insert|update|delete|merge|values|table)\\\\y'\n and s.query !~* '^\\\\s*explain'\n and s.dbid = (select oid from pg_database where datname = current_database())`\n","import type { PerfConfig } from '@/config/PerfConfig.js'\nimport { isPlatformNoise } from '@/perf/isPlatformNoise.js'\nimport type { StatementStat } from '@/perf/StatementStat.js'\nimport { statementStatsSql } from '@/perf/statementStatsSql.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\n\nexport const readStatementStats = (\n session: PsqlSession,\n perf: PerfConfig,\n): StatementStat[] => {\n const rows = session.rows(statementStatsSql(perf.roles)) as Record<\n string,\n unknown\n >[]\n return rows\n .map((row) => ({\n role: String(row['role']),\n queryId: String(row['query_id']),\n text: String(row['text']),\n calls: Number(row['calls']),\n totalMs: Number(row['total_ms']),\n rows: Number(row['rows']),\n sharedBlksRead: Number(row['shared_blks_read']),\n tempBlksWritten: Number(row['temp_blks_written']),\n }))\n .filter((statement) => !isPlatformNoise(statement.text, perf.ignore))\n .sort(\n (a, b) =>\n perf.roles.indexOf(a.role) - perf.roles.indexOf(b.role) ||\n a.queryId.localeCompare(b.queryId),\n )\n}\n","export const STATS_RESET_SQL =\n 'select stats_reset::text as stats_reset from pg_stat_statements_info()'\n","import { STATS_RESET_SQL } from '@/perf/STATS_RESET_SQL.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\n\nexport const readStatsReset = (session: PsqlSession): string | null => {\n const rows = session.rows(STATS_RESET_SQL) as Record<string, unknown>[]\n const value = rows[0]?.['stats_reset']\n return typeof value === 'string' ? value : null\n}\n","export const TABLE_STATS_SQL = `select schemaname || '.' || relname as name, n_live_tup::bigint as live_rows,\n seq_scan::bigint as seq_scan, coalesce(idx_scan, 0)::bigint as idx_scan, pg_total_relation_size(relid)::bigint as bytes\n from pg_stat_user_tables where schemaname = 'public'`\n","import { TABLE_STATS_SQL } from '@/perf/TABLE_STATS_SQL.js'\nimport type { TableStat } from '@/perf/TableStat.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\n\nexport const readTableStats = (session: PsqlSession): TableStat[] => {\n const rows = session.rows(TABLE_STATS_SQL) as Record<string, unknown>[]\n return rows\n .map((row) => ({\n name: String(row['name']),\n liveRows: Number(row['live_rows']),\n seqScan: Number(row['seq_scan']),\n idxScan: Number(row['idx_scan']),\n bytes: Number(row['bytes']),\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n","import type { PerfConfig } from '@/config/PerfConfig.js'\nimport { PACKAGE_VERSION } from '@/packageVersion.js'\nimport type { PerfSnapshot } from '@/perf/PerfSnapshot.js'\nimport { readStatementStats } from '@/perf/readStatementStats.js'\nimport { readStatsReset } from '@/perf/readStatsReset.js'\nimport { readTableStats } from '@/perf/readTableStats.js'\nimport type { PsqlSession } from '@/postgres/PsqlSessionType.js'\n\nexport const takePerfSnapshot = (\n session: PsqlSession,\n perf: PerfConfig,\n host: string,\n takenAt: string,\n): PerfSnapshot => {\n const statements = readStatementStats(session, perf)\n const tables = readTableStats(session)\n const statsReset = readStatsReset(session)\n return {\n schemaVersion: 1,\n toolVersion: PACKAGE_VERSION,\n takenAt,\n host,\n statsReset,\n statements,\n tables,\n }\n}\n","import type { CheckContext } from '@/check/CheckContext.js'\nimport type { Finding } from '@/model/Finding.js'\nimport { diffSnapshots } from '@/perf/diffSnapshots.js'\nimport { QUERY_TIMEOUT_MS } from '@/perf/QUERY_TIMEOUT_MS.js'\nimport { readPerfSnapshot } from '@/perf/readPerfSnapshot.js'\nimport { takePerfSnapshot } from '@/perf/takePerfSnapshot.js'\nimport type { PostgresTarget } from '@/postgres/PostgresTarget.js'\nimport { psqlSession } from '@/postgres/psqlSession.js'\n\n/** The gate's own diff: takes a fresh snapshot and compares it against the recorded one, never writing it. */\nexport const perfDiffFindings = (\n { root, config, runner }: CheckContext,\n target: PostgresTarget,\n): Finding[] => {\n const session = psqlSession(runner, root, target, QUERY_TIMEOUT_MS)\n const current = takePerfSnapshot(\n session,\n config.perf,\n target.host,\n new Date().toISOString(),\n )\n return diffSnapshots(\n readPerfSnapshot(root),\n current,\n config.perf,\n config.disable,\n ).findings\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { env } from 'node:process'\n\nimport { DB_PASSWORD_ENV } from '@/postgres/DB_PASSWORD_ENV.js'\nimport { POOLER_URL_FILE } from '@/postgres/POOLER_URL_FILE.js'\nimport type { PostgresTarget } from '@/postgres/PostgresTarget.js'\nimport type { PostgresTargetFlags } from '@/postgres/PostgresTargetFlags.js'\nimport { targetFromUrl } from '@/postgres/targetFromUrl.js'\n\n/** --db-url first; then the linked pooler url with the password from the environment; undefined when neither applies. */\nexport const resolvePostgresTarget = (\n root: string,\n flags: PostgresTargetFlags,\n): PostgresTarget | undefined => {\n const explicit = flags['db-url']\n if (explicit !== undefined) return targetFromUrl(explicit, '--db-url')\n const poolerPath = join(root, POOLER_URL_FILE)\n const password = env[DB_PASSWORD_ENV]\n if (!existsSync(poolerPath) || password === undefined || password === '')\n return undefined\n return targetFromUrl(\n readFileSync(poolerPath, 'utf8').trim(),\n POOLER_URL_FILE,\n password,\n )\n}\n","/** The variable the Supabase CLI itself reads for a linked project's database password. */\nexport const DB_PASSWORD_ENV = 'SUPABASE_DB_PASSWORD'\n","/** Written by `supabase link`: user and host of the session pooler, never the password. */\nexport const POOLER_URL_FILE = 'supabase/.temp/pooler-url'\n","import { ConfigError } from '@/config/ConfigError.js'\n\n/** `raw` as a URL, or a ConfigError naming where it came from. */\nexport const parsedUrl = (raw: string, source: string): URL => {\n try {\n return new URL(raw)\n } catch {\n throw new ConfigError(`${source} is not a valid url`)\n }\n}\n","import { ConfigError } from '@/config/ConfigError.js'\n\n/**\n * A transaction pooler hands each statement to whichever backend is free, so\n * the read-only SET and the query can land on different connections, and the\n * SET stays behind on a connection the application shares.\n */\nexport const refuseTransactionPooler = (url: URL, source: string): void => {\n if (url.port !== '6543' && url.searchParams.get('pgbouncer') !== 'true')\n return\n throw new ConfigError(\n `${source} points at a transaction pooler (port 6543 or pgbouncer=true), where the read-only setting does not hold; use the session pooler (port 5432) or a direct connection`,\n )\n}\n","import { ConfigError } from '@/config/ConfigError.js'\n\n/**\n * Removes the password from `url`, whether in the user info or in a\n * `?password=` parameter, and returns it decoded; undefined when there is none.\n */\nexport const takeUrlPassword = (\n url: URL,\n source: string,\n): string | undefined => {\n const query = url.searchParams.get('password') ?? undefined\n url.searchParams.delete('password')\n const encoded = url.password\n url.password = ''\n if (!encoded) return query\n try {\n return decodeURIComponent(encoded)\n } catch {\n throw new ConfigError(`${source} password is not valid percent-encoding`)\n }\n}\n","import type { PostgresTarget } from '@/postgres/PostgresTarget.js'\nimport { parsedUrl } from '@/postgres/parsedUrl.js'\nimport { refuseTransactionPooler } from '@/postgres/refuseTransactionPooler.js'\nimport { takeUrlPassword } from '@/postgres/takeUrlPassword.js'\n\n/** A connection url as a target whose url no longer carries the password: psql gets it through PGPASSWORD, never on its argument vector. */\nexport const targetFromUrl = (\n raw: string,\n source: string,\n fallbackPassword?: string,\n): PostgresTarget => {\n const url = parsedUrl(raw, source)\n refuseTransactionPooler(url, source)\n const password = takeUrlPassword(url, source) ?? fallbackPassword\n return {\n url: url.toString(),\n host: url.hostname,\n ...(password === undefined ? {} : { password }),\n }\n}\n","import type { StageResult } from '@/gate/StageResult.js'\n\nexport const renderGateReport = (results: StageResult[]): string =>\n results\n .flatMap((result) => [\n `${result.status.padStart(22)} ${result.name.padEnd(14)}${result.durationSeconds.toFixed(2).padStart(8)}s`,\n ...(result.status === 'passed' || !result.detail\n ? []\n : result.detail.split('\\n').map((line) => ` ${line}`)),\n ])\n .join('\\n')\n","import { performance } from 'node:perf_hooks'\n\nimport { renderFindings } from '@/check/renderFindings.js'\nimport type { Stage } from '@/gate/Stage.js'\nimport type { StageResult } from '@/gate/StageResult.js'\nimport type { StageStatus } from '@/gate/StageStatus.js'\n\nexport const runStage = (stage: Stage): StageResult => {\n const started = performance.now()\n const done = (status: StageStatus, detail: string): StageResult => ({\n name: stage.name,\n status,\n durationSeconds: (performance.now() - started) / 1000,\n detail,\n })\n try {\n const outcome = stage.run()\n if (outcome === 'not-applicable') return done('skipped-not-applicable', '')\n if (!Array.isArray(outcome))\n return done('skipped-not-applicable', outcome.skipped)\n return outcome.length === 0\n ? done('passed', '')\n : done('findings', renderFindings(outcome))\n } catch (error) {\n return done(\n 'failed-to-run',\n error instanceof Error ? error.message : String(error),\n )\n }\n}\n","import { runStage } from '@/gate/runStage.js'\nimport type { Stage } from '@/gate/Stage.js'\nimport type { StageResult } from '@/gate/StageResult.js'\n\n// Every stage runs: stopping at the first failure means the same tool is\n// fixed over and over and the rest of the picture never appears.\nexport const runGate = (stages: Stage[]): StageResult[] => stages.map(runStage)\n","import type { CommandIo } from '@/commands/CommandIo.js'\nimport { parseCommandArgs } from '@/commands/parseCommandArgs.js'\nimport { reportCommandError } from '@/commands/reportCommandError.js'\nimport { legacyConfigNotice } from '@/config/legacyConfigNotice.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { gateExitCode } from '@/gate/gateExitCode.js'\nimport { gateStages } from '@/gate/gateStages.js'\nimport { renderGateReport } from '@/gate/renderGateReport.js'\nimport { runGate } from '@/gate/runGate.js'\n\nexport const gateCommand = (argv: string[], io: CommandIo): number => {\n try {\n const { values } = parseCommandArgs(argv, { json: { type: 'boolean' } })\n const config = readConfig(io.root)\n const notice = legacyConfigNotice(config)\n if (notice) io.stderr(`${notice}\\n`)\n const results = runGate(\n gateStages({\n root: io.root,\n config,\n runner: io.runner,\n }),\n )\n const report =\n values['json'] === true\n ? JSON.stringify({ schemaVersion: 1, stages: results }, null, 2)\n : renderGateReport(results)\n io.stdout(`${report}\\n`)\n return gateExitCode(results)\n } catch (error) {\n return reportCommandError(error, io.stderr)\n }\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BENCH_RECORD_FILENAME } from '@/bench/BENCH_RECORD_FILENAME.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport type { AdoptionPhaseNumber } from '@/init/AdoptionPhaseNumber.js'\nimport { PERF_SNAPSHOT_FILENAME } from '@/perf/PERF_SNAPSHOT_FILENAME.js'\n\n/** Where a project stands on the phased adoption ladder, from its config and its recorded files. */\nexport const adoptionPhase = (\n root: string,\n config: DbQualityConfig,\n): AdoptionPhaseNumber => {\n if (config.schemaVersion !== 2) return 0\n const hasSnapshot = existsSync(join(root, PERF_SNAPSHOT_FILENAME))\n const hasBench = existsSync(join(root, BENCH_RECORD_FILENAME))\n if (config.perf.inGate && (hasSnapshot || hasBench)) return 4\n if (hasBench) return 3\n if (hasSnapshot) return 2\n return 1\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BASELINE_FILENAME } from '@/baseline/BASELINE_FILENAME.js'\nimport { classifyFindings } from '@/baseline/classifyFindings.js'\nimport { readBaseline } from '@/baseline/readBaseline.js'\nimport type { CheckContext } from '@/check/CheckContext.js'\nimport { runCheck } from '@/check/runCheck.js'\nimport type { BaselineStep } from '@/init/BaselineStepType.js'\n\n/** Runs `check` and says whether the baseline covers every finding it reports. */\nexport const baselineStep = (context: CheckContext): BaselineStep => {\n const findings = runCheck(context)\n if (findings.length === 0) return 'covered'\n if (!existsSync(join(context.root, BASELINE_FILENAME))) return 'create'\n const classified = classifyFindings(findings, readBaseline(context.root))\n return classified.new.length > 0 ? 'update' : 'covered'\n}\n","import type { CheckContext } from '@/check/CheckContext.js'\nimport { adoptionPhase } from '@/init/adoptionPhase.js'\nimport type { AdoptionStanding } from '@/init/AdoptionStandingType.js'\nimport { baselineStep } from '@/init/baselineStep.js'\nimport type { BaselineStep } from '@/init/BaselineStepType.js'\n\n/**\n * The phase from the recorded files, held at 1 while `check` reports findings\n * the baseline does not cover: committing the init output alone must never\n * turn CI red. A check that cannot run holds phase 1 too, naming why, and\n * never changes init's own exit code.\n */\nexport const adoptionStanding = (context: CheckContext): AdoptionStanding => {\n const phase = adoptionPhase(context.root, context.config)\n if (phase === 0) return { phase }\n let step: BaselineStep\n try {\n step = baselineStep(context)\n } catch (error) {\n return { phase: 1, next: `make check run: ${(error as Error).message}` }\n }\n return step === 'covered'\n ? { phase }\n : { phase: 1, next: `codeality-db baseline ${step}` }\n}\n","import { mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\n\nimport type { ManagedFile } from '@/init/ManagedFile.js'\n\nexport const applyInit = (root: string, plan: ManagedFile[]): void => {\n for (const file of plan) {\n const writes = file.disposition === 'create' || file.disposition === 'merge'\n if (!writes || file.content === undefined) continue\n mkdirSync(dirname(join(root, file.path)), { recursive: true })\n writeFileSync(join(root, file.path), file.content)\n }\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { PERF_DEFAULTS } from '@/config/PERF_DEFAULTS.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { BENCH_README } from '@/init/BENCH_README.js'\nimport type { ManagedFile } from '@/init/ManagedFile.js'\n\n/** Plans the bench directory's README, under whatever `perf.benchDir` the project already has. */\nexport const planBenchReadme = (root: string): ManagedFile => {\n const benchDir = (() => {\n try {\n return readConfig(root).perf.benchDir\n } catch {\n return PERF_DEFAULTS.benchDir\n }\n })()\n const relative = `${benchDir}/README.md`\n if (existsSync(join(root, relative))) {\n return { path: relative, disposition: 'unchanged', detail: 'present' }\n }\n return {\n path: relative,\n disposition: 'create',\n detail: 'explains the bench convention',\n content: BENCH_README,\n }\n}\n","import { BENCH_RECORD_FILENAME } from '@/bench/BENCH_RECORD_FILENAME.js'\n\n/** Explains the bench directory convention to whoever finds it next. */\nexport const BENCH_README = `# Bench queries\n\nEach \\`.sql\\` file in this directory holds one statement to benchmark. Write\nliteral values inline; the session that runs them has no way to bind\nparameters.\n\nAn optional first line \\`-- runs: N\\` overrides how many times the statement\nruns before the median is recorded, in place of \\`perf.benchRuns\\` in\ncodeality-db.json.\n\nA file holding more than one statement is refused. The statement runs\ninside a read-only transaction it cannot leave, and whatever it did is\nrolled back, so a statement that writes is refused or undone instead of\ntouching the database.\n\nRun \\`codeality-db perf bench --record\\` once to write the reference numbers\nto ${BENCH_RECORD_FILENAME}. Run \\`codeality-db perf bench\\` afterwards to\ncompare a new run against that reference.\n`\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { CONFIG_FILENAME } from '@/config/CONFIG_FILENAME.js'\nimport { configFromDocument } from '@/config/configFromDocument.js'\nimport { detectStacks } from '@/config/detectStacks.js'\nimport type { ManagedFile } from '@/init/ManagedFile.js'\nimport { PERF_INIT_SECTION } from '@/init/PERF_INIT_SECTION.js'\nimport { upgradedConfigDocument } from '@/init/upgradedConfigDocument.js'\n\nexport const planConfigFile = (root: string, force: boolean): ManagedFile => {\n const path = join(root, CONFIG_FILENAME)\n const freshContent = `${JSON.stringify(\n { schemaVersion: 2, ...detectStacks(root), perf: PERF_INIT_SECTION },\n null,\n 2,\n )}\\n`\n if (!existsSync(path)) {\n return {\n path: CONFIG_FILENAME,\n disposition: 'create',\n detail: 'from the detected stacks',\n content: freshContent,\n }\n }\n try {\n const raw = JSON.parse(readFileSync(path, 'utf8')) as Record<\n string,\n unknown\n >\n const config = configFromDocument(raw)\n if (config.schemaVersion === 1) {\n return {\n path: CONFIG_FILENAME,\n disposition: 'merge',\n detail: 'upgraded to schemaVersion 2',\n content: `${JSON.stringify(\n upgradedConfigDocument(raw, detectStacks(root)),\n null,\n 2,\n )}\\n`,\n }\n }\n return { path: CONFIG_FILENAME, disposition: 'unchanged', detail: 'valid' }\n } catch (error) {\n return force\n ? {\n path: CONFIG_FILENAME,\n disposition: 'merge',\n detail: 'replaced (--force)',\n content: freshContent,\n }\n : {\n path: CONFIG_FILENAME,\n disposition: 'conflict',\n detail: (error as Error).message,\n }\n }\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { findSqliteFiles } from '@/config/findSqliteFiles.js'\nimport { hasPostgrestSources } from '@/config/hasPostgrestSources.js'\nimport { hasSupabaseJsDependency } from '@/config/hasSupabaseJsDependency.js'\nimport { isDirectory } from '@/config/isDirectory.js'\nimport type { StackSections } from '@/config/StackSections.js'\n\nexport const detectStacks = (root: string): StackSections => {\n const sqliteFiles = findSqliteFiles(root)\n const hasDrizzle = ['ts', 'js', 'mjs'].some((ext) =>\n existsSync(join(root, `drizzle.config.${ext}`)),\n )\n const drizzleRoots = ['src', 'server', 'app', 'lib', 'db'].filter((name) =>\n isDirectory(join(root, name)),\n )\n const postgrestRoots = ['src', 'app', 'supabase/functions'].filter(\n (name) => isDirectory(join(root, name)) && hasPostgrestSources(root, name),\n )\n return {\n ...(isDirectory(join(root, 'supabase/migrations'))\n ? { supabase: { migrations: 'supabase/migrations' } }\n : {}),\n ...(existsSync(join(root, 'prisma/schema.prisma'))\n ? { prisma: { schema: 'prisma/schema.prisma' } }\n : {}),\n ...(hasDrizzle\n ? { drizzle: { roots: drizzleRoots, objectNames: ['db', 'tx'] } }\n : {}),\n ...(sqliteFiles.length > 0 ? { sqlite: { files: sqliteFiles } } : {}),\n ...(hasSupabaseJsDependency(root) && postgrestRoots.length > 0\n ? { postgrest: { roots: postgrestRoots } }\n : {}),\n }\n}\n","import { readdirSync } from 'node:fs'\nimport { join, relative } from 'node:path'\n\n/** SQLite files at depth <= 2 under the root, as sorted root-relative paths. */\nexport const findSqliteFiles = (root: string): string[] => {\n // Hidden directories hold tool state, never the project's data: a pnpm\n // store keeps an index.db, and .git, .codegraph and friends keep their own.\n const skipped = new Set(['node_modules', 'dist', 'coverage'])\n const found: string[] = []\n const walk = (directory: string, depth: number): void => {\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n if (skipped.has(entry.name) || entry.name.startsWith('.')) continue\n const path = join(directory, entry.name)\n if (entry.isDirectory() && depth < 2) walk(path, depth + 1)\n else if (entry.isFile() && /\\.(?:db|sqlite|sqlite3)$/.test(entry.name)) {\n found.push(relative(root, path).replaceAll('\\\\', '/'))\n }\n }\n }\n walk(root, 0)\n return found.sort()\n}\n","import { sourceFilesUnder } from '@/postgrest/sourceFilesUnder.js'\n\n/** True when root/name holds at least one TypeScript source sourceFilesUnder would scan. */\nexport const hasPostgrestSources = (root: string, name: string): boolean =>\n sourceFilesUnder(root, [name]).length > 0\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { PackageManifest } from '@/config/PackageManifest.js'\n\nexport const hasSupabaseJsDependency = (root: string): boolean => {\n const manifestPath = join(root, 'package.json')\n if (!existsSync(manifestPath)) return false\n const manifest = JSON.parse(\n readFileSync(manifestPath, 'utf8'),\n ) as PackageManifest\n const dependencies = { ...manifest.dependencies, ...manifest.devDependencies }\n return '@supabase/supabase-js' in dependencies\n}\n","import { PERF_DEFAULTS } from '@/config/PERF_DEFAULTS.js'\nimport type { PerfConfig } from '@/config/PerfConfig.js'\n\n/** The perf section `init` writes: the usual defaults, but out of the gate until adopted. */\nexport const PERF_INIT_SECTION: PerfConfig = { ...PERF_DEFAULTS, inGate: false }\n","import { LEGACY_DISABLE_REASON } from '@/config/LEGACY_DISABLE_REASON.js'\nimport type { StackSections } from '@/config/StackSections.js'\nimport { PERF_INIT_SECTION } from '@/init/PERF_INIT_SECTION.js'\n\n/** Upgrades a valid schemaVersion 1 document to 2, keeping every section already present. */\nexport const upgradedConfigDocument = (\n raw: Record<string, unknown>,\n detected: StackSections,\n): Record<string, unknown> => {\n const disable = raw['disable']\n return {\n ...raw,\n schemaVersion: 2,\n ...(Array.isArray(disable)\n ? {\n disable: disable.map((entry: unknown) =>\n typeof entry === 'string'\n ? { code: entry, reason: LEGACY_DISABLE_REASON }\n : entry,\n ),\n }\n : {}),\n ...(raw['postgrest'] === undefined && detected.postgrest !== undefined\n ? { postgrest: detected.postgrest }\n : {}),\n ...(raw['perf'] === undefined ? { perf: PERF_INIT_SECTION } : {}),\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { ManagedFile } from '@/init/ManagedFile.js'\nimport { PACKAGE_MANIFEST } from '@/init/PACKAGE_MANIFEST.js'\n\nexport const planPackageScript = (\n root: string,\n force: boolean,\n): ManagedFile => {\n const path = join(root, PACKAGE_MANIFEST)\n if (!existsSync(path)) {\n return {\n path: PACKAGE_MANIFEST,\n disposition: 'unchanged',\n detail: 'no package.json',\n }\n }\n const manifest = JSON.parse(readFileSync(path, 'utf8')) as {\n scripts?: Record<string, string>\n }\n const current = manifest.scripts?.['db:gate']\n if (current === 'codeality-db gate') {\n return {\n path: PACKAGE_MANIFEST,\n disposition: 'unchanged',\n detail: 'db:gate present',\n }\n }\n if (current !== undefined && !force) {\n return {\n path: PACKAGE_MANIFEST,\n disposition: 'conflict',\n detail: `db:gate is \"${current}\"`,\n }\n }\n const scripts = { ...manifest.scripts, 'db:gate': 'codeality-db gate' }\n const content = `${JSON.stringify({ ...manifest, scripts }, null, 2)}\\n`\n return {\n path: PACKAGE_MANIFEST,\n disposition: 'merge',\n detail: 'add scripts.db:gate',\n content,\n }\n}\n","export const PACKAGE_MANIFEST = 'package.json'\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { assetPath } from '@/assetPath.js'\nimport type { ManagedFile } from '@/init/ManagedFile.js'\nimport { sha256Of } from '@/init/sha256Of.js'\nimport { SHIPPED_WORKFLOW_HASHES } from '@/init/SHIPPED_WORKFLOW_HASHES.js'\n\nexport const planWorkflow = (root: string, force: boolean): ManagedFile => {\n const relative = '.github/workflows/db-quality.yml'\n const content = readFileSync(assetPath('db-quality.yml'), 'utf8')\n const path = join(root, relative)\n if (!existsSync(path)) {\n const detail = 'runs codeality-db gate on push and pull request'\n return { path: relative, disposition: 'create', detail, content }\n }\n const existing = readFileSync(path, 'utf8')\n if (existing === content) {\n return { path: relative, disposition: 'unchanged', detail: 'identical' }\n }\n const shippedVersion = SHIPPED_WORKFLOW_HASHES[sha256Of(existing)]\n if (shippedVersion !== undefined) {\n return {\n path: relative,\n disposition: 'merge',\n detail: `upgraded from the ${shippedVersion} workflow`,\n content,\n }\n }\n return force\n ? {\n path: relative,\n disposition: 'merge',\n detail: 'replaced (--force)',\n content,\n }\n : {\n path: relative,\n disposition: 'conflict',\n detail: 'differs from the shipped workflow',\n }\n}\n","import { createHash } from 'node:crypto'\n\n/** The hex SHA-256 digest of a string's exact bytes. */\nexport const sha256Of = (content: string): string =>\n createHash('sha256').update(content).digest('hex')\n","/** SHA-256 of every workflow asset ever shipped, by the version it shipped with. */\nexport const SHIPPED_WORKFLOW_HASHES: Record<string, string> = {\n '4845c1f1cd3c179701d4a143cb34400c8a6225b73e6e86418408e8f3ae1581c0': '0.1.0',\n}\n","import type { ManagedFile } from '@/init/ManagedFile.js'\nimport { planBenchReadme } from '@/init/planBenchReadme.js'\nimport { planConfigFile } from '@/init/planConfigFile.js'\nimport { planPackageScript } from '@/init/planPackageScript.js'\nimport { planWorkflow } from '@/init/planWorkflow.js'\n\nexport const planInit = (root: string, force: boolean): ManagedFile[] => [\n planConfigFile(root, force),\n planPackageScript(root, force),\n planWorkflow(root, force),\n planBenchReadme(root),\n]\n","import type { AdoptionRung } from '@/init/AdoptionRung.js'\n\n/** The phased adoption ladder: what each phase means and the command that reaches the next one. */\nexport const ADOPTION_LADDER: AdoptionRung[] = [\n { phase: 0, does: 'no configuration', next: 'codeality-db init --apply' },\n {\n phase: 1,\n does: 'strict check and PostgREST rules, baseline covers what exists',\n next: 'codeality-db perf snapshot',\n },\n {\n phase: 2,\n does: 'perf snapshot recorded',\n next: 'codeality-db perf bench --record',\n },\n {\n phase: 3,\n does: 'bench reference recorded',\n next: 'set perf.inGate to true in codeality-db.json',\n },\n {\n phase: 4,\n does: 'the gate measures performance',\n next: 'nothing: the gate measures',\n },\n]\n","import { ADOPTION_LADDER } from '@/init/ADOPTION_LADDER.js'\nimport type { AdoptionStanding } from '@/init/AdoptionStandingType.js'\n\n/** Renders the ladder with the current phase marked and the next step named. */\nexport const renderAdoptionPhase = ({\n phase,\n next,\n}: AdoptionStanding): string => {\n const rungs = ADOPTION_LADDER.map(\n (rung) =>\n `${rung.phase === phase ? '*' : ' '} ${String(rung.phase)} ${rung.does}`,\n )\n const current = ADOPTION_LADDER.find((rung) => rung.phase === phase)\n return [\n `adoption phase ${String(phase)} of 4`,\n ...rungs,\n `next: ${next ?? current?.next ?? ''}`,\n ].join('\\n')\n}\n","import type { ManagedFile } from '@/init/ManagedFile.js'\n\nexport const renderInitPlan = (plan: ManagedFile[]): string =>\n plan\n .map(\n (file) => `${file.disposition.padEnd(9)} ${file.path} ${file.detail}`,\n )\n .join('\\n')\n","import type { CommandIo } from '@/commands/CommandIo.js'\nimport { parseCommandArgs } from '@/commands/parseCommandArgs.js'\nimport { reportCommandError } from '@/commands/reportCommandError.js'\nimport { ConfigError } from '@/config/ConfigError.js'\nimport type { DbQualityConfig } from '@/config/DbQualityConfig.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { adoptionStanding } from '@/init/adoptionStanding.js'\nimport { applyInit } from '@/init/applyInit.js'\nimport { planInit } from '@/init/planInit.js'\nimport { renderAdoptionPhase } from '@/init/renderAdoptionPhase.js'\nimport { renderInitPlan } from '@/init/renderInitPlan.js'\nimport { ExitCode } from '@/model/ExitCode.js'\n\nexport const initCommand = (argv: string[], io: CommandIo): number => {\n try {\n const { values } = parseCommandArgs(argv, {\n check: { type: 'boolean' },\n apply: { type: 'boolean' },\n force: { type: 'boolean' },\n })\n const force = values['force'] === true\n const plan = planInit(io.root, force)\n io.stdout(`${renderInitPlan(plan)}\\n`)\n let exitCode: number = ExitCode.OK\n if (values['check'] === true) {\n exitCode = plan.every((file) => file.disposition === 'unchanged')\n ? ExitCode.OK\n : ExitCode.FINDINGS\n } else if (values['apply'] === true || force) {\n if (plan.some((file) => file.disposition === 'conflict')) {\n throw new ConfigError('conflicts remain; resolve them or pass --force')\n }\n applyInit(io.root, plan)\n }\n const config = ((): DbQualityConfig | undefined => {\n try {\n return readConfig(io.root)\n } catch {\n return undefined\n }\n })()\n const standing = config\n ? adoptionStanding({ root: io.root, config, runner: io.runner })\n : { phase: 0 as const }\n io.stdout(`${renderAdoptionPhase(standing)}\\n`)\n return exitCode\n } catch (error) {\n return reportCommandError(error, io.stderr)\n }\n}\n","import type { BenchRecord } from '@/bench/BenchRecord.js'\nimport type { BenchResult } from '@/bench/BenchResult.js'\nimport { renderFindings } from '@/check/renderFindings.js'\n\nexport const renderBench = (\n result: BenchResult,\n recorded: BenchRecord | undefined,\n): string => {\n const entries = Object.entries(result.entries)\n const width = Math.max(0, ...entries.map(([file]) => file.length)) + 2\n const runs = new Set(entries.map(([, entry]) => entry.runs))\n const perFile = runs.size > 1\n const lines = entries.map(([file, entry]) => {\n const recordedEntry = recorded?.entries[file]\n const record = recordedEntry\n ? `(record ${recordedEntry.medianMs.toFixed(2)} ms)`\n : '(no record)'\n const count = perFile ? ` ${String(entry.runs)} runs` : ''\n return ` ${file.padEnd(width)}${entry.medianMs.toFixed(2)} ms ${record}${count}`\n })\n const improvementLines =\n result.improvements.length === 0\n ? []\n : [\n 'improvements',\n ...result.improvements.map((improvement) => {\n const percent = Math.round(\n (improvement.currentMs / improvement.previousMs - 1) * 100,\n )\n return ` ${String(percent)}% ${improvement.previousMs.toFixed(2)} ms -> ${improvement.currentMs.toFixed(2)} ms ${improvement.subject}`\n }),\n ]\n return [\n perFile\n ? 'bench (runs per file)'\n : `bench (${String([...runs][0] ?? 0)} runs each)`,\n ...lines,\n ...improvementLines,\n renderFindings(result.findings),\n ].join('\\n')\n}\n","import type { BenchRecord } from '@/bench/BenchRecord.js'\nimport type { BenchResult } from '@/bench/BenchResult.js'\n\nexport const renderBenchJson = (\n result: BenchResult,\n recorded: BenchRecord | undefined,\n): string =>\n JSON.stringify(\n {\n schemaVersion: 1,\n entries: result.entries,\n recorded: recorded?.entries ?? null,\n improvements: result.improvements,\n findings: result.findings,\n },\n null,\n 2,\n )\n","import { renameSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { BENCH_RECORD_FILENAME } from '@/bench/BENCH_RECORD_FILENAME.js'\nimport type { BenchRecord } from '@/bench/BenchRecord.js'\n\n/** Writes the record atomically: a temporary file, then a rename over the target. */\nexport const writeBenchRecord = (root: string, record: BenchRecord): void => {\n const path = join(root, BENCH_RECORD_FILENAME)\n writeFileSync(`${path}.tmp`, `${JSON.stringify(record, null, 2)}\\n`)\n renameSync(`${path}.tmp`, path)\n}\n","import { BENCH_RECORD_FILENAME } from '@/bench/BENCH_RECORD_FILENAME.js'\nimport { readBenchRecord } from '@/bench/readBenchRecord.js'\nimport { renderBench } from '@/bench/renderBench.js'\nimport { renderBenchJson } from '@/bench/renderBenchJson.js'\nimport { runBench } from '@/bench/runBench.js'\nimport { writeBenchRecord } from '@/bench/writeBenchRecord.js'\nimport type { PerfActionIo } from '@/commands/PerfActionIo.js'\nimport { ExitCode } from '@/model/ExitCode.js'\nimport { PACKAGE_VERSION } from '@/packageVersion.js'\n\nexport const perfBenchAction = ({\n io,\n config,\n target,\n session,\n json,\n record,\n}: PerfActionIo): number => {\n const recorded = record ? undefined : readBenchRecord(io.root)\n const result = runBench(session, io.root, recorded, {\n perf: config.perf,\n disabled: config.disable,\n })\n if (record) {\n writeBenchRecord(io.root, {\n schemaVersion: 1,\n toolVersion: PACKAGE_VERSION,\n takenAt: new Date().toISOString(),\n host: target.host,\n entries: result.entries,\n })\n io.stdout(\n `recorded ${String(Object.keys(result.entries).length)} bench queries in ${BENCH_RECORD_FILENAME}\\n`,\n )\n return ExitCode.OK\n }\n io.stdout(\n `${json ? renderBenchJson(result, recorded) : renderBench(result, recorded)}\\n`,\n )\n return result.findings.length > 0 ? ExitCode.FINDINGS : ExitCode.OK\n}\n","import type { Improvement } from '@/perf/Improvement.js'\n\nexport const renderImprovements = (improvements: Improvement[]): string[] =>\n improvements.length === 0\n ? []\n : [\n 'improvements',\n ...improvements.map((improvement) => {\n const percent = Math.round(\n (improvement.currentMs / improvement.previousMs - 1) * 100,\n )\n return ` ${String(percent)}% ${improvement.previousMs.toFixed(2)} ms -> ${improvement.currentMs.toFixed(2)} ms x${improvement.calls.toLocaleString('en-US')} ${improvement.subject}`\n }),\n ]\n","import type { PerfDiff } from '@/perf/PerfDiff.js'\nimport { renderImprovements } from '@/perf/renderImprovements.js'\n\nexport const renderPerfDiff = (diff: PerfDiff): string =>\n [\n `perf diff: ${diff.from} -> ${diff.to}`,\n ...renderImprovements(diff.improvements),\n ...(diff.improvements.length > 0 || diff.lostMs > 0\n ? [\n `saved ${diff.savedMs.toLocaleString('en-US')} ms against the previous means; regressions cost ${diff.lostMs.toLocaleString('en-US')} ms`,\n ]\n : []),\n ...diff.findings.map(\n (finding) =>\n `${finding.path}:${String(finding.line)}: ${finding.code} ${finding.message} (${finding.subject})`,\n ),\n `${diff.findings.length.toLocaleString('en-US')} findings`,\n ].join('\\n')\n","import type { PerfDiff } from '@/perf/PerfDiff.js'\n\nexport const renderPerfDiffJson = (diff: PerfDiff): string =>\n JSON.stringify(\n {\n schemaVersion: 1,\n from: diff.from,\n to: diff.to,\n savedMs: diff.savedMs,\n lostMs: diff.lostMs,\n improvements: diff.improvements,\n findings: diff.findings,\n },\n null,\n 2,\n )\n","import type { PerfActionIo } from '@/commands/PerfActionIo.js'\nimport { ExitCode } from '@/model/ExitCode.js'\nimport { diffSnapshots } from '@/perf/diffSnapshots.js'\nimport { readPerfSnapshot } from '@/perf/readPerfSnapshot.js'\nimport { renderPerfDiff } from '@/perf/renderPerfDiff.js'\nimport { renderPerfDiffJson } from '@/perf/renderPerfDiffJson.js'\nimport { takePerfSnapshot } from '@/perf/takePerfSnapshot.js'\n\nexport const perfDiffAction = ({\n io,\n config,\n target,\n session,\n json,\n}: PerfActionIo): number => {\n const previous = readPerfSnapshot(io.root)\n const current = takePerfSnapshot(\n session,\n config.perf,\n target.host,\n new Date().toISOString(),\n )\n const diff = diffSnapshots(previous, current, config.perf, config.disable)\n io.stdout(`${json ? renderPerfDiffJson(diff) : renderPerfDiff(diff)}\\n`)\n return diff.findings.length > 0 ? ExitCode.FINDINGS : ExitCode.OK\n}\n","import { renameSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { PERF_SNAPSHOT_FILENAME } from '@/perf/PERF_SNAPSHOT_FILENAME.js'\nimport type { PerfSnapshot } from '@/perf/PerfSnapshot.js'\n\n/** Writes the snapshot atomically: a temporary file, then a rename over the target. */\nexport const writePerfSnapshot = (\n root: string,\n snapshot: PerfSnapshot,\n): void => {\n const path = join(root, PERF_SNAPSHOT_FILENAME)\n writeFileSync(`${path}.tmp`, `${JSON.stringify(snapshot, null, 2)}\\n`)\n renameSync(`${path}.tmp`, path)\n}\n","import type { PerfActionIo } from '@/commands/PerfActionIo.js'\nimport { ExitCode } from '@/model/ExitCode.js'\nimport { PERF_SNAPSHOT_FILENAME } from '@/perf/PERF_SNAPSHOT_FILENAME.js'\nimport { takePerfSnapshot } from '@/perf/takePerfSnapshot.js'\nimport { writePerfSnapshot } from '@/perf/writePerfSnapshot.js'\n\nexport const perfSnapshotAction = ({\n io,\n config,\n target,\n session,\n}: PerfActionIo): number => {\n const snapshot = takePerfSnapshot(\n session,\n config.perf,\n target.host,\n new Date().toISOString(),\n )\n writePerfSnapshot(io.root, snapshot)\n io.stdout(\n `recorded ${String(snapshot.statements.length)} statements and ${String(snapshot.tables.length)} tables from ${target.host} in ${PERF_SNAPSHOT_FILENAME}\\n`,\n )\n return ExitCode.OK\n}\n","export const PERF_USAGE =\n 'usage: codeality-db perf snapshot|diff|bench [--db-url <url>] [--json] [--record]'\n","import { ConfigError } from '@/config/ConfigError.js'\nimport { PERF_USAGE } from '@/perf/PERF_USAGE.js'\nimport type { PerfAction } from '@/perf/PerfAction.js'\n\nexport const perfActionFrom = (positionals: string[]): PerfAction => {\n const action = positionals[0]\n if (action === 'snapshot' || action === 'diff' || action === 'bench')\n return action\n throw new ConfigError(PERF_USAGE)\n}\n","import { ConfigError } from '@/config/ConfigError.js'\nimport { DB_PASSWORD_ENV } from '@/postgres/DB_PASSWORD_ENV.js'\nimport type { PostgresTarget } from '@/postgres/PostgresTarget.js'\nimport type { PostgresTargetFlags } from '@/postgres/PostgresTargetFlags.js'\nimport { resolvePostgresTarget } from '@/postgres/resolvePostgresTarget.js'\n\n/** Resolves the live target or fails with a configuration error naming both ways to supply one. */\nexport const requirePostgresTarget = (\n root: string,\n flags: PostgresTargetFlags,\n): PostgresTarget => {\n const target = resolvePostgresTarget(root, flags)\n if (target) return target\n throw new ConfigError(\n `perf needs --db-url, or a linked project with ${DB_PASSWORD_ENV} set (the same variable the Supabase CLI reads)`,\n )\n}\n","import type { CommandIo } from '@/commands/CommandIo.js'\nimport { parseCommandArgs } from '@/commands/parseCommandArgs.js'\nimport { perfBenchAction } from '@/commands/perfBenchAction.js'\nimport { perfDiffAction } from '@/commands/perfDiffAction.js'\nimport { perfSnapshotAction } from '@/commands/perfSnapshotAction.js'\nimport { reportCommandError } from '@/commands/reportCommandError.js'\nimport { legacyConfigNotice } from '@/config/legacyConfigNotice.js'\nimport { readConfig } from '@/config/readConfig.js'\nimport { perfActionFrom } from '@/perf/perfActionFrom.js'\nimport { QUERY_TIMEOUT_MS } from '@/perf/QUERY_TIMEOUT_MS.js'\nimport { psqlSession } from '@/postgres/psqlSession.js'\nimport { requirePostgresTarget } from '@/postgres/requirePostgresTarget.js'\n\nexport const perfCommand = (argv: string[], io: CommandIo): number => {\n try {\n const { values, positionals } = parseCommandArgs(argv, {\n json: { type: 'boolean' },\n record: { type: 'boolean' },\n 'db-url': { type: 'string' },\n })\n const action = perfActionFrom(positionals)\n const config = readConfig(io.root)\n const notice = legacyConfigNotice(config)\n if (notice) io.stderr(`${notice}\\n`)\n const target = requirePostgresTarget(io.root, {\n 'db-url': values['db-url'] as string | undefined,\n })\n const timeout =\n action === 'bench' ? config.perf.benchTimeoutMs : QUERY_TIMEOUT_MS\n const session = psqlSession(io.runner, io.root, target, timeout)\n const actionIo = {\n io,\n config,\n target,\n session,\n json: values['json'] === true,\n record: values['record'] === true,\n }\n if (action === 'snapshot') return perfSnapshotAction(actionIo)\n if (action === 'diff') return perfDiffAction(actionIo)\n return perfBenchAction(actionIo)\n } catch (error) {\n return reportCommandError(error, io.stderr)\n }\n}\n","import { auditCommand } from '@/commands/auditCommand.js'\nimport { baselineCommand } from '@/commands/baselineCommand.js'\nimport { checkCommand } from '@/commands/checkCommand.js'\nimport type { CommandIo } from '@/commands/CommandIo.js'\nimport { gateCommand } from '@/commands/gateCommand.js'\nimport { initCommand } from '@/commands/initCommand.js'\nimport { perfCommand } from '@/commands/perfCommand.js'\n\nexport const COMMANDS: Record<\n string,\n (argv: string[], io: CommandIo) => number\n> = {\n init: initCommand,\n check: checkCommand,\n audit: auditCommand,\n gate: gateCommand,\n baseline: baselineCommand,\n perf: perfCommand,\n}\n","export const USAGE = `usage: codeality-db [--project <dir>] <command> [options]\n\n init [--check|--apply|--force] detect stacks, write codeality-db.json, the db:gate script and the CI workflow\n check [--json] static findings from the repository alone\n audit --linked|--db-url <url> [--json] findings from the live database\n gate [--json] check (or baseline check) and the linked audit, one exit code\n baseline create|update|check [--check-stale] record, refresh or enforce the debt the project carries\n perf snapshot|diff|bench [--db-url <url>] [--json] [--record] record, compare and benchmark the live database\n\nexit codes: 0 passed, 1 findings, 2 invalid usage or configuration, 3 required tool missing or unusable\n`\n","import { COMMANDS } from '@/cli/COMMANDS.js'\nimport { USAGE } from '@/cli/USAGE.js'\nimport type { CommandIo } from '@/commands/CommandIo.js'\nimport { ExitCode } from '@/model/ExitCode.js'\nimport { PACKAGE_VERSION } from '@/packageVersion.js'\n\n/** Dispatches the argument vector (without the node and script entries) and returns the exit code. */\nexport const runCli = (argv: string[], io: CommandIo): number => {\n const args = [...argv]\n if (args.includes('--version')) {\n io.stdout(`codeality-db ${PACKAGE_VERSION}\\n`)\n return ExitCode.OK\n }\n if (args.includes('--help') || args.includes('-h')) {\n io.stdout(USAGE)\n return ExitCode.OK\n }\n let root = io.root\n if (args[0] === '--project') {\n root = args[1] ?? ''\n args.splice(0, 2)\n }\n const [command, ...rest] = args\n const handler = command === undefined ? undefined : COMMANDS[command]\n if (!handler) {\n io.stderr(USAGE)\n return ExitCode.CONFIGURATION\n }\n return handler(rest, { ...io, root })\n}\n","import { spawnSync } from 'node:child_process'\nimport { delimiter, join } from 'node:path'\nimport { env as processEnv } from 'node:process'\n\nimport type { CommandRunner } from '@/tools/CommandRunner.js'\nimport { packageBinPath } from '@/tools/packageBinPath.js'\n\nexport const spawnRunner: CommandRunner = (command, args, options) => {\n // The project's tools win; the package's own follow; the shell's PATH last.\n // A command that receives a credential resolves from the shell's PATH alone.\n const path = options.systemPathOnly\n ? (processEnv['PATH'] ?? '')\n : [\n join(options.cwd, 'node_modules/.bin'),\n packageBinPath(),\n processEnv['PATH'] ?? '',\n ].join(delimiter)\n const child = spawnSync(command, args, {\n cwd: options.cwd,\n encoding: 'utf8',\n maxBuffer: 64 * 1024 * 1024,\n env: { ...processEnv, ...options.env, PATH: path },\n })\n // The typings promise strings, but a spawn that never started hands back null.\n const output: { stdout: string | null; stderr: string | null } = child\n return {\n status: child.status ?? -1,\n stdout: output.stdout ?? '',\n stderr: output.stderr ?? '',\n missing:\n (child.error as NodeJS.ErrnoException | undefined)?.code === 'ENOENT',\n }\n}\n","import { fileURLToPath } from 'node:url'\n\n// The package's own `node_modules/.bin`: one level up from both `dist/cli.js`\n// and `src/tools/`. When a consumer installs the peers next to this package\n// rather than in the project, or runs the bin from a checkout, this is where\n// squawk, prisma-lint and eslint live.\nexport const packageBinPath = (): string =>\n fileURLToPath(new URL('../node_modules/.bin', import.meta.url))\n"],"mappings":"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","names":["existsSync","join","join","existsSync","stdout","stdout","stdout","argv","stderr","existsSync","readFileSync","join","join","existsSync","readFileSync","argv","notice","existsSync","join","existsSync","readFileSync","join","join","existsSync","readFileSync","writeFileSync","join","join","writeFileSync","stdout","stderr","stdout","readFileSync","join","join","relative","existsSync","join","relative","join","readFileSync","readdirSync","readFileSync","join","end","readdirSync","join","readFileSync","createRequire","argv","existsSync","join","argv","existsSync","join","existsSync","join","existsSync","readFileSync","join","join","existsSync","readFileSync","readdirSync","readFileSync","join","join","readdirSync","readFileSync","calls","totalMs","existsSync","readFileSync","join","join","existsSync","readFileSync","existsSync","readFileSync","join","join","existsSync","readFileSync","existsSync","join","existsSync","join","argv","existsSync","join","existsSync","join","existsSync","join","existsSync","join","writeFileSync","join","existsSync","join","relative","existsSync","join","existsSync","readFileSync","join","existsSync","join","readdirSync","join","relative","existsSync","readFileSync","join","existsSync","join","join","existsSync","readFileSync","existsSync","readFileSync","join","join","existsSync","readFileSync","existsSync","readFileSync","join","createHash","relative","readFileSync","join","existsSync","argv","renameSync","writeFileSync","join","join","writeFileSync","renameSync","renameSync","writeFileSync","join","join","writeFileSync","renameSync","argv","argv","join","fileURLToPath","join"]}