@tailor-platform/sdk 2.0.0-next.2 → 2.0.0-next.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/CHANGELOG.md +466 -10
- package/README.md +9 -9
- package/agent-skills/{tailor-sdk → tailor}/SKILL.md +3 -1
- package/dist/aigateway-B3oZZE6v.mjs +15 -0
- package/dist/aigateway-B3oZZE6v.mjs.map +1 -0
- package/dist/application-D2hSK1ZL.mjs +3 -0
- package/dist/application-eHp9jXld.mjs +6393 -0
- package/dist/application-eHp9jXld.mjs.map +1 -0
- package/dist/{authconnection-D2MhtTN5.mjs → authconnection-BGQM8FZI.mjs} +2 -2
- package/dist/authconnection-BGQM8FZI.mjs.map +1 -0
- package/dist/cli/cache/bundle-cache.d.mts +1 -0
- package/dist/cli/cache/store.d.mts +1 -0
- package/dist/cli/cache/types.d.mts +1 -0
- package/dist/cli/commands/api/api-call.d.mts +19 -0
- package/dist/cli/commands/api/index.d.mts +3 -0
- package/dist/cli/commands/deploy/aigateway.d.mts +1 -0
- package/dist/cli/commands/deploy/application.d.mts +1 -0
- package/dist/cli/commands/deploy/apply-phases.d.mts +1 -0
- package/dist/cli/commands/deploy/auth.d.mts +1 -0
- package/dist/cli/commands/deploy/deploy.d.mts +24 -0
- package/dist/cli/commands/deploy/executor.d.mts +1 -0
- package/dist/cli/commands/deploy/function-registry-types.d.mts +12 -0
- package/dist/cli/commands/deploy/function-registry.d.mts +2 -0
- package/dist/cli/commands/deploy/idp.d.mts +1 -0
- package/dist/cli/commands/deploy/resolver.d.mts +1 -0
- package/dist/cli/commands/deploy/secret-manager.d.mts +1 -0
- package/dist/cli/commands/deploy/staticwebsite.d.mts +1 -0
- package/dist/cli/commands/deploy/tailordb/index.d.mts +1 -0
- package/dist/cli/commands/deploy/types.d.mts +1 -0
- package/dist/cli/commands/deploy/workflow.d.mts +1 -0
- package/dist/cli/commands/executor/get.d.mts +29 -0
- package/dist/cli/commands/executor/jobs.d.mts +123 -0
- package/dist/cli/commands/executor/list.d.mts +19 -0
- package/dist/cli/commands/executor/transform.d.mts +41 -0
- package/dist/cli/commands/executor/trigger.d.mts +41 -0
- package/dist/cli/commands/executor/webhook.d.mts +22 -0
- package/dist/cli/commands/function/get.d.mts +18 -0
- package/dist/cli/commands/function/list.d.mts +22 -0
- package/dist/cli/commands/function/transform.d.mts +11 -0
- package/dist/cli/commands/generate/options.d.mts +7 -0
- package/dist/cli/commands/generate/seed/bundler.d.mts +26 -0
- package/dist/cli/commands/generate/service.d.mts +11 -0
- package/dist/cli/commands/machineuser/list.d.mts +27 -0
- package/dist/cli/commands/machineuser/token.d.mts +22 -0
- package/dist/cli/commands/oauth2client/get.d.mts +18 -0
- package/dist/cli/commands/oauth2client/list.d.mts +20 -0
- package/dist/cli/commands/oauth2client/transform.d.mts +20 -0
- package/dist/cli/commands/organization/folder/create.d.mts +18 -0
- package/dist/cli/commands/organization/folder/delete.d.mts +16 -0
- package/dist/cli/commands/organization/folder/get.d.mts +17 -0
- package/dist/cli/commands/organization/folder/list.d.mts +22 -0
- package/dist/cli/commands/organization/folder/update.d.mts +18 -0
- package/dist/cli/commands/organization/get.d.mts +16 -0
- package/dist/cli/commands/organization/list.d.mts +15 -0
- package/dist/cli/commands/organization/transform.d.mts +27 -0
- package/dist/cli/commands/organization/tree.d.mts +25 -0
- package/dist/cli/commands/organization/update.d.mts +17 -0
- package/dist/cli/commands/remove.d.mts +16 -0
- package/dist/cli/commands/show.d.mts +34 -0
- package/dist/cli/commands/tailordb/migrate/bundler.d.mts +28 -0
- package/dist/cli/commands/tailordb/migrate/config.d.mts +19 -0
- package/dist/cli/commands/tailordb/migrate/diff-calculator.d.mts +223 -0
- package/dist/cli/commands/tailordb/migrate/generate.d.mts +17 -0
- package/dist/cli/commands/tailordb/migrate/snapshot-types.d.mts +202 -0
- package/dist/cli/commands/tailordb/migrate/snapshot.d.mts +98 -0
- package/dist/cli/commands/tailordb/migrate/types.d.mts +7 -0
- package/dist/cli/commands/tailordb/truncate.d.mts +19 -0
- package/dist/cli/commands/workflow/executions.d.mts +75 -0
- package/dist/cli/commands/workflow/get.d.mts +29 -0
- package/dist/cli/commands/workflow/list.d.mts +19 -0
- package/dist/cli/commands/workflow/resume.d.mts +23 -0
- package/dist/cli/commands/workflow/start.d.mts +61 -0
- package/dist/cli/commands/workflow/status.d.mts +5 -0
- package/dist/cli/commands/workflow/transform.d.mts +33 -0
- package/dist/cli/commands/workflow/wait.d.mts +16 -0
- package/dist/cli/commands/workflow/waiter.d.mts +23 -0
- package/dist/cli/commands/workspace/app/health.d.mts +18 -0
- package/dist/cli/commands/workspace/app/list.d.mts +22 -0
- package/dist/cli/commands/workspace/app/transform.d.mts +18 -0
- package/dist/cli/commands/workspace/create.d.mts +25 -0
- package/dist/cli/commands/workspace/delete.d.mts +15 -0
- package/dist/cli/commands/workspace/get.d.mts +17 -0
- package/dist/cli/commands/workspace/list.d.mts +17 -0
- package/dist/cli/commands/workspace/restore.d.mts +15 -0
- package/dist/cli/commands/workspace/transform.d.mts +16 -0
- package/dist/cli/commands/workspace/user/invite.d.mts +22 -0
- package/dist/cli/commands/workspace/user/list.d.mts +22 -0
- package/dist/cli/commands/workspace/user/remove.d.mts +17 -0
- package/dist/cli/commands/workspace/user/transform.d.mts +8 -0
- package/dist/cli/commands/workspace/user/update.d.mts +22 -0
- package/dist/cli/erd-viewer-assets/app.js +279 -36
- package/dist/cli/erd-viewer-assets/index.html +4 -0
- package/dist/cli/erd-viewer-assets/styles.css +252 -5
- package/dist/cli/index.d.mts +18 -3
- package/dist/cli/index.mjs +2136 -519
- package/dist/cli/index.mjs.map +1 -1
- package/dist/cli/lib.d.mts +81 -21107
- package/dist/cli/lib.mjs +6 -9
- package/dist/cli/lib.mjs.map +1 -1
- package/dist/cli/query/index.d.mts +35 -0
- package/dist/cli/services/application.d.mts +1 -0
- package/dist/cli/services/auth/service.d.mts +1 -0
- package/dist/cli/services/executor/service.d.mts +1 -0
- package/dist/cli/services/http-adapter/bundler.d.mts +1 -0
- package/dist/cli/services/http-adapter/service.d.mts +1 -0
- package/dist/cli/services/resolver/service.d.mts +1 -0
- package/dist/cli/services/tailordb/service.d.mts +1 -0
- package/dist/cli/services/workflow/bundler.d.mts +1 -0
- package/dist/cli/services/workflow/service.d.mts +1 -0
- package/dist/cli/shared/args.d.mts +13 -0
- package/dist/cli/shared/client.d.mts +1273 -0
- package/dist/cli/shared/config-loader.d.mts +26 -0
- package/dist/cli/shared/context.d.mts +28 -0
- package/dist/cli/shared/script-executor.d.mts +75 -0
- package/dist/cli/shared/seed-chunker.d.mts +46 -0
- package/dist/cli/shared/trigger-context.d.mts +1 -0
- package/dist/cli/shared/type-generator.d.mts +20 -0
- package/dist/cli/ts-hook.d.mts +4 -0
- package/dist/cli/ts-hook.mjs +303 -0
- package/dist/completion/zsh-worker.zsh +1523 -1123
- package/dist/configure/config/index.d.mts +21 -0
- package/dist/configure/config/types.d.mts +103 -0
- package/dist/configure/index.d.mts +122 -9
- package/dist/configure/index.mjs +24 -21
- package/dist/configure/index.mjs.map +1 -1
- package/dist/configure/services/aigateway/index.d.mts +17 -0
- package/dist/configure/services/aigateway/types.d.mts +11 -0
- package/dist/configure/services/auth/index.d.mts +34 -0
- package/dist/configure/services/auth/types.d.mts +172 -0
- package/dist/configure/services/executor/executor.d.mts +81 -0
- package/dist/configure/services/executor/index.d.mts +8 -0
- package/dist/configure/services/executor/operation.d.mts +45 -0
- package/dist/configure/services/executor/trigger/event.d.mts +272 -0
- package/dist/configure/services/executor/trigger/index.d.mts +8 -0
- package/dist/configure/services/executor/trigger/schedule.d.mts +25 -0
- package/dist/configure/services/executor/trigger/webhook.d.mts +44 -0
- package/dist/configure/services/executor/types.d.mts +2 -0
- package/dist/configure/services/http-adapter/http-adapter.d.mts +125 -0
- package/dist/configure/services/http-adapter/index.d.mts +2 -0
- package/dist/configure/services/idp/index.d.mts +64 -0
- package/dist/configure/services/idp/permission.d.mts +80 -0
- package/dist/configure/services/idp/types.d.mts +20 -0
- package/dist/configure/services/index.d.mts +32 -0
- package/dist/configure/services/resolver/index.d.mts +5 -0
- package/dist/configure/services/resolver/resolver.d.mts +75 -0
- package/dist/configure/services/resolver/types.d.mts +6 -0
- package/dist/configure/services/secrets/index.d.mts +38 -0
- package/dist/configure/services/secrets/types.d.mts +11 -0
- package/dist/configure/services/staticwebsite/index.d.mts +19 -0
- package/dist/configure/services/staticwebsite/types.d.mts +11 -0
- package/dist/configure/services/tailordb/index.d.mts +4 -0
- package/dist/configure/services/tailordb/permission.d.mts +119 -0
- package/dist/configure/services/tailordb/schema.d.mts +456 -0
- package/dist/configure/services/tailordb/types.d.mts +149 -0
- package/dist/configure/services/workflow/index.d.mts +6 -0
- package/dist/configure/services/workflow/job.d.mts +79 -0
- package/dist/configure/services/workflow/types.d.mts +2 -0
- package/dist/configure/services/workflow/wait-point.d.mts +73 -0
- package/dist/configure/services/workflow/workflow.d.mts +54 -0
- package/dist/configure/types/aigateway-name.d.mts +12 -0
- package/dist/configure/types/connection-name.d.mts +12 -0
- package/dist/configure/types/field-runtime.d.mts +17 -0
- package/dist/configure/types/field.d.mts +9 -0
- package/dist/configure/types/field.types.d.mts +109 -0
- package/dist/configure/types/idp-name.d.mts +12 -0
- package/dist/configure/types/index.d.mts +4 -0
- package/dist/configure/types/machine-user.d.mts +2 -0
- package/dist/configure/types/type.d.mts +82 -0
- package/dist/context-Bd266-ru.mjs.map +1 -1
- package/dist/{crashreport-DFq-vsU0.mjs → crashreport-Cg-pqRJV.mjs} +6 -6
- package/dist/{crashreport-DFq-vsU0.mjs.map → crashreport-Cg-pqRJV.mjs.map} +1 -1
- package/dist/{crashreport-BMWcxeSE.mjs → crashreport-D3RjuSYb.mjs} +1 -1
- package/dist/enum-constants-j9QBF0cB.mjs.map +1 -1
- package/dist/{errors-Dtf2WPaW.mjs → errors-118wUDRr.mjs} +2 -2
- package/dist/errors-118wUDRr.mjs.map +1 -0
- package/dist/field-runtime-CAnh_oow.mjs +183 -0
- package/dist/field-runtime-CAnh_oow.mjs.map +1 -0
- package/dist/file-utils-CYZnO1pX.mjs.map +1 -1
- package/dist/{globals-Cf0sxIt8.mjs → globals-DhwZj0RB.mjs} +4 -46
- package/dist/globals-DhwZj0RB.mjs.map +1 -0
- package/dist/{idp-BDbK5gjm.mjs → idp-Bx25ZBdN.mjs} +9 -1
- package/dist/idp-Bx25ZBdN.mjs.map +1 -0
- package/dist/{interceptor-D-q1rvRl.mjs → interceptor-e33JtsC-.mjs} +2 -2
- package/dist/interceptor-e33JtsC-.mjs.map +1 -0
- package/dist/kysely/index.d.mts +2 -3
- package/dist/{kysely-type-DR8uzZTA.mjs → kysely-type-5eAChaHO.mjs} +4 -2
- package/dist/kysely-type-5eAChaHO.mjs.map +1 -0
- package/dist/{logger-CxF-Ex5d.mjs → logger-BEiZZ3qT.mjs} +3 -3
- package/dist/{logger-CxF-Ex5d.mjs.map → logger-BEiZZ3qT.mjs.map} +1 -1
- package/dist/parser/service/auth/index.d.mts +1 -0
- package/dist/parser/service/auth/schema.d.mts +1 -0
- package/dist/parser/service/http-adapter/index.d.mts +1 -0
- package/dist/parser/service/http-adapter/schema.d.mts +1 -0
- package/dist/parser/service/idp/types.d.mts +4 -0
- package/dist/parser/service/tailordb/types.d.mts +126 -0
- package/dist/platform-serialize-RoRtBS0v.mjs +46 -0
- package/dist/platform-serialize-RoRtBS0v.mjs.map +1 -0
- package/dist/plugin/builtin/enum-constants/index.d.mts +16 -1
- package/dist/plugin/builtin/file-utils/index.d.mts +16 -1
- package/dist/plugin/builtin/kysely-type/index.d.mts +16 -1
- package/dist/plugin/builtin/kysely-type/index.mjs +1 -1
- package/dist/plugin/builtin/seed/index.d.mts +45 -1
- package/dist/plugin/builtin/seed/index.mjs +1 -1
- package/dist/plugin/get-generated-type.d.mts +17 -0
- package/dist/plugin/index.d.mts +3 -118
- package/dist/plugin/index.mjs +1 -1
- package/dist/plugin/index.mjs.map +1 -1
- package/dist/plugin/manager.d.mts +1 -0
- package/dist/plugin/types.d.mts +243 -0
- package/dist/plugin/with-context.d.mts +102 -0
- package/dist/{runtime-CY4JvrDj.mjs → register-ts-hook-ZpBacA07.mjs} +3426 -2041
- package/dist/register-ts-hook-ZpBacA07.mjs.map +1 -0
- package/dist/registry-DH4m7eYo.mjs.map +1 -1
- package/dist/{repl-editor-DmGr9zMw.mjs → repl-editor-BCozyiNq.mjs} +6 -5
- package/dist/{repl-editor-DmGr9zMw.mjs.map → repl-editor-BCozyiNq.mjs.map} +1 -1
- package/dist/runtime/aigateway.d.mts +35 -0
- package/dist/runtime/aigateway.mjs +3 -0
- package/dist/runtime/authconnection.d.mts +31 -2
- package/dist/runtime/authconnection.mjs +1 -1
- package/dist/runtime/context.d.mts +46 -2
- package/dist/runtime/file.d.mts +210 -2
- package/dist/runtime/globals.d.mts +31 -19
- package/dist/runtime/iconv.d.mts +121 -2
- package/dist/runtime/idp.d.mts +186 -2
- package/dist/runtime/idp.mjs +1 -1
- package/dist/runtime/index.d.mts +47 -9
- package/dist/runtime/index.mjs +5 -4
- package/dist/runtime/secretmanager.d.mts +54 -2
- package/dist/{types-BZ7QKVE8.d.mts → runtime/types.d.mts} +4 -5
- package/dist/runtime/workflow.d.mts +112 -2
- package/dist/runtime/workflow.mjs +2 -2
- package/dist/{schema-Dtw9Orye.mjs → schema-89dYxNC2.mjs} +17 -182
- package/dist/schema-89dYxNC2.mjs.map +1 -0
- package/dist/{secret-file-VSVGy1V0.mjs → secret-file-aoNXJmKa.mjs} +3 -3
- package/dist/secret-file-aoNXJmKa.mjs.map +1 -0
- package/dist/secretmanager-Bd45j7an.mjs +98 -0
- package/dist/secretmanager-Bd45j7an.mjs.map +1 -0
- package/dist/seed/index.d.mts +1 -2
- package/dist/{seed-izIEyP3z.mjs → seed-CRSQJI_z.mjs} +14 -3
- package/dist/seed-CRSQJI_z.mjs.map +1 -0
- package/dist/service-CkIwEctX.mjs +3 -0
- package/dist/{service-DU1mVzri2.mjs → service-DeZeYa06.mjs} +3 -3
- package/dist/service-DeZeYa06.mjs.map +1 -0
- package/dist/{service-DjyqbCaJ.mjs → service-ufH7sS8o.mjs} +396 -58
- package/dist/service-ufH7sS8o.mjs.map +1 -0
- package/dist/service_pb-CIrhGwHk.mjs +988 -0
- package/dist/service_pb-CIrhGwHk.mjs.map +1 -0
- package/dist/service_pb-DjwIn4jO.mjs +3 -0
- package/dist/tailor-proto/src/tailor/v1/aigateway_pb.d.mts +204 -0
- package/dist/tailor-proto/src/tailor/v1/aigateway_resource_pb.d.mts +58 -0
- package/dist/tailor-proto/src/tailor/v1/application_pb.d.mts +316 -0
- package/dist/tailor-proto/src/tailor/v1/application_resource_pb.d.mts +161 -0
- package/dist/tailor-proto/src/tailor/v1/auth_pb.d.mts +2070 -0
- package/dist/tailor-proto/src/tailor/v1/auth_resource_pb.d.mts +861 -0
- package/dist/tailor-proto/src/tailor/v1/events_pb.d.mts +112 -0
- package/dist/tailor-proto/src/tailor/v1/events_resource_pb.d.mts +69 -0
- package/dist/tailor-proto/src/tailor/v1/executor_pb.d.mts +439 -0
- package/dist/tailor-proto/src/tailor/v1/executor_resource_pb.d.mts +564 -0
- package/dist/tailor-proto/src/tailor/v1/function_pb.d.mts +145 -0
- package/dist/tailor-proto/src/tailor/v1/function_registry_pb.d.mts +451 -0
- package/dist/tailor-proto/src/tailor/v1/function_resource_pb.d.mts +192 -0
- package/dist/tailor-proto/src/tailor/v1/http_adapter_resource_pb.d.mts +50 -0
- package/dist/tailor-proto/src/tailor/v1/idp_pb.d.mts +407 -0
- package/dist/tailor-proto/src/tailor/v1/idp_resource_pb.d.mts +430 -0
- package/dist/tailor-proto/src/tailor/v1/metadata_pb.d.mts +73 -0
- package/dist/tailor-proto/src/tailor/v1/metadata_resource_pb.d.mts +17 -0
- package/dist/tailor-proto/src/tailor/v1/meter_pb.d.mts +309 -0
- package/dist/tailor-proto/src/tailor/v1/pipeline_pb.d.mts +591 -0
- package/dist/tailor-proto/src/tailor/v1/pipeline_resource_pb.d.mts +330 -0
- package/dist/tailor-proto/src/tailor/v1/resource_pb.d.mts +113 -0
- package/dist/tailor-proto/src/tailor/v1/secret_manager_pb.d.mts +346 -0
- package/dist/tailor-proto/src/tailor/v1/secret_manager_resource_pb.d.mts +54 -0
- package/dist/tailor-proto/src/tailor/v1/service_pb.d.mts +3576 -0
- package/dist/tailor-proto/src/tailor/v1/stateflow_pb.d.mts +187 -0
- package/dist/tailor-proto/src/tailor/v1/stateflow_resource_pb.d.mts +29 -0
- package/dist/tailor-proto/src/tailor/v1/staticwebsite_pb.d.mts +429 -0
- package/dist/tailor-proto/src/tailor/v1/staticwebsite_resource_pb.d.mts +90 -0
- package/dist/tailor-proto/src/tailor/v1/tailordb_pb.d.mts +684 -0
- package/dist/tailor-proto/src/tailor/v1/tailordb_resource_pb.d.mts +797 -0
- package/dist/tailor-proto/src/tailor/v1/telemetryrouter_pb.d.mts +330 -0
- package/dist/tailor-proto/src/tailor/v1/telemetryrouter_resource_pb.d.mts +183 -0
- package/dist/tailor-proto/src/tailor/v1/workflow_pb.d.mts +842 -0
- package/dist/tailor-proto/src/tailor/v1/workflow_resource_pb.d.mts +276 -0
- package/dist/tailor-proto/src/tailor/v1/workspace_pb.d.mts +2015 -0
- package/dist/tailor-proto/src/tailor/v1/workspace_resource_pb.d.mts +483 -0
- package/dist/{telemetry-CdqJEzkj.mjs → telemetry-BRVdwh14.mjs} +3 -3
- package/dist/telemetry-BRVdwh14.mjs.map +1 -0
- package/dist/telemetry-CkbkeJxl.mjs +3 -0
- package/dist/types/aigateway.generated.d.mts +9 -0
- package/dist/types/app-config.generated.d.mts +4 -0
- package/dist/types/auth-connection.generated.d.mts +20 -0
- package/dist/types/auth.generated.d.mts +145 -0
- package/dist/types/executor.generated.d.mts +177 -0
- package/dist/types/helpers.d.mts +39 -0
- package/dist/types/http-adapter.generated.d.mts +17 -0
- package/dist/{workflow.generated-ClEjBYhm.d.mts → types/idp.generated.d.mts} +98 -185
- package/dist/types/resolver.generated.d.mts +39 -0
- package/dist/types/secrets.generated.d.mts +14 -0
- package/dist/types/staticwebsite.generated.d.mts +10 -0
- package/dist/{types-CdcQh4Z2.d.mts → types/tailordb.generated.d.mts} +2 -287
- package/dist/types/workflow.generated.d.mts +12 -0
- package/dist/types-C-lQ4se3.mjs +4 -0
- package/dist/types-CXF2OYdR.mjs +199 -0
- package/dist/types-CXF2OYdR.mjs.map +1 -0
- package/dist/utils/test/index.d.mts +5 -89
- package/dist/utils/test/index.mjs.map +1 -1
- package/dist/utils/test/mock.d.mts +87 -0
- package/dist/vitest/environment.d.mts +1 -2
- package/dist/vitest/environment.mjs +2 -2
- package/dist/vitest/environment.mjs.map +1 -1
- package/dist/vitest/index.d.mts +12 -428
- package/dist/vitest/index.mjs +739 -8
- package/dist/vitest/index.mjs.map +1 -1
- package/dist/vitest/mock-kysely.d.mts +62 -0
- package/dist/vitest/mock.d.mts +9 -0
- package/dist/vitest/mocks/aigateway.d.mts +30 -0
- package/dist/vitest/mocks/authconnection.d.mts +28 -0
- package/dist/vitest/mocks/file.d.mts +41 -0
- package/dist/vitest/mocks/iconv.d.mts +27 -0
- package/dist/vitest/mocks/idp.d.mts +44 -0
- package/dist/vitest/mocks/secretmanager.d.mts +33 -0
- package/dist/vitest/mocks/tailordb.d.mts +71 -0
- package/dist/vitest/mocks/workflow.d.mts +115 -0
- package/dist/vitest/setup.d.mts +1 -2
- package/dist/vitest/setup.mjs +2 -2
- package/dist/vitest/workflow-local.d.mts +40 -0
- package/dist/{workflow-BOmaZwwG.mjs → workflow-Bo59B75H.mjs} +9 -2
- package/dist/workflow-Bo59B75H.mjs.map +1 -0
- package/docs/cli/application.md +98 -250
- package/docs/cli/auth.md +48 -292
- package/docs/cli/completion.md +1 -25
- package/docs/cli/crashreport.md +3 -61
- package/docs/cli/executor.md +23 -187
- package/docs/cli/function.md +14 -130
- package/docs/cli/organization.md +11 -221
- package/docs/cli/plugin.md +29 -0
- package/docs/cli/query.md +2 -22
- package/docs/cli/secret.md +71 -251
- package/docs/cli/setup.md +137 -41
- package/docs/cli/skills.md +50 -39
- package/docs/cli/staticwebsite.md +32 -180
- package/docs/cli/tailordb.md +97 -323
- package/docs/cli/upgrade.md +2 -22
- package/docs/cli/user.md +78 -247
- package/docs/cli/workflow.md +44 -203
- package/docs/cli/workspace.md +165 -538
- package/docs/cli-reference.md +167 -67
- package/docs/configuration.md +10 -4
- package/docs/github-actions.md +46 -19
- package/docs/migration/v2.md +286 -26
- package/docs/multi-environment.md +29 -7
- package/docs/plugin/index.md +6 -6
- package/docs/quickstart.md +8 -7
- package/docs/runtime.md +5 -1
- package/docs/services/aigateway.md +18 -2
- package/docs/services/auth.md +32 -40
- package/docs/services/http-adapter.md +16 -1
- package/docs/services/idp.md +55 -2
- package/docs/services/resolver.md +1 -1
- package/docs/services/secret.md +11 -11
- package/docs/services/staticwebsite.md +8 -2
- package/docs/services/tailordb-migration.md +24 -22
- package/docs/services/tailordb.md +25 -2
- package/docs/services/workflow.md +14 -14
- package/docs/testing.md +49 -3
- package/package.json +42 -31
- package/postinstall.mjs +4 -6
- package/dist/application-Dtqap5jM.mjs +0 -3
- package/dist/application-XuMWK4eq.mjs +0 -7257
- package/dist/application-XuMWK4eq.mjs.map +0 -1
- package/dist/authconnection-D2MhtTN5.mjs.map +0 -1
- package/dist/authconnection-DvUQAjQS.d.mts +0 -39
- package/dist/context-C2lEi9uw.d.mts +0 -47
- package/dist/errors-Dtf2WPaW.mjs.map +0 -1
- package/dist/field-DOsJCPFa.mjs +0 -22
- package/dist/field-DOsJCPFa.mjs.map +0 -1
- package/dist/file-Dq3NIt_F.d.mts +0 -211
- package/dist/globals-Cf0sxIt8.mjs.map +0 -1
- package/dist/http-adapter.generated-DFsXDdm5.d.mts +0 -581
- package/dist/iconv-Co-TOPuH.d.mts +0 -122
- package/dist/idp-BDbK5gjm.mjs.map +0 -1
- package/dist/idp-DrhVrLmV.d.mts +0 -160
- package/dist/index-BI-_j9Z3.d.mts +0 -1013
- package/dist/index-C4JirJH8.d.mts +0 -18
- package/dist/index-CZfWhr0a.d.mts +0 -18
- package/dist/index-Cg8VKAdN.d.mts +0 -46
- package/dist/index-DYRjoLXD.d.mts +0 -47
- package/dist/index-lFpcjHPU.d.mts +0 -201
- package/dist/index-nW7hE6oE.d.mts +0 -18
- package/dist/interceptor-D-q1rvRl.mjs.map +0 -1
- package/dist/kysely-type-DR8uzZTA.mjs.map +0 -1
- package/dist/mock-FPxmnt-y.mjs +0 -759
- package/dist/mock-FPxmnt-y.mjs.map +0 -1
- package/dist/runtime-CY4JvrDj.mjs.map +0 -1
- package/dist/schema-Dtw9Orye.mjs.map +0 -1
- package/dist/secret-file-VSVGy1V0.mjs.map +0 -1
- package/dist/secretmanager-B3n4KHfm.d.mts +0 -55
- package/dist/seed-izIEyP3z.mjs.map +0 -1
- package/dist/service-DCqIWibD.mjs +0 -3
- package/dist/service-DU1mVzri2.mjs.map +0 -1
- package/dist/service-DjyqbCaJ.mjs.map +0 -1
- package/dist/telemetry-CdqJEzkj.mjs.map +0 -1
- package/dist/telemetry-ClwW5ohF.mjs +0 -3
- package/dist/types-74etvaxy.mjs +0 -4
- package/dist/types-BDRml5C3.d.mts +0 -574
- package/dist/types-BQijbo4m.mjs +0 -371
- package/dist/types-BQijbo4m.mjs.map +0 -1
- package/dist/types-BX4q6Mo6.d.mts +0 -339
- package/dist/workflow-BOmaZwwG.mjs.map +0 -1
- package/dist/workflow-BVy4XWjS.d.mts +0 -101
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as mapAllowedValues, t as parseInternal } from "./field-runtime-CAnh_oow.mjs";
|
|
2
2
|
import { t as brandValue } from "./brand-Eo4pLXPJ.mjs";
|
|
3
3
|
import { cloneDeep } from "es-toolkit";
|
|
4
4
|
|
|
@@ -6,22 +6,10 @@ import { cloneDeep } from "es-toolkit";
|
|
|
6
6
|
function isRelationSelfConfig(config) {
|
|
7
7
|
return config.toward.type === "self";
|
|
8
8
|
}
|
|
9
|
-
const regex = {
|
|
10
|
-
uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,
|
|
11
|
-
date: /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/,
|
|
12
|
-
time: /^(?<hour>\d{2}):(?<minute>\d{2})$/,
|
|
13
|
-
datetime: /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})T(?<hour>\d{2}):(?<minute>\d{2}):(?<second>\d{2})(.(?<millisec>\d{3}))?Z$/,
|
|
14
|
-
decimal: /^-?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/
|
|
15
|
-
};
|
|
16
|
-
/**
|
|
17
|
-
* Creates a new TailorDBField instance.
|
|
18
|
-
* @param type - Field type
|
|
19
|
-
* @param options - Field options
|
|
20
|
-
* @param fields - Nested fields for object-like types
|
|
21
|
-
* @param values - Allowed values for enum-like fields
|
|
22
|
-
* @returns A new TailorDBField
|
|
23
|
-
*/
|
|
24
9
|
function createTailorDBField(type, options, fields, values) {
|
|
10
|
+
return createTailorDBFieldRuntime(type, options, fields, values);
|
|
11
|
+
}
|
|
12
|
+
function createTailorDBFieldRuntime(type, options, fields, values) {
|
|
25
13
|
const _metadata = { required: true };
|
|
26
14
|
let _rawRelation;
|
|
27
15
|
if (options) {
|
|
@@ -29,163 +17,11 @@ function createTailorDBField(type, options, fields, values) {
|
|
|
29
17
|
if (options.array === true) _metadata.array = true;
|
|
30
18
|
}
|
|
31
19
|
if (values) _metadata.allowedValues = mapAllowedValues(values);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
* @returns Array of validation issues
|
|
37
|
-
*/
|
|
38
|
-
function validateValue(args) {
|
|
39
|
-
const { value, data, invoker, pathArray } = args;
|
|
40
|
-
const issues = [];
|
|
41
|
-
switch (type) {
|
|
42
|
-
case "string":
|
|
43
|
-
if (typeof value !== "string") issues.push({
|
|
44
|
-
message: `Expected a string: received ${String(value)}`,
|
|
45
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
46
|
-
});
|
|
47
|
-
break;
|
|
48
|
-
case "integer":
|
|
49
|
-
if (typeof value !== "number" || !Number.isInteger(value)) issues.push({
|
|
50
|
-
message: `Expected an integer: received ${String(value)}`,
|
|
51
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
52
|
-
});
|
|
53
|
-
break;
|
|
54
|
-
case "float":
|
|
55
|
-
if (typeof value !== "number" || !Number.isFinite(value)) issues.push({
|
|
56
|
-
message: `Expected a number: received ${String(value)}`,
|
|
57
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
58
|
-
});
|
|
59
|
-
break;
|
|
60
|
-
case "boolean":
|
|
61
|
-
if (typeof value !== "boolean") issues.push({
|
|
62
|
-
message: `Expected a boolean: received ${String(value)}`,
|
|
63
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
64
|
-
});
|
|
65
|
-
break;
|
|
66
|
-
case "uuid":
|
|
67
|
-
if (typeof value !== "string" || !regex.uuid.test(value)) issues.push({
|
|
68
|
-
message: `Expected a valid UUID: received ${String(value)}`,
|
|
69
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
70
|
-
});
|
|
71
|
-
break;
|
|
72
|
-
case "date":
|
|
73
|
-
if (typeof value !== "string" || !regex.date.test(value)) issues.push({
|
|
74
|
-
message: `Expected to match "yyyy-MM-dd" format: received ${String(value)}`,
|
|
75
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
76
|
-
});
|
|
77
|
-
break;
|
|
78
|
-
case "datetime":
|
|
79
|
-
if (typeof value !== "string" || !regex.datetime.test(value)) issues.push({
|
|
80
|
-
message: `Expected to match ISO format: received ${String(value)}`,
|
|
81
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
82
|
-
});
|
|
83
|
-
break;
|
|
84
|
-
case "time":
|
|
85
|
-
if (typeof value !== "string" || !regex.time.test(value)) issues.push({
|
|
86
|
-
message: `Expected to match "HH:mm" format: received ${String(value)}`,
|
|
87
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
88
|
-
});
|
|
89
|
-
break;
|
|
90
|
-
case "decimal":
|
|
91
|
-
if (typeof value !== "string" || !regex.decimal.test(value)) issues.push({
|
|
92
|
-
message: `Expected a decimal string: received ${String(value)}`,
|
|
93
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
94
|
-
});
|
|
95
|
-
break;
|
|
96
|
-
case "enum":
|
|
97
|
-
if (field._metadata.allowedValues) {
|
|
98
|
-
const allowedValues = field._metadata.allowedValues.map((v) => v.value);
|
|
99
|
-
if (typeof value !== "string" || !allowedValues.includes(value)) issues.push({
|
|
100
|
-
message: `Must be one of [${allowedValues.join(", ")}]: received ${String(value)}`,
|
|
101
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
break;
|
|
105
|
-
case "nested":
|
|
106
|
-
if (typeof value !== "object" || value === null || Array.isArray(value) || value instanceof Date) issues.push({
|
|
107
|
-
message: `Expected an object: received ${String(value)}`,
|
|
108
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
109
|
-
});
|
|
110
|
-
else if (Object.keys(field.fields).length > 0) for (const [fieldName, nestedField] of Object.entries(field.fields)) {
|
|
111
|
-
const fieldValue = value[fieldName];
|
|
112
|
-
const result = nestedField._parseInternal({
|
|
113
|
-
value: fieldValue,
|
|
114
|
-
data,
|
|
115
|
-
invoker,
|
|
116
|
-
pathArray: pathArray.concat(fieldName)
|
|
117
|
-
});
|
|
118
|
-
if (result.issues) issues.push(...result.issues);
|
|
119
|
-
}
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
const validateFns = field._metadata.validate;
|
|
123
|
-
if (validateFns && validateFns.length > 0) for (const validateInput of validateFns) {
|
|
124
|
-
const { fn, message } = typeof validateInput === "function" ? {
|
|
125
|
-
fn: validateInput,
|
|
126
|
-
message: "Validation failed"
|
|
127
|
-
} : {
|
|
128
|
-
fn: validateInput[0],
|
|
129
|
-
message: validateInput[1]
|
|
130
|
-
};
|
|
131
|
-
if (!fn({
|
|
132
|
-
value,
|
|
133
|
-
data,
|
|
134
|
-
invoker
|
|
135
|
-
})) issues.push({
|
|
136
|
-
message,
|
|
137
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
return issues;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Internal parse method that tracks field path for nested validation
|
|
144
|
-
* @param args - Parse arguments
|
|
145
|
-
* @returns Parse result with value or issues
|
|
146
|
-
*/
|
|
147
|
-
function parseInternal(args) {
|
|
148
|
-
const { value, data, invoker, pathArray } = args;
|
|
149
|
-
const issues = [];
|
|
150
|
-
const isNullOrUndefined = value === null || value === void 0;
|
|
151
|
-
if (field._metadata.required && isNullOrUndefined) {
|
|
152
|
-
issues.push({
|
|
153
|
-
message: "Required field is missing",
|
|
154
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
155
|
-
});
|
|
156
|
-
return { issues };
|
|
157
|
-
}
|
|
158
|
-
if (!field._metadata.required && isNullOrUndefined) return { value: value ?? null };
|
|
159
|
-
if (field._metadata.array) {
|
|
160
|
-
if (!Array.isArray(value)) {
|
|
161
|
-
issues.push({
|
|
162
|
-
message: "Expected an array",
|
|
163
|
-
path: pathArray.length > 0 ? pathArray : void 0
|
|
164
|
-
});
|
|
165
|
-
return { issues };
|
|
166
|
-
}
|
|
167
|
-
for (let i = 0; i < value.length; i++) {
|
|
168
|
-
const elementValue = value[i];
|
|
169
|
-
const elementIssues = validateValue({
|
|
170
|
-
value: elementValue,
|
|
171
|
-
data,
|
|
172
|
-
invoker,
|
|
173
|
-
pathArray: pathArray.concat(`[${i}]`)
|
|
174
|
-
});
|
|
175
|
-
if (elementIssues.length > 0) issues.push(...elementIssues);
|
|
176
|
-
}
|
|
177
|
-
if (issues.length > 0) return { issues };
|
|
178
|
-
return { value };
|
|
179
|
-
}
|
|
180
|
-
const valueIssues = validateValue({
|
|
181
|
-
value,
|
|
182
|
-
data,
|
|
183
|
-
invoker,
|
|
184
|
-
pathArray
|
|
20
|
+
function parseInternal$1(args) {
|
|
21
|
+
return parseInternal({
|
|
22
|
+
...args,
|
|
23
|
+
field
|
|
185
24
|
});
|
|
186
|
-
issues.push(...valueIssues);
|
|
187
|
-
if (issues.length > 0) return { issues };
|
|
188
|
-
return { value };
|
|
189
25
|
}
|
|
190
26
|
function cloneWith(metadataUpdates) {
|
|
191
27
|
const cloned = field.clone();
|
|
@@ -210,19 +46,21 @@ function createTailorDBField(type, options, fields, values) {
|
|
|
210
46
|
description(description) {
|
|
211
47
|
return cloneWith({ description });
|
|
212
48
|
},
|
|
213
|
-
typeName
|
|
49
|
+
typeName(typeName) {
|
|
50
|
+
return cloneWith({ typeName });
|
|
51
|
+
},
|
|
214
52
|
validate(...validateInputs) {
|
|
215
53
|
return cloneWith({ validate: validateInputs });
|
|
216
54
|
},
|
|
217
55
|
parse(args) {
|
|
218
|
-
return parseInternal({
|
|
56
|
+
return parseInternal$1({
|
|
219
57
|
value: args.value,
|
|
220
58
|
data: args.data,
|
|
221
59
|
invoker: args.invoker,
|
|
222
60
|
pathArray: []
|
|
223
61
|
});
|
|
224
62
|
},
|
|
225
|
-
_parseInternal: parseInternal,
|
|
63
|
+
_parseInternal: parseInternal$1,
|
|
226
64
|
relation(config) {
|
|
227
65
|
const cloned = field.clone();
|
|
228
66
|
const targetType = isRelationSelfConfig(config) ? "self" : config.toward.type.name;
|
|
@@ -262,16 +100,13 @@ function createTailorDBField(type, options, fields, values) {
|
|
|
262
100
|
for (const [key, field] of Object.entries(fields)) cloned[key] = field.clone();
|
|
263
101
|
clonedFields = cloned;
|
|
264
102
|
}
|
|
265
|
-
const clonedField =
|
|
103
|
+
const clonedField = createTailorDBFieldRuntime(type, options, clonedFields, values);
|
|
266
104
|
Object.assign(clonedField._metadata, cloneDeep(this._metadata));
|
|
267
105
|
if (cloneOptions) {
|
|
268
106
|
if (cloneOptions.optional !== void 0) clonedField._metadata.required = !cloneOptions.optional;
|
|
269
107
|
if (cloneOptions.array !== void 0) clonedField._metadata.array = cloneOptions.array;
|
|
270
108
|
}
|
|
271
|
-
if (_rawRelation)
|
|
272
|
-
const clonedRawRelation = cloneDeep(_rawRelation);
|
|
273
|
-
clonedField._setRawRelation(clonedRawRelation);
|
|
274
|
-
}
|
|
109
|
+
if (_rawRelation) clonedField._setRawRelation(cloneDeep(_rawRelation));
|
|
275
110
|
return clonedField;
|
|
276
111
|
},
|
|
277
112
|
_setRawRelation(relation) {
|
|
@@ -360,7 +195,7 @@ function date(options) {
|
|
|
360
195
|
}
|
|
361
196
|
/**
|
|
362
197
|
* Create a datetime field (date and time).
|
|
363
|
-
* Format: ISO 8601 "yyyy-MM-ddTHH:mm:ssZ"
|
|
198
|
+
* Format: ISO 8601, such as "yyyy-MM-ddTHH:mm:ssZ" or "yyyy-MM-ddTHH:mm:ss+09:00"
|
|
364
199
|
* @param options - Field configuration options
|
|
365
200
|
* @returns A datetime field
|
|
366
201
|
* @example db.datetime()
|
|
@@ -580,4 +415,4 @@ timestamps: () => ({
|
|
|
580
415
|
|
|
581
416
|
//#endregion
|
|
582
417
|
export { db as t };
|
|
583
|
-
//# sourceMappingURL=schema-
|
|
418
|
+
//# sourceMappingURL=schema-89dYxNC2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-89dYxNC2.mjs","names":["parseInternal","parseFieldInternal"],"sources":["../src/configure/services/tailordb/schema.ts"],"sourcesContent":["import { cloneDeep } from \"es-toolkit\";\nimport {\n type AllowedValues,\n type AllowedValuesOutput,\n mapAllowedValues,\n} from \"#/configure/types/field\";\nimport {\n parseInternal as parseFieldInternal,\n type FieldParseArgs,\n type FieldParseInternalArgs,\n} from \"#/configure/types/field-runtime\";\nimport { brandValue } from \"#/utils/brand\";\nimport type {\n TailorDBField as TailorDBFieldBase,\n TailorDBType as TailorDBTypeBase,\n DBFieldMetadata,\n DefinedDBFieldMetadata,\n SerialConfig,\n IndexDef,\n TailorDBTypeMetadata,\n RawRelationConfig,\n RelationType,\n} from \"#/configure/services/tailordb/types\";\nimport type {\n FieldOptions,\n FieldOutput,\n TailorFieldType,\n TailorToTs,\n FieldValidateInput,\n ValidateConfig,\n Validators,\n} from \"#/configure/types/field.types\";\nimport type { PluginAttachment, PluginConfigs } from \"#/plugin/types\";\nimport type { InferredAttributes } from \"#/runtime/types\";\nimport type { output, InferFieldsOutput, TypeLevelError } from \"#/types/helpers\";\nimport type { RawPermissions } from \"#/types/tailordb.generated\";\nimport type { TailorTypeGqlPermission, TailorTypePermission } from \"./permission\";\nimport type { Hook, Hooks, ExcludeNestedDBFields, TypeFeatures } from \"./types\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\n// Erased DB fields stay assignable across builder method-state changes.\n// oxlint-disable-next-line no-explicit-any\ntype AnyBuilderMethod = any;\n\nexport type TailorAnyDBField = Omit<\n TailorDBFieldBase<AnyBuilderMethod, AnyBuilderMethod>,\n \"fields\"\n> & {\n readonly fields: Record<string, AnyBuilderMethod>;\n _metadata: DBFieldMetadata;\n parse: AnyBuilderMethod;\n _parseInternal: AnyBuilderMethod;\n readonly typeName: TypeLevelError<string>;\n description: AnyBuilderMethod;\n relation: AnyBuilderMethod;\n index: AnyBuilderMethod;\n unique: AnyBuilderMethod;\n vector: AnyBuilderMethod;\n hooks: AnyBuilderMethod;\n validate: AnyBuilderMethod;\n serial: AnyBuilderMethod;\n clone: AnyBuilderMethod;\n};\n\n// Helper alias\n// oxlint-disable-next-line no-explicit-any\nexport type TailorAnyDBType = TailorDBType<any, any>;\n\ntype IsAny<T> = 0 extends 1 & T ? true : false;\ntype DBFieldTypeNameMethod<Defined extends DefinedDBFieldMetadata> =\n IsAny<Defined> extends true\n ? TypeLevelError<string>\n : TypeLevelError<\"typeName cannot be used on TailorDB fields\">;\n\ntype WithDBFieldDescription<Defined> = Defined & { description: true };\ntype WithDBFieldRelation<Defined, S extends RelationType | RelationSelfConfig> = S extends\n | \"oneToOne\"\n | \"1-1\"\n ? Defined & { unique: true; index: true; relation: true }\n : S extends { type: \"oneToOne\" | \"1-1\" }\n ? Defined & { unique: true; index: true; relation: true }\n : Defined & { index: true; relation: true };\ntype WithDBFieldIndex<Defined> = Defined & { index: true };\ntype WithDBFieldUnique<Defined> = Defined & { unique: true; index: true };\ntype WithDBFieldVector<Defined> = Defined & { vector: true };\ntype WithDBFieldHooks<Defined, H> = Defined & {\n hooks: {\n create: H extends { create: unknown } ? true : false;\n update: H extends { update: unknown } ? true : false;\n };\n serial: false;\n};\ntype WithDBFieldValidate<Defined> = Defined & { validate: true };\ntype WithDBFieldSerial<Defined> = Defined & {\n serial: true;\n hooks: { create: false; update: false };\n};\ntype WithDBFieldCloneOptions<Defined extends DefinedDBFieldMetadata, NewOpt extends FieldOptions> =\n IsAny<Defined> extends true\n ? Defined\n : Omit<Defined, \"array\"> & {\n array: NewOpt extends { array: true }\n ? true\n : NewOpt extends { array: false }\n ? false\n : Defined[\"array\"];\n };\ntype NonNullableDBFieldOutput<Output> = Exclude<Output, null>;\ntype DBFieldScalarOutput<Output> =\n NonNullableDBFieldOutput<Output> extends (infer Item)[] ? Item : NonNullableDBFieldOutput<Output>;\ntype DBFieldCloneArrayOutput<Output, NewOpt extends FieldOptions> = NewOpt extends {\n array: true;\n}\n ? DBFieldScalarOutput<Output>[]\n : NewOpt extends { array: false }\n ? DBFieldScalarOutput<Output>\n : NonNullableDBFieldOutput<Output>;\ntype DBFieldCloneOutput<Output, NewOpt extends FieldOptions> = NewOpt extends { optional: true }\n ? DBFieldCloneArrayOutput<Output, NewOpt> | null\n : NewOpt extends { optional: false }\n ? DBFieldCloneArrayOutput<Output, NewOpt>\n : null extends Output\n ? DBFieldCloneArrayOutput<Output, NewOpt> | null\n : DBFieldCloneArrayOutput<Output, NewOpt>;\ntype FileKeyConflictError<\n Fields extends Record<string, TailorAnyDBField>,\n User extends object,\n> = Partial<\n Record<\n keyof output<TailorDBType<Fields, User>> & string,\n TypeLevelError<\"file keys cannot use existing field names\">\n >\n>;\ntype DBFieldDescriptionFn<Defined extends DefinedDBFieldMetadata, Output> = (\n description: string,\n) => TailorDBField<WithDBFieldDescription<Defined>, Output>;\ntype DBFieldRelationFn<Defined extends DefinedDBFieldMetadata, Output> = {\n <S extends RelationType, T extends TailorAnyDBType>(\n config: RelationConfig<S, T>,\n ): TailorDBField<WithDBFieldRelation<Defined, S>, Output>;\n <S extends RelationSelfConfig>(config: S): TailorDBField<WithDBFieldRelation<Defined, S>, Output>;\n};\ntype DBFieldIndexFn<Defined extends DefinedDBFieldMetadata, Output> = () => TailorDBField<\n WithDBFieldIndex<Defined>,\n Output\n>;\ntype DBFieldUniqueFn<Defined extends DefinedDBFieldMetadata, Output> = () => TailorDBField<\n WithDBFieldUnique<Defined>,\n Output\n>;\ntype DBFieldVectorFn<Defined extends DefinedDBFieldMetadata, Output> = () => TailorDBField<\n WithDBFieldVector<Defined>,\n Output\n>;\ntype DBFieldHooksFn<Defined extends DefinedDBFieldMetadata, Output> = <\n const H extends Hook<unknown, Output>,\n>(\n hooks: H,\n) => TailorDBField<WithDBFieldHooks<Defined, H>, Output>;\ntype DBFieldValidateFn<Defined extends DefinedDBFieldMetadata, Output> = (\n ...validate: FieldValidateInput<Output>[]\n) => TailorDBField<WithDBFieldValidate<Defined>, Output>;\ntype DBFieldSerialFn<Defined extends DefinedDBFieldMetadata, Output> = (\n config: SerialConfig<Defined[\"type\"] & (\"integer\" | \"string\")>,\n) => TailorDBField<WithDBFieldSerial<Defined>, Output>;\ntype DBFieldDescriptionMethod<Defined extends DefinedDBFieldMetadata, Output> =\n IsAny<Defined> extends true\n ? DBFieldDescriptionFn<Defined, Output>\n : Defined extends { description: unknown }\n ? TypeLevelError<\".description() has already been set\">\n : DBFieldDescriptionFn<Defined, Output>;\ntype DBFieldRelationMethod<Defined extends DefinedDBFieldMetadata, Output> =\n IsAny<Defined> extends true\n ? DBFieldRelationFn<Defined, Output>\n : Defined extends { relation: unknown }\n ? TypeLevelError<\".relation() has already been set\">\n : DBFieldRelationFn<Defined, Output>;\ntype DBFieldIndexMethod<Defined extends DefinedDBFieldMetadata, Output> =\n IsAny<Defined> extends true\n ? DBFieldIndexFn<Defined, Output>\n : Defined extends { index: unknown }\n ? TypeLevelError<\".index() has already been set\">\n : boolean extends Defined[\"array\"]\n ? DBFieldIndexFn<Defined, Output> | TypeLevelError<\"index cannot be set on array fields\">\n : Defined extends { array: true }\n ? TypeLevelError<\"index cannot be set on array fields\">\n : DBFieldIndexFn<Defined, Output>;\ntype DBFieldUniqueMethod<Defined extends DefinedDBFieldMetadata, Output> =\n IsAny<Defined> extends true\n ? DBFieldUniqueFn<Defined, Output>\n : Defined extends { unique: unknown }\n ? TypeLevelError<\".unique() has already been set\">\n : boolean extends Defined[\"array\"]\n ? DBFieldUniqueFn<Defined, Output> | TypeLevelError<\"unique cannot be set on array fields\">\n : Defined extends { array: true }\n ? TypeLevelError<\"unique cannot be set on array fields\">\n : DBFieldUniqueFn<Defined, Output>;\ntype DBFieldVectorMethod<Defined extends DefinedDBFieldMetadata, Output> =\n IsAny<Defined> extends true\n ? DBFieldVectorFn<Defined, Output>\n : Defined extends { vector: unknown }\n ? TypeLevelError<\".vector() has already been set\">\n : Defined extends { type: \"string\"; array: false }\n ? DBFieldVectorFn<Defined, Output>\n : TypeLevelError<\"vector can only be set on non-array string fields\">;\ntype DBFieldHooksMethod<Defined extends DefinedDBFieldMetadata, Output> =\n IsAny<Defined> extends true\n ? DBFieldHooksFn<Defined, Output>\n : Defined extends {\n serial: true;\n hooks: { create: false; update: false };\n }\n ? TypeLevelError<\"hooks cannot be set after serial\">\n : Defined extends {\n hooks: unknown;\n }\n ? TypeLevelError<\".hooks() has already been set\">\n : Defined extends { type: \"nested\" }\n ? TypeLevelError<\"hooks cannot be set on nested type fields\">\n : DBFieldHooksFn<Defined, Output>;\ntype DBFieldValidateMethod<Defined extends DefinedDBFieldMetadata, Output> =\n IsAny<Defined> extends true\n ? DBFieldValidateFn<Defined, Output>\n : Defined extends { validate: unknown }\n ? TypeLevelError<\".validate() has already been set\">\n : DBFieldValidateFn<Defined, Output>;\ntype DBFieldSerialMethod<Defined extends DefinedDBFieldMetadata, Output> =\n IsAny<Defined> extends true\n ? DBFieldSerialFn<Defined, Output>\n : Defined extends { serial: true }\n ? TypeLevelError<\".serial() has already been set\">\n : Defined extends { serial: false }\n ? TypeLevelError<\"serial cannot be set after hooks\">\n : IsAny<Output> extends true\n ? Defined extends { type: \"integer\" | \"string\"; array: false }\n ? DBFieldSerialFn<Defined, Output>\n : TypeLevelError<\"serial can only be set on non-array integer or string fields\">\n : null extends Output\n ? TypeLevelError<\"serial can only be set on non-array integer or string fields\">\n : Defined extends { type: \"integer\" | \"string\"; array: false }\n ? DBFieldSerialFn<Defined, Output>\n : TypeLevelError<\"serial can only be set on non-array integer or string fields\">;\n\n/**\n * Full TailorDBField interface with builder methods.\n * Extends the minimal structural interface from types/ with fluent API methods.\n */\nexport interface TailorDBField<\n Defined extends DefinedDBFieldMetadata = DefinedDBFieldMetadata,\n // oxlint-disable-next-line no-explicit-any\n Output = any,\n> extends Omit<TailorDBFieldBase<Defined, Output>, \"fields\"> {\n readonly fields: Record<string, TailorAnyDBField>;\n _metadata: DBFieldMetadata;\n\n /**\n * Parse and validate a value against this field's validation rules\n */\n parse(args: FieldParseArgs): StandardSchemaV1.Result<Output>;\n\n /**\n * Internal parse method that tracks field path for nested validation\n * @private\n */\n _parseInternal(args: FieldParseInternalArgs): StandardSchemaV1.Result<Output>;\n\n /**\n * typeName is not available on TailorDB fields.\n * Use typeName on pipeline fields (t.enum / t.object) instead.\n */\n typeName: DBFieldTypeNameMethod<Defined>;\n\n /**\n * Set a description for the field\n */\n description: DBFieldDescriptionMethod<Defined, Output>;\n\n /**\n * Define a relation to another type.\n */\n relation: DBFieldRelationMethod<Defined, Output>;\n\n /**\n * Add an index to the field\n */\n index: DBFieldIndexMethod<Defined, Output>;\n\n /**\n * Make the field unique (also adds an index)\n */\n unique: DBFieldUniqueMethod<Defined, Output>;\n\n /**\n * Enable vector search on the field (string type only)\n */\n vector: DBFieldVectorMethod<Defined, Output>;\n\n /**\n * Add hooks for create/update operations on this field.\n */\n hooks: DBFieldHooksMethod<Defined, Output>;\n\n /**\n * Add validation functions to the field.\n */\n validate: DBFieldValidateMethod<Defined, Output>;\n\n /**\n * Configure serial/auto-increment behavior\n */\n serial: DBFieldSerialMethod<Defined, Output>;\n\n /**\n * Clone the field with optional overrides for field options\n */\n clone<const NewOpt extends FieldOptions>(\n options?: NewOpt,\n ): TailorDBField<WithDBFieldCloneOptions<Defined, NewOpt>, DBFieldCloneOutput<Output, NewOpt>>;\n}\n\n/**\n * Full TailorDBType interface with builder methods.\n * Extends the minimal structural interface from types/ with fluent API methods.\n */\nexport interface TailorDBType<\n // oxlint-disable-next-line no-explicit-any\n Fields extends Record<string, TailorAnyDBField> = any,\n User extends object = InferredAttributes,\n> extends TailorDBTypeBase<Fields, User> {\n _description?: string;\n\n hooks(hooks: Hooks<Fields>): TailorDBType<Fields, User>;\n validate(validators: Validators<Fields>): TailorDBType<Fields, User>;\n features(features: Omit<TypeFeatures, \"pluralForm\">): TailorDBType<Fields, User>;\n indexes(...indexes: IndexDef<TailorDBType<Fields, User>>[]): TailorDBType<Fields, User>;\n files<const F extends string>(\n files: Record<F, string> & FileKeyConflictError<Fields, User>,\n ): TailorDBType<Fields, User>;\n permission<\n U extends object = User,\n P extends TailorTypePermission<U, output<TailorDBType<Fields, User>>> = TailorTypePermission<\n U,\n output<TailorDBType<Fields, User>>\n >,\n >(\n permission: P,\n ): TailorDBType<Fields, U>;\n gqlPermission<\n U extends object = User,\n P extends TailorTypeGqlPermission<U> = TailorTypeGqlPermission<U>,\n >(\n permission: P,\n ): TailorDBType<Fields, U>;\n description(description: string): TailorDBType<Fields, User>;\n pickFields<K extends keyof Fields>(keys: K[]): Pick<Fields, K>;\n pickFields<K extends keyof Fields, const Opt extends FieldOptions>(\n keys: K[],\n options: Opt,\n ): {\n [P in K]: Fields[P] extends TailorDBField<infer D, infer O>\n ? TailorDBField<WithDBFieldCloneOptions<D, Opt>, DBFieldCloneOutput<O, Opt>>\n : never;\n };\n omitFields<K extends keyof Fields>(keys: K[]): Omit<Fields, K>;\n plugin<P extends keyof PluginConfigs<keyof Fields & string>>(config: {\n [K in P]: PluginConfigs<keyof Fields & string>[K];\n }): TailorDBType<Fields, User>;\n}\n\nexport type TailorDBInstance<\n // oxlint-disable-next-line no-explicit-any\n Fields extends Record<string, TailorAnyDBField> = any,\n User extends object = InferredAttributes,\n> = TailorDBType<Fields, User>;\n\ninterface RelationConfig<S extends RelationType, T extends TailorDBType> {\n type: S;\n toward: {\n type: T;\n as?: string;\n key?: keyof T[\"fields\"] & string;\n };\n backward?: string;\n}\n\n// Special config variant for self-referencing relations\ntype RelationSelfConfig = {\n type: RelationType;\n toward: {\n type: \"self\";\n as?: string;\n key?: string;\n };\n backward?: string;\n};\n\nfunction isRelationSelfConfig(\n config: RelationConfig<RelationType, TailorDBType> | RelationSelfConfig,\n): config is RelationSelfConfig {\n return config.toward.type === \"self\";\n}\n\ntype DBFieldDefined<T extends TailorFieldType, Opt extends FieldOptions> = {\n type: T;\n array: Opt extends { array: true } ? true : false;\n};\ntype DBFieldOutput<\n T extends TailorFieldType,\n Opt extends FieldOptions,\n OutputBase = TailorToTs[T],\n> = FieldOutput<OutputBase, Opt>;\ntype TailorDBFieldInstance<\n T extends TailorFieldType,\n Opt extends FieldOptions,\n OutputBase = TailorToTs[T],\n> = TailorDBField<DBFieldDefined<T, Opt>, DBFieldOutput<T, Opt, OutputBase>>;\ntype TailorDBFieldRuntimeInstance<\n T extends TailorFieldType,\n Opt extends FieldOptions,\n OutputBase = TailorToTs[T],\n> = TailorDBFieldRuntime<DBFieldDefined<T, Opt>, DBFieldOutput<T, Opt, OutputBase>>;\ntype TailorDBFieldRuntime<Defined extends DefinedDBFieldMetadata, Output> = Omit<\n TailorDBFieldBase<Defined, Output>,\n \"fields\"\n> & {\n readonly fields: Record<string, TailorAnyDBField>;\n _metadata: DBFieldMetadata;\n description(description: string): object;\n typeName(typeName: string): object;\n validate(...validate: FieldValidateInput<Output>[]): object;\n relation(config: RelationConfig<RelationType, TailorDBType> | RelationSelfConfig): object;\n index(): object;\n unique(): object;\n vector(): object;\n hooks(hooks: Hook<unknown, Output>): object;\n serial(config: SerialConfig): object;\n clone(options?: FieldOptions): TailorDBFieldRuntime<DefinedDBFieldMetadata, AnyBuilderMethod>;\n parse(args: FieldParseArgs): StandardSchemaV1.Result<Output>;\n _parseInternal(args: FieldParseInternalArgs): StandardSchemaV1.Result<Output>;\n _setRawRelation(relation: RawRelationConfig): void;\n};\n\n/**\n * Creates a new TailorDBField instance.\n * @param type - Field type\n * @param options - Field options\n * @param fields - Nested fields for object-like types\n * @param values - Allowed values for enum-like fields\n * @returns A new TailorDBField\n */\nfunction createTailorDBField<\n const T extends TailorFieldType,\n const TOptions extends FieldOptions,\n const OutputBase = TailorToTs[T],\n>(\n type: T,\n options?: TOptions,\n fields?: Record<string, TailorAnyDBField>,\n values?: AllowedValues,\n): TailorDBFieldInstance<T, TOptions, OutputBase>;\nfunction createTailorDBField<const T extends TailorFieldType, const TOptions extends FieldOptions>(\n type: T,\n options?: TOptions,\n fields?: Record<string, TailorAnyDBField>,\n values?: AllowedValues,\n): object {\n return createTailorDBFieldRuntime(type, options, fields, values);\n}\n\nfunction createTailorDBFieldRuntime<\n const T extends TailorFieldType,\n const TOptions extends FieldOptions,\n const OutputBase = TailorToTs[T],\n>(\n type: T,\n options?: TOptions,\n fields?: Record<string, TailorAnyDBField>,\n values?: AllowedValues,\n): TailorDBFieldRuntimeInstance<T, TOptions, OutputBase> {\n type FieldValue = DBFieldOutput<T, TOptions, OutputBase>;\n type FieldType = TailorDBFieldRuntimeInstance<T, TOptions, OutputBase>;\n\n const _metadata: DBFieldMetadata = { required: true };\n let _rawRelation: RawRelationConfig | undefined;\n\n if (options) {\n if (options.optional === true) {\n _metadata.required = false;\n }\n if (options.array === true) {\n _metadata.array = true;\n }\n }\n if (values) {\n _metadata.allowedValues = mapAllowedValues(values);\n }\n\n function parseInternal(args: FieldParseInternalArgs): StandardSchemaV1.Result<FieldValue> {\n return parseFieldInternal<T, FieldValue>({\n ...args,\n field,\n });\n }\n\n function cloneWith(metadataUpdates: Partial<DBFieldMetadata>) {\n const cloned = field.clone();\n Object.assign(cloned._metadata, metadataUpdates);\n return cloned;\n }\n\n const field: FieldType = {\n type,\n fields: fields ?? {},\n _defined: undefined as unknown as DBFieldDefined<T, TOptions>,\n _output: undefined as FieldValue,\n _metadata,\n\n get metadata() {\n return { ...this._metadata };\n },\n\n get rawRelation(): Readonly<RawRelationConfig> | undefined {\n return _rawRelation ? { ..._rawRelation, toward: { ..._rawRelation.toward } } : undefined;\n },\n\n description(description: string) {\n return cloneWith({ description });\n },\n\n typeName(typeName: string) {\n return cloneWith({ typeName });\n },\n\n validate(...validateInputs: FieldValidateInput<FieldValue>[]) {\n return cloneWith({ validate: validateInputs });\n },\n\n parse(args: FieldParseArgs): StandardSchemaV1.Result<FieldValue> {\n return parseInternal({\n value: args.value,\n data: args.data,\n invoker: args.invoker,\n pathArray: [],\n });\n },\n\n _parseInternal: parseInternal,\n\n // TailorDBField specific methods\n relation(config: RelationConfig<RelationType, TailorDBType> | RelationSelfConfig) {\n const cloned = field.clone();\n const targetType = isRelationSelfConfig(config) ? \"self\" : config.toward.type.name;\n cloned._setRawRelation({\n type: config.type,\n toward: {\n type: targetType,\n as: config.toward.as,\n key: config.toward.key,\n },\n backward: config.backward,\n });\n return cloned;\n },\n\n index() {\n return cloneWith({ index: true });\n },\n\n unique() {\n return cloneWith({ unique: true, index: true });\n },\n\n vector() {\n return cloneWith({ vector: true });\n },\n\n hooks(hooks: Hook<unknown, FieldValue>) {\n return cloneWith({ hooks });\n },\n\n serial(config: SerialConfig) {\n return cloneWith({ serial: config });\n },\n\n clone(cloneOptions?: FieldOptions) {\n // Deep clone nested object fields if present\n let clonedFields = fields;\n if (fields) {\n const cloned: Record<string, TailorAnyDBField> = {};\n for (const [key, field] of Object.entries(fields)) {\n cloned[key] = field.clone();\n }\n clonedFields = cloned;\n }\n\n // Create a new field with cloned configuration\n const clonedField = createTailorDBFieldRuntime(type, options, clonedFields, values);\n\n // Deep copy metadata using cloneDeep (preserves function references)\n Object.assign(clonedField._metadata, cloneDeep(this._metadata));\n\n // Apply new options if provided\n if (cloneOptions) {\n if (cloneOptions.optional !== undefined) {\n clonedField._metadata.required = !cloneOptions.optional;\n }\n if (cloneOptions.array !== undefined) {\n clonedField._metadata.array = cloneOptions.array;\n }\n }\n\n // Copy raw relation if exists\n if (_rawRelation) {\n clonedField._setRawRelation(cloneDeep(_rawRelation));\n }\n\n return clonedField;\n },\n\n _setRawRelation(relation: RawRelationConfig) {\n _rawRelation = relation;\n },\n };\n\n return field;\n}\n\nconst createField = createTailorDBField;\n\n/**\n * Create a UUID field.\n * @param options - Field configuration options\n * @returns A UUID field\n * @example db.uuid()\n * @example db.uuid({ optional: true })\n */\nfunction uuid<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"uuid\", options);\n}\n\n/**\n * Create a string field.\n * @param options - Field configuration options\n * @returns A string field\n * @example db.string()\n * @example db.string({ optional: true })\n */\nfunction string<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"string\", options);\n}\n\n/**\n * Create a boolean field.\n * Note: The method name is `bool` but creates a `boolean` type field.\n * @param options - Field configuration options\n * @returns A boolean field\n * @example db.bool()\n * @example db.bool({ optional: true })\n */\nfunction bool<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"boolean\", options);\n}\n\n/**\n * Create an integer field.\n * @param options - Field configuration options\n * @returns An integer field\n * @example db.int()\n * @example db.int({ optional: true })\n */\nfunction int<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"integer\", options);\n}\n\n/**\n * Create a float (decimal number) field.\n * @param options - Field configuration options\n * @returns A float field\n * @example db.float()\n * @example db.float({ optional: true })\n */\nfunction float<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"float\", options);\n}\n\ninterface DecimalFieldOptions extends FieldOptions {\n scale?: number;\n}\n\n/**\n * Create a decimal field (stored as string for precision).\n * @param options - Field configuration options including optional scale (0-12)\n * @returns A decimal field\n * @example db.decimal()\n * @example db.decimal({ scale: 2 })\n * @example db.decimal({ scale: 2, optional: true })\n */\nfunction decimal<const Opt extends DecimalFieldOptions>(options?: Opt) {\n if (options?.scale !== undefined) {\n if (!Number.isInteger(options.scale) || options.scale < 0 || options.scale > 12) {\n throw new Error(\"scale must be an integer between 0 and 12\");\n }\n }\n const field = createField(\"decimal\", options);\n if (options?.scale !== undefined) {\n field._metadata.scale = options.scale;\n }\n return field;\n}\n\n/**\n * Create a date field (date only, no time component).\n * Format: \"yyyy-MM-dd\"\n * @param options - Field configuration options\n * @returns A date field\n * @example db.date()\n */\nfunction date<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"date\", options);\n}\n\n/**\n * Create a datetime field (date and time).\n * Format: ISO 8601, such as \"yyyy-MM-ddTHH:mm:ssZ\" or \"yyyy-MM-ddTHH:mm:ss+09:00\"\n * @param options - Field configuration options\n * @returns A datetime field\n * @example db.datetime()\n */\nfunction datetime<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"datetime\", options);\n}\n\n/**\n * Create a time field (time only, no date component).\n * Format: \"HH:mm\"\n * @param options - Field configuration options\n * @returns A time field\n * @example db.time()\n */\nfunction time<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"time\", options);\n}\n\n/**\n * Create an enum field with a fixed set of allowed string values.\n * @param values - Array of allowed string values, or array of `{ value, description }` objects\n * @param options - Field configuration options\n * @returns An enum field\n * @example db.enum([\"active\", \"inactive\", \"suspended\"])\n * @example db.enum([\"small\", \"medium\", \"large\"], { optional: true })\n */\nfunction _enum<const V extends AllowedValues, const Opt extends FieldOptions>(\n values: V,\n options?: Opt,\n): TailorDBField<\n { type: \"enum\"; array: Opt extends { array: true } ? true : false },\n FieldOutput<AllowedValuesOutput<V>, Opt>\n> {\n return createField<\"enum\", Opt, AllowedValuesOutput<V>>(\"enum\", options, undefined, values);\n}\n\n/**\n * Create a nested object field with sub-fields.\n * @param fields - Record of nested field definitions\n * @param options - Field configuration options\n * @returns A nested object field\n * @example db.object({ street: db.string(), city: db.string(), zip: db.string() })\n * @example db.object({ name: db.string() }, { optional: true })\n */\nfunction object<\n const F extends Record<string, TailorAnyDBField> & ExcludeNestedDBFields<F>,\n const Opt extends FieldOptions,\n>(fields: F, options?: Opt) {\n return createField(\"nested\", options, fields) as unknown as TailorDBField<\n { type: \"nested\"; array: Opt extends { array: true } ? true : false },\n FieldOutput<InferFieldsOutput<F>, Opt>\n >;\n}\n\n/**\n * Creates a new TailorDBType instance.\n * @param name - Type name\n * @param fields - Field definitions\n * @param options - Type options\n * @param options.pluralForm - Optional plural form\n * @param options.description - Optional description\n * @returns A new TailorDBType\n */\nfunction createTailorDBType<\n // oxlint-disable-next-line no-explicit-any\n const Fields extends Record<string, TailorAnyDBField> = any,\n User extends object = InferredAttributes,\n>(\n name: string,\n fields: Fields,\n options: { pluralForm?: string; description?: string },\n): TailorDBType<Fields, User> {\n let _description = options.description;\n let _settings: TypeFeatures = {};\n let _indexes: IndexDef<TailorDBType<Fields, User>>[] = [];\n const _permissions: RawPermissions = {};\n let _files: Record<string, string> = {};\n const _plugins: PluginAttachment[] = [];\n\n if (options.pluralForm) {\n if (name === options.pluralForm) {\n throw new Error(`The name and the plural form must be different. name=${name}`);\n }\n _settings.pluralForm = options.pluralForm;\n }\n\n const dbType: TailorDBType<Fields, User> = {\n name,\n fields: { ...fields },\n _output: null as unknown as InferFieldsOutput<Fields>,\n _description,\n\n get metadata(): TailorDBTypeMetadata {\n // Convert indexes to the format expected by the manifest\n const indexes: Record<string, { fields: string[]; unique?: boolean }> = {};\n if (_indexes.length > 0) {\n _indexes.forEach((index) => {\n const fieldNames = index.fields.map((field) => String(field));\n const key = index.name || `idx_${fieldNames.join(\"_\")}`;\n indexes[key] = {\n fields: fieldNames,\n unique: index.unique,\n };\n });\n }\n\n return {\n name: this.name,\n description: _description,\n settings: _settings,\n permissions: _permissions,\n files: _files,\n ...(Object.keys(indexes).length > 0 && { indexes }),\n };\n },\n\n hooks(hooks: Hooks<Fields>) {\n // `Hooks<Fields>` is strongly typed, but `Object.entries()` loses that information.\n // oxlint-disable-next-line no-explicit-any\n Object.entries(hooks).forEach(([fieldName, fieldHooks]: [string, any]) => {\n const field = this.fields[fieldName];\n if (field === undefined) throw new Error(`field not found: ${fieldName}`);\n (this.fields as Record<string, TailorAnyDBField>)[fieldName] = (\n field as TailorAnyDBField\n ).hooks(fieldHooks);\n });\n return this;\n },\n\n validate(validators: Validators<Fields>) {\n Object.entries(validators).forEach(([fieldName, fieldValidators]) => {\n const field = this.fields[fieldName] as TailorAnyDBField;\n\n const validators = fieldValidators as\n | FieldValidateInput<unknown>\n | FieldValidateInput<unknown>[];\n\n const isValidateConfig = (v: unknown): v is ValidateConfig<unknown> => {\n return Array.isArray(v) && v.length === 2 && typeof v[1] === \"string\";\n };\n\n let updatedField: TailorAnyDBField;\n if (Array.isArray(validators)) {\n if (isValidateConfig(validators)) {\n updatedField = field.validate(validators);\n } else {\n updatedField = field.validate(...validators);\n }\n } else {\n updatedField = field.validate(validators);\n }\n (this.fields as Record<string, TailorAnyDBField>)[fieldName] = updatedField;\n });\n return this;\n },\n\n features(features: Omit<TypeFeatures, \"pluralForm\">) {\n _settings = {\n ..._settings,\n ...features,\n };\n return this;\n },\n\n indexes(...indexes: IndexDef<TailorDBType<Fields, User>>[]) {\n _indexes = indexes;\n return this;\n },\n\n files<const F extends string>(files: Record<F, string> & FileKeyConflictError<Fields, User>) {\n _files = files;\n return this;\n },\n\n permission<\n U extends object = User,\n P extends TailorTypePermission<U, output<TailorDBType<Fields, User>>> = TailorTypePermission<\n U,\n output<TailorDBType<Fields, User>>\n >,\n >(permission: P) {\n const ret = this as TailorDBType<Fields, U>;\n _permissions.record = permission as RawPermissions[\"record\"];\n return ret;\n },\n\n gqlPermission<\n U extends object = User,\n P extends TailorTypeGqlPermission<U> = TailorTypeGqlPermission<U>,\n >(permission: P) {\n const ret = this as TailorDBType<Fields, U>;\n _permissions.gql = permission as RawPermissions[\"gql\"];\n return ret;\n },\n\n description(description: string) {\n _description = description;\n this._description = description;\n return this;\n },\n\n pickFields<K extends keyof Fields, const Opt extends FieldOptions>(keys: K[], options?: Opt) {\n const result = {} as Record<K, TailorAnyDBField>;\n for (const key of keys) {\n const field = this.fields[key] as TailorAnyDBField;\n if (options) {\n result[key] = field.clone(options);\n } else {\n result[key] = field;\n }\n }\n // oxlint-disable-next-line no-explicit-any\n return result as any;\n },\n\n omitFields<K extends keyof Fields>(keys: K[]): Omit<Fields, K> {\n const keysSet = new Set(keys);\n const result = {} as Record<string, TailorAnyDBField>;\n for (const key in this.fields) {\n if (Object.hasOwn(this.fields, key) && !keysSet.has(key as unknown as K)) {\n result[key] = this.fields[key] as TailorAnyDBField;\n }\n }\n return result as Omit<Fields, K>;\n },\n\n get plugins(): PluginAttachment[] {\n return _plugins;\n },\n\n plugin<P extends keyof PluginConfigs<keyof Fields & string>>(config: {\n [K in P]: PluginConfigs<keyof Fields & string>[K];\n }): TailorDBType<Fields, User> {\n for (const [pluginId, pluginConfig] of Object.entries(config)) {\n _plugins.push({ pluginId, config: pluginConfig });\n }\n return this;\n },\n };\n\n return brandValue(dbType, \"tailordb-type\");\n}\n\nconst idField = uuid();\ntype idField = typeof idField;\ntype DBType<F extends { id?: never } & Record<string, TailorAnyDBField>> = TailorDBInstance<\n { id: idField } & F\n>;\n\n/**\n * Creates a new database type with the specified fields.\n * An `id` field (UUID) is automatically added to every type.\n * @param name - The name of the type, or a tuple of [name, pluralForm]\n * @param fields - The field definitions for the type\n * @returns A new TailorDBType instance\n * @example\n * export const user = db.type(\"User\", {\n * name: db.string(),\n * email: db.string(),\n * age: db.int({ optional: true }),\n * role: db.enum([\"admin\", \"member\"]),\n * ...db.fields.timestamps(),\n * });\n * // Always export both the value and type:\n * export type user = typeof user;\n */\nfunction dbType<const F extends { id?: never } & Record<string, TailorAnyDBField>>(\n name: string | [string, string],\n fields: F,\n): DBType<F>;\n/**\n * Creates a new database type with the specified fields and description.\n * An `id` field (UUID) is automatically added to every type.\n * @param name - The name of the type, or a tuple of [name, pluralForm]\n * @param description - A description of the type\n * @param fields - The field definitions for the type\n * @returns A new TailorDBType instance\n */\nfunction dbType<const F extends { id?: never } & Record<string, TailorAnyDBField>>(\n name: string | [string, string],\n description: string,\n fields: F,\n): DBType<F>;\nfunction dbType<const F extends { id?: never } & Record<string, TailorAnyDBField>>(\n name: string | [string, string],\n fieldsOrDescription: string | F,\n fields?: F,\n): DBType<F> {\n const typeName = Array.isArray(name) ? name[0] : name;\n const pluralForm = Array.isArray(name) ? name[1] : undefined;\n\n let description: string | undefined;\n let fieldDef: F;\n if (typeof fieldsOrDescription === \"string\") {\n description = fieldsOrDescription;\n fieldDef = fields as F;\n } else {\n fieldDef = fieldsOrDescription;\n }\n return createTailorDBType<{ id: idField } & F>(\n typeName,\n {\n id: idField,\n ...fieldDef,\n },\n { pluralForm, description },\n ) as DBType<F>;\n}\n\n/** TailorDB schema builder utilities for defining types and fields. */\nexport const db = {\n type: dbType,\n uuid,\n string,\n bool,\n int,\n float,\n decimal,\n date,\n datetime,\n time,\n enum: _enum,\n object,\n fields: {\n /**\n * Creates standard timestamp fields (createdAt, updatedAt) with auto-hooks.\n * createdAt and updatedAt are set on create.\n * User-specified timestamp values are respected when provided (e.g. seeding\n * historical records); the current time is used only when the value is omitted.\n * @returns An object with createdAt and updatedAt fields\n * @example\n * const model = db.type(\"Model\", {\n * name: db.string(),\n * ...db.fields.timestamps(),\n * });\n */\n timestamps: () => ({\n createdAt: datetime()\n .hooks({ create: ({ value }) => value ?? new Date() })\n .description(\"Record creation timestamp\"),\n updatedAt: datetime()\n .hooks({\n create: ({ value }) => value ?? new Date(),\n update: () => new Date(),\n })\n .description(\"Record update timestamp\"),\n }),\n },\n};\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as readPackageJson } from "./package-json-8b0O9TlX.mjs";
|
|
2
|
-
import * as fs from "node:fs";
|
|
3
2
|
import * as path from "pathe";
|
|
3
|
+
import * as fs from "node:fs";
|
|
4
4
|
|
|
5
5
|
//#region src/cli/shared/user-agent.ts
|
|
6
6
|
/**
|
|
@@ -11,7 +11,7 @@ import * as path from "pathe";
|
|
|
11
11
|
* @returns User-Agent header value
|
|
12
12
|
*/
|
|
13
13
|
function userAgentFromVersion(version) {
|
|
14
|
-
return `tailor
|
|
14
|
+
return `tailor/${version}`;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
17
|
* Build the User-Agent string for CLI requests.
|
|
@@ -86,4 +86,4 @@ function tightenSecretFilePermissions(filePath) {
|
|
|
86
86
|
|
|
87
87
|
//#endregion
|
|
88
88
|
export { userAgentFromVersion as a, userAgent as i, tightenSecretFilePermissions as n, writeSecretFile as r, ensureSecretDir as t };
|
|
89
|
-
//# sourceMappingURL=secret-file-
|
|
89
|
+
//# sourceMappingURL=secret-file-aoNXJmKa.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-file-aoNXJmKa.mjs","names":[],"sources":["../src/cli/shared/user-agent.ts","../src/cli/shared/secret-file.ts"],"sourcesContent":["import { readPackageJson } from \"./package-json\";\n\n/**\n * Build the User-Agent string from an already-known SDK version, without\n * touching the filesystem. Use this when the caller has resolved the version\n * (e.g. crash reporting already reads `package.json`) to avoid a redundant read.\n * @param version - SDK version string\n * @returns User-Agent header value\n */\nexport function userAgentFromVersion(version: string): string {\n return `tailor/${version}`;\n}\n\n/**\n * Build the User-Agent string for CLI requests.\n *\n * Lives in its own module (rather than `client.ts`) so callers that only need\n * the UA — e.g. crash reporting — do not pull in the operator client's heavy\n * OAuth2/Connect/Protobuf dependencies, and so importing it never forms a cycle.\n * @returns User-Agent header value\n */\nexport async function userAgent() {\n const packageJson = await readPackageJson();\n return userAgentFromVersion(packageJson.version ?? \"unknown\");\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\n\nconst DIR_MODE = 0o700;\nconst FILE_MODE = 0o600;\n\n/**\n * Best-effort chmod that only fires when the current mode differs from the\n * target. No-op on Windows (where POSIX mode bits are advisory and ACLs\n * govern access) and on missing paths / permission errors.\n * @param target - Path to chmod\n * @param mode - Desired POSIX mode bits\n */\nfunction chmodIfDifferent(target: string, mode: number): void {\n if (process.platform === \"win32\") return;\n try {\n if ((fs.statSync(target).mode & 0o777) !== mode) {\n fs.chmodSync(target, mode);\n }\n } catch {\n // Missing path or permission error — best-effort.\n }\n}\n\n/**\n * Write a file that may contain secrets with restrictive permissions.\n * Creates the parent directory with 0o700 and the file with 0o600 on POSIX\n * systems so other users on the host cannot read access tokens, refresh\n * tokens, or crash report payloads. On Windows the POSIX mode bits are\n * effectively ignored and ACLs govern access, so the chmod calls are\n * best-effort and silently skipped.\n * @param filePath - Absolute path to write\n * @param content - File content\n */\nexport function writeSecretFile(filePath: string, content: string | Buffer): void {\n ensureSecretDir(path.dirname(filePath));\n fs.writeFileSync(filePath, content, { mode: FILE_MODE });\n chmodIfDifferent(filePath, FILE_MODE);\n}\n\n/**\n * Ensure a directory exists with 0o700 permissions on POSIX systems.\n * `mkdirSync({ recursive: true })` does not chmod existing directories,\n * so this also tightens permissions on directories that were previously\n * created with looser modes.\n * @param dir - Directory path\n */\nexport function ensureSecretDir(dir: string): void {\n fs.mkdirSync(dir, { recursive: true, mode: DIR_MODE });\n chmodIfDifferent(dir, DIR_MODE);\n}\n\n/**\n * Tighten an existing file and its parent directory to secret-file modes\n * (0o600 / 0o700) if they are looser. Used by read paths that may not\n * trigger a subsequent write, so that legacy world-readable files are\n * still secured the next time the CLI runs. Silent no-op on Windows and\n * on missing files / permission errors.\n * @param filePath - Absolute path that should be 0o600 and live under a 0o700 directory\n */\nexport function tightenSecretFilePermissions(filePath: string): void {\n chmodIfDifferent(filePath, FILE_MODE);\n chmodIfDifferent(path.dirname(filePath), DIR_MODE);\n}\n"],"mappings":";;;;;;;;;;;;AASA,SAAgB,qBAAqB,SAAyB;CAC5D,OAAO,UAAU;AACnB;;;;;;;;;AAUA,eAAsB,YAAY;CAEhC,OAAO,sBAAqB,MADF,gBAAgB,EACH,CAAC,WAAW,SAAS;AAC9D;;;;ACrBA,MAAM,WAAW;AACjB,MAAM,YAAY;;;;;;;;AASlB,SAAS,iBAAiB,QAAgB,MAAoB;CAC5D,IAAI,QAAQ,aAAa,SAAS;CAClC,IAAI;EACF,KAAK,GAAG,SAAS,MAAM,CAAC,CAAC,OAAO,SAAW,MACzC,GAAG,UAAU,QAAQ,IAAI;CAE7B,QAAQ,CAER;AACF;;;;;;;;;;;AAYA,SAAgB,gBAAgB,UAAkB,SAAgC;CAChF,gBAAgB,KAAK,QAAQ,QAAQ,CAAC;CACtC,GAAG,cAAc,UAAU,SAAS,EAAE,MAAM,UAAU,CAAC;CACvD,iBAAiB,UAAU,SAAS;AACtC;;;;;;;;AASA,SAAgB,gBAAgB,KAAmB;CACjD,GAAG,UAAU,KAAK;EAAE,WAAW;EAAM,MAAM;CAAS,CAAC;CACrD,iBAAiB,KAAK,QAAQ;AAChC;;;;;;;;;AAUA,SAAgB,6BAA6B,UAAwB;CACnE,iBAAiB,UAAU,SAAS;CACpC,iBAAiB,KAAK,QAAQ,QAAQ,GAAG,QAAQ;AACnD"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { t as assertDefined } from "./assert-DBxo8jPo.mjs";
|
|
2
|
+
import { vi } from "vitest";
|
|
3
|
+
|
|
4
|
+
//#region src/vitest/mocks/shared.ts
|
|
5
|
+
function withDispose(facade, dispose) {
|
|
6
|
+
Object.defineProperty(facade, Symbol.dispose, {
|
|
7
|
+
value: dispose,
|
|
8
|
+
enumerable: false,
|
|
9
|
+
writable: true,
|
|
10
|
+
configurable: true
|
|
11
|
+
});
|
|
12
|
+
return facade;
|
|
13
|
+
}
|
|
14
|
+
function tailorRoot() {
|
|
15
|
+
const g = globalThis;
|
|
16
|
+
if (!g.tailor) g.tailor = { context: { getInvoker: () => null } };
|
|
17
|
+
return g.tailor;
|
|
18
|
+
}
|
|
19
|
+
function tailordbRoot() {
|
|
20
|
+
const g = globalThis;
|
|
21
|
+
if (!g.tailordb) g.tailordb = {};
|
|
22
|
+
return g.tailordb;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region src/vitest/mocks/secretmanager.ts
|
|
27
|
+
const SECRET_STORE = Symbol("tailorSecretStore");
|
|
28
|
+
/**
|
|
29
|
+
* Acquire a disposable mock for `tailor.secretmanager`. The secret store is
|
|
30
|
+
* inherited (cloned) from the currently-installed mock on acquisition and
|
|
31
|
+
* restored on dispose, so secrets seeded outside the test survive across
|
|
32
|
+
* `using` scopes while per-test `setSecrets()` overrides stay isolated.
|
|
33
|
+
* @returns Disposable SecretManager mock control object
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { mockSecretmanager } from "@tailor-platform/sdk/vitest";
|
|
37
|
+
*
|
|
38
|
+
* test("reads secrets from vault", async () => {
|
|
39
|
+
* using sm = mockSecretmanager();
|
|
40
|
+
* sm.setSecrets({ "my-vault": { API_KEY: "sk-123" } });
|
|
41
|
+
* // …
|
|
42
|
+
* });
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
function mockSecretmanager() {
|
|
46
|
+
const root = tailorRoot();
|
|
47
|
+
const prev = root.secretmanager;
|
|
48
|
+
const holder = { store: structuredClone(prev?.[SECRET_STORE]?.store ?? {}) };
|
|
49
|
+
const getSecret = vi.fn(async (vault, name) => holder.store[vault]?.[name]);
|
|
50
|
+
const getSecrets = vi.fn(async (vault, names) => {
|
|
51
|
+
const vaultData = holder.store[vault] ?? {};
|
|
52
|
+
const result = {};
|
|
53
|
+
for (const name of names) if (name in vaultData) result[name] = assertDefined(vaultData[name], `vault entry missing for: ${name}`);
|
|
54
|
+
return result;
|
|
55
|
+
});
|
|
56
|
+
root.secretmanager = {
|
|
57
|
+
getSecret,
|
|
58
|
+
getSecrets,
|
|
59
|
+
[SECRET_STORE]: holder
|
|
60
|
+
};
|
|
61
|
+
return withDispose({
|
|
62
|
+
/** The `getSecret` `vi.fn`. */
|
|
63
|
+
getSecret,
|
|
64
|
+
/** The `getSecrets` `vi.fn`. */
|
|
65
|
+
getSecrets,
|
|
66
|
+
setSecrets(secrets) {
|
|
67
|
+
holder.store = secrets;
|
|
68
|
+
},
|
|
69
|
+
get calls() {
|
|
70
|
+
return [...getSecret.mock.calls.map((args, i) => ({
|
|
71
|
+
order: getSecret.mock.invocationCallOrder[i] ?? 0,
|
|
72
|
+
call: {
|
|
73
|
+
method: "getSecret",
|
|
74
|
+
vault: args[0],
|
|
75
|
+
name: args[1]
|
|
76
|
+
}
|
|
77
|
+
})), ...getSecrets.mock.calls.map((args, i) => ({
|
|
78
|
+
order: getSecrets.mock.invocationCallOrder[i] ?? 0,
|
|
79
|
+
call: {
|
|
80
|
+
method: "getSecrets",
|
|
81
|
+
vault: args[0],
|
|
82
|
+
names: args[1]
|
|
83
|
+
}
|
|
84
|
+
}))].toSorted((a, b) => a.order - b.order).map((e) => e.call);
|
|
85
|
+
},
|
|
86
|
+
reset() {
|
|
87
|
+
holder.store = {};
|
|
88
|
+
getSecret.mockClear();
|
|
89
|
+
getSecrets.mockClear();
|
|
90
|
+
}
|
|
91
|
+
}, () => {
|
|
92
|
+
root.secretmanager = prev;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
//#endregion
|
|
97
|
+
export { withDispose as i, tailorRoot as n, tailordbRoot as r, mockSecretmanager as t };
|
|
98
|
+
//# sourceMappingURL=secretmanager-Bd45j7an.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretmanager-Bd45j7an.mjs","names":[],"sources":["../src/vitest/mocks/shared.ts","../src/vitest/mocks/secretmanager.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\n// Attach a non-enumerable `Symbol.dispose` to a facade so it works with `using`.\nexport function withDispose<T extends object>(facade: T, dispose: () => void): T & Disposable {\n Object.defineProperty(facade, Symbol.dispose, {\n value: dispose,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n return facade as T & Disposable;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function tailorRoot(): Record<string, any> {\n const g = globalThis as Record<string, unknown>;\n if (!g.tailor) {\n // Ensure the container (and the always-present context stub) exists even if\n // the base globals were not installed (e.g. a unit test that only acquires\n // a single mock without the tailor-runtime environment).\n g.tailor = { context: { getInvoker: () => null } };\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return g.tailor as Record<string, any>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function tailordbRoot(): Record<string, any> {\n const g = globalThis as Record<string, unknown>;\n if (!g.tailordb) {\n g.tailordb = {};\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return g.tailordb as Record<string, any>;\n}\n","import { vi } from \"vitest\";\nimport { assertDefined } from \"#/utils/assert\";\nimport { tailorRoot, withDispose } from \"./shared\";\n\ninterface SecretCall {\n method: \"getSecret\" | \"getSecrets\";\n vault: string;\n name?: string;\n names?: readonly string[];\n}\n\n// ---------------------------------------------------------------------------\n// SecretManager Mock\n// ---------------------------------------------------------------------------\n\n// Hidden accessor key used to inherit the previous scope's secret store on\n// acquisition (so secrets seeded once outside tests — e.g. from tailor.config.ts\n// via setup.ts — remain visible) while still isolating per-test overrides.\nconst SECRET_STORE = Symbol(\"tailorSecretStore\");\n\n/**\n * Acquire a disposable mock for `tailor.secretmanager`. The secret store is\n * inherited (cloned) from the currently-installed mock on acquisition and\n * restored on dispose, so secrets seeded outside the test survive across\n * `using` scopes while per-test `setSecrets()` overrides stay isolated.\n * @returns Disposable SecretManager mock control object\n * @example\n * ```typescript\n * import { mockSecretmanager } from \"@tailor-platform/sdk/vitest\";\n *\n * test(\"reads secrets from vault\", async () => {\n * using sm = mockSecretmanager();\n * sm.setSecrets({ \"my-vault\": { API_KEY: \"sk-123\" } });\n * // …\n * });\n * ```\n */\nexport function mockSecretmanager() {\n const root = tailorRoot();\n const prev = root.secretmanager;\n\n const holder: { store: Record<string, Record<string, string>> } = {\n // prior mock state may be absent\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n store: structuredClone((prev?.[SECRET_STORE]?.store as typeof holder.store) ?? {}),\n };\n\n const getSecret = vi.fn(\n async (vault: string, name: string): Promise<string | undefined> => holder.store[vault]?.[name],\n );\n const getSecrets = vi.fn(\n async <const T extends readonly string[]>(\n vault: string,\n names: T,\n ): Promise<Partial<Record<T[number], string>>> => {\n const vaultData = holder.store[vault] ?? {};\n const result: Record<string, string> = {};\n for (const name of names) {\n if (name in vaultData) {\n result[name] = assertDefined(vaultData[name], `vault entry missing for: ${name}`);\n }\n }\n return result as Partial<Record<T[number], string>>;\n },\n );\n\n root.secretmanager = { getSecret, getSecrets, [SECRET_STORE]: holder };\n\n const facade = {\n /** The `getSecret` `vi.fn`. */\n getSecret,\n /** The `getSecrets` `vi.fn`. */\n getSecrets,\n\n setSecrets(secrets: Record<string, Record<string, string>>): void {\n holder.store = secrets;\n },\n\n get calls(): SecretCall[] {\n // Merge both methods' calls back into chronological order via vi.fn's\n // global invocationCallOrder, so a test mixing getSecret/getSecrets sees\n // them in the order they actually ran (not all getSecret, then all getSecrets).\n const entries: { order: number; call: SecretCall }[] = [\n ...getSecret.mock.calls.map((args, i) => ({\n order: getSecret.mock.invocationCallOrder[i] ?? 0,\n call: { method: \"getSecret\" as const, vault: args[0] as string, name: args[1] as string },\n })),\n ...getSecrets.mock.calls.map((args, i) => ({\n order: getSecrets.mock.invocationCallOrder[i] ?? 0,\n call: {\n method: \"getSecrets\" as const,\n vault: args[0] as string,\n names: args[1] as readonly string[],\n },\n })),\n ];\n return entries.toSorted((a, b) => a.order - b.order).map((e) => e.call);\n },\n\n reset(): void {\n holder.store = {};\n getSecret.mockClear();\n getSecrets.mockClear();\n },\n };\n\n return withDispose(facade, () => {\n root.secretmanager = prev;\n });\n}\n"],"mappings":";;;;AAKA,SAAgB,YAA8B,QAAW,SAAqC;CAC5F,OAAO,eAAe,QAAQ,OAAO,SAAS;EAC5C,OAAO;EACP,YAAY;EACZ,UAAU;EACV,cAAc;CAChB,CAAC;CACD,OAAO;AACT;AAGA,SAAgB,aAAkC;CAChD,MAAM,IAAI;CACV,IAAI,CAAC,EAAE,QAIL,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,KAAK,EAAE;CAGnD,OAAO,EAAE;AACX;AAGA,SAAgB,eAAoC;CAClD,MAAM,IAAI;CACV,IAAI,CAAC,EAAE,UACL,EAAE,WAAW,CAAC;CAGhB,OAAO,EAAE;AACX;;;;AClBA,MAAM,eAAe,OAAO,mBAAmB;;;;;;;;;;;;;;;;;;AAmB/C,SAAgB,oBAAoB;CAClC,MAAM,OAAO,WAAW;CACxB,MAAM,OAAO,KAAK;CAElB,MAAM,SAA4D,EAGhE,OAAO,gBAAiB,OAAO,aAAa,EAAE,SAAiC,CAAC,CAAC,EACnF;CAEA,MAAM,YAAY,GAAG,GACnB,OAAO,OAAe,SAA8C,OAAO,MAAM,MAAM,GAAG,KAC5F;CACA,MAAM,aAAa,GAAG,GACpB,OACE,OACA,UACgD;EAChD,MAAM,YAAY,OAAO,MAAM,UAAU,CAAC;EAC1C,MAAM,SAAiC,CAAC;EACxC,KAAK,MAAM,QAAQ,OACjB,IAAI,QAAQ,WACV,OAAO,QAAQ,cAAc,UAAU,OAAO,4BAA4B,MAAM;EAGpF,OAAO;CACT,CACF;CAEA,KAAK,gBAAgB;EAAE;EAAW;GAAa,eAAe;CAAO;CAwCrE,OAAO,YAAY;;EApCjB;;EAEA;EAEA,WAAW,SAAuD;GAChE,OAAO,QAAQ;EACjB;EAEA,IAAI,QAAsB;GAkBxB,OAAO,CAbL,GAAG,UAAU,KAAK,MAAM,KAAK,MAAM,OAAO;IACxC,OAAO,UAAU,KAAK,oBAAoB,MAAM;IAChD,MAAM;KAAE,QAAQ;KAAsB,OAAO,KAAK;KAAc,MAAM,KAAK;IAAa;GAC1F,EAAE,GACF,GAAG,WAAW,KAAK,MAAM,KAAK,MAAM,OAAO;IACzC,OAAO,WAAW,KAAK,oBAAoB,MAAM;IACjD,MAAM;KACJ,QAAQ;KACR,OAAO,KAAK;KACZ,OAAO,KAAK;IACd;GACF,EAAE,CAES,CAAC,CAAC,UAAU,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,IAAI;EACxE;EAEA,QAAc;GACZ,OAAO,QAAQ,CAAC;GAChB,UAAU,UAAU;GACpB,WAAW,UAAU;EACvB;CAGsB,SAAS;EAC/B,KAAK,gBAAgB;CACvB,CAAC;AACH"}
|
package/dist/seed/index.d.mts
CHANGED
|
@@ -22,5 +22,4 @@ type ValidateSeedResult = {
|
|
|
22
22
|
*/
|
|
23
23
|
declare function validateSeedData(options: ValidateSeedDataOptions): Promise<ValidateSeedResult>;
|
|
24
24
|
//#endregion
|
|
25
|
-
export { type ForeignKeyDefinition, type IndexDefinition, defineSchema, validateSeedData };
|
|
26
|
-
//# sourceMappingURL=index.d.mts.map
|
|
25
|
+
export { type ForeignKeyDefinition, type IndexDefinition, defineSchema, validateSeedData };
|
|
@@ -379,6 +379,17 @@ function processSeedTypeInfo(type, namespace) {
|
|
|
379
379
|
};
|
|
380
380
|
}
|
|
381
381
|
|
|
382
|
+
//#endregion
|
|
383
|
+
//#region src/plugin/builtin/seed/template-literal.ts
|
|
384
|
+
/**
|
|
385
|
+
* Escape generated script source before embedding it in a template literal.
|
|
386
|
+
* @param scriptCode - Generated script source to embed.
|
|
387
|
+
* @returns Escaped template literal content.
|
|
388
|
+
*/
|
|
389
|
+
function escapeSeedScriptCodeForTemplateLiteral(scriptCode) {
|
|
390
|
+
return scriptCode.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$/g, "\\$");
|
|
391
|
+
}
|
|
392
|
+
|
|
382
393
|
//#endregion
|
|
383
394
|
//#region src/plugin/builtin/seed/index.ts
|
|
384
395
|
/** Unique identifier for the seed generator plugin. */
|
|
@@ -410,7 +421,7 @@ function generateIdpUserSeedFunction(hasIdpUser, idpNamespace) {
|
|
|
410
421
|
}
|
|
411
422
|
console.log(styleText("dim", \` Processing \${rows.length} _User records...\`));
|
|
412
423
|
|
|
413
|
-
const idpSeedCode = \/* js *\/\`${generateIdpSeedScriptCode(idpNamespace)
|
|
424
|
+
const idpSeedCode = \/* js *\/\`${escapeSeedScriptCodeForTemplateLiteral(generateIdpSeedScriptCode(idpNamespace))}\`;
|
|
414
425
|
|
|
415
426
|
const result = await executeScript({
|
|
416
427
|
client: operatorClient,
|
|
@@ -490,7 +501,7 @@ function generateIdpUserTruncateFunction(hasIdpUser, idpNamespace) {
|
|
|
490
501
|
const truncateIdpUser = async () => {
|
|
491
502
|
console.log(styleText("cyan", "Truncating _User via tailor.idp.Client..."));
|
|
492
503
|
|
|
493
|
-
const idpTruncateCode = \/* js *\/\`${generateIdpTruncateScriptCode(idpNamespace)
|
|
504
|
+
const idpTruncateCode = \/* js *\/\`${escapeSeedScriptCodeForTemplateLiteral(generateIdpTruncateScriptCode(idpNamespace))}\`;
|
|
494
505
|
|
|
495
506
|
const result = await executeScript({
|
|
496
507
|
client: operatorClient,
|
|
@@ -1156,4 +1167,4 @@ function seedPlugin(options) {
|
|
|
1156
1167
|
|
|
1157
1168
|
//#endregion
|
|
1158
1169
|
export { seedPlugin as n, SeedGeneratorID as t };
|
|
1159
|
-
//# sourceMappingURL=seed-
|
|
1170
|
+
//# sourceMappingURL=seed-CRSQJI_z.mjs.map
|