@buenojs/bueno 0.8.9 → 0.8.11
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/README.md +1 -1
- package/dist/cache/index.d.ts +187 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +595 -0
- package/dist/cache/index.js.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 +9 -9
- package/dist/cli/bin.js.map +1 -0
- 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/add-frontend.js +376 -0
- package/dist/cli/commands/add-frontend.js.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/build.js +347 -0
- package/dist/cli/commands/build.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 +205 -0
- package/dist/cli/commands/dev.js.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/generate.js +491 -0
- package/dist/cli/commands/generate.js.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/help.js +51 -0
- package/dist/cli/commands/help.js.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/index.js +77 -0
- package/dist/cli/commands/index.js.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/migration.js +295 -0
- package/dist/cli/commands/migration.js.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/new.js +641 -0
- package/dist/cli/commands/new.js.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/commands/start.js +171 -0
- package/dist/cli/commands/start.js.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/args.js +224 -0
- package/dist/cli/core/args.js.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/console.js +268 -0
- package/dist/cli/core/console.js.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/index.js +10 -0
- package/dist/cli/core/index.js.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/prompt.js +338 -0
- package/dist/cli/core/prompt.js.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/core/spinner.js +208 -0
- package/dist/cli/core/spinner.js.map +1 -0
- package/dist/cli/index.d.ts +47 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +127 -0
- package/dist/cli/index.js.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/index.js +49 -0
- package/dist/cli/templates/database/index.js.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/mysql.js +12 -0
- package/dist/cli/templates/database/mysql.js.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/none.js +14 -0
- package/dist/cli/templates/database/none.js.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/postgresql.js +12 -0
- package/dist/cli/templates/database/postgresql.js.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/database/sqlite.js +12 -0
- package/dist/cli/templates/database/sqlite.js.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/deploy.js +278 -0
- package/dist/cli/templates/deploy.js.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/docker.js +298 -0
- package/dist/cli/templates/docker.js.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/index.js +40 -0
- package/dist/cli/templates/frontend/index.js.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/none.js +15 -0
- package/dist/cli/templates/frontend/none.js.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/react.js +139 -0
- package/dist/cli/templates/frontend/react.js.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/solid.js +133 -0
- package/dist/cli/templates/frontend/solid.js.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/svelte.js +130 -0
- package/dist/cli/templates/frontend/svelte.js.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/frontend/vue.js +129 -0
- package/dist/cli/templates/frontend/vue.js.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/index.js +308 -0
- package/dist/cli/templates/generators/index.js.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/generators/types.js +21 -0
- package/dist/cli/templates/generators/types.js.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/index.js +18 -0
- package/dist/cli/templates/index.js.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/api.js +79 -0
- package/dist/cli/templates/project/api.js.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/default.js +136 -0
- package/dist/cli/templates/project/default.js.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/fullstack.js +19 -0
- package/dist/cli/templates/project/fullstack.js.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/index.js +60 -0
- package/dist/cli/templates/project/index.js.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/minimal.js +43 -0
- package/dist/cli/templates/project/minimal.js.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/types.js +7 -0
- package/dist/cli/templates/project/types.js.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/templates/project/website.js +312 -0
- package/dist/cli/templates/project/website.js.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/fs.js +350 -0
- package/dist/cli/utils/fs.js.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/index.js +9 -0
- package/dist/cli/utils/index.js.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/strings.js +190 -0
- package/dist/cli/utils/strings.js.map +1 -0
- package/dist/cli/utils/version.d.ts +15 -0
- package/dist/cli/utils/version.d.ts.map +1 -0
- package/dist/cli/utils/version.js +38 -0
- package/dist/cli/utils/version.js.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-validation.js +77 -0
- package/dist/config/env-validation.js.map +1 -0
- package/dist/config/env.d.ts +167 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +392 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/index.d.ts +168 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +329 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +81 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +242 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/merge.d.ts +66 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +226 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/types.d.ts +322 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +443 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +100 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +548 -0
- package/dist/config/validation.js.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/forward-ref.js +105 -0
- package/dist/container/forward-ref.js.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.map +1 -0
- package/dist/context/index.d.ts +143 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js.map +1 -0
- package/dist/database/index.d.ts +219 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/migrations/index.d.ts +151 -0
- package/dist/database/migrations/index.d.ts.map +1 -0
- package/dist/database/migrations/index.js +258 -0
- package/dist/database/migrations/index.js.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/builder.js +355 -0
- package/dist/database/orm/builder.js.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/index.js +131 -0
- package/dist/database/orm/casts/index.js.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/casts/types.js +5 -0
- package/dist/database/orm/casts/types.js.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/compiler.js +218 -0
- package/dist/database/orm/compiler.js.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/hooks/index.js +81 -0
- package/dist/database/orm/hooks/index.js.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/index.js +23 -0
- package/dist/database/orm/index.js.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-registry.js +49 -0
- package/dist/database/orm/model-registry.js.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/model.js +599 -0
- package/dist/database/orm/model.js.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/base.js +84 -0
- package/dist/database/orm/relationships/base.js.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-many.js +136 -0
- package/dist/database/orm/relationships/belongs-to-many.js.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/belongs-to.js +38 -0
- package/dist/database/orm/relationships/belongs-to.js.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-many.js +35 -0
- package/dist/database/orm/relationships/has-many.js.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/has-one.js +32 -0
- package/dist/database/orm/relationships/has-one.js.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/relationships/index.js +9 -0
- package/dist/database/orm/relationships/index.js.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/orm/scopes/index.js +47 -0
- package/dist/database/orm/scopes/index.js.map +1 -0
- package/dist/database/schema/index.d.ts +155 -0
- package/dist/database/schema/index.d.ts.map +1 -0
- package/dist/database/schema/index.js +401 -0
- package/dist/database/schema/index.js.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/api-routes.js +548 -0
- package/dist/frontend/api-routes.js.map +1 -0
- package/dist/frontend/bundler.d.ts +99 -0
- package/dist/frontend/bundler.d.ts.map +1 -0
- package/dist/frontend/bundler.js +555 -0
- package/dist/frontend/bundler.js.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-client.js +414 -0
- package/dist/frontend/console-client.js.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/console-stream.js +535 -0
- package/dist/frontend/console-stream.js.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/dev-server.js +735 -0
- package/dist/frontend/dev-server.js.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/file-router.js +531 -0
- package/dist/frontend/file-router.js.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/index.js +87 -0
- package/dist/frontend/frameworks/index.js.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/react.js +66 -0
- package/dist/frontend/frameworks/react.js.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/solid.js +84 -0
- package/dist/frontend/frameworks/solid.js.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/svelte.js +90 -0
- package/dist/frontend/frameworks/svelte.js.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/frameworks/vue.js +72 -0
- package/dist/frontend/frameworks/vue.js.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-client.js +654 -0
- package/dist/frontend/hmr-client.js.map +1 -0
- package/dist/frontend/hmr.d.ts +185 -0
- package/dist/frontend/hmr.d.ts.map +1 -0
- package/dist/frontend/hmr.js +619 -0
- package/dist/frontend/hmr.js.map +1 -0
- package/dist/frontend/index.d.ts +34 -0
- package/dist/frontend/index.d.ts.map +1 -0
- package/dist/frontend/index.js.map +1 -0
- package/dist/frontend/islands.d.ts +135 -0
- package/dist/frontend/islands.d.ts.map +1 -0
- package/dist/frontend/islands.js +455 -0
- package/dist/frontend/islands.js.map +1 -0
- package/dist/frontend/isr.d.ts +143 -0
- package/dist/frontend/isr.d.ts.map +1 -0
- package/dist/frontend/isr.js +440 -0
- package/dist/frontend/isr.js.map +1 -0
- package/dist/frontend/layout.d.ts +140 -0
- package/dist/frontend/layout.d.ts.map +1 -0
- package/dist/frontend/layout.js +392 -0
- package/dist/frontend/layout.js.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/react.js +373 -0
- package/dist/frontend/ssr/react.js.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/solid.js +440 -0
- package/dist/frontend/ssr/solid.js.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/svelte.js +439 -0
- package/dist/frontend/ssr/svelte.js.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/vue.js +385 -0
- package/dist/frontend/ssr/vue.js.map +1 -0
- package/dist/frontend/ssr.d.ts +147 -0
- package/dist/frontend/ssr.d.ts.map +1 -0
- package/dist/frontend/ssr.js +609 -0
- package/dist/frontend/ssr.js.map +1 -0
- package/dist/frontend/types.d.ts +1902 -0
- package/dist/frontend/types.d.ts.map +1 -0
- package/dist/frontend/types.js +8 -0
- package/dist/frontend/types.js.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/built-in-engine.js +443 -0
- package/dist/graphql/built-in-engine.js.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/context-builder.js +91 -0
- package/dist/graphql/context-builder.js.map +1 -0
- package/dist/graphql/decorators.d.ts +162 -0
- package/dist/graphql/decorators.d.ts.map +1 -0
- package/dist/graphql/decorators.js +291 -0
- package/dist/graphql/decorators.js.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/execution-pipeline.js +127 -0
- package/dist/graphql/execution-pipeline.js.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/graphql-module.js +442 -0
- package/dist/graphql/graphql-module.js.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.map +1 -0
- package/dist/graphql/metadata.d.ts +37 -0
- package/dist/graphql/metadata.d.ts.map +1 -0
- package/dist/graphql/metadata.js +130 -0
- package/dist/graphql/metadata.js.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/schema-builder.js +251 -0
- package/dist/graphql/schema-builder.js.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/subscription-handler.js +201 -0
- package/dist/graphql/subscription-handler.js.map +1 -0
- package/dist/graphql/types.d.ts +252 -0
- package/dist/graphql/types.d.ts.map +1 -0
- package/dist/graphql/types.js +28 -0
- package/dist/graphql/types.js.map +1 -0
- package/dist/health/index.d.ts +176 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js.map +1 -0
- package/dist/i18n/engine.d.ts +105 -0
- package/dist/i18n/engine.d.ts.map +1 -0
- package/dist/i18n/engine.js +248 -0
- package/dist/i18n/engine.js.map +1 -0
- package/dist/i18n/index.d.ts +13 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/loader.d.ts +79 -0
- package/dist/i18n/loader.d.ts.map +1 -0
- package/dist/i18n/loader.js +192 -0
- package/dist/i18n/loader.js.map +1 -0
- package/dist/i18n/middleware.d.ts +96 -0
- package/dist/i18n/middleware.d.ts.map +1 -0
- package/dist/i18n/middleware.js +126 -0
- package/dist/i18n/middleware.js.map +1 -0
- package/dist/i18n/negotiator.d.ts +84 -0
- package/dist/i18n/negotiator.d.ts.map +1 -0
- package/dist/i18n/negotiator.js +139 -0
- package/dist/i18n/negotiator.js.map +1 -0
- package/dist/i18n/types.d.ts +129 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/drivers/memory.d.ts +38 -0
- package/dist/jobs/drivers/memory.d.ts.map +1 -0
- package/dist/jobs/drivers/memory.js +246 -0
- package/dist/jobs/drivers/memory.js.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/drivers/redis.js +355 -0
- package/dist/jobs/drivers/redis.js.map +1 -0
- package/dist/jobs/index.d.ts +12 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/queue.d.ts +93 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +233 -0
- package/dist/jobs/queue.js.map +1 -0
- package/dist/jobs/types.d.ts +193 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +8 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/jobs/worker.d.ts +91 -0
- package/dist/jobs/worker.d.ts.map +1 -0
- package/dist/jobs/worker.js +300 -0
- package/dist/jobs/worker.js.map +1 -0
- package/dist/lock/index.d.ts +141 -0
- package/dist/lock/index.d.ts.map +1 -0
- package/dist/lock/index.js.map +1 -0
- package/dist/logger/index.d.ts +156 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/transports/index.d.ts +371 -0
- package/dist/logger/transports/index.d.ts.map +1 -0
- package/dist/logger/transports/index.js +740 -0
- package/dist/logger/transports/index.js.map +1 -0
- package/dist/metrics/index.d.ts +163 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js.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/built-in.js +220 -0
- package/dist/middleware/built-in.js.map +1 -0
- package/dist/middleware/index.d.ts +40 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/migrations/index.d.ts +48 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +3 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/modules/filters.d.ts +150 -0
- package/dist/modules/filters.d.ts.map +1 -0
- package/dist/modules/filters.js +338 -0
- package/dist/modules/filters.js.map +1 -0
- package/dist/modules/guards.d.ts +188 -0
- package/dist/modules/guards.d.ts.map +1 -0
- package/dist/modules/guards.js +278 -0
- package/dist/modules/guards.js.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.map +1 -0
- package/dist/modules/interceptors.d.ts +242 -0
- package/dist/modules/interceptors.d.ts.map +1 -0
- package/dist/modules/interceptors.js +407 -0
- package/dist/modules/interceptors.js.map +1 -0
- package/dist/modules/lazy.d.ts +187 -0
- package/dist/modules/lazy.d.ts.map +1 -0
- package/dist/modules/lazy.js +305 -0
- package/dist/modules/lazy.js.map +1 -0
- package/dist/modules/lifecycle.d.ts +221 -0
- package/dist/modules/lifecycle.d.ts.map +1 -0
- package/dist/modules/lifecycle.js +314 -0
- package/dist/modules/lifecycle.js.map +1 -0
- package/dist/modules/metadata.d.ts +32 -0
- package/dist/modules/metadata.d.ts.map +1 -0
- package/dist/modules/metadata.js +59 -0
- package/dist/modules/metadata.js.map +1 -0
- package/dist/modules/pipes.d.ts +287 -0
- package/dist/modules/pipes.d.ts.map +1 -0
- package/dist/modules/pipes.js +443 -0
- package/dist/modules/pipes.js.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/base.js +37 -0
- package/dist/notification/channels/base.js.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/email.js +85 -0
- package/dist/notification/channels/email.js.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/push.js +84 -0
- package/dist/notification/channels/push.js.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/sms.js +83 -0
- package/dist/notification/channels/sms.js.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/channels/whatsapp.js +81 -0
- package/dist/notification/channels/whatsapp.js.map +1 -0
- package/dist/notification/index.d.ts +15 -0
- package/dist/notification/index.d.ts.map +1 -0
- package/dist/notification/index.js.map +1 -0
- package/dist/notification/service.d.ts +100 -0
- package/dist/notification/service.d.ts.map +1 -0
- package/dist/notification/service.js +279 -0
- package/dist/notification/service.js.map +1 -0
- package/dist/notification/types.d.ts +253 -0
- package/dist/notification/types.d.ts.map +1 -0
- package/dist/notification/types.js +14 -0
- package/dist/notification/types.js.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/__tests__/observability.test.js +404 -0
- package/dist/observability/__tests__/observability.test.js.map +1 -0
- package/dist/observability/breadcrumbs.d.ts +48 -0
- package/dist/observability/breadcrumbs.d.ts.map +1 -0
- package/dist/observability/breadcrumbs.js +97 -0
- package/dist/observability/breadcrumbs.js.map +1 -0
- package/dist/observability/index.d.ts +95 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/interceptor.d.ts +19 -0
- package/dist/observability/interceptor.d.ts.map +1 -0
- package/dist/observability/interceptor.js +67 -0
- package/dist/observability/interceptor.js.map +1 -0
- package/dist/observability/service.d.ts +101 -0
- package/dist/observability/service.d.ts.map +1 -0
- package/dist/observability/service.js +249 -0
- package/dist/observability/service.js.map +1 -0
- package/dist/observability/trace.d.ts +21 -0
- package/dist/observability/trace.d.ts.map +1 -0
- package/dist/observability/trace.js +35 -0
- package/dist/observability/trace.js.map +1 -0
- package/dist/observability/types.d.ts +172 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +8 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/openapi/decorators.d.ts +173 -0
- package/dist/openapi/decorators.d.ts.map +1 -0
- package/dist/openapi/decorators.js +276 -0
- package/dist/openapi/decorators.js.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/document-builder.js +228 -0
- package/dist/openapi/document-builder.js.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.map +1 -0
- package/dist/openapi/metadata.d.ts +36 -0
- package/dist/openapi/metadata.d.ts.map +1 -0
- package/dist/openapi/metadata.js +78 -0
- package/dist/openapi/metadata.js.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/route-scanner.js +174 -0
- package/dist/openapi/route-scanner.js.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/schema-generator.js +236 -0
- package/dist/openapi/schema-generator.js.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/swagger-module.js +143 -0
- package/dist/openapi/swagger-module.js.map +1 -0
- package/dist/openapi/types.d.ts +344 -0
- package/dist/openapi/types.d.ts.map +1 -0
- package/dist/openapi/types.js +7 -0
- package/dist/openapi/types.js.map +1 -0
- package/dist/orm/index.d.ts +10 -0
- package/dist/orm/index.d.ts.map +1 -0
- package/dist/orm/index.js.map +1 -0
- package/dist/router/index.d.ts +73 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/linear.d.ts +54 -0
- package/dist/router/linear.d.ts.map +1 -0
- package/dist/router/linear.js +261 -0
- package/dist/router/linear.js.map +1 -0
- package/dist/router/regex.d.ts +49 -0
- package/dist/router/regex.d.ts.map +1 -0
- package/dist/router/regex.js +201 -0
- package/dist/router/regex.js.map +1 -0
- package/dist/router/tree.d.ts +112 -0
- package/dist/router/tree.d.ts.map +1 -0
- package/dist/router/tree.js +360 -0
- package/dist/router/tree.js.map +1 -0
- package/dist/rpc/index.d.ts +321 -0
- package/dist/rpc/index.d.ts.map +1 -0
- package/dist/rpc/index.js.map +1 -0
- package/dist/schema/index.d.ts +10 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/security/index.d.ts +126 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +309 -0
- package/dist/security/index.js.map +1 -0
- package/dist/ssg/index.d.ts +73 -0
- package/dist/ssg/index.d.ts.map +1 -0
- package/dist/ssg/index.js +464 -0
- package/dist/ssg/index.js.map +1 -0
- package/dist/storage/index.d.ts +99 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +338 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/telemetry/index.d.ts +376 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/template/index.d.ts +7 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js.map +1 -0
- package/dist/templates/engine.d.ts +60 -0
- package/dist/templates/engine.d.ts.map +1 -0
- package/dist/templates/engine.js +177 -0
- package/dist/templates/engine.js.map +1 -0
- package/dist/templates/index.d.ts +9 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/loader.d.ts +45 -0
- package/dist/templates/loader.d.ts.map +1 -0
- package/dist/templates/loader.js +274 -0
- package/dist/templates/loader.js.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/markdown.js +181 -0
- package/dist/templates/renderers/markdown.js.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/renderers/simple.js +245 -0
- package/dist/templates/renderers/simple.js.map +1 -0
- package/dist/templates/types.d.ts +138 -0
- package/dist/templates/types.d.ts.map +1 -0
- package/dist/templates/types.js +8 -0
- package/dist/templates/types.js.map +1 -0
- package/dist/testing/index.d.ts +539 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types/index.d.ts +116 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/validation/index.d.ts +89 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +276 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/schemas.d.ts +283 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +407 -0
- package/dist/validation/schemas.js.map +1 -0
- package/dist/websocket/index.d.ts +252 -0
- package/dist/websocket/index.d.ts.map +1 -0
- package/dist/websocket/index.js +749 -0
- package/dist/websocket/index.js.map +1 -0
- package/llms.txt +1 -1
- package/package.json +3 -3
- package/src/cli/commands/new.ts +1 -1
- package/src/cli/templates/frontend/react.ts +1 -1
- package/src/cli/templates/frontend/solid.ts +1 -1
- package/src/cli/templates/frontend/svelte.ts +1 -1
- package/src/cli/templates/frontend/vue.ts +1 -1
- package/src/cli/templates/project/default.ts +1 -1
- package/src/cli/templates/project/website.ts +3 -3
- package/src/database/migrations/index.ts +8 -0
- package/src/migrations/index.ts +40 -1
- package/src/types/index.ts +1 -1
- package/tsconfig.json +2 -6
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL Execution Pipeline
|
|
3
|
+
*
|
|
4
|
+
* Applies the same guard/interceptor pipeline used for HTTP controllers
|
|
5
|
+
* to GraphQL resolver methods.
|
|
6
|
+
*
|
|
7
|
+
* Guards and interceptors receive the real HTTP Context, enriched with
|
|
8
|
+
* GraphQL-specific metadata:
|
|
9
|
+
* - context.get('graphql:operation') → resolver field name (e.g. 'users')
|
|
10
|
+
* - context.get('graphql:type') → 'query' | 'mutation' | 'subscription'
|
|
11
|
+
* - context.get('graphql:resolver') → resolver class constructor
|
|
12
|
+
*
|
|
13
|
+
* ## Guard Compatibility
|
|
14
|
+
* - ✅ Auth guards reading Authorization/Cookie headers
|
|
15
|
+
* - ✅ API key guards
|
|
16
|
+
* - ✅ Custom guards reading any header/cookie
|
|
17
|
+
* - ⚠️ Route-based guards (reading context.path) — see /graphql for all ops
|
|
18
|
+
* - ⚠️ CSRF guards (may block all POSTs) — need graphql-aware adaptation
|
|
19
|
+
*/
|
|
20
|
+
import { executeGuards, getClassGuards, getMethodGuards, } from "../modules/guards";
|
|
21
|
+
import { executeInterceptors, getClassInterceptors, getMethodInterceptors, isNestInterceptor, isInterceptorFn, } from "../modules/interceptors";
|
|
22
|
+
import { enrichContextForGraphQL } from "./context-builder";
|
|
23
|
+
// ============= Pipeline Executor =============
|
|
24
|
+
/**
|
|
25
|
+
* Execute a resolver method through the full guard → interceptor pipeline.
|
|
26
|
+
*
|
|
27
|
+
* Returns the resolver method's return value, or throws if a guard blocks.
|
|
28
|
+
* GraphQL errors should be caught by the caller and placed into the errors array.
|
|
29
|
+
*/
|
|
30
|
+
export async function executeResolverWithPipeline(options) {
|
|
31
|
+
const { resolverClass, fieldName, resolvedField, args, graphqlContext, httpContext, container, globalGuards, globalInterceptors, operationType, } = options;
|
|
32
|
+
// Enrich HTTP context with GraphQL metadata for guard inspection
|
|
33
|
+
enrichContextForGraphQL(httpContext, fieldName, operationType, resolverClass);
|
|
34
|
+
// Read class-level and method-level guards/interceptors
|
|
35
|
+
const classGuards = getClassGuards(resolverClass) ?? [];
|
|
36
|
+
const methodGuards = getMethodGuards(resolverClass.prototype, fieldName) ?? [];
|
|
37
|
+
const classInterceptors = getClassInterceptors(resolverClass) ?? [];
|
|
38
|
+
const methodInterceptors = getMethodInterceptors(resolverClass.prototype, fieldName) ?? [];
|
|
39
|
+
// Guard resolver helper
|
|
40
|
+
const resolveGuard = (guard) => {
|
|
41
|
+
if (typeof guard === "object" &&
|
|
42
|
+
guard !== null &&
|
|
43
|
+
!("canActivate" in guard)) {
|
|
44
|
+
try {
|
|
45
|
+
return container.resolve(guard);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
};
|
|
53
|
+
// Interceptor resolver helper
|
|
54
|
+
const resolveInterceptor = (interceptor) => {
|
|
55
|
+
if (!isNestInterceptor(interceptor) && !isInterceptorFn(interceptor)) {
|
|
56
|
+
try {
|
|
57
|
+
return container.resolve(interceptor);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
};
|
|
65
|
+
// Step 1: Execute guards
|
|
66
|
+
const guardsPassed = await executeGuards(httpContext, {
|
|
67
|
+
globalGuards,
|
|
68
|
+
classGuards,
|
|
69
|
+
methodGuards,
|
|
70
|
+
resolveGuard,
|
|
71
|
+
});
|
|
72
|
+
if (!guardsPassed) {
|
|
73
|
+
throw new GraphQLForbiddenError(`Access denied to field '${fieldName}'`);
|
|
74
|
+
}
|
|
75
|
+
// Step 2: Execute interceptors wrapping the resolver call
|
|
76
|
+
return executeInterceptors(httpContext, async () => {
|
|
77
|
+
return callResolver(resolvedField, args, graphqlContext);
|
|
78
|
+
}, {
|
|
79
|
+
globalInterceptors,
|
|
80
|
+
classInterceptors,
|
|
81
|
+
methodInterceptors,
|
|
82
|
+
resolveInterceptor,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// ============= Resolver Caller =============
|
|
86
|
+
/**
|
|
87
|
+
* Calls the actual resolver method with the correct argument list.
|
|
88
|
+
* Resolves @Args and @GqlContext parameters at their declared positions.
|
|
89
|
+
*/
|
|
90
|
+
export async function callResolver(field, args, gqlContext) {
|
|
91
|
+
const instance = field.resolverInstance;
|
|
92
|
+
const methodArgs = buildMethodArgs(field, args, gqlContext);
|
|
93
|
+
const result = instance[field.methodName](...methodArgs);
|
|
94
|
+
return result instanceof Promise ? await result : result;
|
|
95
|
+
}
|
|
96
|
+
function buildMethodArgs(field, args, gqlContext) {
|
|
97
|
+
const methodArgs = [];
|
|
98
|
+
for (const param of field.paramMetadata) {
|
|
99
|
+
switch (param.kind) {
|
|
100
|
+
case "context":
|
|
101
|
+
methodArgs[param.index] = gqlContext;
|
|
102
|
+
break;
|
|
103
|
+
case "args":
|
|
104
|
+
methodArgs[param.index] = param.argName ? args[param.argName] : args;
|
|
105
|
+
break;
|
|
106
|
+
case "argsObject":
|
|
107
|
+
methodArgs[param.index] = param.argName ? args[param.argName] : args;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return methodArgs;
|
|
112
|
+
}
|
|
113
|
+
// ============= Custom Error =============
|
|
114
|
+
export class GraphQLForbiddenError extends Error {
|
|
115
|
+
extensions = { code: "FORBIDDEN" };
|
|
116
|
+
constructor(message = "Forbidden") {
|
|
117
|
+
super(message);
|
|
118
|
+
this.name = "GraphQLForbiddenError";
|
|
119
|
+
}
|
|
120
|
+
toGraphQLError() {
|
|
121
|
+
return {
|
|
122
|
+
message: this.message,
|
|
123
|
+
extensions: this.extensions,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=execution-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-pipeline.js","sourceRoot":"","sources":["../../src/graphql/execution-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL Module
|
|
3
|
+
*
|
|
4
|
+
* Static factory class for setting up GraphQL support in a Bueno application.
|
|
5
|
+
*
|
|
6
|
+
* ## Quick Start
|
|
7
|
+
*
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createApp } from '@buenojs/bueno';
|
|
10
|
+
* import { GraphQLModule } from '@buenojs/bueno/graphql';
|
|
11
|
+
*
|
|
12
|
+
* const app = createApp(AppModule);
|
|
13
|
+
*
|
|
14
|
+
* GraphQLModule.setup(app, {
|
|
15
|
+
* resolvers: [UserResolver, PostResolver],
|
|
16
|
+
* playground: true,
|
|
17
|
+
* subscriptions: true,
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* await app.listen(3000);
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* ## Resolver Dependencies
|
|
24
|
+
* Resolvers are instantiated after app.init() via deferred initialization.
|
|
25
|
+
* Dependencies registered in @Module({ providers }) are available automatically.
|
|
26
|
+
*
|
|
27
|
+
* ## Guard/Interceptor Compatibility
|
|
28
|
+
* Guards and interceptors receive the HTTP Context enriched with GraphQL metadata:
|
|
29
|
+
* - context.get('graphql:operation') → field name being resolved
|
|
30
|
+
* - context.get('graphql:type') → 'query' | 'mutation' | 'subscription'
|
|
31
|
+
* Works with: auth guards, API key guards, logging interceptors.
|
|
32
|
+
* May need adaptation: CSRF guards (all GraphQL = POST), route-based guards.
|
|
33
|
+
*/
|
|
34
|
+
import type { Application } from "../modules";
|
|
35
|
+
import type { GraphQLModuleOptions } from "./types";
|
|
36
|
+
import type { ResolvedSchema } from "./types";
|
|
37
|
+
export declare class GraphQLModuleInstance {
|
|
38
|
+
readonly sdl: string;
|
|
39
|
+
readonly resolvedSchema: ResolvedSchema;
|
|
40
|
+
readonly path: string;
|
|
41
|
+
constructor(sdl: string, resolvedSchema: ResolvedSchema, path: string);
|
|
42
|
+
}
|
|
43
|
+
export declare class GraphQLModule {
|
|
44
|
+
/**
|
|
45
|
+
* Set up the GraphQL module on a Bueno application.
|
|
46
|
+
*
|
|
47
|
+
* Registers:
|
|
48
|
+
* - POST <path> — GraphQL query/mutation endpoint
|
|
49
|
+
* - GET <path> — GraphiQL playground (if enabled)
|
|
50
|
+
* - GET <path>/schema — SDL endpoint (if introspection enabled)
|
|
51
|
+
*
|
|
52
|
+
* @param app - The Bueno Application instance
|
|
53
|
+
* @param options - GraphQL configuration
|
|
54
|
+
* @returns GraphQLModuleInstance (access .sdl after first request)
|
|
55
|
+
*/
|
|
56
|
+
static setup(app: Application, options: GraphQLModuleOptions): GraphQLModuleInstance;
|
|
57
|
+
/**
|
|
58
|
+
* Executes a GraphQL request by:
|
|
59
|
+
* 1. Parsing with the engine
|
|
60
|
+
* 2. Running guards/interceptors per top-level field
|
|
61
|
+
* 3. Passing execution back to the engine for sub-selection resolution
|
|
62
|
+
*
|
|
63
|
+
* For the built-in engine this is simple since it handles everything.
|
|
64
|
+
* For external engines, we run guards/interceptors on the top-level
|
|
65
|
+
* operation fields, then delegate full execution to the engine.
|
|
66
|
+
*/
|
|
67
|
+
private static executeWithPipeline;
|
|
68
|
+
private static fieldToApiProperty;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=graphql-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-module.d.ts","sourceRoot":"","sources":["../../src/graphql/graphql-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,KAAK,EAAE,oBAAoB,EAAiB,MAAM,SAAS,CAAC;AAWnE,OAAO,KAAK,EAAiB,cAAc,EAAwB,MAAM,SAAS,CAAC;AAgCnF,qBAAa,qBAAqB;IAEhC,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,QAAQ,CAAC,cAAc,EAAE,cAAc;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAFZ,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,cAAc,EAC9B,IAAI,EAAE,MAAM;CAEtB;AA6FD,qBAAa,aAAa;IACzB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,KAAK,CACX,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,oBAAoB,GAC3B,qBAAqB;IAmJxB;;;;;;;;;OASG;mBACkB,mBAAmB;IA+DxC,OAAO,CAAC,MAAM,CAAC,kBAAkB;CAoCjC"}
|
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL Module
|
|
3
|
+
*
|
|
4
|
+
* Static factory class for setting up GraphQL support in a Bueno application.
|
|
5
|
+
*
|
|
6
|
+
* ## Quick Start
|
|
7
|
+
*
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createApp } from '@buenojs/bueno';
|
|
10
|
+
* import { GraphQLModule } from '@buenojs/bueno/graphql';
|
|
11
|
+
*
|
|
12
|
+
* const app = createApp(AppModule);
|
|
13
|
+
*
|
|
14
|
+
* GraphQLModule.setup(app, {
|
|
15
|
+
* resolvers: [UserResolver, PostResolver],
|
|
16
|
+
* playground: true,
|
|
17
|
+
* subscriptions: true,
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* await app.listen(3000);
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* ## Resolver Dependencies
|
|
24
|
+
* Resolvers are instantiated after app.init() via deferred initialization.
|
|
25
|
+
* Dependencies registered in @Module({ providers }) are available automatically.
|
|
26
|
+
*
|
|
27
|
+
* ## Guard/Interceptor Compatibility
|
|
28
|
+
* Guards and interceptors receive the HTTP Context enriched with GraphQL metadata:
|
|
29
|
+
* - context.get('graphql:operation') → field name being resolved
|
|
30
|
+
* - context.get('graphql:type') → 'query' | 'mutation' | 'subscription'
|
|
31
|
+
* Works with: auth guards, API key guards, logging interceptors.
|
|
32
|
+
* May need adaptation: CSRF guards (all GraphQL = POST), route-based guards.
|
|
33
|
+
*/
|
|
34
|
+
import { getInjectTokens, resolveForwardRef, } from "../container";
|
|
35
|
+
import { SchemaBuilder, getRegisteredTypeClasses } from "./schema-builder";
|
|
36
|
+
import { BuiltinGraphQLEngine } from "./built-in-engine";
|
|
37
|
+
import { SubscriptionHandler } from "./subscription-handler";
|
|
38
|
+
import { buildGraphQLContext, parseGraphQLRequest } from "./context-builder";
|
|
39
|
+
// ============= Playground HTML =============
|
|
40
|
+
function generatePlaygroundHTML(path) {
|
|
41
|
+
return `<!DOCTYPE html>
|
|
42
|
+
<html>
|
|
43
|
+
<head>
|
|
44
|
+
<meta charset="utf-8" />
|
|
45
|
+
<title>GraphQL Playground</title>
|
|
46
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
47
|
+
<link rel="stylesheet" href="https://unpkg.com/graphiql@3/graphiql.min.css" />
|
|
48
|
+
<style>body { margin: 0; }</style>
|
|
49
|
+
</head>
|
|
50
|
+
<body>
|
|
51
|
+
<div id="graphiql" style="height:100vh;"></div>
|
|
52
|
+
<script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
|
|
53
|
+
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
|
|
54
|
+
<script crossorigin src="https://unpkg.com/graphiql@3/graphiql.min.js"></script>
|
|
55
|
+
<script>
|
|
56
|
+
const root = ReactDOM.createRoot(document.getElementById('graphiql'));
|
|
57
|
+
root.render(React.createElement(GraphiQL, {
|
|
58
|
+
fetcher: GraphiQL.createFetcher({ url: '${path}' }),
|
|
59
|
+
}));
|
|
60
|
+
</script>
|
|
61
|
+
</body>
|
|
62
|
+
</html>`;
|
|
63
|
+
}
|
|
64
|
+
// ============= GraphQL Module Instance =============
|
|
65
|
+
export class GraphQLModuleInstance {
|
|
66
|
+
sdl;
|
|
67
|
+
resolvedSchema;
|
|
68
|
+
path;
|
|
69
|
+
constructor(sdl, resolvedSchema, path) {
|
|
70
|
+
this.sdl = sdl;
|
|
71
|
+
this.resolvedSchema = resolvedSchema;
|
|
72
|
+
this.path = path;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// ============= Deferred Initializer =============
|
|
76
|
+
/**
|
|
77
|
+
* Handles deferred resolver initialization.
|
|
78
|
+
* Resolvers can only be instantiated after app.init() completes
|
|
79
|
+
* (all DI providers must be registered and resolved first).
|
|
80
|
+
*
|
|
81
|
+
* The route handler calls ensureInitialized() on first request,
|
|
82
|
+
* which is always after app.init() has completed.
|
|
83
|
+
*/
|
|
84
|
+
class DeferredInitializer {
|
|
85
|
+
resolverClasses;
|
|
86
|
+
app;
|
|
87
|
+
engine;
|
|
88
|
+
initialized = false;
|
|
89
|
+
initPromise = null;
|
|
90
|
+
initError = null;
|
|
91
|
+
resolverInstances = new Map();
|
|
92
|
+
resolverFields = null;
|
|
93
|
+
resolvedSchema = null;
|
|
94
|
+
sdl = "";
|
|
95
|
+
engineSchema = null;
|
|
96
|
+
constructor(resolverClasses, app, engine) {
|
|
97
|
+
this.resolverClasses = resolverClasses;
|
|
98
|
+
this.app = app;
|
|
99
|
+
this.engine = engine;
|
|
100
|
+
}
|
|
101
|
+
async ensureInitialized() {
|
|
102
|
+
if (this.initialized) {
|
|
103
|
+
if (this.initError)
|
|
104
|
+
throw this.initError;
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (this.initPromise) {
|
|
108
|
+
await this.initPromise;
|
|
109
|
+
if (this.initError)
|
|
110
|
+
throw this.initError;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this.initPromise = this.initialize();
|
|
114
|
+
await this.initPromise;
|
|
115
|
+
if (this.initError)
|
|
116
|
+
throw this.initError;
|
|
117
|
+
}
|
|
118
|
+
async initialize() {
|
|
119
|
+
try {
|
|
120
|
+
// Instantiate resolvers via DI (same pattern as registerController)
|
|
121
|
+
for (const ResolverClass of this.resolverClasses) {
|
|
122
|
+
if (this.resolverInstances.has(ResolverClass))
|
|
123
|
+
continue;
|
|
124
|
+
// Register in container if not already present
|
|
125
|
+
const token = ResolverClass;
|
|
126
|
+
if (!this.app.container.has(token)) {
|
|
127
|
+
this.app.container.register({
|
|
128
|
+
token,
|
|
129
|
+
useClass: ResolverClass,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
// Resolve inject tokens from @Inject decorators
|
|
133
|
+
const injectTokens = getInjectTokens(ResolverClass, "inject:tokens") ?? [];
|
|
134
|
+
const deps = injectTokens.map((t) => {
|
|
135
|
+
const resolved = resolveForwardRef(t);
|
|
136
|
+
return this.app.container.resolve(resolved);
|
|
137
|
+
});
|
|
138
|
+
const instance = new ResolverClass(...deps);
|
|
139
|
+
this.resolverInstances.set(ResolverClass, instance);
|
|
140
|
+
}
|
|
141
|
+
// Build schema
|
|
142
|
+
const builder = new SchemaBuilder(this.resolverClasses, this.resolverInstances);
|
|
143
|
+
const { sdl, resolvedSchema, resolverFields, typeFields } = builder.build();
|
|
144
|
+
this.sdl = sdl;
|
|
145
|
+
this.resolvedSchema = resolvedSchema;
|
|
146
|
+
this.resolverFields = resolverFields;
|
|
147
|
+
this.engineSchema = this.engine.buildSchema(resolverFields, typeFields, sdl);
|
|
148
|
+
this.initialized = true;
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
this.initError = err instanceof Error ? err : new Error(String(err));
|
|
152
|
+
throw this.initError;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// ============= GraphQL Module =============
|
|
157
|
+
export class GraphQLModule {
|
|
158
|
+
/**
|
|
159
|
+
* Set up the GraphQL module on a Bueno application.
|
|
160
|
+
*
|
|
161
|
+
* Registers:
|
|
162
|
+
* - POST <path> — GraphQL query/mutation endpoint
|
|
163
|
+
* - GET <path> — GraphiQL playground (if enabled)
|
|
164
|
+
* - GET <path>/schema — SDL endpoint (if introspection enabled)
|
|
165
|
+
*
|
|
166
|
+
* @param app - The Bueno Application instance
|
|
167
|
+
* @param options - GraphQL configuration
|
|
168
|
+
* @returns GraphQLModuleInstance (access .sdl after first request)
|
|
169
|
+
*/
|
|
170
|
+
static setup(app, options) {
|
|
171
|
+
const engine = options.engine ?? new BuiltinGraphQLEngine();
|
|
172
|
+
const path = options.path ?? "/graphql";
|
|
173
|
+
const introspection = options.introspection !== false;
|
|
174
|
+
// Determine playground: only auto-enable with engines that support introspection
|
|
175
|
+
const playgroundEnabled = options.playground !== undefined
|
|
176
|
+
? options.playground
|
|
177
|
+
: engine.supportsIntrospection;
|
|
178
|
+
if (options.playground === true && !engine.supportsIntrospection) {
|
|
179
|
+
console.warn("[GraphQL] Playground enabled but the built-in engine does not support " +
|
|
180
|
+
"introspection. GraphiQL will not work correctly. " +
|
|
181
|
+
"Use GraphQLJsAdapter for full playground support.");
|
|
182
|
+
}
|
|
183
|
+
// Deferred initializer (resolvers instantiated after app.init())
|
|
184
|
+
const initializer = new DeferredInitializer(options.resolvers, app, engine);
|
|
185
|
+
// ── POST <path> — Query / Mutation handler ──
|
|
186
|
+
app.router.post(path, async (httpContext) => {
|
|
187
|
+
// Parse request body
|
|
188
|
+
const parsed = await parseGraphQLRequest(httpContext.req);
|
|
189
|
+
if (!parsed) {
|
|
190
|
+
return httpContext.json({
|
|
191
|
+
errors: [{ message: "Invalid GraphQL request: expected JSON body with 'query' field" }],
|
|
192
|
+
}, { status: 400 });
|
|
193
|
+
}
|
|
194
|
+
// Lazy initialize resolvers (only on first request, after app.init())
|
|
195
|
+
try {
|
|
196
|
+
await initializer.ensureInitialized();
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
return httpContext.json({
|
|
200
|
+
errors: [{ message: `GraphQL initialization failed: ${err.message}` }],
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
const gqlContext = buildGraphQLContext(httpContext);
|
|
204
|
+
const schema = initializer.engineSchema;
|
|
205
|
+
const fields = initializer.resolverFields;
|
|
206
|
+
// Determine operation type from query string
|
|
207
|
+
const trimmed = parsed.query.trim();
|
|
208
|
+
const isMutation = trimmed.startsWith("mutation");
|
|
209
|
+
const operationType = isMutation ? "mutation" : "query";
|
|
210
|
+
const operationFields = isMutation ? fields.mutations : fields.queries;
|
|
211
|
+
// Execute with engine (which calls resolvers via execution pipeline)
|
|
212
|
+
// We wrap the engine execution to run guards/interceptors per field
|
|
213
|
+
let result;
|
|
214
|
+
try {
|
|
215
|
+
result = await GraphQLModule.executeWithPipeline(engine, schema, parsed, gqlContext, httpContext, operationFields, operationType, isMutation ? "mutation" : "query", options, app);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
result = {
|
|
219
|
+
errors: [{ message: err.message }],
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
return httpContext.json(result);
|
|
223
|
+
});
|
|
224
|
+
// ── GET <path>/schema — SDL endpoint ──
|
|
225
|
+
if (introspection) {
|
|
226
|
+
app.router.get(`${path}/schema`, async (httpContext) => {
|
|
227
|
+
await initializer.ensureInitialized().catch(() => { });
|
|
228
|
+
return httpContext.text(initializer.sdl || "# Schema not yet initialized");
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
// ── GET <path> — Playground ──
|
|
232
|
+
if (playgroundEnabled) {
|
|
233
|
+
app.router.get(path, (httpContext) => {
|
|
234
|
+
return httpContext.html(generatePlaygroundHTML(path));
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
// ── Subscriptions ──
|
|
238
|
+
if (options.subscriptions) {
|
|
239
|
+
if (!engine.supportsSubscriptions) {
|
|
240
|
+
console.warn("[GraphQL] subscriptions: true but the configured engine does not support " +
|
|
241
|
+
"subscriptions. Use GraphQLJsAdapter for subscription support.");
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
const subHandler = new SubscriptionHandler(engine, null, // engineSchema set after init
|
|
245
|
+
path, app.container, app.getGlobalGuards(), app.getGlobalInterceptors());
|
|
246
|
+
app.setWebSocketHandler(subHandler.getWebSocketConfig());
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// ── Optional OpenAPI sync ──
|
|
250
|
+
if (options.syncOpenAPI) {
|
|
251
|
+
// Deferred: runs after first initialization when type classes are known
|
|
252
|
+
queueMicrotask(async () => {
|
|
253
|
+
try {
|
|
254
|
+
await initializer.ensureInitialized().catch(() => { });
|
|
255
|
+
const typeClasses = getRegisteredTypeClasses();
|
|
256
|
+
const { setApiPropertyMetadata } = await import("../openapi/metadata");
|
|
257
|
+
const { getGqlPropertyKeys, getGqlPropertyMetadata } = await import("./metadata");
|
|
258
|
+
for (const TypeClass of typeClasses) {
|
|
259
|
+
const keys = getGqlPropertyKeys(TypeClass.prototype);
|
|
260
|
+
for (const key of keys) {
|
|
261
|
+
const fieldMeta = getGqlPropertyMetadata(TypeClass.prototype, key);
|
|
262
|
+
if (!fieldMeta)
|
|
263
|
+
continue;
|
|
264
|
+
const apiOptions = GraphQLModule.fieldToApiProperty(fieldMeta);
|
|
265
|
+
setApiPropertyMetadata(TypeClass.prototype, key, apiOptions);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
console.warn("[GraphQL] syncOpenAPI: failed to sync field metadata to OpenAPI store. " +
|
|
271
|
+
"Ensure @buenojs/bueno/openapi is available.");
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
return new GraphQLModuleInstance("", {}, path);
|
|
276
|
+
}
|
|
277
|
+
// ============= Per-field pipeline execution ============
|
|
278
|
+
/**
|
|
279
|
+
* Executes a GraphQL request by:
|
|
280
|
+
* 1. Parsing with the engine
|
|
281
|
+
* 2. Running guards/interceptors per top-level field
|
|
282
|
+
* 3. Passing execution back to the engine for sub-selection resolution
|
|
283
|
+
*
|
|
284
|
+
* For the built-in engine this is simple since it handles everything.
|
|
285
|
+
* For external engines, we run guards/interceptors on the top-level
|
|
286
|
+
* operation fields, then delegate full execution to the engine.
|
|
287
|
+
*/
|
|
288
|
+
static async executeWithPipeline(engine, schema, parsed, gqlContext, httpContext, operationFields, operationType, _opTypeStr, options, app) {
|
|
289
|
+
// Run guards for each top-level operation field in the query
|
|
290
|
+
// We do a lightweight parse to find top-level field names
|
|
291
|
+
const topLevelFields = extractTopLevelFields(parsed.query);
|
|
292
|
+
for (const fieldName of topLevelFields) {
|
|
293
|
+
const resolvedField = operationFields.get(fieldName);
|
|
294
|
+
if (!resolvedField)
|
|
295
|
+
continue;
|
|
296
|
+
// Find which resolver class owns this field
|
|
297
|
+
const resolverClass = findResolverClass(options.resolvers, fieldName, operationType);
|
|
298
|
+
if (!resolverClass)
|
|
299
|
+
continue;
|
|
300
|
+
// Run guards and interceptors
|
|
301
|
+
const guardsPassed = await runGuardsForField(resolverClass, fieldName, httpContext, gqlContext, operationType, app);
|
|
302
|
+
if (!guardsPassed) {
|
|
303
|
+
return {
|
|
304
|
+
errors: [
|
|
305
|
+
{
|
|
306
|
+
message: `Access denied to field '${fieldName}'`,
|
|
307
|
+
path: [fieldName],
|
|
308
|
+
extensions: { code: "FORBIDDEN" },
|
|
309
|
+
},
|
|
310
|
+
],
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Execute with engine (handles the actual resolver calls for built-in engine,
|
|
315
|
+
// or full SDL schema execution for external engines)
|
|
316
|
+
return engine.execute(schema, parsed.query, parsed.variables, gqlContext, parsed.operationName);
|
|
317
|
+
}
|
|
318
|
+
// ============= OpenAPI sync helper ============
|
|
319
|
+
static fieldToApiProperty(fieldMeta) {
|
|
320
|
+
const type = fieldMeta.typeFn();
|
|
321
|
+
const isArray = Array.isArray(type);
|
|
322
|
+
const inner = isArray ? type[0] : type;
|
|
323
|
+
let apiType;
|
|
324
|
+
if (inner === String)
|
|
325
|
+
apiType = "string";
|
|
326
|
+
else if (inner === Number)
|
|
327
|
+
apiType = "number";
|
|
328
|
+
else if (inner === Boolean)
|
|
329
|
+
apiType = "boolean";
|
|
330
|
+
else if (inner.name === "GraphQLID")
|
|
331
|
+
apiType = "string";
|
|
332
|
+
else if (inner.name === "GraphQLInt")
|
|
333
|
+
apiType = "integer";
|
|
334
|
+
else if (inner.name === "GraphQLFloat")
|
|
335
|
+
apiType = "number";
|
|
336
|
+
else
|
|
337
|
+
apiType = inner; // class reference — OpenAPI SchemaGenerator will handle
|
|
338
|
+
const options = {
|
|
339
|
+
required: !fieldMeta.nullable,
|
|
340
|
+
};
|
|
341
|
+
if (isArray) {
|
|
342
|
+
options.type = "array";
|
|
343
|
+
options.items =
|
|
344
|
+
typeof apiType === "string"
|
|
345
|
+
? { type: apiType }
|
|
346
|
+
: { $ref: `#/components/schemas/${inner.name}` };
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
options.type = apiType;
|
|
350
|
+
}
|
|
351
|
+
if (fieldMeta.description) {
|
|
352
|
+
options.description = fieldMeta.description;
|
|
353
|
+
}
|
|
354
|
+
return options;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// ============= Helpers ============
|
|
358
|
+
/** Quick regex-based top-level field name extractor — avoids full parse overhead */
|
|
359
|
+
function extractTopLevelFields(query) {
|
|
360
|
+
// Strip operation keyword + optional name + optional variables
|
|
361
|
+
const stripped = query
|
|
362
|
+
.trim()
|
|
363
|
+
.replace(/^(query|mutation)\s*\w*\s*(\([^)]*\))?\s*/, "");
|
|
364
|
+
// Extract the outermost { ... } and find immediate field names
|
|
365
|
+
const match = stripped.match(/^\{([\s\S]*)\}$/);
|
|
366
|
+
if (!match)
|
|
367
|
+
return [];
|
|
368
|
+
const body = match[1];
|
|
369
|
+
const fields = [];
|
|
370
|
+
// Simple state machine — extract names at depth 0
|
|
371
|
+
let depth = 0;
|
|
372
|
+
let nameStart = -1;
|
|
373
|
+
for (let i = 0; i < body.length; i++) {
|
|
374
|
+
const ch = body[i];
|
|
375
|
+
if (ch === "{") {
|
|
376
|
+
depth++;
|
|
377
|
+
}
|
|
378
|
+
else if (ch === "}") {
|
|
379
|
+
depth--;
|
|
380
|
+
}
|
|
381
|
+
else if (depth === 0 && /[A-Za-z_]/.test(ch) && nameStart < 0) {
|
|
382
|
+
nameStart = i;
|
|
383
|
+
}
|
|
384
|
+
else if (depth === 0 && nameStart >= 0 && !/[\w]/.test(ch)) {
|
|
385
|
+
const name = body.slice(nameStart, i);
|
|
386
|
+
// Skip alias separator
|
|
387
|
+
if (body[i] === ":") {
|
|
388
|
+
// This was an alias — next identifier is the real name
|
|
389
|
+
nameStart = -1;
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
if (name !== "on")
|
|
393
|
+
fields.push(name);
|
|
394
|
+
nameStart = -1;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
if (nameStart >= 0) {
|
|
398
|
+
fields.push(body.slice(nameStart));
|
|
399
|
+
}
|
|
400
|
+
return [...new Set(fields)]; // deduplicate
|
|
401
|
+
}
|
|
402
|
+
import { getQueryFields, getMutationFields, } from "./metadata";
|
|
403
|
+
function findResolverClass(resolverClasses, fieldName, operationType) {
|
|
404
|
+
for (const ResolverClass of resolverClasses) {
|
|
405
|
+
const fields = operationType === "mutation"
|
|
406
|
+
? getMutationFields(ResolverClass.prototype)
|
|
407
|
+
: getQueryFields(ResolverClass.prototype);
|
|
408
|
+
if (fields.some((f) => f.fieldName === fieldName)) {
|
|
409
|
+
return ResolverClass;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return undefined;
|
|
413
|
+
}
|
|
414
|
+
async function runGuardsForField(resolverClass, fieldName, httpContext, gqlContext, operationType, app) {
|
|
415
|
+
const { executeGuards, getClassGuards, getMethodGuards } = await import("../modules/guards");
|
|
416
|
+
const { resolveForwardRef } = await import("../container");
|
|
417
|
+
const classGuards = getClassGuards(resolverClass) ?? [];
|
|
418
|
+
const methodGuards = getMethodGuards(resolverClass.prototype, fieldName) ?? [];
|
|
419
|
+
const globalGuards = app.getGlobalGuards();
|
|
420
|
+
// Enrich context
|
|
421
|
+
const { enrichContextForGraphQL } = await import("./context-builder");
|
|
422
|
+
enrichContextForGraphQL(httpContext, fieldName, operationType, resolverClass);
|
|
423
|
+
return executeGuards(httpContext, {
|
|
424
|
+
globalGuards,
|
|
425
|
+
classGuards,
|
|
426
|
+
methodGuards,
|
|
427
|
+
resolveGuard: (guard) => {
|
|
428
|
+
if (typeof guard === "object" &&
|
|
429
|
+
guard !== null &&
|
|
430
|
+
!("canActivate" in guard)) {
|
|
431
|
+
try {
|
|
432
|
+
return app.container.resolve(guard);
|
|
433
|
+
}
|
|
434
|
+
catch {
|
|
435
|
+
return null;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return null;
|
|
439
|
+
},
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
//# sourceMappingURL=graphql-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-module.js","sourceRoot":"","sources":["../../src/graphql/graphql-module.ts"],"names":[],"mappings":"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"}
|