pipework 0.1.0
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/LICENSE +21 -0
- package/README.md +128 -0
- package/bin/pipework.js +5 -0
- package/dist/audit/emit.d.ts +3 -0
- package/dist/audit/emit.d.ts.map +1 -0
- package/dist/audit/emit.js +66 -0
- package/dist/audit/emit.js.map +1 -0
- package/dist/audit/index.d.ts +3 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +2 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/namespace.d.ts +5 -0
- package/dist/audit/namespace.d.ts.map +1 -0
- package/dist/audit/namespace.js +5 -0
- package/dist/audit/namespace.js.map +1 -0
- package/dist/audit/types.d.ts +17 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +2 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/auth/chain.d.ts +21 -0
- package/dist/auth/chain.d.ts.map +1 -0
- package/dist/auth/chain.js +45 -0
- package/dist/auth/chain.js.map +1 -0
- package/dist/auth/cookie.d.ts +18 -0
- package/dist/auth/cookie.d.ts.map +1 -0
- package/dist/auth/cookie.js +55 -0
- package/dist/auth/cookie.js.map +1 -0
- package/dist/auth/index.d.ts +10 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/multi-org.d.ts +68 -0
- package/dist/auth/multi-org.d.ts.map +1 -0
- package/dist/auth/multi-org.js +163 -0
- package/dist/auth/multi-org.js.map +1 -0
- package/dist/auth/namespace.d.ts +14 -0
- package/dist/auth/namespace.d.ts.map +1 -0
- package/dist/auth/namespace.js +14 -0
- package/dist/auth/namespace.js.map +1 -0
- package/dist/auth/sessions.d.ts +64 -0
- package/dist/auth/sessions.d.ts.map +1 -0
- package/dist/auth/sessions.js +230 -0
- package/dist/auth/sessions.js.map +1 -0
- package/dist/auth/types.d.ts +14 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/behavior/audited.d.ts +5 -0
- package/dist/behavior/audited.d.ts.map +1 -0
- package/dist/behavior/audited.js +78 -0
- package/dist/behavior/audited.js.map +1 -0
- package/dist/behavior/cached.d.ts +7 -0
- package/dist/behavior/cached.d.ts.map +1 -0
- package/dist/behavior/cached.js +48 -0
- package/dist/behavior/cached.js.map +1 -0
- package/dist/behavior/compose.d.ts +4 -0
- package/dist/behavior/compose.d.ts.map +1 -0
- package/dist/behavior/compose.js +18 -0
- package/dist/behavior/compose.js.map +1 -0
- package/dist/behavior/index.d.ts +6 -0
- package/dist/behavior/index.d.ts.map +1 -0
- package/dist/behavior/index.js +5 -0
- package/dist/behavior/index.js.map +1 -0
- package/dist/behavior/namespace.d.ts +11 -0
- package/dist/behavior/namespace.d.ts.map +1 -0
- package/dist/behavior/namespace.js +11 -0
- package/dist/behavior/namespace.js.map +1 -0
- package/dist/behavior/types.d.ts +23 -0
- package/dist/behavior/types.d.ts.map +1 -0
- package/dist/behavior/types.js +2 -0
- package/dist/behavior/types.js.map +1 -0
- package/dist/behavior/versioned.d.ts +4 -0
- package/dist/behavior/versioned.d.ts.map +1 -0
- package/dist/behavior/versioned.js +39 -0
- package/dist/behavior/versioned.js.map +1 -0
- package/dist/cache/create.d.ts +3 -0
- package/dist/cache/create.d.ts.map +1 -0
- package/dist/cache/create.js +90 -0
- package/dist/cache/create.js.map +1 -0
- package/dist/cache/index.d.ts +5 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +3 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/namespace.d.ts +7 -0
- package/dist/cache/namespace.d.ts.map +1 -0
- package/dist/cache/namespace.js +7 -0
- package/dist/cache/namespace.js.map +1 -0
- package/dist/cache/tenant.d.ts +21 -0
- package/dist/cache/tenant.d.ts.map +1 -0
- package/dist/cache/tenant.js +101 -0
- package/dist/cache/tenant.js.map +1 -0
- package/dist/cache/types.d.ts +22 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +2 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/cli/commands/check.d.ts +2 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +28 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +7 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +19 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +33 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +7 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +45 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/errors.d.ts +2 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +11 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +84 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +10 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +16 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/load.d.ts +23 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +103 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/namespace.d.ts +38 -0
- package/dist/config/namespace.d.ts.map +1 -0
- package/dist/config/namespace.js +7 -0
- package/dist/config/namespace.js.map +1 -0
- package/dist/config/resolve.d.ts +8 -0
- package/dist/config/resolve.d.ts.map +1 -0
- package/dist/config/resolve.js +35 -0
- package/dist/config/resolve.js.map +1 -0
- package/dist/config/schema.d.ts +75 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +26 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/context/create.d.ts +20 -0
- package/dist/context/create.d.ts.map +1 -0
- package/dist/context/create.js +38 -0
- package/dist/context/create.js.map +1 -0
- package/dist/context/guard.d.ts +5 -0
- package/dist/context/guard.d.ts.map +1 -0
- package/dist/context/guard.js +30 -0
- package/dist/context/guard.js.map +1 -0
- package/dist/context/index.d.ts +5 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +4 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/store.d.ts +7 -0
- package/dist/context/store.d.ts.map +1 -0
- package/dist/context/store.js +18 -0
- package/dist/context/store.js.map +1 -0
- package/dist/context/types.d.ts +25 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +2 -0
- package/dist/context/types.js.map +1 -0
- package/dist/db/col/index.d.ts +2 -0
- package/dist/db/col/index.d.ts.map +1 -0
- package/dist/db/col/index.js +5 -0
- package/dist/db/col/index.js.map +1 -0
- package/dist/db/context.d.ts +4 -0
- package/dist/db/context.d.ts.map +1 -0
- package/dist/db/context.js +3 -0
- package/dist/db/context.js.map +1 -0
- package/dist/db/db.d.ts +6 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +50 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/filter.d.ts +46 -0
- package/dist/db/filter.d.ts.map +1 -0
- package/dist/db/filter.js +9 -0
- package/dist/db/filter.js.map +1 -0
- package/dist/db/generated/drizzle-orm/aggregate.d.ts +2 -0
- package/dist/db/generated/drizzle-orm/aggregate.d.ts.map +1 -0
- package/dist/db/generated/drizzle-orm/aggregate.js +5 -0
- package/dist/db/generated/drizzle-orm/aggregate.js.map +1 -0
- package/dist/db/generated/drizzle-orm/introspection.d.ts +2 -0
- package/dist/db/generated/drizzle-orm/introspection.d.ts.map +1 -0
- package/dist/db/generated/drizzle-orm/introspection.js +5 -0
- package/dist/db/generated/drizzle-orm/introspection.js.map +1 -0
- package/dist/db/generated/drizzle-orm/operator.d.ts +2 -0
- package/dist/db/generated/drizzle-orm/operator.d.ts.map +1 -0
- package/dist/db/generated/drizzle-orm/operator.js +5 -0
- package/dist/db/generated/drizzle-orm/operator.js.map +1 -0
- package/dist/db/generated/drizzle-orm/relation.d.ts +2 -0
- package/dist/db/generated/drizzle-orm/relation.d.ts.map +1 -0
- package/dist/db/generated/drizzle-orm/relation.js +5 -0
- package/dist/db/generated/drizzle-orm/relation.js.map +1 -0
- package/dist/db/generated/drizzle-orm/type.d.ts +3 -0
- package/dist/db/generated/drizzle-orm/type.d.ts.map +1 -0
- package/dist/db/generated/drizzle-orm/type.js +5 -0
- package/dist/db/generated/drizzle-orm/type.js.map +1 -0
- package/dist/db/generated/pg-core/introspection.d.ts +2 -0
- package/dist/db/generated/pg-core/introspection.d.ts.map +1 -0
- package/dist/db/generated/pg-core/introspection.js +5 -0
- package/dist/db/generated/pg-core/introspection.js.map +1 -0
- package/dist/db/generated/pg-core/set-operation.d.ts +2 -0
- package/dist/db/generated/pg-core/set-operation.d.ts.map +1 -0
- package/dist/db/generated/pg-core/set-operation.js +5 -0
- package/dist/db/generated/pg-core/set-operation.js.map +1 -0
- package/dist/db/generated/pg-core/type.d.ts +3 -0
- package/dist/db/generated/pg-core/type.d.ts.map +1 -0
- package/dist/db/generated/pg-core/type.js +5 -0
- package/dist/db/generated/pg-core/type.js.map +1 -0
- package/dist/db/identifiers.d.ts +3 -0
- package/dist/db/identifiers.d.ts.map +1 -0
- package/dist/db/identifiers.js +13 -0
- package/dist/db/identifiers.js.map +1 -0
- package/dist/db/idx/index.d.ts +2 -0
- package/dist/db/idx/index.d.ts.map +1 -0
- package/dist/db/idx/index.js +5 -0
- package/dist/db/idx/index.js.map +1 -0
- package/dist/db/index.d.ts +8 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +6 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/namespace.d.ts +66 -0
- package/dist/db/namespace.d.ts.map +1 -0
- package/dist/db/namespace.js +22 -0
- package/dist/db/namespace.js.map +1 -0
- package/dist/db/pool.d.ts +16 -0
- package/dist/db/pool.d.ts.map +1 -0
- package/dist/db/pool.js +36 -0
- package/dist/db/pool.js.map +1 -0
- package/dist/db/schema-features.d.ts +2 -0
- package/dist/db/schema-features.d.ts.map +1 -0
- package/dist/db/schema-features.js +4 -0
- package/dist/db/schema-features.js.map +1 -0
- package/dist/db/sql.d.ts +2 -0
- package/dist/db/sql.d.ts.map +1 -0
- package/dist/db/sql.js +2 -0
- package/dist/db/sql.js.map +1 -0
- package/dist/db/types.d.ts +7 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/di/builder.d.ts +60 -0
- package/dist/di/builder.d.ts.map +1 -0
- package/dist/di/builder.js +152 -0
- package/dist/di/builder.js.map +1 -0
- package/dist/di/index.d.ts +5 -0
- package/dist/di/index.d.ts.map +1 -0
- package/dist/di/index.js +5 -0
- package/dist/di/index.js.map +1 -0
- package/dist/di/resolve.d.ts +8 -0
- package/dist/di/resolve.d.ts.map +1 -0
- package/dist/di/resolve.js +76 -0
- package/dist/di/resolve.js.map +1 -0
- package/dist/di/types.d.ts +35 -0
- package/dist/di/types.d.ts.map +1 -0
- package/dist/di/types.js +2 -0
- package/dist/di/types.js.map +1 -0
- package/dist/drizzle/index.d.ts +3 -0
- package/dist/drizzle/index.d.ts.map +1 -0
- package/dist/drizzle/index.js +3 -0
- package/dist/drizzle/index.js.map +1 -0
- package/dist/errors/base.d.ts +7 -0
- package/dist/errors/base.d.ts.map +1 -0
- package/dist/errors/base.js +9 -0
- package/dist/errors/base.js.map +1 -0
- package/dist/errors/index.d.ts +3 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +3 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/namespace.d.ts +10 -0
- package/dist/errors/namespace.d.ts.map +1 -0
- package/dist/errors/namespace.js +10 -0
- package/dist/errors/namespace.js.map +1 -0
- package/dist/errors/types.d.ts +29 -0
- package/dist/errors/types.d.ts.map +1 -0
- package/dist/errors/types.js +46 -0
- package/dist/errors/types.js.map +1 -0
- package/dist/fitting/namespace.d.ts +5 -0
- package/dist/fitting/namespace.d.ts.map +1 -0
- package/dist/fitting/namespace.js +6 -0
- package/dist/fitting/namespace.js.map +1 -0
- package/dist/fixture/batch.d.ts +17 -0
- package/dist/fixture/batch.d.ts.map +1 -0
- package/dist/fixture/batch.js +47 -0
- package/dist/fixture/batch.js.map +1 -0
- package/dist/fixture/builder.d.ts +11 -0
- package/dist/fixture/builder.d.ts.map +1 -0
- package/dist/fixture/builder.js +12 -0
- package/dist/fixture/builder.js.map +1 -0
- package/dist/fixture/errors.d.ts +7 -0
- package/dist/fixture/errors.d.ts.map +1 -0
- package/dist/fixture/errors.js +9 -0
- package/dist/fixture/errors.js.map +1 -0
- package/dist/fixture/index.d.ts +9 -0
- package/dist/fixture/index.d.ts.map +1 -0
- package/dist/fixture/index.js +6 -0
- package/dist/fixture/index.js.map +1 -0
- package/dist/fixture/namespace.d.ts +15 -0
- package/dist/fixture/namespace.d.ts.map +1 -0
- package/dist/fixture/namespace.js +15 -0
- package/dist/fixture/namespace.js.map +1 -0
- package/dist/fixture/paginate.d.ts +13 -0
- package/dist/fixture/paginate.d.ts.map +1 -0
- package/dist/fixture/paginate.js +29 -0
- package/dist/fixture/paginate.js.map +1 -0
- package/dist/fixture/register.d.ts +16 -0
- package/dist/fixture/register.d.ts.map +1 -0
- package/dist/fixture/register.js +181 -0
- package/dist/fixture/register.js.map +1 -0
- package/dist/fixture/types.d.ts +69 -0
- package/dist/fixture/types.d.ts.map +1 -0
- package/dist/fixture/types.js +2 -0
- package/dist/fixture/types.js.map +1 -0
- package/dist/flow/namespace.d.ts +14 -0
- package/dist/flow/namespace.d.ts.map +1 -0
- package/dist/flow/namespace.js +14 -0
- package/dist/flow/namespace.js.map +1 -0
- package/dist/http/index.d.ts +4 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +3 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/middleware.d.ts +20 -0
- package/dist/http/middleware.d.ts.map +1 -0
- package/dist/http/middleware.js +62 -0
- package/dist/http/middleware.js.map +1 -0
- package/dist/http/namespace.d.ts +5 -0
- package/dist/http/namespace.d.ts.map +1 -0
- package/dist/http/namespace.js +5 -0
- package/dist/http/namespace.js.map +1 -0
- package/dist/http/response.d.ts +5 -0
- package/dist/http/response.d.ts.map +1 -0
- package/dist/http/response.js +22 -0
- package/dist/http/response.js.map +1 -0
- package/dist/http/server.d.ts +15 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +362 -0
- package/dist/http/server.js.map +1 -0
- package/dist/http/types.d.ts +116 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +2 -0
- package/dist/http/types.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/invariants/assert.d.ts +7 -0
- package/dist/invariants/assert.d.ts.map +1 -0
- package/dist/invariants/assert.js +21 -0
- package/dist/invariants/assert.js.map +1 -0
- package/dist/invariants/index.d.ts +2 -0
- package/dist/invariants/index.d.ts.map +1 -0
- package/dist/invariants/index.js +2 -0
- package/dist/invariants/index.js.map +1 -0
- package/dist/jobs/cron.d.ts +10 -0
- package/dist/jobs/cron.d.ts.map +1 -0
- package/dist/jobs/cron.js +176 -0
- package/dist/jobs/cron.js.map +1 -0
- package/dist/jobs/execute.d.ts +12 -0
- package/dist/jobs/execute.d.ts.map +1 -0
- package/dist/jobs/execute.js +19 -0
- package/dist/jobs/execute.js.map +1 -0
- package/dist/jobs/index.d.ts +8 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +4 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/listener.d.ts +32 -0
- package/dist/jobs/listener.d.ts.map +1 -0
- package/dist/jobs/listener.js +95 -0
- package/dist/jobs/listener.js.map +1 -0
- package/dist/jobs/namespace.d.ts +10 -0
- package/dist/jobs/namespace.d.ts.map +1 -0
- package/dist/jobs/namespace.js +10 -0
- package/dist/jobs/namespace.js.map +1 -0
- package/dist/jobs/queue.d.ts +53 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +162 -0
- package/dist/jobs/queue.js.map +1 -0
- package/dist/jobs/scheduler.d.ts +31 -0
- package/dist/jobs/scheduler.d.ts.map +1 -0
- package/dist/jobs/scheduler.js +94 -0
- package/dist/jobs/scheduler.js.map +1 -0
- package/dist/lifecycle/drain.d.ts +7 -0
- package/dist/lifecycle/drain.d.ts.map +1 -0
- package/dist/lifecycle/drain.js +24 -0
- package/dist/lifecycle/drain.js.map +1 -0
- package/dist/lifecycle/health.d.ts +8 -0
- package/dist/lifecycle/health.d.ts.map +1 -0
- package/dist/lifecycle/health.js +62 -0
- package/dist/lifecycle/health.js.map +1 -0
- package/dist/lifecycle/index.d.ts +5 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/lifecycle/index.js +4 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/lifecycle/namespace.d.ts +5 -0
- package/dist/lifecycle/namespace.d.ts.map +1 -0
- package/dist/lifecycle/namespace.js +5 -0
- package/dist/lifecycle/namespace.js.map +1 -0
- package/dist/lifecycle/startup.d.ts +8 -0
- package/dist/lifecycle/startup.d.ts.map +1 -0
- package/dist/lifecycle/startup.js +43 -0
- package/dist/lifecycle/startup.js.map +1 -0
- package/dist/lifecycle/types.d.ts +30 -0
- package/dist/lifecycle/types.d.ts.map +1 -0
- package/dist/lifecycle/types.js +2 -0
- package/dist/lifecycle/types.js.map +1 -0
- package/dist/log/namespace.d.ts +9 -0
- package/dist/log/namespace.d.ts.map +1 -0
- package/dist/log/namespace.js +10 -0
- package/dist/log/namespace.js.map +1 -0
- package/dist/logging/context.d.ts +11 -0
- package/dist/logging/context.d.ts.map +1 -0
- package/dist/logging/context.js +46 -0
- package/dist/logging/context.js.map +1 -0
- package/dist/logging/index.d.ts +4 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +3 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +8 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +39 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/proxy.d.ts +3 -0
- package/dist/logging/proxy.d.ts.map +1 -0
- package/dist/logging/proxy.js +12 -0
- package/dist/logging/proxy.js.map +1 -0
- package/dist/logging/types.d.ts +36 -0
- package/dist/logging/types.d.ts.map +1 -0
- package/dist/logging/types.js +2 -0
- package/dist/logging/types.js.map +1 -0
- package/dist/migrate/index.d.ts +2 -0
- package/dist/migrate/index.d.ts.map +1 -0
- package/dist/migrate/index.js +2 -0
- package/dist/migrate/index.js.map +1 -0
- package/dist/migrate/run.d.ts +10 -0
- package/dist/migrate/run.d.ts.map +1 -0
- package/dist/migrate/run.js +45 -0
- package/dist/migrate/run.js.map +1 -0
- package/dist/openapi/generate.d.ts +13 -0
- package/dist/openapi/generate.d.ts.map +1 -0
- package/dist/openapi/generate.js +82 -0
- package/dist/openapi/generate.js.map +1 -0
- package/dist/openapi/index.d.ts +3 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +2 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/openapi/namespace.d.ts +5 -0
- package/dist/openapi/namespace.d.ts.map +1 -0
- package/dist/openapi/namespace.js +5 -0
- package/dist/openapi/namespace.js.map +1 -0
- package/dist/pipeline/define.d.ts +3 -0
- package/dist/pipeline/define.d.ts.map +1 -0
- package/dist/pipeline/define.js +44 -0
- package/dist/pipeline/define.js.map +1 -0
- package/dist/pipeline/errors.d.ts +17 -0
- package/dist/pipeline/errors.d.ts.map +1 -0
- package/dist/pipeline/errors.js +28 -0
- package/dist/pipeline/errors.js.map +1 -0
- package/dist/pipeline/execute.d.ts +4 -0
- package/dist/pipeline/execute.d.ts.map +1 -0
- package/dist/pipeline/execute.js +90 -0
- package/dist/pipeline/execute.js.map +1 -0
- package/dist/pipeline/index.d.ts +4 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +3 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/namespace.d.ts +8 -0
- package/dist/pipeline/namespace.d.ts.map +1 -0
- package/dist/pipeline/namespace.js +8 -0
- package/dist/pipeline/namespace.js.map +1 -0
- package/dist/pipeline/resume.d.ts +4 -0
- package/dist/pipeline/resume.d.ts.map +1 -0
- package/dist/pipeline/resume.js +100 -0
- package/dist/pipeline/resume.js.map +1 -0
- package/dist/pipeline/types.d.ts +50 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +2 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/pipework.d.ts +35 -0
- package/dist/pipework.d.ts.map +1 -0
- package/dist/pipework.js +102 -0
- package/dist/pipework.js.map +1 -0
- package/dist/rbac/cache.d.ts +13 -0
- package/dist/rbac/cache.d.ts.map +1 -0
- package/dist/rbac/cache.js +43 -0
- package/dist/rbac/cache.js.map +1 -0
- package/dist/rbac/check.d.ts +4 -0
- package/dist/rbac/check.d.ts.map +1 -0
- package/dist/rbac/check.js +20 -0
- package/dist/rbac/check.js.map +1 -0
- package/dist/rbac/index.d.ts +7 -0
- package/dist/rbac/index.d.ts.map +1 -0
- package/dist/rbac/index.js +31 -0
- package/dist/rbac/index.js.map +1 -0
- package/dist/rbac/middleware.d.ts +4 -0
- package/dist/rbac/middleware.d.ts.map +1 -0
- package/dist/rbac/middleware.js +9 -0
- package/dist/rbac/middleware.js.map +1 -0
- package/dist/rbac/namespace.d.ts +9 -0
- package/dist/rbac/namespace.d.ts.map +1 -0
- package/dist/rbac/namespace.js +9 -0
- package/dist/rbac/namespace.js.map +1 -0
- package/dist/rbac/resolve.d.ts +4 -0
- package/dist/rbac/resolve.d.ts.map +1 -0
- package/dist/rbac/resolve.js +24 -0
- package/dist/rbac/resolve.js.map +1 -0
- package/dist/rbac/seed.d.ts +4 -0
- package/dist/rbac/seed.d.ts.map +1 -0
- package/dist/rbac/seed.js +63 -0
- package/dist/rbac/seed.js.map +1 -0
- package/dist/rbac/types.d.ts +56 -0
- package/dist/rbac/types.d.ts.map +1 -0
- package/dist/rbac/types.js +2 -0
- package/dist/rbac/types.js.map +1 -0
- package/dist/resource/batch.d.ts +17 -0
- package/dist/resource/batch.d.ts.map +1 -0
- package/dist/resource/batch.js +47 -0
- package/dist/resource/batch.js.map +1 -0
- package/dist/resource/builder.d.ts +11 -0
- package/dist/resource/builder.d.ts.map +1 -0
- package/dist/resource/builder.js +12 -0
- package/dist/resource/builder.js.map +1 -0
- package/dist/resource/errors.d.ts +7 -0
- package/dist/resource/errors.d.ts.map +1 -0
- package/dist/resource/errors.js +9 -0
- package/dist/resource/errors.js.map +1 -0
- package/dist/resource/index.d.ts +9 -0
- package/dist/resource/index.d.ts.map +1 -0
- package/dist/resource/index.js +6 -0
- package/dist/resource/index.js.map +1 -0
- package/dist/resource/paginate.d.ts +13 -0
- package/dist/resource/paginate.d.ts.map +1 -0
- package/dist/resource/paginate.js +29 -0
- package/dist/resource/paginate.js.map +1 -0
- package/dist/resource/register.d.ts +16 -0
- package/dist/resource/register.d.ts.map +1 -0
- package/dist/resource/register.js +181 -0
- package/dist/resource/register.js.map +1 -0
- package/dist/resource/types.d.ts +69 -0
- package/dist/resource/types.d.ts.map +1 -0
- package/dist/resource/types.js +2 -0
- package/dist/resource/types.js.map +1 -0
- package/dist/schema/branded.d.ts +3 -0
- package/dist/schema/branded.d.ts.map +1 -0
- package/dist/schema/branded.js +8 -0
- package/dist/schema/branded.js.map +1 -0
- package/dist/schema/generated/coerce.d.ts +2 -0
- package/dist/schema/generated/coerce.d.ts.map +1 -0
- package/dist/schema/generated/coerce.js +5 -0
- package/dist/schema/generated/coerce.js.map +1 -0
- package/dist/schema/generated/combinator.d.ts +3 -0
- package/dist/schema/generated/combinator.d.ts.map +1 -0
- package/dist/schema/generated/combinator.js +5 -0
- package/dist/schema/generated/combinator.js.map +1 -0
- package/dist/schema/generated/encoding.d.ts +2 -0
- package/dist/schema/generated/encoding.d.ts.map +1 -0
- package/dist/schema/generated/encoding.js +5 -0
- package/dist/schema/generated/encoding.js.map +1 -0
- package/dist/schema/generated/error.d.ts +3 -0
- package/dist/schema/generated/error.d.ts.map +1 -0
- package/dist/schema/generated/error.js +5 -0
- package/dist/schema/generated/error.js.map +1 -0
- package/dist/schema/generated/format.d.ts +2 -0
- package/dist/schema/generated/format.d.ts.map +1 -0
- package/dist/schema/generated/format.js +5 -0
- package/dist/schema/generated/format.js.map +1 -0
- package/dist/schema/generated/type-constructor.d.ts +3 -0
- package/dist/schema/generated/type-constructor.d.ts.map +1 -0
- package/dist/schema/generated/type-constructor.js +5 -0
- package/dist/schema/generated/type-constructor.js.map +1 -0
- package/dist/schema/generated/type.d.ts +3 -0
- package/dist/schema/generated/type.d.ts.map +1 -0
- package/dist/schema/generated/type.js +5 -0
- package/dist/schema/generated/type.js.map +1 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +5 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/json-schema.d.ts +5 -0
- package/dist/schema/json-schema.d.ts.map +1 -0
- package/dist/schema/json-schema.js +5 -0
- package/dist/schema/json-schema.js.map +1 -0
- package/dist/schema/namespace.d.ts +128 -0
- package/dist/schema/namespace.d.ts.map +1 -0
- package/dist/schema/namespace.js +37 -0
- package/dist/schema/namespace.js.map +1 -0
- package/dist/schema/parse.d.ts +11 -0
- package/dist/schema/parse.d.ts.map +1 -0
- package/dist/schema/parse.js +30 -0
- package/dist/schema/parse.js.map +1 -0
- package/dist/schema/types.d.ts +4 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +2 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/state-machine/define.d.ts +3 -0
- package/dist/state-machine/define.d.ts.map +1 -0
- package/dist/state-machine/define.js +46 -0
- package/dist/state-machine/define.js.map +1 -0
- package/dist/state-machine/errors.d.ts +12 -0
- package/dist/state-machine/errors.d.ts.map +1 -0
- package/dist/state-machine/errors.js +19 -0
- package/dist/state-machine/errors.js.map +1 -0
- package/dist/state-machine/index.d.ts +4 -0
- package/dist/state-machine/index.d.ts.map +1 -0
- package/dist/state-machine/index.js +3 -0
- package/dist/state-machine/index.js.map +1 -0
- package/dist/state-machine/namespace.d.ts +8 -0
- package/dist/state-machine/namespace.d.ts.map +1 -0
- package/dist/state-machine/namespace.js +8 -0
- package/dist/state-machine/namespace.js.map +1 -0
- package/dist/state-machine/transition.d.ts +7 -0
- package/dist/state-machine/transition.d.ts.map +1 -0
- package/dist/state-machine/transition.js +57 -0
- package/dist/state-machine/transition.js.map +1 -0
- package/dist/state-machine/types.d.ts +33 -0
- package/dist/state-machine/types.d.ts.map +1 -0
- package/dist/state-machine/types.js +2 -0
- package/dist/state-machine/types.js.map +1 -0
- package/dist/temporal/close.d.ts +3 -0
- package/dist/temporal/close.d.ts.map +1 -0
- package/dist/temporal/close.js +19 -0
- package/dist/temporal/close.js.map +1 -0
- package/dist/temporal/columns.d.ts +7 -0
- package/dist/temporal/columns.d.ts.map +1 -0
- package/dist/temporal/columns.js +10 -0
- package/dist/temporal/columns.js.map +1 -0
- package/dist/temporal/errors.d.ts +7 -0
- package/dist/temporal/errors.d.ts.map +1 -0
- package/dist/temporal/errors.js +9 -0
- package/dist/temporal/errors.js.map +1 -0
- package/dist/temporal/get-current.d.ts +3 -0
- package/dist/temporal/get-current.d.ts.map +1 -0
- package/dist/temporal/get-current.js +18 -0
- package/dist/temporal/get-current.js.map +1 -0
- package/dist/temporal/index.d.ts +8 -0
- package/dist/temporal/index.d.ts.map +1 -0
- package/dist/temporal/index.js +7 -0
- package/dist/temporal/index.js.map +1 -0
- package/dist/temporal/namespace.d.ts +16 -0
- package/dist/temporal/namespace.d.ts.map +1 -0
- package/dist/temporal/namespace.js +16 -0
- package/dist/temporal/namespace.js.map +1 -0
- package/dist/temporal/query.d.ts +10 -0
- package/dist/temporal/query.d.ts.map +1 -0
- package/dist/temporal/query.js +11 -0
- package/dist/temporal/query.js.map +1 -0
- package/dist/temporal/revise.d.ts +3 -0
- package/dist/temporal/revise.d.ts.map +1 -0
- package/dist/temporal/revise.js +52 -0
- package/dist/temporal/revise.js.map +1 -0
- package/dist/temporal/types.d.ts +19 -0
- package/dist/temporal/types.d.ts.map +1 -0
- package/dist/temporal/types.js +2 -0
- package/dist/temporal/types.js.map +1 -0
- package/dist/tenant/extract.d.ts +6 -0
- package/dist/tenant/extract.d.ts.map +1 -0
- package/dist/tenant/extract.js +18 -0
- package/dist/tenant/extract.js.map +1 -0
- package/dist/tenant/index.d.ts +6 -0
- package/dist/tenant/index.d.ts.map +1 -0
- package/dist/tenant/index.js +5 -0
- package/dist/tenant/index.js.map +1 -0
- package/dist/tenant/namespace.d.ts +13 -0
- package/dist/tenant/namespace.d.ts.map +1 -0
- package/dist/tenant/namespace.js +13 -0
- package/dist/tenant/namespace.js.map +1 -0
- package/dist/tenant/propagate.d.ts +4 -0
- package/dist/tenant/propagate.d.ts.map +1 -0
- package/dist/tenant/propagate.js +15 -0
- package/dist/tenant/propagate.js.map +1 -0
- package/dist/tenant/rls.d.ts +5 -0
- package/dist/tenant/rls.d.ts.map +1 -0
- package/dist/tenant/rls.js +33 -0
- package/dist/tenant/rls.js.map +1 -0
- package/dist/tenant/types.d.ts +12 -0
- package/dist/tenant/types.d.ts.map +1 -0
- package/dist/tenant/types.js +2 -0
- package/dist/tenant/types.js.map +1 -0
- package/dist/tenant/validate.d.ts +4 -0
- package/dist/tenant/validate.d.ts.map +1 -0
- package/dist/tenant/validate.js +20 -0
- package/dist/tenant/validate.js.map +1 -0
- package/dist/test/auth.d.ts +7 -0
- package/dist/test/auth.d.ts.map +1 -0
- package/dist/test/auth.js +11 -0
- package/dist/test/auth.js.map +1 -0
- package/dist/test/context.d.ts +10 -0
- package/dist/test/context.d.ts.map +1 -0
- package/dist/test/context.js +26 -0
- package/dist/test/context.js.map +1 -0
- package/dist/test/index.d.ts +6 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +6 -0
- package/dist/test/index.js.map +1 -0
- package/dist/test/plugin.d.ts +16 -0
- package/dist/test/plugin.d.ts.map +1 -0
- package/dist/test/plugin.js +63 -0
- package/dist/test/plugin.js.map +1 -0
- package/dist/test/setup.d.ts +11 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +76 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/test/vitest.d.ts +9 -0
- package/dist/test/vitest.d.ts.map +1 -0
- package/dist/test/vitest.js +58 -0
- package/dist/test/vitest.js.map +1 -0
- package/dist/trunk.d.ts +35 -0
- package/dist/trunk.d.ts.map +1 -0
- package/dist/trunk.js +102 -0
- package/dist/trunk.js.map +1 -0
- package/dist/vector/index.d.ts +4 -0
- package/dist/vector/index.d.ts.map +1 -0
- package/dist/vector/index.js +4 -0
- package/dist/vector/index.js.map +1 -0
- package/dist/vector/namespace.d.ts +16 -0
- package/dist/vector/namespace.d.ts.map +1 -0
- package/dist/vector/namespace.js +16 -0
- package/dist/vector/namespace.js.map +1 -0
- package/dist/vector/query.d.ts +9 -0
- package/dist/vector/query.d.ts.map +1 -0
- package/dist/vector/query.js +33 -0
- package/dist/vector/query.js.map +1 -0
- package/dist/vector/types.d.ts +19 -0
- package/dist/vector/types.d.ts.map +1 -0
- package/dist/vector/types.js +26 -0
- package/dist/vector/types.js.map +1 -0
- package/dist/vector/validate.d.ts +3 -0
- package/dist/vector/validate.d.ts.map +1 -0
- package/dist/vector/validate.js +10 -0
- package/dist/vector/validate.js.map +1 -0
- package/package.json +138 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 The Constructory
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Pipework
|
|
2
|
+
|
|
3
|
+
A TypeScript framework for multi-tenant SaaS applications. PostgreSQL-only. Owns the wiring between Drizzle, Fastify, Vitest, and Zod so your application code never has to.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
Pipework eliminates the infrastructure decisions that every SaaS backend makes independently and gets wrong:
|
|
8
|
+
|
|
9
|
+
- **Database wiring** — named connections, pooling, context-aware `pipe()` accessor, test isolation
|
|
10
|
+
- **Request context** — AsyncLocalStorage propagation of auth, tenant, transactions from HTTP entry to database query
|
|
11
|
+
- **DI builder** — type-safe handler composition with `.use()`, `.auth()`, `.input()`, `.output()`, `.route()`, `.fit()`
|
|
12
|
+
- **Multi-tenant scoping** — `SET LOCAL` propagation, tenant extraction from auth, UUID validation
|
|
13
|
+
- **Auth chain** — pluggable strategies, enrichers, session management with JWT refresh rotation, cookie-based token delivery
|
|
14
|
+
- **Multi-org auth** — org selection on login, org switching, membership management via `auth.createMultiOrg()`
|
|
15
|
+
- **RBAC** — hierarchical scope resolution, permission caching, DI integration via `.permission()`
|
|
16
|
+
- **Background jobs** — Postgres-backed queue with `SKIP LOCKED`, heartbeat, reaper, `LISTEN/NOTIFY`, synchronous wait (`jobs.enqueueAndWait`)
|
|
17
|
+
- **Cron scheduling** — recurring jobs with cron expressions, dedup, catch-up on missed ticks
|
|
18
|
+
- **Temporal records** — SCD Type 2 versioning with atomic `temporal.revise()`, point-in-time queries
|
|
19
|
+
- **Resource CRUD** — `fixture` builder with cursor-based pagination, batch operations (preview + execute), auth, tenant scoping, 404/405
|
|
20
|
+
- **Composable behaviors** — `behavior.compose()` to stack versioned + audited + cached on any resource
|
|
21
|
+
- **State machines** — validated transitions with guards and audit integration
|
|
22
|
+
- **Pipelines** — ordered sync/async step execution with persistent state and resume
|
|
23
|
+
- **HTTP security** — CORS, Helmet, rate limiting via `http.createServer()`, production startup validation (refuses insecure defaults)
|
|
24
|
+
- **Structured logging** — context-aware `log` proxy with automatic correlation fields (requestId, tenantId, userId, sessionId, traceId, jobType), configurable redaction, `X-Request-Id` response header
|
|
25
|
+
- **OpenAPI** — automatic schema generation from handler metadata, served at `/openapi.json`
|
|
26
|
+
|
|
27
|
+
## Quick example
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { createPipework, http, pipe, fitting, schema } from 'pipework'
|
|
31
|
+
|
|
32
|
+
const instance = createPipework({
|
|
33
|
+
databases: { app: { url: 'DATABASE_URL', testUrl: 'DATABASE_URL_TEST' } },
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
const createNote = fitting
|
|
37
|
+
.use('app')
|
|
38
|
+
.auth<{ userId: string; tenantId: string }>()
|
|
39
|
+
.input(schema.object({ title: schema.string(), body: schema.string() }))
|
|
40
|
+
.route('POST', '/notes')
|
|
41
|
+
.fit(async ({ app, auth, input }) => {
|
|
42
|
+
const [note] = await app
|
|
43
|
+
.insert(notes)
|
|
44
|
+
.values({ ...input, tenantId: auth.tenantId })
|
|
45
|
+
.returning()
|
|
46
|
+
return note
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
const server = http.createServer(instance, {
|
|
50
|
+
auth: { strategy: myAuthStrategy },
|
|
51
|
+
tenant: { extract: (auth) => auth.tenantId },
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
server.registerHandlers([createNote])
|
|
55
|
+
await server.listen()
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Install
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pnpm add pipework
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Includes `drizzle-orm`, `postgres`, `zod`, and `fastify` — no additional dependencies needed.
|
|
65
|
+
|
|
66
|
+
Database operations, schema builders, and validation are all accessed through pipework's namespaces:
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
import { pipe, schema } from 'pipework'
|
|
70
|
+
|
|
71
|
+
// Database: table definitions, SQL, operators
|
|
72
|
+
const users = pipe.table('users', {
|
|
73
|
+
id: pipe.col.uuid('id').primaryKey().defaultRandom(),
|
|
74
|
+
name: pipe.col.text('name').notNull(),
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
// Validation
|
|
78
|
+
const input = schema.object({ name: schema.string().min(1) })
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Documentation
|
|
82
|
+
|
|
83
|
+
- **[Getting Started](docs/getting-started.md)** — zero to running server
|
|
84
|
+
- **Guides**
|
|
85
|
+
- [Configuration](docs/guides/configuration.md)
|
|
86
|
+
- [DI Builder & Handlers](docs/guides/handlers.md)
|
|
87
|
+
- [Authentication & Tenants](docs/guides/auth-and-tenants.md)
|
|
88
|
+
- [Background Jobs](docs/guides/jobs.md)
|
|
89
|
+
- [Cron Scheduling](docs/guides/cron.md)
|
|
90
|
+
- [Temporal Records](docs/guides/temporal.md)
|
|
91
|
+
- [Resource CRUD](docs/guides/resources.md)
|
|
92
|
+
- [Caching](docs/guides/caching.md)
|
|
93
|
+
- [State Machines](docs/guides/state-machines.md)
|
|
94
|
+
- [Pipelines](docs/guides/pipelines.md)
|
|
95
|
+
- [pgvector & Search](docs/guides/vector.md)
|
|
96
|
+
- [RBAC](docs/guides/rbac.md)
|
|
97
|
+
- [Audit Trail](docs/guides/audit.md)
|
|
98
|
+
- [HTTP Security](docs/guides/security.md)
|
|
99
|
+
- [Logging](docs/guides/logging.md)
|
|
100
|
+
- [OpenAPI](docs/guides/openapi.md)
|
|
101
|
+
- [Testing](docs/guides/testing.md)
|
|
102
|
+
- [Error Handling](docs/guides/errors.md)
|
|
103
|
+
- **Recipes** — composing primitives for real use cases
|
|
104
|
+
- [Content Pipeline](docs/recipes/content-pipeline.md) — document lifecycle, versioning, chunking, embedding
|
|
105
|
+
- [Flexible Entities](docs/recipes/flexible-entities.md) — runtime-validated JSONB over fixed tables
|
|
106
|
+
- [Assertion Provenance](docs/recipes/assertion-provenance.md) — sourced claims, conflict detection, audit
|
|
107
|
+
|
|
108
|
+
## Design principles
|
|
109
|
+
|
|
110
|
+
1. **Resolution, not reimplementation.** Wraps Drizzle, Fastify, Vitest, and Zod. Doesn't replace them.
|
|
111
|
+
2. **Constraints over conventions.** If a rule can be enforced in code, it is.
|
|
112
|
+
3. **Fail at startup, not at first use.** Missing config throws immediately with what's wrong and how to fix it.
|
|
113
|
+
4. **PostgreSQL-only.** No database abstraction. Build deep on Postgres features.
|
|
114
|
+
5. **TypeScript strict mode.** `exactOptionalPropertyTypes`, `noUncheckedIndexedAccess` — all enabled.
|
|
115
|
+
|
|
116
|
+
## Tech stack
|
|
117
|
+
|
|
118
|
+
- **PostgreSQL** — the only supported database
|
|
119
|
+
- **postgres.js** — connection driver
|
|
120
|
+
- **Drizzle ORM** — schema-as-code, no binary runtime
|
|
121
|
+
- **Zod** — runtime validation with TypeScript inference
|
|
122
|
+
- **Fastify** — HTTP framework (wrapped, not replaced)
|
|
123
|
+
- **Vitest** — test runner
|
|
124
|
+
- **Pino** — structured logging
|
|
125
|
+
|
|
126
|
+
## License
|
|
127
|
+
|
|
128
|
+
MIT
|
package/bin/pipework.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/audit/emit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAoB,KAAK,EAAE,MAAM,YAAY,CAAA;AAItE,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAyEtD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { sql } from '../db/sql.js';
|
|
2
|
+
import { getContext } from '../context/store.js';
|
|
3
|
+
import { assertValidIdentifier, quoteIdentifier } from '../db/identifiers.js';
|
|
4
|
+
export function createAudit(config) {
|
|
5
|
+
const table = config.table ?? 'pipework_audit_events';
|
|
6
|
+
assertValidIdentifier(table, 'audit table');
|
|
7
|
+
return {
|
|
8
|
+
async emit(options) {
|
|
9
|
+
const ctx = getContext();
|
|
10
|
+
if (!ctx) {
|
|
11
|
+
throw new Error('[pipework] audit.emit() called outside a managed context. ' +
|
|
12
|
+
'It must run inside a request handler or job.');
|
|
13
|
+
}
|
|
14
|
+
if (ctx.tenant === null) {
|
|
15
|
+
throw new Error('[pipework] audit.emit() requires tenant context. ' +
|
|
16
|
+
'Configure tenant extraction in createServer().');
|
|
17
|
+
}
|
|
18
|
+
if (ctx.auth === null) {
|
|
19
|
+
throw new Error('[pipework] audit.emit() requires authenticated context. ' +
|
|
20
|
+
'Ensure the handler uses .auth() or the route is not .public().');
|
|
21
|
+
}
|
|
22
|
+
const userId = extractUserId(ctx.auth);
|
|
23
|
+
if (userId === null) {
|
|
24
|
+
throw new Error('[pipework] audit.emit() requires auth.userId. ' +
|
|
25
|
+
'Ensure the auth object has a userId field.');
|
|
26
|
+
}
|
|
27
|
+
const bound = ctx.transactions.get(config.database);
|
|
28
|
+
if (!bound) {
|
|
29
|
+
throw new Error(`[pipework] audit.emit() requires an active transaction on database "${config.database}". ` +
|
|
30
|
+
`Configure transactionPerRequest: ['${config.database}'] in createServer().`);
|
|
31
|
+
}
|
|
32
|
+
const tx = bound.drizzle;
|
|
33
|
+
const sessionId = config.sessionIdField !== undefined && typeof ctx.auth === 'object'
|
|
34
|
+
? ctx.auth[config.sessionIdField] ?? null
|
|
35
|
+
: null;
|
|
36
|
+
const beforeJson = options.before !== undefined ? JSON.stringify(options.before) : null;
|
|
37
|
+
const afterJson = options.after !== undefined ? JSON.stringify(options.after) : null;
|
|
38
|
+
const metadataJson = options.metadata !== undefined ? JSON.stringify(options.metadata) : null;
|
|
39
|
+
const result = await tx.execute(sql `
|
|
40
|
+
INSERT INTO ${sql.raw(quoteIdentifier(table, 'audit table'))} (tenant_id, request_id, user_id, session_id, action_type, entity_type, entity_id, before_state, after_state, metadata)
|
|
41
|
+
VALUES (
|
|
42
|
+
${ctx.tenant},
|
|
43
|
+
${ctx.requestId},
|
|
44
|
+
${userId},
|
|
45
|
+
${sessionId ?? null},
|
|
46
|
+
${options.actionType},
|
|
47
|
+
${options.entityType ?? null},
|
|
48
|
+
${options.entityId ?? null},
|
|
49
|
+
${beforeJson !== null ? sql `${beforeJson}::jsonb` : sql `NULL`},
|
|
50
|
+
${afterJson !== null ? sql `${afterJson}::jsonb` : sql `NULL`},
|
|
51
|
+
${metadataJson !== null ? sql `${metadataJson}::jsonb` : sql `NULL`}
|
|
52
|
+
)
|
|
53
|
+
RETURNING id::text
|
|
54
|
+
`);
|
|
55
|
+
return result[0].id;
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function extractUserId(auth) {
|
|
60
|
+
if (auth !== null && auth !== undefined && typeof auth === 'object' && 'userId' in auth) {
|
|
61
|
+
const val = auth.userId;
|
|
62
|
+
return typeof val === 'string' ? val : null;
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=emit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/audit/emit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/audit/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,eAAO,MAAM,KAAK;;CAEjB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/audit/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,MAAM,EAAE,WAAW;CACpB,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface AuditConfig {
|
|
2
|
+
readonly database: string;
|
|
3
|
+
readonly table?: string;
|
|
4
|
+
readonly sessionIdField?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface AuditEmitOptions {
|
|
7
|
+
readonly actionType: string;
|
|
8
|
+
readonly entityType?: string;
|
|
9
|
+
readonly entityId?: string;
|
|
10
|
+
readonly before?: unknown;
|
|
11
|
+
readonly after?: unknown;
|
|
12
|
+
readonly metadata?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export interface Audit {
|
|
15
|
+
emit(options: AuditEmitOptions): Promise<string>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/audit/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC5C;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/audit/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AuthStrategy, AuthRequest } from './types.js';
|
|
2
|
+
export interface AuthEnricher<TAuth> {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
enrich(auth: TAuth): Promise<TAuth>;
|
|
5
|
+
}
|
|
6
|
+
export interface TenantResolver<TAuth> {
|
|
7
|
+
resolve(auth: TAuth): string;
|
|
8
|
+
}
|
|
9
|
+
export interface AuthChainConfig<TAuth> {
|
|
10
|
+
readonly strategies: readonly AuthStrategy<TAuth>[];
|
|
11
|
+
readonly enrichers?: readonly AuthEnricher<TAuth>[];
|
|
12
|
+
readonly tenantResolver?: TenantResolver<TAuth>;
|
|
13
|
+
}
|
|
14
|
+
export interface AuthChainResult<TAuth> {
|
|
15
|
+
readonly auth: TAuth | null;
|
|
16
|
+
readonly tenant: string | null;
|
|
17
|
+
}
|
|
18
|
+
export declare function runAuthChain<TAuth>(config: AuthChainConfig<TAuth>, request: AuthRequest, options: {
|
|
19
|
+
optional: boolean;
|
|
20
|
+
}): Promise<AuthChainResult<TAuth>>;
|
|
21
|
+
//# sourceMappingURL=chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/auth/chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG3D,MAAM,WAAW,YAAY,CAAC,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,cAAc,CAAC,KAAK;IACnC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,CAAC,KAAK,CAAC,EAAE,CAAA;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,YAAY,CAAC,KAAK,CAAC,EAAE,CAAA;IACnD,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAA;CAChD;AAED,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAED,wBAAsB,YAAY,CAAC,KAAK,EACtC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,EAC9B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAqCjC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { UnauthorizedError } from '../errors/index.js';
|
|
2
|
+
export async function runAuthChain(config, request, options) {
|
|
3
|
+
let extracted = null;
|
|
4
|
+
let matchedStrategy = null;
|
|
5
|
+
for (const strategy of config.strategies) {
|
|
6
|
+
extracted = await strategy.extract(request);
|
|
7
|
+
if (extracted !== null) {
|
|
8
|
+
matchedStrategy = strategy;
|
|
9
|
+
break;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
if (extracted === null) {
|
|
13
|
+
if (options.optional)
|
|
14
|
+
return { auth: null, tenant: null };
|
|
15
|
+
throw new UnauthorizedError();
|
|
16
|
+
}
|
|
17
|
+
let auth;
|
|
18
|
+
try {
|
|
19
|
+
auth = await matchedStrategy.verify(extracted);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (error instanceof UnauthorizedError)
|
|
23
|
+
throw error;
|
|
24
|
+
throw new UnauthorizedError('Authentication failed', {
|
|
25
|
+
strategy: matchedStrategy.name,
|
|
26
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (config.enrichers) {
|
|
30
|
+
for (const enricher of config.enrichers) {
|
|
31
|
+
auth = await enricher.enrich(auth);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const tenant = config.tenantResolver ? config.tenantResolver.resolve(auth) : extractTenant(auth);
|
|
35
|
+
return { auth, tenant };
|
|
36
|
+
}
|
|
37
|
+
function extractTenant(auth) {
|
|
38
|
+
if (auth !== null && typeof auth === 'object' && 'tenantId' in auth) {
|
|
39
|
+
const tenantId = auth.tenantId;
|
|
40
|
+
if (typeof tenantId === 'string')
|
|
41
|
+
return tenantId;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.js","sourceRoot":"","sources":["../../src/auth/chain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAsBtD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAA8B,EAC9B,OAAoB,EACpB,OAA8B;IAE9B,IAAI,SAAS,GAAiB,IAAI,CAAA;IAClC,IAAI,eAAe,GAA+B,IAAI,CAAA;IAEtD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACzC,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,eAAe,GAAG,QAAQ,CAAA;YAC1B,MAAK;QACP,CAAC;IACH,CAAC;IAED,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,QAAQ;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QACzD,MAAM,IAAI,iBAAiB,EAAE,CAAA;IAC/B,CAAC;IAED,IAAI,IAAW,CAAA;IACf,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,eAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,iBAAiB;YAAE,MAAM,KAAK,CAAA;QACnD,MAAM,IAAI,iBAAiB,CAAC,uBAAuB,EAAE;YACnD,QAAQ,EAAE,eAAgB,CAAC,IAAI;YAC/B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IAEhG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,IAAa;IAClC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACpE,MAAM,QAAQ,GAAI,IAA8B,CAAC,QAAQ,CAAA;QACzD,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAA;IACnD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface CookieConfig {
|
|
2
|
+
readonly name?: string;
|
|
3
|
+
readonly secure?: 'auto' | boolean;
|
|
4
|
+
readonly sameSite?: 'strict' | 'lax' | 'none';
|
|
5
|
+
readonly path?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ResolvedCookieConfig {
|
|
8
|
+
readonly name: string;
|
|
9
|
+
readonly secure: boolean;
|
|
10
|
+
readonly sameSite: string;
|
|
11
|
+
readonly path: string;
|
|
12
|
+
readonly httpOnly: true;
|
|
13
|
+
}
|
|
14
|
+
export declare function resolveCookieConfig(cookie: CookieConfig, env: string): ResolvedCookieConfig;
|
|
15
|
+
export declare function buildSetCookieHeader(resolved: ResolvedCookieConfig, value: string, maxAge: number): string;
|
|
16
|
+
export declare function buildClearCookieHeader(resolved: ResolvedCookieConfig): string;
|
|
17
|
+
export declare function parseCookieHeader(header: string | undefined, name: string): string | undefined;
|
|
18
|
+
//# sourceMappingURL=cookie.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../../src/auth/cookie.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAA;CACxB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAY3F;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAU1G;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAU7E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY9F"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export function resolveCookieConfig(cookie, env) {
|
|
2
|
+
const secure = cookie.secure === 'auto' || cookie.secure === undefined
|
|
3
|
+
? env === 'production'
|
|
4
|
+
: cookie.secure;
|
|
5
|
+
return {
|
|
6
|
+
name: cookie.name ?? '__pipework_refresh',
|
|
7
|
+
secure,
|
|
8
|
+
sameSite: cookie.sameSite ?? 'strict',
|
|
9
|
+
path: cookie.path ?? '/',
|
|
10
|
+
httpOnly: true,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function buildSetCookieHeader(resolved, value, maxAge) {
|
|
14
|
+
const parts = [
|
|
15
|
+
`${resolved.name}=${encodeURIComponent(value)}`,
|
|
16
|
+
`HttpOnly`,
|
|
17
|
+
`Path=${resolved.path}`,
|
|
18
|
+
`Max-Age=${maxAge}`,
|
|
19
|
+
`SameSite=${capitalize(resolved.sameSite)}`,
|
|
20
|
+
];
|
|
21
|
+
if (resolved.secure)
|
|
22
|
+
parts.push('Secure');
|
|
23
|
+
return parts.join('; ');
|
|
24
|
+
}
|
|
25
|
+
export function buildClearCookieHeader(resolved) {
|
|
26
|
+
const parts = [
|
|
27
|
+
`${resolved.name}=`,
|
|
28
|
+
`HttpOnly`,
|
|
29
|
+
`Path=${resolved.path}`,
|
|
30
|
+
`Max-Age=0`,
|
|
31
|
+
`SameSite=${capitalize(resolved.sameSite)}`,
|
|
32
|
+
];
|
|
33
|
+
if (resolved.secure)
|
|
34
|
+
parts.push('Secure');
|
|
35
|
+
return parts.join('; ');
|
|
36
|
+
}
|
|
37
|
+
export function parseCookieHeader(header, name) {
|
|
38
|
+
if (header === undefined)
|
|
39
|
+
return undefined;
|
|
40
|
+
for (const pair of header.split(';')) {
|
|
41
|
+
const trimmed = pair.trim();
|
|
42
|
+
const eqIdx = trimmed.indexOf('=');
|
|
43
|
+
if (eqIdx === -1)
|
|
44
|
+
continue;
|
|
45
|
+
const key = trimmed.slice(0, eqIdx).trim();
|
|
46
|
+
if (key === name) {
|
|
47
|
+
return decodeURIComponent(trimmed.slice(eqIdx + 1).trim());
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
function capitalize(s) {
|
|
53
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=cookie.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie.js","sourceRoot":"","sources":["../../src/auth/cookie.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,mBAAmB,CAAC,MAAoB,EAAE,GAAW;IACnE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QACpE,CAAC,CAAC,GAAG,KAAK,YAAY;QACtB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;IAEjB,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,oBAAoB;QACzC,MAAM;QACN,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,QAAQ;QACrC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG;QACxB,QAAQ,EAAE,IAAI;KACf,CAAA;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAA8B,EAAE,KAAa,EAAE,MAAc;IAChG,MAAM,KAAK,GAAG;QACZ,GAAG,QAAQ,CAAC,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;QAC/C,UAAU;QACV,QAAQ,QAAQ,CAAC,IAAI,EAAE;QACvB,WAAW,MAAM,EAAE;QACnB,YAAY,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;KAC5C,CAAA;IACD,IAAI,QAAQ,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA8B;IACnE,MAAM,KAAK,GAAG;QACZ,GAAG,QAAQ,CAAC,IAAI,GAAG;QACnB,UAAU;QACV,QAAQ,QAAQ,CAAC,IAAI,EAAE;QACvB,WAAW;QACX,YAAY,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;KAC5C,CAAA;IACD,IAAI,QAAQ,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAA0B,EAAE,IAAY;IACxE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,SAAQ;QAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;QAC1C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAC/C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type { AuthStrategy, AuthRequest, BaseAuth } from './types.js';
|
|
2
|
+
export { runAuthChain } from './chain.js';
|
|
3
|
+
export type { AuthEnricher, TenantResolver, AuthChainConfig, AuthChainResult } from './chain.js';
|
|
4
|
+
export { createSessions } from './sessions.js';
|
|
5
|
+
export type { Sessions, SessionConfig, TokenPair, TokenPayload, HttpTokenResult, HttpRequest, HttpResponse } from './sessions.js';
|
|
6
|
+
export type { CookieConfig, ResolvedCookieConfig } from './cookie.js';
|
|
7
|
+
export { resolveCookieConfig, buildSetCookieHeader, buildClearCookieHeader, parseCookieHeader } from './cookie.js';
|
|
8
|
+
export { createMultiOrgSessions } from './multi-org.js';
|
|
9
|
+
export type { MultiOrgConfig, MultiOrgSessions, ResolveLoginResult, AuthenticatedResult, OrgSelectResult, OrgMembership, OrgInfo, OrgMembershipDetail } from './multi-org.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjI,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAClH,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { runAuthChain } from './chain.js';
|
|
2
|
+
export { createSessions } from './sessions.js';
|
|
3
|
+
export { resolveCookieConfig, buildSetCookieHeader, buildClearCookieHeader, parseCookieHeader } from './cookie.js';
|
|
4
|
+
export { createMultiOrgSessions } from './multi-org.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAG9C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAClH,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { DB } from '../db/index.js';
|
|
2
|
+
import type { Sessions, HttpResponse, HttpRequest, HttpTokenResult } from './sessions.js';
|
|
3
|
+
export interface MultiOrgConfig {
|
|
4
|
+
readonly sessions: Sessions;
|
|
5
|
+
readonly signing: {
|
|
6
|
+
algorithm: 'ES256';
|
|
7
|
+
privateKey: string;
|
|
8
|
+
publicKey: string;
|
|
9
|
+
};
|
|
10
|
+
readonly issuer: string;
|
|
11
|
+
readonly audience: string;
|
|
12
|
+
readonly orgSelectToken?: {
|
|
13
|
+
readonly expiresIn?: string;
|
|
14
|
+
};
|
|
15
|
+
readonly table?: string;
|
|
16
|
+
readonly resolveOrgNames?: (db: DB, orgIds: string[]) => Promise<Map<string, string>>;
|
|
17
|
+
}
|
|
18
|
+
export interface OrgMembership {
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly orgId: string;
|
|
21
|
+
readonly role: string | null;
|
|
22
|
+
readonly joinedAt: Date;
|
|
23
|
+
}
|
|
24
|
+
export interface OrgInfo {
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly name: string;
|
|
27
|
+
}
|
|
28
|
+
export interface OrgMembershipDetail {
|
|
29
|
+
readonly id: string;
|
|
30
|
+
readonly name: string;
|
|
31
|
+
readonly role: string | null;
|
|
32
|
+
}
|
|
33
|
+
export interface AuthenticatedResult {
|
|
34
|
+
readonly type: 'authenticated';
|
|
35
|
+
readonly accessToken: string;
|
|
36
|
+
readonly expiresIn: number;
|
|
37
|
+
}
|
|
38
|
+
export interface OrgSelectResult {
|
|
39
|
+
readonly type: 'org_select';
|
|
40
|
+
readonly sessionToken: string;
|
|
41
|
+
readonly orgs: readonly OrgInfo[];
|
|
42
|
+
}
|
|
43
|
+
export type ResolveLoginResult = AuthenticatedResult | OrgSelectResult;
|
|
44
|
+
export interface MultiOrgSessions {
|
|
45
|
+
resolveLogin(response: HttpResponse, db: DB, user: {
|
|
46
|
+
id: string;
|
|
47
|
+
}): Promise<ResolveLoginResult>;
|
|
48
|
+
selectOrg(response: HttpResponse, db: DB, sessionToken: string, orgId: string): Promise<HttpTokenResult>;
|
|
49
|
+
switchOrg(response: HttpResponse, db: DB, request: HttpRequest, orgId: string, userId: string): Promise<HttpTokenResult>;
|
|
50
|
+
listOrgs(db: DB, userId: string): Promise<{
|
|
51
|
+
orgs: readonly OrgMembershipDetail[];
|
|
52
|
+
}>;
|
|
53
|
+
addMember(db: DB, params: {
|
|
54
|
+
userId: string;
|
|
55
|
+
orgId: string;
|
|
56
|
+
role?: string;
|
|
57
|
+
addedBy?: string;
|
|
58
|
+
}): Promise<{
|
|
59
|
+
id: string;
|
|
60
|
+
}>;
|
|
61
|
+
removeMember(db: DB, params: {
|
|
62
|
+
userId: string;
|
|
63
|
+
orgId: string;
|
|
64
|
+
}): Promise<void>;
|
|
65
|
+
checkMembership(db: DB, userId: string, orgId: string): Promise<OrgMembership | null>;
|
|
66
|
+
}
|
|
67
|
+
export declare function createMultiOrgSessions(config: MultiOrgConfig): MultiOrgSessions;
|
|
68
|
+
//# sourceMappingURL=multi-org.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-org.d.ts","sourceRoot":"","sources":["../../src/auth/multi-org.ts"],"names":[],"mappings":"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"}
|