pipework 0.251.0 → 0.252.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/CHANGELOG.md +11 -0
- package/dist/core/config/load.d.ts +2 -0
- package/dist/core/config/load.d.ts.map +1 -1
- package/dist/core/config/load.js +1 -0
- package/dist/core/config/load.js.map +1 -1
- package/dist/core/config/namespace.d.ts +1 -0
- package/dist/core/config/namespace.d.ts.map +1 -1
- package/dist/core/config/schema.d.ts +2 -0
- package/dist/core/config/schema.d.ts.map +1 -1
- package/dist/core/config/schema.js +1 -0
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/surface/types.d.ts +1 -0
- package/dist/core/surface/types.d.ts.map +1 -1
- package/dist/data/db/namespace.d.ts +3 -0
- package/dist/data/db/namespace.d.ts.map +1 -1
- package/dist/data/db/namespace.js +3 -0
- package/dist/data/db/namespace.js.map +1 -1
- package/dist/data/db/pool.d.ts.map +1 -1
- package/dist/data/db/pool.js +6 -1
- package/dist/data/db/pool.js.map +1 -1
- package/dist/data/db/query-label.d.ts +5 -0
- package/dist/data/db/query-label.d.ts.map +1 -0
- package/dist/data/db/query-label.js +11 -0
- package/dist/data/db/query-label.js.map +1 -0
- package/dist/data/db/query-watch.d.ts +21 -0
- package/dist/data/db/query-watch.d.ts.map +1 -0
- package/dist/data/db/query-watch.js +90 -0
- package/dist/data/db/query-watch.js.map +1 -0
- package/dist/data/query/postgres-js/driver.js +1 -1
- package/dist/data/query/postgres-js/driver.js.map +1 -1
- package/dist/data/query/postgres-js/session.d.ts +5 -1
- package/dist/data/query/postgres-js/session.d.ts.map +1 -1
- package/dist/data/query/postgres-js/session.js +16 -11
- package/dist/data/query/postgres-js/session.js.map +1 -1
- package/dist/data/query/utils.d.ts +2 -0
- package/dist/data/query/utils.d.ts.map +1 -1
- package/dist/data/query/utils.js.map +1 -1
- package/dist/infra/credits/schema.d.ts +1 -1
- package/dist/test/plugin.d.ts.map +1 -1
- package/dist/test/plugin.js +10 -4
- package/dist/test/plugin.js.map +1 -1
- package/package.json +4 -3
- package/src/async/jobs/abortable-delay.ts +18 -0
- package/src/async/jobs/claims.ts +52 -0
- package/src/async/jobs/cron.ts +179 -0
- package/src/async/jobs/errors.ts +56 -0
- package/src/async/jobs/exclusion.ts +117 -0
- package/src/async/jobs/execute.ts +219 -0
- package/src/async/jobs/index.ts +10 -0
- package/src/async/jobs/listener.ts +135 -0
- package/src/async/jobs/namespace.ts +20 -0
- package/src/async/jobs/queue-door.ts +44 -0
- package/src/async/jobs/queue.ts +1012 -0
- package/src/async/jobs/run-script.ts +67 -0
- package/src/async/jobs/scheduler.ts +218 -0
- package/src/async/jobs/schedules-table.ts +37 -0
- package/src/async/jobs/serialize-error.ts +48 -0
- package/src/async/jobs/table.ts +191 -0
- package/src/async/pipeline/define.ts +53 -0
- package/src/async/pipeline/errors.ts +35 -0
- package/src/async/pipeline/execute.ts +53 -0
- package/src/async/pipeline/index.ts +13 -0
- package/src/async/pipeline/namespace.ts +12 -0
- package/src/async/pipeline/resume.ts +67 -0
- package/src/async/pipeline/run-steps.ts +98 -0
- package/src/async/pipeline/types.ts +57 -0
- package/src/async/state-machine/define.ts +64 -0
- package/src/async/state-machine/errors.ts +29 -0
- package/src/async/state-machine/index.ts +3 -0
- package/src/async/state-machine/namespace.ts +12 -0
- package/src/async/state-machine/transition.ts +90 -0
- package/src/async/state-machine/types.ts +37 -0
- package/src/async/steps/errors.ts +31 -0
- package/src/async/steps/graph.ts +1214 -0
- package/src/async/steps/hash.ts +40 -0
- package/src/async/steps/index.ts +7 -0
- package/src/async/steps/namespace.ts +7 -0
- package/src/async/steps/table.ts +97 -0
- package/src/async/steps/types.ts +318 -0
- package/src/audit/chain/index.ts +9 -0
- package/src/audit/chain/install.ts +113 -0
- package/src/audit/chain/retire.ts +52 -0
- package/src/audit/chain/verify.ts +257 -0
- package/src/audit/query/cursor.ts +37 -0
- package/src/audit/query/index.ts +9 -0
- package/src/audit/query/query.ts +223 -0
- package/src/audit/schema/audit-record-fields.ts +68 -0
- package/src/audit/schema/audit-record.ts +23 -0
- package/src/auth/auth/audit.ts +31 -0
- package/src/auth/auth/chain.ts +84 -0
- package/src/auth/auth/cookie.ts +136 -0
- package/src/auth/auth/email-links.ts +311 -0
- package/src/auth/auth/guard.ts +128 -0
- package/src/auth/auth/index.ts +18 -0
- package/src/auth/auth/multi-org.ts +337 -0
- package/src/auth/auth/namespace.ts +34 -0
- package/src/auth/auth/parse-expiry.ts +13 -0
- package/src/auth/auth/passwords.ts +110 -0
- package/src/auth/auth/schema.ts +110 -0
- package/src/auth/auth/sessions.ts +565 -0
- package/src/auth/auth/sign-in.ts +156 -0
- package/src/auth/auth/signing-keys.ts +69 -0
- package/src/auth/auth/types.ts +26 -0
- package/src/auth/auth/uuid.ts +10 -0
- package/src/auth/rbac/cache.ts +55 -0
- package/src/auth/rbac/check.ts +30 -0
- package/src/auth/rbac/create.ts +35 -0
- package/src/auth/rbac/index.ts +5 -0
- package/src/auth/rbac/middleware.ts +20 -0
- package/src/auth/rbac/namespace.ts +15 -0
- package/src/auth/rbac/resolve.ts +31 -0
- package/src/auth/rbac/schema.sql +31 -0
- package/src/auth/rbac/seed.ts +67 -0
- package/src/auth/rbac/tables.ts +32 -0
- package/src/auth/rbac/types.ts +65 -0
- package/src/auth/tenant/extract.ts +33 -0
- package/src/auth/tenant/in-tenant.ts +49 -0
- package/src/auth/tenant/index.ts +7 -0
- package/src/auth/tenant/namespace.ts +23 -0
- package/src/auth/tenant/propagate.ts +20 -0
- package/src/auth/tenant/rls.ts +120 -0
- package/src/auth/tenant/scope.ts +33 -0
- package/src/auth/tenant/scoped-db.ts +581 -0
- package/src/auth/tenant/types.ts +14 -0
- package/src/auth/tenant/validate.ts +27 -0
- package/src/cli/commands/add.ts +158 -0
- package/src/cli/commands/alerts.ts +98 -0
- package/src/cli/commands/check.ts +1418 -0
- package/src/cli/commands/codemod.ts +78 -0
- package/src/cli/commands/db.ts +356 -0
- package/src/cli/commands/dev.ts +101 -0
- package/src/cli/commands/generate.ts +75 -0
- package/src/cli/commands/init.ts +36 -0
- package/src/cli/commands/install.ts +28 -0
- package/src/cli/commands/lint.ts +62 -0
- package/src/cli/commands/migrate.ts +132 -0
- package/src/cli/commands/openapi.ts +63 -0
- package/src/cli/commands/remove.ts +72 -0
- package/src/cli/commands/run.ts +50 -0
- package/src/cli/commands/scope.ts +54 -0
- package/src/cli/commands/serve.ts +68 -0
- package/src/cli/commands/shard.ts +31 -0
- package/src/cli/commands/shared/config-pipework-version.ts +28 -0
- package/src/cli/commands/shared/find-config.ts +22 -0
- package/src/cli/commands/shared/load-config.ts +35 -0
- package/src/cli/commands/shared/pnpm-install.ts +95 -0
- package/src/cli/commands/shared/report-removed.ts +8 -0
- package/src/cli/commands/sync.ts +32 -0
- package/src/cli/commands/test.ts +307 -0
- package/src/cli/commands/upgrade.ts +48 -0
- package/src/cli/dev-bootstrap.ts +24 -0
- package/src/cli/errors.ts +10 -0
- package/src/cli/index.ts +303 -0
- package/src/cli/output.ts +17 -0
- package/src/cli/port.ts +15 -0
- package/src/cli/surface-kinds.ts +20 -0
- package/src/client/index.ts +4 -0
- package/src/client/poll.ts +130 -0
- package/src/client/report-fault.ts +119 -0
- package/src/core/config/app-pool.ts +19 -0
- package/src/core/config/aws-env.ts +29 -0
- package/src/core/config/base-dir.ts +24 -0
- package/src/core/config/discover.ts +64 -0
- package/src/core/config/env-resolve.ts +87 -0
- package/src/core/config/env-types.ts +116 -0
- package/src/core/config/env.ts +55 -0
- package/src/core/config/errors.ts +9 -0
- package/src/core/config/import-config.ts +40 -0
- package/src/core/config/index.ts +8 -0
- package/src/core/config/load.ts +417 -0
- package/src/core/config/namespace.ts +14 -0
- package/src/core/config/resolve.ts +195 -0
- package/src/core/config/schema.ts +488 -0
- package/src/core/config/statement-observer.ts +48 -0
- package/src/core/config/ts-inline-hooks.ts +75 -0
- package/src/core/config/ts-register.ts +4 -0
- package/src/core/config/ts-resolve-hooks.ts +101 -0
- package/src/core/errors/base.ts +49 -0
- package/src/core/errors/http.ts +146 -0
- package/src/core/errors/index.ts +2 -0
- package/src/core/errors/namespace.ts +31 -0
- package/src/core/lifecycle/drain.ts +33 -0
- package/src/core/lifecycle/health.ts +72 -0
- package/src/core/lifecycle/index.ts +4 -0
- package/src/core/lifecycle/namespace.ts +7 -0
- package/src/core/lifecycle/startup.ts +102 -0
- package/src/core/lifecycle/types.ts +36 -0
- package/src/core/logging/context.ts +60 -0
- package/src/core/logging/error-chain.ts +68 -0
- package/src/core/logging/index.ts +5 -0
- package/src/core/logging/logger.ts +65 -0
- package/src/core/logging/namespace.ts +16 -0
- package/src/core/logging/proxy.ts +22 -0
- package/src/core/logging/redact-match.ts +24 -0
- package/src/core/logging/types.ts +47 -0
- package/src/core/pipework.ts +566 -0
- package/src/core/runtime/broker.ts +69 -0
- package/src/core/surface/http.ts +133 -0
- package/src/core/surface/index.ts +11 -0
- package/src/core/surface/job-timeout.ts +40 -0
- package/src/core/surface/namespace.ts +13 -0
- package/src/core/surface/script.ts +33 -0
- package/src/core/surface/start.ts +142 -0
- package/src/core/surface/types.ts +225 -0
- package/src/core/surface/validate.ts +88 -0
- package/src/core/surface/worker.ts +528 -0
- package/src/core/validation/connectivity.ts +49 -0
- package/src/core/validation/domain.ts +99 -0
- package/src/core/validation/index.ts +5 -0
- package/src/core/validation/queue-tables.ts +312 -0
- package/src/core/validation/rls-role.ts +138 -0
- package/src/core/validation/startup.ts +51 -0
- package/src/core/validation/surfaces.ts +65 -0
- package/src/core/validation/types.ts +25 -0
- package/src/data/db/advisory-lock.ts +55 -0
- package/src/data/db/aggregates.ts +172 -0
- package/src/data/db/array-elements.ts +111 -0
- package/src/data/db/bulk-set.ts +53 -0
- package/src/data/db/col/index.ts +14 -0
- package/src/data/db/composed.ts +53 -0
- package/src/data/db/db.ts +276 -0
- package/src/data/db/excluded.ts +16 -0
- package/src/data/db/expressions.ts +473 -0
- package/src/data/db/filter.ts +90 -0
- package/src/data/db/function-source.ts +114 -0
- package/src/data/db/identifiers.ts +16 -0
- package/src/data/db/idx/index.ts +9 -0
- package/src/data/db/in-list.ts +49 -0
- package/src/data/db/index.ts +9 -0
- package/src/data/db/insert-split.ts +137 -0
- package/src/data/db/instrumentation.ts +82 -0
- package/src/data/db/maintenance.ts +28 -0
- package/src/data/db/namespace.ts +107 -0
- package/src/data/db/owner-labels.ts +9 -0
- package/src/data/db/pool.ts +187 -0
- package/src/data/db/query-label.ts +13 -0
- package/src/data/db/query-watch.ts +116 -0
- package/src/data/db/raw-client-warning.ts +37 -0
- package/src/data/db/readonly.ts +23 -0
- package/src/data/db/reservation.ts +151 -0
- package/src/data/db/schema-features.ts +14 -0
- package/src/data/db/serializable.ts +83 -0
- package/src/data/db/sql.ts +1 -0
- package/src/data/db/timeouts.ts +76 -0
- package/src/data/db/types.ts +18 -0
- package/src/data/db/unbound.ts +33 -0
- package/src/data/db/values.ts +29 -0
- package/src/data/domain/brand.ts +15 -0
- package/src/data/domain/build-factory.ts +193 -0
- package/src/data/domain/build-schema.ts +161 -0
- package/src/data/domain/build-table.ts +355 -0
- package/src/data/domain/define.ts +239 -0
- package/src/data/domain/external-registry.ts +34 -0
- package/src/data/domain/external.ts +77 -0
- package/src/data/domain/field.ts +279 -0
- package/src/data/domain/index.ts +13 -0
- package/src/data/domain/naming.ts +6 -0
- package/src/data/domain/projections.ts +57 -0
- package/src/data/domain/trace-safe-projection.ts +31 -0
- package/src/data/domain/traits.ts +108 -0
- package/src/data/domain/types.ts +289 -0
- package/src/data/jsonb/composed.ts +18 -0
- package/src/data/jsonb/index.ts +1 -0
- package/src/data/jsonb/namespace.ts +30 -0
- package/src/data/jsonb/query.ts +86 -0
- package/src/data/migrate/append-only-generate.ts +47 -0
- package/src/data/migrate/applied.ts +47 -0
- package/src/data/migrate/apply.ts +309 -0
- package/src/data/migrate/check.ts +119 -0
- package/src/data/migrate/diff.ts +357 -0
- package/src/data/migrate/door-generate.ts +130 -0
- package/src/data/migrate/framework-rls.ts +58 -0
- package/src/data/migrate/generate.ts +201 -0
- package/src/data/migrate/history.ts +215 -0
- package/src/data/migrate/index.ts +9 -0
- package/src/data/migrate/internal-definitions.ts +175 -0
- package/src/data/migrate/post-process.ts +73 -0
- package/src/data/migrate/pragma.ts +73 -0
- package/src/data/migrate/provision-framework.ts +147 -0
- package/src/data/migrate/rls-generate.ts +61 -0
- package/src/data/migrate/run.ts +124 -0
- package/src/data/migrate/safety.ts +167 -0
- package/src/data/migrate/snapshot.ts +368 -0
- package/src/data/migrate/sql-emit.ts +392 -0
- package/src/data/migrate/statements.ts +312 -0
- package/src/data/query/alias.ts +126 -0
- package/src/data/query/batch.ts +8 -0
- package/src/data/query/cache/core/cache.ts +78 -0
- package/src/data/query/cache/core/index.ts +1 -0
- package/src/data/query/cache/core/types.ts +29 -0
- package/src/data/query/cache/readme.md +230 -0
- package/src/data/query/casing.ts +76 -0
- package/src/data/query/collation.ts +11 -0
- package/src/data/query/column-builder.ts +370 -0
- package/src/data/query/column.ts +150 -0
- package/src/data/query/entity.ts +42 -0
- package/src/data/query/errors.ts +33 -0
- package/src/data/query/index.ts +14 -0
- package/src/data/query/logger.ts +47 -0
- package/src/data/query/operations.ts +45 -0
- package/src/data/query/pg-core/alias.ts +12 -0
- package/src/data/query/pg-core/checks.ts +32 -0
- package/src/data/query/pg-core/columns/all.ts +71 -0
- package/src/data/query/pg-core/columns/bigint.ts +110 -0
- package/src/data/query/pg-core/columns/bigserial.ts +128 -0
- package/src/data/query/pg-core/columns/boolean.ts +43 -0
- package/src/data/query/pg-core/columns/char.ts +85 -0
- package/src/data/query/pg-core/columns/cidr.ts +43 -0
- package/src/data/query/pg-core/columns/common.ts +366 -0
- package/src/data/query/pg-core/columns/custom.ts +232 -0
- package/src/data/query/pg-core/columns/date.common.ts +15 -0
- package/src/data/query/pg-core/columns/date.ts +112 -0
- package/src/data/query/pg-core/columns/double-precision.ts +55 -0
- package/src/data/query/pg-core/columns/enum.ts +201 -0
- package/src/data/query/pg-core/columns/index.ts +35 -0
- package/src/data/query/pg-core/columns/inet.ts +43 -0
- package/src/data/query/pg-core/columns/int.common.ts +57 -0
- package/src/data/query/pg-core/columns/integer.ts +53 -0
- package/src/data/query/pg-core/columns/interval.ts +83 -0
- package/src/data/query/pg-core/columns/json.ts +58 -0
- package/src/data/query/pg-core/columns/jsonb.ts +56 -0
- package/src/data/query/pg-core/columns/line.ts +117 -0
- package/src/data/query/pg-core/columns/macaddr.ts +43 -0
- package/src/data/query/pg-core/columns/macaddr8.ts +43 -0
- package/src/data/query/pg-core/columns/numeric.ts +227 -0
- package/src/data/query/pg-core/columns/point.ts +127 -0
- package/src/data/query/pg-core/columns/postgis_extension/geometry.ts +119 -0
- package/src/data/query/pg-core/columns/postgis_extension/utils.ts +47 -0
- package/src/data/query/pg-core/columns/real.ts +58 -0
- package/src/data/query/pg-core/columns/serial.ts +55 -0
- package/src/data/query/pg-core/columns/smallint.ts +53 -0
- package/src/data/query/pg-core/columns/smallserial.ts +60 -0
- package/src/data/query/pg-core/columns/text.ts +67 -0
- package/src/data/query/pg-core/columns/time.ts +72 -0
- package/src/data/query/pg-core/columns/timestamp.ts +163 -0
- package/src/data/query/pg-core/columns/uuid.ts +51 -0
- package/src/data/query/pg-core/columns/varchar.ts +89 -0
- package/src/data/query/pg-core/columns/vector_extension/bit.ts +68 -0
- package/src/data/query/pg-core/columns/vector_extension/halfvec.ts +80 -0
- package/src/data/query/pg-core/columns/vector_extension/sparsevec.ts +67 -0
- package/src/data/query/pg-core/columns/vector_extension/vector.ts +80 -0
- package/src/data/query/pg-core/db.ts +674 -0
- package/src/data/query/pg-core/dialect.ts +1404 -0
- package/src/data/query/pg-core/expressions.ts +25 -0
- package/src/data/query/pg-core/foreign-keys.ts +130 -0
- package/src/data/query/pg-core/index.ts +21 -0
- package/src/data/query/pg-core/indexes.ts +276 -0
- package/src/data/query/pg-core/policies.ts +56 -0
- package/src/data/query/pg-core/primary-keys.ts +62 -0
- package/src/data/query/pg-core/query-builders/count.ts +86 -0
- package/src/data/query/pg-core/query-builders/delete.ts +293 -0
- package/src/data/query/pg-core/query-builders/index.ts +7 -0
- package/src/data/query/pg-core/query-builders/insert.ts +452 -0
- package/src/data/query/pg-core/query-builders/query-builder.ts +123 -0
- package/src/data/query/pg-core/query-builders/query.ts +157 -0
- package/src/data/query/pg-core/query-builders/raw.ts +49 -0
- package/src/data/query/pg-core/query-builders/refresh-materialized-view.ts +108 -0
- package/src/data/query/pg-core/query-builders/select.ts +1346 -0
- package/src/data/query/pg-core/query-builders/select.types.ts +437 -0
- package/src/data/query/pg-core/query-builders/update.ts +626 -0
- package/src/data/query/pg-core/roles.ts +41 -0
- package/src/data/query/pg-core/schema.ts +72 -0
- package/src/data/query/pg-core/sequence.ts +41 -0
- package/src/data/query/pg-core/session.ts +292 -0
- package/src/data/query/pg-core/subquery.ts +46 -0
- package/src/data/query/pg-core/table.ts +252 -0
- package/src/data/query/pg-core/unique-constraint.ts +73 -0
- package/src/data/query/pg-core/utils/array.ts +95 -0
- package/src/data/query/pg-core/utils/index.ts +1 -0
- package/src/data/query/pg-core/utils.ts +104 -0
- package/src/data/query/pg-core/view-base.ts +14 -0
- package/src/data/query/pg-core/view-common.ts +1 -0
- package/src/data/query/pg-core/view.ts +435 -0
- package/src/data/query/pg-core/with-builder.ts +41 -0
- package/src/data/query/postgres-js/README.md +46 -0
- package/src/data/query/postgres-js/array-parser.ts +45 -0
- package/src/data/query/postgres-js/driver-error-boundary.ts +149 -0
- package/src/data/query/postgres-js/driver.ts +163 -0
- package/src/data/query/postgres-js/index.ts +2 -0
- package/src/data/query/postgres-js/session.ts +234 -0
- package/src/data/query/primary-key.ts +11 -0
- package/src/data/query/query-builders/query-builder.ts +19 -0
- package/src/data/query/query-builders/select.types.ts +175 -0
- package/src/data/query/query-promise.ts +35 -0
- package/src/data/query/relations.ts +725 -0
- package/src/data/query/runnable-query.ts +12 -0
- package/src/data/query/selection-proxy.ts +121 -0
- package/src/data/query/session.ts +8 -0
- package/src/data/query/sql/expressions/conditions.ts +741 -0
- package/src/data/query/sql/expressions/index.ts +2 -0
- package/src/data/query/sql/expressions/select.ts +45 -0
- package/src/data/query/sql/functions/aggregate.ts +129 -0
- package/src/data/query/sql/functions/index.ts +2 -0
- package/src/data/query/sql/functions/vector.ts +178 -0
- package/src/data/query/sql/index.ts +3 -0
- package/src/data/query/sql/sql.ts +794 -0
- package/src/data/query/subquery.ts +53 -0
- package/src/data/query/table.ts +208 -0
- package/src/data/query/table.utils.ts +2 -0
- package/src/data/query/tracing-utils.ts +3 -0
- package/src/data/query/tracing.ts +11 -0
- package/src/data/query/utils.ts +357 -0
- package/src/data/query/version.ts +4 -0
- package/src/data/query/view-common.ts +1 -0
- package/src/data/schema/branded.ts +13 -0
- package/src/data/schema/generated/coerce.ts +5 -0
- package/src/data/schema/generated/combinator.ts +6 -0
- package/src/data/schema/generated/encoding.ts +5 -0
- package/src/data/schema/generated/error.ts +6 -0
- package/src/data/schema/generated/format.ts +5 -0
- package/src/data/schema/generated/type-constructor.ts +10 -0
- package/src/data/schema/generated/type.ts +6 -0
- package/src/data/schema/index.ts +6 -0
- package/src/data/schema/json-schema.ts +33 -0
- package/src/data/schema/namespace.ts +55 -0
- package/src/data/schema/parse.ts +39 -0
- package/src/data/schema/types.ts +39 -0
- package/src/data/temporal/append-only.ts +134 -0
- package/src/data/temporal/close.ts +27 -0
- package/src/data/temporal/columns.ts +10 -0
- package/src/data/temporal/definition-queries.ts +70 -0
- package/src/data/temporal/errors.ts +10 -0
- package/src/data/temporal/get-current.ts +22 -0
- package/src/data/temporal/index.ts +9 -0
- package/src/data/temporal/namespace.ts +36 -0
- package/src/data/temporal/query.ts +25 -0
- package/src/data/temporal/resolve.ts +17 -0
- package/src/data/temporal/revise.ts +67 -0
- package/src/data/temporal/types.ts +22 -0
- package/src/data/valve/artifact.ts +33 -0
- package/src/data/valve/contract-diff.ts +21 -0
- package/src/data/valve/cross.ts +57 -0
- package/src/data/valve/crossing-ledger.ts +50 -0
- package/src/data/valve/decision.ts +44 -0
- package/src/data/valve/durable-crossing.ts +52 -0
- package/src/data/valve/execute-crossing.ts +77 -0
- package/src/data/valve/faucet.ts +56 -0
- package/src/data/valve/gate.ts +114 -0
- package/src/data/valve/graph.ts +77 -0
- package/src/data/valve/index.ts +53 -0
- package/src/data/valve/namespace.ts +57 -0
- package/src/data/valve/registry.ts +50 -0
- package/src/data/valve/schema/valve-crossing-fields.ts +23 -0
- package/src/data/valve/schema/valve-crossing.ts +9 -0
- package/src/data/valve/supply.ts +154 -0
- package/src/data/valve/types.ts +143 -0
- package/src/data/vector/columns.ts +27 -0
- package/src/data/vector/index.ts +4 -0
- package/src/data/vector/namespace.ts +33 -0
- package/src/data/vector/query.ts +85 -0
- package/src/data/vector/validate.ts +16 -0
- package/src/data/write/audit/actor.ts +15 -0
- package/src/data/write/audit/audit-columns.ts +18 -0
- package/src/data/write/audit/audit-select.ts +111 -0
- package/src/data/write/audit/bound-transaction.ts +14 -0
- package/src/data/write/audit/cte-compile.ts +32 -0
- package/src/data/write/audit/decode-returning.ts +47 -0
- package/src/data/write/audit/final-select.ts +43 -0
- package/src/data/write/audit/infra-audit.ts +36 -0
- package/src/data/write/audit/primary-key.ts +65 -0
- package/src/data/write/audit/projection.ts +41 -0
- package/src/data/write/audit/read-touches.ts +86 -0
- package/src/data/write/audit/touch-match.ts +78 -0
- package/src/data/write/audit/verb-delete.ts +62 -0
- package/src/data/write/audit/verb-insert.ts +36 -0
- package/src/data/write/audit/verb-select.ts +47 -0
- package/src/data/write/audit/verb-update.ts +60 -0
- package/src/data/write/audit/verb-upsert.ts +104 -0
- package/src/data/write/conflict.ts +43 -0
- package/src/data/write/delete.ts +38 -0
- package/src/data/write/execute.ts +243 -0
- package/src/data/write/index.ts +11 -0
- package/src/data/write/insert.ts +63 -0
- package/src/data/write/state.ts +43 -0
- package/src/data/write/update.ts +54 -0
- package/src/data/write/upsert.ts +58 -0
- package/src/data/write/values.ts +19 -0
- package/src/index.ts +230 -0
- package/src/infra/access-links/code.ts +70 -0
- package/src/infra/access-links/handle.ts +892 -0
- package/src/infra/access-links/index.ts +9 -0
- package/src/infra/access-links/namespace.ts +30 -0
- package/src/infra/access-links/person-check.ts +177 -0
- package/src/infra/access-links/schema.ts +71 -0
- package/src/infra/alerts/async-sources.ts +231 -0
- package/src/infra/alerts/audit.ts +36 -0
- package/src/infra/alerts/beat.ts +123 -0
- package/src/infra/alerts/client-faults.ts +111 -0
- package/src/infra/alerts/faults.ts +156 -0
- package/src/infra/alerts/handle.ts +778 -0
- package/src/infra/alerts/http.ts +192 -0
- package/src/infra/alerts/index.ts +12 -0
- package/src/infra/alerts/infra-sources.ts +180 -0
- package/src/infra/alerts/namespace.ts +81 -0
- package/src/infra/alerts/redact.ts +21 -0
- package/src/infra/alerts/request-faults.ts +41 -0
- package/src/infra/alerts/schema.ts +124 -0
- package/src/infra/alerts/sinks.ts +125 -0
- package/src/infra/alerts/source-options.ts +26 -0
- package/src/infra/alerts/sources.ts +503 -0
- package/src/infra/alerts/subsystem-sources.ts +137 -0
- package/src/infra/audit/emit.ts +87 -0
- package/src/infra/audit/index.ts +2 -0
- package/src/infra/audit/namespace.ts +22 -0
- package/src/infra/audit/schema.sql +35 -0
- package/src/infra/audit/types.ts +18 -0
- package/src/infra/aws/credentials.ts +147 -0
- package/src/infra/aws/sigv4.ts +140 -0
- package/src/infra/cache/create.ts +58 -0
- package/src/infra/cache/entry.ts +81 -0
- package/src/infra/cache/index.ts +4 -0
- package/src/infra/cache/namespace.ts +10 -0
- package/src/infra/cache/tenant.ts +93 -0
- package/src/infra/cache/types.ts +24 -0
- package/src/infra/crawl/audit.ts +35 -0
- package/src/infra/crawl/errors.ts +25 -0
- package/src/infra/crawl/handle.ts +693 -0
- package/src/infra/crawl/index.ts +9 -0
- package/src/infra/crawl/links.ts +160 -0
- package/src/infra/crawl/namespace.ts +36 -0
- package/src/infra/crawl/robots.ts +100 -0
- package/src/infra/crawl/schema.ts +89 -0
- package/src/infra/credit-line/handle.ts +883 -0
- package/src/infra/credit-line/index.ts +6 -0
- package/src/infra/credit-line/namespace.ts +7 -0
- package/src/infra/credit-line/schema.ts +96 -0
- package/src/infra/credits/handle.ts +706 -0
- package/src/infra/credits/index.ts +5 -0
- package/src/infra/credits/namespace.ts +7 -0
- package/src/infra/credits/schema.ts +83 -0
- package/src/infra/email/audit.ts +36 -0
- package/src/infra/email/inbound.ts +622 -0
- package/src/infra/email/index.ts +11 -0
- package/src/infra/email/mail.ts +517 -0
- package/src/infra/email/mime.ts +447 -0
- package/src/infra/email/namespace.ts +22 -0
- package/src/infra/email/providers.ts +111 -0
- package/src/infra/email/schema.ts +96 -0
- package/src/infra/email/sns.ts +200 -0
- package/src/infra/email/unsubscribe.ts +44 -0
- package/src/infra/fetch/address.ts +88 -0
- package/src/infra/fetch/connect-retry.ts +87 -0
- package/src/infra/fetch/handle.ts +329 -0
- package/src/infra/fetch/index.ts +7 -0
- package/src/infra/fetch/namespace.ts +70 -0
- package/src/infra/idempotency/index.ts +3 -0
- package/src/infra/idempotency/middleware.ts +87 -0
- package/src/infra/idempotency/store.ts +92 -0
- package/src/infra/idempotency/types.ts +30 -0
- package/src/infra/join-requests/handle.ts +312 -0
- package/src/infra/join-requests/index.ts +2 -0
- package/src/infra/join-requests/namespace.ts +7 -0
- package/src/infra/join-requests/schema.ts +33 -0
- package/src/infra/outbox/core.ts +165 -0
- package/src/infra/quota/errors.ts +32 -0
- package/src/infra/quota/handle.ts +215 -0
- package/src/infra/quota/index.ts +5 -0
- package/src/infra/quota/namespace.ts +7 -0
- package/src/infra/quota/schema.ts +15 -0
- package/src/infra/storage/backend.ts +34 -0
- package/src/infra/storage/handle.ts +513 -0
- package/src/infra/storage/index.ts +9 -0
- package/src/infra/storage/local.ts +104 -0
- package/src/infra/storage/namespace.ts +13 -0
- package/src/infra/storage/s3.ts +257 -0
- package/src/infra/storage/schema.ts +24 -0
- package/src/infra/support/handle.ts +854 -0
- package/src/infra/support/http.ts +229 -0
- package/src/infra/support/index.ts +7 -0
- package/src/infra/support/namespace.ts +12 -0
- package/src/infra/support/schema.ts +96 -0
- package/src/infra/webhook/inbound.ts +45 -0
- package/src/infra/webhook/index.ts +5 -0
- package/src/infra/webhook/namespace.ts +24 -0
- package/src/infra/webhook/outbound.ts +315 -0
- package/src/infra/webhook/sign.ts +32 -0
- package/src/infra/webhook/verify.ts +82 -0
- package/src/invariants/assert.ts +26 -0
- package/src/invariants/index.ts +1 -0
- package/src/lint/config.ts +56 -0
- package/src/lint/doctrine.ts +163 -0
- package/src/lint/include.ts +97 -0
- package/src/lint/index.ts +3 -0
- package/src/lint/preset.ts +10 -0
- package/src/lint/resolver.ts +218 -0
- package/src/lint/rules/no-reexports.ts +46 -0
- package/src/request/behavior/audited.ts +85 -0
- package/src/request/behavior/cached.ts +62 -0
- package/src/request/behavior/compose.ts +28 -0
- package/src/request/behavior/index.ts +5 -0
- package/src/request/behavior/namespace.ts +16 -0
- package/src/request/behavior/types.ts +26 -0
- package/src/request/behavior/versioned.ts +54 -0
- package/src/request/context/create.ts +103 -0
- package/src/request/context/guard.ts +49 -0
- package/src/request/context/index.ts +4 -0
- package/src/request/context/run-in-transaction.ts +200 -0
- package/src/request/context/store.ts +28 -0
- package/src/request/context/types.ts +50 -0
- package/src/request/di/builder.ts +535 -0
- package/src/request/di/index.ts +8 -0
- package/src/request/di/resolve.ts +271 -0
- package/src/request/di/types.ts +262 -0
- package/src/request/fitting/namespace.ts +7 -0
- package/src/request/fixture/batch.ts +71 -0
- package/src/request/fixture/builder.ts +26 -0
- package/src/request/fixture/errors.ts +10 -0
- package/src/request/fixture/index.ts +8 -0
- package/src/request/fixture/namespace.ts +23 -0
- package/src/request/fixture/paginate.ts +44 -0
- package/src/request/fixture/to-handlers.ts +260 -0
- package/src/request/fixture/types.ts +79 -0
- package/src/request/flow/act-as.ts +78 -0
- package/src/request/flow/namespace.ts +17 -0
- package/src/request/http/error-step.ts +42 -0
- package/src/request/http/file.ts +141 -0
- package/src/request/http/index.ts +4 -0
- package/src/request/http/middleware.ts +141 -0
- package/src/request/http/namespace.ts +5 -0
- package/src/request/http/rate-limit-classes.ts +170 -0
- package/src/request/http/response.ts +82 -0
- package/src/request/http/server.ts +916 -0
- package/src/request/http/sniff.ts +261 -0
- package/src/request/http/types.ts +250 -0
- package/src/request/http/upload.ts +284 -0
- package/src/request/internal/text.ts +6 -0
- package/src/request/openapi/generate.ts +205 -0
- package/src/request/openapi/index.ts +2 -0
- package/src/request/openapi/namespace.ts +7 -0
- package/src/test/auth.ts +13 -0
- package/src/test/auto-setup.ts +45 -0
- package/src/test/context.ts +91 -0
- package/src/test/crawl-fixture.ts +157 -0
- package/src/test/discover-fork.ts +17 -0
- package/src/test/fingerprint.ts +135 -0
- package/src/test/globals.d.ts +7 -0
- package/src/test/index.ts +19 -0
- package/src/test/namespace.ts +87 -0
- package/src/test/plugin.ts +189 -0
- package/src/test/progress.ts +185 -0
- package/src/test/reap-after-run.ts +28 -0
- package/src/test/reap.ts +286 -0
- package/src/test/reset.ts +253 -0
- package/src/test/savepoints.ts +172 -0
- package/src/test/setup.ts +1422 -0
- package/src/test/system-channel.ts +50 -0
- package/src/test/vitest-plugin.ts +142 -0
- package/src/test/vitest-workspace.ts +507 -0
- package/src/test/vitest.ts +333 -0
- package/src/test/watch.ts +105 -0
- package/src/trace/capture/bounded-serializer.ts +146 -0
- package/src/trace/cardinality/analyze.ts +173 -0
- package/src/trace/cardinality/branch-context.ts +214 -0
- package/src/trace/cardinality/check.ts +33 -0
- package/src/trace/cardinality/classify-edge.ts +64 -0
- package/src/trace/cardinality/structural-max.ts +107 -0
- package/src/trace/check/coverage-check.ts +188 -0
- package/src/trace/check/flow-check.ts +103 -0
- package/src/trace/check/flow-step-site.ts +234 -0
- package/src/trace/check/io-pattern.ts +116 -0
- package/src/trace/codemod/add-cardinality.ts +152 -0
- package/src/trace/codemod/run.ts +80 -0
- package/src/trace/entry/child-trace.ts +21 -0
- package/src/trace/entry/close-trace.ts +87 -0
- package/src/trace/entry/finalize-trace.ts +28 -0
- package/src/trace/entry/open-trace.ts +138 -0
- package/src/trace/entry/parent-trace.ts +20 -0
- package/src/trace/entry/parse-traceparent.ts +39 -0
- package/src/trace/entry/process-start.ts +38 -0
- package/src/trace/entry/trace-context.ts +26 -0
- package/src/trace/entry/tracing-enabled.ts +10 -0
- package/src/trace/external/record.ts +195 -0
- package/src/trace/external/report.ts +66 -0
- package/src/trace/namespace.ts +19 -0
- package/src/trace/partition/day.ts +47 -0
- package/src/trace/partition/index.ts +14 -0
- package/src/trace/partition/partition-name.ts +23 -0
- package/src/trace/partition/plan.ts +82 -0
- package/src/trace/partition/schedule.ts +26 -0
- package/src/trace/partition/startup-hook.ts +39 -0
- package/src/trace/partition/sync.ts +154 -0
- package/src/trace/partition/tables.ts +53 -0
- package/src/trace/read/tree.ts +83 -0
- package/src/trace/retain/copy-on-error.ts +76 -0
- package/src/trace/runtime/expire-stale-traces.ts +54 -0
- package/src/trace/runtime/flow-step.ts +147 -0
- package/src/trace/runtime/flush-steps.ts +31 -0
- package/src/trace/runtime/pending-writes.ts +54 -0
- package/src/trace/runtime/step-buffer.ts +298 -0
- package/src/trace/runtime/step-error.ts +21 -0
- package/src/trace/runtime/step-meta.ts +55 -0
- package/src/trace/runtime/thenable.ts +12 -0
- package/src/trace/runtime/truncate-trace.ts +62 -0
- package/src/trace/schema/trace-fields.ts +52 -0
- package/src/trace/schema/trace-retained.ts +22 -0
- package/src/trace/schema/trace-step-fields.ts +44 -0
- package/src/trace/schema/trace-step-retained.ts +25 -0
- package/src/trace/schema/trace-step.ts +18 -0
- package/src/trace/schema/trace.ts +12 -0
- package/src/trace/transformer/apply.ts +79 -0
- package/src/trace/transformer/build-meta-literal.ts +30 -0
- package/src/trace/transformer/find-flow-step-sites.ts +85 -0
- package/src/trace/transformer/inject-flow-step-import.ts +39 -0
- package/src/trace/transformer/transform-error.ts +14 -0
- package/src/trace/transformer/transform-flow-steps.ts +123 -0
- package/src/trace/transformer/wrap-function-declaration.ts +62 -0
- package/src/trace/transformer/wrap-variable-declaration.ts +67 -0
- package/src/workspace/affected.ts +110 -0
- package/src/workspace/changed-files.ts +163 -0
- package/src/workspace/check-deps.ts +213 -0
- package/src/workspace/checksum.ts +20 -0
- package/src/workspace/dependency-graph.ts +67 -0
- package/src/workspace/detect-pipework-copies.ts +93 -0
- package/src/workspace/discover.ts +206 -0
- package/src/workspace/generate.ts +401 -0
- package/src/workspace/index.ts +7 -0
- package/src/workspace/module-imports-pipework.ts +39 -0
- package/src/workspace/module-package-name.ts +12 -0
- package/src/workspace/scrub-git-env.ts +23 -0
- package/src/workspace/source-paths.ts +36 -0
- package/src/workspace/sync.ts +182 -0
- package/dist/REFERENCE.md +0 -1477
- package/dist/infra/access-links/rate-limit.d.ts +0 -10
- package/dist/infra/access-links/rate-limit.d.ts.map +0 -1
- package/dist/infra/access-links/rate-limit.js +0 -28
- package/dist/infra/access-links/rate-limit.js.map +0 -1
- package/dist/infra/email/sigv4.d.ts +0 -24
- package/dist/infra/email/sigv4.d.ts.map +0 -1
- package/dist/infra/email/sigv4.js +0 -55
- package/dist/infra/email/sigv4.js.map +0 -1
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One SQL scanner, shared by everything in the migrate pipeline that has to
|
|
3
|
+
* reason about statement boundaries.
|
|
4
|
+
*
|
|
5
|
+
* There were two hand-rolled splitters before this, and they disagreed. The
|
|
6
|
+
* runner (`parseStatements`) learned string literals and dollar-quoted bodies
|
|
7
|
+
* in #317 so a plpgsql function body would survive; the safety gate kept a
|
|
8
|
+
* `sql.split(';')` that then discarded any fragment starting with `--`. Since
|
|
9
|
+
* a statement and the comment above it land in the *same* fragment, the gate
|
|
10
|
+
* dropped comment-led statements entirely and reported migrations clean that
|
|
11
|
+
* dropped tables (#334). Neither splitter knew about block comments or quoted
|
|
12
|
+
* identifiers.
|
|
13
|
+
*
|
|
14
|
+
* The rules, in one place:
|
|
15
|
+
*
|
|
16
|
+
* - `--` runs to end of line; block comments nest, per Postgres.
|
|
17
|
+
* - Comments are removed, replaced by whitespace so they still separate tokens.
|
|
18
|
+
* - `'…'`, `"…"` and `$tag$…$tag$` are copied verbatim — a `;` or `--` inside
|
|
19
|
+
* them is content, not syntax. Backslash escapes apply only in `E'…'`.
|
|
20
|
+
* - Comment state and quote state are decided in the same pass. That ordering
|
|
21
|
+
* is load-bearing: an apostrophe in a comment (`-- the migration's ancestors`)
|
|
22
|
+
* must not open a string literal, and a `--` inside a literal must not open
|
|
23
|
+
* a comment. Either check running first, alone, gets the other case wrong.
|
|
24
|
+
* - An unterminated comment or literal runs to end of input; the SQL is invalid
|
|
25
|
+
* either way and Postgres is what should say so.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
const IDENT_CHAR = /[A-Za-z0-9_]/
|
|
29
|
+
|
|
30
|
+
const STATEMENT_BREAKPOINT = '--> statement-breakpoint'
|
|
31
|
+
|
|
32
|
+
export interface ScanOptions {
|
|
33
|
+
/**
|
|
34
|
+
* Honor drizzle's `--> statement-breakpoint` as an explicit statement
|
|
35
|
+
* separator. The runner needs this (it decides what is sent to Postgres as
|
|
36
|
+
* one statement); the safety gate does not care.
|
|
37
|
+
*/
|
|
38
|
+
breakpointSeparator?: boolean
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Splits SQL into statements, stripping comments. */
|
|
42
|
+
export function scanStatements(sql: string, options: ScanOptions = {}): string[] {
|
|
43
|
+
const statements: string[] = []
|
|
44
|
+
let buf = ''
|
|
45
|
+
|
|
46
|
+
const flush = (): void => {
|
|
47
|
+
const stmt = buf.trim()
|
|
48
|
+
if (stmt.length > 0) statements.push(stmt)
|
|
49
|
+
buf = ''
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let i = 0
|
|
53
|
+
while (i < sql.length) {
|
|
54
|
+
const c = sql[i]!
|
|
55
|
+
const next = sql[i + 1]
|
|
56
|
+
|
|
57
|
+
// Line comment — runs to the newline, which is left to land as whitespace.
|
|
58
|
+
if (c === '-' && next === '-') {
|
|
59
|
+
const nl = sql.indexOf('\n', i)
|
|
60
|
+
const end = nl === -1 ? sql.length : nl
|
|
61
|
+
if (options.breakpointSeparator === true && sql.slice(i, end).trim() === STATEMENT_BREAKPOINT) flush()
|
|
62
|
+
i = end
|
|
63
|
+
continue
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Block comment — Postgres nests these, so track depth.
|
|
67
|
+
if (c === '/' && next === '*') {
|
|
68
|
+
i = skipBlockComment(sql, i)
|
|
69
|
+
buf += ' '
|
|
70
|
+
continue
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Dollar-quoted body — nothing inside is special, only the matching tag ends it.
|
|
74
|
+
const tag = dollarTagAt(sql, i)
|
|
75
|
+
if (tag !== null) {
|
|
76
|
+
const close = sql.indexOf(tag, i + tag.length)
|
|
77
|
+
const end = close === -1 ? sql.length : close + tag.length
|
|
78
|
+
buf += sql.slice(i, end)
|
|
79
|
+
i = end
|
|
80
|
+
continue
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// String literal. Backslashes escape only in an E'' string.
|
|
84
|
+
if (c === "'") {
|
|
85
|
+
const end = consumeQuoted(sql, i, "'", isEscapeString(sql, i))
|
|
86
|
+
buf += sql.slice(i, end)
|
|
87
|
+
i = end
|
|
88
|
+
continue
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Quoted identifier.
|
|
92
|
+
if (c === '"') {
|
|
93
|
+
const end = consumeQuoted(sql, i, '"', false)
|
|
94
|
+
buf += sql.slice(i, end)
|
|
95
|
+
i = end
|
|
96
|
+
continue
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (c === ';') {
|
|
100
|
+
flush()
|
|
101
|
+
i++
|
|
102
|
+
continue
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
buf += c
|
|
106
|
+
i++
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
flush()
|
|
110
|
+
return statements
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Removes comments, leaving literals and dollar-quoted bodies intact and
|
|
115
|
+
* statement separators where they were. For callers that need to test SQL
|
|
116
|
+
* against a pattern without a comment supplying a false match or hiding a
|
|
117
|
+
* real one.
|
|
118
|
+
*/
|
|
119
|
+
export function stripComments(sql: string): string {
|
|
120
|
+
let out = ''
|
|
121
|
+
let i = 0
|
|
122
|
+
while (i < sql.length) {
|
|
123
|
+
const c = sql[i]!
|
|
124
|
+
const next = sql[i + 1]
|
|
125
|
+
|
|
126
|
+
if (c === '-' && next === '-') {
|
|
127
|
+
const nl = sql.indexOf('\n', i)
|
|
128
|
+
i = nl === -1 ? sql.length : nl
|
|
129
|
+
continue
|
|
130
|
+
}
|
|
131
|
+
if (c === '/' && next === '*') {
|
|
132
|
+
i = skipBlockComment(sql, i)
|
|
133
|
+
out += ' '
|
|
134
|
+
continue
|
|
135
|
+
}
|
|
136
|
+
const tag = dollarTagAt(sql, i)
|
|
137
|
+
if (tag !== null) {
|
|
138
|
+
const close = sql.indexOf(tag, i + tag.length)
|
|
139
|
+
const end = close === -1 ? sql.length : close + tag.length
|
|
140
|
+
out += sql.slice(i, end)
|
|
141
|
+
i = end
|
|
142
|
+
continue
|
|
143
|
+
}
|
|
144
|
+
if (c === "'" || c === '"') {
|
|
145
|
+
const end = consumeQuoted(sql, i, c, c === "'" && isEscapeString(sql, i))
|
|
146
|
+
out += sql.slice(i, end)
|
|
147
|
+
i = end
|
|
148
|
+
continue
|
|
149
|
+
}
|
|
150
|
+
out += c
|
|
151
|
+
i++
|
|
152
|
+
}
|
|
153
|
+
return out
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Replaces the *contents* of `'…'` string literals with spaces, keeping the
|
|
158
|
+
* quotes and the overall length.
|
|
159
|
+
*
|
|
160
|
+
* A string literal in a migration is data — `INSERT INTO notes VALUES
|
|
161
|
+
* ('a; DROP TABLE x')` drops nothing. Matching hazard rules against literal
|
|
162
|
+
* text raises a hazard for inert seed data, and no amount of pattern-tuning
|
|
163
|
+
* fixes that, because "is this text dangerous" is not answerable from the
|
|
164
|
+
* text. What makes a literal dangerous is `EXECUTE` running it, which is a
|
|
165
|
+
* structural fact and gets its own rule.
|
|
166
|
+
*
|
|
167
|
+
* Dollar-quoted bodies are deliberately NOT blanked: `DO $$ BEGIN DROP TABLE
|
|
168
|
+
* x; END $$` is code, and it executes during the migration.
|
|
169
|
+
*/
|
|
170
|
+
export function blankLiterals(sql: string): string {
|
|
171
|
+
let out = ''
|
|
172
|
+
let i = 0
|
|
173
|
+
while (i < sql.length) {
|
|
174
|
+
const c = sql[i]!
|
|
175
|
+
const next = sql[i + 1]
|
|
176
|
+
|
|
177
|
+
if (c === '-' && next === '-') {
|
|
178
|
+
const nl = sql.indexOf('\n', i)
|
|
179
|
+
const end = nl === -1 ? sql.length : nl
|
|
180
|
+
out += sql.slice(i, end)
|
|
181
|
+
i = end
|
|
182
|
+
continue
|
|
183
|
+
}
|
|
184
|
+
if (c === '/' && next === '*') {
|
|
185
|
+
const end = skipBlockComment(sql, i)
|
|
186
|
+
out += sql.slice(i, end)
|
|
187
|
+
i = end
|
|
188
|
+
continue
|
|
189
|
+
}
|
|
190
|
+
const tag = dollarTagAt(sql, i)
|
|
191
|
+
if (tag !== null) {
|
|
192
|
+
// A dollar-quoted body is code, so it is kept — but the literals inside
|
|
193
|
+
// that code are still data, so recurse rather than copying it whole.
|
|
194
|
+
// `DO $$ BEGIN DROP TABLE x; END $$` must keep its DROP TABLE, while
|
|
195
|
+
// `DO $$ BEGIN EXECUTE 'DROP TABLE x'; END $$` must lose it and be
|
|
196
|
+
// caught by the EXECUTE rule instead.
|
|
197
|
+
const close = sql.indexOf(tag, i + tag.length)
|
|
198
|
+
const end = close === -1 ? sql.length : close + tag.length
|
|
199
|
+
const inner = sql.slice(i + tag.length, close === -1 ? sql.length : close)
|
|
200
|
+
out += tag + blankLiterals(inner) + (close === -1 ? '' : tag)
|
|
201
|
+
i = end
|
|
202
|
+
continue
|
|
203
|
+
}
|
|
204
|
+
if (c === "'") {
|
|
205
|
+
const end = consumeQuoted(sql, i, "'", isEscapeString(sql, i))
|
|
206
|
+
const body = sql.slice(i + 1, Math.max(i + 1, end - 1))
|
|
207
|
+
out += "'" + body.replace(/[^\n]/g, ' ') + (end - i >= 2 ? "'" : '')
|
|
208
|
+
i = end
|
|
209
|
+
continue
|
|
210
|
+
}
|
|
211
|
+
if (c === '"') {
|
|
212
|
+
const end = consumeQuoted(sql, i, '"', false)
|
|
213
|
+
out += sql.slice(i, end)
|
|
214
|
+
i = end
|
|
215
|
+
continue
|
|
216
|
+
}
|
|
217
|
+
out += c
|
|
218
|
+
i++
|
|
219
|
+
}
|
|
220
|
+
return out
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Index of the first character of actual SQL in `sql` — i.e. past any leading
|
|
225
|
+
* whitespace and comments. Lets a text rewriter skip a leading comment block
|
|
226
|
+
* without rewriting words inside it.
|
|
227
|
+
*/
|
|
228
|
+
export function codeStartOffset(sql: string): number {
|
|
229
|
+
let i = 0
|
|
230
|
+
while (i < sql.length) {
|
|
231
|
+
const c = sql[i]!
|
|
232
|
+
if (/\s/.test(c)) {
|
|
233
|
+
i++
|
|
234
|
+
continue
|
|
235
|
+
}
|
|
236
|
+
if (c === '-' && sql[i + 1] === '-') {
|
|
237
|
+
const nl = sql.indexOf('\n', i)
|
|
238
|
+
i = nl === -1 ? sql.length : nl
|
|
239
|
+
continue
|
|
240
|
+
}
|
|
241
|
+
if (c === '/' && sql[i + 1] === '*') {
|
|
242
|
+
i = skipBlockComment(sql, i)
|
|
243
|
+
continue
|
|
244
|
+
}
|
|
245
|
+
return i
|
|
246
|
+
}
|
|
247
|
+
return sql.length
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** `start` indexes the opening `/*`. Returns the index just past the matching close. */
|
|
251
|
+
function skipBlockComment(sql: string, start: number): number {
|
|
252
|
+
let depth = 0
|
|
253
|
+
let i = start
|
|
254
|
+
while (i < sql.length) {
|
|
255
|
+
if (sql[i] === '/' && sql[i + 1] === '*') {
|
|
256
|
+
depth++
|
|
257
|
+
i += 2
|
|
258
|
+
continue
|
|
259
|
+
}
|
|
260
|
+
if (sql[i] === '*' && sql[i + 1] === '/') {
|
|
261
|
+
depth--
|
|
262
|
+
i += 2
|
|
263
|
+
if (depth === 0) return i
|
|
264
|
+
continue
|
|
265
|
+
}
|
|
266
|
+
i++
|
|
267
|
+
}
|
|
268
|
+
return sql.length
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Returns the dollar-quote tag opening at `i` (`$$`, `$body$`), or null.
|
|
273
|
+
* Tags may not start with a digit, which is what keeps `$1` positional
|
|
274
|
+
* parameters from being read as the start of a quoted body.
|
|
275
|
+
*/
|
|
276
|
+
function dollarTagAt(sql: string, i: number): string | null {
|
|
277
|
+
if (sql[i] !== '$') return null
|
|
278
|
+
let j = i + 1
|
|
279
|
+
while (j < sql.length && IDENT_CHAR.test(sql[j]!)) j++
|
|
280
|
+
if (sql[j] !== '$') return null
|
|
281
|
+
if (/[0-9]/.test(sql[i + 1] ?? '')) return null
|
|
282
|
+
return sql.slice(i, j + 1)
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/** True when the quote at `i` opens an `E''` escape string. */
|
|
286
|
+
function isEscapeString(sql: string, i: number): boolean {
|
|
287
|
+
const prev = sql[i - 1]
|
|
288
|
+
if (prev !== 'e' && prev !== 'E') return false
|
|
289
|
+
const before = sql[i - 2]
|
|
290
|
+
return before === undefined || !IDENT_CHAR.test(before)
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** Returns the index just past the closing quote, or end of input if unterminated. */
|
|
294
|
+
function consumeQuoted(sql: string, start: number, quote: string, backslashEscapes: boolean): number {
|
|
295
|
+
let i = start + 1
|
|
296
|
+
while (i < sql.length) {
|
|
297
|
+
const c = sql[i]!
|
|
298
|
+
if (backslashEscapes && c === '\\') {
|
|
299
|
+
i += 2
|
|
300
|
+
continue
|
|
301
|
+
}
|
|
302
|
+
if (c === quote) {
|
|
303
|
+
if (sql[i + 1] === quote) {
|
|
304
|
+
i += 2
|
|
305
|
+
continue
|
|
306
|
+
}
|
|
307
|
+
return i + 1
|
|
308
|
+
}
|
|
309
|
+
i++
|
|
310
|
+
}
|
|
311
|
+
return sql.length
|
|
312
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { AnyColumn } from './column.js';
|
|
2
|
+
import { Column } from './column.js';
|
|
3
|
+
import { entityKind, is } from './entity.js';
|
|
4
|
+
import type { Relation } from './relations.js';
|
|
5
|
+
import type { View } from './sql/sql.js';
|
|
6
|
+
import { SQL, sql } from './sql/sql.js';
|
|
7
|
+
import { Table } from './table.js';
|
|
8
|
+
import { ViewBaseConfig } from './view-common.js';
|
|
9
|
+
|
|
10
|
+
export class ColumnAliasProxyHandler<TColumn extends Column> implements ProxyHandler<TColumn> {
|
|
11
|
+
static readonly [entityKind]: string = 'ColumnAliasProxyHandler';
|
|
12
|
+
|
|
13
|
+
constructor(private table: Table | View) {}
|
|
14
|
+
|
|
15
|
+
get(columnObj: TColumn, prop: string | symbol): any {
|
|
16
|
+
if (prop === 'table') {
|
|
17
|
+
return this.table;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return columnObj[prop as keyof TColumn];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class TableAliasProxyHandler<T extends Table | View> implements ProxyHandler<T> {
|
|
25
|
+
static readonly [entityKind]: string = 'TableAliasProxyHandler';
|
|
26
|
+
|
|
27
|
+
constructor(private alias: string, private replaceOriginalName: boolean) {}
|
|
28
|
+
|
|
29
|
+
get(target: T, prop: string | symbol): any {
|
|
30
|
+
if (prop === Table.Symbol.IsAlias) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (prop === Table.Symbol.Name) {
|
|
35
|
+
return this.alias;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {
|
|
39
|
+
return this.alias;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (prop === ViewBaseConfig) {
|
|
43
|
+
return {
|
|
44
|
+
...target[ViewBaseConfig as keyof typeof target],
|
|
45
|
+
name: this.alias,
|
|
46
|
+
isAlias: true,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (prop === Table.Symbol.Columns) {
|
|
51
|
+
const columns = (target as Table)[Table.Symbol.Columns];
|
|
52
|
+
if (!columns) {
|
|
53
|
+
return columns;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const proxiedColumns: { [key: string]: any } = {};
|
|
57
|
+
|
|
58
|
+
Object.keys(columns).map((key) => {
|
|
59
|
+
proxiedColumns[key] = new Proxy(
|
|
60
|
+
columns[key]!,
|
|
61
|
+
new ColumnAliasProxyHandler(new Proxy(target, this)),
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return proxiedColumns;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const value = target[prop as keyof typeof target];
|
|
69
|
+
if (is(value, Column)) {
|
|
70
|
+
return new Proxy(value as AnyColumn, new ColumnAliasProxyHandler(new Proxy(target, this)));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export class RelationTableAliasProxyHandler<T extends Relation> implements ProxyHandler<T> {
|
|
78
|
+
static readonly [entityKind]: string = 'RelationTableAliasProxyHandler';
|
|
79
|
+
|
|
80
|
+
constructor(private alias: string) {}
|
|
81
|
+
|
|
82
|
+
get(target: T, prop: string | symbol): any {
|
|
83
|
+
if (prop === 'sourceTable') {
|
|
84
|
+
return aliasedTable(target.sourceTable, this.alias);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return target[prop as keyof typeof target];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function aliasedTable<T extends Table | View>(
|
|
92
|
+
table: T,
|
|
93
|
+
tableAlias: string,
|
|
94
|
+
): T {
|
|
95
|
+
return new Proxy(table, new TableAliasProxyHandler(tableAlias, false)) as any;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function aliasedRelation<T extends Relation>(relation: T, tableAlias: string): T {
|
|
99
|
+
return new Proxy(relation, new RelationTableAliasProxyHandler(tableAlias));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function aliasedTableColumn<T extends AnyColumn>(column: T, tableAlias: string): T {
|
|
103
|
+
return new Proxy(
|
|
104
|
+
column,
|
|
105
|
+
new ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false))),
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function mapColumnsInAliasedSQLToAlias(query: SQL.Aliased, alias: string): SQL.Aliased {
|
|
110
|
+
return new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function mapColumnsInSQLToAlias(query: SQL, alias: string): SQL {
|
|
114
|
+
return sql.join(query.queryChunks.map((c) => {
|
|
115
|
+
if (is(c, Column)) {
|
|
116
|
+
return aliasedTableColumn(c, alias);
|
|
117
|
+
}
|
|
118
|
+
if (is(c, SQL)) {
|
|
119
|
+
return mapColumnsInSQLToAlias(c, alias);
|
|
120
|
+
}
|
|
121
|
+
if (is(c, SQL.Aliased)) {
|
|
122
|
+
return mapColumnsInAliasedSQLToAlias(c, alias);
|
|
123
|
+
}
|
|
124
|
+
return c;
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Dialect } from './column-builder.js';
|
|
2
|
+
import type { RunnableQuery } from './runnable-query.js';
|
|
3
|
+
|
|
4
|
+
export type BatchItem<TDialect extends Dialect = Dialect> = RunnableQuery<any, TDialect>;
|
|
5
|
+
|
|
6
|
+
export type BatchResponse<T extends BatchItem[] | readonly BatchItem[]> = {
|
|
7
|
+
[K in keyof T]: T[K]['_']['result'];
|
|
8
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { entityKind } from '../../entity.js';
|
|
2
|
+
import type { Table } from '../../index.js';
|
|
3
|
+
import type { CacheConfig } from './types.js';
|
|
4
|
+
|
|
5
|
+
export abstract class Cache {
|
|
6
|
+
static readonly [entityKind]: string = 'Cache';
|
|
7
|
+
|
|
8
|
+
abstract strategy(): 'explicit' | 'all';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Invoked if we should check cache for cached response
|
|
12
|
+
* @param sql
|
|
13
|
+
* @param tables
|
|
14
|
+
*/
|
|
15
|
+
abstract get(
|
|
16
|
+
key: string,
|
|
17
|
+
tables: string[],
|
|
18
|
+
isTag: boolean,
|
|
19
|
+
isAutoInvalidate?: boolean,
|
|
20
|
+
): Promise<any[] | undefined>;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Invoked if new query should be inserted to cache
|
|
24
|
+
* @param sql
|
|
25
|
+
* @param tables
|
|
26
|
+
*/
|
|
27
|
+
abstract put(
|
|
28
|
+
hashedQuery: string,
|
|
29
|
+
response: any,
|
|
30
|
+
tables: string[],
|
|
31
|
+
isTag: boolean,
|
|
32
|
+
config?: CacheConfig,
|
|
33
|
+
): Promise<void>;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Invoked if insert, update, delete was invoked
|
|
37
|
+
* @param tables
|
|
38
|
+
*/
|
|
39
|
+
abstract onMutate(
|
|
40
|
+
params: MutationOption,
|
|
41
|
+
): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export class NoopCache extends Cache {
|
|
45
|
+
override strategy() {
|
|
46
|
+
return 'all' as const;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static override readonly [entityKind]: string = 'NoopCache';
|
|
50
|
+
|
|
51
|
+
override async get(_key: string): Promise<any[] | undefined> {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
override async put(
|
|
55
|
+
_hashedQuery: string,
|
|
56
|
+
_response: any,
|
|
57
|
+
_tables: string[],
|
|
58
|
+
_config?: any,
|
|
59
|
+
): Promise<void> {
|
|
60
|
+
// noop
|
|
61
|
+
}
|
|
62
|
+
override async onMutate(_params: MutationOption): Promise<void> {
|
|
63
|
+
// noop
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export type MutationOption = { tags?: string | string[]; tables?: Table<any> | Table<any>[] | string | string[] };
|
|
68
|
+
|
|
69
|
+
export async function hashQuery(sql: string, params?: any[]) {
|
|
70
|
+
const dataToHash = `${sql}-${JSON.stringify(params)}`;
|
|
71
|
+
const encoder = new TextEncoder();
|
|
72
|
+
const data = encoder.encode(dataToHash);
|
|
73
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
|
|
74
|
+
const hashArray = [...new Uint8Array(hashBuffer)];
|
|
75
|
+
const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
76
|
+
|
|
77
|
+
return hashHex;
|
|
78
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './cache.js';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type CacheConfig = {
|
|
2
|
+
/**
|
|
3
|
+
* expire time, in seconds (a positive integer)
|
|
4
|
+
*/
|
|
5
|
+
ex?: number;
|
|
6
|
+
/**
|
|
7
|
+
* expire time, in milliseconds (a positive integer).
|
|
8
|
+
*/
|
|
9
|
+
px?: number;
|
|
10
|
+
/**
|
|
11
|
+
* Unix time at which the key will expire, in seconds (a positive integer).
|
|
12
|
+
*/
|
|
13
|
+
exat?: number;
|
|
14
|
+
/**
|
|
15
|
+
* Unix time at which the key will expire, in milliseconds (a positive integer)
|
|
16
|
+
*/
|
|
17
|
+
pxat?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Retain the time to live associated with the key.
|
|
20
|
+
*/
|
|
21
|
+
keepTtl?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Set an expiration (TTL or time to live) on one or more fields of a given hash key.
|
|
24
|
+
* Used for HEXPIRE command
|
|
25
|
+
*/
|
|
26
|
+
hexOptions?: 'NX' | 'nx' | 'XX' | 'xx' | 'GT' | 'gt' | 'LT' | 'lt';
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export type WithCacheConfig = { enable: boolean; config?: CacheConfig; tag?: string; autoInvalidate?: boolean };
|