@tailor-platform/sdk 2.0.0-next.1 → 2.0.0-next.10
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 +869 -2
- package/README.md +9 -9
- package/agent-skills/{tailor-sdk → tailor}/SKILL.md +3 -1
- package/dist/aigateway-DR4Kwuik.mjs +9 -0
- package/dist/aigateway-DR4Kwuik.mjs.map +1 -0
- package/dist/application-DArFTTJ9.mjs +3 -0
- package/dist/{application-DqS1yBg3.mjs → application-miwiXtB4.mjs} +1892 -1968
- package/dist/application-miwiXtB4.mjs.map +1 -0
- package/dist/authconnection-CZvi9ANm.mjs +9 -0
- package/dist/authconnection-CZvi9ANm.mjs.map +1 -0
- package/dist/brand-Eo4pLXPJ.mjs.map +1 -1
- package/dist/cli/cache/bundle-cache.d.mts +2 -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 +4 -0
- package/dist/cli/commands/deploy/aigateway.d.mts +5 -0
- package/dist/cli/commands/deploy/application.d.mts +7 -0
- package/dist/cli/commands/deploy/apply-phases.d.mts +14 -0
- package/dist/cli/commands/deploy/auth.d.mts +5 -0
- package/dist/cli/commands/deploy/deploy.d.mts +34 -0
- package/dist/cli/commands/deploy/executor.d.mts +7 -0
- package/dist/cli/commands/deploy/function-registry-types.d.mts +12 -0
- package/dist/cli/commands/deploy/function-registry.d.mts +7 -0
- package/dist/cli/commands/deploy/idp.d.mts +5 -0
- package/dist/cli/commands/deploy/resolver.d.mts +5 -0
- package/dist/cli/commands/deploy/secret-manager.d.mts +5 -0
- package/dist/cli/commands/deploy/staticwebsite.d.mts +5 -0
- package/dist/cli/commands/deploy/tailordb/index.d.mts +9 -0
- package/dist/cli/commands/deploy/types.d.mts +3 -0
- package/dist/cli/commands/deploy/workflow-execution-policy.d.mts +3 -0
- package/dist/cli/commands/deploy/workflow.d.mts +4 -0
- package/dist/cli/commands/executor/get.d.mts +28 -0
- package/dist/cli/commands/executor/jobs.d.mts +122 -0
- package/dist/cli/commands/executor/list.d.mts +18 -0
- package/dist/cli/commands/executor/transform.d.mts +42 -0
- package/dist/cli/commands/executor/trigger.d.mts +40 -0
- package/dist/cli/commands/executor/webhook.d.mts +21 -0
- package/dist/cli/commands/function/get.d.mts +17 -0
- package/dist/cli/commands/function/list.d.mts +21 -0
- package/dist/cli/commands/function/transform.d.mts +12 -0
- package/dist/cli/commands/generate/options.d.mts +6 -0
- package/dist/cli/commands/generate/seed/bundler.d.mts +26 -0
- package/dist/cli/commands/generate/service.d.mts +15 -0
- package/dist/cli/commands/machineuser/list.d.mts +26 -0
- package/dist/cli/commands/machineuser/token.d.mts +21 -0
- package/dist/cli/commands/oauth2client/get.d.mts +17 -0
- package/dist/cli/commands/oauth2client/list.d.mts +19 -0
- package/dist/cli/commands/oauth2client/transform.d.mts +21 -0
- package/dist/cli/commands/organization/folder/create.d.mts +17 -0
- package/dist/cli/commands/organization/folder/delete.d.mts +15 -0
- package/dist/cli/commands/organization/folder/get.d.mts +16 -0
- package/dist/cli/commands/organization/folder/list.d.mts +21 -0
- package/dist/cli/commands/organization/folder/update.d.mts +17 -0
- package/dist/cli/commands/organization/get.d.mts +15 -0
- package/dist/cli/commands/organization/list.d.mts +14 -0
- package/dist/cli/commands/organization/transform.d.mts +29 -0
- package/dist/cli/commands/organization/tree.d.mts +24 -0
- package/dist/cli/commands/organization/update.d.mts +16 -0
- package/dist/cli/commands/remove.d.mts +15 -0
- package/dist/cli/commands/show.d.mts +39 -0
- package/dist/cli/commands/staticwebsite/deploy.d.mts +19 -0
- package/dist/cli/commands/tailordb/migrate/bundler.d.mts +29 -0
- package/dist/cli/commands/tailordb/migrate/config.d.mts +18 -0
- package/dist/cli/commands/tailordb/migrate/diff-calculator.d.mts +246 -0
- package/dist/cli/commands/tailordb/migrate/generate.d.mts +16 -0
- package/dist/cli/commands/tailordb/migrate/snapshot-types.d.mts +208 -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 +18 -0
- package/dist/cli/commands/workflow/executions.d.mts +74 -0
- package/dist/cli/commands/workflow/get.d.mts +30 -0
- package/dist/cli/commands/workflow/list.d.mts +18 -0
- package/dist/cli/commands/workflow/resume.d.mts +22 -0
- package/dist/cli/commands/workflow/start.d.mts +60 -0
- package/dist/cli/commands/workflow/status.d.mts +6 -0
- package/dist/cli/commands/workflow/transform.d.mts +34 -0
- package/dist/cli/commands/workflow/wait.d.mts +15 -0
- package/dist/cli/commands/workflow/waiter.d.mts +23 -0
- package/dist/cli/commands/workspace/app/health.d.mts +17 -0
- package/dist/cli/commands/workspace/app/list.d.mts +21 -0
- package/dist/cli/commands/workspace/app/transform.d.mts +20 -0
- package/dist/cli/commands/workspace/create.d.mts +27 -0
- package/dist/cli/commands/workspace/delete.d.mts +14 -0
- package/dist/cli/commands/workspace/get.d.mts +16 -0
- package/dist/cli/commands/workspace/list.d.mts +17 -0
- package/dist/cli/commands/workspace/restore.d.mts +14 -0
- package/dist/cli/commands/workspace/transform.d.mts +20 -0
- package/dist/cli/commands/workspace/user/invite.d.mts +21 -0
- package/dist/cli/commands/workspace/user/list.d.mts +21 -0
- package/dist/cli/commands/workspace/user/remove.d.mts +16 -0
- package/dist/cli/commands/workspace/user/transform.d.mts +9 -0
- package/dist/cli/commands/workspace/user/update.d.mts +21 -0
- package/dist/cli/index.mjs +12 -5481
- package/dist/cli/lib.d.mts +90 -21048
- package/dist/cli/lib.mjs +154 -12
- package/dist/cli/lib.mjs.map +1 -1
- package/dist/cli/main.d.mts +23 -0
- package/dist/cli/main.mjs +6583 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cli/query/index.d.mts +38 -0
- package/dist/cli/services/application.d.mts +12 -0
- package/dist/cli/services/auth/service.d.mts +3 -0
- package/dist/cli/services/executor/service.d.mts +1 -0
- package/dist/cli/services/http-adapter/bundler.d.mts +3 -0
- package/dist/cli/services/http-adapter/service.d.mts +2 -0
- package/dist/cli/services/resolver/service.d.mts +1 -0
- package/dist/cli/services/tailordb/service.d.mts +3 -0
- package/dist/cli/services/workflow/bundler.d.mts +2 -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 +25 -0
- package/dist/cli/shared/context.d.mts +29 -0
- package/dist/cli/shared/error-json.d.mts +23 -0
- package/dist/cli/shared/readonly-guard.d.mts +25 -0
- package/dist/cli/shared/script-executor.d.mts +77 -0
- package/dist/cli/shared/seed-chunker.d.mts +45 -0
- package/dist/cli/shared/seed-context.d.mts +49 -0
- package/dist/cli/shared/tailordb-namespaces.d.mts +40 -0
- package/dist/cli/shared/type-generator.d.mts +19 -0
- package/dist/cli/shared/workspace-name.d.mts +1 -0
- package/dist/cli/ts-hook.d.mts +4 -0
- package/dist/cli/ts-hook.mjs +333 -0
- package/dist/completion/zsh-worker.zsh +1433 -1239
- package/dist/configure/config/index.d.mts +20 -0
- package/dist/configure/config/types.d.mts +111 -0
- package/dist/configure/index.d.mts +135 -8
- package/dist/configure/index.mjs +390 -36
- package/dist/configure/index.mjs.map +1 -1
- package/dist/configure/services/aigateway/index.d.mts +16 -0
- package/dist/configure/services/aigateway/types.d.mts +10 -0
- package/dist/configure/services/auth/index.d.mts +33 -0
- package/dist/configure/services/auth/types.d.mts +168 -0
- package/dist/configure/services/executor/executor.d.mts +70 -0
- package/dist/configure/services/executor/index.d.mts +9 -0
- package/dist/configure/services/executor/operation.d.mts +50 -0
- package/dist/configure/services/executor/trigger/event.d.mts +271 -0
- package/dist/configure/services/executor/trigger/index.d.mts +7 -0
- package/dist/configure/services/executor/trigger/schedule.d.mts +24 -0
- package/dist/configure/services/executor/trigger/webhook.d.mts +43 -0
- package/dist/configure/services/executor/types.d.mts +2 -0
- package/dist/configure/services/http-adapter/http-adapter.d.mts +124 -0
- package/dist/configure/services/http-adapter/index.d.mts +2 -0
- package/dist/configure/services/idp/index.d.mts +60 -0
- package/dist/configure/services/idp/permission.d.mts +64 -0
- package/dist/configure/services/idp/types.d.mts +23 -0
- package/dist/configure/services/index.d.mts +40 -0
- package/dist/configure/services/resolver/index.d.mts +6 -0
- package/dist/configure/services/resolver/permission.d.mts +64 -0
- package/dist/configure/services/resolver/resolver.d.mts +88 -0
- package/dist/configure/services/resolver/types.d.mts +5 -0
- package/dist/configure/services/secrets/index.d.mts +37 -0
- package/dist/configure/services/secrets/types.d.mts +10 -0
- package/dist/configure/services/staticwebsite/index.d.mts +18 -0
- package/dist/configure/services/staticwebsite/types.d.mts +10 -0
- package/dist/configure/services/tailordb/index.d.mts +4 -0
- package/dist/configure/services/tailordb/permission.d.mts +103 -0
- package/dist/configure/services/tailordb/schema.d.mts +486 -0
- package/dist/configure/services/tailordb/types.d.mts +198 -0
- package/dist/configure/services/workflow/execution-policy.d.mts +70 -0
- package/dist/configure/services/workflow/execution-policy.types.d.mts +103 -0
- package/dist/configure/services/workflow/index.d.mts +9 -0
- package/dist/configure/services/workflow/job.d.mts +83 -0
- package/dist/configure/services/workflow/types.d.mts +2 -0
- package/dist/configure/services/workflow/wait-point.d.mts +72 -0
- package/dist/configure/services/workflow/workflow.d.mts +56 -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.d.mts +8 -0
- package/dist/configure/types/field.types.d.mts +70 -0
- package/dist/configure/types/idp-name.d.mts +12 -0
- package/dist/configure/types/index.d.mts +5 -0
- package/dist/configure/types/machine-user.d.mts +2 -0
- package/dist/configure/types/permission-operand.types.d.mts +20 -0
- package/dist/configure/types/type.d.mts +73 -0
- package/dist/{context-Bd266-ru.mjs → context-DYQVYWqZ.mjs} +4 -5
- package/dist/context-DYQVYWqZ.mjs.map +1 -0
- package/dist/{crashreport-BsjAkFWw.mjs → crashreport-B5LqCTfF.mjs} +10 -11
- package/dist/{crashreport-BsjAkFWw.mjs.map → crashreport-B5LqCTfF.mjs.map} +1 -1
- package/dist/{crashreport-pr6Rhvza.mjs → crashreport-eI7ty7ok.mjs} +1 -1
- package/dist/enum-constants-j9QBF0cB.mjs.map +1 -1
- package/dist/{errors-Dtf2WPaW.mjs → errors-D7583Zz7.mjs} +18 -2
- package/dist/errors-D7583Zz7.mjs.map +1 -0
- package/dist/{file-_oUZo76X.mjs → file-BUcmVIH2.mjs} +12 -22
- package/dist/file-BUcmVIH2.mjs.map +1 -0
- package/dist/{file-utils-DcyIPFQh.mjs → file-utils-yEiIS4nJ.mjs} +6 -6
- package/dist/file-utils-yEiIS4nJ.mjs.map +1 -0
- package/dist/{globals-Crz8o65k.mjs → globals-DQotNuwK.mjs} +33 -55
- package/dist/globals-DQotNuwK.mjs.map +1 -0
- package/dist/iconv-QWaZh0TT.mjs +38 -0
- package/dist/iconv-QWaZh0TT.mjs.map +1 -0
- package/dist/{idp-BDbK5gjm.mjs → idp-RA_swu-h.mjs} +12 -5
- package/dist/idp-RA_swu-h.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 +5 -7
- package/dist/{kysely-type-DR8uzZTA.mjs → kysely-type-DqIRgDYR.mjs} +5 -4
- package/dist/kysely-type-DqIRgDYR.mjs.map +1 -0
- package/dist/logger-BtX0suGY.mjs +48 -0
- package/dist/logger-BtX0suGY.mjs.map +1 -0
- package/dist/logger-CXQq9YIp.mjs +317 -0
- package/dist/logger-CXQq9YIp.mjs.map +1 -0
- package/dist/parser/service/auth/index.d.mts +1 -0
- package/dist/parser/service/auth/schema.d.mts +3 -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 +5 -0
- package/dist/parser/service/tailordb/type-source.d.mts +10 -0
- package/dist/parser/service/tailordb/types.d.mts +131 -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 +15 -1
- package/dist/plugin/builtin/file-utils/index.d.mts +15 -1
- package/dist/plugin/builtin/file-utils/index.mjs +1 -1
- package/dist/plugin/builtin/kysely-type/index.d.mts +15 -1
- package/dist/plugin/builtin/kysely-type/index.mjs +1 -1
- package/dist/plugin/builtin/seed/index.d.mts +46 -2
- package/dist/plugin/builtin/seed/index.mjs +1 -1
- package/dist/plugin/builtin/seed/seed-type-processor.d.mts +19 -0
- package/dist/plugin/builtin/seed/types.d.mts +2 -0
- package/dist/plugin/get-generated-type.d.mts +16 -0
- package/dist/plugin/index.d.mts +3 -117
- package/dist/plugin/index.mjs +1 -1
- package/dist/plugin/index.mjs.map +1 -1
- package/dist/plugin/manager.d.mts +2 -0
- package/dist/plugin/types.d.mts +242 -0
- package/dist/plugin/with-context.d.mts +101 -0
- package/dist/{runtime-n9NCkjee.mjs → register-ts-hook-BAHMwxfG.mjs} +7812 -4094
- package/dist/register-ts-hook-BAHMwxfG.mjs.map +1 -0
- package/dist/{registry-DdsYlL_P.mjs → registry-BIGVUrMB.mjs} +12 -9
- package/dist/registry-BIGVUrMB.mjs.map +1 -0
- 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 +25 -0
- package/dist/runtime/aigateway.mjs +3 -0
- package/dist/runtime/authconnection.d.mts +21 -2
- package/dist/runtime/authconnection.mjs +2 -2
- package/dist/runtime/context.d.mts +54 -2
- package/dist/runtime/context.mjs +2 -2
- package/dist/runtime/field-parse.d.mts +10 -0
- package/dist/runtime/file.d.mts +170 -2
- package/dist/runtime/file.mjs +2 -2
- package/dist/runtime/globals.d.mts +38 -20
- package/dist/runtime/iconv.d.mts +73 -2
- package/dist/runtime/iconv.mjs +2 -2
- package/dist/runtime/idp.d.mts +129 -2
- package/dist/runtime/idp.mjs +2 -2
- package/dist/runtime/index.d.mts +48 -9
- package/dist/runtime/index.mjs +10 -8
- package/dist/runtime/logger.d.mts +98 -0
- package/dist/runtime/logger.mjs +3 -0
- package/dist/runtime/secretmanager.d.mts +41 -2
- package/dist/runtime/secretmanager.mjs +2 -2
- package/dist/runtime/types.d.mts +25 -0
- package/dist/runtime/workflow.d.mts +124 -2
- package/dist/runtime/workflow.mjs +2 -2
- package/dist/{schema-BhkpP5Hw.mjs → schema--xYWRGfe.mjs} +288 -229
- package/dist/schema--xYWRGfe.mjs.map +1 -0
- package/dist/{secret-file-DBqZhjFQ.mjs → secret-file-C3J4Gy8r.mjs} +2 -2
- package/dist/{secret-file-DBqZhjFQ.mjs.map → secret-file-C3J4Gy8r.mjs.map} +1 -1
- package/dist/secretmanager-CYlpffsz.mjs +13 -0
- package/dist/secretmanager-CYlpffsz.mjs.map +1 -0
- package/dist/secretmanager-IY4UvinW.mjs +131 -0
- package/dist/secretmanager-IY4UvinW.mjs.map +1 -0
- package/dist/seed/index.d.mts +4 -4
- package/dist/seed-LUVr7jHL.mjs +444 -0
- package/dist/seed-LUVr7jHL.mjs.map +1 -0
- package/dist/{service-DU1mVzri.mjs → service-B5WynBHQ.mjs} +3 -3
- package/dist/{service-DU1mVzri.mjs.map → service-B5WynBHQ.mjs.map} +1 -1
- package/dist/service-BNtPsK9Q.mjs +837 -0
- package/dist/service-BNtPsK9Q.mjs.map +1 -0
- package/dist/service-D5jn05ZI.mjs +3 -0
- package/dist/service_pb-BwZRiNug.mjs +167 -0
- package/dist/service_pb-BwZRiNug.mjs.map +1 -0
- package/dist/service_pb-wRkxUta6.mjs +3 -0
- package/dist/tailor-proto/src/tailor/v1/aigateway_pb.d.mts +203 -0
- package/dist/tailor-proto/src/tailor/v1/aigateway_resource_pb.d.mts +57 -0
- package/dist/tailor-proto/src/tailor/v1/application_pb.d.mts +315 -0
- package/dist/tailor-proto/src/tailor/v1/application_resource_pb.d.mts +160 -0
- package/dist/tailor-proto/src/tailor/v1/auth_pb.d.mts +2069 -0
- package/dist/tailor-proto/src/tailor/v1/auth_resource_pb.d.mts +865 -0
- package/dist/tailor-proto/src/tailor/v1/events_pb.d.mts +111 -0
- package/dist/tailor-proto/src/tailor/v1/events_resource_pb.d.mts +68 -0
- package/dist/tailor-proto/src/tailor/v1/executor_pb.d.mts +438 -0
- package/dist/tailor-proto/src/tailor/v1/executor_resource_pb.d.mts +563 -0
- package/dist/tailor-proto/src/tailor/v1/function_pb.d.mts +144 -0
- package/dist/tailor-proto/src/tailor/v1/function_registry_pb.d.mts +450 -0
- package/dist/tailor-proto/src/tailor/v1/function_resource_pb.d.mts +191 -0
- package/dist/tailor-proto/src/tailor/v1/http_adapter_resource_pb.d.mts +49 -0
- package/dist/tailor-proto/src/tailor/v1/idp_pb.d.mts +406 -0
- package/dist/tailor-proto/src/tailor/v1/idp_resource_pb.d.mts +429 -0
- package/dist/tailor-proto/src/tailor/v1/metadata_pb.d.mts +72 -0
- package/dist/tailor-proto/src/tailor/v1/metadata_resource_pb.d.mts +16 -0
- package/dist/tailor-proto/src/tailor/v1/meter_pb.d.mts +308 -0
- package/dist/tailor-proto/src/tailor/v1/pipeline_pb.d.mts +590 -0
- package/dist/tailor-proto/src/tailor/v1/pipeline_resource_pb.d.mts +329 -0
- package/dist/tailor-proto/src/tailor/v1/resource_pb.d.mts +112 -0
- package/dist/tailor-proto/src/tailor/v1/secret_manager_pb.d.mts +345 -0
- package/dist/tailor-proto/src/tailor/v1/secret_manager_resource_pb.d.mts +53 -0
- package/dist/tailor-proto/src/tailor/v1/service_pb.d.mts +3575 -0
- package/dist/tailor-proto/src/tailor/v1/stateflow_pb.d.mts +186 -0
- package/dist/tailor-proto/src/tailor/v1/stateflow_resource_pb.d.mts +28 -0
- package/dist/tailor-proto/src/tailor/v1/staticwebsite_pb.d.mts +428 -0
- package/dist/tailor-proto/src/tailor/v1/staticwebsite_resource_pb.d.mts +89 -0
- package/dist/tailor-proto/src/tailor/v1/tailordb_pb.d.mts +683 -0
- package/dist/tailor-proto/src/tailor/v1/tailordb_resource_pb.d.mts +796 -0
- package/dist/tailor-proto/src/tailor/v1/telemetryrouter_pb.d.mts +329 -0
- package/dist/tailor-proto/src/tailor/v1/telemetryrouter_resource_pb.d.mts +182 -0
- package/dist/tailor-proto/src/tailor/v1/workflow_pb.d.mts +861 -0
- package/dist/tailor-proto/src/tailor/v1/workflow_resource_pb.d.mts +309 -0
- package/dist/tailor-proto/src/tailor/v1/workspace_pb.d.mts +2014 -0
- package/dist/tailor-proto/src/tailor/v1/workspace_resource_pb.d.mts +482 -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/test-env-key-D7UkZp99.mjs +75 -0
- package/dist/test-env-key-D7UkZp99.mjs.map +1 -0
- package/dist/types/aigateway.generated.d.mts +12 -0
- package/dist/types/app-config.generated.d.mts +4 -0
- package/dist/types/auth-connection.generated.d.mts +33 -0
- package/dist/types/auth.generated.d.mts +188 -0
- package/dist/types/executor.generated.d.mts +209 -0
- package/dist/types/helpers.d.mts +40 -0
- package/dist/types/http-adapter.generated.d.mts +28 -0
- package/dist/types/idp.generated.d.mts +626 -0
- package/dist/types/resolver.generated.d.mts +82 -0
- package/dist/types/secrets.generated.d.mts +14 -0
- package/dist/types/staticwebsite.generated.d.mts +14 -0
- package/dist/types/tailordb.generated.d.mts +468 -0
- package/dist/types/workflow.generated.d.mts +17 -0
- package/dist/user-agent-Bgsszb5I.mjs +28 -0
- package/dist/user-agent-Bgsszb5I.mjs.map +1 -0
- package/dist/utils/test/index.d.mts +6 -100
- package/dist/utils/test/index.mjs +60 -39
- package/dist/utils/test/index.mjs.map +1 -1
- package/dist/utils/test/mock.d.mts +86 -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 +15 -429
- package/dist/vitest/index.mjs +1240 -31
- package/dist/vitest/index.mjs.map +1 -1
- package/dist/vitest/mock-kysely.d.mts +61 -0
- package/dist/vitest/mock.d.mts +10 -0
- package/dist/vitest/mocks/aigateway.d.mts +40 -0
- package/dist/vitest/mocks/authconnection.d.mts +38 -0
- package/dist/vitest/mocks/file.d.mts +58 -0
- package/dist/vitest/mocks/iconv.d.mts +51 -0
- package/dist/vitest/mocks/idp.d.mts +60 -0
- package/dist/vitest/mocks/logger.d.mts +45 -0
- package/dist/vitest/mocks/secretmanager.d.mts +44 -0
- package/dist/vitest/mocks/tailordb.d.mts +115 -0
- package/dist/vitest/mocks/workflow.d.mts +157 -0
- package/dist/vitest/setup.d.mts +1 -2
- package/dist/vitest/setup.mjs +2 -2
- package/dist/vitest/workflow-local.d.mts +41 -0
- package/dist/workflow-CsaQ9qK-.mjs +42 -0
- package/dist/workflow-CsaQ9qK-.mjs.map +1 -0
- package/dist/{client-z_oHGVNy.mjs → workspace_resource_pb-UGK1SSn_.mjs} +55 -619
- package/dist/workspace_resource_pb-UGK1SSn_.mjs.map +1 -0
- package/docs/cli/application.md +150 -250
- package/docs/cli/auth.md +51 -295
- package/docs/cli/completion.md +1 -25
- package/docs/cli/crashreport.md +3 -61
- package/docs/cli/executor.md +72 -183
- package/docs/cli/function.md +16 -132
- 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 +138 -40
- package/docs/cli/skills.md +50 -39
- package/docs/cli/staticwebsite.md +32 -180
- package/docs/cli/tailordb.md +71 -427
- package/docs/cli/upgrade.md +2 -22
- package/docs/cli/user.md +78 -247
- package/docs/cli/workflow.md +150 -172
- package/docs/cli/workspace.md +167 -538
- package/docs/cli-reference.md +213 -96
- package/docs/configuration.md +40 -6
- package/docs/github-actions.md +72 -24
- package/docs/migration/v2.md +1316 -0
- package/docs/multi-environment.md +29 -7
- package/docs/plugin/custom.md +4 -4
- package/docs/plugin/index.md +8 -8
- package/docs/quickstart.md +8 -7
- package/docs/runtime.md +18 -9
- package/docs/services/aigateway.md +20 -2
- package/docs/services/auth.md +51 -59
- package/docs/services/executor.md +8 -3
- package/docs/services/http-adapter.md +16 -1
- package/docs/services/idp.md +55 -2
- package/docs/services/resolver.md +62 -8
- package/docs/services/secret.md +11 -11
- package/docs/services/staticwebsite.md +8 -2
- package/docs/services/tailordb-migration.md +43 -28
- package/docs/services/tailordb.md +200 -99
- package/docs/services/workflow.md +133 -55
- package/docs/testing.md +244 -143
- package/package.json +59 -46
- package/postinstall.mjs +4 -6
- package/dist/application-DB2r36Et.mjs +0 -3
- package/dist/application-DqS1yBg3.mjs.map +0 -1
- package/dist/authconnection-D2MhtTN5.mjs +0 -15
- package/dist/authconnection-D2MhtTN5.mjs.map +0 -1
- package/dist/authconnection-DvUQAjQS.d.mts +0 -39
- package/dist/cli/erd-viewer-assets/app.js +0 -1181
- package/dist/cli/erd-viewer-assets/index.html +0 -73
- package/dist/cli/erd-viewer-assets/serve.json +0 -13
- package/dist/cli/erd-viewer-assets/styles.css +0 -789
- package/dist/cli/index.d.mts +0 -5
- package/dist/cli/index.mjs.map +0 -1
- package/dist/client-Dbohmtkv.mjs +0 -3
- package/dist/client-z_oHGVNy.mjs.map +0 -1
- package/dist/context-Bd266-ru.mjs.map +0 -1
- package/dist/context-BuuIb8CC.d.mts +0 -68
- 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-BB8Vs9O_.d.mts +0 -250
- package/dist/file-_oUZo76X.mjs.map +0 -1
- package/dist/file-utils-DcyIPFQh.mjs.map +0 -1
- package/dist/globals-Crz8o65k.mjs.map +0 -1
- package/dist/http-adapter.generated-WgMnb7Sb.d.mts +0 -580
- package/dist/iconv-Co-TOPuH.d.mts +0 -122
- package/dist/iconv-D2vi8G36.mjs +0 -63
- package/dist/iconv-D2vi8G36.mjs.map +0 -1
- package/dist/idp-BDbK5gjm.mjs.map +0 -1
- package/dist/idp-DrhVrLmV.d.mts +0 -160
- package/dist/index-5vPyRu1y.d.mts +0 -18
- package/dist/index-B7AKc18V.d.mts +0 -47
- package/dist/index-BlpzXncY.d.mts +0 -1016
- package/dist/index-CK7u9isy.d.mts +0 -46
- package/dist/index-CNYe5lnW.d.mts +0 -18
- package/dist/index-DjUdWlzf.d.mts +0 -18
- package/dist/index-ZePLwxw7.d.mts +0 -208
- package/dist/interceptor-D-q1rvRl.mjs.map +0 -1
- package/dist/job-fuc3j1Ma.mjs +0 -53
- package/dist/job-fuc3j1Ma.mjs.map +0 -1
- package/dist/kysely-type-DR8uzZTA.mjs.map +0 -1
- package/dist/logger-CxF-Ex5d.mjs +0 -220
- package/dist/logger-CxF-Ex5d.mjs.map +0 -1
- package/dist/mock-BjFj5o1I.mjs +0 -804
- package/dist/mock-BjFj5o1I.mjs.map +0 -1
- package/dist/registry-DdsYlL_P.mjs.map +0 -1
- package/dist/rolldown-runtime-DXywRVcq.mjs +0 -20
- package/dist/runtime-n9NCkjee.mjs.map +0 -1
- package/dist/schema-BhkpP5Hw.mjs.map +0 -1
- package/dist/secretmanager-B3n4KHfm.d.mts +0 -55
- package/dist/secretmanager-BVxw3ih_.mjs +0 -24
- package/dist/secretmanager-BVxw3ih_.mjs.map +0 -1
- package/dist/seed-jf3008-h.mjs +0 -1160
- package/dist/seed-jf3008-h.mjs.map +0 -1
- package/dist/service-CCL8ruDf.mjs +0 -459
- package/dist/service-CCL8ruDf.mjs.map +0 -1
- package/dist/service-D6yonf2I.mjs +0 -3
- package/dist/telemetry-CdqJEzkj.mjs.map +0 -1
- package/dist/telemetry-ClwW5ohF.mjs +0 -3
- package/dist/test-env-key-D9kM6ETE.mjs +0 -49
- package/dist/test-env-key-D9kM6ETE.mjs.map +0 -1
- package/dist/types-B2RpYyA_.mjs +0 -371
- package/dist/types-B2RpYyA_.mjs.map +0 -1
- package/dist/types-ClhIrW_C.mjs +0 -4
- package/dist/types-DCUhgpyI.d.mts +0 -784
- package/dist/types-DhO_VEZd.d.mts +0 -574
- package/dist/types-DwDgacni.d.mts +0 -338
- package/dist/workflow-BbKvGLQg.d.mts +0 -96
- package/dist/workflow-DgemCAz3.mjs +0 -38
- package/dist/workflow-DgemCAz3.mjs.map +0 -1
- package/dist/workflow.generated-DtQwEo-x.d.mts +0 -671
|
@@ -7,7 +7,7 @@ HTTP adapters expose REST-style HTTP endpoints on your application by translatin
|
|
|
7
7
|
Each HTTP adapter is a single file that declares:
|
|
8
8
|
|
|
9
9
|
- A `pathPattern` (which methods it handles is derived from the `input` keys)
|
|
10
|
-
- An `input` object keyed by lowercase HTTP method (`get`, `post`, `put`, `patch`, `delete`) — each value is a function that converts an incoming HTTP request into a GraphQL request (`query`, `variables`, `operationName`)
|
|
10
|
+
- An `input` object keyed by lowercase HTTP method (`get`, `post`, `put`, `patch`, `delete`) — each value is a function that converts an incoming HTTP request into a GraphQL request (`query`, `variables`, `operationName`). `query` can be a GraphQL string or a generated `TypedDocumentNode`.
|
|
11
11
|
- An optional `output` function — **shared across all methods** — that converts the GraphQL response into an HTTP response (`statusCode`, `headers`, `body`)
|
|
12
12
|
|
|
13
13
|
Adapters are deployed together with your application. When a request arrives under the `/api/` prefix and matches an adapter, the handler for the request method runs server-side.
|
|
@@ -74,6 +74,21 @@ A request to `GET /api/users/abc-123` invokes the `get` handler, runs the result
|
|
|
74
74
|
|
|
75
75
|
If `output` is omitted, the raw GraphQL response is returned as JSON.
|
|
76
76
|
|
|
77
|
+
### Typed GraphQL Documents
|
|
78
|
+
|
|
79
|
+
`input` handlers can return generated `TypedDocumentNode` values instead of query strings. The SDK uses the document's variables type for `variables`, and passes the document's result type to `output` as `resp.data`.
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
import { GetUserDocument } from "../generated/graphql";
|
|
83
|
+
|
|
84
|
+
get: (req) => ({
|
|
85
|
+
query: GetUserDocument,
|
|
86
|
+
variables: { id: req.path.split("/")[2] ?? "" },
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
When multiple methods return different typed documents, `resp.data` is the union of those result types because `output` is shared across the adapter. If a method returns a plain string query, its result type is `unknown`. When extracting an input handler and annotating it separately, pass the document type to `HttpAdapterInputFn` so required variables stay typed.
|
|
91
|
+
|
|
77
92
|
### Optional fields
|
|
78
93
|
|
|
79
94
|
Beyond `name`, `pathPattern`, `input`, and `output`, two optional fields control deploy-time behavior:
|
package/docs/services/idp.md
CHANGED
|
@@ -86,7 +86,8 @@ defineIdp("my-idp", {
|
|
|
86
86
|
- `read` - Controls who can read IdP users
|
|
87
87
|
- `update` - Controls who can update IdP users
|
|
88
88
|
- `delete` - Controls who can delete IdP users
|
|
89
|
-
- `sendPasswordResetEmail` - Controls who can send password reset emails.
|
|
89
|
+
- `sendPasswordResetEmail` - Controls who can send password reset emails. Required unless `userAuthPolicy.disablePasswordAuth` is `true` or `gqlOperations.sendPasswordResetEmail` is `false` (the password-reset flow has no meaning when password authentication is off or the operation is disabled). Set `[{ conditions: [[{ user: "role" }, "=", "ADMIN"]], permit: true }]` to allow, or `[]` to deny.
|
|
90
|
+
- `unenrollMfa` - Controls who can remove an enrolled MFA factor from a user. Required when `userAuthPolicy.enableMfa` is `true` unless `gqlOperations.unenrollMfa` is `false`; omit otherwise. Typically restricted to administrators.
|
|
90
91
|
|
|
91
92
|
**Policy fields:** each entry in an operation's policy array supports:
|
|
92
93
|
|
|
@@ -166,6 +167,37 @@ defineIdp("my-idp", {
|
|
|
166
167
|
- `allowGoogleOauth` - Enable the "Sign in with Google" button. Default `false`.
|
|
167
168
|
- `allowMicrosoftOauth` - Enable the "Sign in with Microsoft" button. Default `false`.
|
|
168
169
|
|
|
170
|
+
**MFA (TOTP):**
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
import { defineIdp, defineStaticWebSite } from "@tailor-platform/sdk";
|
|
174
|
+
|
|
175
|
+
const website = defineStaticWebSite("my-frontend", { description: "App frontend" });
|
|
176
|
+
|
|
177
|
+
defineIdp("my-idp", {
|
|
178
|
+
clients: ["my-client"],
|
|
179
|
+
userAuthPolicy: {
|
|
180
|
+
enableMfa: true,
|
|
181
|
+
requireMfa: false,
|
|
182
|
+
allowedReturnOrigins: [website.url, "https://admin.example.com"],
|
|
183
|
+
mfaIssuer: "My App",
|
|
184
|
+
},
|
|
185
|
+
permission: {
|
|
186
|
+
create: [{ conditions: [[{ user: "role" }, "=", "ADMIN"]], permit: true }],
|
|
187
|
+
read: [{ conditions: [[{ user: "role" }, "=", "ADMIN"]], permit: true }],
|
|
188
|
+
update: [{ conditions: [[{ user: "role" }, "=", "ADMIN"]], permit: true }],
|
|
189
|
+
delete: [{ conditions: [[{ user: "role" }, "=", "ADMIN"]], permit: true }],
|
|
190
|
+
sendPasswordResetEmail: [{ conditions: [[{ user: "_loggedIn" }, "=", true]], permit: true }],
|
|
191
|
+
unenrollMfa: [{ conditions: [[{ user: "role" }, "=", "ADMIN"]], permit: true }],
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
- `enableMfa` - Make TOTP MFA available for users in this namespace. Default `false`. When enabled, users can register an authenticator app (Google Authenticator, 1Password, etc.) from the IdP self-service page.
|
|
197
|
+
- `requireMfa` - Force password-authenticated users to enroll and pass an MFA challenge on each sign-in. Default `false`. Social sign-in (`allowGoogleOauth` / `allowMicrosoftOauth`) is not affected; the upstream provider's MFA covers those sessions.
|
|
198
|
+
- `allowedReturnOrigins` - Origins the IdP self-service pages (such as `/mfa/settings`) are allowed to redirect back to. Each entry is either a literal origin (`https://app.example.com`, scheme + host + optional port, no path/query/fragment) or a static-website placeholder `<name>:url` (e.g. `website.url`) that the CLI resolves to the deployed website's URL at apply time. Required when `enableMfa` is `true`.
|
|
199
|
+
- `mfaIssuer` - Label shown next to the user account in authenticator apps when TOTP is enrolled. Up to 64 characters. Falls back to `"Tailor Platform IdP"` when empty.
|
|
200
|
+
|
|
169
201
|
**Constraints:** the following combinations are rejected at parse time.
|
|
170
202
|
|
|
171
203
|
- `passwordMinLength` must be less than or equal to `passwordMaxLength`.
|
|
@@ -173,6 +205,23 @@ defineIdp("my-idp", {
|
|
|
173
205
|
- `allowGoogleOauth` requires a non-empty `allowedEmailDomains`.
|
|
174
206
|
- `allowMicrosoftOauth` requires both a non-empty `allowedEmailDomains` and `disablePasswordAuth: true`.
|
|
175
207
|
- `disablePasswordAuth` requires `allowGoogleOauth` or `allowMicrosoftOauth`, and cannot be combined with `allowSelfPasswordReset`.
|
|
208
|
+
- `requireMfa: true` requires `enableMfa: true`.
|
|
209
|
+
- `enableMfa: true` requires at least one entry in `allowedReturnOrigins`.
|
|
210
|
+
- `enableMfa: true` requires `permission` to be defined and to include an explicit `unenrollMfa` policy (an empty array `[]` to deny is fine), unless `gqlOperations.unenrollMfa` is `false` (or `gqlOperations: "query"`, which normalizes to the same), in which case the operation is turned off and the policy may be omitted.
|
|
211
|
+
|
|
212
|
+
**Runtime API:** function code can inspect and revoke a user's enrolled factor through `idp.Client`. The `User` records returned by `user`, `userByName`, `users`, `createUser`, and `updateUser` expose `mfaEnrolled` (boolean) and `mfaFactorIds` (string array), and `client.unenrollMfa({ userId, mfaFactorId })` removes a single factor. The factor ID to pass back is one of the entries in `user.mfaFactorIds`. Calling `unenrollMfa` requires the `unenrollMfa` permission above.
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
import { idp } from "@tailor-platform/sdk/runtime";
|
|
216
|
+
|
|
217
|
+
const client = new idp.Client({ namespace: "my-idp" });
|
|
218
|
+
const user = await client.user("user-id");
|
|
219
|
+
if (user.mfaEnrolled) {
|
|
220
|
+
for (const factorId of user.mfaFactorIds) {
|
|
221
|
+
await client.unenrollMfa({ userId: user.id, mfaFactorId: factorId });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
```
|
|
176
225
|
|
|
177
226
|
### gqlOperations
|
|
178
227
|
|
|
@@ -187,6 +236,8 @@ defineIdp("my-idp", {
|
|
|
187
236
|
update: true,
|
|
188
237
|
delete: false,
|
|
189
238
|
sendPasswordResetEmail: false,
|
|
239
|
+
requestMfaSettingsUrl: false,
|
|
240
|
+
unenrollMfa: false,
|
|
190
241
|
},
|
|
191
242
|
});
|
|
192
243
|
```
|
|
@@ -198,8 +249,10 @@ defineIdp("my-idp", {
|
|
|
198
249
|
- `update` - The `_updateUser` mutation.
|
|
199
250
|
- `delete` - The `_deleteUser` mutation.
|
|
200
251
|
- `sendPasswordResetEmail` - The `_sendPasswordResetEmail` mutation.
|
|
252
|
+
- `requestMfaSettingsUrl` - The `_requestMfaSettingsUrl` query that issues a self-service URL for MFA settings.
|
|
253
|
+
- `unenrollMfa` - The `_unenrollMfa` mutation that removes a user's enrolled MFA factor. When set to `false`, `permission.unenrollMfa` may be omitted even with `userAuthPolicy.enableMfa: true`.
|
|
201
254
|
|
|
202
|
-
**Shortcut:** pass the string `"query"` to expose a read-only IdP. It enables `read` and disables every mutation.
|
|
255
|
+
**Shortcut:** pass the string `"query"` to expose a read-only IdP. It enables the queries (`read`, `requestMfaSettingsUrl`) and disables every mutation.
|
|
203
256
|
|
|
204
257
|
```typescript
|
|
205
258
|
defineIdp("my-idp", {
|
|
@@ -108,7 +108,7 @@ Define input/output schemas using methods of `t` object. Basic usage and support
|
|
|
108
108
|
You can reuse fields defined with `db` object, but note that unsupported options will be ignored:
|
|
109
109
|
|
|
110
110
|
```typescript
|
|
111
|
-
const user = db.
|
|
111
|
+
const user = db.table("User", {
|
|
112
112
|
name: db.string().unique(),
|
|
113
113
|
age: db.int(),
|
|
114
114
|
});
|
|
@@ -208,7 +208,7 @@ Validation functions receive:
|
|
|
208
208
|
|
|
209
209
|
- `value` - The field value being validated
|
|
210
210
|
- `data` - The entire input object
|
|
211
|
-
- `
|
|
211
|
+
- `invoker` - The principal performing the operation
|
|
212
212
|
|
|
213
213
|
You can specify validation as:
|
|
214
214
|
|
|
@@ -234,8 +234,8 @@ Validation runs automatically before the `body` function executes. When validati
|
|
|
234
234
|
Define actual resolver logic in the `body` function. Function arguments include:
|
|
235
235
|
|
|
236
236
|
- `input` - Input data from GraphQL request
|
|
237
|
-
- `
|
|
238
|
-
- `invoker` - The principal running this function; equals `
|
|
237
|
+
- `caller` - The user or machine user who called this resolver; unaffected by `invoker`. `null` for anonymous calls.
|
|
238
|
+
- `invoker` - The principal running this function; equals `caller` by default, or the machine user configured through the resolver `invoker` option. `null` for anonymous calls.
|
|
239
239
|
- `env` - Environment variables declared in `tailor.config.ts`
|
|
240
240
|
|
|
241
241
|
### Using Kysely for Database Access
|
|
@@ -306,7 +306,7 @@ createResolver({
|
|
|
306
306
|
|
|
307
307
|
- When `publishEvents: true`, resolver execution events are published
|
|
308
308
|
- When not specified, it is **automatically set to `true`** if an executor uses this resolver with `resolverExecutedTrigger`
|
|
309
|
-
- When explicitly set to `false` while an executor uses this resolver, an error is thrown during `tailor
|
|
309
|
+
- When explicitly set to `false` while an executor uses this resolver, an error is thrown during `tailor deploy`
|
|
310
310
|
|
|
311
311
|
**Use cases:**
|
|
312
312
|
|
|
@@ -350,9 +350,63 @@ createResolver({
|
|
|
350
350
|
});
|
|
351
351
|
```
|
|
352
352
|
|
|
353
|
+
## Permissions
|
|
354
|
+
|
|
355
|
+
### Access Requirement (`permission`)
|
|
356
|
+
|
|
357
|
+
By default, a resolver with no in-body check is reachable by an anonymous (unauthenticated) caller. Set `permission` to reject callers that don't match a condition, evaluated before `body` runs:
|
|
358
|
+
|
|
359
|
+
```typescript
|
|
360
|
+
import { createResolver, t } from "@tailor-platform/sdk";
|
|
361
|
+
|
|
362
|
+
export default createResolver({
|
|
363
|
+
name: "getMyOrders",
|
|
364
|
+
operation: "query",
|
|
365
|
+
permission: [{ conditions: [[{ user: "_loggedIn" }, "=", true]], permit: true }],
|
|
366
|
+
output: t.object({ count: t.int() }),
|
|
367
|
+
body: async (context) => {
|
|
368
|
+
// context.user is guaranteed to be an authenticated caller here
|
|
369
|
+
return { count: 0 };
|
|
370
|
+
},
|
|
371
|
+
});
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
`permission` uses the same `conditions`/`permit` notation as TailorDB's `.permission()` — an array of policies, restricted to `user` operands (a resolver has no associated record to compare against) with equality (`=`/`!=`) comparisons:
|
|
375
|
+
|
|
376
|
+
- `{ user: "_loggedIn" }` — whether the caller is authenticated
|
|
377
|
+
- `{ user: "id" }` — the caller's user ID
|
|
378
|
+
- `{ user: "someAttribute" }` — any string or boolean attribute enabled in `auth.userProfile.attributes` (or `auth.machineUserAttributes` for machine users); array attributes aren't supported, since conditions only compare against a single string/boolean value
|
|
379
|
+
|
|
380
|
+
Multiple conditions within the same policy's `conditions` array are combined with AND. `permit` is required, with no implicit default. At least one `permit: true` policy is required: `permission` is an allow-list, denied by default and granted only by a matching `permit: true` policy. This lets you express different eligibility paths, e.g. allowing machine-user callers unconditionally while gating regular users behind a role check:
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
permission: [
|
|
384
|
+
{ conditions: [[{ user: "isServiceAccount" }, "=", true]], permit: true },
|
|
385
|
+
{ conditions: [[{ user: "role" }, "=", "ADMIN"]], permit: true },
|
|
386
|
+
],
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
A `permit: false` policy always denies matching callers, even ones another policy would otherwise allow. Combine it with a `permit: true` policy to carve out an explicit exception, e.g. granting access broadly but rejecting one banned role:
|
|
390
|
+
|
|
391
|
+
```typescript
|
|
392
|
+
permission: [
|
|
393
|
+
{ conditions: [[{ user: "_loggedIn" }, "=", true]], permit: true },
|
|
394
|
+
{ conditions: [[{ user: "role" }, "=", "BANNED"]], permit: false },
|
|
395
|
+
],
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
A policy array made up of only `permit: false` policies is rejected: since none of its conditions apply to a caller presenting no user attributes at all, it wouldn't actually keep anyone out who's willing to drop their credentials, so it can't stand in for an allow-list.
|
|
399
|
+
|
|
400
|
+
Besides a policy array, `permission` also accepts:
|
|
401
|
+
|
|
402
|
+
- `"allowAnonymous"` — explicitly documents that anonymous callers are allowed. Behaves the same as omitting `permission`, but records the decision so it isn't mistaken for an oversight.
|
|
403
|
+
- Omitted (default) — unchanged: anonymous callers can still reach the resolver.
|
|
404
|
+
|
|
405
|
+
This check is based on `context.user`, the original caller, so it still applies even when `authInvoker` swaps in a machine user for database access.
|
|
406
|
+
|
|
353
407
|
## Authentication
|
|
354
408
|
|
|
355
|
-
Specify an `
|
|
409
|
+
Specify an `invoker` to execute the resolver with machine user credentials. Pass the machine user name as a plain string — it is type-narrowed to the names you defined in your auth config:
|
|
356
410
|
|
|
357
411
|
```typescript
|
|
358
412
|
import { createResolver, t } from "@tailor-platform/sdk";
|
|
@@ -365,10 +419,10 @@ export default createResolver({
|
|
|
365
419
|
// Executes as "batch-processor" machine user
|
|
366
420
|
return { result: "ok" };
|
|
367
421
|
},
|
|
368
|
-
|
|
422
|
+
invoker: "batch-processor",
|
|
369
423
|
});
|
|
370
424
|
```
|
|
371
425
|
|
|
372
426
|
The machine user name is looked up in the auth service configured on your app (`machineUsers` in `defineAuth`). The namespace is resolved automatically — no need to import `auth` from `tailor.config.ts` in resolver files.
|
|
373
427
|
|
|
374
|
-
**Note:** `
|
|
428
|
+
**Note:** The `invoker` option controls the permissions for database operations and other platform actions. The `caller` object passed to `body` still reflects the original caller, while the `invoker` body field reflects the principal actually running the body.
|
package/docs/services/secret.md
CHANGED
|
@@ -34,11 +34,11 @@ Secrets are key-value pairs stored within a vault. Secret values are encrypted a
|
|
|
34
34
|
|
|
35
35
|
## Managing Secrets
|
|
36
36
|
|
|
37
|
-
There are two ways to manage secrets: declaratively via `defineSecretManager()` in `tailor.config.ts`, or imperatively via the [CLI](#cli-management). Management is scoped per vault — **do not mix both approaches for the same vault**. When a vault is defined in config, the config becomes the source of truth: any secrets in that vault not present in the config will be deleted on `tailor
|
|
37
|
+
There are two ways to manage secrets: declaratively via `defineSecretManager()` in `tailor.config.ts`, or imperatively via the [CLI](#cli-management). Management is scoped per vault — **do not mix both approaches for the same vault**. When a vault is defined in config, the config becomes the source of truth: any secrets in that vault not present in the config will be deleted on `tailor deploy`.
|
|
38
38
|
|
|
39
39
|
### Declarative Configuration
|
|
40
40
|
|
|
41
|
-
Define your secrets in `tailor.config.ts` using `defineSecretManager()`. Each key is a vault name, and its value is a record of secret names to their values. These values are deployed to each vault on `tailor
|
|
41
|
+
Define your secrets in `tailor.config.ts` using `defineSecretManager()`. Each key is a vault name, and its value is a record of secret names to their values. These values are deployed to each vault on `tailor deploy`.
|
|
42
42
|
|
|
43
43
|
Since secret values should not be committed to source control, use environment variables:
|
|
44
44
|
|
|
@@ -87,7 +87,7 @@ When `ignoreNullishValues: true`:
|
|
|
87
87
|
- Skipped secrets are shown in the deploy output for visibility
|
|
88
88
|
- Secrets removed from the config entirely are still deleted (orphan cleanup)
|
|
89
89
|
|
|
90
|
-
This allows you to set secret values once (e.g., via local `tailor
|
|
90
|
+
This allows you to set secret values once (e.g., via local `tailor deploy` or the CLI) and then deploy from CI without needing the actual values in CI environment variables.
|
|
91
91
|
|
|
92
92
|
## Using Secrets
|
|
93
93
|
|
|
@@ -175,25 +175,25 @@ At runtime, these references are replaced with the actual secret values.
|
|
|
175
175
|
|
|
176
176
|
Use the CLI to manage vaults that are **not** defined in `defineSecretManager()`. If you attempt to modify a vault that is managed by the config, the CLI will show a warning and ask for confirmation. Once confirmed, the CLI releases the vault's ownership label so it is no longer managed by config.
|
|
177
177
|
|
|
178
|
-
After ownership is released, the next `tailor
|
|
178
|
+
After ownership is released, the next `tailor deploy` will treat the vault as an unmanaged resource and prompt for confirmation before taking any action on it.
|
|
179
179
|
|
|
180
180
|
### Create a Vault
|
|
181
181
|
|
|
182
182
|
```bash
|
|
183
|
-
tailor
|
|
183
|
+
tailor secret vault create --name api-keys
|
|
184
184
|
```
|
|
185
185
|
|
|
186
186
|
### Add Secrets
|
|
187
187
|
|
|
188
188
|
```bash
|
|
189
189
|
# Create a secret
|
|
190
|
-
tailor
|
|
190
|
+
tailor secret create \
|
|
191
191
|
--vault-name api-keys \
|
|
192
192
|
--name stripe-secret-key \
|
|
193
193
|
--value sk_live_xxxxx
|
|
194
194
|
|
|
195
195
|
# Update a secret
|
|
196
|
-
tailor
|
|
196
|
+
tailor secret update \
|
|
197
197
|
--vault-name api-keys \
|
|
198
198
|
--name stripe-secret-key \
|
|
199
199
|
--value sk_live_yyyyy
|
|
@@ -203,20 +203,20 @@ tailor-sdk secret update \
|
|
|
203
203
|
|
|
204
204
|
```bash
|
|
205
205
|
# List vaults
|
|
206
|
-
tailor
|
|
206
|
+
tailor secret vault list
|
|
207
207
|
|
|
208
208
|
# List secrets in a vault (values are hidden)
|
|
209
|
-
tailor
|
|
209
|
+
tailor secret list --vault-name api-keys
|
|
210
210
|
```
|
|
211
211
|
|
|
212
212
|
### Delete Secrets
|
|
213
213
|
|
|
214
214
|
```bash
|
|
215
215
|
# Delete a secret
|
|
216
|
-
tailor
|
|
216
|
+
tailor secret delete --vault-name api-keys --name old-key --yes
|
|
217
217
|
|
|
218
218
|
# Delete a vault (must be empty)
|
|
219
|
-
tailor
|
|
219
|
+
tailor secret vault delete --name old-vault --yes
|
|
220
220
|
```
|
|
221
221
|
|
|
222
222
|
See [Secret CLI Commands](../cli/secret.md) for full documentation.
|
|
@@ -72,7 +72,7 @@ defineStaticWebSite("my-website", {
|
|
|
72
72
|
});
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
-
After deploying, use `tailor
|
|
75
|
+
After deploying, use `tailor staticwebsite domain get <domain>` to check domain status and retrieve the CNAME targets required for DNS configuration.
|
|
76
76
|
|
|
77
77
|
A domain can be associated with only one workspace at a time. To set custom domains only in the workspace that owns the domain, see [Multi-Environment Configuration](../multi-environment.md#settings-that-belong-to-a-single-environment).
|
|
78
78
|
|
|
@@ -124,8 +124,14 @@ const website = defineStaticWebSite("my-frontend", {
|
|
|
124
124
|
});
|
|
125
125
|
|
|
126
126
|
const idp = defineIdp("my-idp", {
|
|
127
|
-
authorization: "loggedIn",
|
|
128
127
|
clients: ["default-client"],
|
|
128
|
+
permission: {
|
|
129
|
+
create: [{ conditions: [[{ user: "_loggedIn" }, "=", true]], permit: true }],
|
|
130
|
+
read: [{ conditions: [[{ user: "_loggedIn" }, "=", true]], permit: true }],
|
|
131
|
+
update: [{ conditions: [[{ user: "_loggedIn" }, "=", true]], permit: true }],
|
|
132
|
+
delete: [{ conditions: [[{ user: "_loggedIn" }, "=", true]], permit: true }],
|
|
133
|
+
sendPasswordResetEmail: [{ conditions: [[{ user: "_loggedIn" }, "=", true]], permit: true }],
|
|
134
|
+
},
|
|
129
135
|
});
|
|
130
136
|
|
|
131
137
|
const auth = defineAuth("my-auth", {
|
|
@@ -12,7 +12,7 @@ For the CLI command reference, see [`tailordb migration`](../cli/tailordb.md#tai
|
|
|
12
12
|
|
|
13
13
|
- **Local snapshot–based diff detection** — each migration is generated by diffing your current type definitions against the previous snapshot stored in `migrations/<NNNN>/`.
|
|
14
14
|
- **Transaction-wrapped data migrations** — each `migrate.ts` script runs inside a database transaction on the platform; if the script throws, all changes in that migration roll back.
|
|
15
|
-
- **Automatic execution during `apply`** — `tailor
|
|
15
|
+
- **Automatic execution during `apply`** — `tailor deploy` detects pending migrations, runs the two-stage type update (pre-migration → script → post-migration), and updates the migration checkpoint label.
|
|
16
16
|
- **Type-safe scripts** — the generated `db.ts` provides Kysely types that reflect the schema state **before** the migration runs, so transformations are written against the actual data shape.
|
|
17
17
|
|
|
18
18
|
**Files in `migrations/`**
|
|
@@ -42,24 +42,24 @@ When you start with no `migrations/` directory:
|
|
|
42
42
|
2. Define your initial types in `tailordb/`.
|
|
43
43
|
3. Generate the initial migration:
|
|
44
44
|
```bash
|
|
45
|
-
tailor
|
|
45
|
+
tailor tailordb migration generate
|
|
46
46
|
```
|
|
47
47
|
This creates `migrations/0000/schema.json` from your current types.
|
|
48
|
-
4. Run `tailor
|
|
48
|
+
4. Run `tailor deploy`. The migration label is set to `0000` on the deployed namespace.
|
|
49
49
|
|
|
50
50
|
### Adding migrations to an existing project
|
|
51
51
|
|
|
52
52
|
If you already have a deployed workspace whose schema matches your local type definitions:
|
|
53
53
|
|
|
54
54
|
1. Add the `migration` block to `tailor.config.ts`.
|
|
55
|
-
2. Run `tailor
|
|
56
|
-
3. Run `tailor
|
|
55
|
+
2. Run `tailor tailordb migration generate` to create `0000/schema.json` from current local types.
|
|
56
|
+
3. Run `tailor deploy`. Because remote schema already matches, no script runs; only the migration label is set.
|
|
57
57
|
|
|
58
58
|
If your local types and remote schema have **diverged**, reconcile them before introducing migrations — either update local types to match remote, or accept that the first non-`0000` migration will reflect that gap.
|
|
59
59
|
|
|
60
60
|
### Resetting
|
|
61
61
|
|
|
62
|
-
`tailor
|
|
62
|
+
`tailor tailordb migration generate --init` deletes the existing `migrations/` directory and starts over from `0000`. Use this only on projects that are not yet deployed, or when you have decided to re-baseline (the next `apply` will see all migrations as new and require coordination — see [Resetting a deployed project](#resetting-a-deployed-project)).
|
|
63
63
|
|
|
64
64
|
## Migration Workflow
|
|
65
65
|
|
|
@@ -69,7 +69,7 @@ A typical change cycle:
|
|
|
69
69
|
|
|
70
70
|
```typescript
|
|
71
71
|
// tailordb/user.ts
|
|
72
|
-
export const user = db.
|
|
72
|
+
export const user = db.table("User", {
|
|
73
73
|
name: db.string(),
|
|
74
74
|
email: db.string(), // ← new required field
|
|
75
75
|
...db.fields.timestamps(),
|
|
@@ -79,7 +79,7 @@ A typical change cycle:
|
|
|
79
79
|
2. **Generate the migration.**
|
|
80
80
|
|
|
81
81
|
```bash
|
|
82
|
-
tailor
|
|
82
|
+
tailor tailordb migration generate --name "add email to user"
|
|
83
83
|
```
|
|
84
84
|
|
|
85
85
|
Output:
|
|
@@ -109,7 +109,7 @@ A typical change cycle:
|
|
|
109
109
|
|
|
110
110
|
4. **Apply.**
|
|
111
111
|
```bash
|
|
112
|
-
tailor
|
|
112
|
+
tailor deploy
|
|
113
113
|
```
|
|
114
114
|
The pre-migration phase relaxes the new field to optional, the script runs and populates values, then the post-migration phase enforces `required: true`.
|
|
115
115
|
|
|
@@ -126,10 +126,20 @@ Warning: data loss possible:
|
|
|
126
126
|
No `migrate.ts` is generated automatically because the schema change itself is non-breaking, but the existing data is dropped during the post-migration phase. If you need to preserve or transform that data first (for example, copy a column into another table before it disappears), add a script with:
|
|
127
127
|
|
|
128
128
|
```bash
|
|
129
|
-
tailor
|
|
129
|
+
tailor tailordb migration script 0002
|
|
130
130
|
```
|
|
131
131
|
|
|
132
|
-
This writes `migrations/0002/migrate.ts` and `migrations/0002/db.ts` next to the existing `diff.json`. The removed field stays readable inside `migrate.ts` because the pre-migration phase keeps it on the type until the script finishes (see [Per-migration phases](#per-migration-phases)). The next `tailor
|
|
132
|
+
This writes `migrations/0002/migrate.ts` and `migrations/0002/db.ts` next to the existing `diff.json`. The removed field stays readable inside `migrate.ts` because the pre-migration phase keeps it on the type until the script finishes (see [Per-migration phases](#per-migration-phases)). The next `tailor deploy` runs the script automatically — `migrate.ts` is executed whenever the file exists on disk, regardless of whether the diff itself required it.
|
|
133
|
+
|
|
134
|
+
### Breaking changes without a script
|
|
135
|
+
|
|
136
|
+
Breaking changes require `migrate.ts`. If it is missing at deploy time (for example, the generated script was deleted), `tailor-sdk deploy` fails before applying the migration or anything after it. When there is genuinely nothing to migrate — say, the affected type holds no data yet — record an explicit acknowledgment instead of keeping an empty script:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
tailor-sdk tailordb migration script 0002 --no-script --reason "no data yet, safe to skip"
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
This stores the reason in `migrations/0002/diff.json` (commit the change). The next `tailor-sdk deploy` applies the schema change as usual, skips only the script step, and logs the recorded reason. The command refuses to record a skip while `migrate.ts` exists — delete the script first. If `migrate.ts` is added back later, the script takes precedence over the acknowledgment and runs.
|
|
133
143
|
|
|
134
144
|
## Configuration
|
|
135
145
|
|
|
@@ -220,10 +230,13 @@ The `env` values are injected at bundle time (the same mechanism as resolvers/ex
|
|
|
220
230
|
| Remove field | No | Optional | Warning tier — no script is auto-generated, but you can add one with `tailordb migration script` to preserve data before the field is dropped. The field stays readable from `migrate.ts` during Pre-migration and is dropped in Post-migration. |
|
|
221
231
|
| Change optional → required | Yes | Yes | Script sets defaults for null values |
|
|
222
232
|
| Change required → optional | No | No | Schema change only |
|
|
223
|
-
| Add index
|
|
224
|
-
|
|
|
233
|
+
| Add index (non-unique) | No | No | Schema change only |
|
|
234
|
+
| Add unique index | Yes | Yes | Script must resolve duplicate value combinations across the index fields |
|
|
235
|
+
| Change unique index fields | Yes | Yes | Treated like adding a new unique constraint over the new field set |
|
|
236
|
+
| Remove index | No | No | Schema change only (removing the unique constraint from an index is also non-breaking) |
|
|
225
237
|
| Add unique constraint | Yes | Yes | Script must resolve duplicate values |
|
|
226
238
|
| Remove unique constraint | No | No | Schema change only |
|
|
239
|
+
| Change decimal scale | Yes | Yes | Auto-generated script re-saves existing rows under the new scale. Decreasing scale rounds values half-up and can lose precision. If the same change adds a unique constraint, duplicate handling runs after re-saving. |
|
|
227
240
|
| Add enum value | No | No | Schema change only |
|
|
228
241
|
| Remove enum value | Yes | Yes | Script migrates records with removed values |
|
|
229
242
|
| Add type | No | No | Schema change only |
|
|
@@ -245,14 +258,14 @@ The same pattern works for switching between scalar and array.
|
|
|
245
258
|
|
|
246
259
|
## Automatic Migration Execution
|
|
247
260
|
|
|
248
|
-
When you run `tailor
|
|
261
|
+
When you run `tailor deploy`, the SDK detects pending migrations (anything past the current `sdk-migration` label on the deployed namespace) and runs them in order before continuing with the rest of the apply.
|
|
249
262
|
|
|
250
263
|
### Per-migration phases
|
|
251
264
|
|
|
252
265
|
For each pending migration:
|
|
253
266
|
|
|
254
|
-
1. **Pre-migration**: Type changes that would be breaking are applied in a relaxed form first. Newly-required fields are added as optional; fields whose `optional → required` transition is breaking are temporarily kept optional. Fields that are being removed in this migration are temporarily kept on the type so that `migrate.ts` can still read them (for example, to `innerJoin` through a foreign key that is about to be dropped). Non-breaking changes that are part of the same migration are also applied here.
|
|
255
|
-
2. **Script execution**: If `migrate.ts` exists on disk for this migration, it is bundled and sent to the platform via the script execution API and runs as the configured machine user inside a transaction. The script is hard-required for breaking changes (`diff.requiresMigrationScript`)
|
|
267
|
+
1. **Pre-migration**: Type changes that would be breaking are applied in a relaxed form first. Newly-required fields are added as optional; fields whose `optional → required` transition is breaking are temporarily kept optional. Fields that are being removed in this migration are temporarily kept on the type so that `migrate.ts` can still read them (for example, to `innerJoin` through a foreign key that is about to be dropped). Breaking type-level index changes are relaxed the same way: a newly-added unique index is withheld, and an index gaining a unique constraint (or a unique index changing its field set) keeps its previous definition, so `migrate.ts` can resolve duplicates first. Non-breaking changes that are part of the same migration are also applied here.
|
|
268
|
+
2. **Script execution**: If `migrate.ts` exists on disk for this migration, it is bundled and sent to the platform via the script execution API and runs as the configured machine user inside a transaction. The script is hard-required for breaking changes (`diff.requiresMigrationScript`) — deploy fails if the file is missing, unless a `--no-script` acknowledgment was recorded (see [Breaking changes without a script](#breaking-changes-without-a-script)). It is also executed when present for warning-tier diffs — see [Warnings and optional migration scripts](#warnings-and-optional-migration-scripts).
|
|
256
269
|
3. **Post-migration**: Required constraints are enforced; field and type deletions are applied (the columns/tables are physically dropped here); the `sdk-migration` label is bumped to this migration's number.
|
|
257
270
|
|
|
258
271
|
This split is what allows existing rows to be backfilled before the database starts rejecting nulls, and what lets `migrate.ts` traverse foreign-key fields that the same migration removes.
|
|
@@ -275,10 +288,12 @@ Namespace: tailordb
|
|
|
275
288
|
- Field 'email': required: remote=false, expected=true
|
|
276
289
|
```
|
|
277
290
|
|
|
291
|
+
The error also points you at `migration status`, `migration generate`, `migration sync`, and `migration set` — see [Remote schema drift detected](#remote-schema-drift-detected) for which one applies.
|
|
292
|
+
|
|
278
293
|
To bypass both checks (not recommended outside of recovery scenarios):
|
|
279
294
|
|
|
280
295
|
```bash
|
|
281
|
-
tailor
|
|
296
|
+
tailor deploy --no-schema-check
|
|
282
297
|
```
|
|
283
298
|
|
|
284
299
|
### Example output
|
|
@@ -297,7 +312,7 @@ tailor-sdk deploy --no-schema-check
|
|
|
297
312
|
|
|
298
313
|
## `migration set` Semantics
|
|
299
314
|
|
|
300
|
-
`tailor
|
|
315
|
+
`tailor tailordb migration set <N>` updates the `sdk-migration` label on the deployed namespace's metadata. **It does not modify any data or schema.** It only changes which migrations the next `apply` will consider pending.
|
|
301
316
|
|
|
302
317
|
| Movement | Effect on next `apply` | Effect on data |
|
|
303
318
|
| -------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------- |
|
|
@@ -314,7 +329,7 @@ Use cases:
|
|
|
314
329
|
|
|
315
330
|
## `migration sync` Semantics
|
|
316
331
|
|
|
317
|
-
`tailor
|
|
332
|
+
`tailor tailordb migration sync <N>` reconstructs the schema snapshot at migration `N` from the working tree's migration history and **overwrites the remote schema to match it**, then sets the `sdk-migration` label to `N`. Unlike `migration set`, it changes the remote schema as well as the bookkeeping. Like `set`, it never runs `migrate.ts` scripts itself — it only changes what the next `apply` considers pending:
|
|
318
333
|
|
|
319
334
|
| Movement | Effect on next `apply` | Effect on data |
|
|
320
335
|
| -------------------------------- | ----------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
@@ -325,7 +340,7 @@ Before anything is sent to the remote, `sync` verifies that replaying the full m
|
|
|
325
340
|
|
|
326
341
|
Because syncing backward causes already-applied scripts to re-execute on the next deploy, **write `migrate.ts` scripts to be idempotent** (see [Performance and Large Tables](#performance-and-large-tables) for resumable `where` clauses).
|
|
327
342
|
|
|
328
|
-
The main use case is recovering from drift after a `deploy --no-schema-check` from an older revision: instead of checking out that revision, run `migration sync <N>` to restore the remote to a known snapshot, then `tailor
|
|
343
|
+
The main use case is recovering from drift after a `deploy --no-schema-check` from an older revision: instead of checking out that revision, run `migration sync <N>` to restore the remote to a known snapshot, then `tailor deploy` to apply the remaining migrations from the working tree.
|
|
329
344
|
|
|
330
345
|
## Team Workflow and CI/CD
|
|
331
346
|
|
|
@@ -340,7 +355,7 @@ Migration numbers are assigned sequentially, so two developers branching off the
|
|
|
340
355
|
### CI / CD
|
|
341
356
|
|
|
342
357
|
- For non-interactive environments, pass `--yes` to `migration generate` and `--yes` to `apply`. `apply` runs migrations automatically when the `migrations/` directory is configured.
|
|
343
|
-
- Run `tailor
|
|
358
|
+
- Run `tailor tailordb migration status` in CI to detect "developer forgot to commit a migration" situations early. The exit code is non-zero only on errors, so check the output.
|
|
344
359
|
- Avoid running migrations in parallel against the same workspace — there is no locking. Serialize deploys per environment.
|
|
345
360
|
|
|
346
361
|
### Resetting a deployed project
|
|
@@ -348,8 +363,8 @@ Migration numbers are assigned sequentially, so two developers branching off the
|
|
|
348
363
|
`migration generate --init` is destructive locally but does not touch the deployed workspace. Re-baselining a deployed project requires:
|
|
349
364
|
|
|
350
365
|
1. Run `migration generate --init` to start over from `0000`.
|
|
351
|
-
2. Run `tailor
|
|
352
|
-
3. Run `tailor
|
|
366
|
+
2. Run `tailor tailordb migration set 0` against the deployed namespace.
|
|
367
|
+
3. Run `tailor deploy` — the new `0000` becomes the baseline.
|
|
353
368
|
|
|
354
369
|
Coordinate this with your team because everyone else's local migrations will be invalidated.
|
|
355
370
|
|
|
@@ -367,7 +382,7 @@ After a failure:
|
|
|
367
382
|
|
|
368
383
|
1. Read the `Logs:` block in the apply output to find the cause.
|
|
369
384
|
2. Fix `migrate.ts` (or the data it depends on).
|
|
370
|
-
3. Re-run `tailor
|
|
385
|
+
3. Re-run `tailor deploy`. The same migration runs again because its label was never bumped, and the prior-checkpoint schema is a clean baseline to retry against.
|
|
371
386
|
|
|
372
387
|
If a migration **succeeds in script** but the **post-migration phase** fails (rare; usually a constraint violation the script should have prevented), the pre-migration changes are **not** rolled back: the script's data changes are already committed and the post-migration phase may have dropped removed columns or types, which cannot be reverted without data loss. Investigate, fix, and re-run.
|
|
373
388
|
|
|
@@ -396,7 +411,7 @@ The machine user needs read/write access to every type the migration script touc
|
|
|
396
411
|
|
|
397
412
|
If you see `No machine user available for migration execution`, either:
|
|
398
413
|
|
|
399
|
-
- Add `machineUsers: { ... }` to your auth config and `tailor
|
|
414
|
+
- Add `machineUsers: { ... }` to your auth config and `tailor deploy` it, or
|
|
400
415
|
- Set `migration.machineUser` to an existing machine user name in the db config.
|
|
401
416
|
|
|
402
417
|
## Multi-Namespace Coordination
|
|
@@ -439,7 +454,7 @@ For genuinely different schemas across environments, prefer separate workspaces
|
|
|
439
454
|
|
|
440
455
|
**Resolution:**
|
|
441
456
|
|
|
442
|
-
1. `tailor
|
|
457
|
+
1. `tailor tailordb migration status` to see local vs remote.
|
|
443
458
|
2. Compare with teammates — has someone applied different migrations?
|
|
444
459
|
3. If remote was changed manually, decide whether to update local migrations to match or to use `migration set <N>` to align bookkeeping.
|
|
445
460
|
4. To force the remote schema back to a known snapshot, use `migration sync <N>` (see [`migration sync` Semantics](#migration-sync-semantics)).
|
|
@@ -471,10 +486,10 @@ For genuinely different schemas across environments, prefer separate workspaces
|
|
|
471
486
|
|
|
472
487
|
**Cause:** Runtime error in your `migrate.ts`, a permission error from the machine user, or a constraint violation when post-migration tightens types.
|
|
473
488
|
|
|
474
|
-
**Resolution:** Read the `Logs:` block. Fix the script or the data assumption it relies on, and re-run `tailor
|
|
489
|
+
**Resolution:** Read the `Logs:` block. Fix the script or the data assumption it relies on, and re-run `tailor deploy`. The label is not bumped on failure, so the same migration retries.
|
|
475
490
|
|
|
476
491
|
### `migrate.ts` not found for a migration that needs one
|
|
477
492
|
|
|
478
493
|
**Cause:** `diff.requiresMigrationScript` is true but `migrate.ts` is missing from the migration directory.
|
|
479
494
|
|
|
480
|
-
**Resolution:**
|
|
495
|
+
**Resolution:** Restore the file from version control, or create it with `tailor-sdk tailordb migration script <N> --namespace <namespace>`. If the migration intentionally needs no data transformation, record that decision with `tailor-sdk tailordb migration script <N> --namespace <namespace> --no-script --reason "<why no data migration is needed>"` instead.
|