semola 0.5.1 → 0.5.3
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 +144 -29
- package/dist/api/core/index.cjs +206 -0
- package/dist/api/core/index.d.cts +21 -0
- package/dist/api/core/index.d.cts.map +1 -0
- package/dist/api/core/index.d.mts +21 -0
- package/dist/api/core/index.d.mts.map +1 -0
- package/dist/api/core/index.mjs +208 -0
- package/dist/api/core/index.mjs.map +1 -0
- package/dist/api/core/types.d.cts +107 -0
- package/dist/api/core/types.d.cts.map +1 -0
- package/dist/api/core/types.d.mts +107 -0
- package/dist/api/core/types.d.mts.map +1 -0
- package/dist/api/middleware/index.cjs +8 -0
- package/dist/api/middleware/index.d.cts +11 -0
- package/dist/api/middleware/index.d.cts.map +1 -0
- package/dist/api/middleware/index.d.mts +11 -0
- package/dist/api/middleware/index.d.mts.map +1 -0
- package/dist/api/middleware/index.mjs +10 -0
- package/dist/api/middleware/index.mjs.map +1 -0
- package/dist/api/middleware/types.d.cts +16 -0
- package/dist/api/middleware/types.d.cts.map +1 -0
- package/dist/api/middleware/types.d.mts +16 -0
- package/dist/api/middleware/types.d.mts.map +1 -0
- package/dist/api/openapi/index.cjs +254 -0
- package/dist/api/openapi/index.mjs +256 -0
- package/dist/api/openapi/index.mjs.map +1 -0
- package/dist/api/openapi/types.d.cts +60 -0
- package/dist/api/openapi/types.d.cts.map +1 -0
- package/dist/api/openapi/types.d.mts +60 -0
- package/dist/api/openapi/types.d.mts.map +1 -0
- package/dist/api/validation/index.cjs +64 -0
- package/dist/api/validation/index.mjs +61 -0
- package/dist/api/validation/index.mjs.map +1 -0
- package/dist/cache/types.d.cts +17 -0
- package/dist/cache/types.d.cts.map +1 -0
- package/dist/cache/types.d.mts +17 -0
- package/dist/cache/types.d.mts.map +1 -0
- package/dist/cron/builder/index.cjs +166 -0
- package/dist/cron/builder/index.d.cts +28 -0
- package/dist/cron/builder/index.d.cts.map +1 -0
- package/dist/cron/builder/index.d.mts +28 -0
- package/dist/cron/builder/index.d.mts.map +1 -0
- package/dist/cron/builder/index.mjs +163 -0
- package/dist/cron/builder/index.mjs.map +1 -0
- package/dist/cron/builder/types.cjs +27 -0
- package/dist/cron/builder/types.d.cts +79 -0
- package/dist/cron/builder/types.d.cts.map +1 -0
- package/dist/cron/builder/types.d.mts +79 -0
- package/dist/cron/builder/types.d.mts.map +1 -0
- package/dist/cron/builder/types.mjs +28 -0
- package/dist/cron/builder/types.mjs.map +1 -0
- package/dist/cron/core/index.cjs +308 -0
- package/dist/cron/core/index.d.cts +39 -0
- package/dist/cron/core/index.d.cts.map +1 -0
- package/dist/cron/core/index.d.mts +39 -0
- package/dist/cron/core/index.d.mts.map +1 -0
- package/dist/cron/core/index.mjs +310 -0
- package/dist/cron/core/index.mjs.map +1 -0
- package/dist/cron/core/scanner.cjs +237 -0
- package/dist/cron/core/scanner.mjs +238 -0
- package/dist/cron/core/scanner.mjs.map +1 -0
- package/dist/cron/core/types.d.cts +11 -0
- package/dist/cron/core/types.d.cts.map +1 -0
- package/dist/cron/core/types.d.mts +11 -0
- package/dist/cron/core/types.d.mts.map +1 -0
- package/dist/errors/types.d.cts +5 -0
- package/dist/errors/types.d.cts.map +1 -0
- package/dist/errors/types.d.mts +5 -0
- package/dist/errors/types.d.mts.map +1 -0
- package/dist/i18n/types.d.cts +13 -0
- package/dist/i18n/types.d.cts.map +1 -0
- package/dist/i18n/types.d.mts +13 -0
- package/dist/i18n/types.d.mts.map +1 -0
- package/dist/lib/api/index.cjs +5 -0
- package/dist/lib/api/index.d.cts +5 -0
- package/dist/lib/api/index.d.mts +5 -0
- package/dist/lib/api/index.mjs +3 -0
- package/dist/lib/cache/index.cjs +74 -0
- package/dist/lib/cache/index.d.cts +36 -0
- package/dist/lib/cache/index.d.cts.map +1 -0
- package/dist/lib/cache/index.d.mts +36 -0
- package/dist/lib/cache/index.d.mts.map +1 -0
- package/dist/lib/cache/index.mjs +75 -0
- package/dist/lib/cache/index.mjs.map +1 -0
- package/dist/lib/cron/index.cjs +13 -0
- package/dist/lib/cron/index.d.cts +4 -0
- package/dist/lib/cron/index.d.mts +4 -0
- package/dist/lib/cron/index.mjs +4 -0
- package/dist/lib/errors/index.cjs +30 -0
- package/dist/lib/errors/index.d.cts +13 -0
- package/dist/lib/errors/index.d.cts.map +1 -0
- package/dist/lib/errors/index.d.mts +13 -0
- package/dist/lib/errors/index.d.mts.map +1 -0
- package/dist/lib/errors/index.mjs +28 -0
- package/dist/lib/errors/index.mjs.map +1 -0
- package/dist/lib/i18n/index.cjs +42 -0
- package/dist/lib/i18n/index.d.cts +20 -0
- package/dist/lib/i18n/index.d.cts.map +1 -0
- package/dist/lib/i18n/index.d.mts +20 -0
- package/dist/lib/i18n/index.d.mts.map +1 -0
- package/dist/lib/i18n/index.mjs +43 -0
- package/dist/lib/i18n/index.mjs.map +1 -0
- package/dist/lib/logging/index.cjs +18 -0
- package/dist/lib/logging/index.d.cts +7 -0
- package/dist/lib/logging/index.d.mts +7 -0
- package/dist/lib/logging/index.mjs +5 -0
- package/dist/lib/orm/index.cjs +20 -0
- package/dist/lib/orm/index.d.cts +7 -0
- package/dist/lib/orm/index.d.mts +7 -0
- package/dist/lib/orm/index.mjs +6 -0
- package/dist/lib/policy/index.cjs +99 -0
- package/dist/lib/policy/index.d.cts +21 -0
- package/dist/lib/policy/index.d.cts.map +1 -0
- package/dist/lib/policy/index.d.mts +21 -0
- package/dist/lib/policy/index.d.mts.map +1 -0
- package/dist/lib/policy/index.mjs +81 -0
- package/dist/lib/policy/index.mjs.map +1 -0
- package/dist/lib/prompts/index.cjs +409 -0
- package/dist/lib/prompts/index.d.cts +31 -0
- package/dist/lib/prompts/index.d.cts.map +1 -0
- package/dist/lib/prompts/index.d.mts +31 -0
- package/dist/lib/prompts/index.d.mts.map +1 -0
- package/dist/lib/prompts/index.mjs +405 -0
- package/dist/lib/prompts/index.mjs.map +1 -0
- package/dist/lib/pubsub/index.cjs +117 -0
- package/dist/lib/pubsub/index.d.cts +36 -0
- package/dist/lib/pubsub/index.d.cts.map +1 -0
- package/dist/lib/pubsub/index.d.mts +36 -0
- package/dist/lib/pubsub/index.d.mts.map +1 -0
- package/dist/lib/pubsub/index.mjs +118 -0
- package/dist/lib/pubsub/index.mjs.map +1 -0
- package/dist/lib/queue/index.cjs +182 -0
- package/dist/lib/queue/index.d.cts +32 -0
- package/dist/lib/queue/index.d.cts.map +1 -0
- package/dist/lib/queue/index.d.mts +32 -0
- package/dist/lib/queue/index.d.mts.map +1 -0
- package/dist/lib/queue/index.mjs +183 -0
- package/dist/lib/queue/index.mjs.map +1 -0
- package/dist/lib/workflow/index.cjs +534 -0
- package/dist/lib/workflow/index.d.cts +7 -0
- package/dist/lib/workflow/index.d.cts.map +1 -0
- package/dist/lib/workflow/index.d.mts +7 -0
- package/dist/lib/workflow/index.d.mts.map +1 -0
- package/dist/lib/workflow/index.mjs +535 -0
- package/dist/lib/workflow/index.mjs.map +1 -0
- package/dist/logging/core/index.cjs +99 -0
- package/dist/logging/core/index.d.cts +26 -0
- package/dist/logging/core/index.d.cts.map +1 -0
- package/dist/logging/core/index.d.mts +26 -0
- package/dist/logging/core/index.d.mts.map +1 -0
- package/dist/logging/core/index.mjs +99 -0
- package/dist/logging/core/index.mjs.map +1 -0
- package/dist/logging/core/types.cjs +10 -0
- package/dist/logging/core/types.d.cts +22 -0
- package/dist/logging/core/types.d.cts.map +1 -0
- package/dist/logging/core/types.d.mts +22 -0
- package/dist/logging/core/types.d.mts.map +1 -0
- package/dist/logging/core/types.mjs +12 -0
- package/dist/logging/core/types.mjs.map +1 -0
- package/dist/logging/formatter/index.cjs +119 -0
- package/dist/logging/formatter/index.d.cts +27 -0
- package/dist/logging/formatter/index.d.cts.map +1 -0
- package/dist/logging/formatter/index.d.mts +27 -0
- package/dist/logging/formatter/index.d.mts.map +1 -0
- package/dist/logging/formatter/index.mjs +115 -0
- package/dist/logging/formatter/index.mjs.map +1 -0
- package/dist/logging/formatter/types.d.cts +5 -0
- package/dist/logging/formatter/types.d.cts.map +1 -0
- package/dist/logging/formatter/types.d.mts +5 -0
- package/dist/logging/formatter/types.d.mts.map +1 -0
- package/dist/logging/provider/index.cjs +165 -0
- package/dist/logging/provider/index.d.cts +28 -0
- package/dist/logging/provider/index.d.cts.map +1 -0
- package/dist/logging/provider/index.d.mts +28 -0
- package/dist/logging/provider/index.d.mts.map +1 -0
- package/dist/logging/provider/index.mjs +165 -0
- package/dist/logging/provider/index.mjs.map +1 -0
- package/dist/logging/provider/types.d.cts +23 -0
- package/dist/logging/provider/types.d.cts.map +1 -0
- package/dist/logging/provider/types.d.mts +23 -0
- package/dist/logging/provider/types.d.mts.map +1 -0
- package/dist/node_modules/@standard-schema/spec/dist/index.d.cts +80 -0
- package/dist/node_modules/@standard-schema/spec/dist/index.d.cts.map +1 -0
- package/dist/node_modules/@standard-schema/spec/dist/index.d.mts +80 -0
- package/dist/node_modules/@standard-schema/spec/dist/index.d.mts.map +1 -0
- package/dist/orm/column.cjs +137 -0
- package/dist/orm/column.d.cts +121 -0
- package/dist/orm/column.d.cts.map +1 -0
- package/dist/orm/column.d.mts +121 -0
- package/dist/orm/column.d.mts.map +1 -0
- package/dist/orm/column.mjs +132 -0
- package/dist/orm/column.mjs.map +1 -0
- package/dist/orm/dialect/index.cjs +14 -0
- package/dist/orm/dialect/index.mjs +16 -0
- package/dist/orm/dialect/index.mjs.map +1 -0
- package/dist/orm/dialect/mysql.cjs +31 -0
- package/dist/orm/dialect/mysql.mjs +33 -0
- package/dist/orm/dialect/mysql.mjs.map +1 -0
- package/dist/orm/dialect/postgres.cjs +23 -0
- package/dist/orm/dialect/postgres.mjs +25 -0
- package/dist/orm/dialect/postgres.mjs.map +1 -0
- package/dist/orm/dialect/sqlite.cjs +31 -0
- package/dist/orm/dialect/sqlite.mjs +33 -0
- package/dist/orm/dialect/sqlite.mjs.map +1 -0
- package/dist/orm/dialect/utils.cjs +8 -0
- package/dist/orm/dialect/utils.mjs +10 -0
- package/dist/orm/dialect/utils.mjs.map +1 -0
- package/dist/orm/internal/table-columns.cjs +31 -0
- package/dist/orm/internal/table-columns.mjs +32 -0
- package/dist/orm/internal/table-columns.mjs.map +1 -0
- package/dist/orm/internal/table-lookup.cjs +35 -0
- package/dist/orm/internal/table-lookup.mjs +35 -0
- package/dist/orm/internal/table-lookup.mjs.map +1 -0
- package/dist/orm/internal/table-relations.cjs +28 -0
- package/dist/orm/internal/table-relations.mjs +29 -0
- package/dist/orm/internal/table-relations.mjs.map +1 -0
- package/dist/orm/migration/config.cjs +7 -0
- package/dist/orm/migration/config.d.cts +7 -0
- package/dist/orm/migration/config.d.cts.map +1 -0
- package/dist/orm/migration/config.d.mts +7 -0
- package/dist/orm/migration/config.d.mts.map +1 -0
- package/dist/orm/migration/config.mjs +8 -0
- package/dist/orm/migration/config.mjs.map +1 -0
- package/dist/orm/migration/types.d.cts +20 -0
- package/dist/orm/migration/types.d.cts.map +1 -0
- package/dist/orm/migration/types.d.mts +20 -0
- package/dist/orm/migration/types.d.mts.map +1 -0
- package/dist/orm/orm.cjs +41 -0
- package/dist/orm/orm.d.cts +18 -0
- package/dist/orm/orm.d.cts.map +1 -0
- package/dist/orm/orm.d.mts +18 -0
- package/dist/orm/orm.d.mts.map +1 -0
- package/dist/orm/orm.mjs +43 -0
- package/dist/orm/orm.mjs.map +1 -0
- package/dist/orm/relation.cjs +18 -0
- package/dist/orm/relation.d.cts +8 -0
- package/dist/orm/relation.d.cts.map +1 -0
- package/dist/orm/relation.d.mts +8 -0
- package/dist/orm/relation.d.mts.map +1 -0
- package/dist/orm/relation.mjs +19 -0
- package/dist/orm/relation.mjs.map +1 -0
- package/dist/orm/runtime/builders/mutations.cjs +29 -0
- package/dist/orm/runtime/builders/mutations.mjs +28 -0
- package/dist/orm/runtime/builders/mutations.mjs.map +1 -0
- package/dist/orm/runtime/builders/select.cjs +18 -0
- package/dist/orm/runtime/builders/select.mjs +19 -0
- package/dist/orm/runtime/builders/select.mjs.map +1 -0
- package/dist/orm/runtime/client.cjs +90 -0
- package/dist/orm/runtime/client.mjs +92 -0
- package/dist/orm/runtime/client.mjs.map +1 -0
- package/dist/orm/runtime/context.cjs +49 -0
- package/dist/orm/runtime/context.mjs +51 -0
- package/dist/orm/runtime/context.mjs.map +1 -0
- package/dist/orm/runtime/dialect/index.cjs +11 -0
- package/dist/orm/runtime/dialect/index.mjs +13 -0
- package/dist/orm/runtime/dialect/index.mjs.map +1 -0
- package/dist/orm/runtime/dialect/mysql.cjs +95 -0
- package/dist/orm/runtime/dialect/mysql.mjs +97 -0
- package/dist/orm/runtime/dialect/mysql.mjs.map +1 -0
- package/dist/orm/runtime/dialect/postgres.cjs +51 -0
- package/dist/orm/runtime/dialect/postgres.mjs +53 -0
- package/dist/orm/runtime/dialect/postgres.mjs.map +1 -0
- package/dist/orm/runtime/dialect/sqlite.cjs +4 -0
- package/dist/orm/runtime/dialect/sqlite.mjs +7 -0
- package/dist/orm/runtime/dialect/sqlite.mjs.map +1 -0
- package/dist/orm/runtime/errors.cjs +19 -0
- package/dist/orm/runtime/errors.mjs +21 -0
- package/dist/orm/runtime/errors.mjs.map +1 -0
- package/dist/orm/runtime/hydrate/many.cjs +46 -0
- package/dist/orm/runtime/hydrate/many.mjs +48 -0
- package/dist/orm/runtime/hydrate/many.mjs.map +1 -0
- package/dist/orm/runtime/hydrate/one.cjs +38 -0
- package/dist/orm/runtime/hydrate/one.mjs +40 -0
- package/dist/orm/runtime/hydrate/one.mjs.map +1 -0
- package/dist/orm/runtime/hydrate.cjs +49 -0
- package/dist/orm/runtime/hydrate.mjs +51 -0
- package/dist/orm/runtime/hydrate.mjs.map +1 -0
- package/dist/orm/runtime/rows.cjs +30 -0
- package/dist/orm/runtime/rows.mjs +31 -0
- package/dist/orm/runtime/rows.mjs.map +1 -0
- package/dist/orm/runtime/utils.cjs +27 -0
- package/dist/orm/runtime/utils.mjs +27 -0
- package/dist/orm/runtime/utils.mjs.map +1 -0
- package/dist/orm/sql/parse-array.cjs +64 -0
- package/dist/orm/sql/parse-array.mjs +66 -0
- package/dist/orm/sql/parse-array.mjs.map +1 -0
- package/dist/orm/sql/plan/select.cjs +36 -0
- package/dist/orm/sql/plan/select.mjs +38 -0
- package/dist/orm/sql/plan/select.mjs.map +1 -0
- package/dist/orm/sql/plan/where/operators.cjs +95 -0
- package/dist/orm/sql/plan/where/operators.mjs +97 -0
- package/dist/orm/sql/plan/where/operators.mjs.map +1 -0
- package/dist/orm/sql/plan/where.cjs +59 -0
- package/dist/orm/sql/plan/where.mjs +61 -0
- package/dist/orm/sql/plan/where.mjs.map +1 -0
- package/dist/orm/sql/serialize/clauses.cjs +36 -0
- package/dist/orm/sql/serialize/clauses.mjs +37 -0
- package/dist/orm/sql/serialize/clauses.mjs.map +1 -0
- package/dist/orm/sql/serialize/joins.cjs +31 -0
- package/dist/orm/sql/serialize/joins.mjs +33 -0
- package/dist/orm/sql/serialize/joins.mjs.map +1 -0
- package/dist/orm/sql/serialize/values.cjs +30 -0
- package/dist/orm/sql/serialize/values.mjs +32 -0
- package/dist/orm/sql/serialize/values.mjs.map +1 -0
- package/dist/orm/sql/serialize/where/predicate.cjs +73 -0
- package/dist/orm/sql/serialize/where/predicate.mjs +75 -0
- package/dist/orm/sql/serialize/where/predicate.mjs.map +1 -0
- package/dist/orm/sql/serialize/where/tree.cjs +26 -0
- package/dist/orm/sql/serialize/where/tree.mjs +28 -0
- package/dist/orm/sql/serialize/where/tree.mjs.map +1 -0
- package/dist/orm/sql/serialize/where.cjs +10 -0
- package/dist/orm/sql/serialize/where.mjs +12 -0
- package/dist/orm/sql/serialize/where.mjs.map +1 -0
- package/dist/orm/sql/serialize.cjs +24 -0
- package/dist/orm/sql/serialize.mjs +25 -0
- package/dist/orm/sql/serialize.mjs.map +1 -0
- package/dist/orm/table.cjs +12 -0
- package/dist/orm/table.d.cts +12 -0
- package/dist/orm/table.d.cts.map +1 -0
- package/dist/orm/table.d.mts +12 -0
- package/dist/orm/table.d.mts.map +1 -0
- package/dist/orm/table.mjs +14 -0
- package/dist/orm/table.mjs.map +1 -0
- package/dist/orm/types.d.cts +183 -0
- package/dist/orm/types.d.cts.map +1 -0
- package/dist/orm/types.d.mts +183 -0
- package/dist/orm/types.d.mts.map +1 -0
- package/dist/policy/helpers.cjs +206 -0
- package/dist/policy/helpers.d.cts +50 -0
- package/dist/policy/helpers.d.cts.map +1 -0
- package/dist/policy/helpers.d.mts +50 -0
- package/dist/policy/helpers.d.mts.map +1 -0
- package/dist/policy/helpers.mjs +190 -0
- package/dist/policy/helpers.mjs.map +1 -0
- package/dist/policy/types.d.cts +16 -0
- package/dist/policy/types.d.cts.map +1 -0
- package/dist/policy/types.d.mts +16 -0
- package/dist/policy/types.d.mts.map +1 -0
- package/dist/prompts/core/keys.cjs +165 -0
- package/dist/prompts/core/keys.mjs +167 -0
- package/dist/prompts/core/keys.mjs.map +1 -0
- package/dist/prompts/core/runtime.cjs +104 -0
- package/dist/prompts/core/runtime.mjs +106 -0
- package/dist/prompts/core/runtime.mjs.map +1 -0
- package/dist/prompts/core/session.cjs +98 -0
- package/dist/prompts/core/session.mjs +100 -0
- package/dist/prompts/core/session.mjs.map +1 -0
- package/dist/prompts/core/types.d.cts +21 -0
- package/dist/prompts/core/types.d.cts.map +1 -0
- package/dist/prompts/core/types.d.mts +21 -0
- package/dist/prompts/core/types.d.mts.map +1 -0
- package/dist/prompts/types.d.cts +52 -0
- package/dist/prompts/types.d.cts.map +1 -0
- package/dist/prompts/types.d.mts +52 -0
- package/dist/prompts/types.d.mts.map +1 -0
- package/dist/pubsub/types.d.cts +10 -0
- package/dist/pubsub/types.d.cts.map +1 -0
- package/dist/pubsub/types.d.mts +10 -0
- package/dist/pubsub/types.d.mts.map +1 -0
- package/dist/queue/types.d.cts +47 -0
- package/dist/queue/types.d.cts.map +1 -0
- package/dist/queue/types.d.mts +47 -0
- package/dist/queue/types.d.mts.map +1 -0
- package/dist/workflow/types.d.cts +83 -0
- package/dist/workflow/types.d.cts.map +1 -0
- package/dist/workflow/types.d.mts +83 -0
- package/dist/workflow/types.d.mts.map +1 -0
- package/package.json +112 -16
- package/dist/lib/api/core/index.d.ts +0 -15
- package/dist/lib/api/core/index.d.ts.map +0 -1
- package/dist/lib/api/core/index.js +0 -218
- package/dist/lib/api/core/index.js.map +0 -1
- package/dist/lib/api/core/index.test.d.ts +0 -2
- package/dist/lib/api/core/index.test.d.ts.map +0 -1
- package/dist/lib/api/core/index.test.js +0 -219
- package/dist/lib/api/core/index.test.js.map +0 -1
- package/dist/lib/api/core/types.d.ts +0 -109
- package/dist/lib/api/core/types.d.ts.map +0 -1
- package/dist/lib/api/core/types.js +0 -2
- package/dist/lib/api/core/types.js.map +0 -1
- package/dist/lib/api/index.d.ts +0 -5
- package/dist/lib/api/index.d.ts.map +0 -1
- package/dist/lib/api/index.js +0 -3
- package/dist/lib/api/index.js.map +0 -1
- package/dist/lib/api/middleware/index.d.ts +0 -7
- package/dist/lib/api/middleware/index.d.ts.map +0 -1
- package/dist/lib/api/middleware/index.js +0 -7
- package/dist/lib/api/middleware/index.js.map +0 -1
- package/dist/lib/api/middleware/index.test.d.ts +0 -2
- package/dist/lib/api/middleware/index.test.d.ts.map +0 -1
- package/dist/lib/api/middleware/index.test.js +0 -67
- package/dist/lib/api/middleware/index.test.js.map +0 -1
- package/dist/lib/api/middleware/types.d.ts +0 -12
- package/dist/lib/api/middleware/types.d.ts.map +0 -1
- package/dist/lib/api/middleware/types.js +0 -2
- package/dist/lib/api/middleware/types.js.map +0 -1
- package/dist/lib/api/openapi/index.d.ts +0 -31
- package/dist/lib/api/openapi/index.d.ts.map +0 -1
- package/dist/lib/api/openapi/index.js +0 -284
- package/dist/lib/api/openapi/index.js.map +0 -1
- package/dist/lib/api/openapi/index.test.d.ts +0 -2
- package/dist/lib/api/openapi/index.test.d.ts.map +0 -1
- package/dist/lib/api/openapi/index.test.js +0 -359
- package/dist/lib/api/openapi/index.test.js.map +0 -1
- package/dist/lib/api/openapi/types.d.ts +0 -57
- package/dist/lib/api/openapi/types.d.ts.map +0 -1
- package/dist/lib/api/openapi/types.js +0 -5
- package/dist/lib/api/openapi/types.js.map +0 -1
- package/dist/lib/api/validation/index.d.ts +0 -33
- package/dist/lib/api/validation/index.d.ts.map +0 -1
- package/dist/lib/api/validation/index.js +0 -92
- package/dist/lib/api/validation/index.js.map +0 -1
- package/dist/lib/api/validation/index.test.d.ts +0 -2
- package/dist/lib/api/validation/index.test.d.ts.map +0 -1
- package/dist/lib/api/validation/index.test.js +0 -135
- package/dist/lib/api/validation/index.test.js.map +0 -1
- package/dist/lib/cache/index.d.ts +0 -25
- package/dist/lib/cache/index.d.ts.map +0 -1
- package/dist/lib/cache/index.js +0 -62
- package/dist/lib/cache/index.js.map +0 -1
- package/dist/lib/cache/index.test.d.ts +0 -2
- package/dist/lib/cache/index.test.d.ts.map +0 -1
- package/dist/lib/cache/index.test.js +0 -314
- package/dist/lib/cache/index.test.js.map +0 -1
- package/dist/lib/cache/types.d.ts +0 -5
- package/dist/lib/cache/types.d.ts.map +0 -1
- package/dist/lib/cache/types.js +0 -2
- package/dist/lib/cache/types.js.map +0 -1
- package/dist/lib/errors/index.d.ts +0 -9
- package/dist/lib/errors/index.d.ts.map +0 -1
- package/dist/lib/errors/index.js +0 -25
- package/dist/lib/errors/index.js.map +0 -1
- package/dist/lib/errors/index.test.d.ts +0 -2
- package/dist/lib/errors/index.test.d.ts.map +0 -1
- package/dist/lib/errors/index.test.js +0 -197
- package/dist/lib/errors/index.test.js.map +0 -1
- package/dist/lib/errors/types.d.ts +0 -2
- package/dist/lib/errors/types.d.ts.map +0 -1
- package/dist/lib/errors/types.js +0 -2
- package/dist/lib/errors/types.js.map +0 -1
- package/dist/lib/i18n/index.d.ts +0 -18
- package/dist/lib/i18n/index.d.ts.map +0 -1
- package/dist/lib/i18n/index.js +0 -38
- package/dist/lib/i18n/index.js.map +0 -1
- package/dist/lib/i18n/index.test.d.ts +0 -2
- package/dist/lib/i18n/index.test.d.ts.map +0 -1
- package/dist/lib/i18n/index.test.js +0 -402
- package/dist/lib/i18n/index.test.js.map +0 -1
- package/dist/lib/i18n/types.d.ts +0 -15
- package/dist/lib/i18n/types.d.ts.map +0 -1
- package/dist/lib/i18n/types.js +0 -2
- package/dist/lib/i18n/types.js.map +0 -1
- package/dist/lib/policy/index.d.ts +0 -9
- package/dist/lib/policy/index.d.ts.map +0 -1
- package/dist/lib/policy/index.js +0 -51
- package/dist/lib/policy/index.js.map +0 -1
- package/dist/lib/policy/index.test.d.ts +0 -2
- package/dist/lib/policy/index.test.d.ts.map +0 -1
- package/dist/lib/policy/index.test.js +0 -328
- package/dist/lib/policy/index.test.js.map +0 -1
- package/dist/lib/policy/types.d.ts +0 -27
- package/dist/lib/policy/types.d.ts.map +0 -1
- package/dist/lib/policy/types.js +0 -2
- package/dist/lib/policy/types.js.map +0 -1
- package/dist/lib/pubsub/index.d.ts +0 -23
- package/dist/lib/pubsub/index.d.ts.map +0 -1
- package/dist/lib/pubsub/index.js +0 -55
- package/dist/lib/pubsub/index.js.map +0 -1
- package/dist/lib/pubsub/index.test.d.ts +0 -2
- package/dist/lib/pubsub/index.test.d.ts.map +0 -1
- package/dist/lib/pubsub/index.test.js +0 -550
- package/dist/lib/pubsub/index.test.js.map +0 -1
- package/dist/lib/pubsub/types.d.ts +0 -7
- package/dist/lib/pubsub/types.d.ts.map +0 -1
- package/dist/lib/pubsub/types.js +0 -2
- package/dist/lib/pubsub/types.js.map +0 -1
- package/dist/lib/queue/index.d.ts +0 -28
- package/dist/lib/queue/index.d.ts.map +0 -1
- package/dist/lib/queue/index.js +0 -211
- package/dist/lib/queue/index.js.map +0 -1
- package/dist/lib/queue/index.test.d.ts +0 -2
- package/dist/lib/queue/index.test.d.ts.map +0 -1
- package/dist/lib/queue/index.test.js +0 -740
- package/dist/lib/queue/index.test.js.map +0 -1
- package/dist/lib/queue/types.d.ts +0 -52
- package/dist/lib/queue/types.d.ts.map +0 -1
- package/dist/lib/queue/types.js +0 -2
- package/dist/lib/queue/types.js.map +0 -1
package/README.md
CHANGED
|
@@ -18,15 +18,20 @@ Type-safe APIs, Redis queues, pub/sub, i18n, caching & auth with tree-shakeable
|
|
|
18
18
|
|
|
19
19
|
## ✨ Features
|
|
20
20
|
|
|
21
|
-
| Module | Description | Import
|
|
22
|
-
| -------------------- | ------------------------------------------------------ |
|
|
23
|
-
| **🚀 API Framework** | Type-safe REST API with OpenAPI & Bun-native routing | `semola/api`
|
|
24
|
-
| **📬 Queue** | Redis-backed job queue with timeouts & concurrency | `semola/queue`
|
|
25
|
-
| **📡 PubSub** | Type-safe Redis pub/sub for real-time messaging | `semola/pubsub`
|
|
26
|
-
| **🔐 Policy** | Policy-based authorization with type-safe guards | `semola/policy`
|
|
27
|
-
| **🌍 i18n** | Compile-time validated internationalization | `semola/i18n`
|
|
28
|
-
| **💾 Cache** | Redis cache wrapper with TTL & automatic serialization | `semola/cache`
|
|
29
|
-
|
|
|
21
|
+
| Module | Description | Import |
|
|
22
|
+
| -------------------- | ------------------------------------------------------ | ----------------- |
|
|
23
|
+
| **🚀 API Framework** | Type-safe REST API with OpenAPI & Bun-native routing | `semola/api` |
|
|
24
|
+
| **📬 Queue** | Redis-backed job queue with timeouts & concurrency | `semola/queue` |
|
|
25
|
+
| **📡 PubSub** | Type-safe Redis pub/sub for real-time messaging | `semola/pubsub` |
|
|
26
|
+
| **🔐 Policy** | Policy-based authorization with type-safe guards | `semola/policy` |
|
|
27
|
+
| **🌍 i18n** | Compile-time validated internationalization | `semola/i18n` |
|
|
28
|
+
| **💾 Cache** | Redis cache wrapper with TTL & automatic serialization | `semola/cache` |
|
|
29
|
+
| **⏰ Cron** | In-memory cron scheduler for periodic task execution | `semola/cron` |
|
|
30
|
+
| **🔁 Workflow** | Durable resumable workflows with step persistence | `semola/workflow` |
|
|
31
|
+
| **⚠️ Errors** | Result-based error handling without try/catch | `semola/errors` |
|
|
32
|
+
| **📃 Logging** | A simple logging utility | `semola/logging` |
|
|
33
|
+
| **⌨️ Prompts** | Interactive zero-dependency CLI prompts | `semola/prompts` |
|
|
34
|
+
| **🗄️ ORM** | Type-safe data layer with query APIs + migrations | `semola/orm` |
|
|
30
35
|
|
|
31
36
|
---
|
|
32
37
|
|
|
@@ -81,6 +86,14 @@ if (error) {
|
|
|
81
86
|
console.log("Success:", data);
|
|
82
87
|
```
|
|
83
88
|
|
|
89
|
+
`mightThrow` and `mightThrowSync` default their error type to `Error`. If a promise or function can reject or throw non-Error values, pass a custom error generic.
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
const [customError] = await mightThrow<never, { code: string }>(
|
|
93
|
+
Promise.reject({ code: "RATE_LIMITED" }),
|
|
94
|
+
);
|
|
95
|
+
```
|
|
96
|
+
|
|
84
97
|
### Process Background Jobs
|
|
85
98
|
|
|
86
99
|
```typescript
|
|
@@ -109,12 +122,16 @@ const pubsub = new PubSub({
|
|
|
109
122
|
});
|
|
110
123
|
|
|
111
124
|
// Subscribe to messages
|
|
112
|
-
await pubsub.subscribe((message) => {
|
|
125
|
+
const [, unsubscribeHandler] = await pubsub.subscribe((message) => {
|
|
113
126
|
console.log("Received:", message);
|
|
114
127
|
});
|
|
115
128
|
|
|
116
129
|
// Publish a message
|
|
117
130
|
await pubsub.publish({ userId: 123, text: "New alert!" });
|
|
131
|
+
|
|
132
|
+
if (unsubscribeHandler) {
|
|
133
|
+
await unsubscribeHandler();
|
|
134
|
+
}
|
|
118
135
|
```
|
|
119
136
|
|
|
120
137
|
### Cache Data with TTL
|
|
@@ -135,24 +152,108 @@ const [error, user] = await cache.get("user:123");
|
|
|
135
152
|
if (!error) console.log(user);
|
|
136
153
|
```
|
|
137
154
|
|
|
155
|
+
### Schedule Recurring Tasks
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { Cron } from "semola/cron";
|
|
159
|
+
|
|
160
|
+
const cleanup = new Cron({
|
|
161
|
+
name: "daily-cleanup",
|
|
162
|
+
schedule: "0 0 * * *", // Daily at midnight
|
|
163
|
+
handler: async () => {
|
|
164
|
+
await deleteOldLogs();
|
|
165
|
+
await archiveInactiveUsers();
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
cleanup.start();
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Query a Database
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
import { createOrm, createTable, string, uuid } from "semola/orm";
|
|
176
|
+
|
|
177
|
+
const users = createTable("users", {
|
|
178
|
+
id: uuid("id").primaryKey(),
|
|
179
|
+
name: string("name").notNull(),
|
|
180
|
+
email: string("email").unique().notNull(),
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
const db = createOrm({
|
|
184
|
+
url: "sqlite::memory:",
|
|
185
|
+
tables: { users },
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
// Result-pattern query
|
|
189
|
+
const [findErr, rows] = await db.users.findMany({
|
|
190
|
+
where: { name: { contains: "John" } },
|
|
191
|
+
take: 10,
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
if (findErr) {
|
|
195
|
+
console.error(findErr.type, findErr.message);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Create record (result pattern)
|
|
199
|
+
const [createErr, user] = await db.users.create({
|
|
200
|
+
data: {
|
|
201
|
+
name: "John Doe",
|
|
202
|
+
email: "john@example.com",
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// Low-level SQL-style methods are also available
|
|
207
|
+
const insertedRows = await db.users.insert({
|
|
208
|
+
data: {
|
|
209
|
+
name: "Jane Doe",
|
|
210
|
+
email: "jane@example.com",
|
|
211
|
+
},
|
|
212
|
+
returning: true,
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
console.log(rows, user, createErr, insertedRows);
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Run ORM Migrations
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
# create migration from schema diff
|
|
222
|
+
semola orm migrations create add-users
|
|
223
|
+
|
|
224
|
+
# apply pending migrations
|
|
225
|
+
semola orm migrations apply
|
|
226
|
+
|
|
227
|
+
# rollback last applied migration
|
|
228
|
+
semola orm migrations rollback
|
|
229
|
+
```
|
|
230
|
+
|
|
138
231
|
### Check Permissions
|
|
139
232
|
|
|
140
233
|
```typescript
|
|
141
|
-
import { Policy } from "semola/policy";
|
|
234
|
+
import { Policy, eq, has } from "semola/policy";
|
|
235
|
+
|
|
236
|
+
type User = { id: number; role: string; permissions: string[] };
|
|
142
237
|
|
|
143
|
-
const policy = new Policy();
|
|
238
|
+
const policy = new Policy<User>();
|
|
239
|
+
|
|
240
|
+
// Allow admins full access
|
|
241
|
+
policy.allow({
|
|
242
|
+
action: ["create", "update", "delete"],
|
|
243
|
+
conditions: { role: eq("admin") },
|
|
244
|
+
reason: "Admins have full access",
|
|
245
|
+
});
|
|
144
246
|
|
|
145
|
-
// Allow
|
|
247
|
+
// Allow users with a specific permission
|
|
146
248
|
policy.allow({
|
|
147
|
-
action: "
|
|
148
|
-
|
|
149
|
-
conditions: { role: "admin" },
|
|
150
|
-
reason: "Admins can edit any post",
|
|
249
|
+
action: "read",
|
|
250
|
+
conditions: { permissions: has("posts:read") },
|
|
151
251
|
});
|
|
152
252
|
|
|
153
|
-
// Check if user can
|
|
154
|
-
const
|
|
155
|
-
|
|
253
|
+
// Check if user can perform an action
|
|
254
|
+
const user: User = { id: 1, role: "admin", permissions: [] };
|
|
255
|
+
const result = policy.can("update", user);
|
|
256
|
+
console.log(result.allowed); // true
|
|
156
257
|
```
|
|
157
258
|
|
|
158
259
|
### Internationalize Your App
|
|
@@ -171,6 +272,15 @@ const i18n = new I18n({
|
|
|
171
272
|
console.log(i18n.translate("greeting", { name: "World" }));
|
|
172
273
|
```
|
|
173
274
|
|
|
275
|
+
### Log your messages
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
import { ConsoleProvider, Logger } from "semola/logging";
|
|
279
|
+
|
|
280
|
+
const logger = new Logger("database", [new ConsoleProvider()]);
|
|
281
|
+
logger.info("Hello!");
|
|
282
|
+
```
|
|
283
|
+
|
|
174
284
|
---
|
|
175
285
|
|
|
176
286
|
## 📦 Installation
|
|
@@ -206,14 +316,14 @@ Stop piecing together half-baked solutions from npm. Stop wrestling with type de
|
|
|
206
316
|
|
|
207
317
|
Semola API is the **fastest API framework** for Bun.
|
|
208
318
|
|
|
209
|
-
| Framework | Avg Req/Sec | Latency Avg (ms) |
|
|
210
|
-
| :--------- | ----------: | ---------------: |
|
|
211
|
-
| **Semola** | **40,050** | **1.88** | **baseline**
|
|
212
|
-
| Elysia | 37,185 | 2.13 |
|
|
213
|
-
| Hono | 34,611 | 2.31 |
|
|
214
|
-
| Fastify | 26,330 | 3.70 |
|
|
215
|
-
| Express | 20,031 | 5.02 |
|
|
216
|
-
| NestJS | 16,118 | 6.21 |
|
|
319
|
+
| Framework | Avg Req/Sec | Latency Avg (ms) | vs Semola |
|
|
320
|
+
| :--------- | ----------: | ---------------: | :----------: |
|
|
321
|
+
| **Semola** | **40,050** | **1.88** | **baseline** |
|
|
322
|
+
| Elysia | 37,185 | 2.13 | 1.1x slower |
|
|
323
|
+
| Hono | 34,611 | 2.31 | 1.2x slower |
|
|
324
|
+
| Fastify | 26,330 | 3.70 | 1.5x slower |
|
|
325
|
+
| Express | 20,031 | 5.02 | 2x slower |
|
|
326
|
+
| NestJS | 16,118 | 6.21 | 2.5x slower |
|
|
217
327
|
|
|
218
328
|
_Higher is better for req/sec, lower is better for latency._
|
|
219
329
|
|
|
@@ -234,10 +344,15 @@ _Higher is better for req/sec, lower is better for latency._
|
|
|
234
344
|
- [API Framework](./docs/api.md) - Type-safe REST API framework with OpenAPI
|
|
235
345
|
- [Queue](./docs/queue.md) - Redis-backed job queue with timeouts & concurrency
|
|
236
346
|
- [PubSub](./docs/pubsub.md) - Type-safe Redis pub/sub
|
|
347
|
+
- [Cron](./docs/cron.md) - In-memory cron scheduler for periodic task execution
|
|
348
|
+
- [Workflow](./docs/workflow.md) - Durable and resumable workflows with step persistence
|
|
237
349
|
- [Policy](./docs/policy.md) - Policy-based authorization
|
|
238
350
|
- [i18n](./docs/i18n.md) - Type-safe internationalization
|
|
239
351
|
- [Cache](./docs/cache.md) - Redis cache wrapper with TTL
|
|
240
352
|
- [Errors](./docs/errors.md) - Result-based error handling
|
|
353
|
+
- [Logging](./docs/logging.md) - Logging utility
|
|
354
|
+
- [Prompts](./docs/prompts.md) - Interactive CLI prompts
|
|
355
|
+
- [ORM](./docs/orm.md) - Type-safe data layer, result-pattern DX, and migrations
|
|
241
356
|
|
|
242
357
|
---
|
|
243
358
|
|
|
@@ -263,6 +378,6 @@ bun check
|
|
|
263
378
|
|
|
264
379
|
This package uses GitHub Actions for automated publishing. To release:
|
|
265
380
|
|
|
266
|
-
1. Bump version: `bun version <major|minor|patch>`
|
|
381
|
+
1. Bump version: `bun pm version <major|minor|patch>`
|
|
267
382
|
2. Create a GitHub release with a new tag (e.g., `v0.4.0`)
|
|
268
383
|
3. The GitHub Action automatically publishes to npm with provenance
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
const require_lib_errors_index = require("../../lib/errors/index.cjs");
|
|
2
|
+
const require_index = require("../openapi/index.cjs");
|
|
3
|
+
const require_index$1 = require("../validation/index.cjs");
|
|
4
|
+
//#region src/lib/api/core/index.ts
|
|
5
|
+
const defaultValidated = Object.freeze({
|
|
6
|
+
body: void 0,
|
|
7
|
+
query: void 0,
|
|
8
|
+
headers: void 0,
|
|
9
|
+
cookies: void 0,
|
|
10
|
+
params: void 0
|
|
11
|
+
});
|
|
12
|
+
const responseHelpers = {
|
|
13
|
+
json: (status, data) => Response.json(data, { status }),
|
|
14
|
+
text: (status, text) => new Response(text, { status }),
|
|
15
|
+
html: (status, html) => new Response(html, {
|
|
16
|
+
status,
|
|
17
|
+
headers: { "Content-Type": "text/html" }
|
|
18
|
+
}),
|
|
19
|
+
redirect: (status, url) => Response.redirect(url, status)
|
|
20
|
+
};
|
|
21
|
+
const noopGet = () => void 0;
|
|
22
|
+
const stripTrailingSlash = (path) => {
|
|
23
|
+
if (path !== "/" && path.endsWith("/")) return path.slice(0, -1);
|
|
24
|
+
return path;
|
|
25
|
+
};
|
|
26
|
+
const hasSchemas = (schema) => schema && (schema.body || schema.query || schema.headers || schema.cookies || schema.params);
|
|
27
|
+
const needsBodyCache = (schema) => schema?.body !== void 0;
|
|
28
|
+
const shouldCreateBodyCache = (hasMiddlewares, allMiddlewares, request) => {
|
|
29
|
+
if (needsBodyCache(request)) return true;
|
|
30
|
+
if (!hasMiddlewares) return false;
|
|
31
|
+
return allMiddlewares.some((mw) => needsBodyCache(mw.options.request));
|
|
32
|
+
};
|
|
33
|
+
const resolveValidation = (v) => {
|
|
34
|
+
if (v === void 0 || v === true) return {
|
|
35
|
+
input: true,
|
|
36
|
+
output: true
|
|
37
|
+
};
|
|
38
|
+
if (v === false) return {
|
|
39
|
+
input: false,
|
|
40
|
+
output: false
|
|
41
|
+
};
|
|
42
|
+
return {
|
|
43
|
+
input: v.input !== false,
|
|
44
|
+
output: v.output !== false
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
var Api = class {
|
|
48
|
+
options;
|
|
49
|
+
routes = [];
|
|
50
|
+
constructor(options = {}) {
|
|
51
|
+
this.options = options;
|
|
52
|
+
}
|
|
53
|
+
getFullPath(path) {
|
|
54
|
+
const normalizedPath = stripTrailingSlash(path) || "/";
|
|
55
|
+
if (!this.options.prefix) return normalizedPath;
|
|
56
|
+
const normalizedPrefix = stripTrailingSlash(this.options.prefix);
|
|
57
|
+
if (normalizedPrefix === "/") return normalizedPath;
|
|
58
|
+
if (normalizedPath === "/") return normalizedPrefix;
|
|
59
|
+
return normalizedPrefix + normalizedPath;
|
|
60
|
+
}
|
|
61
|
+
async validateRequestSchema(req, schema, bodyCache) {
|
|
62
|
+
if (!schema) return {
|
|
63
|
+
success: true,
|
|
64
|
+
data: {}
|
|
65
|
+
};
|
|
66
|
+
const v = {};
|
|
67
|
+
if (schema.body) {
|
|
68
|
+
const [err, val] = await require_index$1.validateBody(req, schema.body, bodyCache);
|
|
69
|
+
if (err) return {
|
|
70
|
+
success: false,
|
|
71
|
+
error: err
|
|
72
|
+
};
|
|
73
|
+
v.body = val;
|
|
74
|
+
}
|
|
75
|
+
if (schema.query) {
|
|
76
|
+
const [err, val] = await require_index$1.validateQuery(req, schema.query);
|
|
77
|
+
if (err) return {
|
|
78
|
+
success: false,
|
|
79
|
+
error: err
|
|
80
|
+
};
|
|
81
|
+
v.query = val;
|
|
82
|
+
}
|
|
83
|
+
if (schema.headers) {
|
|
84
|
+
const [err, val] = await require_index$1.validateHeaders(req, schema.headers);
|
|
85
|
+
if (err) return {
|
|
86
|
+
success: false,
|
|
87
|
+
error: err
|
|
88
|
+
};
|
|
89
|
+
v.headers = val;
|
|
90
|
+
}
|
|
91
|
+
if (schema.cookies) {
|
|
92
|
+
const [err, val] = await require_index$1.validateCookies(req, schema.cookies);
|
|
93
|
+
if (err) return {
|
|
94
|
+
success: false,
|
|
95
|
+
error: err
|
|
96
|
+
};
|
|
97
|
+
v.cookies = val;
|
|
98
|
+
}
|
|
99
|
+
if (schema.params) {
|
|
100
|
+
const [err, val] = await require_index$1.validateParams(req, schema.params);
|
|
101
|
+
if (err) return {
|
|
102
|
+
success: false,
|
|
103
|
+
error: err
|
|
104
|
+
};
|
|
105
|
+
v.params = val;
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
success: true,
|
|
109
|
+
data: v
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
createContext(req, validated, extensions) {
|
|
113
|
+
return {
|
|
114
|
+
raw: req,
|
|
115
|
+
req: validated,
|
|
116
|
+
...responseHelpers,
|
|
117
|
+
get: (key) => extensions[key]
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
async validateResponseBody(response, schema) {
|
|
121
|
+
if (!schema) return response;
|
|
122
|
+
const statusSchema = schema[response.status];
|
|
123
|
+
if (!statusSchema) return response;
|
|
124
|
+
if (!(response.headers.get("content-type") ?? "").includes("application/json")) return response;
|
|
125
|
+
const [parseError, body] = await require_lib_errors_index.mightThrow(response.clone().json());
|
|
126
|
+
if (parseError) return responseHelpers.json(400, { message: "Invalid response body" });
|
|
127
|
+
const [validationError] = await require_index$1.validateSchema(statusSchema, body);
|
|
128
|
+
if (validationError) return responseHelpers.json(400, { message: validationError.message });
|
|
129
|
+
return response;
|
|
130
|
+
}
|
|
131
|
+
buildBunRoutes() {
|
|
132
|
+
const bunRoutes = {};
|
|
133
|
+
const validationConfig = resolveValidation(this.options.validation);
|
|
134
|
+
for (const route of this.routes) {
|
|
135
|
+
const { path, method, handler, request, response, middlewares } = route;
|
|
136
|
+
const fullPath = this.getFullPath(path);
|
|
137
|
+
if (!bunRoutes[fullPath]) bunRoutes[fullPath] = {};
|
|
138
|
+
const allMiddlewares = [...this.options.middlewares ?? [], ...middlewares ?? []];
|
|
139
|
+
const hasMiddlewares = allMiddlewares.length > 0;
|
|
140
|
+
const hasRouteSchemas = hasSchemas(request);
|
|
141
|
+
const effectiveOutputValidation = validationConfig.output && !!response;
|
|
142
|
+
if (!hasMiddlewares && !(validationConfig.input && hasRouteSchemas) && !effectiveOutputValidation) bunRoutes[fullPath][method] = (req) => {
|
|
143
|
+
const context = Object.create(responseHelpers);
|
|
144
|
+
context.raw = req;
|
|
145
|
+
context.req = defaultValidated;
|
|
146
|
+
context.get = noopGet;
|
|
147
|
+
return handler(context);
|
|
148
|
+
};
|
|
149
|
+
else bunRoutes[fullPath][method] = async (req) => {
|
|
150
|
+
const extensions = {};
|
|
151
|
+
const bodyCache = validationConfig.input && shouldCreateBodyCache(hasMiddlewares, allMiddlewares, request) ? {
|
|
152
|
+
parsed: false,
|
|
153
|
+
value: void 0
|
|
154
|
+
} : void 0;
|
|
155
|
+
for (const mw of allMiddlewares) {
|
|
156
|
+
const { request: reqSchema, handler: mwHandler } = mw.options;
|
|
157
|
+
let validated = defaultValidated;
|
|
158
|
+
if (validationConfig.input && hasSchemas(reqSchema)) {
|
|
159
|
+
const result = await this.validateRequestSchema(req, reqSchema, bodyCache);
|
|
160
|
+
if (!result.success) return responseHelpers.json(400, { message: result.error?.message });
|
|
161
|
+
validated = result.data;
|
|
162
|
+
}
|
|
163
|
+
const mwResult = await mwHandler(this.createContext(req, validated, extensions));
|
|
164
|
+
if (mwResult instanceof Response) return mwResult;
|
|
165
|
+
if (mwResult) Object.assign(extensions, mwResult);
|
|
166
|
+
}
|
|
167
|
+
let routeValidated = defaultValidated;
|
|
168
|
+
if (validationConfig.input && hasRouteSchemas) {
|
|
169
|
+
const result = await this.validateRequestSchema(req, request, bodyCache);
|
|
170
|
+
if (!result.success) return responseHelpers.json(400, { message: result.error?.message });
|
|
171
|
+
routeValidated = result.data;
|
|
172
|
+
}
|
|
173
|
+
const handlerResponse = await handler(this.createContext(req, routeValidated, extensions));
|
|
174
|
+
if (effectiveOutputValidation) return this.validateResponseBody(handlerResponse, response);
|
|
175
|
+
return handlerResponse;
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return bunRoutes;
|
|
179
|
+
}
|
|
180
|
+
defineRoute(config) {
|
|
181
|
+
this.routes.push(config);
|
|
182
|
+
}
|
|
183
|
+
getOpenApiSpec() {
|
|
184
|
+
return require_index.generateOpenApiSpec({
|
|
185
|
+
title: this.options.openapi?.title ?? "API",
|
|
186
|
+
description: this.options.openapi?.description,
|
|
187
|
+
version: this.options.openapi?.version ?? "1.0.0",
|
|
188
|
+
prefix: this.options.prefix,
|
|
189
|
+
servers: this.options.openapi?.servers,
|
|
190
|
+
securitySchemes: this.options.openapi?.securitySchemes,
|
|
191
|
+
routes: this.routes,
|
|
192
|
+
globalMiddlewares: this.options.middlewares
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
serve(port, callback) {
|
|
196
|
+
const bunRoutes = this.buildBunRoutes();
|
|
197
|
+
const server = Bun.serve({
|
|
198
|
+
port,
|
|
199
|
+
routes: bunRoutes,
|
|
200
|
+
fetch: () => new Response("Not found", { status: 404 })
|
|
201
|
+
});
|
|
202
|
+
if (callback) callback(server);
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
//#endregion
|
|
206
|
+
exports.Api = Api;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OpenApiSpec } from "../openapi/types.cjs";
|
|
2
|
+
import { ApiOptions, RequestSchema, ResponseSchema, RouteConfig } from "./types.cjs";
|
|
3
|
+
import { Middleware } from "../middleware/index.cjs";
|
|
4
|
+
|
|
5
|
+
//#region src/lib/api/core/index.d.ts
|
|
6
|
+
declare class Api<TMiddlewares extends readonly Middleware[] = readonly []> {
|
|
7
|
+
private options;
|
|
8
|
+
private routes;
|
|
9
|
+
constructor(options?: ApiOptions<TMiddlewares>);
|
|
10
|
+
private getFullPath;
|
|
11
|
+
private validateRequestSchema;
|
|
12
|
+
private createContext;
|
|
13
|
+
private validateResponseBody;
|
|
14
|
+
private buildBunRoutes;
|
|
15
|
+
defineRoute<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema = ResponseSchema, TRouteMiddlewares extends readonly Middleware[] = readonly []>(config: RouteConfig<TReq, TRes, TMiddlewares, TRouteMiddlewares>): void;
|
|
16
|
+
getOpenApiSpec(): Promise<OpenApiSpec>;
|
|
17
|
+
serve(port: number, callback?: (server: Bun.Server<unknown>) => void): void;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { Api };
|
|
21
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/api/core/index.ts"],"mappings":";;;;;cA4Ea,GAAA,+BAAkC,UAAA;EAAA,QACrC,OAAA;EAAA,QACA,MAAA;cAOW,OAAA,GAAS,UAAA,CAAW,YAAA;EAAA,QAI/B,WAAA;EAAA,QAaM,qBAAA;EAAA,QA+EN,aAAA;EAAA,QAaM,oBAAA;EAAA,QA6BN,cAAA;EAuHD,WAAA,cACQ,aAAA,GAAgB,aAAA,eAChB,cAAA,GAAiB,cAAA,qCACK,UAAA,iBAAA,CACnC,MAAA,EAAQ,WAAA,CAAY,IAAA,EAAM,IAAA,EAAM,YAAA,EAAc,iBAAA;EAWzC,cAAA,CAAA,GAAc,OAAA,CAXA,WAAA;EAwBd,KAAA,CAAM,IAAA,UAAc,QAAA,IAAY,MAAA,EAAQ,GAAA,CAAI,MAAA;AAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OpenApiSpec } from "../openapi/types.mjs";
|
|
2
|
+
import { ApiOptions, RequestSchema, ResponseSchema, RouteConfig } from "./types.mjs";
|
|
3
|
+
import { Middleware } from "../middleware/index.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/lib/api/core/index.d.ts
|
|
6
|
+
declare class Api<TMiddlewares extends readonly Middleware[] = readonly []> {
|
|
7
|
+
private options;
|
|
8
|
+
private routes;
|
|
9
|
+
constructor(options?: ApiOptions<TMiddlewares>);
|
|
10
|
+
private getFullPath;
|
|
11
|
+
private validateRequestSchema;
|
|
12
|
+
private createContext;
|
|
13
|
+
private validateResponseBody;
|
|
14
|
+
private buildBunRoutes;
|
|
15
|
+
defineRoute<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema = ResponseSchema, TRouteMiddlewares extends readonly Middleware[] = readonly []>(config: RouteConfig<TReq, TRes, TMiddlewares, TRouteMiddlewares>): void;
|
|
16
|
+
getOpenApiSpec(): Promise<OpenApiSpec>;
|
|
17
|
+
serve(port: number, callback?: (server: Bun.Server<unknown>) => void): void;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { Api };
|
|
21
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/api/core/index.ts"],"mappings":";;;;;cA4Ea,GAAA,+BAAkC,UAAA;EAAA,QACrC,OAAA;EAAA,QACA,MAAA;cAOW,OAAA,GAAS,UAAA,CAAW,YAAA;EAAA,QAI/B,WAAA;EAAA,QAaM,qBAAA;EAAA,QA+EN,aAAA;EAAA,QAaM,oBAAA;EAAA,QA6BN,cAAA;EAuHD,WAAA,cACQ,aAAA,GAAgB,aAAA,eAChB,cAAA,GAAiB,cAAA,qCACK,UAAA,iBAAA,CACnC,MAAA,EAAQ,WAAA,CAAY,IAAA,EAAM,IAAA,EAAM,YAAA,EAAc,iBAAA;EAWzC,cAAA,CAAA,GAAc,OAAA,CAXA,WAAA;EAwBd,KAAA,CAAM,IAAA,UAAc,QAAA,IAAY,MAAA,EAAQ,GAAA,CAAI,MAAA;AAAA"}
|