twenty 2.50.0 → 2.51.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/app-template/package.json +1 -1
  2. package/dist/app-template/yarn.lock +220 -173
  3. package/dist/app-worker.cjs +1 -1
  4. package/dist/chunks/application-DOWikeQt.cjs +5 -0
  5. package/dist/chunks/{build-pull-entities-DUmEo3aj.cjs → build-pull-entities-ShVsLh_s.cjs} +2 -2
  6. package/dist/chunks/{build-source-manifest-BeFnnS85.cjs → build-source-manifest-Gw2TI8Xe.cjs} +1 -1
  7. package/dist/chunks/{build-source-snapshot-Cqb4LMAC.cjs → build-source-snapshot-lbc2Pb7D.cjs} +19 -19
  8. package/dist/chunks/{check-node-requirement-CGBKvEqH.cjs → check-node-requirement-B_hf2E32.cjs} +1 -1
  9. package/dist/chunks/cli-version.constant-B92ETb2e.cjs +1 -0
  10. package/dist/chunks/{collect-translatable-strings-D9iJWM3B.cjs → collect-translatable-strings-DWRZN9zQ.cjs} +1 -1
  11. package/dist/chunks/{collect-watch-inputs-CSE6DsGE.cjs → collect-watch-inputs-CS4oNP1F.cjs} +1 -1
  12. package/dist/chunks/{compile-application-translations-eYLVYoTD.cjs → compile-application-translations-DS6jGOV4.cjs} +1 -1
  13. package/dist/chunks/{constants-BAi8jZf9-C7iTUxcn.cjs → constants-D-caeNc5-9rDzSg5B.cjs} +1 -1
  14. package/dist/chunks/{convert-to-label-DB0PYecG.cjs → convert-to-label-hx-g0Lvj.cjs} +1 -1
  15. package/dist/chunks/{create-http-status-error-CCASIoUs.cjs → create-http-status-error-E0DUDIUP.cjs} +1 -1
  16. package/dist/chunks/create-metadata-client-9IF8ArjT.cjs +6 -0
  17. package/dist/chunks/{create-pull-base-write-Lh9yrY5q.cjs → create-pull-base-write-JW3ZTnaC.cjs} +1 -1
  18. package/dist/chunks/{create-rest-client-C-uI61ur.cjs → create-rest-client-PU2Uyfnb.cjs} +1 -1
  19. package/dist/chunks/{extract-manifest-from-file-yeNBn6po.cjs → extract-manifest-from-file-nrU-X7g7.cjs} +1 -1
  20. package/dist/chunks/{extract-source-translations-CZW5S9vg.cjs → extract-source-translations-EiwJs83j.cjs} +1 -1
  21. package/dist/chunks/{fetch-metadata-inspection-CHOmOnq5.cjs → fetch-metadata-inspection-CeqzcB_x.cjs} +1 -1
  22. package/dist/chunks/{fetch-signed-in-identity-BSx-tgUO.cjs → fetch-signed-in-identity-B49Tf79K.cjs} +1 -1
  23. package/dist/chunks/{fetch-workspace-id-Bg2V_cma.cjs → fetch-workspace-id-CsvJDu8b.cjs} +1 -1
  24. package/dist/chunks/format-body-CyNgSGIx.cjs +1 -0
  25. package/dist/chunks/{format-data-value-Dcn0aNoJ.cjs → format-data-value-kug8Yjt2.cjs} +1 -1
  26. package/dist/chunks/{format-metadata-fields-BpiTZFjv.cjs → format-metadata-fields-BTukrGn9.cjs} +1 -1
  27. package/dist/chunks/{format-metadata-owner-c6wBFmq7.cjs → format-metadata-owner-CsQXOj_P.cjs} +1 -1
  28. package/dist/chunks/format-progress-line-DhMnjGkz.cjs +1 -0
  29. package/dist/chunks/{generate-application-client-9tS8r18c.cjs → generate-application-client-B3Fen9_7.cjs} +1 -1
  30. package/dist/chunks/{get-app-plan-summary-DOhqg3eL.cjs → get-app-plan-summary-C-CQdNrh.cjs} +2 -2
  31. package/dist/chunks/{get-client-generation-skip-reason-D3_AAZQP.cjs → get-client-generation-skip-reason-BVkBgZWQ.cjs} +1 -1
  32. package/dist/chunks/{get-function-input-schema-GNk3NRLJ-BvvX155j.cjs → get-function-input-schema-GNk3NRLJ-DTFC8CbW.cjs} +1 -1
  33. package/dist/chunks/{global-flags.constant-DaR1vQnA.cjs → global-flags.constant-Bd-dYByR.cjs} +1 -1
  34. package/dist/chunks/is-access-token-expiring-DT6D8bMy.cjs +1 -0
  35. package/dist/chunks/{is-application-not-found-error-DxO-ftTG.cjs → is-application-not-found-error-Cja7iQrL.cjs} +1 -1
  36. package/dist/chunks/{is-exported-manifest-Cq0Sjj23.cjs → is-exported-manifest-DnQNK9XY.cjs} +1 -1
  37. package/dist/chunks/is-locale-catalog-CUFLOiRx.cjs +1 -0
  38. package/dist/chunks/is-supported-locale-xFJcoWeE.cjs +1 -0
  39. package/dist/chunks/{locale-catalog-format-DwZh0gOt.cjs → locale-catalog-format-CgKjHqcW.cjs} +2 -2
  40. package/dist/chunks/metadata-DkXpEhJh.cjs +1 -0
  41. package/dist/chunks/{metadata-page.constant-CX7U7xM8.cjs → metadata-page.constant-CxWuBtP5.cjs} +1 -1
  42. package/dist/chunks/{parse-api-url-BeUTFxSv.cjs → parse-api-url-CFCz3xUA.cjs} +1 -1
  43. package/dist/chunks/{parse-app-export-CaLKxant.cjs → parse-app-export-DFV_KqHM.cjs} +1 -1
  44. package/dist/chunks/parse-extraction-locale-C7Gdd3Oa.cjs +1 -0
  45. package/dist/chunks/{parse-graphql-response-DSSJWiGu.cjs → parse-graphql-response-BcKxw_s9.cjs} +1 -1
  46. package/dist/chunks/{parse-json-input-BOUh0Y2U.cjs → parse-json-input-CO-KP4XZ.cjs} +1 -1
  47. package/dist/chunks/{print-typescript-value-BU2EWXuF.cjs → print-typescript-value-D5kLR9wo.cjs} +1 -1
  48. package/dist/chunks/{pull-source-DqAHeLk7.cjs → pull-source-BKm8k5WI.cjs} +1 -1
  49. package/dist/chunks/{read-app-identity-CdFKlGlw.cjs → read-app-identity-Da5yI23t.cjs} +1 -1
  50. package/dist/chunks/{read-application-identifier-Cckd5Pm1.cjs → read-application-identifier-C3qn6MSa.cjs} +1 -1
  51. package/dist/chunks/{read-application-identity-B8iACpb4.cjs → read-application-identity-DgEOK9zh.cjs} +1 -1
  52. package/dist/chunks/{read-config-DYzGn3dk.cjs → read-config-Qwl4pAO8.cjs} +1 -1
  53. package/dist/chunks/read-json-object-BXZs97qz.cjs +1 -0
  54. package/dist/chunks/{read-snapshot-file-CQ_tHUot.cjs → read-snapshot-file-CxPJh0Bk.cjs} +1 -1
  55. package/dist/chunks/{read-source-identity-SwqTRFjJ.cjs → read-source-identity-BM-MsOjA.cjs} +1 -1
  56. package/dist/chunks/{record-pull-base-CH-q0A8T.cjs → record-pull-base-DwoMDnXm.cjs} +1 -1
  57. package/dist/chunks/{record-typecheck-config-inputs-DWzR6mUU.cjs → record-typecheck-config-inputs-CmF0bbqm.cjs} +1 -1
  58. package/dist/chunks/{request-oauth-tokens-XMt_yPua.cjs → request-oauth-tokens-QdDt7j8i.cjs} +1 -1
  59. package/dist/chunks/{resolve-app-project-Dc5KpCDh.cjs → resolve-app-project-B0KRR-xp.cjs} +1 -1
  60. package/dist/chunks/{resolve-command-target-Dv9k9ic2.cjs → resolve-command-target-BWCnYRCn.cjs} +1 -1
  61. package/dist/chunks/{resolve-inside-sdk-BK6jFT6V.cjs → resolve-inside-sdk-DiEOTO12.cjs} +1 -1
  62. package/dist/chunks/{resolve-metadata-object-Dlprkb-X.cjs → resolve-metadata-object-BSDYVuzQ.cjs} +1 -1
  63. package/dist/chunks/{resolve-project-typescript-BWyUXLJM.cjs → resolve-project-typescript-vMtmufcP.cjs} +1 -1
  64. package/dist/chunks/{resolve-request-url-B6KNhoFa.cjs → resolve-request-url-BvOe0vYd.cjs} +1 -1
  65. package/dist/chunks/{resolve-source-sdk-C0_F9oUQ.cjs → resolve-source-sdk-BNnltA8w.cjs} +1 -1
  66. package/dist/chunks/{run-api-graphql-command-CVdIic7q.cjs → run-api-graphql-command-Df2FAGpA.cjs} +1 -1
  67. package/dist/chunks/{run-api-rest-command-DgF7Vh0j.cjs → run-api-rest-command-2YvvMh8h.cjs} +1 -1
  68. package/dist/chunks/{run-app-add-command-4wAkXDW2.cjs → run-app-add-command-C0ojf2K6.cjs} +5 -5
  69. package/dist/chunks/{run-app-apply-command-DOPPX88t.cjs → run-app-apply-command-DM_46_Gl.cjs} +2 -2
  70. package/dist/chunks/{run-app-build-command-VoObCeD2.cjs → run-app-build-command-DA7o-ebo.cjs} +1 -1
  71. package/dist/chunks/{run-app-dev-command-DqY3qjVy.cjs → run-app-dev-command-DkerkLC8.cjs} +2 -2
  72. package/dist/chunks/{run-app-exec-command-CasOptA2.cjs → run-app-exec-command-CpNraBBq.cjs} +2 -2
  73. package/dist/chunks/{run-app-generate-client-command-BdOjFITA.cjs → run-app-generate-client-command-a5IQE60M.cjs} +1 -1
  74. package/dist/chunks/run-app-init-command-ktxmLunJ.cjs +2 -0
  75. package/dist/chunks/{run-app-install-command-DDkBjstj.cjs → run-app-install-command-AG25zpGx.cjs} +1 -1
  76. package/dist/chunks/{run-app-logs-command-DPOtBKPs.cjs → run-app-logs-command-Dd-OBwhF.cjs} +3 -3
  77. package/dist/chunks/{run-app-operation-Dt8_tKmi.cjs → run-app-operation-BLlHL5Nk.cjs} +1 -1
  78. package/dist/chunks/{run-app-plan-command-CusqLQ3f.cjs → run-app-plan-command-7Bi90BQp.cjs} +1 -1
  79. package/dist/chunks/{run-app-publish-command-COhfOFpj.cjs → run-app-publish-command-9zd_f_a3.cjs} +2 -2
  80. package/dist/chunks/{run-app-pull-command-C9GHMbgF.cjs → run-app-pull-command-CdArJFPT.cjs} +2 -2
  81. package/dist/chunks/{run-app-translations-extract-command-DWEinGqX.cjs → run-app-translations-extract-command-DrUZkCUW.cjs} +1 -1
  82. package/dist/chunks/{run-app-typecheck-command-CGrsPEx6.cjs → run-app-typecheck-command-CQe2CTGd.cjs} +1 -1
  83. package/dist/chunks/{run-app-uninstall-command-i7a4Jem9.cjs → run-app-uninstall-command--RFHGXiH.cjs} +1 -1
  84. package/dist/chunks/{run-auth-login-command-DaXPK5wd.cjs → run-auth-login-command-Cb3bITQj.cjs} +1 -1
  85. package/dist/chunks/{run-auth-logout-command-W7tRzWph.cjs → run-auth-logout-command-iC22soKN.cjs} +1 -1
  86. package/dist/chunks/{run-auth-status-command-B0dAwETL.cjs → run-auth-status-command-C0rdb747.cjs} +1 -1
  87. package/dist/chunks/{run-cli-CAoDm_W8.cjs → run-cli-CwAoqiMW.cjs} +7 -7
  88. package/dist/chunks/{run-commands-command-ZjKeKGKY.cjs → run-commands-command-Dp-Xzn5x.cjs} +1 -1
  89. package/dist/chunks/{run-data-get-command-B77up-s7.cjs → run-data-get-command-D7czgisf.cjs} +1 -1
  90. package/dist/chunks/{run-data-list-command-RwomiIPV.cjs → run-data-list-command-CUp_FN_I.cjs} +1 -1
  91. package/dist/chunks/{run-doctor-command-vxHdUzhC.cjs → run-doctor-command-C-gOPvp9.cjs} +2 -2
  92. package/dist/chunks/{run-metadata-field-describe-command-B_NgZ7Ms.cjs → run-metadata-field-describe-command-7xrRVRwr.cjs} +1 -1
  93. package/dist/chunks/{run-metadata-field-list-command-BGYdnELQ.cjs → run-metadata-field-list-command-CpIUXOmy.cjs} +1 -1
  94. package/dist/chunks/{run-metadata-object-describe-command-J85iBAkc.cjs → run-metadata-object-describe-command--cIPFkWW.cjs} +1 -1
  95. package/dist/chunks/{run-metadata-object-list-command-Bql6RG8g.cjs → run-metadata-object-list-command-CQ1jcSJc.cjs} +1 -1
  96. package/dist/chunks/{run-open-command-BNX-l7r7.cjs → run-open-command-DLe3PYqB.cjs} +1 -1
  97. package/dist/chunks/{run-remote-list-command-D6aUDed3.cjs → run-remote-list-command-DV-Ruk98.cjs} +1 -1
  98. package/dist/chunks/{run-remote-remove-command-D0Mb9tkZ.cjs → run-remote-remove-command-C1JeH5mK.cjs} +1 -1
  99. package/dist/chunks/{run-remote-rename-command-BgjOFYNE.cjs → run-remote-rename-command-CCVu4hEw.cjs} +1 -1
  100. package/dist/chunks/{run-remote-use-command-zGfFYq-A.cjs → run-remote-use-command-BvqWgEsP.cjs} +1 -1
  101. package/dist/chunks/{run-version-command-DwZTxHuu.cjs → run-version-command-D4R17bRL.cjs} +1 -1
  102. package/dist/chunks/{select-target-CKoOXLSW.cjs → select-target-DZlm8j62.cjs} +1 -1
  103. package/dist/chunks/{sign-in-to-remote-again-BhpxdF8v.cjs → sign-in-to-remote-again-WEIeFaAT.cjs} +1 -1
  104. package/dist/chunks/{sign-in-with-browser-BrB5btVu.cjs → sign-in-with-browser-BUvT_awm.cjs} +1 -1
  105. package/dist/chunks/to-public-target-bNT50le0.cjs +1 -0
  106. package/dist/chunks/{to-worker-output-diagnostics-eE_POlPf.cjs → to-worker-output-diagnostics-BzdY4Z2V.cjs} +1 -1
  107. package/dist/chunks/{typecheck-application-P6akOoSs.cjs → typecheck-application-dVtzoMDg.cjs} +2 -2
  108. package/dist/chunks/{update-config-BNB8Mkee.cjs → update-config-CnB7lDVC.cjs} +1 -1
  109. package/dist/chunks/{utils-D6KY4-gU-rSlFwrTC.cjs → utils-CvvLHbc4-CKDJ1YgX.cjs} +20 -17
  110. package/dist/chunks/{write-config-atomically-eVpizD-t.cjs → write-config-atomically-DkRUfbw0.cjs} +1 -1
  111. package/dist/cli.cjs +1 -1
  112. package/package.json +2 -2
  113. package/dist/chunks/application-C02vC9wC.cjs +0 -5
  114. package/dist/chunks/cli-version.constant-jQjsWsAO.cjs +0 -1
  115. package/dist/chunks/create-metadata-client-DsTAacZG.cjs +0 -6
  116. package/dist/chunks/format-body-DqhC3QLB.cjs +0 -1
  117. package/dist/chunks/format-progress-line-CeE356w0.cjs +0 -1
  118. package/dist/chunks/is-access-token-expiring-jLfrOp26.cjs +0 -1
  119. package/dist/chunks/is-locale-catalog-DjsopIs-.cjs +0 -1
  120. package/dist/chunks/is-supported-locale-CdAUON0G.cjs +0 -1
  121. package/dist/chunks/metadata-Dojezbdo.cjs +0 -1
  122. package/dist/chunks/parse-extraction-locale-DMjUY8zC.cjs +0 -1
  123. package/dist/chunks/read-json-object-VckLNpsj.cjs +0 -1
  124. package/dist/chunks/run-app-init-command-DFNSImQ4.cjs +0 -2
  125. package/dist/chunks/to-public-target-DYS-Zlyh.cjs +0 -1
