@tailor-platform/sdk 1.17.0 → 1.18.0

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.
Files changed (76) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/application-Csj7Ow5Q.mjs +8 -0
  3. package/dist/{application-DYfVZVPT.mjs → application-gWUyKuzv.mjs} +211 -1653
  4. package/dist/{application-DYfVZVPT.mjs.map → application-gWUyKuzv.mjs.map} +1 -1
  5. package/dist/brand-BZJCv6UY.mjs +28 -0
  6. package/dist/brand-BZJCv6UY.mjs.map +1 -0
  7. package/dist/cli/index.mjs +38 -20
  8. package/dist/cli/index.mjs.map +1 -1
  9. package/dist/cli/lib.d.mts +20 -33
  10. package/dist/cli/lib.mjs +10 -5
  11. package/dist/cli/lib.mjs.map +1 -1
  12. package/dist/configure/index.d.mts +4 -4
  13. package/dist/configure/index.mjs +10 -19
  14. package/dist/configure/index.mjs.map +1 -1
  15. package/dist/enum-constants-Cwd4qdpa.mjs +115 -0
  16. package/dist/enum-constants-Cwd4qdpa.mjs.map +1 -0
  17. package/dist/file-utils-cqcpFk87.mjs +139 -0
  18. package/dist/file-utils-cqcpFk87.mjs.map +1 -0
  19. package/dist/index-BKXch-td.d.mts +18 -0
  20. package/dist/index-C3Ib7pFc.d.mts +18 -0
  21. package/dist/{index-qQXpN674.d.mts → index-DP8EB9FK.d.mts} +13 -5
  22. package/dist/index-SqWgrTnF.d.mts +20 -0
  23. package/dist/index-sSDpuVQY.d.mts +18 -0
  24. package/dist/{jiti-BrELlEYT.mjs → jiti-DHlauMCo.mjs} +2 -2
  25. package/dist/{jiti-BrELlEYT.mjs.map → jiti-DHlauMCo.mjs.map} +1 -1
  26. package/dist/{job-CULA2Pvf.mjs → job-2Q82qQ6N.mjs} +27 -5
  27. package/dist/job-2Q82qQ6N.mjs.map +1 -0
  28. package/dist/kysely-type-DtUUoAi3.mjs +259 -0
  29. package/dist/kysely-type-DtUUoAi3.mjs.map +1 -0
  30. package/dist/plugin/builtin/enum-constants/index.d.mts +4 -0
  31. package/dist/plugin/builtin/enum-constants/index.mjs +3 -0
  32. package/dist/plugin/builtin/file-utils/index.d.mts +4 -0
  33. package/dist/plugin/builtin/file-utils/index.mjs +3 -0
  34. package/dist/plugin/builtin/kysely-type/index.d.mts +4 -0
  35. package/dist/plugin/builtin/kysely-type/index.mjs +3 -0
  36. package/dist/plugin/builtin/seed/index.d.mts +4 -0
  37. package/dist/plugin/builtin/seed/index.mjs +3 -0
  38. package/dist/plugin/index.d.mts +3 -3
  39. package/dist/plugin/index.mjs +11 -11
  40. package/dist/plugin/index.mjs.map +1 -1
  41. package/dist/{schema-R5TxC5Pn.mjs → schema-WDvc7Zel.mjs} +4 -3
  42. package/dist/schema-WDvc7Zel.mjs.map +1 -0
  43. package/dist/seed-Dm7lrGZ3.mjs +1050 -0
  44. package/dist/seed-Dm7lrGZ3.mjs.map +1 -0
  45. package/dist/{src-DMROgdcL.mjs → src-i4uqS1G4.mjs} +2 -2
  46. package/dist/{src-DMROgdcL.mjs.map → src-i4uqS1G4.mjs.map} +1 -1
  47. package/dist/types-Bhl_wAM2.d.mts +151 -0
  48. package/dist/{types-b-ig8nW_.mjs → types-ClK_HJ0G.mjs} +1 -1
  49. package/dist/{types-b-ig8nW_.mjs.map → types-ClK_HJ0G.mjs.map} +1 -1
  50. package/dist/{types-DzvazVmg.d.mts → types-DdvTxFiD.d.mts} +1380 -1044
  51. package/dist/{update-DQKCUNmr.mjs → update-BoNKMti-.mjs} +285 -112
  52. package/dist/update-BoNKMti-.mjs.map +1 -0
  53. package/dist/utils/test/index.d.mts +4 -4
  54. package/dist/utils/test/index.mjs +3 -2
  55. package/dist/utils/test/index.mjs.map +1 -1
  56. package/docs/cli/application.md +106 -14
  57. package/docs/cli/auth.md +92 -12
  58. package/docs/cli/completion.md +18 -2
  59. package/docs/cli/executor.md +122 -14
  60. package/docs/cli/function.md +32 -4
  61. package/docs/cli/secret.md +134 -18
  62. package/docs/cli/staticwebsite.md +60 -8
  63. package/docs/cli/tailordb.md +148 -20
  64. package/docs/cli/user.md +154 -22
  65. package/docs/cli/workflow.md +100 -12
  66. package/docs/cli/workspace.md +274 -38
  67. package/docs/generator/custom.md +2 -2
  68. package/docs/plugin/custom.md +270 -163
  69. package/docs/plugin/index.md +48 -2
  70. package/package.json +22 -2
  71. package/dist/application-D5ZEr4zk.mjs +0 -4
  72. package/dist/job-CULA2Pvf.mjs.map +0 -1
  73. package/dist/schema-R5TxC5Pn.mjs.map +0 -1
  74. package/dist/types-BeNtD-fA.d.mts +0 -369
  75. package/dist/update-DQKCUNmr.mjs.map +0 -1
  76. /package/dist/{chunk-GMkBE123.mjs → chunk-CqAI0b6X.mjs} +0 -0
@@ -1,5 +1,10 @@
1
- import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM, r as __exportAll, t as __commonJSMin } from "./chunk-GMkBE123.mjs";
2
- import { t as isPluginGeneratedType } from "./types-b-ig8nW_.mjs";
1
+ import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM, r as __exportAll, t as __commonJSMin } from "./chunk-CqAI0b6X.mjs";
2
+ import { t as isPluginGeneratedType } from "./types-ClK_HJ0G.mjs";
3
+ import { n as isSdkBranded } from "./brand-BZJCv6UY.mjs";
4
+ import { n as enumConstantsPlugin, t as EnumConstantsGeneratorID } from "./enum-constants-Cwd4qdpa.mjs";
5
+ import { n as fileUtilsPlugin, t as FileUtilsGeneratorID } from "./file-utils-cqcpFk87.mjs";
6
+ import { n as kyselyTypePlugin, t as KyselyGeneratorID } from "./kysely-type-DtUUoAi3.mjs";
7
+ import { n as seedPlugin, t as SeedGeneratorID } from "./seed-Dm7lrGZ3.mjs";
3
8
  import Module, { createRequire } from "node:module";
4
9
  import { z } from "zod";
5
10
  import * as fs$15 from "node:fs";
