@buenojs/bueno 0.8.5 → 0.8.7
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/.claude/settings.local.json +9 -0
- package/README.md +259 -15
- package/dist/cache/index.d.ts +187 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cli/bin.d.ts +8 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +484 -156
- package/dist/cli/commands/add-frontend.d.ts +7 -0
- package/dist/cli/commands/add-frontend.d.ts.map +1 -0
- package/dist/cli/commands/build.d.ts +7 -0
- package/dist/cli/commands/build.d.ts.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/generate.d.ts +7 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/help.d.ts +7 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/index.d.ts +59 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/migration.d.ts +7 -0
- package/dist/cli/commands/migration.d.ts.map +1 -0
- package/dist/cli/commands/new.d.ts +7 -0
- package/dist/cli/commands/new.d.ts.map +1 -0
- package/dist/cli/commands/start.d.ts +7 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/core/args.d.ts +61 -0
- package/dist/cli/core/args.d.ts.map +1 -0
- package/dist/cli/core/console.d.ts +135 -0
- package/dist/cli/core/console.d.ts.map +1 -0
- package/dist/cli/core/index.d.ts +10 -0
- package/dist/cli/core/index.d.ts.map +1 -0
- package/dist/cli/core/prompt.d.ts +63 -0
- package/dist/cli/core/prompt.d.ts.map +1 -0
- package/dist/cli/core/spinner.d.ts +111 -0
- package/dist/cli/core/spinner.d.ts.map +1 -0
- package/dist/cli/index.d.ts +47 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/templates/database/index.d.ts +24 -0
- package/dist/cli/templates/database/index.d.ts.map +1 -0
- package/dist/cli/templates/database/mysql.d.ts +6 -0
- package/dist/cli/templates/database/mysql.d.ts.map +1 -0
- package/dist/cli/templates/database/none.d.ts +8 -0
- package/dist/cli/templates/database/none.d.ts.map +1 -0
- package/dist/cli/templates/database/postgresql.d.ts +6 -0
- package/dist/cli/templates/database/postgresql.d.ts.map +1 -0
- package/dist/cli/templates/database/sqlite.d.ts +6 -0
- package/dist/cli/templates/database/sqlite.d.ts.map +1 -0
- package/dist/cli/templates/deploy.d.ts +41 -0
- package/dist/cli/templates/deploy.d.ts.map +1 -0
- package/dist/cli/templates/docker.d.ts +30 -0
- package/dist/cli/templates/docker.d.ts.map +1 -0
- package/dist/cli/templates/frontend/index.d.ts +25 -0
- package/dist/cli/templates/frontend/index.d.ts.map +1 -0
- package/dist/cli/templates/frontend/none.d.ts +8 -0
- package/dist/cli/templates/frontend/none.d.ts.map +1 -0
- package/dist/cli/templates/frontend/react.d.ts +6 -0
- package/dist/cli/templates/frontend/react.d.ts.map +1 -0
- package/dist/cli/templates/frontend/solid.d.ts +6 -0
- package/dist/cli/templates/frontend/solid.d.ts.map +1 -0
- package/dist/cli/templates/frontend/svelte.d.ts +6 -0
- package/dist/cli/templates/frontend/svelte.d.ts.map +1 -0
- package/dist/cli/templates/frontend/vue.d.ts +6 -0
- package/dist/cli/templates/frontend/vue.d.ts.map +1 -0
- package/dist/cli/templates/generators/index.d.ts +29 -0
- package/dist/cli/templates/generators/index.d.ts.map +1 -0
- package/dist/cli/templates/generators/types.d.ts +32 -0
- package/dist/cli/templates/generators/types.d.ts.map +1 -0
- package/dist/cli/templates/index.d.ts +12 -0
- package/dist/cli/templates/index.d.ts.map +1 -0
- package/dist/cli/templates/project/api.d.ts +6 -0
- package/dist/cli/templates/project/api.d.ts.map +1 -0
- package/dist/cli/templates/project/default.d.ts +6 -0
- package/dist/cli/templates/project/default.d.ts.map +1 -0
- package/dist/cli/templates/project/fullstack.d.ts +14 -0
- package/dist/cli/templates/project/fullstack.d.ts.map +1 -0
- package/dist/cli/templates/project/index.d.ts +26 -0
- package/dist/cli/templates/project/index.d.ts.map +1 -0
- package/dist/cli/templates/project/minimal.d.ts +6 -0
- package/dist/cli/templates/project/minimal.d.ts.map +1 -0
- package/dist/cli/templates/project/types.d.ts +80 -0
- package/dist/cli/templates/project/types.d.ts.map +1 -0
- package/dist/cli/templates/project/website.d.ts +8 -0
- package/dist/cli/templates/project/website.d.ts.map +1 -0
- package/dist/cli/utils/fs.d.ts +137 -0
- package/dist/cli/utils/fs.d.ts.map +1 -0
- package/dist/cli/utils/index.d.ts +9 -0
- package/dist/cli/utils/index.d.ts.map +1 -0
- package/dist/cli/utils/strings.d.ts +86 -0
- package/dist/cli/utils/strings.d.ts.map +1 -0
- package/dist/cli/utils/version.d.ts +15 -0
- package/dist/cli/utils/version.d.ts.map +1 -0
- package/dist/config/env-validation.d.ts +49 -0
- package/dist/config/env-validation.d.ts.map +1 -0
- package/dist/config/env.d.ts +167 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/index.d.ts +168 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/loader.d.ts +81 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/merge.d.ts +66 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/types.d.ts +322 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/validation.d.ts +100 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/container/forward-ref.d.ts +116 -0
- package/dist/container/forward-ref.d.ts.map +1 -0
- package/dist/container/index.d.ts +95 -0
- package/dist/container/index.d.ts.map +1 -0
- package/dist/container/index.js +26 -3
- package/dist/context/index.d.ts +143 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/database/index.d.ts +219 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/migrations/index.d.ts +146 -0
- package/dist/database/migrations/index.d.ts.map +1 -0
- package/dist/database/orm/builder.d.ts +122 -0
- package/dist/database/orm/builder.d.ts.map +1 -0
- package/dist/database/orm/casts/index.d.ts +16 -0
- package/dist/database/orm/casts/index.d.ts.map +1 -0
- package/dist/database/orm/casts/types.d.ts +16 -0
- package/dist/database/orm/casts/types.d.ts.map +1 -0
- package/dist/database/orm/compiler.d.ts +90 -0
- package/dist/database/orm/compiler.d.ts.map +1 -0
- package/dist/database/orm/hooks/index.d.ts +53 -0
- package/dist/database/orm/hooks/index.d.ts.map +1 -0
- package/dist/database/orm/index.d.ts +21 -0
- package/dist/database/orm/index.d.ts.map +1 -0
- package/dist/database/orm/model-registry.d.ts +33 -0
- package/dist/database/orm/model-registry.d.ts.map +1 -0
- package/dist/database/orm/model.d.ts +245 -0
- package/dist/database/orm/model.d.ts.map +1 -0
- package/dist/database/orm/relationships/base.d.ts +69 -0
- package/dist/database/orm/relationships/base.d.ts.map +1 -0
- package/dist/database/orm/relationships/belongs-to-many.d.ts +47 -0
- package/dist/database/orm/relationships/belongs-to-many.d.ts.map +1 -0
- package/dist/database/orm/relationships/belongs-to.d.ts +17 -0
- package/dist/database/orm/relationships/belongs-to.d.ts.map +1 -0
- package/dist/database/orm/relationships/has-many.d.ts +14 -0
- package/dist/database/orm/relationships/has-many.d.ts.map +1 -0
- package/dist/database/orm/relationships/has-one.d.ts +14 -0
- package/dist/database/orm/relationships/has-one.d.ts.map +1 -0
- package/dist/database/orm/relationships/index.d.ts +10 -0
- package/dist/database/orm/relationships/index.d.ts.map +1 -0
- package/dist/database/orm/scopes/index.d.ts +36 -0
- package/dist/database/orm/scopes/index.d.ts.map +1 -0
- package/dist/database/schema/index.d.ts +155 -0
- package/dist/database/schema/index.d.ts.map +1 -0
- package/dist/events/__tests__/event-system.test.d.ts +2 -0
- package/dist/events/__tests__/event-system.test.d.ts.map +1 -0
- package/dist/events/config.d.ts +16 -0
- package/dist/events/config.d.ts.map +1 -0
- package/dist/events/example-usage.d.ts +12 -0
- package/dist/events/example-usage.d.ts.map +1 -0
- package/dist/events/index.d.ts +27 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/manager.d.ts +33 -0
- package/dist/events/manager.d.ts.map +1 -0
- package/dist/events/registry.d.ts +31 -0
- package/dist/events/registry.d.ts.map +1 -0
- package/dist/events/types.d.ts +105 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/frontend/api-routes.d.ts +189 -0
- package/dist/frontend/api-routes.d.ts.map +1 -0
- package/dist/frontend/bundler.d.ts +99 -0
- package/dist/frontend/bundler.d.ts.map +1 -0
- package/dist/frontend/console-client.d.ts +11 -0
- package/dist/frontend/console-client.d.ts.map +1 -0
- package/dist/frontend/console-stream.d.ts +138 -0
- package/dist/frontend/console-stream.d.ts.map +1 -0
- package/dist/frontend/dev-server.d.ts +174 -0
- package/dist/frontend/dev-server.d.ts.map +1 -0
- package/dist/frontend/file-router.d.ts +170 -0
- package/dist/frontend/file-router.d.ts.map +1 -0
- package/dist/frontend/frameworks/index.d.ts +41 -0
- package/dist/frontend/frameworks/index.d.ts.map +1 -0
- package/dist/frontend/frameworks/react.d.ts +32 -0
- package/dist/frontend/frameworks/react.d.ts.map +1 -0
- package/dist/frontend/frameworks/solid.d.ts +42 -0
- package/dist/frontend/frameworks/solid.d.ts.map +1 -0
- package/dist/frontend/frameworks/svelte.d.ts +57 -0
- package/dist/frontend/frameworks/svelte.d.ts.map +1 -0
- package/dist/frontend/frameworks/vue.d.ts +36 -0
- package/dist/frontend/frameworks/vue.d.ts.map +1 -0
- package/dist/frontend/hmr-client.d.ts +22 -0
- package/dist/frontend/hmr-client.d.ts.map +1 -0
- package/dist/frontend/hmr.d.ts +185 -0
- package/dist/frontend/hmr.d.ts.map +1 -0
- package/dist/frontend/index.d.ts +34 -0
- package/dist/frontend/index.d.ts.map +1 -0
- package/dist/frontend/islands.d.ts +135 -0
- package/dist/frontend/islands.d.ts.map +1 -0
- package/dist/frontend/isr.d.ts +143 -0
- package/dist/frontend/isr.d.ts.map +1 -0
- package/dist/frontend/layout.d.ts +140 -0
- package/dist/frontend/layout.d.ts.map +1 -0
- package/dist/frontend/ssr/react.d.ts +118 -0
- package/dist/frontend/ssr/react.d.ts.map +1 -0
- package/dist/frontend/ssr/solid.d.ts +141 -0
- package/dist/frontend/ssr/solid.d.ts.map +1 -0
- package/dist/frontend/ssr/svelte.d.ts +158 -0
- package/dist/frontend/ssr/svelte.d.ts.map +1 -0
- package/dist/frontend/ssr/vue.d.ts +161 -0
- package/dist/frontend/ssr/vue.d.ts.map +1 -0
- package/dist/frontend/ssr.d.ts +147 -0
- package/dist/frontend/ssr.d.ts.map +1 -0
- package/dist/frontend/types.d.ts +1902 -0
- package/dist/frontend/types.d.ts.map +1 -0
- package/dist/graphql/built-in-engine.d.ts +36 -0
- package/dist/graphql/built-in-engine.d.ts.map +1 -0
- package/dist/graphql/context-builder.d.ts +44 -0
- package/dist/graphql/context-builder.d.ts.map +1 -0
- package/dist/graphql/decorators.d.ts +162 -0
- package/dist/graphql/decorators.d.ts.map +1 -0
- package/dist/graphql/execution-pipeline.d.ts +67 -0
- package/dist/graphql/execution-pipeline.d.ts.map +1 -0
- package/dist/graphql/graphql-module.d.ts +70 -0
- package/dist/graphql/graphql-module.d.ts.map +1 -0
- package/dist/graphql/index.d.ts +48 -0
- package/dist/graphql/index.d.ts.map +1 -0
- package/dist/graphql/index.js +2156 -0
- package/dist/graphql/metadata.d.ts +37 -0
- package/dist/graphql/metadata.d.ts.map +1 -0
- package/dist/graphql/schema-builder.d.ts +34 -0
- package/dist/graphql/schema-builder.d.ts.map +1 -0
- package/dist/graphql/subscription-handler.d.ts +47 -0
- package/dist/graphql/subscription-handler.d.ts.map +1 -0
- package/dist/graphql/types.d.ts +252 -0
- package/dist/graphql/types.d.ts.map +1 -0
- package/dist/health/index.d.ts +176 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/i18n/engine.d.ts +105 -0
- package/dist/i18n/engine.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +13 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/loader.d.ts +79 -0
- package/dist/i18n/loader.d.ts.map +1 -0
- package/dist/i18n/middleware.d.ts +96 -0
- package/dist/i18n/middleware.d.ts.map +1 -0
- package/dist/i18n/negotiator.d.ts +84 -0
- package/dist/i18n/negotiator.d.ts.map +1 -0
- package/dist/i18n/types.d.ts +129 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +520 -434
- package/dist/jobs/drivers/memory.d.ts +38 -0
- package/dist/jobs/drivers/memory.d.ts.map +1 -0
- package/dist/jobs/drivers/redis.d.ts +34 -0
- package/dist/jobs/drivers/redis.d.ts.map +1 -0
- package/dist/jobs/index.d.ts +12 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/queue.d.ts +93 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/types.d.ts +193 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/worker.d.ts +91 -0
- package/dist/jobs/worker.d.ts.map +1 -0
- package/dist/lock/index.d.ts +141 -0
- package/dist/lock/index.d.ts.map +1 -0
- package/dist/logger/index.d.ts +156 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/transports/index.d.ts +371 -0
- package/dist/logger/transports/index.d.ts.map +1 -0
- package/dist/metrics/index.d.ts +163 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/middleware/built-in.d.ts +50 -0
- package/dist/middleware/built-in.d.ts.map +1 -0
- package/dist/middleware/index.d.ts +40 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/migrations/index.d.ts +10 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/modules/filters.d.ts +150 -0
- package/dist/modules/filters.d.ts.map +1 -0
- package/dist/modules/guards.d.ts +188 -0
- package/dist/modules/guards.d.ts.map +1 -0
- package/dist/modules/index.d.ts +266 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +514 -449
- package/dist/modules/interceptors.d.ts +242 -0
- package/dist/modules/interceptors.d.ts.map +1 -0
- package/dist/modules/lazy.d.ts +187 -0
- package/dist/modules/lazy.d.ts.map +1 -0
- package/dist/modules/lifecycle.d.ts +221 -0
- package/dist/modules/lifecycle.d.ts.map +1 -0
- package/dist/modules/metadata.d.ts +32 -0
- package/dist/modules/metadata.d.ts.map +1 -0
- package/dist/modules/pipes.d.ts +287 -0
- package/dist/modules/pipes.d.ts.map +1 -0
- package/dist/notification/channels/base.d.ts +32 -0
- package/dist/notification/channels/base.d.ts.map +1 -0
- package/dist/notification/channels/email.d.ts +37 -0
- package/dist/notification/channels/email.d.ts.map +1 -0
- package/dist/notification/channels/push.d.ts +37 -0
- package/dist/notification/channels/push.d.ts.map +1 -0
- package/dist/notification/channels/sms.d.ts +37 -0
- package/dist/notification/channels/sms.d.ts.map +1 -0
- package/dist/notification/channels/whatsapp.d.ts +37 -0
- package/dist/notification/channels/whatsapp.d.ts.map +1 -0
- package/dist/notification/index.d.ts +15 -0
- package/dist/notification/index.d.ts.map +1 -0
- package/dist/notification/service.d.ts +100 -0
- package/dist/notification/service.d.ts.map +1 -0
- package/dist/notification/types.d.ts +253 -0
- package/dist/notification/types.d.ts.map +1 -0
- package/dist/observability/__tests__/observability.test.d.ts +2 -0
- package/dist/observability/__tests__/observability.test.d.ts.map +1 -0
- package/dist/observability/breadcrumbs.d.ts +48 -0
- package/dist/observability/breadcrumbs.d.ts.map +1 -0
- package/dist/observability/index.d.ts +95 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/interceptor.d.ts +19 -0
- package/dist/observability/interceptor.d.ts.map +1 -0
- package/dist/observability/service.d.ts +101 -0
- package/dist/observability/service.d.ts.map +1 -0
- package/dist/observability/trace.d.ts +21 -0
- package/dist/observability/trace.d.ts.map +1 -0
- package/dist/observability/types.d.ts +172 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/openapi/__tests__/decorators.test.d.ts +2 -0
- package/dist/openapi/__tests__/decorators.test.d.ts.map +1 -0
- package/dist/openapi/__tests__/document-builder.test.d.ts +2 -0
- package/dist/openapi/__tests__/document-builder.test.d.ts.map +1 -0
- package/dist/openapi/__tests__/route-scanner.test.d.ts +2 -0
- package/dist/openapi/__tests__/route-scanner.test.d.ts.map +1 -0
- package/dist/openapi/__tests__/schema-generator.test.d.ts +2 -0
- package/dist/openapi/__tests__/schema-generator.test.d.ts.map +1 -0
- package/dist/openapi/decorators.d.ts +173 -0
- package/dist/openapi/decorators.d.ts.map +1 -0
- package/dist/openapi/document-builder.d.ts +82 -0
- package/dist/openapi/document-builder.d.ts.map +1 -0
- package/dist/openapi/index.d.ts +48 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +59 -40
- package/dist/openapi/metadata.d.ts +36 -0
- package/dist/openapi/metadata.d.ts.map +1 -0
- package/dist/openapi/route-scanner.d.ts +34 -0
- package/dist/openapi/route-scanner.d.ts.map +1 -0
- package/dist/openapi/schema-generator.d.ts +53 -0
- package/dist/openapi/schema-generator.d.ts.map +1 -0
- package/dist/openapi/swagger-module.d.ts +57 -0
- package/dist/openapi/swagger-module.d.ts.map +1 -0
- package/dist/openapi/types.d.ts +344 -0
- package/dist/openapi/types.d.ts.map +1 -0
- package/dist/orm/index.d.ts +10 -0
- package/dist/orm/index.d.ts.map +1 -0
- package/dist/router/index.d.ts +73 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/linear.d.ts +54 -0
- package/dist/router/linear.d.ts.map +1 -0
- package/dist/router/regex.d.ts +49 -0
- package/dist/router/regex.d.ts.map +1 -0
- package/dist/router/tree.d.ts +112 -0
- package/dist/router/tree.d.ts.map +1 -0
- package/dist/rpc/index.d.ts +321 -0
- package/dist/rpc/index.d.ts.map +1 -0
- package/dist/schema/index.d.ts +10 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/security/index.d.ts +126 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/ssg/index.d.ts +73 -0
- package/dist/ssg/index.d.ts.map +1 -0
- package/dist/storage/index.d.ts +99 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/telemetry/index.d.ts +376 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/template/index.d.ts +7 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/templates/engine.d.ts +60 -0
- package/dist/templates/engine.d.ts.map +1 -0
- package/dist/templates/index.d.ts +9 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/loader.d.ts +45 -0
- package/dist/templates/loader.d.ts.map +1 -0
- package/dist/templates/renderers/markdown.d.ts +46 -0
- package/dist/templates/renderers/markdown.d.ts.map +1 -0
- package/dist/templates/renderers/simple.d.ts +35 -0
- package/dist/templates/renderers/simple.d.ts.map +1 -0
- package/dist/templates/types.d.ts +138 -0
- package/dist/templates/types.d.ts.map +1 -0
- package/dist/testing/index.d.ts +539 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +116 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/validation/index.d.ts +89 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/schemas.d.ts +243 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/websocket/index.d.ts +252 -0
- package/dist/websocket/index.d.ts.map +1 -0
- package/llms.txt +231 -0
- package/package.json +6 -2
- package/src/cli/ARCHITECTURE.md +3 -3
- package/src/cli/commands/add-frontend.ts +444 -0
- package/src/cli/commands/new.ts +23 -0
- package/src/cli/index.ts +1 -0
- package/src/cli/templates/frontend/react.ts +2 -1
- package/src/cli/templates/frontend/solid.ts +2 -1
- package/src/cli/templates/frontend/svelte.ts +2 -1
- package/src/cli/templates/frontend/vue.ts +2 -1
- package/src/cli/templates/project/api.ts +1 -1
- package/src/cli/templates/project/default.ts +1 -1
- package/src/cli/templates/project/fullstack.ts +14 -104
- package/src/cli/templates/project/website.ts +63 -12
- package/src/config/types.ts +21 -0
- package/src/graphql/built-in-engine.ts +598 -0
- package/src/graphql/context-builder.ts +110 -0
- package/src/graphql/decorators.ts +358 -0
- package/src/graphql/execution-pipeline.ts +227 -0
- package/src/graphql/graphql-module.ts +563 -0
- package/src/graphql/index.ts +101 -0
- package/src/graphql/metadata.ts +237 -0
- package/src/graphql/schema-builder.ts +319 -0
- package/src/graphql/subscription-handler.ts +283 -0
- package/src/graphql/types.ts +324 -0
- package/src/index.ts +3 -0
- package/src/modules/index.ts +48 -1
- package/tests/integration/cli.test.ts +19 -19
- package/tests/unit/cli.test.ts +1 -1
- package/tests/unit/graphql.test.ts +991 -0
- package/tsconfig.declaration.json +14 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Job Queue Driver
|
|
3
|
+
*
|
|
4
|
+
* Used for development and testing. No external dependencies.
|
|
5
|
+
* Jobs are stored in memory and lost on process restart.
|
|
6
|
+
*/
|
|
7
|
+
import type { Job, JobQueueConfig, JobQueueDriver, QueueMetrics, QueueOptions } from "../types";
|
|
8
|
+
export declare class MemoryJobQueueDriver implements JobQueueDriver {
|
|
9
|
+
private config;
|
|
10
|
+
private jobStore;
|
|
11
|
+
private pendingQueue;
|
|
12
|
+
private processingSet;
|
|
13
|
+
private failedQueue;
|
|
14
|
+
private cleanupInterval;
|
|
15
|
+
private jobCounter;
|
|
16
|
+
private metrics;
|
|
17
|
+
constructor(config?: JobQueueConfig);
|
|
18
|
+
/**
|
|
19
|
+
* Generate a unique job ID
|
|
20
|
+
*/
|
|
21
|
+
private generateJobId;
|
|
22
|
+
/**
|
|
23
|
+
* Start periodic cleanup of expired jobs
|
|
24
|
+
*/
|
|
25
|
+
private _startCleanup;
|
|
26
|
+
connect(): Promise<void>;
|
|
27
|
+
disconnect(): Promise<void>;
|
|
28
|
+
isConnected(): Promise<boolean>;
|
|
29
|
+
enqueue<T = unknown>(name: string, data: T, options?: QueueOptions): Promise<string>;
|
|
30
|
+
claim(count: number, timeout: number): Promise<Job[]>;
|
|
31
|
+
complete(jobId: string): Promise<void>;
|
|
32
|
+
fail(jobId: string, error: string, stackTrace?: string): Promise<void>;
|
|
33
|
+
scheduleRetry(jobId: string, delayMs: number, error: string): Promise<void>;
|
|
34
|
+
getJob(jobId: string): Promise<Job | null>;
|
|
35
|
+
getMetrics(): Promise<QueueMetrics>;
|
|
36
|
+
clear(): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/jobs/drivers/memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACX,GAAG,EACH,cAAc,EACd,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,MAAM,UAAU,CAAC;AAWlB,qBAAa,oBAAqB,YAAW,cAAc;IAoB9C,OAAO,CAAC,MAAM;IAnB1B,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,OAAO,CAWb;gBAEkB,MAAM,GAAE,cAAmB;IAI/C;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAWf,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,CAAC,CAAC,GAAG,OAAO,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC;IAgDZ,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IA4CrD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDtC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BtE,aAAa,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC;IAwBV,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAK1C,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;IAInC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB5B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis Job Queue Driver
|
|
3
|
+
*
|
|
4
|
+
* Production-grade driver using Bun's native Redis client.
|
|
5
|
+
* Supports atomic operations via Lua scripts.
|
|
6
|
+
*/
|
|
7
|
+
import type { Job, JobQueueConfig, JobQueueDriver, QueueMetrics, QueueOptions } from "../types";
|
|
8
|
+
export declare class RedisJobQueueDriver implements JobQueueDriver {
|
|
9
|
+
private config;
|
|
10
|
+
private client;
|
|
11
|
+
private _isConnected;
|
|
12
|
+
private keyPrefix;
|
|
13
|
+
constructor(config?: JobQueueConfig);
|
|
14
|
+
/**
|
|
15
|
+
* Get prefixed key name
|
|
16
|
+
*/
|
|
17
|
+
private key;
|
|
18
|
+
/**
|
|
19
|
+
* Type-safe Redis client getter
|
|
20
|
+
*/
|
|
21
|
+
private getClient;
|
|
22
|
+
connect(): Promise<void>;
|
|
23
|
+
disconnect(): Promise<void>;
|
|
24
|
+
isConnected(): Promise<boolean>;
|
|
25
|
+
enqueue<T = unknown>(name: string, data: T, options?: QueueOptions): Promise<string>;
|
|
26
|
+
claim(count: number, timeout: number): Promise<Job[]>;
|
|
27
|
+
complete(jobId: string): Promise<void>;
|
|
28
|
+
fail(jobId: string, error: string, stackTrace?: string): Promise<void>;
|
|
29
|
+
scheduleRetry(jobId: string, delayMs: number, error: string): Promise<void>;
|
|
30
|
+
getJob(jobId: string): Promise<Job | null>;
|
|
31
|
+
getMetrics(): Promise<QueueMetrics>;
|
|
32
|
+
clear(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=redis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../src/jobs/drivers/redis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACX,GAAG,EACH,cAAc,EACd,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,MAAM,UAAU,CAAC;AA+HlB,qBAAa,mBAAoB,YAAW,cAAc;IAK7C,OAAO,CAAC,MAAM;IAJ1B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;gBAEN,MAAM,GAAE,cAAmB;IAI/C;;OAEG;IACH,OAAO,CAAC,GAAG;IAIX;;OAEG;IACH,OAAO,CAAC,SAAS;IA0BX,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,CAAC,CAAC,GAAG,OAAO,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC;IA6CZ,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IA2CrD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCtC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBtE,aAAa,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC;IAuBV,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAS1C,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;IA+BnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAkC5B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background Jobs Module
|
|
3
|
+
*
|
|
4
|
+
* Complete job queue system with Redis/Memory drivers,
|
|
5
|
+
* handler registration, and event system.
|
|
6
|
+
*/
|
|
7
|
+
export type { Job, JobStatus, JobQueueConfig, QueueOptions, JobHandler, QueueMetrics, JobEvent, JobEventType, JobClaimHandle, JobQueueDriver, HandlerRegistryEntry, JobConfigValidationResult, } from "./types";
|
|
8
|
+
export { JobQueue, createJobQueue } from "./queue";
|
|
9
|
+
export { JobWorker, startWorker } from "./worker";
|
|
10
|
+
export { MemoryJobQueueDriver } from "./drivers/memory";
|
|
11
|
+
export { RedisJobQueueDriver } from "./drivers/redis";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACX,GAAG,EACH,SAAS,EACT,cAAc,EACd,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,yBAAyB,GACzB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGlD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job Queue Factory and API
|
|
3
|
+
*
|
|
4
|
+
* Main public interface for enqueueing and managing background jobs.
|
|
5
|
+
* Supports both Redis and in-memory drivers.
|
|
6
|
+
*/
|
|
7
|
+
import type { Job, JobEvent, JobEventType, JobHandler, JobQueueConfig, QueueMetrics, QueueOptions } from "./types";
|
|
8
|
+
export declare class JobQueue {
|
|
9
|
+
private driver;
|
|
10
|
+
private handlers;
|
|
11
|
+
private handlerRegistry;
|
|
12
|
+
private eventListeners;
|
|
13
|
+
private isRunning;
|
|
14
|
+
constructor(config?: JobQueueConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Initialize the queue (connect to backend)
|
|
17
|
+
*/
|
|
18
|
+
init(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Shutdown the queue gracefully
|
|
21
|
+
*/
|
|
22
|
+
shutdown(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Enqueue a job
|
|
25
|
+
* @param name - Job name/type (e.g., "email.welcome")
|
|
26
|
+
* @param data - Job payload
|
|
27
|
+
* @param options - Queue options (delay, priority, timeout)
|
|
28
|
+
* @returns Job ID
|
|
29
|
+
*/
|
|
30
|
+
enqueue<T = unknown>(name: string, data: T, options?: QueueOptions): Promise<string>;
|
|
31
|
+
/**
|
|
32
|
+
* Register a handler for a job type
|
|
33
|
+
* Supports wildcards: "email.*" matches "email.welcome", "email.reset", etc.
|
|
34
|
+
*/
|
|
35
|
+
on(pattern: string, handler: JobHandler<unknown>): void;
|
|
36
|
+
/**
|
|
37
|
+
* Remove a handler
|
|
38
|
+
*/
|
|
39
|
+
off(pattern: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Find the best matching handler for a job
|
|
42
|
+
*/
|
|
43
|
+
private findHandler;
|
|
44
|
+
/**
|
|
45
|
+
* Check if a pattern matches a job name (supports wildcards)
|
|
46
|
+
*/
|
|
47
|
+
private _patternMatches;
|
|
48
|
+
/**
|
|
49
|
+
* Listen for queue events
|
|
50
|
+
*/
|
|
51
|
+
onEvent(event: JobEventType, listener: (event: JobEvent) => void): void;
|
|
52
|
+
/**
|
|
53
|
+
* Stop listening for queue events
|
|
54
|
+
*/
|
|
55
|
+
offEvent(event: JobEventType, listener: (event: JobEvent) => void): void;
|
|
56
|
+
/**
|
|
57
|
+
* Emit a queue event
|
|
58
|
+
*/
|
|
59
|
+
private _emitEvent;
|
|
60
|
+
/**
|
|
61
|
+
* Start the polling loop (for tests/manual control)
|
|
62
|
+
* Note: In production, use a separate worker process
|
|
63
|
+
*/
|
|
64
|
+
start(options?: {
|
|
65
|
+
pollInterval?: number;
|
|
66
|
+
concurrency?: number;
|
|
67
|
+
}): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Stop the polling loop
|
|
70
|
+
*/
|
|
71
|
+
stop(): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Get a job by ID
|
|
74
|
+
*/
|
|
75
|
+
getJob(jobId: string): Promise<Job | null>;
|
|
76
|
+
/**
|
|
77
|
+
* Get queue metrics
|
|
78
|
+
*/
|
|
79
|
+
getMetrics(): Promise<QueueMetrics>;
|
|
80
|
+
/**
|
|
81
|
+
* Clear all jobs (use with caution!)
|
|
82
|
+
*/
|
|
83
|
+
clear(): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Check if queue is connected
|
|
86
|
+
*/
|
|
87
|
+
isConnected(): Promise<boolean>;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create a new job queue instance
|
|
91
|
+
*/
|
|
92
|
+
export declare function createJobQueue(config?: JobQueueConfig): JobQueue;
|
|
93
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/jobs/queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAEX,GAAG,EACH,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,cAAc,EAEd,YAAY,EACZ,YAAY,EACZ,MAAM,SAAS,CAAC;AAIjB,qBAAa,QAAQ;IACpB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,cAAc,CACX;IACX,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,GAAE,cAAmB;IAcvC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B;;;;;;OAMG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC;IAMlB;;;OAGG;IACH,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI;IAkBvD;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ1B;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAOvE;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAIxE;;OAEG;IACH,OAAO,CAAC,UAAU;IAmBlB;;;OAGG;IACG,KAAK,CACV,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GAC3D,OAAO,CAAC,IAAI,CAAC;IAqDhB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAIhD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;IAIzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGrC;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,QAAQ,CAEhE"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background Jobs / Task Queue
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the job queue system.
|
|
5
|
+
* Supports Redis (production) and in-memory (development) drivers.
|
|
6
|
+
*/
|
|
7
|
+
export type JobStatus = "pending" | "processing" | "completed" | "failed" | "delayed";
|
|
8
|
+
/**
|
|
9
|
+
* Represents a background job
|
|
10
|
+
*/
|
|
11
|
+
export interface Job<T = unknown> {
|
|
12
|
+
/** Unique job identifier */
|
|
13
|
+
id: string;
|
|
14
|
+
/** Job name/type (e.g., "email.welcome", "image.resize") */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Job payload data */
|
|
17
|
+
data: T;
|
|
18
|
+
/** Current status of the job */
|
|
19
|
+
status: JobStatus;
|
|
20
|
+
/** Number of times this job has been attempted */
|
|
21
|
+
attempts: number;
|
|
22
|
+
/** Maximum number of retry attempts */
|
|
23
|
+
maxRetries: number;
|
|
24
|
+
/** Error message if job failed */
|
|
25
|
+
error?: string;
|
|
26
|
+
/** Stack trace if job failed */
|
|
27
|
+
stackTrace?: string;
|
|
28
|
+
/** When the job was created (ISO 8601) */
|
|
29
|
+
createdAt: string;
|
|
30
|
+
/** When the job was last updated (ISO 8601) */
|
|
31
|
+
updatedAt: string;
|
|
32
|
+
/** When the job should start (ISO 8601, for delayed jobs) */
|
|
33
|
+
scheduledFor?: string;
|
|
34
|
+
/** When job processing started (ISO 8601) */
|
|
35
|
+
startedAt?: string;
|
|
36
|
+
/** When job processing completed (ISO 8601) */
|
|
37
|
+
completedAt?: string;
|
|
38
|
+
/** How long the job took to complete in milliseconds */
|
|
39
|
+
duration?: number;
|
|
40
|
+
/** Job priority (higher = process sooner) */
|
|
41
|
+
priority?: number;
|
|
42
|
+
/** Custom metadata attached to the job */
|
|
43
|
+
metadata?: Record<string, unknown>;
|
|
44
|
+
/** Worker that claimed this job */
|
|
45
|
+
workerId?: string;
|
|
46
|
+
/** When the job claim expires (for dead letter handling) */
|
|
47
|
+
claimExpiresAt?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface JobQueueConfig {
|
|
50
|
+
/** Driver type: 'redis' for production, 'memory' for development */
|
|
51
|
+
driver?: "redis" | "memory";
|
|
52
|
+
/** Redis connection URL (required if driver is 'redis') */
|
|
53
|
+
url?: string;
|
|
54
|
+
/** Key prefix for all jobs (default: 'jobs:') */
|
|
55
|
+
keyPrefix?: string;
|
|
56
|
+
/** Maximum number of jobs to process concurrently (default: 10) */
|
|
57
|
+
concurrency?: number;
|
|
58
|
+
/** Maximum number of retry attempts (default: 3) */
|
|
59
|
+
maxRetries?: number;
|
|
60
|
+
/** Base delay in seconds for exponential backoff (default: 1) */
|
|
61
|
+
retryDelay?: number;
|
|
62
|
+
/** Number of jobs to claim in a single poll (default: 10) */
|
|
63
|
+
batchSize?: number;
|
|
64
|
+
/** Polling interval in milliseconds (default: 1000) */
|
|
65
|
+
pollInterval?: number;
|
|
66
|
+
/** Job timeout in milliseconds (default: 300000 / 5 minutes) */
|
|
67
|
+
jobTimeout?: number;
|
|
68
|
+
/** Enable metrics collection (default: true) */
|
|
69
|
+
enableMetrics?: boolean;
|
|
70
|
+
}
|
|
71
|
+
export interface QueueOptions {
|
|
72
|
+
/** Schedule job for later execution (ISO 8601 or Date) */
|
|
73
|
+
delay?: number | Date;
|
|
74
|
+
/** Job priority (default: 0) */
|
|
75
|
+
priority?: number;
|
|
76
|
+
/** Custom metadata */
|
|
77
|
+
metadata?: Record<string, unknown>;
|
|
78
|
+
/** Override default job timeout in milliseconds */
|
|
79
|
+
timeout?: number;
|
|
80
|
+
/** Maximum retries for this specific job */
|
|
81
|
+
maxRetries?: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Async handler function for processing jobs
|
|
85
|
+
*/
|
|
86
|
+
export type JobHandler<T = unknown> = (job: Job<T>) => Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Metrics for job queue observability
|
|
89
|
+
*/
|
|
90
|
+
export interface QueueMetrics {
|
|
91
|
+
/** Total jobs enqueued */
|
|
92
|
+
enqueued: number;
|
|
93
|
+
/** Jobs successfully completed */
|
|
94
|
+
processed: number;
|
|
95
|
+
/** Jobs that failed (exceeded max retries) */
|
|
96
|
+
failed: number;
|
|
97
|
+
/** Jobs currently in pending state */
|
|
98
|
+
pending: number;
|
|
99
|
+
/** Jobs currently being processed */
|
|
100
|
+
processing: number;
|
|
101
|
+
/** Average job processing time in milliseconds */
|
|
102
|
+
avgLatency: number;
|
|
103
|
+
/** Total processing time in milliseconds */
|
|
104
|
+
totalLatency: number;
|
|
105
|
+
/** Number of job retries that occurred */
|
|
106
|
+
retried: number;
|
|
107
|
+
/** Success rate (0.0 to 1.0) */
|
|
108
|
+
successRate: number;
|
|
109
|
+
/** Average number of attempts per job */
|
|
110
|
+
avgAttempts: number;
|
|
111
|
+
}
|
|
112
|
+
export type JobEventType = "enqueued" | "started" | "completed" | "failed" | "retried";
|
|
113
|
+
export interface JobEvent<T = unknown> {
|
|
114
|
+
type: JobEventType;
|
|
115
|
+
job: Job<T>;
|
|
116
|
+
timestamp: Date;
|
|
117
|
+
metadata?: Record<string, unknown>;
|
|
118
|
+
}
|
|
119
|
+
export interface JobClaimHandle {
|
|
120
|
+
/** Whether the claim was successfully acquired */
|
|
121
|
+
acquired: boolean;
|
|
122
|
+
/** Release the claim (job goes back to pending) */
|
|
123
|
+
release: () => Promise<boolean>;
|
|
124
|
+
/** Extend the claim TTL for long-running jobs */
|
|
125
|
+
extend: (ttl?: number) => Promise<boolean>;
|
|
126
|
+
/** Check if claim is still valid */
|
|
127
|
+
isValid: () => Promise<boolean>;
|
|
128
|
+
/** Get remaining TTL in milliseconds */
|
|
129
|
+
getRemainingTTL: () => Promise<number>;
|
|
130
|
+
/** The claim key */
|
|
131
|
+
key: string;
|
|
132
|
+
/** The claim value (unique identifier) */
|
|
133
|
+
value: string;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Interface that both Redis and Memory drivers must implement
|
|
137
|
+
*/
|
|
138
|
+
export interface JobQueueDriver {
|
|
139
|
+
/**
|
|
140
|
+
* Initialize the driver (e.g., connect to Redis)
|
|
141
|
+
*/
|
|
142
|
+
connect(): Promise<void>;
|
|
143
|
+
/**
|
|
144
|
+
* Disconnect from the driver
|
|
145
|
+
*/
|
|
146
|
+
disconnect(): Promise<void>;
|
|
147
|
+
/**
|
|
148
|
+
* Check if connected
|
|
149
|
+
*/
|
|
150
|
+
isConnected(): Promise<boolean>;
|
|
151
|
+
/**
|
|
152
|
+
* Enqueue a new job
|
|
153
|
+
*/
|
|
154
|
+
enqueue<T = unknown>(name: string, data: T, options?: QueueOptions): Promise<string>;
|
|
155
|
+
/**
|
|
156
|
+
* Claim a batch of pending jobs for processing
|
|
157
|
+
*/
|
|
158
|
+
claim(count: number, timeout: number): Promise<Job[]>;
|
|
159
|
+
/**
|
|
160
|
+
* Mark a job as completed
|
|
161
|
+
*/
|
|
162
|
+
complete(jobId: string): Promise<void>;
|
|
163
|
+
/**
|
|
164
|
+
* Mark a job as failed
|
|
165
|
+
*/
|
|
166
|
+
fail(jobId: string, error: string, stackTrace?: string): Promise<void>;
|
|
167
|
+
/**
|
|
168
|
+
* Schedule a job for retry
|
|
169
|
+
*/
|
|
170
|
+
scheduleRetry(jobId: string, delayMs: number, error: string): Promise<void>;
|
|
171
|
+
/**
|
|
172
|
+
* Get a job by ID
|
|
173
|
+
*/
|
|
174
|
+
getJob(jobId: string): Promise<Job | null>;
|
|
175
|
+
/**
|
|
176
|
+
* Get queue metrics
|
|
177
|
+
*/
|
|
178
|
+
getMetrics(): Promise<QueueMetrics>;
|
|
179
|
+
/**
|
|
180
|
+
* Clear all jobs from the queue (use with caution!)
|
|
181
|
+
*/
|
|
182
|
+
clear(): Promise<void>;
|
|
183
|
+
}
|
|
184
|
+
export interface HandlerRegistryEntry {
|
|
185
|
+
pattern: string;
|
|
186
|
+
handler: JobHandler<unknown>;
|
|
187
|
+
specificity: number;
|
|
188
|
+
}
|
|
189
|
+
export interface JobConfigValidationResult {
|
|
190
|
+
valid: boolean;
|
|
191
|
+
errors: string[];
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/jobs/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job Worker
|
|
3
|
+
*
|
|
4
|
+
* Production-grade worker for processing background jobs.
|
|
5
|
+
* Designed to run in a separate process/worker.
|
|
6
|
+
* Supports graceful shutdown and exponential backoff polling.
|
|
7
|
+
*/
|
|
8
|
+
import type { JobEvent, JobEventType, JobHandler, JobQueueConfig } from "./types";
|
|
9
|
+
export declare class JobWorker {
|
|
10
|
+
private driver;
|
|
11
|
+
private handlers;
|
|
12
|
+
private handlerRegistry;
|
|
13
|
+
private eventListeners;
|
|
14
|
+
private isRunning;
|
|
15
|
+
private pollInterval;
|
|
16
|
+
private concurrency;
|
|
17
|
+
private jobTimeout;
|
|
18
|
+
private maxBackoffDelay;
|
|
19
|
+
private currentBackoff;
|
|
20
|
+
private inFlightJobs;
|
|
21
|
+
private shutdownTimeout;
|
|
22
|
+
constructor(config?: JobQueueConfig);
|
|
23
|
+
/**
|
|
24
|
+
* Initialize the worker (connect to backend)
|
|
25
|
+
*/
|
|
26
|
+
init(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Register a handler for a job type
|
|
29
|
+
* Supports wildcards: "email.*" matches "email.welcome", "email.reset", etc.
|
|
30
|
+
*/
|
|
31
|
+
handle(pattern: string, handler: JobHandler<unknown>): void;
|
|
32
|
+
/**
|
|
33
|
+
* Remove a handler
|
|
34
|
+
*/
|
|
35
|
+
unhandle(pattern: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Listen for worker events
|
|
38
|
+
*/
|
|
39
|
+
on(eventType: JobEventType, listener: (event: JobEvent) => void): void;
|
|
40
|
+
/**
|
|
41
|
+
* Stop listening for events
|
|
42
|
+
*/
|
|
43
|
+
off(eventType: JobEventType, listener: (event: JobEvent) => void): void;
|
|
44
|
+
/**
|
|
45
|
+
* Emit a worker event
|
|
46
|
+
*/
|
|
47
|
+
private _emitEvent;
|
|
48
|
+
/**
|
|
49
|
+
* Find the best matching handler for a job
|
|
50
|
+
*/
|
|
51
|
+
private findHandler;
|
|
52
|
+
/**
|
|
53
|
+
* Check if a pattern matches a job name (supports wildcards)
|
|
54
|
+
*/
|
|
55
|
+
private _patternMatches;
|
|
56
|
+
/**
|
|
57
|
+
* Start the worker (blocks until stopped)
|
|
58
|
+
*/
|
|
59
|
+
start(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Main polling loop
|
|
62
|
+
*/
|
|
63
|
+
private _pollLoop;
|
|
64
|
+
/**
|
|
65
|
+
* Process a single job
|
|
66
|
+
*/
|
|
67
|
+
private _processJob;
|
|
68
|
+
/**
|
|
69
|
+
* Stop the worker gracefully
|
|
70
|
+
* Waits for in-flight jobs to complete before shutdown
|
|
71
|
+
*/
|
|
72
|
+
stop(): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Get the number of jobs currently being processed
|
|
75
|
+
*/
|
|
76
|
+
getInFlightCount(): number;
|
|
77
|
+
/**
|
|
78
|
+
* Get queue metrics
|
|
79
|
+
*/
|
|
80
|
+
getMetrics(): Promise<import("./types").QueueMetrics>;
|
|
81
|
+
/**
|
|
82
|
+
* Check if worker is running
|
|
83
|
+
*/
|
|
84
|
+
isActive(): boolean;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Create and start a worker from config
|
|
88
|
+
* Useful for CLI commands like: bueno queue:worker
|
|
89
|
+
*/
|
|
90
|
+
export declare function startWorker(config?: JobQueueConfig): Promise<void>;
|
|
91
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/jobs/worker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAGX,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,cAAc,EAEd,MAAM,SAAS,CAAC;AAIjB,qBAAa,SAAS;IACrB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,cAAc,CACX;IACX,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,eAAe,CAAS;gBAEpB,MAAM,GAAE,cAAmB;IAkBvC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI;IAkB3D;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ/B;;OAEG;IACH,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAOtE;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAIvE;;OAEG;IACH,OAAO,CAAC,UAAU;IAmBlB;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB5B;;OAEG;YACW,SAAS;IAiDvB;;OAEG;YACW,WAAW;IAyDzB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B3B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACG,UAAU;IAIhB;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGnB;AAID;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBxE"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distributed Locking
|
|
3
|
+
*
|
|
4
|
+
* Redis-based distributed locks with in-memory fallback.
|
|
5
|
+
* Uses Bun 1.3+ native Redis client for production.
|
|
6
|
+
*
|
|
7
|
+
* Implementation based on Redis SET NX PX pattern with Lua scripts
|
|
8
|
+
* for safe lock release and extension.
|
|
9
|
+
*/
|
|
10
|
+
export interface LockConfig {
|
|
11
|
+
driver?: "redis" | "memory";
|
|
12
|
+
url?: string;
|
|
13
|
+
keyPrefix?: string;
|
|
14
|
+
defaultTTL?: number;
|
|
15
|
+
retryCount?: number;
|
|
16
|
+
retryDelay?: number;
|
|
17
|
+
autoExtend?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface LockOptions {
|
|
20
|
+
ttl?: number;
|
|
21
|
+
retryCount?: number;
|
|
22
|
+
retryDelay?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface Lock {
|
|
25
|
+
key: string;
|
|
26
|
+
value: string;
|
|
27
|
+
acquired: boolean;
|
|
28
|
+
acquiredAt: number;
|
|
29
|
+
ttl: number;
|
|
30
|
+
expiresAt: number;
|
|
31
|
+
}
|
|
32
|
+
export interface LockHandle {
|
|
33
|
+
/** Whether the lock was successfully acquired */
|
|
34
|
+
acquired: boolean;
|
|
35
|
+
/** Release the lock */
|
|
36
|
+
release: () => Promise<boolean>;
|
|
37
|
+
/** Extend the lock TTL */
|
|
38
|
+
extend: (ttl?: number) => Promise<boolean>;
|
|
39
|
+
/** Check if lock is still held */
|
|
40
|
+
isValid: () => Promise<boolean>;
|
|
41
|
+
/** Get remaining TTL in milliseconds */
|
|
42
|
+
getRemainingTTL: () => Promise<number>;
|
|
43
|
+
/** The lock key */
|
|
44
|
+
key: string;
|
|
45
|
+
/** The lock value (unique identifier) */
|
|
46
|
+
value: string;
|
|
47
|
+
}
|
|
48
|
+
export declare class DistributedLock {
|
|
49
|
+
private driver;
|
|
50
|
+
private driverType;
|
|
51
|
+
private keyPrefix;
|
|
52
|
+
private defaultTTL;
|
|
53
|
+
private defaultRetryCount;
|
|
54
|
+
private defaultRetryDelay;
|
|
55
|
+
private _isConnected;
|
|
56
|
+
constructor(config?: LockConfig);
|
|
57
|
+
/**
|
|
58
|
+
* Connect to the lock backend (Redis only)
|
|
59
|
+
*/
|
|
60
|
+
connect(): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Disconnect from the lock backend
|
|
63
|
+
*/
|
|
64
|
+
disconnect(): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Check if connected
|
|
67
|
+
*/
|
|
68
|
+
get isConnected(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Get the driver type
|
|
71
|
+
*/
|
|
72
|
+
getDriverType(): "redis" | "memory";
|
|
73
|
+
/**
|
|
74
|
+
* Generate a unique lock value
|
|
75
|
+
*/
|
|
76
|
+
private generateLockValue;
|
|
77
|
+
/**
|
|
78
|
+
* Try to acquire a lock without retry
|
|
79
|
+
*/
|
|
80
|
+
private tryAcquire;
|
|
81
|
+
/**
|
|
82
|
+
* Acquire a lock
|
|
83
|
+
* Returns a LockHandle that can be used to release or extend the lock
|
|
84
|
+
*/
|
|
85
|
+
acquire(key: string, options?: LockOptions): Promise<LockHandle>;
|
|
86
|
+
/**
|
|
87
|
+
* Acquire a lock and execute a function
|
|
88
|
+
* Automatically releases the lock when done
|
|
89
|
+
*/
|
|
90
|
+
withLock<T>(key: string, fn: (lock: LockHandle) => Promise<T>, options?: LockOptions): Promise<T>;
|
|
91
|
+
/**
|
|
92
|
+
* Acquire a lock with automatic extension for long-running operations
|
|
93
|
+
*/
|
|
94
|
+
withAutoExtend<T>(key: string, fn: (lock: LockHandle) => Promise<T>, options?: LockOptions): Promise<T>;
|
|
95
|
+
/**
|
|
96
|
+
* Try to acquire a lock without waiting
|
|
97
|
+
* Returns immediately whether the lock was acquired
|
|
98
|
+
*/
|
|
99
|
+
tryLock(key: string, options?: LockOptions): Promise<LockHandle>;
|
|
100
|
+
/**
|
|
101
|
+
* Check if a lock exists (anyone holds it)
|
|
102
|
+
*/
|
|
103
|
+
isLocked(key: string): Promise<boolean>;
|
|
104
|
+
/**
|
|
105
|
+
* Force release a lock (dangerous - use with caution)
|
|
106
|
+
* This will release the lock regardless of ownership
|
|
107
|
+
*/
|
|
108
|
+
forceRelease(key: string): Promise<void>;
|
|
109
|
+
private sleep;
|
|
110
|
+
}
|
|
111
|
+
export declare class LockAcquireError extends Error {
|
|
112
|
+
constructor(message: string);
|
|
113
|
+
}
|
|
114
|
+
export declare class LockTimeoutError extends Error {
|
|
115
|
+
constructor(message: string);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create a distributed lock instance
|
|
119
|
+
*/
|
|
120
|
+
export declare function createDistributedLock(config?: LockConfig): DistributedLock;
|
|
121
|
+
/**
|
|
122
|
+
* Create a Redis-based distributed lock
|
|
123
|
+
*/
|
|
124
|
+
export declare function createRedisLock(url: string, options?: Omit<LockConfig, "driver" | "url">): DistributedLock;
|
|
125
|
+
/**
|
|
126
|
+
* Create an in-memory lock (for development/testing)
|
|
127
|
+
*/
|
|
128
|
+
export declare function createMemoryLock(): DistributedLock;
|
|
129
|
+
/**
|
|
130
|
+
* Get the default lock instance
|
|
131
|
+
*/
|
|
132
|
+
export declare function getDefaultLock(): DistributedLock;
|
|
133
|
+
/**
|
|
134
|
+
* Set the default lock instance
|
|
135
|
+
*/
|
|
136
|
+
export declare function setDefaultLock(lock: DistributedLock): void;
|
|
137
|
+
/**
|
|
138
|
+
* Acquire a lock using the default instance
|
|
139
|
+
*/
|
|
140
|
+
export declare function lock<T>(key: string, fn: () => Promise<T>, options?: LockOptions): Promise<T>;
|
|
141
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lock/index.ts"],"names":[],"mappings":"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"}
|