@@ -0,0 +1 @@
1
+ const e=require("./utils-CvvLHbc4-CKDJ1YgX.cjs"),t=require("./constants-D-caeNc5-9rDzSg5B.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./is-supported-locale-xFJcoWeE.cjs");var i=i=>{if(t.Ut(i)){if(i===`en`||!r.t(i))throw new n.t({code:`USAGE`,exitCode:n.n.USAGE,message:`"${i}" is not a supported target locale.`,hint:`Choose one of: ${Object.keys(e.d).filter(e=>e!==`en`).join(`, `)}.`});return i}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return i}});
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./resolve-request-url-B6KNhoFa.cjs"),i=require("./create-http-status-error-CCASIoUs.cjs");var a={core:`/graphql`,metadata:`/metadata`},o=e.t(),s=e=>{let n=t.v(e)?e:{};return{message:(0,o.isString)(n.message)?n.message:`Unknown GraphQL error`,path:(0,o.isArray)(n.path)?n.path:null,code:t.v(n.extensions)&&(0,o.isString)(n.extensions.code)?n.extensions.code:null,...t.v(n.extensions)&&(0,o.isString)(n.extensions.subCode)?{subCode:n.extensions.subCode}:{}}},c=e=>e.length===1?e[0].message:`${e[0].message} (and ${e.length-1} more errors)`,l=({errors:e,data:t,status:r,headers:a,target:o})=>{let l=e.map(s),u=l.map(e=>e.code),d={status:r,headers:i.n(a),errors:l,data:t??null};return r===401||u.includes(`UNAUTHENTICATED`)?new n.t({code:`AUTH_REQUIRED`,exitCode:n.n.AUTHENTICATION,message:`${o.apiUrl} rejected the credentials.`,hint:i.r(o),details:d}):r===403||u.includes(`FORBIDDEN`)?new n.t({code:`PERMISSION_DENIED`,exitCode:n.n.AUTHENTICATION,message:c(l),details:d}):new n.t({code:`GRAPHQL_ERROR`,message:c(l),details:d})},u=async({response:e,target:a})=>{let s=await r.n(e),c=t.v(s)?s:void 0;if((0,o.isNonEmptyArray)(c?.errors))throw l({errors:c.errors,data:c.data,status:e.status,headers:e.headers,target:a});if(!e.ok)throw i.t({status:e.status,headers:e.headers,body:s,target:a});if(!t.Vt(c)||!(`data`in c))throw new n.t({code:`INVALID_RESPONSE`,message:`The server answered without a GraphQL result.`,details:{status:e.status,headers:i.n(e.headers),body:s}});return{data:t.v(c.data)?c.data:null}};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-D-caeNc5-9rDzSg5B.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./resolve-request-url-BvOe0vYd.cjs"),i=require("./create-http-status-error-E0DUDIUP.cjs");var a={core:`/graphql`,metadata:`/metadata`},o=e.t(),s=e=>{let n=t.u(e)?e:{};return{message:(0,o.isString)(n.message)?n.message:`Unknown GraphQL error`,path:(0,o.isArray)(n.path)?n.path:null,code:t.u(n.extensions)&&(0,o.isString)(n.extensions.code)?n.extensions.code:null,...t.u(n.extensions)&&(0,o.isString)(n.extensions.subCode)?{subCode:n.extensions.subCode}:{}}},c=e=>e.length===1?e[0].message:`${e[0].message} (and ${e.length-1} more errors)`,l=({errors:e,data:t,status:r,headers:a,target:o})=>{let l=e.map(s),u=l.map(e=>e.code),d={status:r,headers:i.n(a),errors:l,data:t??null};return r===401||u.includes(`UNAUTHENTICATED`)?new n.t({code:`AUTH_REQUIRED`,exitCode:n.n.AUTHENTICATION,message:`${o.apiUrl} rejected the credentials.`,hint:i.r(o),details:d}):r===403||u.includes(`FORBIDDEN`)?new n.t({code:`PERMISSION_DENIED`,exitCode:n.n.AUTHENTICATION,message:c(l),details:d}):new n.t({code:`GRAPHQL_ERROR`,message:c(l),details:d})},u=async({response:e,target:a})=>{let s=await r.n(e),c=t.u(s)?s:void 0;if((0,o.isNonEmptyArray)(c?.errors))throw l({errors:c.errors,data:c.data,status:e.status,headers:e.headers,target:a});if(!e.ok)throw i.t({status:e.status,headers:e.headers,body:s,target:a});if(!t.Ut(c)||!(`data`in c))throw new n.t({code:`INVALID_RESPONSE`,message:`The server answered without a GraphQL result.`,details:{status:e.status,headers:i.n(e.headers),body:s}});return{data:t.u(c.data)?c.data:null}};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
@@ -1 +1 @@
1
- const e=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),t=require("./cli-error-CSsayo0u.cjs");var n=(e,n)=>new t.t({code:`INVALID_INPUT`,exitCode:t.n.USAGE,message:`${e} is not valid JSON: ${n}`}),r=({text:e,optionName:t})=>{try{return JSON.parse(e)}catch(e){throw n(t,e instanceof Error?e.message:String(e))}},i=({text:t,optionName:i})=>{let a=r({text:t,optionName:i});if(!e.v(a))throw n(i,`expected a JSON object.`);return a};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return r}});
1
+ const e=require("./constants-D-caeNc5-9rDzSg5B.cjs"),t=require("./cli-error-CSsayo0u.cjs");var n=(e,n)=>new t.t({code:`INVALID_INPUT`,exitCode:t.n.USAGE,message:`${e} is not valid JSON: ${n}`}),r=({text:e,optionName:t})=>{try{return JSON.parse(e)}catch(e){throw n(t,e instanceof Error?e.message:String(e))}},i=({text:t,optionName:i})=>{let a=r({text:t,optionName:i});if(!e.u(a))throw n(i,`expected a JSON object.`);return a};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return r}});
@@ -1,3 +1,3 @@
1
- const e=require("./constants-BAi8jZf9-C7iTUxcn.cjs");var t=/^[A-Za-z_$][A-Za-z0-9_$]*$/,n=`__proto__`,r=e=>`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`).replace(/\r/g,`\\r`).replace(/\u2028/g,`\\u2028`).replace(/\u2029/g,`\\u2029`).replace(/[\uD800-\uDFFF]/g,e=>`\\u${e.charCodeAt(0).toString(16).padStart(4,`0`)}`)}'`,i=e=>e===n?`[${r(e)}]`:t.test(e)?e:r(e),a=e=>` `.repeat(e),o=({value:t,depth:n=0,path:s=[],resolveEnumSymbol:c})=>{if(t===null)return`null`;if(typeof t==`string`){let n=c?.({path:s,value:t});return e.Vt(n)?n:r(t)}if(typeof t==`number`||typeof t==`boolean`)return String(t);if(Array.isArray(t))return t.length===0?`[]`:`[\n${t.map(e=>`${a(n+1)}${o({value:e,depth:n+1,path:[...s,`[]`],resolveEnumSymbol:c})},`).join(`
1
+ const e=require("./constants-D-caeNc5-9rDzSg5B.cjs");var t=/^[A-Za-z_$][A-Za-z0-9_$]*$/,n=`__proto__`,r=e=>`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`).replace(/\r/g,`\\r`).replace(/\u2028/g,`\\u2028`).replace(/\u2029/g,`\\u2029`).replace(/[\uD800-\uDFFF]/g,e=>`\\u${e.charCodeAt(0).toString(16).padStart(4,`0`)}`)}'`,i=e=>e===n?`[${r(e)}]`:t.test(e)?e:r(e),a=e=>` `.repeat(e),o=({value:t,depth:n=0,path:s=[],resolveEnumSymbol:c})=>{if(t===null)return`null`;if(typeof t==`string`){let n=c?.({path:s,value:t});return e.Ut(n)?n:r(t)}if(typeof t==`number`||typeof t==`boolean`)return String(t);if(Array.isArray(t))return t.length===0?`[]`:`[\n${t.map(e=>`${a(n+1)}${o({value:e,depth:n+1,path:[...s,`[]`],resolveEnumSymbol:c})},`).join(`
2
2
  `)}\n${a(n)}]`;if(typeof t==`object`){let e=Object.entries(t).filter(([,e])=>e!==void 0);return e.length===0?`{}`:`{\n${e.map(([e,t])=>`${a(n+1)}${i(e)}: ${o({value:t,depth:n+1,path:[...s,e],resolveEnumSymbol:c})},`).join(`
3
3
  `)}\n${a(n)}}`}return`null`};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return o}});
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),n=require("./application-C02vC9wC.cjs"),r=require("./cli-error-CSsayo0u.cjs"),i=require("./fs-utils-Bl1fQcaJ.cjs"),a=require("./get-tooling-error-context-C69TBSej.cjs"),o=require("./list-application-source-files-jEau5Rie.cjs"),s=require("./extract-manifest-from-file-yeNBn6po.cjs"),c=require("./locale-catalog-format-DwZh0gOt.cjs"),l=require("./constants-Cf5-CwMu.cjs"),u=require("./is-supported-locale-CdAUON0G.cjs"),d=require("./assert-pull-paths-BuQ1ZRvQ.cjs"),f=require("./collect-translatable-strings-D9iJWM3B.cjs"),p=require("./is-locale-catalog-DjsopIs-.cjs"),m=require("./is-exported-manifest-Cq0Sjj23.cjs"),h=require("./parse-app-export-CaLKxant.cjs"),g=require("./create-pull-base-write-Lh9yrY5q.cjs"),_=require("./build-pull-entities-DUmEo3aj.cjs"),v=require("./read-application-identity-B8iACpb4.cjs"),y=require("./kebab-case-D0usAzG-.cjs");let b=require("node:fs/promises"),x=require("node:path"),S=require("node:module"),C=require("esbuild");var w=e.t(),T=({value:e,identifiers:n})=>{(0,w.isArray)(e)?e.forEach(e=>T({value:e,identifiers:n})):t.v(e)&&((0,w.isString)(e.universalIdentifier)&&n.add(e.universalIdentifier.toLowerCase()),Object.values(e).forEach(e=>T({value:e,identifiers:n})))},E=async({manifest:e,frontComponentSourcePaths:n})=>{let r=[...f.t(e),...await f.n(n)],i=new Map(r.map(e=>[c.a(e.message,e.context),e]));return Object.entries(e.translations??{}).filter(e=>u.t(e[0])&&p.t(e[1])).sort(([e],[t])=>e.localeCompare(t)).map(([e,n])=>{let r=[],a={};for(let[e,o]of Object.entries(n)){let n=i.get(e);t.Vt(n)?r.push({message:n.message,context:n.context,translation:o}):a[e]=o}return{locale:e,authored:c.t(r),compiled:a}})},D=e=>t.Vt(e)&&typeof e==`object`&&!Array.isArray(e),O=e=>`${JSON.stringify(e,null,2)}\n`,k=e=>{if(!t.Vt(e))return{};try{let n=JSON.parse(e);return t.Vt(n)&&typeof n==`object`?n:{}}catch{return{}}},A=({message:e,context:t})=>JSON.stringify([t??null,e]),j=({catalog:e,existingAuthoredContent:t,existingCompiledContent:n})=>{let r=new Set(c.n(e.authored).map(e=>c.a(e.message,e.context))),i=new Set(Object.keys(k(n)).filter(t=>!(t in e.compiled)&&r.has(t)));if(i.size===0)return null;let a=c.n(k(t)),o=new Set(a.map(A)),s=c.n(e.authored).filter(e=>i.has(c.a(e.message,e.context))&&!o.has(A(e)));return c.t([...a,...s])},M=e=>`${l.n}/${e}.json`,N=e=>`${l.t}/${e}.json`,P=async e=>await i.i(e)?await(0,b.readFile)(e,`utf8`):null,F=async({appPath:e,manifest:n,baseManifest:r,frontComponentSourcePaths:a})=>{let o=[],s=[],c={},l=n.translations;if(!D(l))return{writes:o,deletions:s,compiledEntryCountByLocale:c};let d=await E({manifest:n,frontComponentSourcePaths:a}),f=new Set(Object.keys(l)),m=D(r?.translations)?r.translations:{},h=l;for(let n of d){let{locale:r,authored:i,compiled:a}=n,l=Object.keys(a).length;l>0&&(c[r]=l);let u=M(r),d=N(r),f=await P((0,x.join)(e,u)),p=await P((0,x.join)(e,d)),g=r in m&&JSON.stringify(m[r])===JSON.stringify(h[r]),_=(Object.keys(i).length===0||t.Vt(f))&&(l===0||t.Vt(p)),v=g&&_?j({catalog:n,existingAuthoredContent:f,existingCompiledContent:p}):null;if(g&&_&&!t.Vt(v))continue;let y=[{relativePath:u,content:O(v??i),isWanted:Object.keys(v??i).length>0,existingContent:f},{relativePath:d,content:O(a),isWanted:l>0,existingContent:p}];for(let{relativePath:e,content:n,isWanted:i,existingContent:a}of y){let c=t.Vt(a);if(!i){c&&e===d&&s.push({universalIdentifier:r,relativePath:e});continue}a!==n&&o.push({kind:`translation`,requiredSdkExports:[],universalIdentifier:r,relativePath:e,content:n,isRegeneration:c})}}for(let[t,n]of Object.entries(m))if(!(f.has(t)||!u.t(t)||!p.t(n)))for(let n of[M(t),N(t)])await i.i((0,x.join)(e,n))&&s.push({universalIdentifier:t,relativePath:n});return{writes:o,deletions:s,compiledEntryCountByLocale:c}},I=async({appPath:e,baseManifest:n,writes:r,deletions:i,frontComponentSourcePaths:a,sourceFingerprints:o,baseEntities:s})=>{if(!t.Vt(n))return[];let c=new Map(s.map(e=>[e.universalIdentifier,_.i({definer:e.definer,config:e.config,enumBindings:e.enumBindings}).content])),l=await F({appPath:e,manifest:n,baseManifest:null,frontComponentSourcePaths:a}),u=new Map(l.writes.map(e=>[e.relativePath,e.content])),d=new Set(l.deletions.map(({relativePath:e})=>e)),f=[];for(let{universalIdentifier:n,relativePath:a}of[...r.filter(e=>e.isRegeneration),...i]){let r=o?.[a];if(t.Vt(r)){g.i(await(0,b.readFile)((0,x.join)(e,a)))!==r&&f.push({universalIdentifier:n,relativePath:a});continue}let i=c.get(n)??u.get(a);(d.has(a)||t.Vt(i)&&await(0,b.readFile)((0,x.join)(e,a),`utf8`)!==i)&&f.push({universalIdentifier:n,relativePath:a})}return f},ee=async({appPath:e,applicationExport:n,target:r,signal:i})=>{i.throwIfAborted();let a=g.n(r);if(await d.t({appPath:e,relativePaths:[g.r]}),!t.v(JSON.parse(await(0,b.readFile)((0,x.join)(e,`package.json`),`utf8`))))throw Error(`Pull requires a project with a package.json object.`);if(n.files.length>0)throw Error(`This CLI cannot reconcile exported source or dependency files.`);let o=await v.t({appPath:e,signal:i});if(t.Vt(o.application)&&o.application.universalIdentifier.toLowerCase()!==n.application.universalIdentifier.toLowerCase())throw Error(`This project declares application ${o.application.universalIdentifier}, but the export belongs to ${n.application.universalIdentifier}. Pull it into a different directory.`);return i.throwIfAborted(),{applicationExport:n,target:a}},te=({entities:e,unreconciledUniversalIdentifiers:n})=>e.map(e=>{if(e.kind!==`application`||!t.v(e.config)||!(0,w.isString)(e.config.defaultRoleUniversalIdentifier)||!n?.has(e.config.defaultRoleUniversalIdentifier.toLowerCase()))return e;let{defaultRoleUniversalIdentifier:r,...i}=e.config;return{...e,config:i}}),ne=({manifest:e,baseManifest:n,scannedFiles:r,unreconciledUniversalIdentifiers:i})=>{let a=new Map;for(let e of r)e.isReadable&&t.Vt(e.universalIdentifier)&&a.set(e.universalIdentifier.toLowerCase(),e);let{entities:o,skipped:s}=_.n(e,a);return{entities:o,baseEntities:te({entities:t.Vt(n)?_.n(n,a).entities:[],unreconciledUniversalIdentifiers:i}),skipped:s}},L=({entities:e,baseEntities:n,protectedIdentifiers:r,writes:i,deletions:a,scannedFiles:o})=>{let s=new Set;T({value:n,identifiers:s});let c=new Map(o.map(e=>{let t=new Set;return T({value:e.config,identifiers:t}),[e.relativePath.split(`\\`).join(`/`),t]})),l=new Map(e.map(e=>[e.universalIdentifier.toLowerCase(),e.config])),u=new Map(n.map(e=>[e.universalIdentifier.toLowerCase(),e])),d=[...i.filter(e=>e.kind!==`translation`&&e.isRegeneration),...a.flatMap(e=>{let n=u.get(e.universalIdentifier.toLowerCase());return t.Vt(n)?[{...e,kind:n.kind}]:[]})],f=[],p=new Set,m;do{m=p.size;let e=new Map(c);for(let t of i){if(t.kind===`translation`||p.has(t.relativePath))continue;let n=new Set;T({value:l.get(t.universalIdentifier.toLowerCase()),identifiers:n}),e.set(t.relativePath,n)}for(let t of a)p.has(t.relativePath)||e.delete(t.relativePath);let n=new Set([...e.values()].flatMap(e=>[...e]));for(let e of d){if(p.has(e.relativePath)||e.kind===`translation`)continue;let i=[...c.get(e.relativePath)??[]].find(e=>!n.has(e)&&(r.has(e)||!s.has(e)));t.Vt(i)&&(p.add(e.relativePath),f.push({kind:e.kind,universalIdentifier:e.universalIdentifier,reason:`preserving ${e.relativePath}, replacement would remove nested local definition ${i} without a confirmed remote deletion`}))}}while(p.size!==m);return{writes:i.filter(e=>!p.has(e.relativePath)),deletions:a.filter(e=>!p.has(e.relativePath)),skipped:f}},R=({manifest:e,baseManifest:n,unreconciledUniversalIdentifiers:r,protectedIdentifiers:i})=>{let a=e=>t.v(e)&&(0,w.isString)(e.universalIdentifier)?e.universalIdentifier.toLowerCase():void 0,o=(e,n)=>{let o=new Map(n.map(e=>[a(e),e])),c=e.filter(e=>{let n=a(e);return!t.Vt(n)||!r.has(n)}).map(e=>{let n=a(e),r=o.get(n);return!t.Vt(n)||!t.v(e)||!t.v(r)?e:s(e,r)}),l=new Set(c.map(a)),u=n.filter(e=>{let n=a(e);return t.Vt(n)&&!l.has(n)&&(r.has(n)||i.has(n))});return[...c,...u]},s=(e,t)=>{let n={...e};for(let r of new Set([...Object.keys(e),...Object.keys(t??{})])){let i=e[r],a=t?.[r];if(!(0,w.isArray)(i)&&!(0,w.isArray)(a))continue;let s=o((0,w.isArray)(i)?i:[],(0,w.isArray)(a)?a:[]);((0,w.isArray)(i)||s.length>0)&&(n[r]=s)}return n},c={...e,...s(e,n)};return t.Vt(n)&&r.has(e.application.universalIdentifier.toLowerCase())&&(c.application=n.application),c},z=/^[0-9a-f]{64}$/,B=e=>t.v(e)&&Object.values(e).every(e=>(0,w.isString)(e)&&z.test(e)),V=async({appPath:e,target:i,applicationUniversalIdentifier:a})=>{await d.t({appPath:e,relativePaths:[g.r]});let o=g.n(i);try{let r=JSON.parse(await(0,b.readFile)((0,x.join)(e,g.r),`utf8`));if(t.v(r)&&r.version===1)return{status:`unbound`,manifest:null};if(!t.v(r)||r.version!==2||!t.v(r.target)||!(0,w.isString)(r.target.apiUrl)||!(0,w.isString)(r.target.workspaceId)||!(0,w.isString)(r.applicationUniversalIdentifier)||!m.t(r.manifest)||r.applicationUniversalIdentifier.toLowerCase()!==r.manifest.application.universalIdentifier.toLowerCase()||t.Vt(r.unreconciledUniversalIdentifiers)&&(!(0,w.isArray)(r.unreconciledUniversalIdentifiers)||!r.unreconciledUniversalIdentifiers.every(e=>(0,w.isString)(e)&&n.a(e)))||t.Vt(r.sourceFingerprints)&&!B(r.sourceFingerprints))return{status:`unreadable`,manifest:null};let i=g.n({apiUrl:r.target.apiUrl,workspaceId:r.target.workspaceId});return i.apiUrl!==o.apiUrl||i.workspaceId!==o.workspaceId||r.applicationUniversalIdentifier.toLowerCase()!==a.toLowerCase()?{status:`other-target`,manifest:null}:{status:`used`,manifest:r.manifest,unreconciledUniversalIdentifiers:r.unreconciledUniversalIdentifiers?.filter(w.isString).map(e=>e.toLowerCase()),sourceFingerprints:B(r.sourceFingerprints)?r.sourceFingerprints:void 0}}catch(e){return{status:r.r(e,`ENOENT`)?`missing`:`unreadable`,manifest:null}}},H=e=>e,U=({appPath:e,writes:n})=>{let i=new Set(n.flatMap(e=>e.requiredSdkExports));if(i.size===0)return;let a=(0,S.createRequire)((0,x.join)(e,`package.json`))(`twenty-sdk/define`),o=[...i].filter(e=>!t.Vt(a[e])).sort();if(o.length>0)throw new r.t({code:`SDK_SOURCE_UNSUPPORTED`,message:`The app's twenty-sdk cannot read the generated definitions. Missing exports: ${o.join(`, `)}.`,hint:`Upgrade the app to a compatible twenty-sdk version (2.40.0 or later).`,details:{missingNames:o}})},W=`.twenty/cli`,G=async({appPath:e,writes:t,deletions:n})=>{let r=t.map(e=>e.relativePath);if(new Set(r).size!==r.length)throw Error(`Refusing to write: two entities resolved to the same file path`);let a=(0,x.resolve)(e);for(let t of[...r,...n.map(e=>e.relativePath)]){let n=(0,x.relative)(a,(0,x.resolve)(a,t));if(n.length===0||n===`..`||n.startsWith(`..${x.sep}`)||(0,x.isAbsolute)(n))throw Error(`Refusing to write: ${t} leaves the application directory`);let r=(0,x.join)(e,t);if(await i.i(r)&&(await(0,b.lstat)(r)).isDirectory())throw Error(`Refusing to write: ${t} is a directory, and pull never deletes a folder`)}},K=async({appPath:e,backupDirectory:t,relativePath:n})=>{let r=(0,x.join)(e,n);if(!await i.i(r))return!1;let a=(0,x.join)(t,n);return await i.r((0,x.dirname)(a)),await i.t(r,a),!0},q=async({appPath:e,backupDirectory:t,backedUpRelativePaths:n,writtenRelativePaths:r})=>{for(let t of r)await(0,b.rm)((0,x.join)(e,t),{force:!0});for(let r of n){let n=(0,x.join)(e,r);await i.r((0,x.dirname)(n)),await(0,b.rm)(n,{force:!0}),await i.t((0,x.join)(t,r),n)}},J=async({appPath:e,writes:t,deletions:n,finalWrite:a,signal:o})=>{let s=a?[...t,a]:t;o?.throwIfAborted(),await G({appPath:e,writes:s,deletions:n});let c=(0,x.join)(e,W);await i.r(c);let l=await(0,b.mkdtemp)((0,x.join)(c,`pull-staging-`)),u=await(0,b.mkdtemp)((0,x.join)(c,`pull-backup-`)),d=[],f=[];try{for(let e of s){let t=(0,x.join)(l,e.relativePath);await i.r((0,x.dirname)(t)),await(0,b.writeFile)(t,e.content,e===a?{mode:384}:void 0)}for(let t of[...s.map(e=>e.relativePath),...n.map(e=>e.relativePath)])await K({appPath:e,backupDirectory:u,relativePath:t})&&d.push(t);o?.throwIfAborted();for(let n of t){let t=(0,x.join)(e,n.relativePath);await i.r((0,x.dirname)(t)),f.push(n.relativePath),await i.t((0,x.join)(l,n.relativePath),t)}for(let t of n)await(0,b.rm)((0,x.join)(e,t.relativePath),{force:!0});if(a){let t=(0,x.join)(e,a.relativePath);await i.r((0,x.dirname)(t)),f.push(a.relativePath),await i.t((0,x.join)(l,a.relativePath),t)}}catch(t){try{await q({appPath:e,backupDirectory:u,backedUpRelativePaths:d,writtenRelativePaths:f.filter(e=>!d.includes(e))})}catch(e){throw await i.s(l).catch(()=>void 0),new r.t({code:`PULL_FAILED`,details:{outcome:`unknown`,backupDirectory:u},message:`Pull failed and could not restore every file it had replaced. The originals are kept in ${u}.\nOriginal failure: ${t instanceof Error?t.message:String(t)}\nRestore failure: ${e instanceof Error?e.message:String(e)}`})}throw await i.s(l),await i.s(u),o?.aborted&&Object.is(t,o.reason)?t:new r.t({code:`PULL_FAILED`,message:t instanceof Error?t.message:String(t),details:{outcome:`unchanged`}})}try{await i.s(l),await i.s(u)}catch(e){throw new r.t({code:`PULL_FAILED`,message:`Pull completed, but temporary files could not be removed: ${e instanceof Error?e.message:String(e)}`,details:{outcome:`pulled`,backupDirectory:u,stagingDirectory:l}})}},Y=[`nameSingular`,`name`,`label`,`title`],X=e=>{let n={},r=[{value:e}];for(;r.length>0;){let e=r.pop();if(!t.Vt(e))break;let{value:i,parentLabel:a}=e;if(Array.isArray(i)){for(let e of[...i].reverse())r.push({value:e,parentLabel:a});continue}if(!t.v(i))continue;let o=Y.map(e=>i[e]).find(w.isNonEmptyString),s=t.Vt(o)&&t.Vt(a)?`${a}.${o}`:o??a;t.Vt(o)&&t.Vt(s)&&(0,w.isNonEmptyString)(i.universalIdentifier)&&(n[i.universalIdentifier]=s);for(let e of Object.values(i).reverse())r.push({value:e,parentLabel:s})}return n},re=e=>{let n=new Map;for(let t of e){let e=`${t.defaultFolder}/${t.fileBaseName}${t.fileSuffix}`,r=n.get(e)??[];r.push(t),n.set(e,r)}let r=new Map;for(let e of n.values()){if(e.length===1){r.set(e[0].universalIdentifier,e[0].fileBaseName);continue}let n=e.map(e=>t.Vt(e.parentName)?_.r(`${y.t(e.parentName)}-${e.fileBaseName}`):e.fileBaseName),i=new Map;for(let e of n)i.set(e,(i.get(e)??0)+1);e.forEach((e,t)=>{let a=n[t],o=i.get(a)===1;r.set(e.universalIdentifier,o?a:_.r(`${e.universalIdentifier.slice(0,8)}-${a}`))})}return r},Z=e=>e.toLowerCase(),Q=e=>e.split(`\\`).join(`/`),ie=({scannedFiles:e,entityKey:t})=>{let n=new Map;for(let r of e){if(r.entityKey!==t)continue;let e=Q((0,x.dirname)(r.relativePath));n.set(e,(n.get(e)??0)+1)}return[...n.entries()].sort(([e,t],[n,r])=>r-t||e.localeCompare(n))[0]?.[0]??null},ae=({folder:e,fileBaseName:t,fileSuffix:n,universalIdentifier:r,takenRelativePaths:i})=>{let a=r.slice(0,8),o=[t,`${a}-${t}`,...Array.from({length:100},(e,n)=>`${a}-${t}-${n+2}`)];for(let t of o){let r=x.posix.join(e,`${t}${n}`);if(!i.has(Z(r)))return r}throw Error(`Could not find a free file name for ${r} in ${e}`)},oe=({entity:e,applicationFile:t,scannedFileByUniversalIdentifier:n})=>e.kind===`application`?t:n.get(e.universalIdentifier.toLowerCase()),se=({entities:e,baseEntities:n,scannedFiles:r,workspaceUniversalIdentifiers:i,unreconciledUniversalIdentifiers:a})=>{let o=new Set(e.map(e=>e.universalIdentifier.toLowerCase())),s=new Map(n.map(e=>[e.universalIdentifier,JSON.stringify(e.config)])),c=re(e),l=new Map,u=r.find(e=>e.entityKey===`application`);for(let e of r)t.Vt(e.universalIdentifier)&&l.set(e.universalIdentifier.toLowerCase(),e);let d=[],f=[],p=new Set,h=new Set(r.map(e=>Z(Q(e.relativePath))));for(let n of e){let e=oe({entity:n,applicationFile:u,scannedFileByUniversalIdentifier:l}),i=t.Vt(e)?Q(e.relativePath):void 0,g=ie({scannedFiles:r,entityKey:m.n[n.kind]})??n.defaultFolder,v=c.get(n.universalIdentifier)??n.fileBaseName,y=i??ae({folder:g,fileBaseName:v,fileSuffix:n.fileSuffix,universalIdentifier:n.universalIdentifier,takenRelativePaths:h});p.add(y),h.add(Z(y));let b=s.get(n.universalIdentifier),x=new Set,S=new Set;T({value:e?.config,identifiers:x}),T({value:n.config,identifiers:S});let C=[...x].some(e=>!S.has(e)&&o.has(e));if(t.Vt(e)&&e.targetFunctionName===n.definer&&!C&&!a?.has(n.universalIdentifier.toLowerCase())&&t.Vt(b)&&b===JSON.stringify(n.config)){f.push(n);continue}d.push({kind:n.kind,universalIdentifier:n.universalIdentifier,relativePath:y,..._.i({definer:n.definer,config:n.config,enumBindings:n.enumBindings}),isRegeneration:t.Vt(i)})}let g=[];for(let e of s.keys()){if(o.has(e.toLowerCase()))continue;let n=l.get(e.toLowerCase()),r=t.Vt(n)?Q(n.relativePath):void 0;!t.Vt(r)||p.has(r)||g.push({universalIdentifier:e,relativePath:r})}return{writes:d,unchanged:f,deletions:g,localOnlyRelativePaths:r.filter(e=>t.Vt(e.universalIdentifier)&&!o.has(e.universalIdentifier.toLowerCase())&&!s.has(e.universalIdentifier)&&!i.has(e.universalIdentifier)&&!p.has(Q(e.relativePath))).map(e=>Q(e.relativePath))}},ce=async({appPath:e,includeConfig:n=!1,signal:i})=>{i.throwIfAborted();let a=await o.t(e),c=[];for(let o of a){i.throwIfAborted();let a=(0,x.relative)(e,o),l;try{l=await(0,b.readFile)(o,`utf-8`)}catch{c.push({relativePath:a,entityKey:null,targetFunctionName:null,universalIdentifier:null,isReadable:!1});continue}let u=s.r(l);if(!t.Vt(u)){c.push({relativePath:a,entityKey:null,targetFunctionName:null,universalIdentifier:null,isReadable:!0});continue}let d=s.n[u],f={},p=!0;try{f=(await s.t({appPath:e,filePath:o})).config}catch(e){if(e instanceof r.t&&e.code===`SDK_SOURCE_UNSUPPORTED`)throw e;f={},p=!1}c.push({relativePath:a,entityKey:d,targetFunctionName:u,universalIdentifier:(0,w.isString)(f.universalIdentifier)?f.universalIdentifier:null,isReadable:p,...n?{config:f}:{}})}return i.throwIfAborted(),c},le=({sourceFingerprints:e={},writes:t,deletions:n})=>{let r=new Set(n.map(e=>e.relativePath));return{...Object.fromEntries(Object.entries(e).filter(([e])=>!r.has(e))),...Object.fromEntries(t.map(e=>[e.relativePath,g.i(e.content)]))}},$=async e=>{let{appPath:n,signal:i}=e;try{let{applicationExport:r,target:a}=await ee(e),o=H(r.manifest),s=await V({appPath:n,target:a,applicationUniversalIdentifier:r.application.universalIdentifier}),c=t.Vt(s.manifest)?H(s.manifest):null,l=await ce({appPath:n,includeConfig:!0,signal:i}),u=new Set(s.unreconciledUniversalIdentifiers),{entities:f,baseEntities:p,skipped:m}=ne({manifest:o,baseManifest:c,scannedFiles:l,unreconciledUniversalIdentifiers:u});i?.throwIfAborted();let h=se({entities:f,baseEntities:p,scannedFiles:l,workspaceUniversalIdentifiers:new Set(r.coverage.map(e=>e.universalIdentifier)),unreconciledUniversalIdentifiers:u}),_=new Set;T({value:o,identifiers:_}),T({value:r.coverage,identifiers:_});let v=l.filter(e=>e.entityKey===`frontComponents`).map(e=>(0,x.join)(n,e.relativePath)),y=await F({appPath:n,manifest:o,baseManifest:c,frontComponentSourcePaths:v}),b=L({entities:f,baseEntities:p,protectedIdentifiers:_,writes:h.writes,deletions:h.deletions.filter(e=>!_.has(e.universalIdentifier.toLowerCase())),scannedFiles:l}),S=[...b.writes,...y.writes],C=[...b.deletions,...y.deletions.filter(e=>t.Vt(c?.translations)&&e.universalIdentifier in c.translations)],w=[...m,...b.skipped],E=new Set(w.map(e=>e.universalIdentifier.toLowerCase())),D=g.t({target:a,manifest:R({manifest:r.manifest,baseManifest:s.manifest,unreconciledUniversalIdentifiers:E,protectedIdentifiers:_}),unreconciledUniversalIdentifiers:[...E],sourceFingerprints:le({sourceFingerprints:s.sourceFingerprints,writes:S,deletions:C})});await d.t({appPath:n,relativePaths:[...S.map(e=>e.relativePath),...C.map(e=>e.relativePath),D.relativePath]});let O=await I({appPath:n,baseManifest:c,writes:S,deletions:C,frontComponentSourcePaths:v,baseEntities:p,sourceFingerprints:s.sourceFingerprints}),k=X(o);return U({appPath:n,writes:S}),i?.throwIfAborted(),await J({appPath:n,writes:S,deletions:C,finalWrite:D,signal:i}),{success:!0,data:{application:{universalIdentifier:r.application.universalIdentifier,displayName:r.application.displayName},base:{status:s.status},writes:S.map(({content:e,requiredSdkExports:t,...n})=>n),deletions:C,overwrittenLocalChanges:O,unchangedCount:h.unchanged.length,localOnlyRelativePaths:h.localOnlyRelativePaths,unreadableRelativePaths:l.filter(e=>!e.isReadable).map(e=>e.relativePath),skipped:w,compiledTranslationEntryCountByLocale:y.compiledEntryCountByLocale,entityLabelByUniversalIdentifier:k},diagnostics:[]}}catch(e){return{success:!1,error:{code:i?.aborted&&Object.is(e,i.reason)?`CANCELLED`:e instanceof r.t?e.code:`PULL_FAILED`,message:e instanceof Error?e.message:String(e),...a.t(e),details:{outcome:`unchanged`,...e instanceof r.t?e.details:{}}},diagnostics:[]}}},ue=async e=>{try{let n=e.applicationExport,r=t.v(n)&&t.v(n.application)&&(0,w.isString)(n.application.universalIdentifier)?n.application.universalIdentifier:``;return await $({...e,applicationExport:h.t({value:n,universalIdentifier:r})})}finally{await(0,C.stop)()}};exports.pullSource=ue;
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-D-caeNc5-9rDzSg5B.cjs"),n=require("./application-DOWikeQt.cjs"),r=require("./cli-error-CSsayo0u.cjs"),i=require("./fs-utils-Bl1fQcaJ.cjs"),a=require("./get-tooling-error-context-C69TBSej.cjs"),o=require("./list-application-source-files-jEau5Rie.cjs"),s=require("./extract-manifest-from-file-nrU-X7g7.cjs"),c=require("./locale-catalog-format-CgKjHqcW.cjs"),l=require("./constants-Cf5-CwMu.cjs"),u=require("./is-supported-locale-xFJcoWeE.cjs"),d=require("./assert-pull-paths-BuQ1ZRvQ.cjs"),f=require("./collect-translatable-strings-DWRZN9zQ.cjs"),p=require("./is-locale-catalog-CUFLOiRx.cjs"),m=require("./is-exported-manifest-DnQNK9XY.cjs"),h=require("./parse-app-export-DFV_KqHM.cjs"),g=require("./create-pull-base-write-JW3ZTnaC.cjs"),_=require("./build-pull-entities-ShVsLh_s.cjs"),v=require("./read-application-identity-DgEOK9zh.cjs"),y=require("./kebab-case-D0usAzG-.cjs");let b=require("node:fs/promises"),x=require("node:path"),S=require("node:module"),C=require("esbuild");var w=e.t(),T=({value:e,identifiers:n})=>{(0,w.isArray)(e)?e.forEach(e=>T({value:e,identifiers:n})):t.u(e)&&((0,w.isString)(e.universalIdentifier)&&n.add(e.universalIdentifier.toLowerCase()),Object.values(e).forEach(e=>T({value:e,identifiers:n})))},E=async({manifest:e,frontComponentSourcePaths:n})=>{let r=[...f.t(e),...await f.n(n)],i=new Map(r.map(e=>[c.a(e.message,e.context),e]));return Object.entries(e.translations??{}).filter(e=>u.t(e[0])&&p.t(e[1])).sort(([e],[t])=>e.localeCompare(t)).map(([e,n])=>{let r=[],a={};for(let[e,o]of Object.entries(n)){let n=i.get(e);t.Ut(n)?r.push({message:n.message,context:n.context,translation:o}):a[e]=o}return{locale:e,authored:c.t(r),compiled:a}})},D=e=>t.Ut(e)&&typeof e==`object`&&!Array.isArray(e),O=e=>`${JSON.stringify(e,null,2)}\n`,k=e=>{if(!t.Ut(e))return{};try{let n=JSON.parse(e);return t.Ut(n)&&typeof n==`object`?n:{}}catch{return{}}},A=({message:e,context:t})=>JSON.stringify([t??null,e]),j=({catalog:e,existingAuthoredContent:t,existingCompiledContent:n})=>{let r=new Set(c.n(e.authored).map(e=>c.a(e.message,e.context))),i=new Set(Object.keys(k(n)).filter(t=>!(t in e.compiled)&&r.has(t)));if(i.size===0)return null;let a=c.n(k(t)),o=new Set(a.map(A)),s=c.n(e.authored).filter(e=>i.has(c.a(e.message,e.context))&&!o.has(A(e)));return c.t([...a,...s])},M=e=>`${l.n}/${e}.json`,N=e=>`${l.t}/${e}.json`,P=async e=>await i.i(e)?await(0,b.readFile)(e,`utf8`):null,F=async({appPath:e,manifest:n,baseManifest:r,frontComponentSourcePaths:a})=>{let o=[],s=[],c={},l=n.translations;if(!D(l))return{writes:o,deletions:s,compiledEntryCountByLocale:c};let d=await E({manifest:n,frontComponentSourcePaths:a}),f=new Set(Object.keys(l)),m=D(r?.translations)?r.translations:{},h=l;for(let n of d){let{locale:r,authored:i,compiled:a}=n,l=Object.keys(a).length;l>0&&(c[r]=l);let u=M(r),d=N(r),f=await P((0,x.join)(e,u)),p=await P((0,x.join)(e,d)),g=r in m&&JSON.stringify(m[r])===JSON.stringify(h[r]),_=(Object.keys(i).length===0||t.Ut(f))&&(l===0||t.Ut(p)),v=g&&_?j({catalog:n,existingAuthoredContent:f,existingCompiledContent:p}):null;if(g&&_&&!t.Ut(v))continue;let y=[{relativePath:u,content:O(v??i),isWanted:Object.keys(v??i).length>0,existingContent:f},{relativePath:d,content:O(a),isWanted:l>0,existingContent:p}];for(let{relativePath:e,content:n,isWanted:i,existingContent:a}of y){let c=t.Ut(a);if(!i){c&&e===d&&s.push({universalIdentifier:r,relativePath:e});continue}a!==n&&o.push({kind:`translation`,requiredSdkExports:[],universalIdentifier:r,relativePath:e,content:n,isRegeneration:c})}}for(let[t,n]of Object.entries(m))if(!(f.has(t)||!u.t(t)||!p.t(n)))for(let n of[M(t),N(t)])await i.i((0,x.join)(e,n))&&s.push({universalIdentifier:t,relativePath:n});return{writes:o,deletions:s,compiledEntryCountByLocale:c}},I=async({appPath:e,baseManifest:n,writes:r,deletions:i,frontComponentSourcePaths:a,sourceFingerprints:o,baseEntities:s})=>{if(!t.Ut(n))return[];let c=new Map(s.map(e=>[e.universalIdentifier,_.i({definer:e.definer,config:e.config,enumBindings:e.enumBindings}).content])),l=await F({appPath:e,manifest:n,baseManifest:null,frontComponentSourcePaths:a}),u=new Map(l.writes.map(e=>[e.relativePath,e.content])),d=new Set(l.deletions.map(({relativePath:e})=>e)),f=[];for(let{universalIdentifier:n,relativePath:a}of[...r.filter(e=>e.isRegeneration),...i]){let r=o?.[a];if(t.Ut(r)){g.i(await(0,b.readFile)((0,x.join)(e,a)))!==r&&f.push({universalIdentifier:n,relativePath:a});continue}let i=c.get(n)??u.get(a);(d.has(a)||t.Ut(i)&&await(0,b.readFile)((0,x.join)(e,a),`utf8`)!==i)&&f.push({universalIdentifier:n,relativePath:a})}return f},ee=async({appPath:e,applicationExport:n,target:r,signal:i})=>{i.throwIfAborted();let a=g.n(r);if(await d.t({appPath:e,relativePaths:[g.r]}),!t.u(JSON.parse(await(0,b.readFile)((0,x.join)(e,`package.json`),`utf8`))))throw Error(`Pull requires a project with a package.json object.`);if(n.files.length>0)throw Error(`This CLI cannot reconcile exported source or dependency files.`);let o=await v.t({appPath:e,signal:i});if(t.Ut(o.application)&&o.application.universalIdentifier.toLowerCase()!==n.application.universalIdentifier.toLowerCase())throw Error(`This project declares application ${o.application.universalIdentifier}, but the export belongs to ${n.application.universalIdentifier}. Pull it into a different directory.`);return i.throwIfAborted(),{applicationExport:n,target:a}},te=({entities:e,unreconciledUniversalIdentifiers:n})=>e.map(e=>{if(e.kind!==`application`||!t.u(e.config)||!(0,w.isString)(e.config.defaultRoleUniversalIdentifier)||!n?.has(e.config.defaultRoleUniversalIdentifier.toLowerCase()))return e;let{defaultRoleUniversalIdentifier:r,...i}=e.config;return{...e,config:i}}),ne=({manifest:e,baseManifest:n,scannedFiles:r,unreconciledUniversalIdentifiers:i})=>{let a=new Map;for(let e of r)e.isReadable&&t.Ut(e.universalIdentifier)&&a.set(e.universalIdentifier.toLowerCase(),e);let{entities:o,skipped:s}=_.n(e,a);return{entities:o,baseEntities:te({entities:t.Ut(n)?_.n(n,a).entities:[],unreconciledUniversalIdentifiers:i}),skipped:s}},L=({entities:e,baseEntities:n,protectedIdentifiers:r,writes:i,deletions:a,scannedFiles:o})=>{let s=new Set;T({value:n,identifiers:s});let c=new Map(o.map(e=>{let t=new Set;return T({value:e.config,identifiers:t}),[e.relativePath.split(`\\`).join(`/`),t]})),l=new Map(e.map(e=>[e.universalIdentifier.toLowerCase(),e.config])),u=new Map(n.map(e=>[e.universalIdentifier.toLowerCase(),e])),d=[...i.filter(e=>e.kind!==`translation`&&e.isRegeneration),...a.flatMap(e=>{let n=u.get(e.universalIdentifier.toLowerCase());return t.Ut(n)?[{...e,kind:n.kind}]:[]})],f=[],p=new Set,m;do{m=p.size;let e=new Map(c);for(let t of i){if(t.kind===`translation`||p.has(t.relativePath))continue;let n=new Set;T({value:l.get(t.universalIdentifier.toLowerCase()),identifiers:n}),e.set(t.relativePath,n)}for(let t of a)p.has(t.relativePath)||e.delete(t.relativePath);let n=new Set([...e.values()].flatMap(e=>[...e]));for(let e of d){if(p.has(e.relativePath)||e.kind===`translation`)continue;let i=[...c.get(e.relativePath)??[]].find(e=>!n.has(e)&&(r.has(e)||!s.has(e)));t.Ut(i)&&(p.add(e.relativePath),f.push({kind:e.kind,universalIdentifier:e.universalIdentifier,reason:`preserving ${e.relativePath}, replacement would remove nested local definition ${i} without a confirmed remote deletion`}))}}while(p.size!==m);return{writes:i.filter(e=>!p.has(e.relativePath)),deletions:a.filter(e=>!p.has(e.relativePath)),skipped:f}},R=({manifest:e,baseManifest:n,unreconciledUniversalIdentifiers:r,protectedIdentifiers:i})=>{let a=e=>t.u(e)&&(0,w.isString)(e.universalIdentifier)?e.universalIdentifier.toLowerCase():void 0,o=(e,n)=>{let o=new Map(n.map(e=>[a(e),e])),c=e.filter(e=>{let n=a(e);return!t.Ut(n)||!r.has(n)}).map(e=>{let n=a(e),r=o.get(n);return!t.Ut(n)||!t.u(e)||!t.u(r)?e:s(e,r)}),l=new Set(c.map(a)),u=n.filter(e=>{let n=a(e);return t.Ut(n)&&!l.has(n)&&(r.has(n)||i.has(n))});return[...c,...u]},s=(e,t)=>{let n={...e};for(let r of new Set([...Object.keys(e),...Object.keys(t??{})])){let i=e[r],a=t?.[r];if(!(0,w.isArray)(i)&&!(0,w.isArray)(a))continue;let s=o((0,w.isArray)(i)?i:[],(0,w.isArray)(a)?a:[]);((0,w.isArray)(i)||s.length>0)&&(n[r]=s)}return n},c={...e,...s(e,n)};return t.Ut(n)&&r.has(e.application.universalIdentifier.toLowerCase())&&(c.application=n.application),c},z=/^[0-9a-f]{64}$/,B=e=>t.u(e)&&Object.values(e).every(e=>(0,w.isString)(e)&&z.test(e)),V=async({appPath:e,target:i,applicationUniversalIdentifier:a})=>{await d.t({appPath:e,relativePaths:[g.r]});let o=g.n(i);try{let r=JSON.parse(await(0,b.readFile)((0,x.join)(e,g.r),`utf8`));if(t.u(r)&&r.version===1)return{status:`unbound`,manifest:null};if(!t.u(r)||r.version!==2||!t.u(r.target)||!(0,w.isString)(r.target.apiUrl)||!(0,w.isString)(r.target.workspaceId)||!(0,w.isString)(r.applicationUniversalIdentifier)||!m.t(r.manifest)||r.applicationUniversalIdentifier.toLowerCase()!==r.manifest.application.universalIdentifier.toLowerCase()||t.Ut(r.unreconciledUniversalIdentifiers)&&(!(0,w.isArray)(r.unreconciledUniversalIdentifiers)||!r.unreconciledUniversalIdentifiers.every(e=>(0,w.isString)(e)&&n.a(e)))||t.Ut(r.sourceFingerprints)&&!B(r.sourceFingerprints))return{status:`unreadable`,manifest:null};let i=g.n({apiUrl:r.target.apiUrl,workspaceId:r.target.workspaceId});return i.apiUrl!==o.apiUrl||i.workspaceId!==o.workspaceId||r.applicationUniversalIdentifier.toLowerCase()!==a.toLowerCase()?{status:`other-target`,manifest:null}:{status:`used`,manifest:r.manifest,unreconciledUniversalIdentifiers:r.unreconciledUniversalIdentifiers?.filter(w.isString).map(e=>e.toLowerCase()),sourceFingerprints:B(r.sourceFingerprints)?r.sourceFingerprints:void 0}}catch(e){return{status:r.r(e,`ENOENT`)?`missing`:`unreadable`,manifest:null}}},H=e=>e,U=({appPath:e,writes:n})=>{let i=new Set(n.flatMap(e=>e.requiredSdkExports));if(i.size===0)return;let a=(0,S.createRequire)((0,x.join)(e,`package.json`))(`twenty-sdk/define`),o=[...i].filter(e=>!t.Ut(a[e])).sort();if(o.length>0)throw new r.t({code:`SDK_SOURCE_UNSUPPORTED`,message:`The app's twenty-sdk cannot read the generated definitions. Missing exports: ${o.join(`, `)}.`,hint:`Upgrade the app to a compatible twenty-sdk version (2.40.0 or later).`,details:{missingNames:o}})},W=`.twenty/cli`,G=async({appPath:e,writes:t,deletions:n})=>{let r=t.map(e=>e.relativePath);if(new Set(r).size!==r.length)throw Error(`Refusing to write: two entities resolved to the same file path`);let a=(0,x.resolve)(e);for(let t of[...r,...n.map(e=>e.relativePath)]){let n=(0,x.relative)(a,(0,x.resolve)(a,t));if(n.length===0||n===`..`||n.startsWith(`..${x.sep}`)||(0,x.isAbsolute)(n))throw Error(`Refusing to write: ${t} leaves the application directory`);let r=(0,x.join)(e,t);if(await i.i(r)&&(await(0,b.lstat)(r)).isDirectory())throw Error(`Refusing to write: ${t} is a directory, and pull never deletes a folder`)}},K=async({appPath:e,backupDirectory:t,relativePath:n})=>{let r=(0,x.join)(e,n);if(!await i.i(r))return!1;let a=(0,x.join)(t,n);return await i.r((0,x.dirname)(a)),await i.t(r,a),!0},q=async({appPath:e,backupDirectory:t,backedUpRelativePaths:n,writtenRelativePaths:r})=>{for(let t of r)await(0,b.rm)((0,x.join)(e,t),{force:!0});for(let r of n){let n=(0,x.join)(e,r);await i.r((0,x.dirname)(n)),await(0,b.rm)(n,{force:!0}),await i.t((0,x.join)(t,r),n)}},J=async({appPath:e,writes:t,deletions:n,finalWrite:a,signal:o})=>{let s=a?[...t,a]:t;o?.throwIfAborted(),await G({appPath:e,writes:s,deletions:n});let c=(0,x.join)(e,W);await i.r(c);let l=await(0,b.mkdtemp)((0,x.join)(c,`pull-staging-`)),u=await(0,b.mkdtemp)((0,x.join)(c,`pull-backup-`)),d=[],f=[];try{for(let e of s){let t=(0,x.join)(l,e.relativePath);await i.r((0,x.dirname)(t)),await(0,b.writeFile)(t,e.content,e===a?{mode:384}:void 0)}for(let t of[...s.map(e=>e.relativePath),...n.map(e=>e.relativePath)])await K({appPath:e,backupDirectory:u,relativePath:t})&&d.push(t);o?.throwIfAborted();for(let n of t){let t=(0,x.join)(e,n.relativePath);await i.r((0,x.dirname)(t)),f.push(n.relativePath),await i.t((0,x.join)(l,n.relativePath),t)}for(let t of n)await(0,b.rm)((0,x.join)(e,t.relativePath),{force:!0});if(a){let t=(0,x.join)(e,a.relativePath);await i.r((0,x.dirname)(t)),f.push(a.relativePath),await i.t((0,x.join)(l,a.relativePath),t)}}catch(t){try{await q({appPath:e,backupDirectory:u,backedUpRelativePaths:d,writtenRelativePaths:f.filter(e=>!d.includes(e))})}catch(e){throw await i.s(l).catch(()=>void 0),new r.t({code:`PULL_FAILED`,details:{outcome:`unknown`,backupDirectory:u},message:`Pull failed and could not restore every file it had replaced. The originals are kept in ${u}.\nOriginal failure: ${t instanceof Error?t.message:String(t)}\nRestore failure: ${e instanceof Error?e.message:String(e)}`})}throw await i.s(l),await i.s(u),o?.aborted&&Object.is(t,o.reason)?t:new r.t({code:`PULL_FAILED`,message:t instanceof Error?t.message:String(t),details:{outcome:`unchanged`}})}try{await i.s(l),await i.s(u)}catch(e){throw new r.t({code:`PULL_FAILED`,message:`Pull completed, but temporary files could not be removed: ${e instanceof Error?e.message:String(e)}`,details:{outcome:`pulled`,backupDirectory:u,stagingDirectory:l}})}},Y=[`nameSingular`,`name`,`label`,`title`],X=e=>{let n={},r=[{value:e}];for(;r.length>0;){let e=r.pop();if(!t.Ut(e))break;let{value:i,parentLabel:a}=e;if(Array.isArray(i)){for(let e of[...i].reverse())r.push({value:e,parentLabel:a});continue}if(!t.u(i))continue;let o=Y.map(e=>i[e]).find(w.isNonEmptyString),s=t.Ut(o)&&t.Ut(a)?`${a}.${o}`:o??a;t.Ut(o)&&t.Ut(s)&&(0,w.isNonEmptyString)(i.universalIdentifier)&&(n[i.universalIdentifier]=s);for(let e of Object.values(i).reverse())r.push({value:e,parentLabel:s})}return n},re=e=>{let n=new Map;for(let t of e){let e=`${t.defaultFolder}/${t.fileBaseName}${t.fileSuffix}`,r=n.get(e)??[];r.push(t),n.set(e,r)}let r=new Map;for(let e of n.values()){if(e.length===1){r.set(e[0].universalIdentifier,e[0].fileBaseName);continue}let n=e.map(e=>t.Ut(e.parentName)?_.r(`${y.t(e.parentName)}-${e.fileBaseName}`):e.fileBaseName),i=new Map;for(let e of n)i.set(e,(i.get(e)??0)+1);e.forEach((e,t)=>{let a=n[t],o=i.get(a)===1;r.set(e.universalIdentifier,o?a:_.r(`${e.universalIdentifier.slice(0,8)}-${a}`))})}return r},Z=e=>e.toLowerCase(),Q=e=>e.split(`\\`).join(`/`),ie=({scannedFiles:e,entityKey:t})=>{let n=new Map;for(let r of e){if(r.entityKey!==t)continue;let e=Q((0,x.dirname)(r.relativePath));n.set(e,(n.get(e)??0)+1)}return[...n.entries()].sort(([e,t],[n,r])=>r-t||e.localeCompare(n))[0]?.[0]??null},ae=({folder:e,fileBaseName:t,fileSuffix:n,universalIdentifier:r,takenRelativePaths:i})=>{let a=r.slice(0,8),o=[t,`${a}-${t}`,...Array.from({length:100},(e,n)=>`${a}-${t}-${n+2}`)];for(let t of o){let r=x.posix.join(e,`${t}${n}`);if(!i.has(Z(r)))return r}throw Error(`Could not find a free file name for ${r} in ${e}`)},oe=({entity:e,applicationFile:t,scannedFileByUniversalIdentifier:n})=>e.kind===`application`?t:n.get(e.universalIdentifier.toLowerCase()),se=({entities:e,baseEntities:n,scannedFiles:r,workspaceUniversalIdentifiers:i,unreconciledUniversalIdentifiers:a})=>{let o=new Set(e.map(e=>e.universalIdentifier.toLowerCase())),s=new Map(n.map(e=>[e.universalIdentifier,JSON.stringify(e.config)])),c=re(e),l=new Map,u=r.find(e=>e.entityKey===`application`);for(let e of r)t.Ut(e.universalIdentifier)&&l.set(e.universalIdentifier.toLowerCase(),e);let d=[],f=[],p=new Set,h=new Set(r.map(e=>Z(Q(e.relativePath))));for(let n of e){let e=oe({entity:n,applicationFile:u,scannedFileByUniversalIdentifier:l}),i=t.Ut(e)?Q(e.relativePath):void 0,g=ie({scannedFiles:r,entityKey:m.n[n.kind]})??n.defaultFolder,v=c.get(n.universalIdentifier)??n.fileBaseName,y=i??ae({folder:g,fileBaseName:v,fileSuffix:n.fileSuffix,universalIdentifier:n.universalIdentifier,takenRelativePaths:h});p.add(y),h.add(Z(y));let b=s.get(n.universalIdentifier),x=new Set,S=new Set;T({value:e?.config,identifiers:x}),T({value:n.config,identifiers:S});let C=[...x].some(e=>!S.has(e)&&o.has(e));if(t.Ut(e)&&e.targetFunctionName===n.definer&&!C&&!a?.has(n.universalIdentifier.toLowerCase())&&t.Ut(b)&&b===JSON.stringify(n.config)){f.push(n);continue}d.push({kind:n.kind,universalIdentifier:n.universalIdentifier,relativePath:y,..._.i({definer:n.definer,config:n.config,enumBindings:n.enumBindings}),isRegeneration:t.Ut(i)})}let g=[];for(let e of s.keys()){if(o.has(e.toLowerCase()))continue;let n=l.get(e.toLowerCase()),r=t.Ut(n)?Q(n.relativePath):void 0;!t.Ut(r)||p.has(r)||g.push({universalIdentifier:e,relativePath:r})}return{writes:d,unchanged:f,deletions:g,localOnlyRelativePaths:r.filter(e=>t.Ut(e.universalIdentifier)&&!o.has(e.universalIdentifier.toLowerCase())&&!s.has(e.universalIdentifier)&&!i.has(e.universalIdentifier)&&!p.has(Q(e.relativePath))).map(e=>Q(e.relativePath))}},ce=async({appPath:e,includeConfig:n=!1,signal:i})=>{i.throwIfAborted();let a=await o.t(e),c=[];for(let o of a){i.throwIfAborted();let a=(0,x.relative)(e,o),l;try{l=await(0,b.readFile)(o,`utf-8`)}catch{c.push({relativePath:a,entityKey:null,targetFunctionName:null,universalIdentifier:null,isReadable:!1});continue}let u=s.r(l);if(!t.Ut(u)){c.push({relativePath:a,entityKey:null,targetFunctionName:null,universalIdentifier:null,isReadable:!0});continue}let d=s.n[u],f={},p=!0;try{f=(await s.t({appPath:e,filePath:o})).config}catch(e){if(e instanceof r.t&&e.code===`SDK_SOURCE_UNSUPPORTED`)throw e;f={},p=!1}c.push({relativePath:a,entityKey:d,targetFunctionName:u,universalIdentifier:(0,w.isString)(f.universalIdentifier)?f.universalIdentifier:null,isReadable:p,...n?{config:f}:{}})}return i.throwIfAborted(),c},le=({sourceFingerprints:e={},writes:t,deletions:n})=>{let r=new Set(n.map(e=>e.relativePath));return{...Object.fromEntries(Object.entries(e).filter(([e])=>!r.has(e))),...Object.fromEntries(t.map(e=>[e.relativePath,g.i(e.content)]))}},$=async e=>{let{appPath:n,signal:i}=e;try{let{applicationExport:r,target:a}=await ee(e),o=H(r.manifest),s=await V({appPath:n,target:a,applicationUniversalIdentifier:r.application.universalIdentifier}),c=t.Ut(s.manifest)?H(s.manifest):null,l=await ce({appPath:n,includeConfig:!0,signal:i}),u=new Set(s.unreconciledUniversalIdentifiers),{entities:f,baseEntities:p,skipped:m}=ne({manifest:o,baseManifest:c,scannedFiles:l,unreconciledUniversalIdentifiers:u});i?.throwIfAborted();let h=se({entities:f,baseEntities:p,scannedFiles:l,workspaceUniversalIdentifiers:new Set(r.coverage.map(e=>e.universalIdentifier)),unreconciledUniversalIdentifiers:u}),_=new Set;T({value:o,identifiers:_}),T({value:r.coverage,identifiers:_});let v=l.filter(e=>e.entityKey===`frontComponents`).map(e=>(0,x.join)(n,e.relativePath)),y=await F({appPath:n,manifest:o,baseManifest:c,frontComponentSourcePaths:v}),b=L({entities:f,baseEntities:p,protectedIdentifiers:_,writes:h.writes,deletions:h.deletions.filter(e=>!_.has(e.universalIdentifier.toLowerCase())),scannedFiles:l}),S=[...b.writes,...y.writes],C=[...b.deletions,...y.deletions.filter(e=>t.Ut(c?.translations)&&e.universalIdentifier in c.translations)],w=[...m,...b.skipped],E=new Set(w.map(e=>e.universalIdentifier.toLowerCase())),D=g.t({target:a,manifest:R({manifest:r.manifest,baseManifest:s.manifest,unreconciledUniversalIdentifiers:E,protectedIdentifiers:_}),unreconciledUniversalIdentifiers:[...E],sourceFingerprints:le({sourceFingerprints:s.sourceFingerprints,writes:S,deletions:C})});await d.t({appPath:n,relativePaths:[...S.map(e=>e.relativePath),...C.map(e=>e.relativePath),D.relativePath]});let O=await I({appPath:n,baseManifest:c,writes:S,deletions:C,frontComponentSourcePaths:v,baseEntities:p,sourceFingerprints:s.sourceFingerprints}),k=X(o);return U({appPath:n,writes:S}),i?.throwIfAborted(),await J({appPath:n,writes:S,deletions:C,finalWrite:D,signal:i}),{success:!0,data:{application:{universalIdentifier:r.application.universalIdentifier,displayName:r.application.displayName},base:{status:s.status},writes:S.map(({content:e,requiredSdkExports:t,...n})=>n),deletions:C,overwrittenLocalChanges:O,unchangedCount:h.unchanged.length,localOnlyRelativePaths:h.localOnlyRelativePaths,unreadableRelativePaths:l.filter(e=>!e.isReadable).map(e=>e.relativePath),skipped:w,compiledTranslationEntryCountByLocale:y.compiledEntryCountByLocale,entityLabelByUniversalIdentifier:k},diagnostics:[]}}catch(e){return{success:!1,error:{code:i?.aborted&&Object.is(e,i.reason)?`CANCELLED`:e instanceof r.t?e.code:`PULL_FAILED`,message:e instanceof Error?e.message:String(e),...a.t(e),details:{outcome:`unchanged`,...e instanceof r.t?e.details:{}}},diagnostics:[]}}},ue=async e=>{try{let n=e.applicationExport,r=t.u(n)&&t.u(n.application)&&(0,w.isString)(n.application.universalIdentifier)?n.application.universalIdentifier:``;return await $({...e,applicationExport:h.t({value:n,universalIdentifier:r})})}finally{await(0,C.stop)()}};exports.pullSource=ue;
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),n=require("./application-C02vC9wC.cjs"),r=require("./cli-error-CSsayo0u.cjs"),i=require("./resolve-source-sdk-C0_F9oUQ.cjs"),a=require("./create-cancelled-error-DgrNfOv2.cjs"),o=require("./to-worker-output-diagnostics-eE_POlPf.cjs");var s=e.t(),c=e=>{if(!t.v(e))return;if((0,s.isNull)(e.application))return{data:{application:null}};let r=e.application;if(!(!t.v(r)||!(0,s.isString)(r.universalIdentifier)||!n.a(r.universalIdentifier)||!(0,s.isString)(r.displayName)&&!(0,s.isNull)(r.displayName)))return{data:{application:{universalIdentifier:r.universalIdentifier,displayName:r.displayName}}}},l=async({appPath:e,signal:t,warn:n})=>{t.throwIfAborted();let s=await i.t({appPath:e,warn:n}),l=await o.n({request:{type:`readSourceIdentity`,appPath:e},signal:t});if(t.aborted)throw a.t();let u=o.o({value:l.result,parseData:c}),d=[...u.diagnostics,...o.t(l.output)];if(!u.success)throw new r.t({code:u.error.code===`SDK_SOURCE_UNSUPPORTED`?`SDK_SOURCE_UNSUPPORTED`:`IDENTITY_READ_FAILED`,message:u.error.message,hint:u.error.hint??(u.error.code===`SDK_SOURCE_UNSUPPORTED`?`Use the SDK define functions, rename local helpers with the same names, or install a compatible twenty-sdk version.`:void 0),details:{...u.error.details,sdkVersion:s.version,diagnostics:d}});return{...u.data,diagnostics:d}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return l}});
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-D-caeNc5-9rDzSg5B.cjs"),n=require("./application-DOWikeQt.cjs"),r=require("./cli-error-CSsayo0u.cjs"),i=require("./resolve-source-sdk-BNnltA8w.cjs"),a=require("./create-cancelled-error-DgrNfOv2.cjs"),o=require("./to-worker-output-diagnostics-BzdY4Z2V.cjs");var s=e.t(),c=e=>{if(!t.u(e))return;if((0,s.isNull)(e.application))return{data:{application:null}};let r=e.application;if(!(!t.u(r)||!(0,s.isString)(r.universalIdentifier)||!n.a(r.universalIdentifier)||!(0,s.isString)(r.displayName)&&!(0,s.isNull)(r.displayName)))return{data:{application:{universalIdentifier:r.universalIdentifier,displayName:r.displayName}}}},l=async({appPath:e,signal:t,warn:n})=>{t.throwIfAborted();let s=await i.t({appPath:e,warn:n}),l=await o.n({request:{type:`readSourceIdentity`,appPath:e},signal:t});if(t.aborted)throw a.t();let u=o.o({value:l.result,parseData:c}),d=[...u.diagnostics,...o.t(l.output)];if(!u.success)throw new r.t({code:u.error.code===`SDK_SOURCE_UNSUPPORTED`?`SDK_SOURCE_UNSUPPORTED`:`IDENTITY_READ_FAILED`,message:u.error.message,hint:u.error.hint??(u.error.code===`SDK_SOURCE_UNSUPPORTED`?`Use the SDK define functions, rename local helpers with the same names, or install a compatible twenty-sdk version.`:void 0),details:{...u.error.details,sdkVersion:s.version,diagnostics:d}});return{...u.data,diagnostics:d}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return l}});
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),n=require("./application-C02vC9wC.cjs"),r=require("./cli-error-CSsayo0u.cjs"),i=require("./is-same-universal-identifier-BCBib3RP.cjs"),a=require("./read-command-values-uSJqBG_E.cjs"),o=require("./to-worker-output-diagnostics-eE_POlPf.cjs"),s=require("./read-app-identity-CdFKlGlw.cjs"),c=require("./resolve-app-project-Dc5KpCDh.cjs"),l=require("./is-application-not-found-error-DxO-ftTG.cjs"),u=require("./create-metadata-client-DsTAacZG.cjs"),d=require("./create-app-not-installed-error-DY-iuPPx.cjs");var f=e.t(),p=async({universalIdentifier:e,target:n,signal:a})=>{let o=(await u.t({target:n,signal:a}).query({__name:`FindInstalledApplication`,findOneApplication:{__args:{universalIdentifier:e},name:!0,universalIdentifier:!0,canBeUninstalled:!0}}).catch(t=>{throw l.t({error:t,field:`findOneApplication`})?d.t({universalIdentifier:e,apiUrl:n.apiUrl}):t}))?.findOneApplication;if(!t.v(o)||!(0,f.isNonEmptyString)(o.name)||!i.t({value:o.universalIdentifier,universalIdentifier:e})||!(0,f.isBoolean)(o.canBeUninstalled))throw new r.t({code:`INVALID_RESPONSE`,message:`The server returned an invalid installed application.`});return{name:o.name,canBeUninstalled:o.canBeUninstalled}},m=async({context:e,onIdentityRead:i})=>{let l=a.r(e.options,`universalIdentifier`);if(t.Vt(l)){if(!n.a(l))throw new r.t({code:`INVALID_INPUT`,exitCode:r.n.USAGE,message:`--universal-identifier must be a UUID of version 4 or later, not ${l}.`});return l.toLowerCase()}let{options:u,output:d,outputMode:f,signal:p}=e,m=await s.t({appPath:(await c.t({explicitPath:a.r(u,`path`),workingDirectory:process.cwd()})).path,signal:p,warn:d.warn});if(!t.Vt(m.application))throw new r.t({code:`INVALID_INPUT`,exitCode:r.n.USAGE,message:`This project has no application definition.`});if(f===`human`)for(let e of m.diagnostics)d.progress({message:o.s(e)});return i(),m.application.universalIdentifier.toLowerCase()};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return m}});
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-D-caeNc5-9rDzSg5B.cjs"),n=require("./application-DOWikeQt.cjs"),r=require("./cli-error-CSsayo0u.cjs"),i=require("./is-same-universal-identifier-BCBib3RP.cjs"),a=require("./read-command-values-uSJqBG_E.cjs"),o=require("./to-worker-output-diagnostics-BzdY4Z2V.cjs"),s=require("./read-app-identity-Da5yI23t.cjs"),c=require("./resolve-app-project-B0KRR-xp.cjs"),l=require("./is-application-not-found-error-Cja7iQrL.cjs"),u=require("./create-metadata-client-9IF8ArjT.cjs"),d=require("./create-app-not-installed-error-DY-iuPPx.cjs");var f=e.t(),p=async({universalIdentifier:e,target:n,signal:a})=>{let o=(await u.t({target:n,signal:a}).query({__name:`FindInstalledApplication`,findOneApplication:{__args:{universalIdentifier:e},name:!0,universalIdentifier:!0,canBeUninstalled:!0}}).catch(t=>{throw l.t({error:t,field:`findOneApplication`})?d.t({universalIdentifier:e,apiUrl:n.apiUrl}):t}))?.findOneApplication;if(!t.u(o)||!(0,f.isNonEmptyString)(o.name)||!i.t({value:o.universalIdentifier,universalIdentifier:e})||!(0,f.isBoolean)(o.canBeUninstalled))throw new r.t({code:`INVALID_RESPONSE`,message:`The server returned an invalid installed application.`});return{name:o.name,canBeUninstalled:o.canBeUninstalled}},m=async({context:e,onIdentityRead:i})=>{let l=a.r(e.options,`universalIdentifier`);if(t.Ut(l)){if(!n.a(l))throw new r.t({code:`INVALID_INPUT`,exitCode:r.n.USAGE,message:`--universal-identifier must be a UUID of version 4 or later, not ${l}.`});return l.toLowerCase()}let{options:u,output:d,outputMode:f,signal:p}=e,m=await s.t({appPath:(await c.t({explicitPath:a.r(u,`path`),workingDirectory:process.cwd()})).path,signal:p,warn:d.warn});if(!t.Ut(m.application))throw new r.t({code:`INVALID_INPUT`,exitCode:r.n.USAGE,message:`This project has no application definition.`});if(f===`human`)for(let e of m.diagnostics)d.progress({message:o.s(e)});return i(),m.application.universalIdentifier.toLowerCase()};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return m}});
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),n=require("./application-C02vC9wC.cjs"),r=require("./list-application-source-files-jEau5Rie.cjs"),i=require("./extract-manifest-from-file-yeNBn6po.cjs");let a=require("node:fs/promises"),o=require("node:path");var s=e.t(),c=async({appPath:e,signal:c})=>{if(c.throwIfAborted(),!(0,o.isAbsolute)(e)||!(await(0,a.stat)(e)).isDirectory())throw Error(`The app path must be an absolute directory path.`);let l=await r.t(e),u=null;for(let r of l){if(c.throwIfAborted(),i.r(await(0,a.readFile)(r,`utf8`))!==`defineApplication`)continue;if(t.Vt(u))throw Error(`The project declares more than one application.`);let{config:l}=await i.t({appPath:e,filePath:r});if(!(0,s.isString)(l.universalIdentifier)||!n.a(l.universalIdentifier))throw Error(`Could not read the application identifier in ${(0,o.relative)(e,r)}.`);u={universalIdentifier:l.universalIdentifier,displayName:(0,s.isString)(l.displayName)?l.displayName:null}}return c.throwIfAborted(),{application:u}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return c}});
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-D-caeNc5-9rDzSg5B.cjs"),n=require("./application-DOWikeQt.cjs"),r=require("./list-application-source-files-jEau5Rie.cjs"),i=require("./extract-manifest-from-file-nrU-X7g7.cjs");let a=require("node:fs/promises"),o=require("node:path");var s=e.t(),c=async({appPath:e,signal:c})=>{if(c.throwIfAborted(),!(0,o.isAbsolute)(e)||!(await(0,a.stat)(e)).isDirectory())throw Error(`The app path must be an absolute directory path.`);let l=await r.t(e),u=null;for(let r of l){if(c.throwIfAborted(),i.r(await(0,a.readFile)(r,`utf8`))!==`defineApplication`)continue;if(t.Ut(u))throw Error(`The project declares more than one application.`);let{config:l}=await i.t({appPath:e,filePath:r});if(!(0,s.isString)(l.universalIdentifier)||!n.a(l.universalIdentifier))throw Error(`Could not read the application identifier in ${(0,o.relative)(e,r)}.`);u={universalIdentifier:l.universalIdentifier,displayName:(0,s.isString)(l.displayName)?l.displayName:null}}return c.throwIfAborted(),{application:u}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return c}});
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),n=require("./cli-error-CSsayo0u.cjs");let r=require("node:fs/promises");var i=e.t(),a=`default`,o=`local`,s={twentyCLIAccessToken:[`accessToken`,`applicationAccessToken`],twentyCLIRefreshToken:[`refreshToken`,`applicationRefreshToken`],twentyCLIRegistrationClientId:[`oauthClientId`]},c=Object.values(s).flat(),l=[`apiUrl`,`apiKey`,`appRegistrationId`,`appRegistrationClientId`,...Object.entries(s).flat(2)],u=e=>{if(!t.v(e)||!(0,i.isString)(e.apiUrl))return;let n=Object.fromEntries(Object.entries(s).flatMap(([n,r])=>{let a=[n,...r].map(t=>e[t]).find(i.isString);return t.Vt(a)?[[n,a]]:[]}));return{...Object.fromEntries(Object.entries(e).filter(([e])=>!c.includes(e))),apiUrl:e.apiUrl,...n}},d=e=>{if(!t.v(e))return;let n={};for(let[r,i]of Object.entries(e)){let e=u(i);if(!t.Vt(e))return;n[r]=e}return n},f=e=>{if(!Object.hasOwn(e,a)||Object.hasOwn(e,o))return{remotes:e,isRenamed:!1};let{[a]:t,...n}=e;return{remotes:{...n,[o]:t},isRenamed:!0}},p=e=>{let n=d(e.profiles??{}),r=d(e.remotes??{});if(!t.Vt(n)||!t.Vt(r))return;let s=u(Object.fromEntries(l.filter(t=>t in e).map(t=>[t,e[t]]))),c=Object.fromEntries(Object.entries(e).filter(([e])=>!l.includes(e)&&![`profiles`,`remotes`,`defaultWorkspace`,`version`].includes(e))),{remotes:p,isRenamed:m}=f({...n,...r});t.Vt(s)&&!Object.hasOwn(p,o)&&(p[o]=s);let h=m&&e.defaultWorkspace===a?o:e.defaultWorkspace;return{...c,version:1,remotes:p,...(0,i.isString)(h)?{defaultRemote:h}:{}}},m=e=>{if(!t.v(e))return;if(!t.Vt(e.version)&&(`profiles`in e||`apiUrl`in e))return p(e);let n=d(e.remotes??{});if(!(!t.Vt(n)||t.Vt(e.defaultRemote)&&!(0,i.isString)(e.defaultRemote)))return{...e,version:1,remotes:n}},h={version:1,remotes:{}},g=(e,t)=>new n.t({code:`INVALID_CONFIG`,exitCode:n.n.USAGE,message:`${e} is not a valid Twenty config: ${t}`,hint:`Fix or move the file. It is never overwritten while it is invalid.`,details:{configPath:e}}),_=/line (\d+) column (\d+)/,v=e=>{let n=e instanceof Error?_.exec(e.message):null;return t.Vt(n)?`invalid JSON at line ${n[1]}, column ${n[2]}.`:`invalid JSON.`},y=async e=>{try{return await(0,r.readFile)(e,`utf8`)}catch(t){if(n.r(t,`ENOENT`))return``;throw new n.t({code:`INVALID_CONFIG`,exitCode:n.n.USAGE,message:`Could not read ${e}.`,details:{configPath:e,reason:t instanceof Error?t.message:String(t)}})}},b=async e=>{let n=await y(e);if(n.trim()===``)return h;let r;try{r=JSON.parse(n)}catch(t){throw g(e,v(t))}if(t.v(r)&&t.Vt(r.version)&&r.version!==1)throw g(e,`version ${(0,i.isNumber)(r.version)?r.version:`unknown`} is not supported by this CLI.`);let a=m(r);if(!t.Vt(a))throw g(e,`remotes need an apiUrl and defaultRemote must be a name.`);return a};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return b}});
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-D-caeNc5-9rDzSg5B.cjs"),n=require("./cli-error-CSsayo0u.cjs");let r=require("node:fs/promises");var i=e.t(),a=`default`,o=`local`,s={twentyCLIAccessToken:[`accessToken`,`applicationAccessToken`],twentyCLIRefreshToken:[`refreshToken`,`applicationRefreshToken`],twentyCLIRegistrationClientId:[`oauthClientId`]},c=Object.values(s).flat(),l=[`apiUrl`,`apiKey`,`appRegistrationId`,`appRegistrationClientId`,...Object.entries(s).flat(2)],u=e=>{if(!t.u(e)||!(0,i.isString)(e.apiUrl))return;let n=Object.fromEntries(Object.entries(s).flatMap(([n,r])=>{let a=[n,...r].map(t=>e[t]).find(i.isString);return t.Ut(a)?[[n,a]]:[]}));return{...Object.fromEntries(Object.entries(e).filter(([e])=>!c.includes(e))),apiUrl:e.apiUrl,...n}},d=e=>{if(!t.u(e))return;let n={};for(let[r,i]of Object.entries(e)){let e=u(i);if(!t.Ut(e))return;n[r]=e}return n},f=e=>{if(!Object.hasOwn(e,a)||Object.hasOwn(e,o))return{remotes:e,isRenamed:!1};let{[a]:t,...n}=e;return{remotes:{...n,[o]:t},isRenamed:!0}},p=e=>{let n=d(e.profiles??{}),r=d(e.remotes??{});if(!t.Ut(n)||!t.Ut(r))return;let s=u(Object.fromEntries(l.filter(t=>t in e).map(t=>[t,e[t]]))),c=Object.fromEntries(Object.entries(e).filter(([e])=>!l.includes(e)&&![`profiles`,`remotes`,`defaultWorkspace`,`version`].includes(e))),{remotes:p,isRenamed:m}=f({...n,...r});t.Ut(s)&&!Object.hasOwn(p,o)&&(p[o]=s);let h=m&&e.defaultWorkspace===a?o:e.defaultWorkspace;return{...c,version:1,remotes:p,...(0,i.isString)(h)?{defaultRemote:h}:{}}},m=e=>{if(!t.u(e))return;if(!t.Ut(e.version)&&(`profiles`in e||`apiUrl`in e))return p(e);let n=d(e.remotes??{});if(!(!t.Ut(n)||t.Ut(e.defaultRemote)&&!(0,i.isString)(e.defaultRemote)))return{...e,version:1,remotes:n}},h={version:1,remotes:{}},g=(e,t)=>new n.t({code:`INVALID_CONFIG`,exitCode:n.n.USAGE,message:`${e} is not a valid Twenty config: ${t}`,hint:`Fix or move the file. It is never overwritten while it is invalid.`,details:{configPath:e}}),_=/line (\d+) column (\d+)/,v=e=>{let n=e instanceof Error?_.exec(e.message):null;return t.Ut(n)?`invalid JSON at line ${n[1]}, column ${n[2]}.`:`invalid JSON.`},y=async e=>{try{return await(0,r.readFile)(e,`utf8`)}catch(t){if(n.r(t,`ENOENT`))return``;throw new n.t({code:`INVALID_CONFIG`,exitCode:n.n.USAGE,message:`Could not read ${e}.`,details:{configPath:e,reason:t instanceof Error?t.message:String(t)}})}},b=async e=>{let n=await y(e);if(n.trim()===``)return h;let r;try{r=JSON.parse(n)}catch(t){throw g(e,v(t))}if(t.u(r)&&t.Ut(r.version)&&r.version!==1)throw g(e,`version ${(0,i.isNumber)(r.version)?r.version:`unknown`} is not supported by this CLI.`);let a=m(r);if(!t.Ut(a))throw g(e,`remotes need an apiUrl and defaultRemote must be a name.`);return a};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return b}});
@@ -0,0 +1 @@
1
+ const e=require("./constants-D-caeNc5-9rDzSg5B.cjs");let t=require("node:fs/promises");var n=async n=>{try{let r=JSON.parse(await(0,t.readFile)(n,`utf8`));return e.u(r)?r:void 0}catch{return}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return n}});
@@ -1 +1 @@
1
- const e=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),t=require("./is-inside-directory-DHVCQE5C.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./parse-api-url-BeUTFxSv.cjs"),i=require("./resolve-request-url-B6KNhoFa.cjs");let a=require("node:crypto"),o=require("node:path"),s=require("node:fs");var c=({build:r,appPath:i})=>{if(!e.Vt(r.directory))throw new n.t({code:`SNAPSHOT_INVALID`,message:`The build did not report its snapshot directory, so the CLI cannot upload it.`});if(!t.t({filePath:r.directory,directory:(0,o.join)(i,`.twenty`,`cli`,`snapshots`)}))throw new n.t({code:`SNAPSHOT_INVALID`,message:`The build snapshot ${r.directory} is outside the app's .twenty/cli/snapshots folder.`,details:{directory:r.directory}});return r.directory},l={UPLOAD_CONCURRENCY:4,UPLOAD_TIMEOUT_MILLISECONDS:3e5},u=async({uploadUrl:t,contentType:a,bytes:o,signal:s})=>{let c=URL.parse(t);if(!e.Vt(c)||!r.r.includes(c.protocol))throw new n.t({code:`INVALID_RESPONSE`,message:`The server returned an upload URL the CLI cannot use.`});let u=await i.c(c,{method:`PUT`,headers:{"Content-Type":a},body:o,redirect:`manual`,signal:AbortSignal.any([s,AbortSignal.timeout(l.UPLOAD_TIMEOUT_MILLISECONDS)])});return await u.body?.cancel().catch(()=>void 0),u.status};async function*d(e){let t=e.stream().getReader();try{for(;;){let{done:e,value:n}=await t.read();if(e)return;yield n}}finally{try{await t.cancel()}catch{}finally{t.releaseLock()}}}var f=({message:e,path:t})=>new n.t({code:`SNAPSHOT_INVALID`,message:e,hint:`Build again. If it keeps happening, check that nothing else writes to the snapshot directory.`,details:{path:t}}),p=async({snapshotDirectory:e,artifact:n})=>{let r=(0,o.resolve)(e,n.path);if(!t.t({filePath:r,directory:e}))throw f({message:`The build lists a file outside its snapshot: ${n.path}`,path:n.path});let i=await(0,s.openAsBlob)(r),c=(0,a.createHash)(`sha256`);try{for await(let e of d(i))c.update(e)}catch(e){throw e instanceof DOMException&&e.name===`NotReadableError`?f({message:`${n.path} changed after the build.`,path:n.path}):e}let l=c.digest(`hex`);if(i.size!==n.size||l!==n.sha256)throw f({message:`${n.path} changed after the build.`,path:n.path});return i};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return p}});
1
+ const e=require("./constants-D-caeNc5-9rDzSg5B.cjs"),t=require("./is-inside-directory-DHVCQE5C.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./parse-api-url-CFCz3xUA.cjs"),i=require("./resolve-request-url-BvOe0vYd.cjs");let a=require("node:crypto"),o=require("node:path"),s=require("node:fs");var c=({build:r,appPath:i})=>{if(!e.Ut(r.directory))throw new n.t({code:`SNAPSHOT_INVALID`,message:`The build did not report its snapshot directory, so the CLI cannot upload it.`});if(!t.t({filePath:r.directory,directory:(0,o.join)(i,`.twenty`,`cli`,`snapshots`)}))throw new n.t({code:`SNAPSHOT_INVALID`,message:`The build snapshot ${r.directory} is outside the app's .twenty/cli/snapshots folder.`,details:{directory:r.directory}});return r.directory},l={UPLOAD_CONCURRENCY:4,UPLOAD_TIMEOUT_MILLISECONDS:3e5},u=async({uploadUrl:t,contentType:a,bytes:o,signal:s})=>{let c=URL.parse(t);if(!e.Ut(c)||!r.r.includes(c.protocol))throw new n.t({code:`INVALID_RESPONSE`,message:`The server returned an upload URL the CLI cannot use.`});let u=await i.c(c,{method:`PUT`,headers:{"Content-Type":a},body:o,redirect:`manual`,signal:AbortSignal.any([s,AbortSignal.timeout(l.UPLOAD_TIMEOUT_MILLISECONDS)])});return await u.body?.cancel().catch(()=>void 0),u.status};async function*d(e){let t=e.stream().getReader();try{for(;;){let{done:e,value:n}=await t.read();if(e)return;yield n}}finally{try{await t.cancel()}catch{}finally{t.releaseLock()}}}var f=({message:e,path:t})=>new n.t({code:`SNAPSHOT_INVALID`,message:e,hint:`Build again. If it keeps happening, check that nothing else writes to the snapshot directory.`,details:{path:t}}),p=async({snapshotDirectory:e,artifact:n})=>{let r=(0,o.resolve)(e,n.path);if(!t.t({filePath:r,directory:e}))throw f({message:`The build lists a file outside its snapshot: ${n.path}`,path:n.path});let i=await(0,s.openAsBlob)(r),c=(0,a.createHash)(`sha256`);try{for await(let e of d(i))c.update(e)}catch(e){throw e instanceof DOMException&&e.name===`NotReadableError`?f({message:`${n.path} changed after the build.`,path:n.path}):e}let l=c.digest(`hex`);if(i.size!==n.size||l!==n.sha256)throw f({message:`${n.path} changed after the build.`,path:n.path});return i};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return p}});
@@ -1 +1 @@
1
- const e=require("./cli-error-CSsayo0u.cjs"),t=require("./get-tooling-error-context-C69TBSej.cjs"),n=require("./read-application-identity-B8iACpb4.cjs");let r=require("esbuild");var i=async({appPath:i,signal:a})=>{try{return{success:!0,data:await n.t({appPath:i,signal:a}),diagnostics:[]}}catch(n){return{success:!1,error:{code:a.aborted?`CANCELLED`:n instanceof e.t?n.code:`IDENTITY_READ_FAILED`,message:n instanceof Error?n.message:String(n),...t.t(n)},diagnostics:[]}}finally{await(0,r.stop)()}};exports.readSourceIdentity=i;
1
+ const e=require("./cli-error-CSsayo0u.cjs"),t=require("./get-tooling-error-context-C69TBSej.cjs"),n=require("./read-application-identity-DgEOK9zh.cjs");let r=require("esbuild");var i=async({appPath:i,signal:a})=>{try{return{success:!0,data:await n.t({appPath:i,signal:a}),diagnostics:[]}}catch(n){return{success:!1,error:{code:a.aborted?`CANCELLED`:n instanceof e.t?n.code:`IDENTITY_READ_FAILED`,message:n instanceof Error?n.message:String(n),...t.t(n)},diagnostics:[]}}finally{await(0,r.stop)()}};exports.readSourceIdentity=i;
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./utils-D6KY4-gU-rSlFwrTC.cjs"),n=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),r=require("./cli-error-CSsayo0u.cjs"),i=require("./list-application-source-files-jEau5Rie.cjs"),a=require("./constants-Cf5-CwMu.cjs"),o=require("./assert-pull-paths-BuQ1ZRvQ.cjs"),s=require("./is-same-universal-identifier-BCBib3RP.cjs"),c=require("./create-pull-base-write-Lh9yrY5q.cjs"),l=require("./create-cancelled-error-DgrNfOv2.cjs"),u=require("./is-interaction-allowed-CF-ko1KI.cjs"),d=require("./with-phase-details-Dof8Ao9R.cjs"),f=require("./to-cli-error-BBYf_wqo.cjs"),p=require("./get-app-plan-summary-DOhqg3eL.cjs"),m=require("./create-metadata-client-DsTAacZG.cjs"),h=require("./require-approval-D0FfoHhF.cjs"),g=require("./read-snapshot-file-CQ_tHUot.cjs"),_=require("./fetch-workspace-id-Bg2V_cma.cjs");let v=require("node:crypto"),y=require("node:fs/promises"),b=require("node:path"),x=require("tinyglobby");var S=new Set([`AUTH_REQUIRED`,`PERMISSION_DENIED`]),C=new Set([`SNAPSHOT_INVALID`,`TOOLING_UNSUPPORTED`]),w=({phase:e,code:t,upload:n})=>e===`build`||e===`preview`||e===`confirmation`?`not-started`:e===`upload`&&n.fileCount>0?`partial`:e===`upload`&&n.hasCreatedTargets?`unknown`:S.has(t)||C.has(t)?`not-started`:`unknown`,T=({phase:e,outcome:t})=>t===`not-started`?`Fix the problem, then run twenty app apply again. It rebuilds the app and requests a fresh plan.`:`The ${e} step may have changed the workspace. Run twenty app plan to see where it stands before applying again.`,E=({error:e,phase:t,completedPhases:n,upload:r,signal:i})=>{let a=f.t(e,i),o=w({phase:t,code:a.code,upload:r});return d.t({error:a,phase:t,outcome:o,completedPhases:n,hint:T({phase:t,outcome:o})})},D=e.t(),O=async({application:e,target:t,signal:i})=>{let a=(await m.t({target:t,signal:i}).mutation({__name:`InstallDevelopmentApplication`,createDevelopmentApplication:{__args:{universalIdentifier:e.universalIdentifier,name:e.displayName},id:!0,universalIdentifier:!0}}))?.createDevelopmentApplication;if(!n.v(a)||!(0,D.isNonEmptyString)(a.id)||!s.t({value:a.universalIdentifier,universalIdentifier:e.universalIdentifier}))throw new r.t({code:`INVALID_RESPONSE`,message:`The server returned an invalid development installation.`});return{applicationId:a.id}},k=async({application:e,target:t,signal:i})=>{let a=(await m.t({target:t,signal:i}).mutation({__name:`RegisterApplication`,createApplicationRegistration:{__args:{input:{name:e.displayName,universalIdentifier:e.universalIdentifier}},applicationRegistration:{id:!0,universalIdentifier:!0}}}))?.createApplicationRegistration,o=n.v(a)?a.applicationRegistration:void 0;if(!n.v(o)||!(0,D.isNonEmptyString)(o.id)||!s.t({value:o.universalIdentifier,universalIdentifier:e.universalIdentifier}))throw new r.t({code:`INVALID_RESPONSE`,message:`The server returned an invalid application registration.`});return{registrationId:o.id}},A=e=>{if(!(e instanceof r.t)||!n.v(e.details))return e;let{body:t,...i}=e.details;return new r.t({code:e.code,exitCode:e.exitCode,message:e.message,hint:e.hint,details:{...i,data:null}})},j=({value:e,applicationUniversalIdentifier:t})=>{try{return p.a({value:e,applicationUniversalIdentifier:t})}catch(e){if(e instanceof r.t)return;throw e}},M=async({build:e,inferDeletionFromMissingEntities:t,target:i,signal:a})=>{let o=e.application.universalIdentifier,c=(await m.t({target:i,signal:a}).mutation({__name:`SyncApplication`,syncApplication:{__args:{manifest:e.manifest,inferDeletionFromMissingEntities:t},applicationUniversalIdentifier:!0,actions:!0}}).catch(e=>{throw A(e)}))?.syncApplication;if(!n.v(c)||!(0,D.isString)(c.applicationUniversalIdentifier)||!s.t({value:c.applicationUniversalIdentifier,universalIdentifier:o}))throw new r.t({code:`INVALID_RESPONSE`,message:`The server did not confirm the sync of ${o}.`});return{actions:j({value:c,applicationUniversalIdentifier:o}),acknowledgedUniversalIdentifier:c.applicationUniversalIdentifier}},N={"built-logic-function":`BuiltLogicFunction`,"built-front-component":`BuiltFrontComponent`,source:`Source`,dependencies:`Dependencies`,"public-asset":`PublicAsset`},P=()=>new r.t({code:`INVALID_RESPONSE`,message:`The server returned an invalid file upload response.`}),F=e=>n.v(e)&&(0,D.isNonEmptyString)(e.fileId)&&(0,D.isNonEmptyString)(e.filePath)&&(0,D.isNonEmptyString)(e.uploadUrl)&&(0,D.isNonEmptyString)(e.contentType),I=({value:e,idKey:t})=>{if(!(0,D.isArray)(e))throw P();return e.map(e=>{let r=n.v(e)?e[t]:void 0;if(!n.v(e)||!(0,D.isNonEmptyString)(r))throw P();return{id:r,message:(0,D.isNonEmptyString)(e.message)?e.message:`The server refused this file.`}})},L=e=>{let t=N[e.role];if(!n.Vt(t))throw new r.t({code:`TOOLING_UNSUPPORTED`,message:`The build contains a ${e.role} file, which the CLI cannot upload.`,details:{path:e.path,role:e.role}});return{fileFolder:t,filePath:e.path,size:e.size}},R=async({items:e,run:t})=>{let r=0,i,a=async()=>{if(r>=e.length||n.Vt(i))return;let o=e[r];r+=1;try{await t(o)}catch(e){i??={error:e}}await a()};if(await Promise.all(Array.from({length:Math.min(g.i.UPLOAD_CONCURRENCY,e.length)},a)),n.Vt(i))throw i.error},z=async({artifacts:e,context:t})=>{let r=(await m.t({target:t.target,signal:t.signal}).mutation({__name:`CreateApplicationFileUploads`,createApplicationFileUploads:{__args:{applicationUniversalIdentifier:t.applicationUniversalIdentifier,files:e.map(L)},targets:{fileId:!0,filePath:!0,uploadUrl:!0,contentType:!0},errors:{filePath:!0,message:!0}}}))?.createApplicationFileUploads;if(!n.v(r)||!(0,D.isArray)(r.targets)||!r.targets.every(F))throw P();t.progress.hasCreatedTargets=!0;let i=I({value:r.errors,idKey:`filePath`}),a=new Set([...r.targets.map(e=>e.filePath),...i.map(({id:e})=>e)]);return{uploadTargets:r.targets,failures:[...i.map(({id:e,message:t})=>({path:e,message:t})),...e.filter(e=>!a.has(e.path)).map(e=>({path:e.path,message:`The server did not accept this file.`}))]}},B=async({uploadTargets:e,artifactByPath:t,context:i,failures:a})=>{let o=[];return await R({items:e,run:async e=>{let s=t.get(e.filePath);if(!n.Vt(s)){a.push({path:e.filePath,message:`The server asked for a file this build does not have.`});return}let c=await g.t({snapshotDirectory:i.snapshotDirectory,artifact:s});try{let t=await g.r({uploadUrl:e.uploadUrl,contentType:e.contentType,bytes:c,signal:i.signal});if(t<200||t>=300){a.push({path:s.path,message:`File storage answered ${t}.`});return}o.push(e)}catch(e){if(i.signal.aborted||e instanceof r.t)throw e;a.push({path:s.path,message:e instanceof Error?e.message:String(e)})}}}),o},V=async({sentTargets:e,artifactByPath:r,context:i,failures:a})=>{if(!t.r(e))return;let o=(await m.t({target:i.target,signal:i.signal}).mutation({__name:`CompleteApplicationFileUploads`,completeApplicationFileUploads:{__args:{applicationUniversalIdentifier:i.applicationUniversalIdentifier,fileIds:e.map(e=>e.fileId)},errors:{fileId:!0,message:!0}}}))?.completeApplicationFileUploads;if(!n.v(o))throw P();let s=I({value:o.errors,idKey:`fileId`}),c=new Set(s.map(({id:e})=>e)),l=new Map(e.map(e=>[e.fileId,e.filePath]));a.push(...s.map(({id:e,message:t})=>({path:l.get(e)??e,message:t})));for(let t of e)c.has(t.fileId)||(i.progress.fileCount+=1,i.progress.byteCount+=r.get(t.filePath)?.size??0)},H=async({build:e,snapshotDirectory:n,target:i,signal:a,progress:o})=>{e.files.forEach(L);for(let t of e.files)await g.t({snapshotDirectory:n,artifact:t});let s={applicationUniversalIdentifier:e.application.universalIdentifier,snapshotDirectory:n,target:i,signal:a,progress:o},c=new Map(e.files.map(e=>[e.path,e])),l=[];for(let t=0;t<e.files.length;t+=100){let{uploadTargets:n,failures:r}=await z({artifacts:e.files.slice(t,t+100),context:s});l.push(...r),await V({sentTargets:await B({uploadTargets:n,artifactByPath:c,context:s,failures:l}),artifactByPath:c,context:s,failures:l})}if(t.r(l))throw new r.t({code:`UPLOAD_FAILED`,message:`${l.length} of ${e.files.length} files could not be uploaded.`,details:{failures:l}})},U=e=>e instanceof r.t&&e.code===`PLAN_UNAVAILABLE`,W=async({build:e,appPath:t,context:{target:n,signal:r,output:i,outputMode:a,options:o},inferDeletionFromMissingEntities:s,isCreationApproved:c,isDeletionApproved:l,approvalSignal:d,beforeWrite:f,flushProgress:m})=>{let _=[`build`],v={fileCount:0,byteCount:0,hasCreatedTargets:!1},y=u.t({options:o,outputMode:a}),b=e.application,x=(e,t)=>E({error:e,phase:t,completedPhases:_,upload:v,signal:r}),S=async(e,t)=>{if(await m?.().catch(e=>{throw x(e,`confirmation`)}),[`registration`,`installation`,`upload`,`sync`].includes(e))try{f?.()}catch(e){throw x(e,`confirmation`)}try{let n=await t();return _.push(e),n}catch(t){throw x(t,e)}},C=async e=>(await m?.().catch(e=>{throw x(e,`confirmation`)}),h.t({...e,canPrompt:y,declinedMessage:`Apply stopped at the confirmation prompt.`,signal:d??r}).then(()=>d?.throwIfAborted()).catch(e=>{throw x(e,`confirmation`)})),w=()=>p.i({build:e,inferDeletionFromMissingEntities:s,target:n,signal:r}),T=async()=>{try{let e=await w();return _.push(`preview`),{actions:e,isRegistrationCreated:!1}}catch(e){if(!U(e))throw x(e,`preview`)}return await C({isApproved:c,question:`${b.displayName} is not registered. Register it and install it on ${n.apiUrl}?`,code:`CREATE_REQUIRED`,message:`${b.displayName} has no registration yet. Applying it would create one.`,hint:`Run twenty app apply --create to register it and install it in this workspace.`}),i.progress({message:`Registering the app…`}),await S(`registration`,()=>k({application:b,target:n,signal:r})),i.progress({message:`Installing the development app…`}),await S(`installation`,()=>O({application:b,target:n,signal:r})),i.progress({message:`Computing metadata plan…`}),{actions:await S(`preview`,w),isRegistrationCreated:!0}},D=g.a({build:e,appPath:t});i.progress({message:`Computing metadata plan on ${n.apiUrl}…`});let{actions:A,isRegistrationCreated:j}=await T(),N=p.t(A);if(a===`human`&&i.progress({message:p.r({actions:A,summary:N,inferDeletionFromMissingEntities:s,stream:process.stderr})}),N.destructive>0){let e=N.destructive===1?`object or field deletion that permanently deletes`:`object or field deletions that permanently delete`;await C({isApproved:l,question:`Apply ${N.destructive} ${e} stored data on ${n.apiUrl}?`,code:`CONFIRMATION_REQUIRED`,message:`The plan includes ${N.destructive} ${e} stored data.`,hint:`Review it with twenty app plan, then pass --yes to apply it, or --no-delete to keep entities missing from source.`})}j||await S(`installation`,()=>O({application:b,target:n,signal:r})),i.progress({message:`Uploading ${e.files.length} ${e.files.length===1?`file`:`files`}…`}),await S(`upload`,()=>H({build:e,snapshotDirectory:D,target:n,signal:r,progress:v})),i.progress({message:`Synchronizing the app…`});let{actions:P,acknowledgedUniversalIdentifier:F}=await S(`sync`,()=>M({build:e,inferDeletionFromMissingEntities:s,target:n,signal:r}));return{completedPhases:_,isRegistrationCreated:j,appliedActions:P,acknowledgedUniversalIdentifier:F,upload:v}},G={pullBase:{cancelledMessage:`recording its pull base was cancelled`,failedMessage:`its pull base was not recorded`,hint:`The workspace already has this version of the app. Any previous pull base was kept. The typed API client was not regenerated. Review twenty app plan before retrying twenty app apply, which repeats the sync before recording the base and regenerating the client.`},clientGeneration:{cancelledMessage:`generating its typed API client was cancelled`,failedMessage:`its typed API client was not regenerated`,hint:`The workspace already has this version of the app, but the client files in node_modules/twenty-client-sdk may be incomplete. Fix the problem, then run twenty app generate-client to regenerate the client without syncing again.`}},K=({error:e,phase:t,applicationName:n,apiUrl:i,completedPhases:a,signal:o})=>{let s=f.t(e,o),c=G[t],l=s.code===`CANCELLED`?`${n} was applied to ${i}, but ${c.cancelledMessage}.`:`${n} was applied to ${i}, but ${c.failedMessage}: ${s.message}`;return d.t({error:new r.t({code:s.code,exitCode:s.exitCode,message:l,hint:[c.hint,s.hint].filter(D.isNonEmptyString).join(` `),details:s.details}),phase:t,outcome:`applied`,completedPhases:a,hint:c.hint})},q=async e=>{let t=await(0,x.glob)([`${a.n}/*.json`,`${a.t}/*.json`],{cwd:e,absolute:!0,onlyFiles:!0}),n={};for(let r of[...await i.t(e),...t.sort()])n[(0,b.relative)(e,r).split(b.sep).join(`/`)]=c.i(await(0,y.readFile)(r));return n},J=async({appPath:e,manifest:t,target:n,sourceFingerprints:i,signal:a})=>{let s=(0,b.join)(e,c.r),l=`${s}.${(0,v.randomUUID)()}.tmp`,u;try{a.throwIfAborted(),await o.t({appPath:e,relativePaths:[c.r]}),await(0,y.mkdir)((0,b.dirname)(s),{recursive:!0}),u=await(0,y.open)(l,`wx`,384),await u.writeFile(c.t({manifest:t,target:n,sourceFingerprints:i}).content),await u.sync(),await u.close(),await o.t({appPath:e,relativePaths:[c.r]}),a.throwIfAborted(),await(0,y.rename)(l,s)}catch(e){throw await u?.close().catch(()=>void 0),await(0,y.rm)(l,{force:!0}).catch(()=>void 0),a.aborted&&Object.is(e,a.reason)?e:new r.t({code:`PULL_BASE_RECORD_FAILED`,message:e instanceof Error?e.message:String(e)})}},Y=async({appPath:e,universalIdentifier:t,sourceFingerprints:n,context:{target:r,signal:i,output:a}})=>{a.progress({message:`Recording the pull base…`});try{let a=await _.t({target:r,signal:i});return await J({appPath:e,manifest:(await _.n({universalIdentifier:t,target:r,signal:i})).manifest,target:{apiUrl:r.apiUrl,workspaceId:a},sourceFingerprints:n,signal:i}),`recorded`}catch(e){if(i.aborted)throw l.t();let t=f.t(e);return t.code===`APP_EXPORT_UNSUPPORTED`?`unsupported`:(a.warn({code:`PULL_BASE_NOT_RECORDED`,message:`The app was applied, but its pull base was not updated: ${t.message} Any previous base was kept. A later pull may report changes from this apply as remote changes.`}),`failed`)}};Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Y}});
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./utils-CvvLHbc4-CKDJ1YgX.cjs"),n=require("./constants-D-caeNc5-9rDzSg5B.cjs"),r=require("./cli-error-CSsayo0u.cjs"),i=require("./list-application-source-files-jEau5Rie.cjs"),a=require("./constants-Cf5-CwMu.cjs"),o=require("./assert-pull-paths-BuQ1ZRvQ.cjs"),s=require("./is-same-universal-identifier-BCBib3RP.cjs"),c=require("./create-pull-base-write-JW3ZTnaC.cjs"),l=require("./create-cancelled-error-DgrNfOv2.cjs"),u=require("./is-interaction-allowed-CF-ko1KI.cjs"),d=require("./with-phase-details-Dof8Ao9R.cjs"),f=require("./to-cli-error-BBYf_wqo.cjs"),p=require("./get-app-plan-summary-C-CQdNrh.cjs"),m=require("./create-metadata-client-9IF8ArjT.cjs"),h=require("./require-approval-D0FfoHhF.cjs"),g=require("./read-snapshot-file-CxPJh0Bk.cjs"),_=require("./fetch-workspace-id-CsvJDu8b.cjs");let v=require("node:crypto"),y=require("node:fs/promises"),b=require("node:path"),x=require("tinyglobby");var S=new Set([`AUTH_REQUIRED`,`PERMISSION_DENIED`]),C=new Set([`SNAPSHOT_INVALID`,`TOOLING_UNSUPPORTED`]),w=({phase:e,code:t,upload:n})=>e===`build`||e===`preview`||e===`confirmation`?`not-started`:e===`upload`&&n.fileCount>0?`partial`:e===`upload`&&n.hasCreatedTargets?`unknown`:S.has(t)||C.has(t)?`not-started`:`unknown`,T=({phase:e,outcome:t})=>t===`not-started`?`Fix the problem, then run twenty app apply again. It rebuilds the app and requests a fresh plan.`:`The ${e} step may have changed the workspace. Run twenty app plan to see where it stands before applying again.`,E=({error:e,phase:t,completedPhases:n,upload:r,signal:i})=>{let a=f.t(e,i),o=w({phase:t,code:a.code,upload:r});return d.t({error:a,phase:t,outcome:o,completedPhases:n,hint:T({phase:t,outcome:o})})},D=e.t(),O=async({application:e,target:t,signal:i})=>{let a=(await m.t({target:t,signal:i}).mutation({__name:`InstallDevelopmentApplication`,createDevelopmentApplication:{__args:{universalIdentifier:e.universalIdentifier,name:e.displayName},id:!0,universalIdentifier:!0}}))?.createDevelopmentApplication;if(!n.u(a)||!(0,D.isNonEmptyString)(a.id)||!s.t({value:a.universalIdentifier,universalIdentifier:e.universalIdentifier}))throw new r.t({code:`INVALID_RESPONSE`,message:`The server returned an invalid development installation.`});return{applicationId:a.id}},k=async({application:e,target:t,signal:i})=>{let a=(await m.t({target:t,signal:i}).mutation({__name:`RegisterApplication`,createApplicationRegistration:{__args:{input:{name:e.displayName,universalIdentifier:e.universalIdentifier}},applicationRegistration:{id:!0,universalIdentifier:!0}}}))?.createApplicationRegistration,o=n.u(a)?a.applicationRegistration:void 0;if(!n.u(o)||!(0,D.isNonEmptyString)(o.id)||!s.t({value:o.universalIdentifier,universalIdentifier:e.universalIdentifier}))throw new r.t({code:`INVALID_RESPONSE`,message:`The server returned an invalid application registration.`});return{registrationId:o.id}},A=e=>{if(!(e instanceof r.t)||!n.u(e.details))return e;let{body:t,...i}=e.details;return new r.t({code:e.code,exitCode:e.exitCode,message:e.message,hint:e.hint,details:{...i,data:null}})},j=({value:e,applicationUniversalIdentifier:t})=>{try{return p.a({value:e,applicationUniversalIdentifier:t})}catch(e){if(e instanceof r.t)return;throw e}},M=async({build:e,inferDeletionFromMissingEntities:t,target:i,signal:a})=>{let o=e.application.universalIdentifier,c=(await m.t({target:i,signal:a}).mutation({__name:`SyncApplication`,syncApplication:{__args:{manifest:e.manifest,inferDeletionFromMissingEntities:t},applicationUniversalIdentifier:!0,actions:!0}}).catch(e=>{throw A(e)}))?.syncApplication;if(!n.u(c)||!(0,D.isString)(c.applicationUniversalIdentifier)||!s.t({value:c.applicationUniversalIdentifier,universalIdentifier:o}))throw new r.t({code:`INVALID_RESPONSE`,message:`The server did not confirm the sync of ${o}.`});return{actions:j({value:c,applicationUniversalIdentifier:o}),acknowledgedUniversalIdentifier:c.applicationUniversalIdentifier}},N={"built-logic-function":`BuiltLogicFunction`,"built-front-component":`BuiltFrontComponent`,source:`Source`,dependencies:`Dependencies`,"public-asset":`PublicAsset`},P=()=>new r.t({code:`INVALID_RESPONSE`,message:`The server returned an invalid file upload response.`}),F=e=>n.u(e)&&(0,D.isNonEmptyString)(e.fileId)&&(0,D.isNonEmptyString)(e.filePath)&&(0,D.isNonEmptyString)(e.uploadUrl)&&(0,D.isNonEmptyString)(e.contentType),I=({value:e,idKey:t})=>{if(!(0,D.isArray)(e))throw P();return e.map(e=>{let r=n.u(e)?e[t]:void 0;if(!n.u(e)||!(0,D.isNonEmptyString)(r))throw P();return{id:r,message:(0,D.isNonEmptyString)(e.message)?e.message:`The server refused this file.`}})},L=e=>{let t=N[e.role];if(!n.Ut(t))throw new r.t({code:`TOOLING_UNSUPPORTED`,message:`The build contains a ${e.role} file, which the CLI cannot upload.`,details:{path:e.path,role:e.role}});return{fileFolder:t,filePath:e.path,size:e.size}},R=async({items:e,run:t})=>{let r=0,i,a=async()=>{if(r>=e.length||n.Ut(i))return;let o=e[r];r+=1;try{await t(o)}catch(e){i??={error:e}}await a()};if(await Promise.all(Array.from({length:Math.min(g.i.UPLOAD_CONCURRENCY,e.length)},a)),n.Ut(i))throw i.error},z=async({artifacts:e,context:t})=>{let r=(await m.t({target:t.target,signal:t.signal}).mutation({__name:`CreateApplicationFileUploads`,createApplicationFileUploads:{__args:{applicationUniversalIdentifier:t.applicationUniversalIdentifier,files:e.map(L)},targets:{fileId:!0,filePath:!0,uploadUrl:!0,contentType:!0},errors:{filePath:!0,message:!0}}}))?.createApplicationFileUploads;if(!n.u(r)||!(0,D.isArray)(r.targets)||!r.targets.every(F))throw P();t.progress.hasCreatedTargets=!0;let i=I({value:r.errors,idKey:`filePath`}),a=new Set([...r.targets.map(e=>e.filePath),...i.map(({id:e})=>e)]);return{uploadTargets:r.targets,failures:[...i.map(({id:e,message:t})=>({path:e,message:t})),...e.filter(e=>!a.has(e.path)).map(e=>({path:e.path,message:`The server did not accept this file.`}))]}},B=async({uploadTargets:e,artifactByPath:t,context:i,failures:a})=>{let o=[];return await R({items:e,run:async e=>{let s=t.get(e.filePath);if(!n.Ut(s)){a.push({path:e.filePath,message:`The server asked for a file this build does not have.`});return}let c=await g.t({snapshotDirectory:i.snapshotDirectory,artifact:s});try{let t=await g.r({uploadUrl:e.uploadUrl,contentType:e.contentType,bytes:c,signal:i.signal});if(t<200||t>=300){a.push({path:s.path,message:`File storage answered ${t}.`});return}o.push(e)}catch(e){if(i.signal.aborted||e instanceof r.t)throw e;a.push({path:s.path,message:e instanceof Error?e.message:String(e)})}}}),o},V=async({sentTargets:e,artifactByPath:r,context:i,failures:a})=>{if(!t.n(e))return;let o=(await m.t({target:i.target,signal:i.signal}).mutation({__name:`CompleteApplicationFileUploads`,completeApplicationFileUploads:{__args:{applicationUniversalIdentifier:i.applicationUniversalIdentifier,fileIds:e.map(e=>e.fileId)},errors:{fileId:!0,message:!0}}}))?.completeApplicationFileUploads;if(!n.u(o))throw P();let s=I({value:o.errors,idKey:`fileId`}),c=new Set(s.map(({id:e})=>e)),l=new Map(e.map(e=>[e.fileId,e.filePath]));a.push(...s.map(({id:e,message:t})=>({path:l.get(e)??e,message:t})));for(let t of e)c.has(t.fileId)||(i.progress.fileCount+=1,i.progress.byteCount+=r.get(t.filePath)?.size??0)},H=async({build:e,snapshotDirectory:n,target:i,signal:a,progress:o})=>{e.files.forEach(L);for(let t of e.files)await g.t({snapshotDirectory:n,artifact:t});let s={applicationUniversalIdentifier:e.application.universalIdentifier,snapshotDirectory:n,target:i,signal:a,progress:o},c=new Map(e.files.map(e=>[e.path,e])),l=[];for(let t=0;t<e.files.length;t+=100){let{uploadTargets:n,failures:r}=await z({artifacts:e.files.slice(t,t+100),context:s});l.push(...r),await V({sentTargets:await B({uploadTargets:n,artifactByPath:c,context:s,failures:l}),artifactByPath:c,context:s,failures:l})}if(t.n(l))throw new r.t({code:`UPLOAD_FAILED`,message:`${l.length} of ${e.files.length} files could not be uploaded.`,details:{failures:l}})},U=e=>e instanceof r.t&&e.code===`PLAN_UNAVAILABLE`,W=async({build:e,appPath:t,context:{target:n,signal:r,output:i,outputMode:a,options:o},inferDeletionFromMissingEntities:s,isCreationApproved:c,isDeletionApproved:l,approvalSignal:d,beforeWrite:f,flushProgress:m})=>{let _=[`build`],v={fileCount:0,byteCount:0,hasCreatedTargets:!1},y=u.t({options:o,outputMode:a}),b=e.application,x=(e,t)=>E({error:e,phase:t,completedPhases:_,upload:v,signal:r}),S=async(e,t)=>{if(await m?.().catch(e=>{throw x(e,`confirmation`)}),[`registration`,`installation`,`upload`,`sync`].includes(e))try{f?.()}catch(e){throw x(e,`confirmation`)}try{let n=await t();return _.push(e),n}catch(t){throw x(t,e)}},C=async e=>(await m?.().catch(e=>{throw x(e,`confirmation`)}),h.t({...e,canPrompt:y,declinedMessage:`Apply stopped at the confirmation prompt.`,signal:d??r}).then(()=>d?.throwIfAborted()).catch(e=>{throw x(e,`confirmation`)})),w=()=>p.i({build:e,inferDeletionFromMissingEntities:s,target:n,signal:r}),T=async()=>{try{let e=await w();return _.push(`preview`),{actions:e,isRegistrationCreated:!1}}catch(e){if(!U(e))throw x(e,`preview`)}return await C({isApproved:c,question:`${b.displayName} is not registered. Register it and install it on ${n.apiUrl}?`,code:`CREATE_REQUIRED`,message:`${b.displayName} has no registration yet. Applying it would create one.`,hint:`Run twenty app apply --create to register it and install it in this workspace.`}),i.progress({message:`Registering the app…`}),await S(`registration`,()=>k({application:b,target:n,signal:r})),i.progress({message:`Installing the development app…`}),await S(`installation`,()=>O({application:b,target:n,signal:r})),i.progress({message:`Computing metadata plan…`}),{actions:await S(`preview`,w),isRegistrationCreated:!0}},D=g.a({build:e,appPath:t});i.progress({message:`Computing metadata plan on ${n.apiUrl}…`});let{actions:A,isRegistrationCreated:j}=await T(),N=p.t(A);if(a===`human`&&i.progress({message:p.r({actions:A,summary:N,inferDeletionFromMissingEntities:s,stream:process.stderr})}),N.destructive>0){let e=N.destructive===1?`object or field deletion that permanently deletes`:`object or field deletions that permanently delete`;await C({isApproved:l,question:`Apply ${N.destructive} ${e} stored data on ${n.apiUrl}?`,code:`CONFIRMATION_REQUIRED`,message:`The plan includes ${N.destructive} ${e} stored data.`,hint:`Review it with twenty app plan, then pass --yes to apply it, or --no-delete to keep entities missing from source.`})}j||await S(`installation`,()=>O({application:b,target:n,signal:r})),i.progress({message:`Uploading ${e.files.length} ${e.files.length===1?`file`:`files`}…`}),await S(`upload`,()=>H({build:e,snapshotDirectory:D,target:n,signal:r,progress:v})),i.progress({message:`Synchronizing the app…`});let{actions:P,acknowledgedUniversalIdentifier:F}=await S(`sync`,()=>M({build:e,inferDeletionFromMissingEntities:s,target:n,signal:r}));return{completedPhases:_,isRegistrationCreated:j,appliedActions:P,acknowledgedUniversalIdentifier:F,upload:v}},G={pullBase:{cancelledMessage:`recording its pull base was cancelled`,failedMessage:`its pull base was not recorded`,hint:`The workspace already has this version of the app. Any previous pull base was kept. The typed API client was not regenerated. Review twenty app plan before retrying twenty app apply, which repeats the sync before recording the base and regenerating the client.`},clientGeneration:{cancelledMessage:`generating its typed API client was cancelled`,failedMessage:`its typed API client was not regenerated`,hint:`The workspace already has this version of the app, but the client files in node_modules/twenty-client-sdk may be incomplete. Fix the problem, then run twenty app generate-client to regenerate the client without syncing again.`}},K=({error:e,phase:t,applicationName:n,apiUrl:i,completedPhases:a,signal:o})=>{let s=f.t(e,o),c=G[t],l=s.code===`CANCELLED`?`${n} was applied to ${i}, but ${c.cancelledMessage}.`:`${n} was applied to ${i}, but ${c.failedMessage}: ${s.message}`;return d.t({error:new r.t({code:s.code,exitCode:s.exitCode,message:l,hint:[c.hint,s.hint].filter(D.isNonEmptyString).join(` `),details:s.details}),phase:t,outcome:`applied`,completedPhases:a,hint:c.hint})},q=async e=>{let t=await(0,x.glob)([`${a.n}/*.json`,`${a.t}/*.json`],{cwd:e,absolute:!0,onlyFiles:!0}),n={};for(let r of[...await i.t(e),...t.sort()])n[(0,b.relative)(e,r).split(b.sep).join(`/`)]=c.i(await(0,y.readFile)(r));return n},J=async({appPath:e,manifest:t,target:n,sourceFingerprints:i,signal:a})=>{let s=(0,b.join)(e,c.r),l=`${s}.${(0,v.randomUUID)()}.tmp`,u;try{a.throwIfAborted(),await o.t({appPath:e,relativePaths:[c.r]}),await(0,y.mkdir)((0,b.dirname)(s),{recursive:!0}),u=await(0,y.open)(l,`wx`,384),await u.writeFile(c.t({manifest:t,target:n,sourceFingerprints:i}).content),await u.sync(),await u.close(),await o.t({appPath:e,relativePaths:[c.r]}),a.throwIfAborted(),await(0,y.rename)(l,s)}catch(e){throw await u?.close().catch(()=>void 0),await(0,y.rm)(l,{force:!0}).catch(()=>void 0),a.aborted&&Object.is(e,a.reason)?e:new r.t({code:`PULL_BASE_RECORD_FAILED`,message:e instanceof Error?e.message:String(e)})}},Y=async({appPath:e,universalIdentifier:t,sourceFingerprints:n,context:{target:r,signal:i,output:a}})=>{a.progress({message:`Recording the pull base…`});try{let a=await _.t({target:r,signal:i});return await J({appPath:e,manifest:(await _.n({universalIdentifier:t,target:r,signal:i})).manifest,target:{apiUrl:r.apiUrl,workspaceId:a},sourceFingerprints:n,signal:i}),`recorded`}catch(e){if(i.aborted)throw l.t();let t=f.t(e);return t.code===`APP_EXPORT_UNSUPPORTED`?`unsupported`:(a.warn({code:`PULL_BASE_NOT_RECORDED`,message:`The app was applied, but its pull base was not updated: ${t.message} Any previous base was kept. A later pull may report changes from this apply as remote changes.`}),`failed`)}};Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Y}});
@@ -1 +1 @@
1
- const e=require("./collect-watch-inputs-CSE6DsGE.cjs"),t=require("./resolve-project-typescript-BWyUXLJM.cjs");let n=require("node:path");var r=async r=>{try{let i=await t.t(r),a=(0,n.join)(r,`tsconfig.json`),o=(t,n)=>(e.r(t),i.sys.readFile(t,n)),s=i.readConfigFile(a,o);i.parseJsonConfigFileContent(s.config??{},{...i.sys,readFile:o},r,void 0,a)}catch{}};exports.recordTypecheckConfigInputs=r;
1
+ const e=require("./collect-watch-inputs-CS4oNP1F.cjs"),t=require("./resolve-project-typescript-vMtmufcP.cjs");let n=require("node:path");var r=async r=>{try{let i=await t.t(r),a=(0,n.join)(r,`tsconfig.json`),o=(t,n)=>(e.r(t),i.sys.readFile(t,n)),s=i.readConfigFile(a,o);i.parseJsonConfigFileContent(s.config??{},{...i.sys,readFile:o},r,void 0,a)}catch{}};exports.recordTypecheckConfigInputs=r;
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./parse-api-url-BeUTFxSv.cjs"),i=require("./resolve-request-url-B6KNhoFa.cjs");var a=e.t(),o=`/.well-known/oauth-authorization-server`,s=(e,t)=>new n.t({code:`OAUTH_UNAVAILABLE`,message:`Browser sign-in is not available on ${e}: ${t}`,hint:`Pipe an API key into twenty auth login --with-token. Use --remote <name> for a saved connection, or --url ${e} for a new one.`}),c=e=>{let n=(0,a.isNonEmptyString)(e)?URL.parse(e):null;return t.Vt(n)&&r.r.includes(n.protocol)?n:void 0},l=async({apiUrl:e,signal:n})=>{let l=await i.r({apiUrl:e,signal:n})(i.t({apiUrl:e,path:o}),{headers:{Accept:`application/json`}}),u=await i.n(l);if(!l.ok||!t.v(u))throw s(e,`the server answered ${l.status}.`);let d=c(u.authorization_endpoint),f=c(u.token_endpoint),p=u.code_challenge_methods_supported;if(!(0,a.isNonEmptyString)(u.issuer)||!(0,a.isNonEmptyString)(u.cli_client_id)||!t.Vt(d)||!t.Vt(f)||(0,a.isArray)(p)&&!p.includes(`S256`))throw s(e,`its OAuth metadata is incomplete.`);let m=URL.parse(u.issuer);if(!t.Vt(m)||r.n(m)!==e)throw s(e,`it identifies itself as ${u.issuer}.`);try{i.u({url:f,apiUrl:e,requestedPath:f.href})}catch{throw s(e,`its token endpoint ${f.origin} is on another server.`)}return{issuer:u.issuer,isIssuerInResponse:u.authorization_response_iss_parameter_supported===!0,authorizationEndpoint:d.href,tokenEndpoint:f.href,clientId:u.cli_client_id}},u=async({apiUrl:e,tokenEndpoint:r,parameters:o,signal:s})=>{let c=await i.r({apiUrl:e,signal:s})(r,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/json`},body:JSON.stringify(o)}),l=await i.n(c),u=t.v(l)?l:{};if(!c.ok||!(0,a.isNonEmptyString)(u.access_token))throw new n.t({code:`OAUTH_FAILED`,message:(0,a.isNonEmptyString)(u.error_description)?u.error_description:`The token endpoint answered ${c.status}.`,details:{status:c.status,error:(0,a.isNonEmptyString)(u.error)?u.error:null}});return{accessToken:u.access_token,...(0,a.isNonEmptyString)(u.refresh_token)?{refreshToken:u.refresh_token}:{}}};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-D-caeNc5-9rDzSg5B.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./parse-api-url-CFCz3xUA.cjs"),i=require("./resolve-request-url-BvOe0vYd.cjs");var a=e.t(),o=`/.well-known/oauth-authorization-server`,s=(e,t)=>new n.t({code:`OAUTH_UNAVAILABLE`,message:`Browser sign-in is not available on ${e}: ${t}`,hint:`Pipe an API key into twenty auth login --with-token. Use --remote <name> for a saved connection, or --url ${e} for a new one.`}),c=e=>{let n=(0,a.isNonEmptyString)(e)?URL.parse(e):null;return t.Ut(n)&&r.r.includes(n.protocol)?n:void 0},l=async({apiUrl:e,signal:n})=>{let l=await i.r({apiUrl:e,signal:n})(i.t({apiUrl:e,path:o}),{headers:{Accept:`application/json`}}),u=await i.n(l);if(!l.ok||!t.u(u))throw s(e,`the server answered ${l.status}.`);let d=c(u.authorization_endpoint),f=c(u.token_endpoint),p=u.code_challenge_methods_supported;if(!(0,a.isNonEmptyString)(u.issuer)||!(0,a.isNonEmptyString)(u.cli_client_id)||!t.Ut(d)||!t.Ut(f)||(0,a.isArray)(p)&&!p.includes(`S256`))throw s(e,`its OAuth metadata is incomplete.`);let m=URL.parse(u.issuer);if(!t.Ut(m)||r.n(m)!==e)throw s(e,`it identifies itself as ${u.issuer}.`);try{i.u({url:f,apiUrl:e,requestedPath:f.href})}catch{throw s(e,`its token endpoint ${f.origin} is on another server.`)}return{issuer:u.issuer,isIssuerInResponse:u.authorization_response_iss_parameter_supported===!0,authorizationEndpoint:d.href,tokenEndpoint:f.href,clientId:u.cli_client_id}},u=async({apiUrl:e,tokenEndpoint:r,parameters:o,signal:s})=>{let c=await i.r({apiUrl:e,signal:s})(r,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/json`},body:JSON.stringify(o)}),l=await i.n(c),u=t.u(l)?l:{};if(!c.ok||!(0,a.isNonEmptyString)(u.access_token))throw new n.t({code:`OAUTH_FAILED`,message:(0,a.isNonEmptyString)(u.error_description)?u.error_description:`The token endpoint answered ${c.status}.`,details:{status:c.status,error:(0,a.isNonEmptyString)(u.error)?u.error:null}});return{accessToken:u.access_token,...(0,a.isNonEmptyString)(u.refresh_token)?{refreshToken:u.refresh_token}:{}}};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),n=require("./read-json-object-VckLNpsj.cjs"),r=require("./has-yarn-plug-and-play-X3ay5Xl0.cjs"),i=require("./cli-error-CSsayo0u.cjs");let a=require("node:fs/promises"),o=require("node:path");var s=e.t(),c=[`dependencies`,`devDependencies`,`peerDependencies`],l=async e=>{let r=await n.t((0,o.join)(e,`package.json`));if(t.Vt(r)&&c.some(e=>{let n=r[e];return t.v(n)&&Object.hasOwn(n,`twenty-sdk`)}))return{path:e,name:(0,s.isNonEmptyString)(r.name)?r.name:(0,o.basename)(e)}},u=async e=>{let n=await(0,a.readdir)(e,{withFileTypes:!0}).catch(()=>[]);return(await Promise.all(n.filter(e=>e.isDirectory()&&!e.name.startsWith(`.`)&&e.name!==`node_modules`).map(t=>l((0,o.join)(e,t.name))))).filter(t.Vt).sort((e,t)=>e.path.localeCompare(t.path))},d=async e=>{for(let n of r.n(e)){let e=await l(n);if(t.Vt(e))return e}},f=async({explicitPath:e,workingDirectory:n})=>{if(t.Vt(e)){let r=(0,o.resolve)(n,e),s=await(0,a.stat)(r).catch(()=>void 0),c=t.Vt(s)&&s.isDirectory()?await l(r):void 0;if(!t.Vt(c))throw new i.t({code:`APP_NOT_FOUND`,exitCode:i.n.USAGE,message:`${r} is not a Twenty app: it needs a package.json that depends on twenty-sdk.`,details:{path:r}});return c}let r=await d(n);if(t.Vt(r))return r;let s=await u(n),c=s.map(e=>`./${(0,o.relative)(n,e.path)}`);throw s.length>1?new i.t({code:`APP_PATH_REQUIRED`,exitCode:i.n.USAGE,message:`This folder contains ${s.length} apps. Choose one with --path.`,hint:`Apps here: ${c.join(`, `)}`,details:{candidates:s.map(e=>e.path)}}):new i.t({code:`APP_NOT_FOUND`,exitCode:i.n.USAGE,message:`No Twenty app found in this folder or its parents.`,hint:s.length===1?`Pass --path ${c[0]}`:`Run the command inside an app, or pass --path <app directory>.`,details:{workingDirectory:n}})};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return f}});
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-D-caeNc5-9rDzSg5B.cjs"),n=require("./read-json-object-BXZs97qz.cjs"),r=require("./has-yarn-plug-and-play-X3ay5Xl0.cjs"),i=require("./cli-error-CSsayo0u.cjs");let a=require("node:fs/promises"),o=require("node:path");var s=e.t(),c=[`dependencies`,`devDependencies`,`peerDependencies`],l=async e=>{let r=await n.t((0,o.join)(e,`package.json`));if(t.Ut(r)&&c.some(e=>{let n=r[e];return t.u(n)&&Object.hasOwn(n,`twenty-sdk`)}))return{path:e,name:(0,s.isNonEmptyString)(r.name)?r.name:(0,o.basename)(e)}},u=async e=>{let n=await(0,a.readdir)(e,{withFileTypes:!0}).catch(()=>[]);return(await Promise.all(n.filter(e=>e.isDirectory()&&!e.name.startsWith(`.`)&&e.name!==`node_modules`).map(t=>l((0,o.join)(e,t.name))))).filter(t.Ut).sort((e,t)=>e.path.localeCompare(t.path))},d=async e=>{for(let n of r.n(e)){let e=await l(n);if(t.Ut(e))return e}},f=async({explicitPath:e,workingDirectory:n})=>{if(t.Ut(e)){let r=(0,o.resolve)(n,e),s=await(0,a.stat)(r).catch(()=>void 0),c=t.Ut(s)&&s.isDirectory()?await l(r):void 0;if(!t.Ut(c))throw new i.t({code:`APP_NOT_FOUND`,exitCode:i.n.USAGE,message:`${r} is not a Twenty app: it needs a package.json that depends on twenty-sdk.`,details:{path:r}});return c}let r=await d(n);if(t.Ut(r))return r;let s=await u(n),c=s.map(e=>`./${(0,o.relative)(n,e.path)}`);throw s.length>1?new i.t({code:`APP_PATH_REQUIRED`,exitCode:i.n.USAGE,message:`This folder contains ${s.length} apps. Choose one with --path.`,hint:`Apps here: ${c.join(`, `)}`,details:{candidates:s.map(e=>e.path)}}):new i.t({code:`APP_NOT_FOUND`,exitCode:i.n.USAGE,message:`No Twenty app found in this folder or its parents.`,hint:s.length===1?`Pass --path ${c[0]}`:`Run the command inside an app, or pass --path <app directory>.`,details:{workingDirectory:n}})};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return f}});
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./parse-api-url-BeUTFxSv.cjs"),i=require("./read-command-values-uSJqBG_E.cjs"),a=require("./target-environment-variable.constant-D7z8AihP.cjs"),o=require("./is-interaction-allowed-CF-ko1KI.cjs"),s=require("./select-target-CKoOXLSW.cjs"),c=require("./get-config-path-C-D-QHuX.cjs"),l=require("./read-config-DYzGn3dk.cjs"),u=require("./is-access-token-expiring-jLfrOp26.cjs"),d=require("./get-credential-kind-JI9heHe2.cjs"),f=require("./write-config-atomically-eVpizD-t.cjs"),p=require("./request-oauth-tokens-XMt_yPua.cjs");var m=e.t(),h=(e,t)=>new n.t({code:`AUTH_REQUIRED`,exitCode:n.n.AUTHENTICATION,message:`Your session on ${e} expired and could not be refreshed.`,hint:`Sign in again: twenty auth login --remote ${e}`,details:{remote:e,refresh:t??null}}),g=(e,t)=>new n.t({code:`CONFLICT`,exitCode:n.n.CONFLICT,message:`Remote ${e} ${t} while this command was waiting to refresh its session. Nothing was sent.`,hint:`Run the command again.`,details:{remote:e}}),_=({config:e,remoteName:t,apiUrl:i})=>{if(!Object.hasOwn(e.remotes,t))throw g(t,`was renamed or removed`);let a=e.remotes[t];if(r.t({rawUrl:a.apiUrl,sourceName:t})!==i)throw g(t,`was pointed at another server`);let o=d.t(a);if(o===`apiKey`)throw g(t,`switched to an API key`);if(o===`none`)throw new n.t({code:`AUTH_REQUIRED`,exitCode:n.n.AUTHENTICATION,message:`Remote ${t} was signed out while this command was waiting.`,hint:`Sign in again: twenty auth login --remote ${t}`,details:{remote:t}});return a},v=({configPath:e,remoteName:t,apiUrl:r,signal:i})=>f.n({configPath:e,signal:i,operation:async()=>{let a=await l.t(e),o=_({config:a,remoteName:t,apiUrl:r}),{twentyCLIAccessToken:s,twentyCLIRefreshToken:c,twentyCLIRegistrationClientId:d}=o;if((0,m.isNonEmptyString)(s)&&!u.n(s))return s;if(!(0,m.isNonEmptyString)(c)||!(0,m.isNonEmptyString)(d))throw h(t);let{tokenEndpoint:g}=await p.n({apiUrl:r,signal:i}),v=await p.t({apiUrl:r,tokenEndpoint:g,parameters:{grant_type:`refresh_token`,refresh_token:c,client_id:d},signal:i}).catch(e=>{throw e instanceof n.t&&e.code===`OAUTH_FAILED`?h(t,e.details):e});return i.throwIfAborted(),await f.t(e,{...a,remotes:{...a.remotes,[t]:{...o,twentyCLIAccessToken:v.accessToken,...(0,m.isNonEmptyString)(v.refreshToken)?{twentyCLIRefreshToken:v.refreshToken}:{}}}}),v.accessToken}}),y=async({remoteName:e,remote:t,configPath:i,signal:a,onAuthenticationRequired:o})=>{let s=t.twentyCLIAccessToken,c=r.t({rawUrl:t.apiUrl,sourceName:`The URL of remote ${e}`});if((0,m.isNonEmptyString)(s)){let t={apiUrl:c,bearerToken:s,credentialKind:`oauth`,source:`remote`,remoteName:e};if(!u.n(s))return t;try{return{...t,bearerToken:await v({configPath:i,remoteName:e,apiUrl:c,signal:a})}}catch(e){if(o)return o({target:t,error:e});throw e}}let l=t.apiKey;if(!(0,m.isNonEmptyString)(l))throw new n.t({code:`AUTH_REQUIRED`,exitCode:n.n.AUTHENTICATION,message:`Remote ${e} has no saved credentials.`,hint:`Sign in: twenty auth login --remote ${e}`,details:{remote:e}});return{apiUrl:c,bearerToken:l,credentialKind:`apiKey`,source:`remote`,remoteName:e}},b=async({environment:e,remoteFlag:t,configPath:n,signal:i,warn:o,onAuthenticationRequired:c})=>{let u=await s.t({environment:e,remoteFlag:t,loadConfig:()=>l.t(n),warn:o});return u.source===`remote`?y({remoteName:u.remoteName,remote:u.remote,configPath:n,signal:i,onAuthenticationRequired:c}):{apiUrl:r.t({rawUrl:u.apiUrl,sourceName:a.t.API_URL}),bearerToken:u.apiKey,credentialKind:`apiKey`,source:`environment`}},x=async({options:e,outputMode:r,output:a,signal:s})=>{let l=c.t(),u=o.t({options:e,outputMode:r}),d=!1,f=async({target:e,error:r})=>{let i=r instanceof n.t?r.details?.refresh:void 0;if(!u||d||s.aborted||e.source!==`remote`||e.credentialKind!==`oauth`||!t.Vt(e.remoteName)||!(r instanceof n.t)||r.code!==`AUTH_REQUIRED`||t.v(i)&&i.status!==400&&i.status!==401)throw r;d=!0;let{signInToRemoteAgain:o}=await Promise.resolve().then(()=>require("./sign-in-to-remote-again-BhpxdF8v.cjs"));return o({target:e,remoteName:e.remoteName,error:r,configPath:l,output:a,signal:s})},p=await b({environment:process.env,remoteFlag:i.r(e,`remote`),configPath:l,signal:s,warn:a.warn,onAuthenticationRequired:f});if(!u||p.credentialKind!==`oauth`||d)return p;let{fetchSignedInIdentity:m}=await Promise.resolve().then(()=>require("./fetch-signed-in-identity-BSx-tgUO.cjs")).then(e=>e.n);try{return await m({target:p,signal:s}),p}catch(e){return f({target:p,error:e})}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return x}});
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-D-caeNc5-9rDzSg5B.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./parse-api-url-CFCz3xUA.cjs"),i=require("./read-command-values-uSJqBG_E.cjs"),a=require("./target-environment-variable.constant-D7z8AihP.cjs"),o=require("./is-interaction-allowed-CF-ko1KI.cjs"),s=require("./select-target-DZlm8j62.cjs"),c=require("./get-config-path-C-D-QHuX.cjs"),l=require("./read-config-Qwl4pAO8.cjs"),u=require("./is-access-token-expiring-DT6D8bMy.cjs"),d=require("./get-credential-kind-JI9heHe2.cjs"),f=require("./write-config-atomically-DkRUfbw0.cjs"),p=require("./request-oauth-tokens-QdDt7j8i.cjs");var m=e.t(),h=(e,t)=>new n.t({code:`AUTH_REQUIRED`,exitCode:n.n.AUTHENTICATION,message:`Your session on ${e} expired and could not be refreshed.`,hint:`Sign in again: twenty auth login --remote ${e}`,details:{remote:e,refresh:t??null}}),g=(e,t)=>new n.t({code:`CONFLICT`,exitCode:n.n.CONFLICT,message:`Remote ${e} ${t} while this command was waiting to refresh its session. Nothing was sent.`,hint:`Run the command again.`,details:{remote:e}}),_=({config:e,remoteName:t,apiUrl:i})=>{if(!Object.hasOwn(e.remotes,t))throw g(t,`was renamed or removed`);let a=e.remotes[t];if(r.t({rawUrl:a.apiUrl,sourceName:t})!==i)throw g(t,`was pointed at another server`);let o=d.t(a);if(o===`apiKey`)throw g(t,`switched to an API key`);if(o===`none`)throw new n.t({code:`AUTH_REQUIRED`,exitCode:n.n.AUTHENTICATION,message:`Remote ${t} was signed out while this command was waiting.`,hint:`Sign in again: twenty auth login --remote ${t}`,details:{remote:t}});return a},v=({configPath:e,remoteName:t,apiUrl:r,signal:i})=>f.n({configPath:e,signal:i,operation:async()=>{let a=await l.t(e),o=_({config:a,remoteName:t,apiUrl:r}),{twentyCLIAccessToken:s,twentyCLIRefreshToken:c,twentyCLIRegistrationClientId:d}=o;if((0,m.isNonEmptyString)(s)&&!u.n(s))return s;if(!(0,m.isNonEmptyString)(c)||!(0,m.isNonEmptyString)(d))throw h(t);let{tokenEndpoint:g}=await p.n({apiUrl:r,signal:i}),v=await p.t({apiUrl:r,tokenEndpoint:g,parameters:{grant_type:`refresh_token`,refresh_token:c,client_id:d},signal:i}).catch(e=>{throw e instanceof n.t&&e.code===`OAUTH_FAILED`?h(t,e.details):e});return i.throwIfAborted(),await f.t(e,{...a,remotes:{...a.remotes,[t]:{...o,twentyCLIAccessToken:v.accessToken,...(0,m.isNonEmptyString)(v.refreshToken)?{twentyCLIRefreshToken:v.refreshToken}:{}}}}),v.accessToken}}),y=async({remoteName:e,remote:t,configPath:i,signal:a,onAuthenticationRequired:o})=>{let s=t.twentyCLIAccessToken,c=r.t({rawUrl:t.apiUrl,sourceName:`The URL of remote ${e}`});if((0,m.isNonEmptyString)(s)){let t={apiUrl:c,bearerToken:s,credentialKind:`oauth`,source:`remote`,remoteName:e};if(!u.n(s))return t;try{return{...t,bearerToken:await v({configPath:i,remoteName:e,apiUrl:c,signal:a})}}catch(e){if(o)return o({target:t,error:e});throw e}}let l=t.apiKey;if(!(0,m.isNonEmptyString)(l))throw new n.t({code:`AUTH_REQUIRED`,exitCode:n.n.AUTHENTICATION,message:`Remote ${e} has no saved credentials.`,hint:`Sign in: twenty auth login --remote ${e}`,details:{remote:e}});return{apiUrl:c,bearerToken:l,credentialKind:`apiKey`,source:`remote`,remoteName:e}},b=async({environment:e,remoteFlag:t,configPath:n,signal:i,warn:o,onAuthenticationRequired:c})=>{let u=await s.t({environment:e,remoteFlag:t,loadConfig:()=>l.t(n),warn:o});return u.source===`remote`?y({remoteName:u.remoteName,remote:u.remote,configPath:n,signal:i,onAuthenticationRequired:c}):{apiUrl:r.t({rawUrl:u.apiUrl,sourceName:a.t.API_URL}),bearerToken:u.apiKey,credentialKind:`apiKey`,source:`environment`}},x=async({options:e,outputMode:r,output:a,signal:s})=>{let l=c.t(),u=o.t({options:e,outputMode:r}),d=!1,f=async({target:e,error:r})=>{let i=r instanceof n.t?r.details?.refresh:void 0;if(!u||d||s.aborted||e.source!==`remote`||e.credentialKind!==`oauth`||!t.Ut(e.remoteName)||!(r instanceof n.t)||r.code!==`AUTH_REQUIRED`||t.u(i)&&i.status!==400&&i.status!==401)throw r;d=!0;let{signInToRemoteAgain:o}=await Promise.resolve().then(()=>require("./sign-in-to-remote-again-WEIeFaAT.cjs"));return o({target:e,remoteName:e.remoteName,error:r,configPath:l,output:a,signal:s})},p=await b({environment:process.env,remoteFlag:i.r(e,`remote`),configPath:l,signal:s,warn:a.warn,onAuthenticationRequired:f});if(!u||p.credentialKind!==`oauth`||d)return p;let{fetchSignedInIdentity:m}=await Promise.resolve().then(()=>require("./fetch-signed-in-identity-B49Tf79K.cjs")).then(e=>e.n);try{return await m({target:p,signal:s}),p}catch(e){return f({target:p,error:e})}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return x}});
@@ -1 +1 @@
1
- const e=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),t=require("./is-inside-directory-DHVCQE5C.cjs");let n=require("node:fs");var r=(e,t)=>{try{return(0,n.realpathSync)(e(t))}catch{return}},i=({resolveFromApp:n,specifier:i,sdkPath:a})=>{let o=r(n,i);return e.Vt(o)&&t.t({filePath:o,directory:a})?o:void 0};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return i}});
1
+ const e=require("./constants-D-caeNc5-9rDzSg5B.cjs"),t=require("./is-inside-directory-DHVCQE5C.cjs");let n=require("node:fs");var r=(e,t)=>{try{return(0,n.realpathSync)(e(t))}catch{return}},i=({resolveFromApp:n,specifier:i,sdkPath:a})=>{let o=r(n,i);return e.Ut(o)&&t.t({filePath:o,directory:a})?o:void 0};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return i}});
@@ -1 +1 @@
1
- const e=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),t=require("./cli-error-CSsayo0u.cjs"),n=require("./metadata-page.constant-CX7U7xM8.cjs");var r=async({client:r,name:i})=>{let a=(await n.n(async e=>{let{objects:t}=await r.query({objects:{__args:{paging:{first:n.t,after:e},filter:{}},pageInfo:{hasNextPage:!0,endCursor:!0},edges:{node:{id:!0,universalIdentifier:!0,nameSingular:!0,namePlural:!0,labelSingular:!0,labelPlural:!0,description:!0,isActive:!0,isSystem:!0,isSearchable:!0,labelIdentifierFieldMetadataId:!0,applicationId:!0}}}});return t})).filter(e=>e.nameSingular===i||e.namePlural===i);if(a.length>1)throw new t.t({code:`AMBIGUOUS_RESOURCE`,exitCode:t.n.USAGE,message:`More than one object has the API name ${i}.`,hint:`Use an unambiguous singular or plural API name.`,details:{matches:a.map(({id:e,nameSingular:t,namePlural:n})=>({id:e,nameSingular:t,namePlural:n})).sort((e,t)=>e.namePlural.localeCompare(t.namePlural))}});let o=a[0];if(!e.Vt(o))throw new t.t({code:`NOT_FOUND`,exitCode:t.n.NOT_FOUND,message:`No object has the API name ${i}.`,hint:`Use an exact singular or plural API name from twenty metadata object list --all.`});return o};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return r}});
1
+ const e=require("./constants-D-caeNc5-9rDzSg5B.cjs"),t=require("./cli-error-CSsayo0u.cjs"),n=require("./metadata-page.constant-CxWuBtP5.cjs");var r=async({client:r,name:i})=>{let a=(await n.n(async e=>{let{objects:t}=await r.query({objects:{__args:{paging:{first:n.t,after:e},filter:{}},pageInfo:{hasNextPage:!0,endCursor:!0},edges:{node:{id:!0,universalIdentifier:!0,nameSingular:!0,namePlural:!0,labelSingular:!0,labelPlural:!0,description:!0,isActive:!0,isSystem:!0,isSearchable:!0,labelIdentifierFieldMetadataId:!0,applicationId:!0}}}});return t})).filter(e=>e.nameSingular===i||e.namePlural===i);if(a.length>1)throw new t.t({code:`AMBIGUOUS_RESOURCE`,exitCode:t.n.USAGE,message:`More than one object has the API name ${i}.`,hint:`Use an unambiguous singular or plural API name.`,details:{matches:a.map(({id:e,nameSingular:t,namePlural:n})=>({id:e,nameSingular:t,namePlural:n})).sort((e,t)=>e.namePlural.localeCompare(t.namePlural))}});let o=a[0];if(!e.Ut(o))throw new t.t({code:`NOT_FOUND`,exitCode:t.n.NOT_FOUND,message:`No object has the API name ${i}.`,hint:`Use an exact singular or plural API name from twenty metadata object list --all.`});return o};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return r}});
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),n=require("./read-json-object-VckLNpsj.cjs"),r=require("./is-inside-directory-DHVCQE5C.cjs"),i=require("./has-yarn-plug-and-play-X3ay5Xl0.cjs"),a=require("./cli-error-CSsayo0u.cjs"),o=require("./fs-utils-Bl1fQcaJ.cjs");let s=require("node:fs/promises"),c=require("node:path"),l=require("node:module");var u=e.t(),d=e=>t.v(e)&&[`readConfigFile`,`parseJsonConfigFileContent`,`createProgram`,`getPreEmitDiagnostics`,`flattenDiagnosticMessageText`].every(t=>(0,u.isFunction)(e[t]))&&t.v(e.sys)&&(0,u.isFunction)(e.sys.readFile)&&t.v(e.DiagnosticCategory)&&(0,u.isNumber)(e.DiagnosticCategory.Warning),f=async e=>{let t=(0,l.createRequire)((0,c.join)(e,`package.json`)),u=i.n(e);for(let i of u){let l=(0,c.join)(i,`node_modules/typescript`);if(!await o.i(l))continue;let u=await(0,s.realpath)(l),f=await n.t((0,c.join)(u,`package.json`)),p=()=>new a.t({code:`TOOLING_UNSUPPORTED`,message:`The TypeScript installation at ${u} does not provide the compiler API this CLI needs. Reinstall a compatible typescript version in this app.`,details:{appPath:e,compilerPath:u,compilerVersion:f?.version}});if(f?.name!==`typescript`)throw p();let m;try{m=t.resolve(u)}catch{throw p()}if(!r.t({filePath:m,directory:u}))throw p();let h=t(m);if(!d(h))throw p();return h}let f=await i.t(e);throw new a.t({code:f?`TOOLING_UNSUPPORTED`:`TYPESCRIPT_NOT_INSTALLED`,message:f?`This app uses Yarn Plug'n'Play, which the twenty CLI cannot load TypeScript from. Set nodeLinker: node-modules in .yarnrc.yml and reinstall the app's dependencies.`:`TypeScript is not installed for this app. Install typescript in the app's devDependencies, then try again.`,details:{appPath:e}})};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return f}});
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-D-caeNc5-9rDzSg5B.cjs"),n=require("./read-json-object-BXZs97qz.cjs"),r=require("./is-inside-directory-DHVCQE5C.cjs"),i=require("./has-yarn-plug-and-play-X3ay5Xl0.cjs"),a=require("./cli-error-CSsayo0u.cjs"),o=require("./fs-utils-Bl1fQcaJ.cjs");let s=require("node:fs/promises"),c=require("node:path"),l=require("node:module");var u=e.t(),d=e=>t.u(e)&&[`readConfigFile`,`parseJsonConfigFileContent`,`createProgram`,`getPreEmitDiagnostics`,`flattenDiagnosticMessageText`].every(t=>(0,u.isFunction)(e[t]))&&t.u(e.sys)&&(0,u.isFunction)(e.sys.readFile)&&t.u(e.DiagnosticCategory)&&(0,u.isNumber)(e.DiagnosticCategory.Warning),f=async e=>{let t=(0,l.createRequire)((0,c.join)(e,`package.json`)),u=i.n(e);for(let i of u){let l=(0,c.join)(i,`node_modules/typescript`);if(!await o.i(l))continue;let u=await(0,s.realpath)(l),f=await n.t((0,c.join)(u,`package.json`)),p=()=>new a.t({code:`TOOLING_UNSUPPORTED`,message:`The TypeScript installation at ${u} does not provide the compiler API this CLI needs. Reinstall a compatible typescript version in this app.`,details:{appPath:e,compilerPath:u,compilerVersion:f?.version}});if(f?.name!==`typescript`)throw p();let m;try{m=t.resolve(u)}catch{throw p()}if(!r.t({filePath:m,directory:u}))throw p();let h=t(m);if(!d(h))throw p();return h}let f=await i.t(e);throw new a.t({code:f?`TOOLING_UNSUPPORTED`:`TYPESCRIPT_NOT_INSTALLED`,message:f?`This app uses Yarn Plug'n'Play, which the twenty CLI cannot load TypeScript from. Set nodeLinker: node-modules in .yarnrc.yml and reinstall the app's dependencies.`:`TypeScript is not installed for this app. Install typescript in the app's devDependencies, then try again.`,details:{appPath:e}})};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return f}});
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./request-timeout-milliseconds.constant-DtyQHrll.cjs");var i=e.t(),a=({url:e,apiUrl:t,requestedPath:r})=>{let i=new URL(`${t}/`);if(e.origin!==i.origin||!e.pathname.startsWith(i.pathname))throw new n.t({code:`INVALID_REQUEST_PATH`,exitCode:n.n.USAGE,message:`${r} is outside ${t}.`,hint:`Pass a path relative to the API URL, for example /rest/companies.`,details:{path:r}})},o=16*1024*1024,s,c=async()=>{try{let{EnvHttpProxyAgent:t}=await Promise.resolve().then(()=>e.i(require("./undici-D3mKdfwl.cjs").default));return new t}catch{throw new n.t({code:`INVALID_CONFIG`,message:`Could not configure the network proxy.`,hint:`Check HTTP_PROXY, HTTPS_PROXY, http_proxy and https_proxy.`})}},l=async(t,n,r)=>{let i=process.env.http_proxy??process.env.HTTP_PROXY,a=process.env.https_proxy??process.env.HTTPS_PROXY;if(!i&&!a&&r===void 0)return fetch(t,n);let o;i||a?(s??=c(),o=await s):o=(await Promise.resolve().then(()=>e.i(require("./undici-D3mKdfwl.cjs").default))).getGlobalDispatcher();let l=r===void 0?o:{dispatch:(e,t)=>o.dispatch({...e,headersTimeout:r,bodyTimeout:r},t)},u={...n,dispatcher:l};return fetch(t,u)},u=e=>new n.t({code:`RESPONSE_LIMIT_EXCEEDED`,message:`The response is larger than ${e/1024/1024} MiB.`,hint:`Ask for less data, for example a smaller page or fewer fields.`,details:{byteLimit:e}}),d=async(e,n)=>{let r=Number(e.headers.get(`content-length`));if(Number.isFinite(r)&&r>n)throw await e.body?.cancel(),u(n);if(!t.Vt(e.body))return new Uint8Array;let i=e.body.getReader(),a=[],o=0,s=await i.read();for(;!s.done;){if(o+=s.value.byteLength,o>n)throw await i.cancel(),u(n);a.push(s.value),s=await i.read()}return Buffer.concat(a)},f=new Set([101,204,205,304]),p=e=>e>=300&&e<400,m=(e,n)=>{let r=e.headers.get(`location`);return t.Vt(r)?URL.parse(r,n.href)?.origin:void 0},h=({error:e,signal:r,url:a,timeoutMilliseconds:o})=>{if(e instanceof n.t||r.aborted)return e;if(e instanceof Error&&e.name===`TimeoutError`)return new n.t({code:`TIMEOUT`,message:`${a.origin} did not answer within ${o/1e3} seconds.`});let s=e instanceof Error&&e.cause instanceof Error?e.cause.message:String(e),c=e instanceof Error&&e.cause instanceof Error?e.cause:e,l=c instanceof Error&&`code`in c&&(0,i.isString)(c.code)?c.code:void 0;return new n.t({code:`NETWORK_ERROR`,message:`Could not reach ${a.origin}.`,hint:`Check the API URL and that the server is running.`,details:{reason:s,...t.Vt(l)?{networkCode:l}:{}}})},g=(e,r)=>{let i=m(e,r);return new n.t({code:`REDIRECT_NOT_FOLLOWED`,message:`${r.origin} answered with a redirect (${e.status}), and redirects are not followed.`,hint:t.Vt(i)?`It redirects to ${i}. If that is the right server, use it as the API URL.`:`Check that the API URL points at the Twenty server itself.`,details:{status:e.status,redirectOrigin:i??null}})},_=({apiUrl:e,bearerToken:n,signal:i,timeoutMilliseconds:s=r.t})=>async(r,c={})=>{let u=new URL(r instanceof Request?r.url:r);a({url:u,apiUrl:e,requestedPath:u.pathname});let m=new Headers(c.headers);t.Vt(n)&&m.set(`Authorization`,`Bearer ${n}`);try{let e=await l(u,{...c,headers:m,redirect:`manual`,signal:AbortSignal.any([i,AbortSignal.timeout(s)])},s===6e4?void 0:s);if(p(e.status))throw await e.body?.cancel(),g(e,u);let t=await d(e,o);return new Response(f.has(e.status)?null:t,{status:e.status,statusText:e.statusText,headers:e.headers})}catch(e){throw h({error:e,signal:i,url:u,timeoutMilliseconds:s})}},v=({target:e,signal:t,timeoutMilliseconds:n})=>_({apiUrl:e.apiUrl,bearerToken:e.bearerToken,signal:t,timeoutMilliseconds:n}),y=/^application\/([\w.+-]+\+)?json/i,b=/^(text\/|application\/([\w.+-]+\+)?(json|xml)|application\/javascript)/i,x=async e=>{let t=e.headers.get(`content-type`)??``;if(t!==``&&!b.test(t))throw new n.t({code:`UNSUPPORTED_RESPONSE_TYPE`,message:`The response is ${t}, and binary bodies are not supported yet.`,details:{status:e.status,contentType:t}});let r=await e.text();if(r===``)return null;if(!y.test(t))return r;try{return JSON.parse(r)}catch{return r}},S=/^[a-z][a-z\d+.-]*:/i,C=({apiUrl:e,path:t})=>{let r=t.trim();if(S.test(r)||r.startsWith(`//`)||r.includes(`\\`))throw new n.t({code:`INVALID_REQUEST_PATH`,exitCode:n.n.USAGE,message:`${t} is not a relative path.`,hint:`Pass the path only, for example /rest/companies. Requests always go to the selected workspace.`,details:{path:t}});let i=new URL(r.replace(/^\/+/,``),`${e}/`);return a({url:i,apiUrl:e,requestedPath:t}),i};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return a}});
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./constants-D-caeNc5-9rDzSg5B.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./request-timeout-milliseconds.constant-DtyQHrll.cjs");var i=e.t(),a=({url:e,apiUrl:t,requestedPath:r})=>{let i=new URL(`${t}/`);if(e.origin!==i.origin||!e.pathname.startsWith(i.pathname))throw new n.t({code:`INVALID_REQUEST_PATH`,exitCode:n.n.USAGE,message:`${r} is outside ${t}.`,hint:`Pass a path relative to the API URL, for example /rest/companies.`,details:{path:r}})},o=16*1024*1024,s,c=async()=>{try{let{EnvHttpProxyAgent:t}=await Promise.resolve().then(()=>e.i(require("./undici-D3mKdfwl.cjs").default));return new t}catch{throw new n.t({code:`INVALID_CONFIG`,message:`Could not configure the network proxy.`,hint:`Check HTTP_PROXY, HTTPS_PROXY, http_proxy and https_proxy.`})}},l=async(t,n,r)=>{let i=process.env.http_proxy??process.env.HTTP_PROXY,a=process.env.https_proxy??process.env.HTTPS_PROXY;if(!i&&!a&&r===void 0)return fetch(t,n);let o;i||a?(s??=c(),o=await s):o=(await Promise.resolve().then(()=>e.i(require("./undici-D3mKdfwl.cjs").default))).getGlobalDispatcher();let l=r===void 0?o:{dispatch:(e,t)=>o.dispatch({...e,headersTimeout:r,bodyTimeout:r},t)},u={...n,dispatcher:l};return fetch(t,u)},u=e=>new n.t({code:`RESPONSE_LIMIT_EXCEEDED`,message:`The response is larger than ${e/1024/1024} MiB.`,hint:`Ask for less data, for example a smaller page or fewer fields.`,details:{byteLimit:e}}),d=async(e,n)=>{let r=Number(e.headers.get(`content-length`));if(Number.isFinite(r)&&r>n)throw await e.body?.cancel(),u(n);if(!t.Ut(e.body))return new Uint8Array;let i=e.body.getReader(),a=[],o=0,s=await i.read();for(;!s.done;){if(o+=s.value.byteLength,o>n)throw await i.cancel(),u(n);a.push(s.value),s=await i.read()}return Buffer.concat(a)},f=new Set([101,204,205,304]),p=e=>e>=300&&e<400,m=(e,n)=>{let r=e.headers.get(`location`);return t.Ut(r)?URL.parse(r,n.href)?.origin:void 0},h=({error:e,signal:r,url:a,timeoutMilliseconds:o})=>{if(e instanceof n.t||r.aborted)return e;if(e instanceof Error&&e.name===`TimeoutError`)return new n.t({code:`TIMEOUT`,message:`${a.origin} did not answer within ${o/1e3} seconds.`});let s=e instanceof Error&&e.cause instanceof Error?e.cause.message:String(e),c=e instanceof Error&&e.cause instanceof Error?e.cause:e,l=c instanceof Error&&`code`in c&&(0,i.isString)(c.code)?c.code:void 0;return new n.t({code:`NETWORK_ERROR`,message:`Could not reach ${a.origin}.`,hint:`Check the API URL and that the server is running.`,details:{reason:s,...t.Ut(l)?{networkCode:l}:{}}})},g=(e,r)=>{let i=m(e,r);return new n.t({code:`REDIRECT_NOT_FOLLOWED`,message:`${r.origin} answered with a redirect (${e.status}), and redirects are not followed.`,hint:t.Ut(i)?`It redirects to ${i}. If that is the right server, use it as the API URL.`:`Check that the API URL points at the Twenty server itself.`,details:{status:e.status,redirectOrigin:i??null}})},_=({apiUrl:e,bearerToken:n,signal:i,timeoutMilliseconds:s=r.t})=>async(r,c={})=>{let u=new URL(r instanceof Request?r.url:r);a({url:u,apiUrl:e,requestedPath:u.pathname});let m=new Headers(c.headers);t.Ut(n)&&m.set(`Authorization`,`Bearer ${n}`);try{let e=await l(u,{...c,headers:m,redirect:`manual`,signal:AbortSignal.any([i,AbortSignal.timeout(s)])},s===6e4?void 0:s);if(p(e.status))throw await e.body?.cancel(),g(e,u);let t=await d(e,o);return new Response(f.has(e.status)?null:t,{status:e.status,statusText:e.statusText,headers:e.headers})}catch(e){throw h({error:e,signal:i,url:u,timeoutMilliseconds:s})}},v=({target:e,signal:t,timeoutMilliseconds:n})=>_({apiUrl:e.apiUrl,bearerToken:e.bearerToken,signal:t,timeoutMilliseconds:n}),y=/^application\/([\w.+-]+\+)?json/i,b=/^(text\/|application\/([\w.+-]+\+)?(json|xml)|application\/javascript)/i,x=async e=>{let t=e.headers.get(`content-type`)??``;if(t!==``&&!b.test(t))throw new n.t({code:`UNSUPPORTED_RESPONSE_TYPE`,message:`The response is ${t}, and binary bodies are not supported yet.`,details:{status:e.status,contentType:t}});let r=await e.text();if(r===``)return null;if(!y.test(t))return r;try{return JSON.parse(r)}catch{return r}},S=/^[a-z][a-z\d+.-]*:/i,C=({apiUrl:e,path:t})=>{let r=t.trim();if(S.test(r)||r.startsWith(`//`)||r.includes(`\\`))throw new n.t({code:`INVALID_REQUEST_PATH`,exitCode:n.n.USAGE,message:`${t} is not a relative path.`,hint:`Pass the path only, for example /rest/companies. Requests always go to the selected workspace.`,details:{path:t}});let i=new URL(r.replace(/^\/+/,``),`${e}/`);return a({url:i,apiUrl:e,requestedPath:t}),i};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return a}});
@@ -1 +1 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./check-node-requirement-CGBKvEqH.cjs"),n=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),r=require("./read-json-object-VckLNpsj.cjs"),i=require("./resolve-inside-sdk-BK6jFT6V.cjs"),a=require("./has-yarn-plug-and-play-X3ay5Xl0.cjs"),o=require("./cli-error-CSsayo0u.cjs"),s=require("./fs-utils-Bl1fQcaJ.cjs");let c=require("node:fs/promises"),l=require("node:path"),u=require("node:module");var d=e.t(),f=e.i(t.n()),p=async e=>{for(let t of a.n(e)){let i=(0,l.join)(t,`node_modules`,`twenty-sdk`);if(!await s.i(i))continue;let a=await r.t((0,l.join)(i,`package.json`));if(!n.Vt(a)||a.name!==`twenty-sdk`)throw new o.t({code:`TOOLING_UNSUPPORTED`,message:`The twenty-sdk installation at ${i} is incomplete: it has no readable twenty-sdk package.json.`,hint:`Reinstall the app's dependencies (for example with yarn install), then try again.`,details:{appPath:e,sdkPath:i}});return{path:await(0,c.realpath)(i),packageJson:a}}},m=async e=>{throw await a.t(e)?new o.t({code:`TOOLING_UNSUPPORTED`,message:`This app uses Yarn Plug'n'Play, which the twenty CLI cannot load the SDK from.`,hint:`Set nodeLinker: node-modules in .yarnrc.yml, then run yarn install.`,details:{appPath:e}}):new o.t({code:`SDK_NOT_INSTALLED`,message:`twenty-sdk is not installed for this app.`,hint:`Install the app's dependencies (for example with yarn install), then try again.`,details:{appPath:e}})},h=async e=>{let t=await p(e);return n.Vt(t)?t:m(e)},g=`>=1.23.0`,_=[`twenty-sdk/define`,`twenty-sdk/front-component`],v=async({appPath:e,warn:r})=>{let a=await h(e),s=(0,d.isString)(a.packageJson.version)?a.packageJson.version:`unknown`,c={appPath:e,sdkPath:a.path,sdkVersion:s},p=(0,u.createRequire)((0,l.join)(e,`package.json`)).resolve,m=_.filter(e=>!n.Vt(i.t({resolveFromApp:p,specifier:e,sdkPath:a.path})));if(!(0,f.default)(s,g,{includePrerelease:!0})||m.length>0)throw new o.t({code:`SDK_SOURCE_UNSUPPORTED`,message:`twenty-sdk ${s} cannot load app source with this CLI. Source loading needs twenty-sdk ${g} with its define and front-component entry points.`,hint:`Install a compatible twenty-sdk version in this app.`,details:{...c,supportedRange:g,missingEntryPoints:m}});let v=n.v(a.packageJson.engines)?a.packageJson.engines.node:void 0;if(n.Vt(v)){let e=(0,d.isString)(v)?t.t({version:process.versions.node,range:v}):`invalid`;if(e===`outsideRange`)r?.({code:`NODE_VERSION_UNTESTED`,message:`twenty-sdk ${s} declares Node ${String(v)}; continuing on Node ${process.versions.node}, which is outside that range.`});else if(e!==`satisfied`)throw new o.t({code:e===`invalid`?`SDK_SOURCE_UNSUPPORTED`:`NODE_VERSION_UNSUPPORTED`,message:`twenty-sdk ${s} declares Node ${String(v)}; this is Node ${process.versions.node}.`,hint:e===`invalid`?`Install a twenty-sdk version with a valid Node requirement.`:`Switch to a supported Node version, then try again.`,details:{...c,requiredNode:v}})}return{version:s,packagePath:a.path}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return v}});
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./check-node-requirement-B_hf2E32.cjs"),n=require("./constants-D-caeNc5-9rDzSg5B.cjs"),r=require("./read-json-object-BXZs97qz.cjs"),i=require("./resolve-inside-sdk-DiEOTO12.cjs"),a=require("./has-yarn-plug-and-play-X3ay5Xl0.cjs"),o=require("./cli-error-CSsayo0u.cjs"),s=require("./fs-utils-Bl1fQcaJ.cjs");let c=require("node:fs/promises"),l=require("node:path"),u=require("node:module");var d=e.t(),f=e.i(t.a()),p=async e=>{for(let t of a.n(e)){let i=(0,l.join)(t,`node_modules`,`twenty-sdk`);if(!await s.i(i))continue;let a=await r.t((0,l.join)(i,`package.json`));if(!n.Ut(a)||a.name!==`twenty-sdk`)throw new o.t({code:`TOOLING_UNSUPPORTED`,message:`The twenty-sdk installation at ${i} is incomplete: it has no readable twenty-sdk package.json.`,hint:`Reinstall the app's dependencies (for example with yarn install), then try again.`,details:{appPath:e,sdkPath:i}});return{path:await(0,c.realpath)(i),packageJson:a}}},m=async e=>{throw await a.t(e)?new o.t({code:`TOOLING_UNSUPPORTED`,message:`This app uses Yarn Plug'n'Play, which the twenty CLI cannot load the SDK from.`,hint:`Set nodeLinker: node-modules in .yarnrc.yml, then run yarn install.`,details:{appPath:e}}):new o.t({code:`SDK_NOT_INSTALLED`,message:`twenty-sdk is not installed for this app.`,hint:`Install the app's dependencies (for example with yarn install), then try again.`,details:{appPath:e}})},h=async e=>{let t=await p(e);return n.Ut(t)?t:m(e)},g=`>=1.23.0`,_=[`twenty-sdk/define`,`twenty-sdk/front-component`],v=async({appPath:e,warn:r})=>{let a=await h(e),s=(0,d.isString)(a.packageJson.version)?a.packageJson.version:`unknown`,c={appPath:e,sdkPath:a.path,sdkVersion:s},p=(0,u.createRequire)((0,l.join)(e,`package.json`)).resolve,m=_.filter(e=>!n.Ut(i.t({resolveFromApp:p,specifier:e,sdkPath:a.path})));if(!(0,f.default)(s,g,{includePrerelease:!0})||m.length>0)throw new o.t({code:`SDK_SOURCE_UNSUPPORTED`,message:`twenty-sdk ${s} cannot load app source with this CLI. Source loading needs twenty-sdk ${g} with its define and front-component entry points.`,hint:`Install a compatible twenty-sdk version in this app.`,details:{...c,supportedRange:g,missingEntryPoints:m}});let v=n.u(a.packageJson.engines)?a.packageJson.engines.node:void 0;if(n.Ut(v)){let e=(0,d.isString)(v)?t.t({version:process.versions.node,range:v}):`invalid`;if(e===`outsideRange`)r?.({code:`NODE_VERSION_UNTESTED`,message:`twenty-sdk ${s} declares Node ${String(v)}; continuing on Node ${process.versions.node}, which is outside that range.`});else if(e!==`satisfied`)throw new o.t({code:e===`invalid`?`SDK_SOURCE_UNSUPPORTED`:`NODE_VERSION_UNSUPPORTED`,message:`twenty-sdk ${s} declares Node ${String(v)}; this is Node ${process.versions.node}.`,hint:e===`invalid`?`Install a twenty-sdk version with a valid Node requirement.`:`Switch to a supported Node version, then try again.`,details:{...c,requiredNode:v}})}return{version:s,packagePath:a.path}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return v}});
@@ -1 +1 @@
1
- const e=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),t=require("./cli-error-CSsayo0u.cjs"),n=require("./read-command-values-uSJqBG_E.cjs"),r=require("./format-body-DqhC3QLB.cjs"),i=require("./read-input-value-Cxgh_r2g.cjs"),a=require("./parse-json-input-BOUh0Y2U.cjs"),o=require("./resolve-request-url-B6KNhoFa.cjs"),s=require("./parse-graphql-response-DSSJWiGu.cjs");var c=e=>{let n=Object.entries(e).filter(([,e])=>e===i.n.STANDARD_INPUT).map(([e])=>e);if(n.length>1)throw new t.t({code:`USAGE`,exitCode:t.n.USAGE,message:`Only one option can read standard input, but ${n.join(` and `)} both use -.`,hint:`Pass the other one inline or as @file.`})},l=async({target:e,signal:t,endpoint:n,query:r,variables:i})=>(await s.t({response:await o.a({target:e,signal:t})(o.t({apiUrl:e.apiUrl,path:s.r[n]}),{method:`POST`,headers:{Accept:`application/graphql-response+json, application/json`,"Content-Type":`application/json`},body:JSON.stringify({query:r,variables:i})}),target:e})).data??null,u=async(t,n)=>{if(e.Vt(t))return a.n({text:await i.t({value:t,optionName:`--variables`,signal:n}),optionName:`--variables`})},d=async({options:e,target:t,signal:a})=>{let o=n.r(e,`query`)??``,s=n.r(e,`variables`);c({"--query":o,"--variables":s});let d=await i.t({value:o,optionName:`--query`,signal:a}),f=await u(s,a),p=await l({target:t,signal:a,endpoint:n.t(e,`metadata`)?`metadata`:`core`,query:d,variables:f});return{data:p,human:r.t(p)}};exports.runApiGraphqlCommand=d;
1
+ const e=require("./constants-D-caeNc5-9rDzSg5B.cjs"),t=require("./cli-error-CSsayo0u.cjs"),n=require("./read-command-values-uSJqBG_E.cjs"),r=require("./format-body-CyNgSGIx.cjs"),i=require("./read-input-value-Cxgh_r2g.cjs"),a=require("./parse-json-input-CO-KP4XZ.cjs"),o=require("./resolve-request-url-BvOe0vYd.cjs"),s=require("./parse-graphql-response-BcKxw_s9.cjs");var c=e=>{let n=Object.entries(e).filter(([,e])=>e===i.n.STANDARD_INPUT).map(([e])=>e);if(n.length>1)throw new t.t({code:`USAGE`,exitCode:t.n.USAGE,message:`Only one option can read standard input, but ${n.join(` and `)} both use -.`,hint:`Pass the other one inline or as @file.`})},l=async({target:e,signal:t,endpoint:n,query:r,variables:i})=>(await s.t({response:await o.a({target:e,signal:t})(o.t({apiUrl:e.apiUrl,path:s.r[n]}),{method:`POST`,headers:{Accept:`application/graphql-response+json, application/json`,"Content-Type":`application/json`},body:JSON.stringify({query:r,variables:i})}),target:e})).data??null,u=async(t,n)=>{if(e.Ut(t))return a.n({text:await i.t({value:t,optionName:`--variables`,signal:n}),optionName:`--variables`})},d=async({options:e,target:t,signal:a})=>{let o=n.r(e,`query`)??``,s=n.r(e,`variables`);c({"--query":o,"--variables":s});let d=await i.t({value:o,optionName:`--query`,signal:a}),f=await u(s,a),p=await l({target:t,signal:a,endpoint:n.t(e,`metadata`)?`metadata`:`core`,query:d,variables:f});return{data:p,human:r.t(p)}};exports.runApiGraphqlCommand=d;
@@ -1 +1 @@
1
- const e=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),t=require("./cli-error-CSsayo0u.cjs"),n=require("./read-command-values-uSJqBG_E.cjs"),r=require("./format-body-DqhC3QLB.cjs"),i=require("./read-input-value-Cxgh_r2g.cjs"),a=require("./parse-json-input-BOUh0Y2U.cjs"),o=require("./resolve-request-url-B6KNhoFa.cjs"),s=require("./create-http-status-error-CCASIoUs.cjs");var c=async({target:t,signal:n,method:r,path:i,body:a})=>{let c=await o.a({target:t,signal:n})(o.t({apiUrl:t.apiUrl,path:i}),{method:r,headers:{Accept:`application/json`,...e.Vt(a)?{"Content-Type":`application/json`}:{}},body:a}),l=await o.n(c);if(!c.ok)throw s.t({status:c.status,headers:c.headers,body:l,target:t});return{status:c.status,headers:s.n(c.headers),body:l}},l=`GET`,u=async(t,n)=>{if(!e.Vt(t))return;let r=await i.t({value:t,optionName:`--body`,signal:n});return a.t({text:r,optionName:`--body`}),r},d=async({arguments:i,options:a,target:o,signal:s})=>{let d=n.n(i,0)??``,f=n.r(a,`method`),p=n.r(a,`body`);if(e.Vt(p)&&!e.Vt(f))throw new t.t({code:`USAGE`,exitCode:t.n.USAGE,message:`A request body needs an explicit method.`,hint:`Add --method POST, PATCH or PUT.`});let m=await c({target:o,signal:s,method:f??l,path:d,body:await u(p,s)});return{data:m,human:r.t(m.body)}};exports.runApiRestCommand=d;
1
+ const e=require("./constants-D-caeNc5-9rDzSg5B.cjs"),t=require("./cli-error-CSsayo0u.cjs"),n=require("./read-command-values-uSJqBG_E.cjs"),r=require("./format-body-CyNgSGIx.cjs"),i=require("./read-input-value-Cxgh_r2g.cjs"),a=require("./parse-json-input-CO-KP4XZ.cjs"),o=require("./resolve-request-url-BvOe0vYd.cjs"),s=require("./create-http-status-error-E0DUDIUP.cjs");var c=async({target:t,signal:n,method:r,path:i,body:a})=>{let c=await o.a({target:t,signal:n})(o.t({apiUrl:t.apiUrl,path:i}),{method:r,headers:{Accept:`application/json`,...e.Ut(a)?{"Content-Type":`application/json`}:{}},body:a}),l=await o.n(c);if(!c.ok)throw s.t({status:c.status,headers:c.headers,body:l,target:t});return{status:c.status,headers:s.n(c.headers),body:l}},l=`GET`,u=async(t,n)=>{if(!e.Ut(t))return;let r=await i.t({value:t,optionName:`--body`,signal:n});return a.t({text:r,optionName:`--body`}),r},d=async({arguments:i,options:a,target:o,signal:s})=>{let d=n.n(i,0)??``,f=n.r(a,`method`),p=n.r(a,`body`);if(e.Ut(p)&&!e.Ut(f))throw new t.t({code:`USAGE`,exitCode:t.n.USAGE,message:`A request body needs an explicit method.`,hint:`Add --method POST, PATCH or PUT.`});let m=await c({target:o,signal:s,method:f??l,path:d,body:await u(p,s)});return{data:m,human:r.t(m.body)}};exports.runApiRestCommand=d;
@@ -1,4 +1,4 @@
1
- const e=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),t=require("./application-C02vC9wC.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./assert-pull-paths-BuQ1ZRvQ.cjs"),i=require("./print-typescript-value-BU2EWXuF.cjs"),a=require("./kebab-case-D0usAzG-.cjs"),o=require("./read-command-values-uSJqBG_E.cjs"),s=require("./convert-to-label-DB0PYecG.cjs"),c=require("./confirm-in-terminal-BxEM5lxE.cjs"),l=require("./is-interaction-allowed-CF-ko1KI.cjs"),u=require("./style-BR52fK4V.cjs"),d=require("./to-worker-output-diagnostics-eE_POlPf.cjs"),f=require("./read-app-identity-CdFKlGlw.cjs"),p=require("./resolve-app-project-Dc5KpCDh.cjs");let m=require("node:crypto"),h=require("node:fs/promises"),g=require("node:path");var _=[`object`,`field`,`logic-function`,`front-component`],v=({name:e,objectUniversalIdentifier:t})=>`import { defineNavigationMenuItem, NavigationMenuItemType } from 'twenty-sdk/define';
1
+ const e=require("./constants-D-caeNc5-9rDzSg5B.cjs"),t=require("./application-DOWikeQt.cjs"),n=require("./cli-error-CSsayo0u.cjs"),r=require("./assert-pull-paths-BuQ1ZRvQ.cjs"),i=require("./print-typescript-value-D5kLR9wo.cjs"),a=require("./kebab-case-D0usAzG-.cjs"),o=require("./read-command-values-uSJqBG_E.cjs"),s=require("./convert-to-label-hx-g0Lvj.cjs"),c=require("./confirm-in-terminal-BxEM5lxE.cjs"),l=require("./is-interaction-allowed-CF-ko1KI.cjs"),u=require("./style-BR52fK4V.cjs"),d=require("./to-worker-output-diagnostics-BzdY4Z2V.cjs"),f=require("./read-app-identity-Da5yI23t.cjs"),p=require("./resolve-app-project-B0KRR-xp.cjs");let m=require("node:crypto"),h=require("node:fs/promises"),g=require("node:path");var _=[`object`,`field`,`logic-function`,`front-component`],v=({name:e,objectUniversalIdentifier:t})=>`import { defineNavigationMenuItem, NavigationMenuItemType } from 'twenty-sdk/define';
2
2
 