@@ -590,7 +595,7 @@ const file_tailor_v1_function_registry = /* @__PURE__ */ fileDesc("CiF0YWlsb3Ivd
590
595
  /**
591
596
  * Describes the file tailor/v1/idp_resource.proto.
592
597
  */
593
- const file_tailor_v1_idp_resource = /* @__PURE__ */ fileDesc("Chx0YWlsb3IvdjEvaWRwX3Jlc291cmNlLnByb3RvEgl0YWlsb3IudjEi3gEKCklkUFNlcnZpY2USJwoJbmFtZXNwYWNlGAEgASgLMhQudGFpbG9yLnYxLk5hbWVzcGFjZRIVCg1hdXRob3JpemF0aW9uGAIgASgJEhkKDHByb3ZpZGVyX3VybBgDIAEoCUID4EEDEjYKEHVzZXJfYXV0aF9wb2xpY3kYBCABKAsyHC50YWlsb3IudjEuSWRQVXNlckF1dGhQb2xpY3kSIAoEbGFuZxgFIAEoDjISLnRhaWxvci52MS5JZFBMYW5nEhsKE3B1Ymxpc2hfdXNlcl9ldmVudHMYBiABKAgiTQoJSWRQQ2xpZW50EgwKBG5hbWUYASABKAkSFgoJY2xpZW50X2lkGAIgASgJQgPgQQMSGgoNY2xpZW50X3NlY3JldBgDIAEoCUID4EEDIoYKChFJZFBVc2VyQXV0aFBvbGljeRIgChh1c2Vfbm9uX2VtYWlsX2lkZW50aWZpZXIYASABKAgSIQoZYWxsb3dfc2VsZl9wYXNzd29yZF9yZXNldBgCIAEoCBIiChpwYXNzd29yZF9yZXF1aXJlX3VwcGVyY2FzZRgDIAEoCBIiChpwYXNzd29yZF9yZXF1aXJlX2xvd2VyY2FzZRgEIAEoCBIpCiFwYXNzd29yZF9yZXF1aXJlX25vbl9hbHBoYW51bWVyaWMYBSABKAgSIAoYcGFzc3dvcmRfcmVxdWlyZV9udW1lcmljGAYgASgIEqYBChNwYXNzd29yZF9taW5fbGVuZ3RoGAcgASgFQogBukiEAboBgAEKGXBhc3N3b3JkX21pbl9sZW5ndGhfcmFuZ2USO3Bhc3N3b3JkX21pbl9sZW5ndGggbXVzdCBiZSAwIChkZWZhdWx0KSBvciBiZXR3ZWVuIDYgYW5kIDMwGiZ0aGlzID09IDAgfHwgKHRoaXMgPj0gNiAmJiB0aGlzIDw9IDMwKRKqAQoTcGFzc3dvcmRfbWF4X2xlbmd0aBgIIAEoBUKMAbpIiAG6AYQBChlwYXNzd29yZF9tYXhfbGVuZ3RoX3JhbmdlEj1wYXNzd29yZF9tYXhfbGVuZ3RoIG11c3QgYmUgMCAoZGVmYXVsdCkgb3IgYmV0d2VlbiA2IGFuZCA0MDk2Gih0aGlzID09IDAgfHwgKHRoaXMgPj0gNiAmJiB0aGlzIDw9IDQwOTYpEi8KFWFsbG93ZWRfZW1haWxfZG9tYWlucxgJIAMoCUIQukgNkgEKEGQYASIEcgJoARIaChJhbGxvd19nb29nbGVfb2F1dGgYCiABKAg68wS6SO8EGuoBChtwYXNzd29yZF9sZW5ndGhfY29uc2lzdGVuY3kSRXBhc3N3b3JkX21pbl9sZW5ndGggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGFzc3dvcmRfbWF4X2xlbmd0aBqDASh0aGlzLnBhc3N3b3JkX21pbl9sZW5ndGggPT0gMCA/IDYgOiB0aGlzLnBhc3N3b3JkX21pbl9sZW5ndGgpIDw9ICh0aGlzLnBhc3N3b3JkX21heF9sZW5ndGggPT0gMCA/IDQwOTYgOiB0aGlzLnBhc3N3b3JkX21heF9sZW5ndGgpGsYBCi9hbGxvd2VkX2VtYWlsX2RvbWFpbnNfcmVxdWlyZXNfZW1haWxfaWRlbnRpZmllchJJYWxsb3dlZF9lbWFpbF9kb21haW5zIGNhbm5vdCBiZSBzZXQgd2hlbiB1c2Vfbm9uX2VtYWlsX2lkZW50aWZpZXIgaXMgdHJ1ZRpIdGhpcy5hbGxvd2VkX2VtYWlsX2RvbWFpbnMuc2l6ZSgpID09IDAgfHwgIXRoaXMudXNlX25vbl9lbWFpbF9pZGVudGlmaWVyGrYBCixhbGxvd19nb29nbGVfb2F1dGhfcmVxdWlyZXNfZW1haWxfaWRlbnRpZmllchJKYWxsb3dfZ29vZ2xlX29hdXRoIGNhbm5vdCBiZSBlbmFibGVkIHdoZW4gdXNlX25vbl9lbWFpbF9pZGVudGlmaWVyIGlzIHRydWUaOiF0aGlzLmFsbG93X2dvb2dsZV9vYXV0aCB8fCAhdGhpcy51c2Vfbm9uX2VtYWlsX2lkZW50aWZpZXIqSAoHSWRQTGFuZxIZChVJRF9QX0xBTkdfVU5TUEVDSUZJRUQQABIQCgxJRF9QX0xBTkdfRU4QARIQCgxJRF9QX0xBTkdfSkEQAmIGcHJvdG8z", [
598
+ const file_tailor_v1_idp_resource = /* @__PURE__ */ fileDesc("Chx0YWlsb3IvdjEvaWRwX3Jlc291cmNlLnByb3RvEgl0YWlsb3IudjEi3gEKCklkUFNlcnZpY2USJwoJbmFtZXNwYWNlGAEgASgLMhQudGFpbG9yLnYxLk5hbWVzcGFjZRIVCg1hdXRob3JpemF0aW9uGAIgASgJEhkKDHByb3ZpZGVyX3VybBgDIAEoCUID4EEDEjYKEHVzZXJfYXV0aF9wb2xpY3kYBCABKAsyHC50YWlsb3IudjEuSWRQVXNlckF1dGhQb2xpY3kSIAoEbGFuZxgFIAEoDjISLnRhaWxvci52MS5JZFBMYW5nEhsKE3B1Ymxpc2hfdXNlcl9ldmVudHMYBiABKAgiTQoJSWRQQ2xpZW50EgwKBG5hbWUYASABKAkSFgoJY2xpZW50X2lkGAIgASgJQgPgQQMSGgoNY2xpZW50X3NlY3JldBgDIAEoCUID4EEDItcOChFJZFBVc2VyQXV0aFBvbGljeRIgChh1c2Vfbm9uX2VtYWlsX2lkZW50aWZpZXIYASABKAgSIQoZYWxsb3dfc2VsZl9wYXNzd29yZF9yZXNldBgCIAEoCBIiChpwYXNzd29yZF9yZXF1aXJlX3VwcGVyY2FzZRgDIAEoCBIiChpwYXNzd29yZF9yZXF1aXJlX2xvd2VyY2FzZRgEIAEoCBIpCiFwYXNzd29yZF9yZXF1aXJlX25vbl9hbHBoYW51bWVyaWMYBSABKAgSIAoYcGFzc3dvcmRfcmVxdWlyZV9udW1lcmljGAYgASgIEqYBChNwYXNzd29yZF9taW5fbGVuZ3RoGAcgASgFQogBukiEAboBgAEKGXBhc3N3b3JkX21pbl9sZW5ndGhfcmFuZ2USO3Bhc3N3b3JkX21pbl9sZW5ndGggbXVzdCBiZSAwIChkZWZhdWx0KSBvciBiZXR3ZWVuIDYgYW5kIDMwGiZ0aGlzID09IDAgfHwgKHRoaXMgPj0gNiAmJiB0aGlzIDw9IDMwKRKqAQoTcGFzc3dvcmRfbWF4X2xlbmd0aBgIIAEoBUKMAbpIiAG6AYQBChlwYXNzd29yZF9tYXhfbGVuZ3RoX3JhbmdlEj1wYXNzd29yZF9tYXhfbGVuZ3RoIG11c3QgYmUgMCAoZGVmYXVsdCkgb3IgYmV0d2VlbiA2IGFuZCA0MDk2Gih0aGlzID09IDAgfHwgKHRoaXMgPj0gNiAmJiB0aGlzIDw9IDQwOTYpEi8KFWFsbG93ZWRfZW1haWxfZG9tYWlucxgJIAMoCUIQukgNkgEKEGQYASIEcgJoARIaChJhbGxvd19nb29nbGVfb2F1dGgYCiABKAgSHQoVZGlzYWJsZV9wYXNzd29yZF9hdXRoGAsgASgIOqUJukihCRrqAQobcGFzc3dvcmRfbGVuZ3RoX2NvbnNpc3RlbmN5EkVwYXNzd29yZF9taW5fbGVuZ3RoIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBhc3N3b3JkX21heF9sZW5ndGgagwEodGhpcy5wYXNzd29yZF9taW5fbGVuZ3RoID09IDAgPyA2IDogdGhpcy5wYXNzd29yZF9taW5fbGVuZ3RoKSA8PSAodGhpcy5wYXNzd29yZF9tYXhfbGVuZ3RoID09IDAgPyA0MDk2IDogdGhpcy5wYXNzd29yZF9tYXhfbGVuZ3RoKRrGAQovYWxsb3dlZF9lbWFpbF9kb21haW5zX3JlcXVpcmVzX2VtYWlsX2lkZW50aWZpZXISSWFsbG93ZWRfZW1haWxfZG9tYWlucyBjYW5ub3QgYmUgc2V0IHdoZW4gdXNlX25vbl9lbWFpbF9pZGVudGlmaWVyIGlzIHRydWUaSHRoaXMuYWxsb3dlZF9lbWFpbF9kb21haW5zLnNpemUoKSA9PSAwIHx8ICF0aGlzLnVzZV9ub25fZW1haWxfaWRlbnRpZmllchq2AQosYWxsb3dfZ29vZ2xlX29hdXRoX3JlcXVpcmVzX2VtYWlsX2lkZW50aWZpZXISSmFsbG93X2dvb2dsZV9vYXV0aCBjYW5ub3QgYmUgZW5hYmxlZCB3aGVuIHVzZV9ub25fZW1haWxfaWRlbnRpZmllciBpcyB0cnVlGjohdGhpcy5hbGxvd19nb29nbGVfb2F1dGggfHwgIXRoaXMudXNlX25vbl9lbWFpbF9pZGVudGlmaWVyGrkBCjFhbGxvd19nb29nbGVfb2F1dGhfcmVxdWlyZXNfYWxsb3dlZF9lbWFpbF9kb21haW5zEkFhbGxvd2VkX2VtYWlsX2RvbWFpbnMgbXVzdCBiZSBzZXQgd2hlbiBhbGxvd19nb29nbGVfb2F1dGggaXMgdHJ1ZRpBIXRoaXMuYWxsb3dfZ29vZ2xlX29hdXRoIHx8IHRoaXMuYWxsb3dlZF9lbWFpbF9kb21haW5zLnNpemUoKSA+IDAapgEKK2Rpc2FibGVfcGFzc3dvcmRfYXV0aF9yZXF1aXJlc19nb29nbGVfb2F1dGgSP2Rpc2FibGVfcGFzc3dvcmRfYXV0aCByZXF1aXJlcyBhbGxvd19nb29nbGVfb2F1dGggdG8gYmUgZW5hYmxlZBo2IXRoaXMuZGlzYWJsZV9wYXNzd29yZF9hdXRoIHx8IHRoaXMuYWxsb3dfZ29vZ2xlX29hdXRoGsoBCjhkaXNhYmxlX3Bhc3N3b3JkX2F1dGhfY29uZmxpY3RzX3dpdGhfc2VsZl9wYXNzd29yZF9yZXNldBJOYWxsb3dfc2VsZl9wYXNzd29yZF9yZXNldCBjYW5ub3QgYmUgZW5hYmxlZCB3aGVuIGRpc2FibGVfcGFzc3dvcmRfYXV0aCBpcyB0cnVlGj4hdGhpcy5kaXNhYmxlX3Bhc3N3b3JkX2F1dGggfHwgIXRoaXMuYWxsb3dfc2VsZl9wYXNzd29yZF9yZXNldCpICgdJZFBMYW5nEhkKFUlEX1BfTEFOR19VTlNQRUNJRklFRBAAEhAKDElEX1BfTEFOR19FThABEhAKDElEX1BfTEFOR19KQRACYgZwcm90bzM", [
594
599
  file_buf_validate_validate,
595
600
  file_google_api_field_behavior,
596
601
  file_tailor_v1_resource
@@ -786,7 +791,7 @@ const TailorDBGQLPermission_Permit = /* @__PURE__ */ tsEnum(TailorDBGQLPermissio
786
791
  /**
787
792
  * Describes the file tailor/v1/tailordb.proto.
788
793
  */
789
- const file_tailor_v1_tailordb = /* @__PURE__ */ fileDesc("Chh0YWlsb3IvdjEvdGFpbG9yZGIucHJvdG8SCXRhaWxvci52MSJ9ChlDb21wb3NlVGFpbG9yREJTRExSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHAoaQ29tcG9zZVRhaWxvckRCU0RMUmVzcG9uc2UiowEKHENyZWF0ZVRhaWxvckRCU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhChBkZWZhdWx0X3RpbWV6b25lGAMgASgJQge6SARyAhggIlUKHUNyZWF0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlEjQKEHRhaWxvcmRiX3NlcnZpY2UYASABKAsyGi50YWlsb3IudjEuVGFpbG9yREJTZXJ2aWNlIqMBChxVcGRhdGVUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIQoQZGVmYXVsdF90aW1lem9uZRgDIAEoCUIHukgEcgIYICJVCh1VcGRhdGVUYWlsb3JEQlNlcnZpY2VSZXNwb25zZRI0ChB0YWlsb3JkYl9zZXJ2aWNlGAEgASgLMhoudGFpbG9yLnYxLlRhaWxvckRCU2VydmljZSKAAQocRGVsZXRlVGFpbG9yREJTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIh8KHURlbGV0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlIn0KGUdldFRhaWxvckRCU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJSChpHZXRUYWlsb3JEQlNlcnZpY2VSZXNwb25zZRI0ChB0YWlsb3JkYl9zZXJ2aWNlGAEgASgLMhoudGFpbG9yLnYxLlRhaWxvckRCU2VydmljZSKWAQobTGlzdFRhaWxvckRCU2VydmljZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiKDAQocTGlzdFRhaWxvckRCU2VydmljZXNSZXNwb25zZRI1ChF0YWlsb3JkYl9zZXJ2aWNlcxgBIAMoCzIaLnRhaWxvci52MS5UYWlsb3JEQlNlcnZpY2USFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIq0BChlDcmVhdGVUYWlsb3JEQlR5cGVSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLgoNdGFpbG9yZGJfdHlwZRgDIAEoCzIXLnRhaWxvci52MS5UYWlsb3JEQlR5cGUiTAoaQ3JlYXRlVGFpbG9yREJUeXBlUmVzcG9uc2USLgoNdGFpbG9yZGJfdHlwZRgBIAEoCzIXLnRhaWxvci52MS5UYWlsb3JEQlR5cGUigAYKGVVwZGF0ZVRhaWxvckRCVHlwZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIuCg10YWlsb3JkYl90eXBlGAMgASgLMhcudGFpbG9yLnYxLlRhaWxvckRCVHlwZRLQBAoLdXBkYXRlX21hc2sYZCABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQp4EivkrBmZpZWxkc4r5Kw1yZWxhdGlvbnNoaXBzivkrBWZpbGVzivkrC2Rlc2NyaXB0aW9uivkrCHNldHRpbmdzivkrFHNldHRpbmdzLmFnZ3JlZ2F0aW9uivkrFHNldHRpbmdzLmJ1bGtfdXBzZXJ0ivkrIXNldHRpbmdzLmRlZmF1bHRfcXVlcnlfbGltaXRfc2l6ZYr5Kx1zZXR0aW5ncy5tYXhfYnVsa191cHNlcnRfc2l6ZYr5KxRzZXR0aW5ncy5wbHVyYWxfZm9ybYr5Kx5zZXR0aW5ncy5wdWJsaXNoX3JlY29yZF9ldmVudHOK+SsOc2V0dGluZ3MuZHJhZnSK+SsPdHlwZV9wZXJtaXNzaW9uivkrFnR5cGVfcGVybWlzc2lvbi5jcmVhdGWK+SsUdHlwZV9wZXJtaXNzaW9uLnJlYWSK+SsWdHlwZV9wZXJtaXNzaW9uLnVwZGF0ZYr5KxZ0eXBlX3Blcm1pc3Npb24uZGVsZXRlivkrFXR5cGVfcGVybWlzc2lvbi5hZG1pbor5KwdleHRlbmRzivkrCmRpcmVjdGl2ZXOK+SsHaW5kZXhlc4r5KxFyZWNvcmRfcGVybWlzc2lvbor5KxZyZWNvcmRfcGVybWlzc2lvbi5yZWFkivkrGHJlY29yZF9wZXJtaXNzaW9uLnVwZGF0ZYr5KxhyZWNvcmRfcGVybWlzc2lvbi5kZWxldGUiTAoaVXBkYXRlVGFpbG9yREJUeXBlUmVzcG9uc2USLgoNdGFpbG9yZGJfdHlwZRgBIAEoCzIXLnRhaWxvci52MS5UYWlsb3JEQlR5cGUimQEKGURlbGV0ZVRhaWxvckRCVHlwZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIaChJ0YWlsb3JkYl90eXBlX25hbWUYAyABKAkiHAoaRGVsZXRlVGFpbG9yREJUeXBlUmVzcG9uc2UivAEKG1RydW5jYXRlVGFpbG9yREJUeXBlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjsKEnRhaWxvcmRiX3R5cGVfbmFtZRgDIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JCIeChxUcnVuY2F0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIoABChxUcnVuY2F0ZVRhaWxvckRCVHlwZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHwodVHJ1bmNhdGVUYWlsb3JEQlR5cGVzUmVzcG9uc2Ui+AEKGExpc3RUYWlsb3JEQlR5cGVzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEiEKBmZpbHRlchgFIAEoCzIRLnRhaWxvci52MS5GaWx0ZXISMAoOcGFnZV9kaXJlY3Rpb24YBiABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ6ChlMaXN0VGFpbG9yREJUeXBlc1Jlc3BvbnNlEi8KDnRhaWxvcmRiX3R5cGVzGAEgAygLMhcudGFpbG9yLnYxLlRhaWxvckRCVHlwZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMitwEKFkdldFRhaWxvckRCVHlwZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI7ChJ0YWlsb3JkYl90eXBlX25hbWUYAyABKAlCH7pIHHIaMhheW0EtWl1bYS16QS1aMC05XXswLDYyfSQiSQoXR2V0VGFpbG9yREJUeXBlUmVzcG9uc2USLgoNdGFpbG9yZGJfdHlwZRgBIAEoCzIXLnRhaWxvci52MS5UYWlsb3JEQlR5cGUi+AEKIkNyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIyCgl0eXBlX25hbWUYAyABKAlCH7pIHHIaMhheW0EtWl1bYS16QS1aMC05XXswLDYyfSQSPAoKcGVybWlzc2lvbhgEIAEoCzIgLnRhaWxvci52MS5UYWlsb3JEQkdRTFBlcm1pc3Npb25CBrpIA8gBASJbCiNDcmVhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXNwb25zZRI0CgpwZXJtaXNzaW9uGAEgASgLMiAudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbiK3AQofR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKCXR5cGVfbmFtZRgDIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JCJYCiBHZXRUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXNwb25zZRI0CgpwZXJtaXNzaW9uGAEgASgLMiAudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbiLeAQohTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiKmAgoiTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXNwb25zZRJkCgtwZXJtaXNzaW9ucxgBIAMoCzJPLnRhaWxvci52MS5MaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9uc1Jlc3BvbnNlLlRhaWxvckRCR1FMUGVybWlzc2lvbldpdGhUeXBlTmFtZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMabAohVGFpbG9yREJHUUxQZXJtaXNzaW9uV2l0aFR5cGVOYW1lEhEKCXR5cGVfbmFtZRgBIAEoCRI0CgpwZXJtaXNzaW9uGAIgASgLMiAudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbiL4AQoiVXBkYXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKCXR5cGVfbmFtZRgDIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JBI8CgpwZXJtaXNzaW9uGAQgASgLMiAudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbkIGukgDyAEBIlsKI1VwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlEjQKCnBlcm1pc3Npb24YASABKAsyIC50YWlsb3IudjEuVGFpbG9yREJHUUxQZXJtaXNzaW9uIroBCiJEZWxldGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSMgoJdHlwZV9uYW1lGAMgASgJQh+6SBxyGjIYXltBLVpdW2EtekEtWjAtOV17MCw2Mn0kIiUKI0RlbGV0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlYgZwcm90bzM", [
794
+ const file_tailor_v1_tailordb = /* @__PURE__ */ fileDesc("Chh0YWlsb3IvdjEvdGFpbG9yZGIucHJvdG8SCXRhaWxvci52MSJ9ChlDb21wb3NlVGFpbG9yREJTRExSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHAoaQ29tcG9zZVRhaWxvckRCU0RMUmVzcG9uc2UiowEKHENyZWF0ZVRhaWxvckRCU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhChBkZWZhdWx0X3RpbWV6b25lGAMgASgJQge6SARyAhggIlUKHUNyZWF0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlEjQKEHRhaWxvcmRiX3NlcnZpY2UYASABKAsyGi50YWlsb3IudjEuVGFpbG9yREJTZXJ2aWNlIqMBChxVcGRhdGVUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIQoQZGVmYXVsdF90aW1lem9uZRgDIAEoCUIHukgEcgIYICJVCh1VcGRhdGVUYWlsb3JEQlNlcnZpY2VSZXNwb25zZRI0ChB0YWlsb3JkYl9zZXJ2aWNlGAEgASgLMhoudGFpbG9yLnYxLlRhaWxvckRCU2VydmljZSKAAQocRGVsZXRlVGFpbG9yREJTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIh8KHURlbGV0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlIn0KGUdldFRhaWxvckRCU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJSChpHZXRUYWlsb3JEQlNlcnZpY2VSZXNwb25zZRI0ChB0YWlsb3JkYl9zZXJ2aWNlGAEgASgLMhoudGFpbG9yLnYxLlRhaWxvckRCU2VydmljZSKWAQobTGlzdFRhaWxvckRCU2VydmljZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiKDAQocTGlzdFRhaWxvckRCU2VydmljZXNSZXNwb25zZRI1ChF0YWlsb3JkYl9zZXJ2aWNlcxgBIAMoCzIaLnRhaWxvci52MS5UYWlsb3JEQlNlcnZpY2USFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIq0BChlDcmVhdGVUYWlsb3JEQlR5cGVSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLgoNdGFpbG9yZGJfdHlwZRgDIAEoCzIXLnRhaWxvci52MS5UYWlsb3JEQlR5cGUiTAoaQ3JlYXRlVGFpbG9yREJUeXBlUmVzcG9uc2USLgoNdGFpbG9yZGJfdHlwZRgBIAEoCzIXLnRhaWxvci52MS5UYWlsb3JEQlR5cGUiyQcKGVVwZGF0ZVRhaWxvckRCVHlwZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIuCg10YWlsb3JkYl90eXBlGAMgASgLMhcudGFpbG9yLnYxLlRhaWxvckRCVHlwZRKZBgoLdXBkYXRlX21hc2sYZCABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQucFivkrBmZpZWxkc4r5Kw1yZWxhdGlvbnNoaXBzivkrBWZpbGVzivkrC2Rlc2NyaXB0aW9uivkrCHNldHRpbmdzivkrFHNldHRpbmdzLmFnZ3JlZ2F0aW9uivkrFHNldHRpbmdzLmJ1bGtfdXBzZXJ0ivkrIXNldHRpbmdzLmRlZmF1bHRfcXVlcnlfbGltaXRfc2l6ZYr5Kx1zZXR0aW5ncy5tYXhfYnVsa191cHNlcnRfc2l6ZYr5KxRzZXR0aW5ncy5wbHVyYWxfZm9ybYr5Kx5zZXR0aW5ncy5wdWJsaXNoX3JlY29yZF9ldmVudHOK+SsOc2V0dGluZ3MuZHJhZnSK+Ssfc2V0dGluZ3MuZGlzYWJsZV9ncWxfb3BlcmF0aW9uc4r5KyZzZXR0aW5ncy5kaXNhYmxlX2dxbF9vcGVyYXRpb25zLmNyZWF0ZYr5KyZzZXR0aW5ncy5kaXNhYmxlX2dxbF9vcGVyYXRpb25zLnVwZGF0ZYr5KyZzZXR0aW5ncy5kaXNhYmxlX2dxbF9vcGVyYXRpb25zLmRlbGV0ZYr5KyRzZXR0aW5ncy5kaXNhYmxlX2dxbF9vcGVyYXRpb25zLnJlYWSK+SsPdHlwZV9wZXJtaXNzaW9uivkrFnR5cGVfcGVybWlzc2lvbi5jcmVhdGWK+SsUdHlwZV9wZXJtaXNzaW9uLnJlYWSK+SsWdHlwZV9wZXJtaXNzaW9uLnVwZGF0ZYr5KxZ0eXBlX3Blcm1pc3Npb24uZGVsZXRlivkrFXR5cGVfcGVybWlzc2lvbi5hZG1pbor5KwdleHRlbmRzivkrCmRpcmVjdGl2ZXOK+SsHaW5kZXhlc4r5KxFyZWNvcmRfcGVybWlzc2lvbor5KxZyZWNvcmRfcGVybWlzc2lvbi5yZWFkivkrGHJlY29yZF9wZXJtaXNzaW9uLnVwZGF0ZYr5KxhyZWNvcmRfcGVybWlzc2lvbi5kZWxldGUiTAoaVXBkYXRlVGFpbG9yREJUeXBlUmVzcG9uc2USLgoNdGFpbG9yZGJfdHlwZRgBIAEoCzIXLnRhaWxvci52MS5UYWlsb3JEQlR5cGUimQEKGURlbGV0ZVRhaWxvckRCVHlwZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIaChJ0YWlsb3JkYl90eXBlX25hbWUYAyABKAkiHAoaRGVsZXRlVGFpbG9yREJUeXBlUmVzcG9uc2UivAEKG1RydW5jYXRlVGFpbG9yREJUeXBlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjsKEnRhaWxvcmRiX3R5cGVfbmFtZRgDIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JCIeChxUcnVuY2F0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIoABChxUcnVuY2F0ZVRhaWxvckRCVHlwZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHwodVHJ1bmNhdGVUYWlsb3JEQlR5cGVzUmVzcG9uc2Ui+AEKGExpc3RUYWlsb3JEQlR5cGVzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEiEKBmZpbHRlchgFIAEoCzIRLnRhaWxvci52MS5GaWx0ZXISMAoOcGFnZV9kaXJlY3Rpb24YBiABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ6ChlMaXN0VGFpbG9yREJUeXBlc1Jlc3BvbnNlEi8KDnRhaWxvcmRiX3R5cGVzGAEgAygLMhcudGFpbG9yLnYxLlRhaWxvckRCVHlwZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMitwEKFkdldFRhaWxvckRCVHlwZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI7ChJ0YWlsb3JkYl90eXBlX25hbWUYAyABKAlCH7pIHHIaMhheW0EtWl1bYS16QS1aMC05XXswLDYyfSQiSQoXR2V0VGFpbG9yREJUeXBlUmVzcG9uc2USLgoNdGFpbG9yZGJfdHlwZRgBIAEoCzIXLnRhaWxvci52MS5UYWlsb3JEQlR5cGUi+AEKIkNyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIyCgl0eXBlX25hbWUYAyABKAlCH7pIHHIaMhheW0EtWl1bYS16QS1aMC05XXswLDYyfSQSPAoKcGVybWlzc2lvbhgEIAEoCzIgLnRhaWxvci52MS5UYWlsb3JEQkdRTFBlcm1pc3Npb25CBrpIA8gBASJbCiNDcmVhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXNwb25zZRI0CgpwZXJtaXNzaW9uGAEgASgLMiAudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbiK3AQofR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKCXR5cGVfbmFtZRgDIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JCJYCiBHZXRUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXNwb25zZRI0CgpwZXJtaXNzaW9uGAEgASgLMiAudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbiLeAQohTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiKmAgoiTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXNwb25zZRJkCgtwZXJtaXNzaW9ucxgBIAMoCzJPLnRhaWxvci52MS5MaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9uc1Jlc3BvbnNlLlRhaWxvckRCR1FMUGVybWlzc2lvbldpdGhUeXBlTmFtZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMabAohVGFpbG9yREJHUUxQZXJtaXNzaW9uV2l0aFR5cGVOYW1lEhEKCXR5cGVfbmFtZRgBIAEoCRI0CgpwZXJtaXNzaW9uGAIgASgLMiAudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbiL4AQoiVXBkYXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKCXR5cGVfbmFtZRgDIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JBI8CgpwZXJtaXNzaW9uGAQgASgLMiAudGFpbG9yLnYxLlRhaWxvckRCR1FMUGVybWlzc2lvbkIGukgDyAEBIlsKI1VwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlEjQKCnBlcm1pc3Npb24YASABKAsyIC50YWlsb3IudjEuVGFpbG9yREJHUUxQZXJtaXNzaW9uIroBCiJEZWxldGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSMgoJdHlwZV9uYW1lGAMgASgJQh+6SBxyGjIYXltBLVpdW2EtekEtWjAtOV17MCw2Mn0kIiUKI0RlbGV0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlYgZwcm90bzM", [
790
795
  file_buf_validate_validate,
791
796
  file_google_protobuf_field_mask,
792
797
  file_tailor_fieldmask_v1_option,
@@ -1065,6 +1070,7 @@ function formatRequestParams(message) {
1065
1070
  return "(unable to serialize request)";
1066
1071
  }
1067
1072
  }
1073
+ const MAX_PAGE_SIZE = 1e3;
1068
1074
  /**
1069
1075
  * Fetch all paginated resources by repeatedly calling the given function.
1070
1076
  * @template T
@@ -1075,7 +1081,7 @@ async function fetchAll(fn) {
1075
1081
  const items = [];
1076
1082
  let pageToken = "";
1077
1083
  while (true) {
1078
- const [batch, nextPageToken] = await fn(pageToken);
1084
+ const [batch, nextPageToken] = await fn(pageToken, MAX_PAGE_SIZE);
1079
1085
  items.push(...batch);
1080
1086
  if (!nextPageToken) break;
1081
1087
  pageToken = nextPageToken;
@@ -87395,7 +87401,7 @@ var require_config_loader = /* @__PURE__ */ __commonJSMin(((exports, module) =>
87395
87401
  * @returns {Promise<{createJiti: Function|undefined, version: string;}>} A promise that fulfills with an object containing the jiti module's createJiti function and version.
87396
87402
  */
87397
87403
  static async loadJiti() {
87398
- const { createJiti } = await import("./jiti-BrELlEYT.mjs");
87404
+ const { createJiti } = await import("./jiti-DHlauMCo.mjs");
87399
87405
  return {
87400
87406
  createJiti,
87401
87407
  version: require_package$1().version
@@ -87737,7 +87743,7 @@ var require_eslint_helpers = /* @__PURE__ */ __commonJSMin(((exports, module) =>
87737
87743
  */
87738
87744
  async function globMatch({ basePath, pattern }) {
87739
87745
  let found = false;
87740
- const { hfs } = await import("./src-DMROgdcL.mjs");
87746
+ const { hfs } = await import("./src-i4uqS1G4.mjs");
87741
87747
  const matcher = new Minimatch(normalizeToPosix(path$9.relative(basePath, pattern)), MINIMATCH_OPTIONS);
87742
87748
  const walkSettings = {
87743
87749
  directoryFilter(entry) {
@@ -87784,7 +87790,7 @@ var require_eslint_helpers = /* @__PURE__ */ __commonJSMin(((exports, module) =>
87784
87790
  return new Minimatch(patternToUse, MINIMATCH_OPTIONS);
87785
87791
  });
87786
87792
  const unmatchedPatterns = new Set([...relativeToPatterns.keys()]);
87787
- const { hfs } = await import("./src-DMROgdcL.mjs");
87793
+ const { hfs } = await import("./src-i4uqS1G4.mjs");
87788
87794
  const walk = hfs.walk(basePath, {
87789
87795
  async directoryFilter(entry) {
87790
87796
  if (!matchers.some((matcher) => matcher.match(entry.path, true))) return false;
@@ -98970,8 +98976,7 @@ function createTailorDBService(params) {
98970
98976
  const exportedValue = module$1[exportName];
98971
98977
  const result = TailorDBTypeSchema.safeParse(exportedValue);
98972
98978
  if (!result.success) {
98973
- const gqlPermissionIssue = result.error.issues.find((i$1) => i$1.message.includes(GQL_PERMISSION_INVALID_OPERAND_MESSAGE));
98974
- if (gqlPermissionIssue) throw new Error(gqlPermissionIssue.message);
98979
+ if (isSdkBranded(exportedValue)) throw result.error;
98975
98980
  continue;
98976
98981
  }
98977
98982
  const relativePath = path$20.relative(process.cwd(), typeFile);
@@ -98999,9 +99004,15 @@ function createTailorDBService(params) {
98999
99004
  return {
99000
99005
  namespace,
99001
99006
  config,
99002
- getTypes: () => types$2,
99003
- getTypeSourceInfo: () => typeSourceInfo,
99004
- getPluginAttachments: () => pluginAttachments,
99007
+ get types() {
99008
+ return types$2;
99009
+ },
99010
+ get typeSourceInfo() {
99011
+ return typeSourceInfo;
99012
+ },
99013
+ get pluginAttachments() {
99014
+ return pluginAttachments;
99015
+ },
99005
99016
  loadTypes: async () => {
99006
99017
  if (Object.keys(rawTypes).length > 0) return types$2;
99007
99018
  if (!config.files || config.files.length === 0) return;
@@ -99316,7 +99327,7 @@ function createAuthService(config, tailorDBServices, externalTailorDBNamespaces)
99316
99327
  await Promise.all(tailorDBServices.map((tailordb) => tailordb.loadTypes()));
99317
99328
  const userProfileTypeName = typeof config.userProfile.type === "object" && "name" in config.userProfile.type ? config.userProfile.type.name : void 0;
99318
99329
  if (userProfileTypeName) for (const service of tailorDBServices) {
99319
- const types$2 = service.getTypes();
99330
+ const types$2 = service.types;
99320
99331
  if (Object.prototype.hasOwnProperty.call(types$2, userProfileTypeName)) {
99321
99332
  userProfileNamespace = service.namespace;
99322
99333
  break;
@@ -99441,6 +99452,7 @@ function createExecutorService(params) {
99441
99452
  executors[executorFile] = result.data;
99442
99453
  return result.data;
99443
99454
  }
99455
+ if (isSdkBranded(executorModule.default)) throw result.error;
99444
99456
  } catch (error) {
99445
99457
  const relativePath = path$20.relative(process.cwd(), executorFile);
99446
99458
  logger.error(`Failed to load executor from ${styles.bold(relativePath)}`);
@@ -99450,8 +99462,12 @@ function createExecutorService(params) {
99450
99462
  };
99451
99463
  return {
99452
99464
  config,
99453
- getExecutors: () => executors,
99454
- getPluginExecutors: () => pluginExecutors,
99465
+ get executors() {
99466
+ return executors;
99467
+ },
99468
+ get pluginExecutors() {
99469
+ return pluginExecutors;
99470
+ },
99455
99471
  loadExecutors: async () => {
99456
99472
  if (Object.keys(executors).length > 0) return executors;
99457
99473
  if (!config.files || config.files.length === 0) return;
@@ -99497,6 +99513,7 @@ function createResolverService(namespace, config) {
99497
99513
  resolvers[resolverFile] = result.data;
99498
99514
  return result.data;
99499
99515
  }
99516
+ if (isSdkBranded(resolverModule.default)) throw result.error;
99500
99517
  } catch (error) {
99501
99518
  const relativePath = path$20.relative(process.cwd(), resolverFile);
99502
99519
  logger.error(`Failed to load resolver from ${styles.bold(relativePath)}`);
@@ -99507,7 +99524,9 @@ function createResolverService(namespace, config) {
99507
99524
  return {
99508
99525
  namespace,
99509
99526
  config,
99510
- getResolvers: () => resolvers,
99527
+ get resolvers() {
99528
+ return resolvers;
99529
+ },
99511
99530
  loadResolvers: async () => {
99512
99531
  if (Object.keys(resolvers).length > 0) return;
99513
99532
  if (!config.files || config.files.length === 0) return;
@@ -99533,6 +99552,52 @@ const WorkflowSchema = z.object({
99533
99552
  //#endregion
99534
99553
  //#region src/cli/application/workflow/service.ts
99535
99554
  /**
99555
+ * Creates a new WorkflowService instance.
99556
+ * @param params - Parameters for creating the service
99557
+ * @returns A new WorkflowService instance
99558
+ */
99559
+ function createWorkflowService(params) {
99560
+ const { config } = params;
99561
+ let workflows = {};
99562
+ let workflowSources = [];
99563
+ let jobs = [];
99564
+ let fileCount = 0;
99565
+ let loaded = false;
99566
+ return {
99567
+ config,
99568
+ get workflows() {
99569
+ return workflows;
99570
+ },
99571
+ get workflowSources() {
99572
+ return workflowSources;
99573
+ },
99574
+ get jobs() {
99575
+ return jobs;
99576
+ },
99577
+ get fileCount() {
99578
+ return fileCount;
99579
+ },
99580
+ loadWorkflows: async () => {
99581
+ if (loaded) return;
99582
+ const result = await loadAndCollectJobs(config);
99583
+ workflows = result.workflows;
99584
+ workflowSources = result.workflowSources;
99585
+ jobs = result.jobs;
99586
+ fileCount = result.fileCount;
99587
+ loaded = true;
99588
+ },
99589
+ printLoadedWorkflows: () => {
99590
+ if (fileCount === 0) return;
99591
+ logger.newline();
99592
+ logger.log(`Found ${styles.highlight(fileCount.toString())} workflow files`);
99593
+ for (const { workflow, sourceFile } of workflowSources) {
99594
+ const relativePath = path$20.relative(process.cwd(), sourceFile);
99595
+ logger.log(`Workflow: ${styles.successBright(`"${workflow.name}"`)} loaded from ${styles.path(relativePath)}`);
99596
+ }
99597
+ }
99598
+ };
99599
+ }
99600
+ /**
99536
99601
  * Load workflow files and collect all jobs in a single pass.
99537
99602
  * Dependencies are detected at bundle time via AST analysis.
99538
99603
  * @param config - Workflow service configuration
@@ -99582,19 +99647,6 @@ async function loadAndCollectJobs(config) {
99582
99647
  };
99583
99648
  }
99584
99649
  /**
99585
- * Print workflow loading logs.
99586
- * @param result - Workflow load result to print
99587
- */
99588
- function printLoadedWorkflows(result) {
99589
- if (result.fileCount === 0) return;
99590
- logger.newline();
99591
- logger.log(`Found ${styles.highlight(result.fileCount.toString())} workflow files`);
99592
- for (const { workflow, sourceFile } of result.workflowSources) {
99593
- const relativePath = path$20.relative(process.cwd(), sourceFile);
99594
- logger.log(`Workflow: ${styles.successBright(`"${workflow.name}"`)} loaded from ${styles.path(relativePath)}`);
99595
- }
99596
- }
99597
- /**
99598
99650
  * Load a single file and extract jobs and workflow
99599
99651
  * @param filePath - Path to the workflow file
99600
99652
  * @returns Extracted jobs and workflow
@@ -99608,6 +99660,7 @@ async function loadFileContent(filePath) {
99608
99660
  if (exportName === "default") {
99609
99661
  const workflowResult = WorkflowSchema.safeParse(exportValue);
99610
99662
  if (workflowResult.success) workflow = workflowResult.data;
99663
+ else if (isSdkBranded(exportValue)) throw workflowResult.error;
99611
99664
  continue;
99612
99665
  }
99613
99666
  const jobResult = WorkflowJobSchema.safeParse(exportValue);
@@ -99616,6 +99669,7 @@ async function loadFileContent(filePath) {
99616
99669
  exportName,
99617
99670
  sourceFile: filePath
99618
99671
  });
99672
+ else if (isSdkBranded(exportValue)) throw jobResult.error;
99619
99673
  }
99620
99674
  } catch (error) {
99621
99675
  const relativePath = path$20.relative(process.cwd(), filePath);
@@ -100483,6 +100537,74 @@ async function bundleSingleResolver(resolver, outputDir, tsconfig, triggerContex
100483
100537
  }));
100484
100538
  }
100485
100539
 
100540
+ //#endregion
100541
+ //#region src/cli/bundler/runtime-args.ts
100542
+ /**
100543
+ * Runtime args transformation for all services.
100544
+ *
100545
+ * Each service transforms server-side args/context into SDK-friendly format:
100546
+ * - Executor: server-side expression evaluated by platform before calling function
100547
+ * - Resolver: operationHook expression evaluated by platform before calling function
100548
+ * - Workflow: JS code embedded in bundled entry file (uses tailorUserMap directly)
100549
+ *
100550
+ * The user field mapping (server → SDK) shared across services is defined in
100551
+ * `@/parser/service/tailordb` as `tailorUserMap`.
100552
+ */
100553
+ /**
100554
+ * Actor field transformation expression.
100555
+ *
100556
+ * Transforms the server's actor object to match the SDK's TailorActor type:
100557
+ * server `attributeMap` → SDK `attributes`
100558
+ * server `attributes` → SDK `attributeList`
100559
+ * other fields → passed through
100560
+ * null/undefined actor → null
100561
+ */
100562
+ const ACTOR_TRANSFORM_EXPR = "actor: args.actor ? (({ attributeMap, attributes: attrList, ...rest }) => ({ ...rest, attributes: attributeMap, attributeList: attrList }))(args.actor) : null";
100563
+ /**
100564
+ * Build the JavaScript expression that transforms server-format executor event
100565
+ * args into SDK-format args at runtime.
100566
+ *
100567
+ * The Tailor Platform server delivers event args with server-side field names.
100568
+ * The SDK exposes different field names to user code. This function produces a
100569
+ * JavaScript expression string that performs the mapping when evaluated
100570
+ * server-side.
100571
+ * @param triggerKind - The trigger kind discriminant from the parsed executor
100572
+ * @param env - Application env record to embed in the expression
100573
+ * @returns A JavaScript expression string, e.g. `({ ...args, ... })`
100574
+ */
100575
+ function buildExecutorArgsExpr(triggerKind, env) {
100576
+ const envExpr = `env: ${JSON.stringify(env)}`;
100577
+ switch (triggerKind) {
100578
+ case "schedule":
100579
+ case "recordCreated":
100580
+ case "recordUpdated":
100581
+ case "recordDeleted":
100582
+ case "idpUserCreated":
100583
+ case "idpUserUpdated":
100584
+ case "idpUserDeleted":
100585
+ case "authAccessTokenIssued":
100586
+ case "authAccessTokenRefreshed":
100587
+ case "authAccessTokenRevoked": return `({ ...args, appNamespace: args.namespaceName, ${ACTOR_TRANSFORM_EXPR}, ${envExpr} })`;
100588
+ case "resolverExecuted": return `({ ...args, appNamespace: args.namespaceName, ${ACTOR_TRANSFORM_EXPR}, success: !!args.succeeded, result: args.succeeded?.result.resolver, error: args.failed?.error, ${envExpr} })`;
100589
+ case "incomingWebhook": return `({ ...args, appNamespace: args.namespaceName, rawBody: args.raw_body, ${envExpr} })`;
100590
+ default: throw new Error(`Unknown trigger kind for args expression: ${triggerKind}`);
100591
+ }
100592
+ }
100593
+ /**
100594
+ * Build the operationHook expression for resolver pipelines.
100595
+ *
100596
+ * Transforms server context to SDK resolver context:
100597
+ * context.args → input
100598
+ * context.pipeline → spread into result
100599
+ * user (global var) → TailorUser (via tailorUserMap: workspace_id→workspaceId, attribute_map→attributes, attributes→attributeList)
100600
+ * env → injected as JSON
100601
+ * @param env - Application env record to embed in the expression
100602
+ * @returns A JavaScript expression string for the operationHook
100603
+ */
100604
+ function buildResolverOperationHookExpr(env) {
100605
+ return `({ ...context.pipeline, input: context.args, user: ${tailorUserMap}, env: ${JSON.stringify(env)} });`;
100606
+ }
100607
+
100486
100608
  //#endregion
100487
100609
  //#region src/cli/bundler/workflow/source-transformer.ts
100488
100610
  /**
@@ -100751,10 +100873,10 @@ async function bundleSingleJob(job, allJobs, outputDir, tsconfig, env, triggerCo
100751
100873
  const entryContent = ml`
100752
100874
  import { ${job.exportName} } from "${absoluteSourcePath}";
100753
100875
 
100754
- const env = ${JSON.stringify(env)};
100755
-
100756
100876
  export async function main(input) {
100757
- return await ${job.exportName}.body(input, { env });
100877
+ const env = ${JSON.stringify(env)};
100878
+ const _user = ${tailorUserMap};
100879
+ return await ${job.exportName}.body(input, { env, user: _user });
100758
100880
  }
100759
100881
  `;
100760
100882
  fs$15.writeFileSync(entryPath, entryContent);
@@ -100831,12 +100953,17 @@ const BaseGeneratorConfigSchema = z.union([
100831
100953
  const CustomPluginSchema = z.object({
100832
100954
  id: z.string(),
100833
100955
  description: z.string(),
100834
- importPath: z.string(),
100956
+ importPath: z.string().optional(),
100835
100957
  pluginConfig: z.unknown().optional(),
100836
- processType: functionSchema.optional(),
100837
- processNamespace: functionSchema.optional(),
100838
- typeConfigRequired: z.union([z.boolean(), functionSchema]).optional()
100839
- }).passthrough();
100958
+ typeConfigRequired: z.union([z.boolean(), functionSchema]).optional(),
100959
+ onTypeLoaded: functionSchema.optional(),
100960
+ onNamespaceLoaded: functionSchema.optional(),
100961
+ onTailorDBReady: functionSchema.optional(),
100962
+ onResolverReady: functionSchema.optional(),
100963
+ onExecutorReady: functionSchema.optional()
100964
+ }).passthrough().refine((p) => {
100965
+ return !(p.onTypeLoaded || p.onNamespaceLoaded) || !!p.importPath;
100966
+ }, { message: "importPath is required when plugin has definition-time hooks (onTypeLoaded/onNamespaceLoaded)" });
100840
100967
  /**
100841
100968
  * Creates a PluginConfigSchema for custom plugins
100842
100969
  * @returns Plugin config schema that validates and transforms Plugin instances
@@ -100845,1584 +100972,6 @@ function createPluginConfigSchema() {
100845
100972
  return CustomPluginSchema.transform((plugin) => plugin);
100846
100973
  }
100847
100974
 
100848
- //#endregion
100849
- //#region src/cli/generator/types.ts
100850
- /**
100851
- * Type guard to check if a generator has a specific dependency.
100852
- * @template D
100853
- * @param generator - Code generator instance
100854
- * @param dependency - Dependency kind to check
100855
- * @returns True if the generator has the dependency
100856
- */
100857
- function hasDependency(generator, dependency) {
100858
- return generator.dependencies.includes(dependency);
100859
- }
100860
-
100861
- //#endregion
100862
- //#region src/cli/generator/builtin/enum-constants/generate-enum-constants.ts
100863
- /**
100864
- * Generate enum constant definitions from collected metadata.
100865
- * @param allEnums - All collected enum definitions
100866
- * @returns Generated enum constant definitions
100867
- */
100868
- function generateUnifiedEnumConstants(allEnums) {
100869
- if (allEnums.length === 0) return "";
100870
- const enumMap = /* @__PURE__ */ new Map();
100871
- for (const enumDef of allEnums) enumMap.set(enumDef.name, enumDef);
100872
- const enumDefs = Array.from(enumMap.values()).map((e) => {
100873
- const members = e.values.map((v) => {
100874
- return ` "${v.value.replace(/[-\s]/g, "_")}": "${v.value}"`;
100875
- }).join(",\n");
100876
- const hasDescriptions = e.values.some((v) => v.description);
100877
- let jsDoc = "";
100878
- if (e.fieldDescription || hasDescriptions) {
100879
- const lines = [];
100880
- if (e.fieldDescription) {
100881
- lines.push(` * ${e.fieldDescription}`);
100882
- if (hasDescriptions) lines.push(" *");
100883
- }
100884
- if (hasDescriptions) {
100885
- const propertyDocs = e.values.map((v) => {
100886
- return ` * @property ${[v.value.replace(/[-\s]/g, "_"), v.description].filter(Boolean).join(" - ")}`;
100887
- });
100888
- lines.push(...propertyDocs);
100889
- }
100890
- if (lines.length > 0) jsDoc = `/**\n${lines.join("\n")}\n */\n`;
100891
- }
100892
- return `${`${jsDoc}export const ${e.name} = {\n${members}\n} as const;`}\n${`export type ${e.name} = (typeof ${e.name})[keyof typeof ${e.name}];`}`;
100893
- }).join("\n\n");
100894
- if (!enumDefs) return "";
100895
- return enumDefs + "\n";
100896
- }
100897
-
100898
- //#endregion
100899
- //#region src/cli/generator/builtin/enum-constants/process-enum-type.ts
100900
- function capitalizeFirst(str) {
100901
- return str.charAt(0).toUpperCase() + str.slice(1);
100902
- }
100903
- function collectEnums(type) {
100904
- const enums = [];
100905
- for (const [fieldName, parsedField] of Object.entries(type.fields)) {
100906
- if (parsedField.config.type === "enum" && parsedField.config.allowedValues) {
100907
- const enumTypeName = `${type.name}${capitalizeFirst(fieldName)}`;
100908
- enums.push({
100909
- name: enumTypeName,
100910
- values: parsedField.config.allowedValues,
100911
- fieldDescription: parsedField.config.description
100912
- });
100913
- }
100914
- if (parsedField.config.type === "nested" && parsedField.config.fields) {
100915
- for (const [nestedFieldName, nestedFieldConfig] of Object.entries(parsedField.config.fields)) if (nestedFieldConfig.type === "enum" && nestedFieldConfig.allowedValues) {
100916
- const fullFieldName = `${fieldName}${capitalizeFirst(nestedFieldName)}`;
100917
- const enumTypeName = `${type.name}${capitalizeFirst(fullFieldName)}`;
100918
- enums.push({
100919
- name: enumTypeName,
100920
- values: nestedFieldConfig.allowedValues,
100921
- fieldDescription: nestedFieldConfig.description
100922
- });
100923
- }
100924
- }
100925
- }
100926
- return enums;
100927
- }
100928
- /**
100929
- * Process a TailorDB type and extract enum metadata.
100930
- * @param type - The parsed TailorDB type to process
100931
- * @returns Enum constant metadata for the type
100932
- */
100933
- async function processEnumType(type) {
100934
- const enums = collectEnums(type);
100935
- return {
100936
- name: type.name,
100937
- enums
100938
- };
100939
- }
100940
-
100941
- //#endregion
100942
- //#region src/cli/generator/builtin/enum-constants/index.ts
100943
- const EnumConstantsGeneratorID = "@tailor-platform/enum-constants";
100944
- /**
100945
- * Create an enum constants generator from TailorDB type definitions.
100946
- * @param options - Generator options
100947
- * @param options.distPath - Output file path
100948
- * @returns TailorDB generator instance
100949
- */
100950
- function createEnumConstantsGenerator(options) {
100951
- return {
100952
- id: EnumConstantsGeneratorID,
100953
- description: "Generates enum constants from TailorDB type definitions",
100954
- dependencies: ["tailordb"],
100955
- async processType(args) {
100956
- return await processEnumType(args.type);
100957
- },
100958
- async processTailorDBNamespace(args) {
100959
- const allEnums = [];
100960
- for (const enumConstantMetadata of Object.values(args.types)) allEnums.push(...enumConstantMetadata.enums);
100961
- return {
100962
- namespace: args.namespace,
100963
- enums: allEnums
100964
- };
100965
- },
100966
- aggregate(args) {
100967
- const files = [];
100968
- const allEnums = [];
100969
- for (const nsResult of args.input.tailordb) if (nsResult.types && nsResult.types.enums.length > 0) allEnums.push(...nsResult.types.enums);
100970
- if (allEnums.length > 0) {
100971
- const content = generateUnifiedEnumConstants(allEnums);
100972
- files.push({
100973
- path: options.distPath,
100974
- content
100975
- });
100976
- }
100977
- return { files };
100978
- }
100979
- };
100980
- }
100981
-
100982
- //#endregion
100983
- //#region src/cli/generator/builtin/file-utils/generate-file-utils.ts
100984
- /**
100985
- * Generate unified file utility functions from collected metadata.
100986
- * @param namespaceData - Namespace data with file utility metadata
100987
- * @returns Generated file utility code
100988
- */
100989
- function generateUnifiedFileUtils(namespaceData) {
100990
- if (namespaceData.length === 0) return "";
100991
- const typeNamespaceMap = /* @__PURE__ */ new Map();
100992
- const typeFieldsMap = /* @__PURE__ */ new Map();
100993
- for (const { namespace, types: types$2 } of namespaceData) for (const type of types$2) {
100994
- typeNamespaceMap.set(type.name, namespace);
100995
- typeFieldsMap.set(type.name, type.fileFields);
100996
- }
100997
- if (typeNamespaceMap.size === 0) return "";
100998
- return [
100999
- ml`
101000
- export interface TypeWithFiles {
101001
- ${Array.from(typeFieldsMap.entries()).map(([typeName, fields]) => {
101002
- return ` ${typeName}: {\n fields: ${fields.map((field) => `"${field}"`).join(" | ")};\n };`;
101003
- }).join("\n")}
101004
- }
101005
- ` + "\n",
101006
- ml`
101007
- const namespaces: Record<keyof TypeWithFiles, string> = {
101008
- ${Array.from(typeNamespaceMap.entries()).map(([typeName, namespace]) => ` ${typeName}: "${namespace}"`).join(",\n")},
101009
- };
101010
- ` + "\n",
101011
- ml`
101012
- export async function downloadFile<T extends keyof TypeWithFiles>(
101013
- type: T,
101014
- field: TypeWithFiles[T]["fields"],
101015
- recordId: string,
101016
- ) {
101017
- return await tailordb.file.download(namespaces[type], type, field, recordId);
101018
- }
101019
- ` + "\n",
101020
- ml`
101021
- export async function uploadFile<T extends keyof TypeWithFiles>(
101022
- type: T,
101023
- field: TypeWithFiles[T]["fields"],
101024
- recordId: string,
101025
- data: string | ArrayBuffer | Uint8Array<ArrayBufferLike> | number[],
101026
- options?: FileUploadOptions,
101027
- ): Promise<FileUploadResponse> {
101028
- return await tailordb.file.upload(namespaces[type], type, field, recordId, data, options);
101029
- }
101030
- ` + "\n",
101031
- ml`
101032
- export async function deleteFile<T extends keyof TypeWithFiles>(
101033
- type: T,
101034
- field: TypeWithFiles[T]["fields"],
101035
- recordId: string,
101036
- ): Promise<void> {
101037
- return await tailordb.file.delete(namespaces[type], type, field, recordId);
101038
- }
101039
- ` + "\n",
101040
- ml`
101041
- export async function getFileMetadata<T extends keyof TypeWithFiles>(
101042
- type: T,
101043
- field: TypeWithFiles[T]["fields"],
101044
- recordId: string,
101045
- ): Promise<FileMetadata> {
101046
- return await tailordb.file.getMetadata(namespaces[type], type, field, recordId);
101047
- }
101048
- ` + "\n",
101049
- ml`
101050
- export async function openFileDownloadStream<T extends keyof TypeWithFiles>(
101051
- type: T,
101052
- field: TypeWithFiles[T]["fields"],
101053
- recordId: string,
101054
- ): Promise<FileStreamIterator> {
101055
- return await tailordb.file.openDownloadStream(namespaces[type], type, field, recordId);
101056
- }
101057
- ` + "\n"
101058
- ].join("\n");
101059
- }
101060
-
101061
- //#endregion
101062
- //#region src/cli/generator/builtin/file-utils/process-file-type.ts
101063
- /**
101064
- * Process a TailorDB type and extract file field metadata.
101065
- * @param type - The parsed TailorDB type to process
101066
- * @returns File utility metadata for the type
101067
- */
101068
- async function processFileType(type) {
101069
- const fileFields = [];
101070
- if (type.files) for (const fileFieldName of Object.keys(type.files)) fileFields.push(fileFieldName);
101071
- return {
101072
- name: type.name,
101073
- fileFields
101074
- };
101075
- }
101076
-
101077
- //#endregion
101078
- //#region src/cli/generator/builtin/file-utils/index.ts
101079
- const FileUtilsGeneratorID = "@tailor-platform/file-utils";
101080
- /**
101081
- * Create a file utilities generator from TailorDB type definitions.
101082
- * @param options - Generator options
101083
- * @param options.distPath - Output file path
101084
- * @returns TailorDB generator instance
101085
- */
101086
- function createFileUtilsGenerator(options) {
101087
- return {
101088
- id: FileUtilsGeneratorID,
101089
- description: "Generates TypeWithFiles interface from TailorDB type definitions",
101090
- dependencies: ["tailordb"],
101091
- async processType(args) {
101092
- return await processFileType(args.type);
101093
- },
101094
- async processTailorDBNamespace(args) {
101095
- const typesWithFiles = Object.values(args.types).filter((t) => t.fileFields.length > 0);
101096
- if (typesWithFiles.length === 0) return "";
101097
- return JSON.stringify({
101098
- namespace: args.namespace,
101099
- types: typesWithFiles
101100
- });
101101
- },
101102
- aggregate(args) {
101103
- const files = [];
101104
- const allNamespaceData = [];
101105
- for (const nsResult of args.input.tailordb) if (nsResult.types) try {
101106
- const parsed = JSON.parse(nsResult.types);
101107
- if (parsed.namespace && parsed.types) allNamespaceData.push(parsed);
101108
- } catch {}
101109
- if (allNamespaceData.length > 0) {
101110
- const content = generateUnifiedFileUtils(allNamespaceData);
101111
- if (content) files.push({
101112
- path: options.distPath,
101113
- content
101114
- });
101115
- }
101116
- return { files };
101117
- }
101118
- };
101119
- }
101120
-
101121
- //#endregion
101122
- //#region src/cli/generator/builtin/kysely-type/type-processor.ts
101123
- /**
101124
- * Get the enum type definition.
101125
- * @param fieldConfig - The field configuration
101126
- * @returns The enum type as a string union
101127
- */
101128
- function getEnumType(fieldConfig) {
101129
- const allowedValues = fieldConfig.allowedValues;
101130
- if (allowedValues && Array.isArray(allowedValues)) return allowedValues.map((v) => {
101131
- return `"${typeof v === "string" ? v : v.value}"`;
101132
- }).join(" | ");
101133
- return "string";
101134
- }
101135
- /**
101136
- * Get the nested object type definition.
101137
- * @param fieldConfig - The field configuration
101138
- * @returns The nested type with used utility types
101139
- */
101140
- function getNestedType(fieldConfig) {
101141
- const fields = fieldConfig.fields;
101142
- if (!fields || typeof fields !== "object") return {
101143
- type: "string",
101144
- usedUtilityTypes: {
101145
- Timestamp: false,
101146
- Serial: false
101147
- }
101148
- };
101149
- const fieldResults = Object.entries(fields).map(([fieldName, nestedOperatorFieldConfig]) => ({
101150
- fieldName,
101151
- ...generateFieldType(nestedOperatorFieldConfig)
101152
- }));
101153
- const fieldTypes = fieldResults.map((result) => `${result.fieldName}: ${result.type}`);
101154
- const aggregatedUtilityTypes = fieldResults.reduce((acc, result) => ({
101155
- Timestamp: acc.Timestamp || result.usedUtilityTypes.Timestamp,
101156
- Serial: acc.Serial || result.usedUtilityTypes.Serial
101157
- }), {
101158
- Timestamp: false,
101159
- Serial: false
101160
- });
101161
- return {
101162
- type: `{\n ${fieldTypes.join(";\n ")}${fieldTypes.length > 0 ? ";" : ""}\n}`,
101163
- usedUtilityTypes: aggregatedUtilityTypes
101164
- };
101165
- }
101166
- /**
101167
- * Get the base Kysely type for a field (without array/null modifiers).
101168
- * @param fieldConfig - The field configuration
101169
- * @returns The base type with used utility types
101170
- */
101171
- function getBaseType(fieldConfig) {
101172
- const fieldType = fieldConfig.type;
101173
- const usedUtilityTypes = {
101174
- Timestamp: false,
101175
- Serial: false
101176
- };
101177
- let type;
101178
- switch (fieldType) {
101179
- case "uuid":
101180
- case "string":
101181
- type = "string";
101182
- break;
101183
- case "integer":
101184
- case "float":
101185
- type = "number";
101186
- break;
101187
- case "date":
101188
- case "datetime":
101189
- usedUtilityTypes.Timestamp = true;
101190
- type = "Timestamp";
101191
- break;
101192
- case "bool":
101193
- case "boolean":
101194
- type = "boolean";
101195
- break;
101196
- case "enum":
101197
- type = getEnumType(fieldConfig);
101198
- break;
101199
- case "nested": return getNestedType(fieldConfig);
101200
- default:
101201
- type = "string";
101202
- break;
101203
- }
101204
- return {
101205
- type,
101206
- usedUtilityTypes
101207
- };
101208
- }
101209
- /**
101210
- * Generate the complete field type including array and null modifiers.
101211
- * @param fieldConfig - The field configuration
101212
- * @returns The complete field type with used utility types
101213
- */
101214
- function generateFieldType(fieldConfig) {
101215
- const baseTypeResult = getBaseType(fieldConfig);
101216
- const usedUtilityTypes = { ...baseTypeResult.usedUtilityTypes };
101217
- const isArray$1 = fieldConfig.array === true;
101218
- const isNullable = fieldConfig.required !== true;
101219
- let finalType = baseTypeResult.type;
101220
- if (isArray$1) finalType = fieldConfig.type === "enum" ? `(${baseTypeResult.type})[]` : `${baseTypeResult.type}[]`;
101221
- if (isNullable) finalType = `${finalType} | null`;
101222
- if (fieldConfig.serial) {
101223
- usedUtilityTypes.Serial = true;
101224
- finalType = `Serial<${finalType}>`;
101225
- }
101226
- if (fieldConfig.hooks?.create) finalType = `Generated<${finalType}>`;
101227
- return {
101228
- type: finalType,
101229
- usedUtilityTypes
101230
- };
101231
- }
101232
- /**
101233
- * Generate the table interface.
101234
- * @param type - The parsed TailorDB type
101235
- * @returns The type definition and used utility types
101236
- */
101237
- function generateTableInterface(type) {
101238
- const fieldResults = Object.entries(type.fields).filter(([fieldName]) => fieldName !== "id").map(([fieldName, parsedField]) => ({
101239
- fieldName,
101240
- ...generateFieldType(parsedField.config)
101241
- }));
101242
- const fields = ["id: Generated<string>;", ...fieldResults.map((result) => `${result.fieldName}: ${result.type};`)];
101243
- const aggregatedUtilityTypes = fieldResults.reduce((acc, result) => ({
101244
- Timestamp: acc.Timestamp || result.usedUtilityTypes.Timestamp,
101245
- Serial: acc.Serial || result.usedUtilityTypes.Serial
101246
- }), {
101247
- Timestamp: false,
101248
- Serial: false
101249
- });
101250
- return {
101251
- typeDef: ml`
101252
- ${type.name}: {
101253
- ${fields.join("\n")}
101254
- }
101255
- `,
101256
- usedUtilityTypes: aggregatedUtilityTypes
101257
- };
101258
- }
101259
- /**
101260
- * Convert a TailorDBType into KyselyTypeMetadata.
101261
- * @param type - Parsed TailorDB type
101262
- * @returns Generated Kysely type metadata
101263
- */
101264
- async function processKyselyType(type) {
101265
- const result = generateTableInterface(type);
101266
- return {
101267
- name: type.name,
101268
- typeDef: result.typeDef,
101269
- usedUtilityTypes: result.usedUtilityTypes
101270
- };
101271
- }
101272
- /**
101273
- * Generate unified types file from multiple namespaces.
101274
- * @param namespaceData - Namespace metadata
101275
- * @returns Generated types file contents
101276
- */
101277
- function generateUnifiedKyselyTypes(namespaceData) {
101278
- if (namespaceData.length === 0) return "";
101279
- const globalUsedUtilityTypes = namespaceData.reduce((acc, ns) => ({
101280
- Timestamp: acc.Timestamp || ns.usedUtilityTypes.Timestamp,
101281
- Serial: acc.Serial || ns.usedUtilityTypes.Serial
101282
- }), {
101283
- Timestamp: false,
101284
- Serial: false
101285
- });
101286
- const utilityTypeImports = ["type Generated"];
101287
- if (globalUsedUtilityTypes.Timestamp) utilityTypeImports.push("type Timestamp");
101288
- if (globalUsedUtilityTypes.Serial) utilityTypeImports.push("type Serial");
101289
- return [
101290
- ml`
101291
- import {
101292
- createGetDB,
101293
- ${utilityTypeImports.join(",\n")},
101294
- type NamespaceDB,
101295
- type NamespaceInsertable,
101296
- type NamespaceSelectable,
101297
- type NamespaceTable,
101298
- type NamespaceTableName,
101299
- type NamespaceTransaction,
101300
- type NamespaceUpdateable,
101301
- } from "@tailor-platform/sdk/kysely";
101302
- `,
101303
- `export interface Namespace {\n${namespaceData.map(({ namespace, types: types$2 }) => {
101304
- return ` "${namespace}": {\n${types$2.map((type) => {
101305
- return type.typeDef.split("\n").map((line) => line.trim() ? ` ${line}` : "").join("\n");
101306
- }).join("\n\n")}\n }`;
101307
- }).join(",\n")}\n}`,
101308
- ml`
101309
- export const getDB = createGetDB<Namespace>();
101310
-
101311
- export type DB<N extends keyof Namespace = keyof Namespace> = NamespaceDB<Namespace, N>;
101312
- `,
101313
- ml`
101314
- export type Transaction<K extends keyof Namespace | DB = keyof Namespace> =
101315
- NamespaceTransaction<Namespace, K>;
101316
-
101317
- type TableName = NamespaceTableName<Namespace>;
101318
- export type Table<T extends TableName> = NamespaceTable<Namespace, T>;
101319
-
101320
- export type Insertable<T extends TableName> = NamespaceInsertable<Namespace, T>;
101321
- export type Selectable<T extends TableName> = NamespaceSelectable<Namespace, T>;
101322
- export type Updateable<T extends TableName> = NamespaceUpdateable<Namespace, T>;
101323
- `
101324
- ].join("\n\n") + "\n";
101325
- }
101326
-
101327
- //#endregion
101328
- //#region src/cli/generator/builtin/kysely-type/index.ts
101329
- const KyselyGeneratorID = "@tailor-platform/kysely-type";
101330
- /**
101331
- * Create a Kysely type generator for TailorDB types.
101332
- * @param options - Generator options
101333
- * @param options.distPath - Output file path
101334
- * @returns TailorDB generator instance
101335
- */
101336
- function createKyselyGenerator(options) {
101337
- return {
101338
- id: KyselyGeneratorID,
101339
- description: "Generates Kysely type definitions for TailorDB types",
101340
- dependencies: ["tailordb"],
101341
- async processType(args) {
101342
- return await processKyselyType(args.type);
101343
- },
101344
- async processTailorDBNamespace(args) {
101345
- const typesList = Object.values(args.types);
101346
- const usedUtilityTypes = typesList.reduce((acc, type) => ({
101347
- Timestamp: acc.Timestamp || type.usedUtilityTypes.Timestamp,
101348
- Serial: acc.Serial || type.usedUtilityTypes.Serial
101349
- }), {
101350
- Timestamp: false,
101351
- Serial: false
101352
- });
101353
- return {
101354
- namespace: args.namespace,
101355
- types: typesList,
101356
- usedUtilityTypes
101357
- };
101358
- },
101359
- aggregate(args) {
101360
- const files = [];
101361
- const allNamespaceData = [];
101362
- for (const nsResult of args.input.tailordb) if (nsResult.types && nsResult.types.types.length > 0) allNamespaceData.push(nsResult.types);
101363
- if (allNamespaceData.length > 0) {
101364
- const content = generateUnifiedKyselyTypes(allNamespaceData);
101365
- files.push({
101366
- path: options.distPath,
101367
- content
101368
- });
101369
- }
101370
- return { files };
101371
- }
101372
- };
101373
- }
101374
-
101375
- //#endregion
101376
- //#region src/cli/generator/builtin/seed/idp-user-processor.ts
101377
- /**
101378
- * Processes auth configuration to generate IdP user seed metadata
101379
- * @param auth - Auth configuration from generator
101380
- * @returns IdP user metadata or undefined if not applicable
101381
- */
101382
- function processIdpUser(auth) {
101383
- if (auth.idProvider?.kind !== "BuiltInIdP" || !auth.userProfile) return;
101384
- const { typeName, usernameField } = auth.userProfile;
101385
- return {
101386
- name: "_User",
101387
- dependencies: [typeName],
101388
- dataFile: "data/_User.jsonl",
101389
- idpNamespace: auth.idProvider.namespace,
101390
- schema: {
101391
- usernameField,
101392
- userTypeName: typeName
101393
- }
101394
- };
101395
- }
101396
- /**
101397
- * Generates the server-side IDP seed script code for testExecScript execution.
101398
- * Uses the global tailor.idp.Client - no bundling required.
101399
- * @param idpNamespace - The IDP namespace name
101400
- * @returns Script code string
101401
- */
101402
- function generateIdpSeedScriptCode(idpNamespace) {
101403
- return ml`
101404
- export async function main(input) {
101405
- const client = new tailor.idp.Client({ namespace: "${idpNamespace}" });
101406
- const errors = [];
101407
- let processed = 0;
101408
-
101409
- for (let i = 0; i < input.users.length; i++) {
101410
- try {
101411
- await client.createUser(input.users[i]);
101412
- processed++;
101413
- console.log(\`[_User] \${i + 1}/\${input.users.length}: \${input.users[i].name}\`);
101414
- } catch (error) {
101415
- const message = error instanceof Error ? error.message : String(error);
101416
- errors.push(\`Row \${i} (\${input.users[i].name}): \${message}\`);
101417
- console.error(\`[_User] Row \${i} failed: \${message}\`);
101418
- }
101419
- }
101420
-
101421
- return {
101422
- success: errors.length === 0,
101423
- processed,
101424
- errors,
101425
- };
101426
- }
101427
- `;
101428
- }
101429
- /**
101430
- * Generates the server-side IDP truncation script code for testExecScript execution.
101431
- * Lists all users with pagination and deletes each one.
101432
- * @param idpNamespace - The IDP namespace name
101433
- * @returns Script code string
101434
- */
101435
- function generateIdpTruncateScriptCode(idpNamespace) {
101436
- return ml`
101437
- export async function main() {
101438
- const client = new tailor.idp.Client({ namespace: "${idpNamespace}" });
101439
- const errors = [];
101440
- let deleted = 0;
101441
-
101442
- // List all users with pagination
101443
- let nextToken = undefined;
101444
- const allUsers = [];
101445
- do {
101446
- const response = await client.users(nextToken ? { nextToken } : undefined);
101447
- allUsers.push(...(response.users || []));
101448
- nextToken = response.nextToken;
101449
- } while (nextToken);
101450
-
101451
- console.log(\`Found \${allUsers.length} IDP users to delete\`);
101452
-
101453
- for (const user of allUsers) {
101454
- try {
101455
- await client.deleteUser(user.id);
101456
- deleted++;
101457
- console.log(\`[_User] Deleted \${deleted}/\${allUsers.length}: \${user.name}\`);
101458
- } catch (error) {
101459
- const message = error instanceof Error ? error.message : String(error);
101460
- errors.push(\`User \${user.id} (\${user.name}): \${message}\`);
101461
- console.error(\`[_User] Delete failed for \${user.name}: \${message}\`);
101462
- }
101463
- }
101464
-
101465
- return {
101466
- success: errors.length === 0,
101467
- deleted,
101468
- total: allUsers.length,
101469
- errors,
101470
- };
101471
- }
101472
- `;
101473
- }
101474
- /**
101475
- * Generates the schema file content for IdP users with foreign key
101476
- * @param usernameField - Username field name
101477
- * @param userTypeName - TailorDB user type name
101478
- * @returns Schema file contents
101479
- */
101480
- function generateIdpUserSchemaFile(usernameField, userTypeName) {
101481
- return ml`
101482
- import { t } from "@tailor-platform/sdk";
101483
- import { createStandardSchema } from "@tailor-platform/sdk/test";
101484
- import { defineSchema } from "@toiroakr/lines-db";
101485
-
101486
- const schemaType = t.object({
101487
- name: t.string(),
101488
- password: t.string(),
101489
- });
101490
-
101491
- // Simple identity hook for _User (no TailorDB backing type)
101492
- const hook = <T>(data: unknown) => data as T;
101493
-
101494
- export const schema = defineSchema(
101495
- createStandardSchema(schemaType, hook),
101496
- {
101497
- primaryKey: "name",
101498
- indexes: [
101499
- { name: "_user_name_unique_idx", columns: ["name"], unique: true },
101500
- ],
101501
- foreignKeys: [
101502
- {
101503
- column: "name",
101504
- references: {
101505
- table: "${userTypeName}",
101506
- column: "${usernameField}",
101507
- },
101508
- },
101509
- ],
101510
- }
101511
- );
101512
-
101513
- `;
101514
- }
101515
-
101516
- //#endregion
101517
- //#region src/cli/generator/builtin/seed/lines-db-processor.ts
101518
- /**
101519
- * Processes TailorDB types to generate lines-db metadata
101520
- * @param type - Parsed TailorDB type
101521
- * @param source - Source file info
101522
- * @returns Generated lines-db metadata
101523
- */
101524
- function processLinesDb(type, source) {
101525
- if (isPluginGeneratedType(source)) return processLinesDbForPluginType(type, source);
101526
- if (!source.filePath) throw new Error(`Missing source info for type ${type.name}`);
101527
- if (!source.exportName) throw new Error(`Missing export name for type ${type.name}`);
101528
- const { optionalFields, omitFields, indexes, foreignKeys } = extractFieldMetadata(type);
101529
- return {
101530
- typeName: type.name,
101531
- exportName: source.exportName,
101532
- importPath: source.filePath,
101533
- optionalFields,
101534
- omitFields,
101535
- foreignKeys,
101536
- indexes
101537
- };
101538
- }
101539
- /**
101540
- * Process lines-db metadata for plugin-generated types
101541
- * @param type - Parsed TailorDB type
101542
- * @param source - Plugin-generated type source info
101543
- * @returns Generated lines-db metadata with plugin source
101544
- */
101545
- function processLinesDbForPluginType(type, source) {
101546
- const { optionalFields, omitFields, indexes, foreignKeys } = extractFieldMetadata(type);
101547
- return {
101548
- typeName: type.name,
101549
- exportName: source.exportName,
101550
- importPath: "",
101551
- optionalFields,
101552
- omitFields,
101553
- foreignKeys,
101554
- indexes,
101555
- pluginSource: source
101556
- };
101557
- }
101558
- /**
101559
- * Extract field metadata from TailorDB type
101560
- * @param type - Parsed TailorDB type
101561
- * @returns Field metadata including optional fields, omit fields, indexes, and foreign keys
101562
- */
101563
- function extractFieldMetadata(type) {
101564
- const optionalFields = ["id"];
101565
- const omitFields = [];
101566
- const indexes = [];
101567
- const foreignKeys = [];
101568
- for (const [fieldName, field] of Object.entries(type.fields)) {
101569
- if (field.config.hooks?.create) optionalFields.push(fieldName);
101570
- if (field.config.serial) omitFields.push(fieldName);
101571
- if (field.config.unique) indexes.push({
101572
- name: `${type.name.toLowerCase()}_${fieldName}_unique_idx`,
101573
- columns: [fieldName],
101574
- unique: true
101575
- });
101576
- }
101577
- if (type.indexes) for (const [indexName, indexDef] of Object.entries(type.indexes)) indexes.push({
101578
- name: indexName,
101579
- columns: indexDef.fields,
101580
- unique: indexDef.unique
101581
- });
101582
- for (const [fieldName, field] of Object.entries(type.fields)) if (field.relation) foreignKeys.push({
101583
- column: fieldName,
101584
- references: {
101585
- table: field.relation.targetType,
101586
- column: field.relation.key
101587
- }
101588
- });
101589
- return {
101590
- optionalFields,
101591
- omitFields,
101592
- indexes,
101593
- foreignKeys
101594
- };
101595
- }
101596
- /**
101597
- * Generate schema options code for lines-db
101598
- * @param foreignKeys - Foreign key definitions
101599
- * @param indexes - Index definitions
101600
- * @returns Schema options code string
101601
- */
101602
- function generateSchemaOptions(foreignKeys, indexes) {
101603
- const schemaOptions = [];
101604
- if (foreignKeys.length > 0) {
101605
- schemaOptions.push(`foreignKeys: [`);
101606
- foreignKeys.forEach((fk) => {
101607
- schemaOptions.push(` ${JSON.stringify(fk)},`);
101608
- });
101609
- schemaOptions.push(`],`);
101610
- }
101611
- if (indexes.length > 0) {
101612
- schemaOptions.push(`indexes: [`);
101613
- indexes.forEach((index$1) => {
101614
- schemaOptions.push(` ${JSON.stringify(index$1)},`);
101615
- });
101616
- schemaOptions.push("],");
101617
- }
101618
- return schemaOptions.length > 0 ? [
101619
- "\n {",
101620
- ...schemaOptions.map((option) => ` ${option}`),
101621
- " }"
101622
- ].join("\n") : "";
101623
- }
101624
- /**
101625
- * Generates the schema file content for lines-db (for user-defined types with import)
101626
- * @param metadata - lines-db metadata
101627
- * @param importPath - Import path for the TailorDB type
101628
- * @returns Schema file contents
101629
- */
101630
- function generateLinesDbSchemaFile(metadata, importPath) {
101631
- const { exportName, optionalFields, omitFields, foreignKeys, indexes } = metadata;
101632
- return ml`
101633
- import { t } from "@tailor-platform/sdk";
101634
- import { createTailorDBHook, createStandardSchema } from "@tailor-platform/sdk/test";
101635
- import { defineSchema } from "@toiroakr/lines-db";
101636
- import { ${exportName} } from "${importPath}";
101637
-
101638
- ${ml`
101639
- const schemaType = t.object({
101640
- ...${exportName}.pickFields(${JSON.stringify(optionalFields)}, { optional: true }),
101641
- ...${exportName}.omitFields(${JSON.stringify([...optionalFields, ...omitFields])}),
101642
- });
101643
- `}
101644
-
101645
- const hook = createTailorDBHook(${exportName});
101646
-
101647
- export const schema = defineSchema(
101648
- createStandardSchema(schemaType, hook),${generateSchemaOptions(foreignKeys, indexes)}
101649
- );
101650
-
101651
- `;
101652
- }
101653
- /**
101654
- * Generates the schema file content using getGeneratedType API
101655
- * (for plugin-generated types)
101656
- * @param metadata - lines-db metadata (must have pluginSource)
101657
- * @param params - Plugin import paths
101658
- * @returns Schema file contents
101659
- */
101660
- function generateLinesDbSchemaFileWithPluginAPI(metadata, params) {
101661
- const { typeName, exportName, optionalFields, omitFields, foreignKeys, indexes, pluginSource } = metadata;
101662
- if (!pluginSource) throw new Error(`pluginSource is required for plugin-generated type "${typeName}"`);
101663
- const { configImportPath, originalImportPath } = params;
101664
- const schemaTypeCode = ml`
101665
- const schemaType = t.object({
101666
- ...${exportName}.pickFields(${JSON.stringify(optionalFields)}, { optional: true }),
101667
- ...${exportName}.omitFields(${JSON.stringify([...optionalFields, ...omitFields])}),
101668
- });
101669
- `;
101670
- const schemaOptionsCode = generateSchemaOptions(foreignKeys, indexes);
101671
- if (pluginSource.originalExportName && originalImportPath && pluginSource.generatedTypeKind) return ml`
101672
- import { join } from "node:path";
101673
- import { t } from "@tailor-platform/sdk";
101674
- import { getGeneratedType } from "@tailor-platform/sdk/plugin";
101675
- import { createTailorDBHook, createStandardSchema } from "@tailor-platform/sdk/test";
101676
- import { defineSchema } from "@toiroakr/lines-db";
101677
- import { ${pluginSource.originalExportName} } from "${originalImportPath}";
101678
-
101679
- const configPath = join(import.meta.dirname, "${configImportPath}");
101680
- const ${exportName} = await getGeneratedType(configPath, "${pluginSource.pluginId}", ${pluginSource.originalExportName}, "${pluginSource.generatedTypeKind}");
101681
-
101682
- ${schemaTypeCode}
101683
-
101684
- const hook = createTailorDBHook(${exportName});
101685
-
101686
- export const schema = defineSchema(
101687
- createStandardSchema(schemaType, hook),${schemaOptionsCode}
101688
- );
101689
-
101690
- `;
101691
- if (!pluginSource.generatedTypeKind) throw new Error(`Namespace plugin "${pluginSource.pluginId}" must provide generatedTypeKind for type "${typeName}"`);
101692
- return ml`
101693
- import { join } from "node:path";
101694
- import { t } from "@tailor-platform/sdk";
101695
- import { getGeneratedType } from "@tailor-platform/sdk/plugin";
101696
- import { createTailorDBHook, createStandardSchema } from "@tailor-platform/sdk/test";
101697
- import { defineSchema } from "@toiroakr/lines-db";
101698
-
101699
- const configPath = join(import.meta.dirname, "${configImportPath}");
101700
- const ${exportName} = await getGeneratedType(configPath, "${pluginSource.pluginId}", null, "${pluginSource.generatedTypeKind}");
101701
-
101702
- ${schemaTypeCode}
101703
-
101704
- const hook = createTailorDBHook(${exportName});
101705
-
101706
- export const schema = defineSchema(
101707
- createStandardSchema(schemaType, hook),${schemaOptionsCode}
101708
- );
101709
-
101710
- `;
101711
- }
101712
-
101713
- //#endregion
101714
- //#region src/cli/generator/builtin/seed/seed-type-processor.ts
101715
- /**
101716
- * Processes TailorDB types to extract seed type information
101717
- * @param type - Parsed TailorDB type
101718
- * @param namespace - Namespace of the type
101719
- * @returns Seed type information
101720
- */
101721
- function processSeedTypeInfo(type, namespace) {
101722
- const dependencies = Array.from(Object.values(type.fields).reduce((set$1, field) => {
101723
- const targetType = field.relation?.targetType ?? field.config.foreignKeyType;
101724
- if (targetType && targetType !== type.name) set$1.add(targetType);
101725
- return set$1;
101726
- }, /* @__PURE__ */ new Set()));
101727
- return {
101728
- name: type.name,
101729
- namespace,
101730
- dependencies,
101731
- dataFile: `data/${type.name}.jsonl`
101732
- };
101733
- }
101734
-
101735
- //#endregion
101736
- //#region src/cli/generator/builtin/seed/index.ts
101737
- const SeedGeneratorID = "@tailor-platform/seed";
101738
- /**
101739
- * Generate the IdP user seed function code using tailor.idp.Client via testExecScript
101740
- * @param hasIdpUser - Whether IdP user is included
101741
- * @param idpNamespace - The IDP namespace name
101742
- * @returns JavaScript code for IdP user seeding function
101743
- */
101744
- function generateIdpUserSeedFunction(hasIdpUser, idpNamespace) {
101745
- if (!hasIdpUser || !idpNamespace) return "";
101746
- return ml`
101747
- // Seed _User via tailor.idp.Client (server-side)
101748
- const seedIdpUser = async () => {
101749
- console.log(styleText("cyan", " Seeding _User via tailor.idp.Client..."));
101750
- const dataDir = join(configDir, "data");
101751
- const data = loadSeedData(dataDir, ["_User"]);
101752
- const rows = data["_User"] || [];
101753
- if (rows.length === 0) {
101754
- console.log(styleText("dim", " No _User data to seed"));
101755
- return { success: true };
101756
- }
101757
- console.log(styleText("dim", \` Processing \${rows.length} _User records...\`));
101758
-
101759
- const idpSeedCode = \/* js *\/\`${generateIdpSeedScriptCode(idpNamespace).replace(/`/g, "\\`").replace(/\$/g, "\\$")}\`;
101760
-
101761
- const result = await executeScript({
101762
- client: operatorClient,
101763
- workspaceId,
101764
- name: "seed-idp-user.ts",
101765
- code: idpSeedCode,
101766
- arg: JSON.stringify({ users: rows }),
101767
- invoker: {
101768
- namespace: authNamespace,
101769
- machineUserName,
101770
- },
101771
- });
101772
-
101773
- if (result.logs) {
101774
- for (const line of result.logs.split("\\n").filter(Boolean)) {
101775
- console.log(styleText("dim", \` \${line}\`));
101776
- }
101777
- }
101778
-
101779
- if (result.success) {
101780
- let parsed;
101781
- try {
101782
- parsed = JSON.parse(result.result || "{}");
101783
- } catch (e) {
101784
- console.error(styleText("red", \` ✗ Failed to parse seed result: \${e.message}\`));
101785
- return { success: false };
101786
- }
101787
-
101788
- if (parsed.processed) {
101789
- console.log(styleText("green", \` ✓ _User: \${parsed.processed} rows processed\`));
101790
- }
101791
-
101792
- if (!parsed.success) {
101793
- const errors = Array.isArray(parsed.errors) ? parsed.errors : [];
101794
- for (const err of errors) {
101795
- console.error(styleText("red", \` ✗ \${err}\`));
101796
- }
101797
- return { success: false };
101798
- }
101799
-
101800
- return { success: true };
101801
- } else {
101802
- console.error(styleText("red", \` ✗ Seed failed: \${result.error}\`));
101803
- return { success: false };
101804
- }
101805
- };
101806
- `;
101807
- }
101808
- /**
101809
- * Generate the IdP user seed call code
101810
- * @param hasIdpUser - Whether IdP user is included
101811
- * @returns JavaScript code for calling IdP user seeding
101812
- */
101813
- function generateIdpUserSeedCall(hasIdpUser) {
101814
- if (!hasIdpUser) return "";
101815
- return ml`
101816
- // Seed _User if included and not skipped
101817
- const shouldSeedUser = !skipIdp && (!entitiesToProcess || entitiesToProcess.includes("_User"));
101818
- if (hasIdpUser && shouldSeedUser) {
101819
- const result = await seedIdpUser();
101820
- if (!result.success) {
101821
- allSuccess = false;
101822
- }
101823
- }
101824
- `;
101825
- }
101826
- /**
101827
- * Generate the IdP user truncation function code using tailor.idp.Client via testExecScript
101828
- * @param hasIdpUser - Whether IdP user is included
101829
- * @param idpNamespace - The IDP namespace name
101830
- * @returns JavaScript code for IdP user truncation function
101831
- */
101832
- function generateIdpUserTruncateFunction(hasIdpUser, idpNamespace) {
101833
- if (!hasIdpUser || !idpNamespace) return "";
101834
- return ml`
101835
- // Truncate _User via tailor.idp.Client (server-side)
101836
- const truncateIdpUser = async () => {
101837
- console.log(styleText("cyan", "Truncating _User via tailor.idp.Client..."));
101838
-
101839
- const idpTruncateCode = \/* js *\/\`${generateIdpTruncateScriptCode(idpNamespace).replace(/`/g, "\\`").replace(/\$/g, "\\$")}\`;
101840
-
101841
- const result = await executeScript({
101842
- client: operatorClient,
101843
- workspaceId,
101844
- name: "truncate-idp-user.ts",
101845
- code: idpTruncateCode,
101846
- arg: JSON.stringify({}),
101847
- invoker: {
101848
- namespace: authNamespace,
101849
- machineUserName,
101850
- },
101851
- });
101852
-
101853
- if (result.logs) {
101854
- for (const line of result.logs.split("\\n").filter(Boolean)) {
101855
- console.log(styleText("dim", \` \${line}\`));
101856
- }
101857
- }
101858
-
101859
- if (result.success) {
101860
- let parsed;
101861
- try {
101862
- parsed = JSON.parse(result.result || "{}");
101863
- } catch (e) {
101864
- console.error(styleText("red", \` ✗ Failed to parse truncation result: \${e.message}\`));
101865
- return { success: false };
101866
- }
101867
-
101868
- if (parsed.deleted !== undefined) {
101869
- console.log(styleText("green", \` ✓ _User: \${parsed.deleted} users deleted\`));
101870
- }
101871
-
101872
- if (!parsed.success) {
101873
- const errors = Array.isArray(parsed.errors) ? parsed.errors : [];
101874
- for (const err of errors) {
101875
- console.error(styleText("red", \` ✗ \${err}\`));
101876
- }
101877
- return { success: false };
101878
- }
101879
-
101880
- return { success: true };
101881
- } else {
101882
- console.error(styleText("red", \` ✗ Truncation failed: \${result.error}\`));
101883
- return { success: false };
101884
- }
101885
- };
101886
- `;
101887
- }
101888
- /**
101889
- * Generate the IdP user truncation call code within the truncate block
101890
- * @param hasIdpUser - Whether IdP user is included
101891
- * @returns JavaScript code for calling IdP user truncation
101892
- */
101893
- function generateIdpUserTruncateCall(hasIdpUser) {
101894
- if (!hasIdpUser) return "";
101895
- return ml`
101896
- // Truncate _User if applicable
101897
- const shouldTruncateUser = !skipIdp && !hasNamespace && (!hasTypes || entitiesToProcess.includes("_User"));
101898
- if (hasIdpUser && shouldTruncateUser) {
101899
- const truncResult = await truncateIdpUser();
101900
- if (!truncResult.success) {
101901
- console.error(styleText("red", "IDP user truncation failed."));
101902
- process.exit(1);
101903
- }
101904
- }
101905
- `;
101906
- }
101907
- /**
101908
- * Generates the exec.mjs script content using testExecScript API for TailorDB types
101909
- * and tailor.idp.Client for _User (IdP managed)
101910
- * @param defaultMachineUserName - Default machine user name from generator config (can be overridden at runtime)
101911
- * @param relativeConfigPath - Config path relative to exec script
101912
- * @param namespaceConfigs - Namespace configurations with types and dependencies
101913
- * @param hasIdpUser - Whether _User is included
101914
- * @param idpNamespace - The IDP namespace name, or null if not applicable
101915
- * @returns exec.mjs file contents
101916
- */
101917
- function generateExecScript(defaultMachineUserName, relativeConfigPath, namespaceConfigs, hasIdpUser, idpNamespace) {
101918
- const namespaceEntitiesEntries = namespaceConfigs.map(({ namespace, types: types$2 }) => {
101919
- return ` "${namespace}": [\n${types$2.map((e) => ` "${e}",`).join("\n")}\n ]`;
101920
- }).join(",\n");
101921
- const namespaceDepsEntries = namespaceConfigs.map(({ namespace, dependencies }) => {
101922
- return ` "${namespace}": {\n${Object.entries(dependencies).map(([type, deps]) => ` "${type}": [${deps.map((d) => `"${d}"`).join(", ")}]`).join(",\n")}\n }`;
101923
- }).join(",\n");
101924
- return ml`
101925
- import { readFileSync } from "node:fs";
101926
- import { join } from "node:path";
101927
- import { parseArgs, styleText } from "node:util";
101928
- import { createInterface } from "node:readline";
101929
- import {
101930
- show,
101931
- truncate,
101932
- bundleSeedScript,
101933
- chunkSeedData,
101934
- executeScript,
101935
- initOperatorClient,
101936
- loadAccessToken,
101937
- loadWorkspaceId,
101938
- } from "@tailor-platform/sdk/cli";
101939
-
101940
- // Parse command-line arguments
101941
- const { values, positionals } = parseArgs({
101942
- options: {
101943
- "machine-user": { type: "string", short: "m" },
101944
- namespace: { type: "string", short: "n" },
101945
- "skip-idp": { type: "boolean", default: false },
101946
- truncate: { type: "boolean", default: false },
101947
- yes: { type: "boolean", default: false },
101948
- profile: { type: "string", short: "p" },
101949
- help: { type: "boolean", short: "h", default: false },
101950
- },
101951
- allowPositionals: true,
101952
- });
101953
-
101954
- if (values.help) {
101955
- console.log(\`
101956
- Usage: node exec.mjs [options] [types...]
101957
-
101958
- Options:
101959
- -m, --machine-user <name> Machine user name for authentication (required if not configured)
101960
- -n, --namespace <ns> Process all types in specified namespace (excludes _User)
101961
- --skip-idp Skip IdP user (_User) entity
101962
- --truncate Truncate tables before seeding
101963
- --yes Skip confirmation prompts (for truncate)
101964
- -p, --profile <name> Workspace profile name
101965
- -h, --help Show help
101966
-
101967
- Examples:
101968
- node exec.mjs -m admin # Process all types with machine user
101969
- node exec.mjs --namespace <namespace> # Process tailordb namespace only (no _User)
101970
- node exec.mjs User Order # Process specific types only
101971
- node exec.mjs --skip-idp # Process all except _User
101972
- node exec.mjs --truncate # Truncate all tables, then seed all
101973
- node exec.mjs --truncate --yes # Truncate all tables without confirmation, then seed all
101974
- node exec.mjs --truncate --namespace <namespace> # Truncate tailordb, then seed tailordb
101975
- node exec.mjs --truncate User Order # Truncate User and Order, then seed them
101976
- \`);
101977
- process.exit(0);
101978
- }
101979
-
101980
- // Helper function to prompt for y/n confirmation
101981
- const promptConfirmation = (question) => {
101982
- const rl = createInterface({
101983
- input: process.stdin,
101984
- output: process.stdout,
101985
- });
101986
-
101987
- return new Promise((resolve) => {
101988
- rl.question(styleText("yellow", question), (answer) => {
101989
- rl.close();
101990
- resolve(answer.toLowerCase().trim());
101991
- });
101992
- });
101993
- };
101994
-
101995
- const configDir = import.meta.dirname;
101996
- const configPath = join(configDir, "${relativeConfigPath}");
101997
-
101998
- // Determine machine user name (CLI argument takes precedence over config default)
101999
- const defaultMachineUser = ${defaultMachineUserName ? `"${defaultMachineUserName}"` : "undefined"};
102000
- const machineUserName = values["machine-user"] || defaultMachineUser;
102001
-
102002
- if (!machineUserName) {
102003
- console.error(styleText("red", "Error: Machine user name is required."));
102004
- console.error(styleText("yellow", "Specify --machine-user <name> or configure machineUserName in generator options."));
102005
- process.exit(1);
102006
- }
102007
-
102008
- // Entity configuration
102009
- const namespaceEntities = {
102010
- ${namespaceEntitiesEntries}
102011
- };
102012
- const namespaceDeps = {
102013
- ${namespaceDepsEntries}
102014
- };
102015
- const entities = Object.values(namespaceEntities).flat();
102016
- const hasIdpUser = ${String(hasIdpUser)};
102017
-
102018
- // Determine which entities to process
102019
- let entitiesToProcess = null;
102020
-
102021
- const hasNamespace = !!values.namespace;
102022
- const hasTypes = positionals.length > 0;
102023
- const skipIdp = values["skip-idp"];
102024
-
102025
- // Validate mutually exclusive options
102026
- const optionCount = [hasNamespace, hasTypes].filter(Boolean).length;
102027
- if (optionCount > 1) {
102028
- console.error(styleText("red", "Error: Options --namespace and type names are mutually exclusive."));
102029
- process.exit(1);
102030
- }
102031
-
102032
- // --skip-idp and --namespace are redundant (namespace already excludes _User)
102033
- if (skipIdp && hasNamespace) {
102034
- console.warn(styleText("yellow", "Warning: --skip-idp is redundant with --namespace (namespace filtering already excludes _User)."));
102035
- }
102036
-
102037
- // Filter by namespace (automatically excludes _User as it has no namespace)
102038
- if (hasNamespace) {
102039
- const namespace = values.namespace;
102040
- entitiesToProcess = namespaceEntities[namespace];
102041
-
102042
- if (!entitiesToProcess || entitiesToProcess.length === 0) {
102043
- console.error(styleText("red", \`Error: No entities found in namespace "\${namespace}"\`));
102044
- console.error(styleText("yellow", \`Available namespaces: \${Object.keys(namespaceEntities).join(", ")}\`));
102045
- process.exit(1);
102046
- }
102047
-
102048
- console.log(styleText("cyan", \`Filtering by namespace: \${namespace}\`));
102049
- console.log(styleText("dim", \`Entities: \${entitiesToProcess.join(", ")}\`));
102050
- }
102051
-
102052
- // Filter by specific types
102053
- if (hasTypes) {
102054
- const requestedTypes = positionals;
102055
- const notFoundTypes = [];
102056
- const allTypes = hasIdpUser ? [...entities, "_User"] : entities;
102057
-
102058
- entitiesToProcess = requestedTypes.filter((type) => {
102059
- if (!allTypes.includes(type)) {
102060
- notFoundTypes.push(type);
102061
- return false;
102062
- }
102063
- return true;
102064
- });
102065
-
102066
- if (notFoundTypes.length > 0) {
102067
- console.error(styleText("red", \`Error: The following types were not found: \${notFoundTypes.join(", ")}\`));
102068
- console.error(styleText("yellow", \`Available types: \${allTypes.join(", ")}\`));
102069
- process.exit(1);
102070
- }
102071
-
102072
- console.log(styleText("cyan", \`Filtering by types: \${entitiesToProcess.join(", ")}\`));
102073
- }
102074
-
102075
- // Apply --skip-idp filter
102076
- if (skipIdp) {
102077
- if (entitiesToProcess) {
102078
- entitiesToProcess = entitiesToProcess.filter((entity) => entity !== "_User");
102079
- } else {
102080
- entitiesToProcess = entities.filter((entity) => entity !== "_User");
102081
- }
102082
- }
102083
-
102084
- // Get application info
102085
- const appInfo = await show({ configPath, profile: values.profile });
102086
- const authNamespace = appInfo.auth;
102087
-
102088
- // Initialize operator client (once for all namespaces)
102089
- const accessToken = await loadAccessToken({ profile: values.profile, useProfile: true });
102090
- const workspaceId = await loadWorkspaceId({ profile: values.profile });
102091
- const operatorClient = await initOperatorClient(accessToken);
102092
-
102093
- ${generateIdpUserTruncateFunction(hasIdpUser, idpNamespace)}
102094
-
102095
- // Truncate tables if requested
102096
- if (values.truncate) {
102097
- const answer = values.yes ? "y" : await promptConfirmation("Are you sure you want to truncate? (y/n): ");
102098
- if (answer !== "y") {
102099
- console.log(styleText("yellow", "Truncate cancelled."));
102100
- process.exit(0);
102101
- }
102102
-
102103
- console.log(styleText("cyan", "Truncating tables..."));
102104
-
102105
- try {
102106
- if (hasNamespace) {
102107
- await truncate({
102108
- configPath,
102109
- profile: values.profile,
102110
- namespace: values.namespace,
102111
- });
102112
- } else if (hasTypes) {
102113
- const typesToTruncate = entitiesToProcess.filter((t) => t !== "_User");
102114
- if (typesToTruncate.length > 0) {
102115
- await truncate({
102116
- configPath,
102117
- profile: values.profile,
102118
- types: typesToTruncate,
102119
- });
102120
- } else {
102121
- console.log(styleText("dim", "No TailorDB types to truncate (only _User was specified)."));
102122
- }
102123
- } else {
102124
- await truncate({
102125
- configPath,
102126
- profile: values.profile,
102127
- all: true,
102128
- });
102129
- }
102130
- } catch (error) {
102131
- console.error(styleText("red", \`Truncate failed: \${error.message}\`));
102132
- process.exit(1);
102133
- }
102134
-
102135
- ${generateIdpUserTruncateCall(hasIdpUser)}
102136
-
102137
- console.log(styleText("green", "Truncate completed."));
102138
- }
102139
-
102140
- console.log(styleText("cyan", "\\nStarting seed data generation..."));
102141
- if (skipIdp) {
102142
- console.log(styleText("dim", \` Skipping IdP user (_User)\`));
102143
- }
102144
-
102145
- // Load seed data from JSONL files
102146
- const loadSeedData = (dataDir, typeNames) => {
102147
- const data = {};
102148
- for (const typeName of typeNames) {
102149
- const jsonlPath = join(dataDir, \`\${typeName}.jsonl\`);
102150
- try {
102151
- const content = readFileSync(jsonlPath, "utf-8").trim();
102152
- if (content) {
102153
- data[typeName] = content.split("\\n").map((line) => JSON.parse(line));
102154
- } else {
102155
- data[typeName] = [];
102156
- }
102157
- } catch (error) {
102158
- if (error.code === "ENOENT") {
102159
- data[typeName] = [];
102160
- } else {
102161
- throw error;
102162
- }
102163
- }
102164
- }
102165
- return data;
102166
- };
102167
-
102168
- // Topological sort for dependency order
102169
- const topologicalSort = (types, deps) => {
102170
- const visited = new Set();
102171
- const result = [];
102172
-
102173
- const visit = (type) => {
102174
- if (visited.has(type)) return;
102175
- visited.add(type);
102176
- const typeDeps = deps[type] || [];
102177
- for (const dep of typeDeps) {
102178
- if (types.includes(dep)) {
102179
- visit(dep);
102180
- }
102181
- }
102182
- result.push(type);
102183
- };
102184
-
102185
- for (const type of types) {
102186
- visit(type);
102187
- }
102188
- return result;
102189
- };
102190
-
102191
- // Seed TailorDB types via testExecScript
102192
- const seedViaTestExecScript = async (namespace, typesToSeed, deps) => {
102193
- const dataDir = join(configDir, "data");
102194
- const sortedTypes = topologicalSort(typesToSeed, deps);
102195
- const data = loadSeedData(dataDir, sortedTypes);
102196
-
102197
- // Skip if no data
102198
- const typesWithData = sortedTypes.filter((t) => data[t] && data[t].length > 0);
102199
- if (typesWithData.length === 0) {
102200
- console.log(styleText("dim", \` [\${namespace}] No data to seed\`));
102201
- return { success: true, processed: {} };
102202
- }
102203
-
102204
- console.log(styleText("cyan", \` [\${namespace}] Seeding \${typesWithData.length} types via Kysely batch insert...\`));
102205
-
102206
- // Bundle seed script
102207
- const bundled = await bundleSeedScript(namespace, typesWithData);
102208
-
102209
- // Chunk seed data to fit within gRPC message size limits
102210
- const chunks = chunkSeedData({
102211
- data,
102212
- order: sortedTypes,
102213
- codeByteSize: new TextEncoder().encode(bundled.bundledCode).length,
102214
- });
102215
-
102216
- if (chunks.length === 0) {
102217
- console.log(styleText("dim", \` [\${namespace}] No data to seed\`));
102218
- return { success: true, processed: {} };
102219
- }
102220
-
102221
- if (chunks.length > 1) {
102222
- console.log(styleText("dim", \` Split into \${chunks.length} chunks\`));
102223
- }
102224
-
102225
- const allProcessed = {};
102226
- let hasError = false;
102227
- const allErrors = [];
102228
-
102229
- for (const chunk of chunks) {
102230
- if (chunks.length > 1) {
102231
- console.log(styleText("dim", \` Chunk \${chunk.index + 1}/\${chunk.total}: \${chunk.order.join(", ")}\`));
102232
- }
102233
-
102234
- // Execute seed script for this chunk
102235
- const result = await executeScript({
102236
- client: operatorClient,
102237
- workspaceId,
102238
- name: \`seed-\${namespace}.ts\`,
102239
- code: bundled.bundledCode,
102240
- arg: JSON.stringify({ data: chunk.data, order: chunk.order }),
102241
- invoker: {
102242
- namespace: authNamespace,
102243
- machineUserName,
102244
- },
102245
- });
102246
-
102247
- // Parse result and display logs
102248
- if (result.logs) {
102249
- for (const line of result.logs.split("\\n").filter(Boolean)) {
102250
- console.log(styleText("dim", \` \${line}\`));
102251
- }
102252
- }
102253
-
102254
- if (result.success) {
102255
- let parsed;
102256
- try {
102257
- const parsedResult = JSON.parse(result.result || "{}");
102258
- parsed = parsedResult && typeof parsedResult === "object" ? parsedResult : {};
102259
- } catch (error) {
102260
- const message = error instanceof Error ? error.message : String(error);
102261
- console.error(styleText("red", \` ✗ Failed to parse seed result: \${message}\`));
102262
- hasError = true;
102263
- allErrors.push(message);
102264
- continue;
102265
- }
102266
-
102267
- const processed = parsed.processed || {};
102268
- for (const [type, count] of Object.entries(processed)) {
102269
- allProcessed[type] = (allProcessed[type] || 0) + count;
102270
- console.log(styleText("green", \` ✓ \${type}: \${count} rows inserted\`));
102271
- }
102272
-
102273
- if (!parsed.success) {
102274
- const errors = Array.isArray(parsed.errors) ? parsed.errors : [];
102275
- const errorMessage =
102276
- errors.length > 0 ? errors.join("\\n ") : "Seed script reported failure";
102277
- console.error(styleText("red", \` ✗ Seed failed:\\n \${errorMessage}\`));
102278
- hasError = true;
102279
- allErrors.push(errorMessage);
102280
- }
102281
- } else {
102282
- console.error(styleText("red", \` ✗ Seed failed: \${result.error}\`));
102283
- hasError = true;
102284
- allErrors.push(result.error);
102285
- }
102286
- }
102287
-
102288
- if (hasError) {
102289
- return { success: false, error: allErrors.join("\\n") };
102290
- }
102291
- return { success: true, processed: allProcessed };
102292
- };
102293
-
102294
- ${generateIdpUserSeedFunction(hasIdpUser, idpNamespace)}
102295
-
102296
- // Main execution
102297
- try {
102298
- let allSuccess = true;
102299
-
102300
- // Determine which namespaces and types to process
102301
- const namespacesToProcess = hasNamespace
102302
- ? [values.namespace]
102303
- : Object.keys(namespaceEntities);
102304
-
102305
- for (const namespace of namespacesToProcess) {
102306
- const nsTypes = namespaceEntities[namespace] || [];
102307
- const nsDeps = namespaceDeps[namespace] || {};
102308
-
102309
- // Filter types if specific types requested
102310
- let typesToSeed = entitiesToProcess
102311
- ? nsTypes.filter((t) => entitiesToProcess.includes(t))
102312
- : nsTypes;
102313
-
102314
- if (typesToSeed.length === 0) continue;
102315
-
102316
- const result = await seedViaTestExecScript(namespace, typesToSeed, nsDeps);
102317
- if (!result.success) {
102318
- allSuccess = false;
102319
- }
102320
- }
102321
-
102322
- ${generateIdpUserSeedCall(hasIdpUser)}
102323
-
102324
- if (allSuccess) {
102325
- console.log(styleText("green", "\\n✓ Seed data generation completed successfully"));
102326
- } else {
102327
- console.error(styleText("red", "\\n✗ Seed data generation completed with errors"));
102328
- process.exit(1);
102329
- }
102330
- } catch (error) {
102331
- console.error(styleText("red", \`\\n✗ Seed data generation failed: \${error.message}\`));
102332
- process.exit(1);
102333
- }
102334
-
102335
- `;
102336
- }
102337
- /**
102338
- * Factory function to create a Seed generator.
102339
- * Combines Kysely batch insert and lines-db schema generation.
102340
- * @param options - Seed generator options
102341
- * @returns Seed generator
102342
- */
102343
- function createSeedGenerator(options) {
102344
- return {
102345
- id: SeedGeneratorID,
102346
- description: "Generates seed data files (Kysely batch insert + tailor.idp.Client for _User)",
102347
- dependencies: ["tailordb"],
102348
- processType: ({ type, source, namespace }) => {
102349
- return {
102350
- typeInfo: processSeedTypeInfo(type, namespace),
102351
- linesDb: processLinesDb(type, source)
102352
- };
102353
- },
102354
- processTailorDBNamespace: ({ types: types$2 }) => types$2,
102355
- aggregate: ({ input, configPath }) => {
102356
- const files = [];
102357
- const namespaceConfigs = [];
102358
- for (const nsResult of input.tailordb) {
102359
- if (!nsResult.types) continue;
102360
- const outputBaseDir = options.distPath;
102361
- const types$2 = [];
102362
- const dependencies = {};
102363
- for (const [_typeName, metadata] of Object.entries(nsResult.types)) {
102364
- const { typeInfo, linesDb } = metadata;
102365
- types$2.push(typeInfo.name);
102366
- dependencies[typeInfo.name] = typeInfo.dependencies;
102367
- files.push({
102368
- path: path$20.join(outputBaseDir, typeInfo.dataFile),
102369
- content: "",
102370
- skipIfExists: true
102371
- });
102372
- const schemaOutputPath = path$20.join(outputBaseDir, "data", `${linesDb.typeName}.schema.ts`);
102373
- if (linesDb.pluginSource && linesDb.pluginSource.pluginImportPath) {
102374
- let originalImportPath;
102375
- if (linesDb.pluginSource.originalFilePath && linesDb.pluginSource.originalExportName) {
102376
- const relativePath = path$20.relative(path$20.dirname(schemaOutputPath), linesDb.pluginSource.originalFilePath);
102377
- originalImportPath = relativePath.replace(/\.ts$/, "").startsWith(".") ? relativePath.replace(/\.ts$/, "") : `./${relativePath.replace(/\.ts$/, "")}`;
102378
- }
102379
- const schemaContent = generateLinesDbSchemaFileWithPluginAPI(linesDb, {
102380
- configImportPath: path$20.relative(path$20.dirname(schemaOutputPath), configPath),
102381
- originalImportPath
102382
- });
102383
- files.push({
102384
- path: schemaOutputPath,
102385
- content: schemaContent
102386
- });
102387
- } else {
102388
- const relativePath = path$20.relative(path$20.dirname(schemaOutputPath), linesDb.importPath);
102389
- const schemaContent = generateLinesDbSchemaFile(linesDb, relativePath.replace(/\.ts$/, "").startsWith(".") ? relativePath.replace(/\.ts$/, "") : `./${relativePath.replace(/\.ts$/, "")}`);
102390
- files.push({
102391
- path: schemaOutputPath,
102392
- content: schemaContent
102393
- });
102394
- }
102395
- }
102396
- namespaceConfigs.push({
102397
- namespace: nsResult.namespace,
102398
- types: types$2,
102399
- dependencies
102400
- });
102401
- }
102402
- const idpUser = input.auth ? processIdpUser(input.auth) : null;
102403
- const hasIdpUser = idpUser !== null;
102404
- if (idpUser) {
102405
- const outputBaseDir = options.distPath;
102406
- files.push({
102407
- path: path$20.join(outputBaseDir, idpUser.dataFile),
102408
- content: "",
102409
- skipIfExists: true
102410
- });
102411
- files.push({
102412
- path: path$20.join(outputBaseDir, "data", `${idpUser.name}.schema.ts`),
102413
- content: generateIdpUserSchemaFile(idpUser.schema.usernameField, idpUser.schema.userTypeName)
102414
- });
102415
- }
102416
- const relativeConfigPath = path$20.relative(options.distPath, configPath);
102417
- files.push({
102418
- path: path$20.join(options.distPath, "exec.mjs"),
102419
- content: generateExecScript(options.machineUserName, relativeConfigPath, namespaceConfigs, hasIdpUser, idpUser?.idpNamespace ?? null)
102420
- });
102421
- return { files };
102422
- }
102423
- };
102424
- }
102425
-
102426
100975
  //#endregion
102427
100976
  //#region src/cli/mock.ts
102428
100977
  globalThis.tailordb = { Client: class {
@@ -102436,26 +100985,13 @@ globalThis.tailordb = { Client: class {
102436
100985
 
102437
100986
  //#endregion
102438
100987
  //#region src/cli/config-loader.ts
102439
- const GeneratorConfigSchema = z.union([
102440
- KyselyTypeConfigSchema,
102441
- SeedConfigSchema,
102442
- EnumConstantsConfigSchema,
102443
- FileUtilsConfigSchema,
102444
- CodeGeneratorSchema
102445
- ]).transform((gen) => {
102446
- if (!Array.isArray(gen)) return gen;
102447
- const [id, options] = gen;
102448
- switch (id) {
102449
- case KyselyGeneratorID: return createKyselyGenerator(options);
102450
- case SeedGeneratorID: return createSeedGenerator(options);
102451
- case EnumConstantsGeneratorID: return createEnumConstantsGenerator(options);
102452
- case FileUtilsGeneratorID: return createFileUtilsGenerator(options);
102453
- default: {
102454
- const _exhaustive = id;
102455
- throw new Error(`Unknown generator ID: ${_exhaustive}`);
102456
- }
102457
- }
102458
- }).brand("CodeGenerator");
100988
+ const builtinPlugins = new Map([
100989
+ [KyselyGeneratorID, (options) => kyselyTypePlugin(options)],
100990
+ [SeedGeneratorID, (options) => seedPlugin(options)],
100991
+ [EnumConstantsGeneratorID, (options) => enumConstantsPlugin(options)],
100992
+ [FileUtilsGeneratorID, (options) => fileUtilsPlugin(options)]
100993
+ ]);
100994
+ const GeneratorConfigSchema = CodeGeneratorSchema.brand("CodeGenerator");
102459
100995
  const PluginConfigSchema = createPluginConfigSchema();
102460
100996
  /**
102461
100997
  * Load Tailor configuration file and associated generators and plugins.
@@ -102474,16 +101010,27 @@ async function loadConfig(configPath) {
102474
101010
  for (const value of Object.values(configModule)) if (Array.isArray(value)) {
102475
101011
  const generatorParsed = value.reduce((acc, item) => {
102476
101012
  if (!acc.success) return acc;
101013
+ const baseResult = BaseGeneratorConfigSchema.safeParse(item);
101014
+ if (baseResult.success && Array.isArray(baseResult.data)) {
101015
+ const [id, options] = baseResult.data;
101016
+ const pluginFactory = builtinPlugins.get(id);
101017
+ if (pluginFactory) {
101018
+ acc.convertedPlugins.push(pluginFactory(options));
101019
+ return acc;
101020
+ }
101021
+ }
102477
101022
  const result = GeneratorConfigSchema.safeParse(item);
102478
101023
  if (result.success) acc.items.push(result.data);
102479
101024
  else acc.success = false;
102480
101025
  return acc;
102481
101026
  }, {
102482
101027
  success: true,
102483
- items: []
101028
+ items: [],
101029
+ convertedPlugins: []
102484
101030
  });
102485
- if (generatorParsed.success && generatorParsed.items.length > 0) {
101031
+ if (generatorParsed.success && (generatorParsed.items.length > 0 || generatorParsed.convertedPlugins.length > 0)) {
102486
101032
  allGenerators.push(...generatorParsed.items);
101033
+ allPlugins.push(...generatorParsed.convertedPlugins);
102487
101034
  continue;
102488
101035
  }
102489
101036
  const pluginParsed = value.reduce((acc, item) => {
@@ -103051,7 +101598,8 @@ const IdPUserAuthPolicySchema = z.object({
103051
101598
  passwordMinLength: z.number().int().refine((val) => val >= 6 && val <= 30, { message: "passwordMinLength must be between 6 and 30" }).optional(),
103052
101599
  passwordMaxLength: z.number().int().refine((val) => val >= 6 && val <= 4096, { message: "passwordMaxLength must be between 6 and 4096" }).optional(),
103053
101600
  allowedEmailDomains: z.array(z.string()).optional(),
103054
- allowGoogleOauth: z.boolean().optional()
101601
+ allowGoogleOauth: z.boolean().optional(),
101602
+ disablePasswordAuth: z.boolean().optional()
103055
101603
  }).refine((data$1) => data$1.passwordMinLength === void 0 || data$1.passwordMaxLength === void 0 || data$1.passwordMinLength <= data$1.passwordMaxLength, {
103056
101604
  message: "passwordMinLength must be less than or equal to passwordMaxLength",
103057
101605
  path: ["passwordMinLength"]
@@ -103064,6 +101612,12 @@ const IdPUserAuthPolicySchema = z.object({
103064
101612
  }).refine((data$1) => !data$1.allowGoogleOauth || data$1.allowedEmailDomains && data$1.allowedEmailDomains.length > 0, {
103065
101613
  message: "allowGoogleOauth requires allowedEmailDomains to be set",
103066
101614
  path: ["allowGoogleOauth"]
101615
+ }).refine((data$1) => !data$1.disablePasswordAuth || data$1.allowGoogleOauth === true, {
101616
+ message: "disablePasswordAuth requires allowGoogleOauth to be enabled",
101617
+ path: ["disablePasswordAuth"]
101618
+ }).refine((data$1) => !data$1.disablePasswordAuth || !data$1.allowSelfPasswordReset, {
101619
+ message: "disablePasswordAuth cannot be used with allowSelfPasswordReset",
101620
+ path: ["disablePasswordAuth"]
103067
101621
  });
103068
101622
  const IdPSchema = z.object({
103069
101623
  name: z.string(),
@@ -103187,6 +101741,10 @@ function defineExecutor(config, hasPluginExecutors) {
103187
101741
  if (!config && !hasPluginExecutors) return;
103188
101742
  return createExecutorService({ config: config ?? { files: [] } });
103189
101743
  }
101744
+ function defineWorkflow(config) {
101745
+ if (!config) return;
101746
+ return createWorkflowService({ config });
101747
+ }
103190
101748
  function defineStaticWebsites(websites) {
103191
101749
  const staticWebsiteServices = [];
103192
101750
  const websiteNames = /* @__PURE__ */ new Set();
@@ -103224,7 +101782,7 @@ function buildApplication(params) {
103224
101782
  idpServices: params.idpResult.idpServices,
103225
101783
  authService: params.authResult.authService,
103226
101784
  executorService: params.executorService,
103227
- workflowConfig: params.workflowConfig,
101785
+ workflowService: params.workflowService,
103228
101786
  staticWebsiteServices: params.staticWebsiteServices,
103229
101787
  env: params.env,
103230
101788
  get applications() {
@@ -103244,11 +101802,12 @@ function defineApplication(params) {
103244
101802
  const { config, pluginManager } = params;
103245
101803
  const services = defineServices(config, pluginManager);
103246
101804
  const executorService = defineExecutor(config.executor, false);
101805
+ const workflowService = defineWorkflow(config.workflow);
103247
101806
  return buildApplication({
103248
101807
  config,
103249
101808
  ...services,
103250
101809
  executorService,
103251
- workflowConfig: config.workflow,
101810
+ workflowService,
103252
101811
  env: config.env ?? {}
103253
101812
  });
103254
101813
  }
@@ -103264,7 +101823,7 @@ function generatePluginFilesIfNeeded(pluginManager, tailorDBServices, configPath
103264
101823
  if (!pluginManager) return [];
103265
101824
  const sourceTypeInfoMap = /* @__PURE__ */ new Map();
103266
101825
  for (const db of tailorDBServices) {
103267
- const typeSourceInfo = db.getTypeSourceInfo();
101826
+ const typeSourceInfo = db.typeSourceInfo;
103268
101827
  for (const [typeName, sourceInfo] of Object.entries(typeSourceInfo)) if (sourceInfo.filePath) sourceTypeInfoMap.set(typeName, {
103269
101828
  filePath: sourceInfo.filePath,
103270
101829
  exportName: sourceInfo.exportName
@@ -103294,9 +101853,9 @@ async function loadApplication(params) {
103294
101853
  }
103295
101854
  const pluginExecutorFiles = generatePluginFilesIfNeeded(pluginManager, tailordbResult.tailorDBServices, config.path);
103296
101855
  const executorService = defineExecutor(config.executor, pluginExecutorFiles.length > 0);
103297
- const workflowConfig = config.workflow;
103298
- const workflowResult = workflowConfig ? await loadAndCollectJobs(workflowConfig) : void 0;
103299
- const triggerContext = await buildTriggerContext(workflowConfig);
101856
+ const workflowService = defineWorkflow(config.workflow);
101857
+ if (workflowService) await workflowService.loadWorkflows();
101858
+ const triggerContext = await buildTriggerContext(config.workflow);
103300
101859
  for (const pipeline of resolverResult.resolverServices) await bundleResolvers(pipeline.namespace, pipeline.config, triggerContext);
103301
101860
  if (executorService) await bundleExecutors({
103302
101861
  config: executorService.config,
@@ -103304,16 +101863,16 @@ async function loadApplication(params) {
103304
101863
  additionalFiles: [...pluginExecutorFiles]
103305
101864
  });
103306
101865
  let workflowBuildResult;
103307
- if (workflowResult && workflowResult.jobs.length > 0) {
103308
- const mainJobNames = workflowResult.workflowSources.map((ws) => ws.workflow.mainJob.name);
103309
- workflowBuildResult = await bundleWorkflowJobs(workflowResult.jobs, mainJobNames, config.env ?? {}, triggerContext);
101866
+ if (workflowService && workflowService.jobs.length > 0) {
101867
+ const mainJobNames = workflowService.workflowSources.map((ws) => ws.workflow.mainJob.name);
101868
+ workflowBuildResult = await bundleWorkflowJobs(workflowService.jobs, mainJobNames, config.env ?? {}, triggerContext);
103310
101869
  }
103311
101870
  for (const pipeline of resolverResult.resolverServices) await pipeline.loadResolvers();
103312
101871
  if (executorService) {
103313
101872
  await executorService.loadExecutors();
103314
101873
  if (pluginExecutorFiles.length > 0) await executorService.loadPluginExecutorFiles([...pluginExecutorFiles]);
103315
101874
  }
103316
- if (workflowResult) printLoadedWorkflows(workflowResult);
101875
+ if (workflowService) workflowService.printLoadedWorkflows();
103317
101876
  logger.newline();
103318
101877
  return {
103319
101878
  application: buildApplication({
@@ -103323,15 +101882,14 @@ async function loadApplication(params) {
103323
101882
  idpResult,
103324
101883
  authResult,
103325
101884
  executorService,
103326
- workflowConfig,
101885
+ workflowService,
103327
101886
  staticWebsiteServices,
103328
101887
  env: config.env ?? {}
103329
101888
  }),
103330
- workflowResult,
103331
101889
  workflowBuildResult
103332
101890
  };
103333
101891
  }
103334
101892
 
103335
101893
  //#endregion
103336
- export { UserProfileProviderConfig_UserProfileProviderType as $, TailorDBGQLPermission_Action as A, ExecutorJobStatus as B, platformBaseUrl as C, WorkspacePlatformUserRole as D, readPackageJson as E, TailorDBType_PermitAction as F, AuthOAuth2Client_ClientType as G, ExecutorTriggerType as H, PipelineResolver_OperationType as I, AuthSCIMAttribute_Type as J, AuthOAuth2Client_GrantType as K, IdPLang as L, TailorDBGQLPermission_Permit as M, TailorDBType_Permission_Operator as N, WorkflowExecution_Status as O, TailorDBType_Permission_Permit as P, TenantProviderConfig_TenantProviderType as Q, FunctionExecution_Status as R, initOperatorClient as S, userAgent as T, AuthIDPConfig_AuthType as U, ExecutorTargetType as V, AuthInvokerSchema$1 as W, AuthSCIMConfig_AuthorizationType as X, AuthSCIMAttribute_Uniqueness as Y, PATScope as Z, writePlatformConfig as _, hasDependency as a, ApplicationSchemaUpdateAttemptStatus as at, fetchUserInfo as b, OAuth2ClientSchema as c, styles as ct, fetchLatestToken as d, GetApplicationSchemaHealthResponse_ApplicationSchemaHealthStatus as et, loadAccessToken as f, readPlatformConfig as g, loadWorkspaceId as h, loadConfig as i, PageDirection as it, TailorDBGQLPermission_Operator as j, WorkflowJobExecution_Status as k, stringifyFunction as l, symbols as lt, loadOrganizationId as m, generatePluginFilesIfNeeded as n, Condition_Operator as nt, getDistDir as o, Subgraph_ServiceType as ot, loadFolderId as p, AuthSCIMAttribute_Mutability as q, loadApplication as r, FilterSchema as rt, createExecutorService as s, logger as st, defineApplication as t, ConditionSchema as tt, tailorUserMap as u, fetchAll as v, resolveStaticWebsiteUrls as w, initOAuth2Client as x, fetchMachineUserToken as y, FunctionExecution_Type as z };
103337
- //# sourceMappingURL=application-DYfVZVPT.mjs.map
101894
+ export { UserProfileProviderConfig_UserProfileProviderType as $, TailorDBGQLPermission_Action as A, ExecutorJobStatus as B, platformBaseUrl as C, WorkspacePlatformUserRole as D, readPackageJson as E, TailorDBType_PermitAction as F, AuthOAuth2Client_ClientType as G, ExecutorTriggerType as H, PipelineResolver_OperationType as I, AuthSCIMAttribute_Type as J, AuthOAuth2Client_GrantType as K, IdPLang as L, TailorDBGQLPermission_Permit as M, TailorDBType_Permission_Operator as N, WorkflowExecution_Status as O, TailorDBType_Permission_Permit as P, TenantProviderConfig_TenantProviderType as Q, FunctionExecution_Status as R, initOperatorClient as S, userAgent as T, AuthIDPConfig_AuthType as U, ExecutorTargetType as V, AuthInvokerSchema$1 as W, AuthSCIMConfig_AuthorizationType as X, AuthSCIMAttribute_Uniqueness as Y, PATScope as Z, writePlatformConfig as _, buildExecutorArgsExpr as a, ApplicationSchemaUpdateAttemptStatus as at, fetchUserInfo as b, createExecutorService as c, styles as ct, fetchLatestToken as d, GetApplicationSchemaHealthResponse_ApplicationSchemaHealthStatus as et, loadAccessToken as f, readPlatformConfig as g, loadWorkspaceId as h, loadConfig as i, PageDirection as it, TailorDBGQLPermission_Operator as j, WorkflowJobExecution_Status as k, OAuth2ClientSchema as l, symbols as lt, loadOrganizationId as m, generatePluginFilesIfNeeded as n, Condition_Operator as nt, buildResolverOperationHookExpr as o, Subgraph_ServiceType as ot, loadFolderId as p, AuthSCIMAttribute_Mutability as q, loadApplication as r, FilterSchema as rt, getDistDir as s, logger as st, defineApplication as t, ConditionSchema as tt, stringifyFunction as u, fetchAll as v, resolveStaticWebsiteUrls as w, initOAuth2Client as x, fetchMachineUserToken as y, FunctionExecution_Type as z };
101895
+ //# sourceMappingURL=application-gWUyKuzv.mjs.map