3
3
  export default defineNavigationMenuItem({
4
4
  universalIdentifier: '${(0,m.randomUUID)()}',
@@ -53,10 +53,10 @@ export default definePageLayout({
53
53
  },
54
54
  ],
55
55
  });
56
- `,b=({name:t,universalIdentifier:n=(0,m.randomUUID)(),objectUniversalIdentifier:r,fieldUniversalIdentifiers:a,type:o=e.z.TABLE})=>`import { defineView } from 'twenty-sdk/define';
56
+ `,b=({name:t,universalIdentifier:n=(0,m.randomUUID)(),objectUniversalIdentifier:r,fieldUniversalIdentifiers:a,type:o=e.st.TABLE})=>`import { defineView } from 'twenty-sdk/define';
57
57
 
58
- export default defineView(${i.t({value:{universalIdentifier:n,name:t,objectUniversalIdentifier:r,type:o,icon:e.m[o],position:0,fields:a.map((e,t)=>({universalIdentifier:(0,m.randomUUID)(),fieldMetadataUniversalIdentifier:e,position:t,isVisible:!0,size:200}))}})});
59
- `,x=({name:n,labelSingular:r,objectUniversalIdentifier:i,nameFieldUniversalIdentifier:a,applicationUniversalIdentifier:o,createView:s,createNavigationMenuItem:c,createPageLayout:l})=>{let u=[];if(s&&u.push({path:`src/views/all-${n}.ts`,content:b({name:`all-${n}`,objectUniversalIdentifier:i,fieldUniversalIdentifiers:[a]})}),c&&u.push({path:`src/navigation-menu-items/${n}.ts`,content:v({name:n,objectUniversalIdentifier:i})}),l){let s=(0,m.randomUUID)(),c=[a,...[`createdAt`,`updatedAt`,`createdBy`,`updatedBy`].map(e=>t.h({applicationUniversalIdentifier:o,objectUniversalIdentifier:i,name:e}))];u.push({path:`src/views/${n}-record-page-fields.ts`,content:b({name:`${n}-record-page-fields`,universalIdentifier:s,objectUniversalIdentifier:i,type:e.z.FIELDS_WIDGET,fieldUniversalIdentifiers:c})},{path:`src/page-layouts/${n}-record-page-layout.ts`,content:y({objectLabelSingular:r,objectUniversalIdentifier:i,fieldsWidgetViewUniversalIdentifier:s})})}return u},S=({data:t})=>{let n=(0,m.randomUUID)(),r=t.description?`\n description: ${i.t({value:t.description})},`:``;if(t.type===e.ot.RELATION||t.type===e.ot.MORPH_RELATION){let a=t.onDelete&&t.onDelete!==`None`,o=`import { defineField, FieldType, RelationType${a?`, OnDeleteAction`:``} } from 'twenty-sdk/define';`,s=a?`, onDelete: OnDeleteAction.${t.onDelete}`:``,c=t.relationType===e.B.MANY_TO_ONE?`, joinColumnName: '${t.name}Id'`:``,l=t.type===e.ot.MORPH_RELATION?`\n morphId: '${(0,m.randomUUID)()}',`:``;return`${o}
58
+ export default defineView(${i.t({value:{universalIdentifier:n,name:t,objectUniversalIdentifier:r,type:o,icon:e.f[o],position:0,fields:a.map((e,t)=>({universalIdentifier:(0,m.randomUUID)(),fieldMetadataUniversalIdentifier:e,position:t,isVisible:!0,size:200}))}})});
59
+ `,x=({name:n,labelSingular:r,objectUniversalIdentifier:i,nameFieldUniversalIdentifier:a,applicationUniversalIdentifier:o,createView:s,createNavigationMenuItem:c,createPageLayout:l})=>{let u=[];if(s&&u.push({path:`src/views/all-${n}.ts`,content:b({name:`all-${n}`,objectUniversalIdentifier:i,fieldUniversalIdentifiers:[a]})}),c&&u.push({path:`src/navigation-menu-items/${n}.ts`,content:v({name:n,objectUniversalIdentifier:i})}),l){let s=(0,m.randomUUID)(),c=[a,...[`createdAt`,`updatedAt`,`createdBy`,`updatedBy`].map(e=>t.h({applicationUniversalIdentifier:o,objectUniversalIdentifier:i,name:e}))];u.push({path:`src/views/${n}-record-page-fields.ts`,content:b({name:`${n}-record-page-fields`,universalIdentifier:s,objectUniversalIdentifier:i,type:e.st.FIELDS_WIDGET,fieldUniversalIdentifiers:c})},{path:`src/page-layouts/${n}-record-page-layout.ts`,content:y({objectLabelSingular:r,objectUniversalIdentifier:i,fieldsWidgetViewUniversalIdentifier:s})})}return u},S=({data:t})=>{let n=(0,m.randomUUID)(),r=t.description?`\n description: ${i.t({value:t.description})},`:``;if(t.type===e.ct.RELATION||t.type===e.ct.MORPH_RELATION){let a=t.onDelete&&t.onDelete!==`None`,o=`import { defineField, FieldType, RelationType${a?`, OnDeleteAction`:``} } from 'twenty-sdk/define';`,s=a?`, onDelete: OnDeleteAction.${t.onDelete}`:``,c=t.relationType===e.nt.MANY_TO_ONE?`, joinColumnName: '${t.name}Id'`:``,l=t.type===e.ct.MORPH_RELATION?`\n morphId: '${(0,m.randomUUID)()}',`:``;return`${o}
60
60
 
61
61
  export default defineField({
62
62
  universalIdentifier: '${n}',
@@ -159,5 +159,5 @@ export default defineObject({
159
159
  },
160
160
  ],
161
161
  });
162
- `,E=e=>new n.t({code:`USAGE`,exitCode:n.n.USAGE,message:e,hint:`Run twenty app add --help for options and examples.`}),D=async({context:n,applicationUniversalIdentifier:r})=>{let{options:i,signal:u}=n,d=l.t(n),f=async({option:t,label:n,value:r=o.r(i,t),defaultValue:s,choices:l})=>{if(u.throwIfAborted(),!e.Vt(r)&&d?(r=await c.n({question:`${n}${l?` (${l.join(`, `)})`:``}${e.Vt(s)?` [${s}]`:``}: `,signal:u}),r=r.trim()||s):r=r?.trim()??s,!e.Vt(r)||r.length===0&&s!==``)throw E(`Missing ${n.toLowerCase()}. Provide ${t===`entity`?`an entity argument`:`--${a.t(t)}`}.`);if(l&&!l.includes(r))throw E(`Invalid ${n.toLowerCase()}: ${r}. Expected ${l.join(`, `)}.`);return r},p=async(e,n)=>{let r=await f({option:e,label:n});if(!t.a(r))throw E(`${n} must be a UUID (version 4 or later).`);return r},h=await f({option:`entity`,label:`Entity`,value:o.n(n.arguments,0),choices:_}),g=[`namePlural`,`labelPlural`,`createView`,`createNavigationMenuItem`,`createPageLayout`],v=[`type`,`object`,`description`],y=[`targetObject`,`targetField`,`relationType`,`onDelete`],b=t=>{let n=t.filter(t=>e.Vt(i[t]));if(n.length>0)throw E(`Options do not apply to this definition: ${n.map(e=>`--${a.t(e)}`).join(`, `)}.`)};h!==`object`&&b(g),h!==`field`&&b([...v,...y]),h!==`object`&&h!==`field`&&b([`label`]);let D=await f({option:`name`,label:`Name`}),O=a.t(D);if(!/[a-z0-9]/.test(O))throw E(`Name must contain at least one ASCII letter or digit.`);let k,A=[];switch(h){case`object`:{let e=await f({option:`namePlural`,label:`Plural name`});if(e===D)throw E(`Singular and plural object names must differ.`);let t=await f({option:`label`,label:`Singular label`,defaultValue:s.t(D)}),n=await f({option:`labelPlural`,label:`Plural label`,defaultValue:s.t(e)}),a={createView:o.t(i,`createView`),createNavigationMenuItem:o.t(i,`createNavigationMenuItem`),createPageLayout:o.t(i,`createPageLayout`)};if(d&&!Object.values(a).some(e=>e)){let e=await c.t({question:`Also create a view, navigation menu item, and record page layout for this object?`,signal:u});a.createView=e,a.createNavigationMenuItem=e,a.createPageLayout=e}let l=(0,m.randomUUID)(),p=(0,m.randomUUID)();k=T({name:D,universalIdentifier:l,nameFieldUniversalIdentifier:p,data:{nameSingular:D,namePlural:e,labelSingular:t,labelPlural:n}}),A=x({name:O,labelSingular:t,objectUniversalIdentifier:l,nameFieldUniversalIdentifier:p,applicationUniversalIdentifier:r,...a});break}case`field`:{let t=await f({option:`label`,label:`Label`,defaultValue:s.t(D)}),n=await f({option:`type`,label:`Field type`,defaultValue:e.ot.TEXT,choices:Object.values(e.ot)}),r=Object.values(e.ot).find(e=>e===n);if(!e.Vt(r))throw E(`Invalid field type: ${n}.`);let i={name:D,label:t,type:r,objectUniversalIdentifier:await p(`object`,`Parent object universal identifier`),description:await f({option:`description`,label:`Description`,defaultValue:``})};if(r===e.ot.RELATION||r===e.ot.MORPH_RELATION){i.relationTargetObjectMetadataUniversalIdentifier=await p(`targetObject`,`Target object universal identifier`),i.relationTargetFieldMetadataUniversalIdentifier=await p(`targetField`,`Target field universal identifier`);let t=await f({option:`relationType`,label:`Relation type`,defaultValue:e.B.ONE_TO_MANY,choices:Object.values(e.B)}),n=await f({option:`onDelete`,label:`On delete`,defaultValue:e.N.CASCADE,choices:[...Object.values(e.N),`None`]});i.relationType=Object.values(e.B).find(e=>e===t),i.onDelete=n===`None`?`None`:Object.values(e.N).find(e=>e===n)}else b(y);k=S({name:D,data:i});break}case`logic-function`:k=w({name:D});break;case`front-component`:k=C({name:D});break;default:throw E(`Unsupported entity: ${h}.`)}return{entity:h,name:D,files:[{path:`src/${h}s/${O}.${h===`front-component`?`tsx`:`ts`}`,content:k},...A]}},O=async({appPath:e,files:t,signal:i})=>{i.throwIfAborted();for(let i of t)try{throw await r.t({appPath:e,relativePaths:[i.path]}),await(0,h.lstat)((0,g.join)(e,i.path)),new n.t({code:`APP_PATH_UNAVAILABLE`,exitCode:n.n.CONFLICT,message:`${i.path} already exists. No files were changed.`,hint:`Choose a different name, or edit the existing definition.`})}catch(e){if(e instanceof r.n)throw new n.t({code:`APP_PATH_UNAVAILABLE`,exitCode:n.n.CONFLICT,message:`Cannot create ${i.path}: the destination must stay inside the app and cannot contain symbolic links.`});if(!n.r(e,`ENOENT`))throw e}let a=[],o=[],s=[];try{for(let n of t){i.throwIfAborted();let t=(0,g.dirname)((0,g.join)(e,n.path));await(0,h.mkdir)(t,{recursive:!0}),i.throwIfAborted();let r=await(0,h.mkdtemp)((0,g.join)(t,`.twenty-add-`)),o=(0,g.join)(r,`definition`);a.push({path:n.path,stagedPath:o,temporaryDirectory:r}),await(0,h.writeFile)(o,n.content,{flag:`wx`})}for(let t of a){i.throwIfAborted();let r=(0,g.join)(e,t.path),a=t.stagedPath;try{await(0,h.link)(a,r)}catch(e){throw n.r(e,`EEXIST`)?new n.t({code:`APP_PATH_UNAVAILABLE`,exitCode:n.n.CONFLICT,message:`${t.path} already exists.`,hint:`Choose a different name, or edit the existing definition.`}):e}o.push({path:t.path,stagedPath:a})}}catch(t){let r=[];for(let t of o.reverse())try{let n=(0,g.join)(e,t.path),r=await(0,h.lstat)(t.stagedPath),i=await(0,h.lstat)(n);if(r.ino!==i.ino||r.dev!==i.dev)continue;await(0,h.unlink)(n)}catch(e){n.r(e,`ENOENT`)||r.push(t.path)}throw r.length>0?new n.t({code:`APP_PATH_UNAVAILABLE`,message:`Could not create all definitions or remove all files created by this command.`,hint:`Review these files before retrying: ${r.join(`, `)}.`,details:{createdPaths:r},cause:t}):t}finally{for(let{temporaryDirectory:e}of a)await(0,h.rm)(e,{recursive:!0,force:!0}).catch(()=>{s.push(e)})}return s},k=async t=>{let{options:r,signal:i,output:a}=t,s=await p.t({explicitPath:o.r(r,`path`),workingDirectory:process.cwd()}),c=await f.t({appPath:s.path,signal:i,warn:a.warn});if(!e.Vt(c.application))throw new n.t({code:`IDENTITY_READ_FAILED`,message:`No application definition found in this app.`,hint:`Start with twenty app init, or add a defineApplication definition.`});for(let e of c.diagnostics)a.progress({message:d.s(e)});let{entity:l,name:m,files:h}=await D({context:t,applicationUniversalIdentifier:c.application.universalIdentifier}),g=await O({appPath:s.path,files:h,signal:i});for(let e of g)a.warn({code:`APP_ADD_CLEANUP_FAILED`,message:`Created definitions, but could not remove temporary directory ${e}.`});return{data:{app:s,entity:l,name:m,createdPaths:h.map(e=>e.path),diagnostics:c.diagnostics},human:[...h.map(e=>u.o(`Created ${e.path}`)),...l===`object`&&h.length===1?[`Add views, navigation and record-page layouts separately to expose the object in the UI.`]:[],``,`Review with ${u.r(`twenty app plan`)}, then run ${u.r(`twenty app apply`)}.`].join(`
162
+ `,E=e=>new n.t({code:`USAGE`,exitCode:n.n.USAGE,message:e,hint:`Run twenty app add --help for options and examples.`}),D=async({context:n,applicationUniversalIdentifier:r})=>{let{options:i,signal:u}=n,d=l.t(n),f=async({option:t,label:n,value:r=o.r(i,t),defaultValue:s,choices:l})=>{if(u.throwIfAborted(),!e.Ut(r)&&d?(r=await c.n({question:`${n}${l?` (${l.join(`, `)})`:``}${e.Ut(s)?` [${s}]`:``}: `,signal:u}),r=r.trim()||s):r=r?.trim()??s,!e.Ut(r)||r.length===0&&s!==``)throw E(`Missing ${n.toLowerCase()}. Provide ${t===`entity`?`an entity argument`:`--${a.t(t)}`}.`);if(l&&!l.includes(r))throw E(`Invalid ${n.toLowerCase()}: ${r}. Expected ${l.join(`, `)}.`);return r},p=async(e,n)=>{let r=await f({option:e,label:n});if(!t.a(r))throw E(`${n} must be a UUID (version 4 or later).`);return r},h=await f({option:`entity`,label:`Entity`,value:o.n(n.arguments,0),choices:_}),g=[`namePlural`,`labelPlural`,`createView`,`createNavigationMenuItem`,`createPageLayout`],v=[`type`,`object`,`description`],y=[`targetObject`,`targetField`,`relationType`,`onDelete`],b=t=>{let n=t.filter(t=>e.Ut(i[t]));if(n.length>0)throw E(`Options do not apply to this definition: ${n.map(e=>`--${a.t(e)}`).join(`, `)}.`)};h!==`object`&&b(g),h!==`field`&&b([...v,...y]),h!==`object`&&h!==`field`&&b([`label`]);let D=await f({option:`name`,label:`Name`}),O=a.t(D);if(!/[a-z0-9]/.test(O))throw E(`Name must contain at least one ASCII letter or digit.`);let k,A=[];switch(h){case`object`:{let e=await f({option:`namePlural`,label:`Plural name`});if(e===D)throw E(`Singular and plural object names must differ.`);let t=await f({option:`label`,label:`Singular label`,defaultValue:s.t(D)}),n=await f({option:`labelPlural`,label:`Plural label`,defaultValue:s.t(e)}),a={createView:o.t(i,`createView`),createNavigationMenuItem:o.t(i,`createNavigationMenuItem`),createPageLayout:o.t(i,`createPageLayout`)};if(d&&!Object.values(a).some(e=>e)){let e=await c.t({question:`Also create a view, navigation menu item, and record page layout for this object?`,signal:u});a.createView=e,a.createNavigationMenuItem=e,a.createPageLayout=e}let l=(0,m.randomUUID)(),p=(0,m.randomUUID)();k=T({name:D,universalIdentifier:l,nameFieldUniversalIdentifier:p,data:{nameSingular:D,namePlural:e,labelSingular:t,labelPlural:n}}),A=x({name:O,labelSingular:t,objectUniversalIdentifier:l,nameFieldUniversalIdentifier:p,applicationUniversalIdentifier:r,...a});break}case`field`:{let t=await f({option:`label`,label:`Label`,defaultValue:s.t(D)}),n=await f({option:`type`,label:`Field type`,defaultValue:e.ct.TEXT,choices:Object.values(e.ct)}),r=Object.values(e.ct).find(e=>e===n);if(!e.Ut(r))throw E(`Invalid field type: ${n}.`);let i={name:D,label:t,type:r,objectUniversalIdentifier:await p(`object`,`Parent object universal identifier`),description:await f({option:`description`,label:`Description`,defaultValue:``})};if(r===e.ct.RELATION||r===e.ct.MORPH_RELATION){i.relationTargetObjectMetadataUniversalIdentifier=await p(`targetObject`,`Target object universal identifier`),i.relationTargetFieldMetadataUniversalIdentifier=await p(`targetField`,`Target field universal identifier`);let t=await f({option:`relationType`,label:`Relation type`,defaultValue:e.nt.ONE_TO_MANY,choices:Object.values(e.nt)}),n=await f({option:`onDelete`,label:`On delete`,defaultValue:e.W.CASCADE,choices:[...Object.values(e.W),`None`]});i.relationType=Object.values(e.nt).find(e=>e===t),i.onDelete=n===`None`?`None`:Object.values(e.W).find(e=>e===n)}else b(y);k=S({name:D,data:i});break}case`logic-function`:k=w({name:D});break;case`front-component`:k=C({name:D});break;default:throw E(`Unsupported entity: ${h}.`)}return{entity:h,name:D,files:[{path:`src/${h}s/${O}.${h===`front-component`?`tsx`:`ts`}`,content:k},...A]}},O=async({appPath:e,files:t,signal:i})=>{i.throwIfAborted();for(let i of t)try{throw await r.t({appPath:e,relativePaths:[i.path]}),await(0,h.lstat)((0,g.join)(e,i.path)),new n.t({code:`APP_PATH_UNAVAILABLE`,exitCode:n.n.CONFLICT,message:`${i.path} already exists. No files were changed.`,hint:`Choose a different name, or edit the existing definition.`})}catch(e){if(e instanceof r.n)throw new n.t({code:`APP_PATH_UNAVAILABLE`,exitCode:n.n.CONFLICT,message:`Cannot create ${i.path}: the destination must stay inside the app and cannot contain symbolic links.`});if(!n.r(e,`ENOENT`))throw e}let a=[],o=[],s=[];try{for(let n of t){i.throwIfAborted();let t=(0,g.dirname)((0,g.join)(e,n.path));await(0,h.mkdir)(t,{recursive:!0}),i.throwIfAborted();let r=await(0,h.mkdtemp)((0,g.join)(t,`.twenty-add-`)),o=(0,g.join)(r,`definition`);a.push({path:n.path,stagedPath:o,temporaryDirectory:r}),await(0,h.writeFile)(o,n.content,{flag:`wx`})}for(let t of a){i.throwIfAborted();let r=(0,g.join)(e,t.path),a=t.stagedPath;try{await(0,h.link)(a,r)}catch(e){throw n.r(e,`EEXIST`)?new n.t({code:`APP_PATH_UNAVAILABLE`,exitCode:n.n.CONFLICT,message:`${t.path} already exists.`,hint:`Choose a different name, or edit the existing definition.`}):e}o.push({path:t.path,stagedPath:a})}}catch(t){let r=[];for(let t of o.reverse())try{let n=(0,g.join)(e,t.path),r=await(0,h.lstat)(t.stagedPath),i=await(0,h.lstat)(n);if(r.ino!==i.ino||r.dev!==i.dev)continue;await(0,h.unlink)(n)}catch(e){n.r(e,`ENOENT`)||r.push(t.path)}throw r.length>0?new n.t({code:`APP_PATH_UNAVAILABLE`,message:`Could not create all definitions or remove all files created by this command.`,hint:`Review these files before retrying: ${r.join(`, `)}.`,details:{createdPaths:r},cause:t}):t}finally{for(let{temporaryDirectory:e}of a)await(0,h.rm)(e,{recursive:!0,force:!0}).catch(()=>{s.push(e)})}return s},k=async t=>{let{options:r,signal:i,output:a}=t,s=await p.t({explicitPath:o.r(r,`path`),workingDirectory:process.cwd()}),c=await f.t({appPath:s.path,signal:i,warn:a.warn});if(!e.Ut(c.application))throw new n.t({code:`IDENTITY_READ_FAILED`,message:`No application definition found in this app.`,hint:`Start with twenty app init, or add a defineApplication definition.`});for(let e of c.diagnostics)a.progress({message:d.s(e)});let{entity:l,name:m,files:h}=await D({context:t,applicationUniversalIdentifier:c.application.universalIdentifier}),g=await O({appPath:s.path,files:h,signal:i});for(let e of g)a.warn({code:`APP_ADD_CLEANUP_FAILED`,message:`Created definitions, but could not remove temporary directory ${e}.`});return{data:{app:s,entity:l,name:m,createdPaths:h.map(e=>e.path),diagnostics:c.diagnostics},human:[...h.map(e=>u.o(`Created ${e.path}`)),...l===`object`&&h.length===1?[`Add views, navigation and record-page layouts separately to expose the object in the UI.`]:[],``,`Review with ${u.r(`twenty app plan`)}, then run ${u.r(`twenty app apply`)}.`].join(`
163
163
  `)}};exports.runAppAddCommand=k;
@@ -1,2 +1,2 @@
1
- const e=require("./build-CX6FBrbu.cjs"),t=require("./utils-D6KY4-gU-rSlFwrTC.cjs"),n=require("./constants-BAi8jZf9-C7iTUxcn.cjs"),r=require("./cli-error-CSsayo0u.cjs"),i=require("./read-command-values-uSJqBG_E.cjs"),a=require("./style-BR52fK4V.cjs"),o=require("./resolve-app-project-Dc5KpCDh.cjs"),s=require("./record-pull-base-CH-q0A8T.cjs"),c=require("./get-app-plan-summary-DOhqg3eL.cjs"),l=require("./format-data-value-Dcn0aNoJ.cjs"),u=require("./format-app-duration-gu2oRLB4.cjs"),d=require("./get-client-generation-skip-reason-D3_AAZQP.cjs"),f=require("./run-app-operation-Dt8_tKmi.cjs");var p=e.t(),m=({count:e,label:t,color:n})=>{let r=`${e} ${t}`;return e===0?a.i(r):a.n(n,r)},h=({applicationName:e,apiUrl:r,summary:i,upload:o,isRegistrationCreated:s,clientGeneration:c,durationMilliseconds:d})=>{let f=n.Vt(i)?[m({count:i.create,label:`added`,color:`green`}),m({count:i.update,label:`changed`,color:`yellow`}),m({count:i.delete,label:`deleted`,color:`red`})].join(a.i(` · `)):a.i(`changes not reported`),h=o.fileCount===1?`file`:`files`;return[a.o(`Applied ${l.r(e)} to ${r} ${a.i(`in ${u.t(d)}`)}`),` ${f}${a.i(` · ${o.fileCount} ${h} uploaded (${t.n(o.byteCount)})`)}`,s?a.i(` Registered the app and installed it in this workspace.`):``,c===`generated`?a.i(` Regenerated the typed API client.`):``].filter(p.isNonEmptyString).join(`
2
- `)},g=async e=>{let t=performance.now(),a=e.options.delete!==!1,l,u=await s.n((await o.t({explicitPath:i.r(e.options,`path`),workingDirectory:process.cwd()})).path).catch(()=>void 0),{project:p,sdk:m,data:g,diagnostics:_}=await f.t({context:e,useHeldBuild:async t=>{l=await s.i({build:t.data,appPath:t.project.path,context:e,inferDeletionFromMissingEntities:a,isCreationApproved:i.t(e.options,`create`),isDeletionApproved:i.t(e.options,`yes`)})}});if(!n.Vt(l))throw new r.t({code:`TOOLING_UNSUPPORTED`,message:`The app worker did not keep its build snapshot for upload, so nothing was applied.`});let v=n.Vt(l.appliedActions)?c.t(l.appliedActions):void 0;n.Vt(v)||e.output.warn({code:`SYNC_REPORT_UNAVAILABLE`,message:`The sync succeeded, but the server did not return a readable list of its changes.`});let y;try{y=await s.t({appPath:p.path,universalIdentifier:l.acknowledgedUniversalIdentifier,sourceFingerprints:u,context:e}),y===`recorded`&&l.completedPhases.push(`pullBase`)}catch(t){throw s.r({error:t,phase:`pullBase`,applicationName:g.application.displayName,apiUrl:e.target.apiUrl,completedPhases:l.completedPhases,signal:e.signal})}let b=await d.t({appPath:p.path}),x=`skipped`;if(n.Vt(b))e.output.warn({code:`CLIENT_NOT_GENERATED`,message:`The app's typed API client was not regenerated: ${b}`});else try{_.push(...await d.r({appPath:p.path,applicationUniversalIdentifier:l.acknowledgedUniversalIdentifier,sdk:m,context:e})),x=`generated`,l.completedPhases.push(`clientGeneration`)}catch(t){throw s.r({error:t,phase:`clientGeneration`,applicationName:g.application.displayName,apiUrl:e.target.apiUrl,completedPhases:l.completedPhases,signal:e.signal})}let S=Math.round(performance.now()-t);return{data:{app:{path:p.path,name:p.name},sdk:{version:m.version},application:g.application,contentHash:g.contentHash,inferDeletionFromMissingEntities:a,registrationCreated:l.isRegistrationCreated,completedPhases:l.completedPhases,actions:l.appliedActions??null,summary:v??null,upload:{fileCount:l.upload.fileCount,byteCount:l.upload.byteCount},clientGeneration:x,pullBase:y,diagnostics:_,durationMilliseconds:S},human:h({applicationName:g.application.displayName,apiUrl:e.target.apiUrl,summary:v,upload:l.upload,isRegistrationCreated:l.isRegistrationCreated,clientGeneration:x,durationMilliseconds:S})}};exports.runAppApplyCommand=g;
1
+ const e=require("./build-CX6FBrbu.cjs"),t=require("./utils-CvvLHbc4-CKDJ1YgX.cjs"),n=require("./constants-D-caeNc5-9rDzSg5B.cjs"),r=require("./cli-error-CSsayo0u.cjs"),i=require("./read-command-values-uSJqBG_E.cjs"),a=require("./style-BR52fK4V.cjs"),o=require("./resolve-app-project-B0KRR-xp.cjs"),s=require("./record-pull-base-DwoMDnXm.cjs"),c=require("./get-app-plan-summary-C-CQdNrh.cjs"),l=require("./format-data-value-kug8Yjt2.cjs"),u=require("./format-app-duration-gu2oRLB4.cjs"),d=require("./get-client-generation-skip-reason-BVkBgZWQ.cjs"),f=require("./run-app-operation-BLlHL5Nk.cjs");var p=e.t(),m=({count:e,label:t,color:n})=>{let r=`${e} ${t}`;return e===0?a.i(r):a.n(n,r)},h=({applicationName:e,apiUrl:r,summary:i,upload:o,isRegistrationCreated:s,clientGeneration:c,durationMilliseconds:d})=>{let f=n.Ut(i)?[m({count:i.create,label:`added`,color:`green`}),m({count:i.update,label:`changed`,color:`yellow`}),m({count:i.delete,label:`deleted`,color:`red`})].join(a.i(` · `)):a.i(`changes not reported`),h=o.fileCount===1?`file`:`files`;return[a.o(`Applied ${l.r(e)} to ${r} ${a.i(`in ${u.t(d)}`)}`),` ${f}${a.i(` · ${o.fileCount} ${h} uploaded (${t.i(o.byteCount)})`)}`,s?a.i(` Registered the app and installed it in this workspace.`):``,c===`generated`?a.i(` Regenerated the typed API client.`):``].filter(p.isNonEmptyString).join(`
2
+ `)},g=async e=>{let t=performance.now(),a=e.options.delete!==!1,l,u=await s.n((await o.t({explicitPath:i.r(e.options,`path`),workingDirectory:process.cwd()})).path).catch(()=>void 0),{project:p,sdk:m,data:g,diagnostics:_}=await f.t({context:e,useHeldBuild:async t=>{l=await s.i({build:t.data,appPath:t.project.path,context:e,inferDeletionFromMissingEntities:a,isCreationApproved:i.t(e.options,`create`),isDeletionApproved:i.t(e.options,`yes`)})}});if(!n.Ut(l))throw new r.t({code:`TOOLING_UNSUPPORTED`,message:`The app worker did not keep its build snapshot for upload, so nothing was applied.`});let v=n.Ut(l.appliedActions)?c.t(l.appliedActions):void 0;n.Ut(v)||e.output.warn({code:`SYNC_REPORT_UNAVAILABLE`,message:`The sync succeeded, but the server did not return a readable list of its changes.`});let y;try{y=await s.t({appPath:p.path,universalIdentifier:l.acknowledgedUniversalIdentifier,sourceFingerprints:u,context:e}),y===`recorded`&&l.completedPhases.push(`pullBase`)}catch(t){throw s.r({error:t,phase:`pullBase`,applicationName:g.application.displayName,apiUrl:e.target.apiUrl,completedPhases:l.completedPhases,signal:e.signal})}let b=await d.t({appPath:p.path}),x=`skipped`;if(n.Ut(b))e.output.warn({code:`CLIENT_NOT_GENERATED`,message:`The app's typed API client was not regenerated: ${b}`});else try{_.push(...await d.r({appPath:p.path,applicationUniversalIdentifier:l.acknowledgedUniversalIdentifier,sdk:m,context:e})),x=`generated`,l.completedPhases.push(`clientGeneration`)}catch(t){throw s.r({error:t,phase:`clientGeneration`,applicationName:g.application.displayName,apiUrl:e.target.apiUrl,completedPhases:l.completedPhases,signal:e.signal})}let S=Math.round(performance.now()-t);return{data:{app:{path:p.path,name:p.name},sdk:{version:m.version},application:g.application,contentHash:g.contentHash,inferDeletionFromMissingEntities:a,registrationCreated:l.isRegistrationCreated,completedPhases:l.completedPhases,actions:l.appliedActions??null,summary:v??null,upload:{fileCount:l.upload.fileCount,byteCount:l.upload.byteCount},clientGeneration:x,pullBase:y,diagnostics:_,durationMilliseconds:S},human:h({applicationName:g.application.displayName,apiUrl:e.target.apiUrl,summary:v,upload:l.upload,isRegistrationCreated:l.isRegistrationCreated,clientGeneration:x,durationMilliseconds:S})}};exports.runAppApplyCommand=g;
@@ -1,2 +1,2 @@
1
- const e=require("./utils-D6KY4-gU-rSlFwrTC.cjs"),t=require("./style-BR52fK4V.cjs"),n=require("./format-app-duration-gu2oRLB4.cjs"),r=require("./cli-version.constant-jQjsWsAO.cjs"),i=require("./run-app-operation-Dt8_tKmi.cjs");var a={"built-logic-function":[`logic function`,`logic functions`],"built-front-component":[`front component`,`front components`],source:[`source file`,`source files`],dependencies:[`dependency file`,`dependency files`],"public-asset":[`asset`,`assets`]},o=Object.keys(a),s=e=>{let t=o.indexOf(e);return t===-1?o.length:t},c=e=>{let t=new Map;for(let n of e.files)t.set(n.role,(t.get(n.role)??0)+1);return[...t].sort(([e],[t])=>s(e)-s(t)).map(([e,t])=>`${t} ${(a[e]??[e,e])[t===1?0:1]}`).join(` · `)},l=({build:i,durationMilliseconds:a})=>{let o=i.files.reduce((e,t)=>e+t.size,0);return[t.o(`Built ${i.application.displayName} with twenty ${r.t} ${t.i(`in ${n.t(a)}`)}`),t.i(` ${i.files.length} files · ${e.n(o)} · content hash ${i.contentHash.slice(0,12)}`),t.i(` ${c(i)}`),t.i(` Nothing was uploaded.`)].join(`
1
+ const e=require("./utils-CvvLHbc4-CKDJ1YgX.cjs"),t=require("./style-BR52fK4V.cjs"),n=require("./format-app-duration-gu2oRLB4.cjs"),r=require("./cli-version.constant-B92ETb2e.cjs"),i=require("./run-app-operation-BLlHL5Nk.cjs");var a={"built-logic-function":[`logic function`,`logic functions`],"built-front-component":[`front component`,`front components`],source:[`source file`,`source files`],dependencies:[`dependency file`,`dependency files`],"public-asset":[`asset`,`assets`]},o=Object.keys(a),s=e=>{let t=o.indexOf(e);return t===-1?o.length:t},c=e=>{let t=new Map;for(let n of e.files)t.set(n.role,(t.get(n.role)??0)+1);return[...t].sort(([e],[t])=>s(e)-s(t)).map(([e,t])=>`${t} ${(a[e]??[e,e])[t===1?0:1]}`).join(` · `)},l=({build:i,durationMilliseconds:a})=>{let o=i.files.reduce((e,t)=>e+t.size,0);return[t.o(`Built ${i.application.displayName} with twenty ${r.t} ${t.i(`in ${n.t(a)}`)}`),t.i(` ${i.files.length} files · ${e.i(o)} · content hash ${i.contentHash.slice(0,12)}`),t.i(` ${c(i)}`),t.i(` Nothing was uploaded.`)].join(`
2
2
  `)},u=async e=>{let{project:t,sdk:n,data:r,diagnostics:a,durationMilliseconds:o}=await i.t({context:e});return{data:{app:{path:t.path,name:t.name},sdk:{version:n.version},application:r.application,contentHash:r.contentHash,files:r.files,manifestFormat:r.manifestFormat,manifest:r.manifest,diagnostics:a,durationMilliseconds:o},human:l({build:r,durationMilliseconds:o})}};exports.runAppBuildCommand=u;