@dittowords/cli 5.3.0 → 5.3.1

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 (2) hide show
  1. package/bin/ditto.js +27 -27
  2. package/package.json +4 -2
package/bin/ditto.js CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="398d2b1f-57cc-53c0-ae27-83db0f9233e7")}catch(e){}}();
4
- var Dn=Object.create;var he=Object.defineProperty;var kn=Object.getOwnPropertyDescriptor;var Mn=Object.getOwnPropertyNames;var An=Object.getPrototypeOf,Rn=Object.prototype.hasOwnProperty;var Sr=e=>{throw TypeError(e)};var n=(e,t)=>he(e,"name",{value:t,configurable:!0});var Nn=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Mn(t))!Rn.call(e,s)&&s!==r&&he(e,s,{get:()=>t[s],enumerable:!(o=kn(t,s))||o.enumerable});return e};var l=(e,t,r)=>(r=e!=null?Dn(An(e)):{},Nn(t||!e||!e.__esModule?he(r,"default",{value:e,enumerable:!0}):r,e));var wr=(e,t,r)=>t.has(e)||Sr("Cannot "+r);var R=(e,t,r)=>(wr(e,t,"read from private field"),r?r.call(e):t.get(e)),z=(e,t,r)=>t.has(e)?Sr("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),N=(e,t,r,o)=>(wr(e,t,"write to private field"),o?o.call(e,r):t.set(e,r),r);var Tn=l(require("@sentry/node"));var ut="5.3.0";var Q=require("commander");var Zr=l(require("boxen")),ne=l(require("chalk"));var Jr=l(require("ora"));var kr=l(require("axios"));var G=l(require("fs")),Pr=l(require("path")),Or=l(require("url")),dt=l(require("js-yaml")),br=l(require("@sentry/node"));var vr=require("os"),ft=l(require("path")),f=new class{get API_HOST(){return process.env.DITTO_API_HOST||"https://api.dittowords.com"}get CONFIG_FILE(){return process.env.DITTO_CONFIG_FILE||ft.default.join((0,vr.homedir)(),".config","ditto")}get PROJECT_CONFIG_FILE(){return ft.default.normalize(ft.default.join("ditto","config.yml"))}get TEXT_DIR(){return process.env.DITTO_TEXT_DIR||"ditto"}get TEXT_FILE(){return ft.default.normalize(ft.default.join(this.TEXT_DIR,"text.json"))}};function Fr(e){if(typeof e!="object")return{};let t={};for(let r in e){let o=r,s=e[o];t[o]=typeof s=="object"||Array.isArray(s)?JSON.stringify(s):s}return t}n(Fr,"createSentryContext");var $n={sources:{components:!0},variants:!0,format:"flat"},Er=dt.default.dump($n);function bt(e,t){let r=Pr.default.dirname(e);G.default.existsSync(r)||G.default.mkdirSync(r),G.default.existsSync(e)||G.default.writeFileSync(e,t||"","utf-8")}n(bt,"createFileIfMissing");function Ln(e){return typeof e=="object"}n(Ln,"jsonIsConfigYAML");function Jn(e){return!!e&&typeof e=="object"&&Object.values(e).every(t=>t.every&&t.every(r=>typeof r=="object"&&Object.keys(r).includes("token")))}n(Jn,"jsonIsGlobalYAML");function ye(e=f.PROJECT_CONFIG_FILE,t={}){bt(e,Er);let r=G.default.readFileSync(e,"utf8"),o=dt.default.load(r);return Ln(o)?o:t}n(ye,"readProjectConfigData");function Et(e=f.CONFIG_FILE,t={}){bt(e);let r=G.default.readFileSync(e,"utf8"),o=dt.default.load(r);return Jn(o)?o:t}n(Et,"readGlobalConfigData");function Vn(e,t){bt(e,Er);let r=ye(e),o={...r,...t,sources:{...r.sources,...t.sources}},s=dt.default.dump(o);G.default.writeFileSync(e,s,"utf8")}n(Vn,"writeProjectConfigData");function xe(e,t){bt(e);let r=Et(e),o=dt.default.dump({...r,...t});G.default.writeFileSync(e,o,"utf8")}n(xe,"writeGlobalConfigData");function ee(e){return e.includes("://")?Or.default.parse(e).hostname||"":e}n(ee,"justTheHost");function Zn(e,t){let r=Et(e),o=ee(t);r[o]=[],r[o][0]={token:""},xe(e,r)}n(Zn,"deleteToken");function Bn(e,t,r){let o=Et(e),s=ee(t);o[s]=[],o[s][0]={token:r},xe(e,o)}n(Bn,"saveToken");function Dr(){return process.env.DITTO_API_KEY}n(Dr,"getTokenFromEnv");function Yn(e,t){let r=Dr();if(r)return r;let s=Et(e)[ee(t)];if(!s)return;let{length:i}=s;return s[i-1].token}n(Yn,"getToken");var jr=/-(\d+$)/;function qn(e,t){let r=t;if(e.has(r))for(;e.has(r);){let[o,s]=r.match(jr)||[];s&&!isNaN(parseInt(s))?r=`${r.replace(jr,"")}-${parseInt(s)+1}`:r=`${r}-1`}return r}n(qn,"dedupeProjectName");function zn(e){let{sources:t,variants:r,format:o,status:s,richText:i,iosLocales:a,projects:c,components:m,disableJsDriver:h}=ye(e),u=t?.projects||[],y=new Set,I=[],T=!1;(u||[]).forEach(A=>{if(A.id&&A.name){if(A.id==="ditto_component_library"){T=!0;return}A.fileName=qn(y,A.name),y.add(A.fileName),I.push(A)}});let F=!!t?.components,J=typeof t?.components=="object"?t.components.root:void 0,k=typeof t?.components=="object"?t.components.folders:void 0,w={hasSourceData:!!I.length||F,validProjects:I,shouldFetchComponentLibrary:F,variants:r||!1,format:o,status:s,richText:i,hasTopLevelProjectsField:!!c,hasTopLevelComponentsField:!!m,hasComponentLibraryInProjects:T,componentRoot:J,componentFolders:k,localeByVariantApiId:a?a.reduce((A,mt)=>({...A,...mt}),{}):void 0,disableJsDriver:h};return br.setContext("config",Fr(w)),w}n(zn,"parseSourceInformation");var S={createFileIfMissing:bt,readProjectConfigData:ye,readGlobalConfigData:Et,writeGlobalConfigData:xe,writeProjectConfigData:Vn,justTheHost:ee,saveToken:Bn,deleteToken:Zn,getToken:Yn,getTokenFromEnv:Dr,parseSourceInformation:zn};function O(e){return kr.default.create({baseURL:f.API_HOST,headers:{Authorization:`token ${e||S.getToken(f.CONFIG_FILE,f.API_HOST)}`,"x-ditto-cli":!0}})}n(O,"createApiClient");var W=l(require("chalk"));var Gn=n(e=>W.default.magenta(e),"errorText"),Un=n(e=>W.default.yellow(e),"warnText"),Wn=n(e=>W.default.blueBright(e),"info"),Hn=n(e=>W.default.green(e),"success"),Qn=n(e=>W.default.blueBright.underline(e),"url"),Xn=n(e=>W.default.grey(e),"subtle"),Kn=n(e=>W.default.white(e),"write"),ts=n(()=>console.log(`
5
- `),"nl"),p={errorText:Gn,warnText:Un,info:Wn,success:Hn,url:Qn,subtle:Xn,write:Kn,nl:ts};var Ar=l(require("fs")),Rr=l(require("@sentry/node")),Nr=l(require("chalk")),_r=require("enquirer");var Mr=l(require("@sentry/node"));async function b(e,t=2){e&&console.log(`
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a5767fcf-c338-50c5-8415-301025367dcf")}catch(e){}}();
4
+ var Dn=Object.create;var he=Object.defineProperty;var kn=Object.getOwnPropertyDescriptor;var An=Object.getOwnPropertyNames;var Mn=Object.getPrototypeOf,Rn=Object.prototype.hasOwnProperty;var Sr=e=>{throw TypeError(e)};var n=(e,t)=>he(e,"name",{value:t,configurable:!0});var Nn=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of An(t))!Rn.call(e,s)&&s!==r&&he(e,s,{get:()=>t[s],enumerable:!(o=kn(t,s))||o.enumerable});return e};var l=(e,t,r)=>(r=e!=null?Dn(Mn(e)):{},Nn(t||!e||!e.__esModule?he(r,"default",{value:e,enumerable:!0}):r,e));var wr=(e,t,r)=>t.has(e)||Sr("Cannot "+r);var R=(e,t,r)=>(wr(e,t,"read from private field"),r?r.call(e):t.get(e)),q=(e,t,r)=>t.has(e)?Sr("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),N=(e,t,r,o)=>(wr(e,t,"write to private field"),o?o.call(e,r):t.set(e,r),r);var Tn=l(require("@sentry/node"));var ut="5.3.1";var Q=require("commander");var Zr=l(require("boxen")),ne=l(require("chalk"));var Jr=l(require("ora"));var kr=l(require("axios"));var G=l(require("fs")),Pr=l(require("path")),Or=l(require("url")),dt=l(require("js-yaml")),br=l(require("@sentry/node"));var vr=require("os"),ft=l(require("path")),f=new class{get API_HOST(){return process.env.DITTO_API_HOST||"https://api.dittowords.com"}get CONFIG_FILE(){return process.env.DITTO_CONFIG_FILE||ft.default.join((0,vr.homedir)(),".config","ditto")}get PROJECT_CONFIG_FILE(){return ft.default.normalize(ft.default.join("ditto","config.yml"))}get TEXT_DIR(){return process.env.DITTO_TEXT_DIR||"ditto"}get TEXT_FILE(){return ft.default.normalize(ft.default.join(this.TEXT_DIR,"text.json"))}};function Fr(e){if(typeof e!="object")return{};let t={};for(let r in e){let o=r,s=e[o];t[o]=typeof s=="object"||Array.isArray(s)?JSON.stringify(s):s}return t}n(Fr,"createSentryContext");var $n={sources:{components:!0},variants:!0,format:"flat"},Er=dt.default.dump($n);function bt(e,t){let r=Pr.default.dirname(e);G.default.existsSync(r)||G.default.mkdirSync(r),G.default.existsSync(e)||G.default.writeFileSync(e,t||"","utf-8")}n(bt,"createFileIfMissing");function Ln(e){return typeof e=="object"}n(Ln,"jsonIsConfigYAML");function Jn(e){return!!e&&typeof e=="object"&&Object.values(e).every(t=>t.every&&t.every(r=>typeof r=="object"&&Object.keys(r).includes("token")))}n(Jn,"jsonIsGlobalYAML");function ye(e=f.PROJECT_CONFIG_FILE,t={}){bt(e,Er);let r=G.default.readFileSync(e,"utf8"),o=dt.default.load(r);return Ln(o)?o:t}n(ye,"readProjectConfigData");function Et(e=f.CONFIG_FILE,t={}){bt(e);let r=G.default.readFileSync(e,"utf8"),o=dt.default.load(r);return Jn(o)?o:t}n(Et,"readGlobalConfigData");function Vn(e,t){bt(e,Er);let r=ye(e),o={...r,...t,sources:{...r.sources,...t.sources}},s=dt.default.dump(o);G.default.writeFileSync(e,s,"utf8")}n(Vn,"writeProjectConfigData");function xe(e,t){bt(e);let r=Et(e),o=dt.default.dump({...r,...t});G.default.writeFileSync(e,o,"utf8")}n(xe,"writeGlobalConfigData");function ee(e){return e.includes("://")?Or.default.parse(e).hostname||"":e}n(ee,"justTheHost");function Zn(e,t){let r=Et(e),o=ee(t);r[o]=[],r[o][0]={token:""},xe(e,r)}n(Zn,"deleteToken");function Bn(e,t,r){let o=Et(e),s=ee(t);o[s]=[],o[s][0]={token:r},xe(e,o)}n(Bn,"saveToken");function Dr(){return process.env.DITTO_API_KEY}n(Dr,"getTokenFromEnv");function zn(e,t){let r=Dr();if(r)return r;let s=Et(e)[ee(t)];if(!s)return;let{length:i}=s;return s[i-1].token}n(zn,"getToken");var jr=/-(\d+$)/;function Yn(e,t){let r=t;if(e.has(r))for(;e.has(r);){let[o,s]=r.match(jr)||[];s&&!isNaN(parseInt(s))?r=`${r.replace(jr,"")}-${parseInt(s)+1}`:r=`${r}-1`}return r}n(Yn,"dedupeProjectName");function qn(e){let{sources:t,variants:r,format:o,status:s,richText:i,iosLocales:a,projects:c,components:m,disableJsDriver:h}=ye(e),u=t?.projects||[],y=new Set,I=[],T=!1;(u||[]).forEach(M=>{if(M.id&&M.name){if(M.id==="ditto_component_library"){T=!0;return}M.fileName=Yn(y,M.name),y.add(M.fileName),I.push(M)}});let F=!!t?.components,J=typeof t?.components=="object"?t.components.root:void 0,k=typeof t?.components=="object"?t.components.folders:void 0,w={hasSourceData:!!I.length||F,validProjects:I,shouldFetchComponentLibrary:F,variants:r||!1,format:o,status:s,richText:i,hasTopLevelProjectsField:!!c,hasTopLevelComponentsField:!!m,hasComponentLibraryInProjects:T,componentRoot:J,componentFolders:k,localeByVariantApiId:a?a.reduce((M,mt)=>({...M,...mt}),{}):void 0,disableJsDriver:h};return br.setContext("config",Fr(w)),w}n(qn,"parseSourceInformation");var S={createFileIfMissing:bt,readProjectConfigData:ye,readGlobalConfigData:Et,writeGlobalConfigData:xe,writeProjectConfigData:Vn,justTheHost:ee,saveToken:Bn,deleteToken:Zn,getToken:zn,getTokenFromEnv:Dr,parseSourceInformation:qn};function O(e){return kr.default.create({baseURL:f.API_HOST,headers:{Authorization:`token ${e||S.getToken(f.CONFIG_FILE,f.API_HOST)}`,"x-ditto-cli":!0}})}n(O,"createApiClient");var W=l(require("chalk"));var Gn=n(e=>W.default.magenta(e),"errorText"),Un=n(e=>W.default.yellow(e),"warnText"),Wn=n(e=>W.default.blueBright(e),"info"),Hn=n(e=>W.default.green(e),"success"),Qn=n(e=>W.default.blueBright.underline(e),"url"),Xn=n(e=>W.default.grey(e),"subtle"),Kn=n(e=>W.default.white(e),"write"),ts=n(()=>console.log(`
5
+ `),"nl"),p={errorText:Gn,warnText:Un,info:Wn,success:Hn,url:Qn,subtle:Xn,write:Kn,nl:ts};var Mr=l(require("fs")),Rr=l(require("@sentry/node")),Nr=l(require("chalk")),_r=require("enquirer");var Ar=l(require("@sentry/node"));async function b(e,t=2){e&&console.log(`
6
6
  ${e}
7
- `),await Mr.flush(),process.exit(t)}n(b,"quit");var $r=require("axios");var Te=n((e,t=f.API_HOST)=>{if(S.getTokenFromEnv())return!1;let r=e||f.CONFIG_FILE;if(!Ar.default.existsSync(r))return!0;let o=S.readGlobalConfigData(r);return!o[S.justTheHost(t)]||o[S.justTheHost(t)][0].token===""},"needsToken");async function es(e){let t=O(e),r="/token-check",o;try{o=await t.get(r)}catch(s){if(!(s instanceof $r.AxiosError))return{success:!1,output:[p.warnText("Sorry! We're having trouble reaching the Ditto API.")]};if(s.code==="ENOTFOUND")return{success:!1,output:[p.errorText(`Can't connect to API: ${p.url(f.API_HOST)}`)]};if(s.response?.status===401||s.response?.status===404)return{success:!1,output:[p.errorText("This API key isn't valid. Please try another.")]}}return typeof o=="string"?{success:!1,output:[o]}:o?.status===200?{success:!0}:{success:!1,output:[p.errorText("This API key isn't valid. Please try another.")]}}n(es,"verifyTokenUsingTokenCheck");async function rs(e){let t=await es(e);return t.success?!0:t.output.join(`
7
+ `),await Ar.flush(),process.exit(t)}n(b,"quit");var $r=require("axios");var Te=n((e,t=f.API_HOST)=>{if(S.getTokenFromEnv())return!1;let r=e||f.CONFIG_FILE;if(!Mr.default.existsSync(r))return!0;let o=S.readGlobalConfigData(r);return!o[S.justTheHost(t)]||o[S.justTheHost(t)][0].token===""},"needsToken");async function es(e){let t=O(e),r="/token-check",o;try{o=await t.get(r)}catch(s){if(!(s instanceof $r.AxiosError))return{success:!1,output:[p.warnText("Sorry! We're having trouble reaching the Ditto API.")]};if(s.code==="ENOTFOUND")return{success:!1,output:[p.errorText(`Can't connect to API: ${p.url(f.API_HOST)}`)]};if(s.response?.status===401||s.response?.status===404)return{success:!1,output:[p.errorText("This API key isn't valid. Please try another.")]}}return typeof o=="string"?{success:!1,output:[o]}:o?.status===200?{success:!0}:{success:!1,output:[p.errorText("This API key isn't valid. Please try another.")]}}n(es,"verifyTokenUsingTokenCheck");async function rs(e){let t=await es(e);return t.success?!0:t.output.join(`
8
8
  `)}n(rs,"checkToken");async function os(e){let t=p.info,r=p.url("https://app.dittowords.com/account/devtools"),o=`${Nr.default.bold(t("API Keys"))}`,s=e||`To get started, you'll need your Ditto API key. You can find this at: ${r} under "${o}".`;return console.log(s),(await(0,_r.prompt)({type:"input",name:"token",message:"What is your API key?",validate:n(a=>rs(a),"validate")})).token}n(os,"collectToken");var gt=n(async(e=null)=>{try{let t=await os(e);return console.log(`Thanks for authenticating. We'll save the key to: ${p.info(f.CONFIG_FILE)}
9
9
  `),S.saveToken(f.CONFIG_FILE,f.API_HOST,t),t}catch(t){if(t===""){await b("",0);return}let r=Rr.captureException(t),o=`
10
10
 
@@ -17,9 +17,9 @@ We saved your updated configuration to: ${p.info(f.PROJECT_CONFIG_FILE)}
17
17
  `),ps(f.PROJECT_CONFIG_FILE,r.name,r.id)}catch(t){console.log(t),t.response&&t.response.status===404?(await ms(),await kt({components:e})):await b(null,2)}},"collectAndSaveSource");var fs=n((e,t)=>{let r="";return t&&(r+=`the ${p.info("Ditto Component Library")}`,(e||[]).length?r+=" and ":r+=".."),(e||[]).length&&(r+=`the following projects: ${Dt(e)}
18
18
  `),r},"sourcesToText"),oe=fs;var Br=n(()=>Te()||Vr(),"needsTokenOrSource");function ds(){let e=ne.default.white(`${ne.default.bold("Welcome to the",ne.default.magentaBright("Ditto CLI"))}.
19
19
 
20
- We're glad to have you here.`);console.log((0,Zr.default)(e,{padding:1}))}n(ds,"welcome");var Yr=n(async()=>{ds(),Te()&&await gt();let{hasSourceData:e,validProjects:t,shouldFetchComponentLibrary:r,hasTopLevelComponentsField:o,hasTopLevelProjectsField:s}=S.parseSourceInformation();if(s)return await b(`${p.errorText(`Support for ${p.warnText("projects")} as a top-level field has been removed; please configure ${p.warnText("sources.projects")} instead.`)}
20
+ We're glad to have you here.`);console.log((0,Zr.default)(e,{padding:1}))}n(ds,"welcome");var zr=n(async()=>{ds(),Te()&&await gt();let{hasSourceData:e,validProjects:t,shouldFetchComponentLibrary:r,hasTopLevelComponentsField:o,hasTopLevelProjectsField:s}=S.parseSourceInformation();if(s)return await b(`${p.errorText(`Support for ${p.warnText("projects")} as a top-level field has been removed; please configure ${p.warnText("sources.projects")} instead.`)}
21
21
  See ${p.url("https://github.com/dittowords/cli")} for more information.`);if(o)return await b(`${p.errorText("Support for `components` as a top-level field has been removed; please configure `sources.components` instead.")}
22
- See ${p.url("https://github.com/dittowords/cli")} for more information.`);if(!e){console.log(`Looks like there are no Ditto sources selected for your current directory: ${p.info(process.cwd())}.`),await kt({initialize:!0,components:!0});return}let i="You're currently set up to sync text from "+oe(t,r);console.log(i)},"init");var ot=l(require("fs")),yt=l(require("path")),eo=l(require("ora")),ro=l(require("@sentry/node"));var Ie=l(require("fs")),Se=l(require("path"));function H(e){let t=e.split(/\s{1,}/g);return t=t.map(r=>r.replace(/[^a-zA-Z0-9-_.]/g,"").toLowerCase()),t=t.filter(r=>r!==""),t.join("-")}n(H,"cleanFileName");var se=l(require("fs")),ie=l(require("path"));function qr(e=process.cwd()){let t=gs(e);return hs(t)}n(qr,"determineModuleType");function gs(e){if(process.env.DITTO_MODULE_TYPE)return process.env.DITTO_MODULE_TYPE;for(;e;){let t=ie.join(e,"package.json");if(se.existsSync(t)){let r=se.readFileSync(t,"utf8");try{let o=JSON.parse(r);if(o?.type)return o.type}catch{}return null}if(e==="/")break;e=ie.dirname(e)}return null}n(gs,"getRawTypeFromPackageJson");function hs(e){let t=e?.toLowerCase()||"";return t==="commonjs"||t==="module"?t:"commonjs"}n(hs,"getTypeOrDefault");var zr=l(require("fs")),Gr=l(require("path"));function ys(e){switch(e){case"flat":return"IJSONFlat";case"nested":return"IJSONNested";case"structured":return"IJSONStructured";case"icu":return"IJSONICU";default:return"_JSON"}}n(ys,"getFormatString");function xs(e,t){return t==="commonjs"?`export = ${e};`:`export default ${e};`}n(xs,"getExportString");function Ts(e){return`
22
+ See ${p.url("https://github.com/dittowords/cli")} for more information.`);if(!e){console.log(`Looks like there are no Ditto sources selected for your current directory: ${p.info(process.cwd())}.`),await kt({initialize:!0,components:!0});return}let i="You're currently set up to sync text from "+oe(t,r);console.log(i)},"init");var ot=l(require("fs")),yt=l(require("path")),eo=l(require("ora")),ro=l(require("@sentry/node"));var Ie=l(require("fs")),Se=l(require("path"));function H(e){let t=e.split(/\s{1,}/g);return t=t.map(r=>r.replace(/[^a-zA-Z0-9-_.]/g,"").toLowerCase()),t=t.filter(r=>r!==""),t.join("-")}n(H,"cleanFileName");var se=l(require("fs")),ie=l(require("path"));function Yr(e=process.cwd()){let t=gs(e);return hs(t)}n(Yr,"determineModuleType");function gs(e){if(process.env.DITTO_MODULE_TYPE)return process.env.DITTO_MODULE_TYPE;for(;e;){let t=ie.join(e,"package.json");if(se.existsSync(t)){let r=se.readFileSync(t,"utf8");try{let o=JSON.parse(r);if(o?.type)return o.type}catch{}return null}if(e==="/")break;e=ie.dirname(e)}return null}n(gs,"getRawTypeFromPackageJson");function hs(e){let t=e?.toLowerCase()||"";return t==="commonjs"||t==="module"?t:"commonjs"}n(hs,"getTypeOrDefault");var qr=l(require("fs")),Gr=l(require("path"));function ys(e){switch(e){case"flat":return"IJSONFlat";case"nested":return"IJSONNested";case"structured":return"IJSONStructured";case"icu":return"IJSONICU";default:return"_JSON"}}n(ys,"getFormatString");function xs(e,t){return t==="commonjs"?`export = ${e};`:`export default ${e};`}n(xs,"getExportString");function Ts(e){return`
23
23
  interface IJSONFlat {
24
24
  [key: string]: string;
25
25
  }
@@ -48,32 +48,32 @@ interface IDriverFile {
48
48
  declare const driver: IDriverFile;
49
49
 
50
50
  ${xs("driver",e.moduleType)}
51
- `.trim()}n(Ts,"getTypesString");function Ur(e){let t=Ts(e);zr.default.writeFileSync(Gr.default.resolve(f.TEXT_DIR,"index.d.ts"),t+`
52
- `,"utf8")}n(Ur,"generateJsDriverTypeFile");var Cs=n(e=>e==="ditto_component_library"?e:`project_${e}`,"stringifySourceId");function Wr(e,t){let r=qr(),o=Is(e),s=Ss(),i=[],a={},c={};o.forEach(u=>{var I;let y;if(u.type==="components")y=s.generate(u.fileName.split(".")[0]);else{let T=u.fileName.split(".")[0];y=s.generate(T.split("__")[0])}if(i.push(vs(u.fileName,y,r)),u.type==="project"){let{variantApiId:T}=u,F=Cs(u.projectId);a[F]??(a[F]={}),a[F][T]=`{...${y}}`}else c[I=u.variantApiId]??(c[I]=[]),c[u.variantApiId].push(`...${y}`)}),Object.keys(c).forEach(u=>{a.ditto_component_library??(a.ditto_component_library={});let y="{";c[u].forEach((I,T)=>{y+=I,T<c[u].length-1&&(y+=", ")}),y+="}",a.ditto_component_library[u]=y});let m="";m+=i.join(`
51
+ `.trim()}n(Ts,"getTypesString");function Ur(e){let t=Ts(e);qr.default.writeFileSync(Gr.default.resolve(f.TEXT_DIR,"index.d.ts"),t+`
52
+ `,"utf8")}n(Ur,"generateJsDriverTypeFile");var Cs=n(e=>e==="ditto_component_library"?e:`project_${e}`,"stringifySourceId");function Wr(e,t){let r=Yr(),o=Is(e),s=Ss(),i=[],a={},c={};o.forEach(u=>{var I;let y;if(u.type==="components")y=s.generate(u.fileName.split(".")[0]);else{let T=u.fileName.split(".")[0];y=s.generate(T.split("__")[0])}if(i.push(vs(u.fileName,y,r)),u.type==="project"){let{variantApiId:T}=u,F=Cs(u.projectId);a[F]??(a[F]={}),a[F][T]=`{...${y}}`}else c[I=u.variantApiId]??(c[I]=[]),c[u.variantApiId].push(`...${y}`)}),Object.keys(c).forEach(u=>{a.ditto_component_library??(a.ditto_component_library={});let y="{";c[u].forEach((I,T)=>{y+=I,T<c[u].length-1&&(y+=", ")}),y+="}",a.ditto_component_library[u]=y});let m="";m+=i.join(`
53
53
  `)+`
54
54
 
55
- `,m+=`${ws(r)}`,m+=`${JSON.stringify(a,null,2)}`.replace(/"\{/g,"{").replace(/\}"/g,"}");let h=Se.default.resolve(f.TEXT_DIR,"index.js");return Ie.default.writeFileSync(h,m,{encoding:"utf8"}),Ur({format:t,moduleType:r}),`Generated .js SDK driver at ${p.info(h)}`}n(Wr,"generateJsDriver");function Is(e){let t=new Map;return e.forEach(o=>{!o.fileName||o.type==="components"||t.set(H(o.fileName),o.id)}),Ie.default.readdirSync(f.TEXT_DIR).filter(o=>Se.default.extname(o)===".json").map(o=>{let s=o.split("__");if(s.length===3){let[,i,a]=s,[c]=a.split(".");return{type:"components",variantApiId:c,folderApiId:i,fileName:o}}if(s.length===2){let[i,a]=s,[c]=a.split("."),m=H(o.split("__")[0]);return{type:"project",projectId:t.get(m)||"",projectName:i,variantApiId:c,fileName:o}}throw new Error("Invalid JSON file generated: "+o)})}n(Is,"getFullyQualifiedJSONSources");function Ss(){let e=new Set;return{generate:n(t=>{let r=t.replace(/(\W|-)/g,"_"),o=r,s=1;for(;e.has(o);)o=`${r}${s}`,s++;return e.add(o),o},"generate")}}n(Ss,"createVariableNameGenerator");function ws(e){if(e==="commonjs")return"module.exports = ";if(e==="module")return"export default ";throw new Error("Unknown module type: "+e)}n(ws,"getExportPrefix");function vs(e,t,r){if(r==="commonjs")return`const ${t} = require('./${e}');`;if(r==="module")return`import ${t} from './${e}';`;throw new Error("Unknown module type: "+r)}n(vs,"getImportStatement");async function Hr(e,t={}){let r=O();if(!e.variants)return null;let{shouldFetchComponentLibrary:o,validProjects:s}=e,i={params:{...t?.meta,showSampleData:t.includeSampleData}};s.length&&!o&&(i.params.projectIds=s.map(({id:c})=>c));let{data:a}=await r.get("/v1/variants",i);return a}n(Hr,"fetchVariants");var oo=require("axios");async function ae(e={}){let t=O(),r="/v1/component-folders";e.showSampleData===!0&&(r+="?showSampleData=true");let{data:o}=await t.get(r,{});return o}n(ae,"fetchComponentFolders");var Qr=l(require("path"));async function Xr(e){let t=O(),r={variants:e.variants,localeByVariantId:e.localeByVariantApiId};e.componentFolders||e.componentRoot?(r.components={},e.componentFolders&&(r.components.folders=e.componentFolders),e.componentRoot&&(r.components.root=e.componentRoot)):e.shouldFetchComponentLibrary&&(r.components=!0),e.validProjects&&(r.projects=e.validProjects);let{data:o}=await t.post("/v1/ios/swift-driver",r),s=Qr.default.join(f.TEXT_DIR,"Ditto.swift");return await Mt(s,o),`Successfully saved Swift driver to ${p.info("Ditto.swift")}`}n(Xr,"generateSwiftDriver");var ce=l(require("path")),M=l(require("fs"));var Fs=/\.(strings|stringsdict)$/;async function Kr(e){let t=M.default.readdirSync(f.TEXT_DIR),r={};for(let o of t){if(!Fs.test(o))continue;let[s,i]=o.split(".");if(!s.length)continue;let a=s.split("__"),c=a[0],m=a[a.length-1];if(!(c&&m))continue;let h=e&&e[m]?e[m]:m,u=`${h}.lproj`,y=ce.default.join(f.TEXT_DIR,u);M.default.existsSync(y)||M.default.mkdirSync(y);let I=ce.default.join(f.TEXT_DIR,o),T=ce.default.join(y,`${c}.${i}`);js(c,i,I,T),r[u]={mappedVariant:m===h?void 0:m}}return Object.keys(r).map(o=>{let s=`Successfully generated iOS bundle ${p.info(o)}`,i=r[o].mappedVariant;return i&&(s+=` ${p.subtle(`(mapped to variant '${i}')`)}`),s}).join(`
55
+ `,m+=`${ws(r)}`,m+=`${JSON.stringify(a,null,2)}`.replace(/"\{/g,"{").replace(/\}"/g,"}");let h=Se.default.resolve(f.TEXT_DIR,"index.js");return Ie.default.writeFileSync(h,m,{encoding:"utf8"}),Ur({format:t,moduleType:r}),`Generated .js SDK driver at ${p.info(h)}`}n(Wr,"generateJsDriver");function Is(e){let t=new Map;return e.forEach(o=>{!o.fileName||o.type==="components"||t.set(H(o.fileName),o.id)}),Ie.default.readdirSync(f.TEXT_DIR).filter(o=>Se.default.extname(o)===".json").map(o=>{let s=o.split("__");if(s.length===3){let[,i,a]=s,[c]=a.split(".");return{type:"components",variantApiId:c,folderApiId:i,fileName:o}}if(s.length===2){let[i,a]=s,[c]=a.split("."),m=H(o.split("__")[0]);return{type:"project",projectId:t.get(m)||"",projectName:i,variantApiId:c,fileName:o}}throw new Error("Invalid JSON file generated: "+o)})}n(Is,"getFullyQualifiedJSONSources");function Ss(){let e=new Set;return{generate:n(t=>{let r=t.replace(/(\W|-)/g,"_"),o=r,s=1;for(;e.has(o);)o=`${r}${s}`,s++;return e.add(o),o},"generate")}}n(Ss,"createVariableNameGenerator");function ws(e){if(e==="commonjs")return"module.exports = ";if(e==="module")return"export default ";throw new Error("Unknown module type: "+e)}n(ws,"getExportPrefix");function vs(e,t,r){if(r==="commonjs")return`const ${t} = require('./${e}');`;if(r==="module")return`import ${t} from './${e}';`;throw new Error("Unknown module type: "+r)}n(vs,"getImportStatement");async function Hr(e,t={}){let r=O();if(!e.variants)return null;let{shouldFetchComponentLibrary:o,validProjects:s}=e,i={params:{...t?.meta,showSampleData:t.includeSampleData}};s.length&&!o&&(i.params.projectIds=s.map(({id:c})=>c));let{data:a}=await r.get("/v1/variants",i);return a}n(Hr,"fetchVariants");var oo=require("axios");async function ae(e={}){let t=O(),r="/v1/component-folders";e.showSampleData===!0&&(r+="?showSampleData=true");let{data:o}=await t.get(r,{});return o}n(ae,"fetchComponentFolders");var Qr=l(require("path"));async function Xr(e){let t=O(),r={variants:e.variants,localeByVariantId:e.localeByVariantApiId};e.componentFolders||e.componentRoot?(r.components={},e.componentFolders&&(r.components.folders=e.componentFolders),e.componentRoot&&(r.components.root=e.componentRoot)):e.shouldFetchComponentLibrary&&(r.components=!0),e.validProjects&&(r.projects=e.validProjects);let{data:o}=await t.post("/v1/ios/swift-driver",r),s=Qr.default.join(f.TEXT_DIR,"Ditto.swift");return await At(s,o),`Successfully saved Swift driver to ${p.info("Ditto.swift")}`}n(Xr,"generateSwiftDriver");var ce=l(require("path")),A=l(require("fs"));var Fs=/\.(strings|stringsdict)$/;async function Kr(e){let t=A.default.readdirSync(f.TEXT_DIR),r={};for(let o of t){if(!Fs.test(o))continue;let[s,i]=o.split(".");if(!s.length)continue;let a=s.split("__"),c=a[0],m=a[a.length-1];if(!(c&&m))continue;let h=e&&e[m]?e[m]:m,u=`${h}.lproj`,y=ce.default.join(f.TEXT_DIR,u);A.default.existsSync(y)||A.default.mkdirSync(y);let I=ce.default.join(f.TEXT_DIR,o),T=ce.default.join(y,`${c}.${i}`);js(c,i,I,T),r[u]={mappedVariant:m===h?void 0:m}}return Object.keys(r).map(o=>{let s=`Successfully generated iOS bundle ${p.info(o)}`,i=r[o].mappedVariant;return i&&(s+=` ${p.subtle(`(mapped to variant '${i}')`)}`),s}).join(`
56
56
  `)+`
57
- `}n(Kr,"generateIOSBundles");function js(e,t,r,o){if(!M.default.existsSync(o))return M.default.renameSync(r,o);if(e!=="components")throw new Error("Bundle path for "+e+" already exists");if(t==="strings")return Ps(r,o);if(t==="stringsdict")return Os(r,o);throw new Error("Unsupported extension "+t)}n(js,"handleBundleGeneration");function Ps(e,t){let r=M.default.readFileSync(e,"utf-8"),s=M.default.readFileSync(t,"utf-8")+`
58
- `+r;M.default.writeFileSync(t,s),M.default.unlinkSync(e)}n(Ps,"appendStringsFile");function Os(e,t){let o=M.default.readFileSync(e,"utf-8").split(`
57
+ `}n(Kr,"generateIOSBundles");function js(e,t,r,o){if(!A.default.existsSync(o))return A.default.renameSync(r,o);if(e!=="components")throw new Error("Bundle path for "+e+" already exists");if(t==="strings")return Ps(r,o);if(t==="stringsdict")return Os(r,o);throw new Error("Unsupported extension "+t)}n(js,"handleBundleGeneration");function Ps(e,t){let r=A.default.readFileSync(e,"utf-8"),s=A.default.readFileSync(t,"utf-8")+`
58
+ `+r;A.default.writeFileSync(t,s),A.default.unlinkSync(e)}n(Ps,"appendStringsFile");function Os(e,t){let o=A.default.readFileSync(e,"utf-8").split(`
59
59
  `).slice(3,-4),a=`<?xml version="1.0" encoding="utf-8"?>
60
60
  <plist version="1.0">
61
61
  <dict>
62
- ${[M.default.readFileSync(t,"utf-8").split(`
62
+ ${[A.default.readFileSync(t,"utf-8").split(`
63
63
  `).slice(3,-4),o].join(`
64
64
  `)}
65
65
  </dict>
66
66
  </plist>
67
- `;M.default.writeFileSync(t,a),M.default.unlinkSync(e)}n(Os,"appendStringsDictFile");var bs=n(e=>e+(/[\r\n]$/.test(e)?"":`
68
- `),"ensureEndsWithNewLine"),Mt=n((e,t)=>new Promise(r=>ot.default.writeFile(e,bs(t),r)),"writeFile"),Es=["flat","nested","structured","android","ios-strings","ios-stringsdict","icu"],Ds=["ios-strings","ios-stringsdict"],no=["flat","nested","structured","icu"],ks=n(e=>{let t=e.filter(r=>no.includes(r));return t[t.length-1]||"flat"},"getJsonFormat"),Ms={flat:".json",nested:".json",structured:".json",android:".xml","ios-strings":".strings","ios-stringsdict":".stringsdict",icu:".json"},pe=n(e=>{try{return Object.keys(JSON.parse(e)).some(t=>!t.startsWith("__variant"))}catch{return!1}},"getJsonFormatIsValid"),we={flat:pe,nested:pe,structured:pe,icu:pe,android:n(e=>e.includes("<string"),"android"),"ios-strings":n(e=>e.includes('" = "'),"ios-strings"),"ios-stringsdict":n(e=>e.includes("<key>"),"ios-stringsdict")},As=n(e=>{let t=(Array.isArray(e)?e:[e]).filter(r=>Es.includes(r));return t.length?t:["flat"]},"getFormat"),ve=n(e=>Ms[e],"getFormatExtension"),Rs=["projects","exported_at"],Ns=n(e=>{let t=Object.keys(e).filter(o=>!Rs.includes(o)).length>0,r=e.projects&&Object.keys(e.projects).length>0;return t||r},"hasVariantData");async function _s(){S.deleteToken(f.CONFIG_FILE,f.API_HOST),await gt("Looks like the API key you have saved no longer works. Please enter another one.")}n(_s,"askForAnotherToken");async function to(e,t){let{projects:r,format:o,status:s,richText:i,token:a}=t,c=O(),m={variant:e};return o&&(m.format=o),i&&(m.includeRichText=i.toString()),s&&(m.status=s),(await Promise.all(r.map(async u=>{let y={...m};u.status&&(y.status=u.status),u.exclude_components&&(y.exclude_components=String(u.exclude_components));let{data:I}=await c.get(`/v1/projects/${u.id}`,{params:y,headers:{Authorization:`token ${a}`}});if(!Ns(I))return"";let T=ve(o),F=H(u.fileName+("__"+(e||"base"))+T),J=yt.default.join(f.TEXT_DIR,F),k=I;T===".json"&&(k=JSON.stringify(I,null,2));let V=we[o];return V(k)?(await Mt(J,k),Fe(F)):""}))).join("")}n(to,"downloadAndSaveVariant");async function $s(e){return(await Promise.all([to(null,e),...e.variants.map(({apiID:r})=>to(r,e))])).join("")}n($s,"downloadAndSaveVariants");async function Ls(e){let{projects:t,format:r,status:o,richText:s,token:i,options:a}=e,c=O(),m={...a?.meta};return r&&(m.format=r),s&&(m.includeRichText=s.toString()),o&&(m.status=o),(await Promise.all(t.map(async u=>{let y={...m};u.status&&(y.status=u.status),u.exclude_components&&(y.exclude_components=String(u.exclude_components));let{data:I}=await c.get(`/v1/projects/${u.id}`,{params:y,headers:{Authorization:`token ${i}`}}),T=ve(r),F=H(`${u.fileName}__base${T}`),J=yt.default.join(f.TEXT_DIR,F),k=I;T===".json"&&(k=JSON.stringify(I,null,2));let V=we[r];return V(k)?(await Mt(J,k),Fe(F)):""}))).join("")}n(Ls,"downloadAndSaveBase");function Fe(e){return`Successfully saved to ${p.info(e)}
67
+ `;A.default.writeFileSync(t,a),A.default.unlinkSync(e)}n(Os,"appendStringsDictFile");var bs=n(e=>e+(/[\r\n]$/.test(e)?"":`
68
+ `),"ensureEndsWithNewLine"),At=n((e,t)=>new Promise(r=>ot.default.writeFile(e,bs(t),r)),"writeFile"),Es=["flat","nested","structured","android","ios-strings","ios-stringsdict","icu"],Ds=["ios-strings","ios-stringsdict"],no=["flat","nested","structured","icu"],ks=n(e=>{let t=e.filter(r=>no.includes(r));return t[t.length-1]||"flat"},"getJsonFormat"),As={flat:".json",nested:".json",structured:".json",android:".xml","ios-strings":".strings","ios-stringsdict":".stringsdict",icu:".json"},pe=n(e=>{try{return Object.keys(JSON.parse(e)).some(t=>!t.startsWith("__variant"))}catch{return!1}},"getJsonFormatIsValid"),we={flat:pe,nested:pe,structured:pe,icu:pe,android:n(e=>e.includes("<string"),"android"),"ios-strings":n(e=>e.includes('" = "'),"ios-strings"),"ios-stringsdict":n(e=>e.includes("<key>"),"ios-stringsdict")},Ms=n(e=>{let t=(Array.isArray(e)?e:[e]).filter(r=>Es.includes(r));return t.length?t:["flat"]},"getFormat"),ve=n(e=>As[e],"getFormatExtension"),Rs=["projects","exported_at"],Ns=n(e=>{let t=Object.keys(e).filter(o=>!Rs.includes(o)).length>0,r=e.projects&&Object.keys(e.projects).length>0;return t||r},"hasVariantData");async function _s(){S.deleteToken(f.CONFIG_FILE,f.API_HOST),await gt("Looks like the API key you have saved no longer works. Please enter another one.")}n(_s,"askForAnotherToken");async function to(e,t){let{projects:r,format:o,status:s,richText:i,token:a}=t,c=O(),m={variant:e};return o&&(m.format=o),i&&(m.includeRichText=i.toString()),s&&(m.status=s),(await Promise.all(r.map(async u=>{let y={...m};u.status&&(y.status=u.status),u.exclude_components&&(y.exclude_components=String(u.exclude_components));let{data:I}=await c.get(`/v1/projects/${u.id}`,{params:y,headers:{Authorization:`token ${a}`}});if(!Ns(I))return"";let T=ve(o),F=H(u.fileName+("__"+(e||"base"))+T),J=yt.default.join(f.TEXT_DIR,F),k=I;T===".json"&&(k=JSON.stringify(I,null,2));let V=we[o];return V(k)?(await At(J,k),Fe(F)):""}))).join("")}n(to,"downloadAndSaveVariant");async function $s(e){return(await Promise.all([to(null,e),...e.variants.map(({apiID:r})=>to(r,e))])).join("")}n($s,"downloadAndSaveVariants");async function Ls(e){let{projects:t,format:r,status:o,richText:s,token:i,options:a}=e,c=O(),m={...a?.meta};return r&&(m.format=r),s&&(m.includeRichText=s.toString()),o&&(m.status=o),(await Promise.all(t.map(async u=>{let y={...m};u.status&&(y.status=u.status),u.exclude_components&&(y.exclude_components=String(u.exclude_components));let{data:I}=await c.get(`/v1/projects/${u.id}`,{params:y,headers:{Authorization:`token ${i}`}}),T=ve(r),F=H(`${u.fileName}__base${T}`),J=yt.default.join(f.TEXT_DIR,F),k=I;T===".json"&&(k=JSON.stringify(I,null,2));let V=we[r];return V(k)?(await At(J,k),Fe(F)):""}))).join("")}n(Ls,"downloadAndSaveBase");function Fe(e){return`Successfully saved to ${p.info(e)}
69
69
  `}n(Fe,"getSavedMessage");function Js(){return ot.default.existsSync(f.TEXT_DIR)||ot.default.mkdirSync(f.TEXT_DIR),ot.default.readdirSync(f.TEXT_DIR,{withFileTypes:!0}).forEach(t=>{if(t.isDirectory()&&/\.lproj$/.test(t.name))return ot.default.rmSync(yt.default.resolve(f.TEXT_DIR,t.name),{recursive:!0,force:!0});if(t.isFile()&&/\.js(on)?|\.ts|\.xml|\.strings(dict)?$|\.swift$/.test(t.name))return ot.default.unlinkSync(yt.default.resolve(f.TEXT_DIR,t.name))}),`Cleaning old output files..
70
- `}n(Js,"cleanOutputFiles");async function Vs(e,t,r){let o=O(),{validProjects:s,format:i,shouldFetchComponentLibrary:a,status:c,richText:m,componentFolders:h,componentRoot:u,localeByVariantApiId:y,disableJsDriver:I}=e,T=As(i),F=T.some(P=>no.includes(P)),k=T.some(P=>Ds.includes(P))&&y,V=!k,w="",A=(0,eo.default)(w);A.start();let[mt,Cn]=await Promise.all([Hr(e,r),ae({})]),yr=Object.entries(Cn).reduce((P,[$,Y])=>P.concat([{id:$,name:Y}]),[]);try{w+=Js(),w+=`
70
+ `}n(Js,"cleanOutputFiles");async function Vs(e,t,r){let o=O(),{validProjects:s,format:i,shouldFetchComponentLibrary:a,status:c,richText:m,componentFolders:h,componentRoot:u,localeByVariantApiId:y,disableJsDriver:I}=e,T=Ms(i),F=T.some(P=>no.includes(P)),k=T.some(P=>Ds.includes(P))&&y,V=!k,w="",M=(0,eo.default)(w);M.start();let[mt,Cn]=await Promise.all([Hr(e,r),ae({})]),yr=Object.entries(Cn).reduce((P,[$,z])=>P.concat([{id:$,name:z}]),[]);try{w+=Js(),w+=`
71
71
  Fetching the latest text from ${oe(s,a)}
72
- `;let P=r?r.meta:{},$={id:"__root__",name:"Root",status:typeof e.componentRoot=="object"?e.componentRoot.status:void 0},Y=[];if(h)switch(u){case void 0:case!1:Y.push(...h);break;default:Y.push(...h),Y.push($);break}else switch(u){case void 0:Y.push(...yr),Y.push($);break;case!1:Y.push(...yr);break;default:Y.push($);break}let xr=[];async function In(Z){let Pt=[{apiID:void 0},...mt||[]],Ot=new URLSearchParams;r?.meta&&Object.entries(r.meta).forEach(([lt,et])=>Ot.append(lt,et)),Z&&Ot.append("format",Z),m&&Ot.append("includeRichText",m.toString()),c&&Ot.append("status",c);let Tr=[];Pt.forEach(({apiID:lt})=>{Tr.push(...Y.map(async et=>{let fe=new URLSearchParams(Ot);lt&&fe.append("variant",lt),et.status&&fe.append("status",et.status);let Fn=et.id==="__root__"?"/v1/components?root_only=true":`/v1/component-folders/${et.id}/components`,{data:Cr}=await o.get(Fn,{params:fe}),Ir=ve(Z),jn="components",Pn=`__${H(et.name)}`,On=`__${lt||"base"}`,de=H(`${jn}${Pn}${On}${Ir}`),bn=yt.default.join(f.TEXT_DIR,de),ge=Cr;Ir===".json"&&(ge=JSON.stringify(Cr,null,2));let En=we[Z];return En(ge)?(await Mt(bn,ge),xr.push({type:"components",id:"ditto_component_library",name:"ditto_component_library",fileName:de,variant:lt||"base"}),Fe(de)):""}))});let vn=await Promise.all(Tr);V&&(w+=vn.join(""))}if(n(In,"fetchComponentLibrary"),a)for(let Z of T)await In(Z);async function Sn(Z){let Pt="";mt?Pt=await $s({variants:mt,projects:s,format:Z,status:c,richText:m,token:t}):Pt=await Ls({projects:s,format:Z,status:c,richText:m,token:t,options:{meta:P}}),V&&(w+=Pt)}if(n(Sn,"fetchProjects"),s.length)for(let Z of T)await Sn(Z);let wn=[...s,...xr];return F&&!I&&(w+=Wr(wn,ks(T))),k&&(w+=`iOS locale information detected, generating bundles..
72
+ `;let P=r?r.meta:{},$={id:"__root__",name:"Root",status:typeof e.componentRoot=="object"?e.componentRoot.status:void 0},z=[];if(h)switch(u){case void 0:case!1:z.push(...h);break;default:z.push(...h),z.push($);break}else switch(u){case void 0:z.push(...yr),z.push($);break;case!1:z.push(...yr);break;default:z.push($);break}let xr=[];async function In(Z){let Pt=[{apiID:void 0},...mt||[]],Ot=new URLSearchParams;r?.meta&&Object.entries(r.meta).forEach(([lt,et])=>Ot.append(lt,et)),Z&&Ot.append("format",Z),m&&Ot.append("includeRichText",m.toString()),c&&Ot.append("status",c);let Tr=[];Pt.forEach(({apiID:lt})=>{Tr.push(...z.map(async et=>{let fe=new URLSearchParams(Ot);lt&&fe.append("variant",lt),et.status&&fe.append("status",et.status);let Fn=et.id==="__root__"?"/v1/components?root_only=true":`/v1/component-folders/${et.id}/components`,{data:Cr}=await o.get(Fn,{params:fe}),Ir=ve(Z),jn="components",Pn=`__${H(et.name)}`,On=`__${lt||"base"}`,de=H(`${jn}${Pn}${On}${Ir}`),bn=yt.default.join(f.TEXT_DIR,de),ge=Cr;Ir===".json"&&(ge=JSON.stringify(Cr,null,2));let En=we[Z];return En(ge)?(await At(bn,ge),xr.push({type:"components",id:"ditto_component_library",name:"ditto_component_library",fileName:de,variant:lt||"base"}),Fe(de)):""}))});let vn=await Promise.all(Tr);V&&(w+=vn.join(""))}if(n(In,"fetchComponentLibrary"),a)for(let Z of T)await In(Z);async function Sn(Z){let Pt="";mt?Pt=await $s({variants:mt,projects:s,format:Z,status:c,richText:m,token:t}):Pt=await Ls({projects:s,format:Z,status:c,richText:m,token:t,options:{meta:P}}),V&&(w+=Pt)}if(n(Sn,"fetchProjects"),s.length)for(let Z of T)await Sn(Z);let wn=[...s,...xr];return F&&!I&&(w+=Wr(wn,ks(T))),k&&(w+=`iOS locale information detected, generating bundles..
73
73
 
74
74
  `,w+=await Kr(y),w+=await Xr(e)),w+=`
75
75
 
76
- ${p.success("Done")}!`,A.stop(),console.log(w)}catch(P){console.error(P),A.stop();let $=P.message;if(P.response&&P.response.status===404){await _s(),je();return}return P.response&&P.response.status===401?($="You don't have access to the selected projects",w=`${p.errorText($)}.
76
+ ${p.success("Done")}!`,M.stop(),console.log(w)}catch(P){console.error(P),M.stop();let $=P.message;if(P.response&&P.response.status===404){await _s(),je();return}return P.response&&P.response.status===401?($="You don't have access to the selected projects",w=`${p.errorText($)}.
77
77
  Choose others using the ${p.info("project")} command, or update your API key.`,console.log(w)):P.response&&P.response.status===403?($="One or more of the requested projects don't have Developer Mode enabled",w=`${p.errorText($)}.
78
78
  Please choose different projects using the ${p.info("project")} command, or turn on Developer Mode for all selected projects. Learn more here: ${p.subtle("https://www.dittowords.com/docs/ditto-developer-mode")}.`,console.log(w)):(P.response&&P.response.status===400&&($="projects not found"),w=`We hit an error fetching text from the projects: ${p.errorText($)}.
79
79
  Choose others using the ${p.info("project")} command.`,console.log(w))}}n(Vs,"downloadAndSave");var je=n(async e=>{let t=e?e.meta:{},r=e?.includeSampleData||!1,o=S.getToken(f.CONFIG_FILE,f.API_HOST),s=S.parseSourceInformation();try{return await Vs(s,o,{meta:t,includeSampleData:r})}catch(i){let a=ro.captureException(i),c=`
@@ -88,10 +88,10 @@ Try adding one with: ${p.info("ditto-cli project add")}
88
88
  `);return}let r=await re({projects:e,message:"Select a project to remove"});r&&(S.writeProjectConfigData(f.PROJECT_CONFIG_FILE,{components:t&&r.id!=="components",projects:e.filter(({id:o})=>o!==r.id)}),console.log(`
89
89
  ${p.info(r.name)} has been removed from your selected projects.
90
90
  We saved your updated configuration to: ${p.info(f.PROJECT_CONFIG_FILE)}
91
- `))}n(Bs,"removeProject");var io=Bs;var At=l(require("fs")),ao=require("@babel/parser"),co=l(require("@babel/traverse")),_=l(require("@babel/types")),po=require("@babel/core");async function Ys(e,t,r){let o=await new Promise((a,c)=>At.default.readFile(e,"utf-8",(m,h)=>{m?c(m):a(h)})),s=(0,ao.parse)(o,{sourceType:"module",plugins:["jsx","typescript"]});(0,co.default)(s,{JSXText(a){let{searchString:c,replaceWith:m}=t,h=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");if(new RegExp(h,"gi").test(a.node.value)){if(r.lineNumbers&&a.node.loc&&!r.lineNumbers.includes(a.node.loc.start.line))return;let y=qs(a.node.value,h),I=[];y.forEach(T=>{if(T.toLowerCase()===c.toLowerCase()){let F=_.jsxIdentifier("DittoComponent"),J=_.jsxAttribute(_.jsxIdentifier("componentId"),_.stringLiteral(m)),k=_.jsxOpeningElement(F,[J],!0),V=_.jsxElement(k,void 0,[],!0);I.push(V)}else I.push(_.jsxText(T))}),a.replaceWithMultiple(I)}}});let{code:i}=(0,po.transformFromAst)(s,o,{configFile:!1});await new Promise((a,c)=>At.default.writeFile(e,i,m=>{m?c(m):a(null)}))}n(Ys,"replaceJSXTextInFile");function qs(e,t){return e.split(new RegExp(`(${t})`,"gi")).filter(r=>r!=="")}n(qs,"splitByCaseInsensitive");function mo(e,t){let r,o,s;try{let i=zs(e);r=i.filePath,o=i.searchString,s=i.replaceWith}catch(i){console.error(i),console.error("Usage for replace: ditto-cli replace <file path> <search string> <replace with>");return}Ys(r,{searchString:o,replaceWith:s},t)}n(mo,"replace");function zs(e){if(e.length!==3)throw new Error("The options array must contain <file path> <search string> <replace with>.");let t=e[0];if(!(At.default.existsSync(t)&&At.default.lstatSync(t).isFile()))throw new Error(`${t} is not a valid file path.`);return{filePath:t,searchString:e[1],replaceWith:e[2]}}n(zs,"parseOptions");var uo=l(require("fs")),fo=l(require("glob")),go=require("@babel/parser"),ho=l(require("@babel/traverse"));async function lo(e={}){let t=O();if(e.componentFolder)try{let{data:r}=await t.get(`/v1/component-folders/${e.componentFolder}/components`,{});return r}catch{return console.log(`Failed to get components for ${e.componentFolder}. Please verify the folder's API ID.`),{}}else{let{data:r}=await t.get("/v1/components?format=structured",{});return r}}n(lo,"fetchComponents");async function yo(e){let t=await lo({...e.componentFolder?{componentFolder:e.componentFolder}:{}}),r=e.directory||".",o=await Gs({directory:r,files:e.files,components:t});console.log(JSON.stringify(o,null,2))}n(yo,"generateSuggestions");async function Gs(e){let t={},r=e.files||fo.default.sync(`${e.directory}/**/*.+(jsx|tsx)`,{ignore:"**/node_modules/**"}),o=[];async function s(i){let a=await new Promise((m,h)=>uo.default.readFile(i,"utf-8",(u,y)=>{u?h(u):m(y)})),c=(0,go.parse)(a,{sourceType:"module",plugins:["jsx","typescript"]});(0,ho.default)(c,{JSXText(m){for(let[h,u]of Object.entries(e.components)){if(t[h]||(t[h]={apiId:h,...u,occurrences:{}}),!/^\s*$/.test(m.node.value)&&!/^\s*$/.test(u.text)&&m.node.value.includes(u.text)){let y=u.text.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),I=new RegExp(y,"g"),T;for(;(T=I.exec(m.node.value))!==null;){let F=m.node.value.slice(0,T.index).split(`
91
+ `))}n(Bs,"removeProject");var io=Bs;var Mt=l(require("fs")),ao=require("@babel/parser"),co=l(require("@babel/traverse")),_=l(require("@babel/types")),po=require("@babel/core");async function zs(e,t,r){let o=await new Promise((a,c)=>Mt.default.readFile(e,"utf-8",(m,h)=>{m?c(m):a(h)})),s=(0,ao.parse)(o,{sourceType:"module",plugins:["jsx","typescript"]});(0,co.default)(s,{JSXText(a){let{searchString:c,replaceWith:m}=t,h=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");if(new RegExp(h,"gi").test(a.node.value)){if(r.lineNumbers&&a.node.loc&&!r.lineNumbers.includes(a.node.loc.start.line))return;let y=Ys(a.node.value,h),I=[];y.forEach(T=>{if(T.toLowerCase()===c.toLowerCase()){let F=_.jsxIdentifier("DittoComponent"),J=_.jsxAttribute(_.jsxIdentifier("componentId"),_.stringLiteral(m)),k=_.jsxOpeningElement(F,[J],!0),V=_.jsxElement(k,void 0,[],!0);I.push(V)}else I.push(_.jsxText(T))}),a.replaceWithMultiple(I)}}});let{code:i}=(0,po.transformFromAst)(s,o,{configFile:!1});await new Promise((a,c)=>Mt.default.writeFile(e,i,m=>{m?c(m):a(null)}))}n(zs,"replaceJSXTextInFile");function Ys(e,t){return e.split(new RegExp(`(${t})`,"gi")).filter(r=>r!=="")}n(Ys,"splitByCaseInsensitive");function mo(e,t){let r,o,s;try{let i=qs(e);r=i.filePath,o=i.searchString,s=i.replaceWith}catch(i){console.error(i),console.error("Usage for replace: ditto-cli replace <file path> <search string> <replace with>");return}zs(r,{searchString:o,replaceWith:s},t)}n(mo,"replace");function qs(e){if(e.length!==3)throw new Error("The options array must contain <file path> <search string> <replace with>.");let t=e[0];if(!(Mt.default.existsSync(t)&&Mt.default.lstatSync(t).isFile()))throw new Error(`${t} is not a valid file path.`);return{filePath:t,searchString:e[1],replaceWith:e[2]}}n(qs,"parseOptions");var uo=l(require("fs")),fo=l(require("glob")),go=require("@babel/parser"),ho=l(require("@babel/traverse"));async function lo(e={}){let t=O();if(e.componentFolder)try{let{data:r}=await t.get(`/v1/component-folders/${e.componentFolder}/components`,{});return r}catch{return console.log(`Failed to get components for ${e.componentFolder}. Please verify the folder's API ID.`),{}}else{let{data:r}=await t.get("/v1/components?format=structured",{});return r}}n(lo,"fetchComponents");async function yo(e){let t=await lo({...e.componentFolder?{componentFolder:e.componentFolder}:{}}),r=e.directory||".",o=await Gs({directory:r,files:e.files,components:t});console.log(JSON.stringify(o,null,2))}n(yo,"generateSuggestions");async function Gs(e){let t={},r=e.files||fo.default.sync(`${e.directory}/**/*.+(jsx|tsx)`,{ignore:"**/node_modules/**"}),o=[];async function s(i){let a=await new Promise((m,h)=>uo.default.readFile(i,"utf-8",(u,y)=>{u?h(u):m(y)})),c=(0,go.parse)(a,{sourceType:"module",plugins:["jsx","typescript"]});(0,ho.default)(c,{JSXText(m){for(let[h,u]of Object.entries(e.components)){if(t[h]||(t[h]={apiId:h,...u,occurrences:{}}),!/^\s*$/.test(m.node.value)&&!/^\s*$/.test(u.text)&&m.node.value.includes(u.text)){let y=u.text.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),I=new RegExp(y,"g"),T;for(;(T=I.exec(m.node.value))!==null;){let F=m.node.value.slice(0,T.index).split(`
92
92
  `);if(!m.node.loc)continue;let J=m.node.loc.start.line+F.length-1,V=a.split(`
93
- `)[J-1],w=Us(V,T.index,u.text,`${u.text}`);t[h].occurrences[i]||(t[h].occurrences[i]=[]),t[h].occurrences[i].push({lineNumber:J,preview:w})}}Object.keys(t[h].occurrences).length===0&&delete t[h]}}})}n(s,"handleFile");for(let i of r)o.push(s(i));return await Promise.all(o),t}n(Gs,"findComponentsInJSXFiles");function Us(e,t,r,o){return e.substring(0,t)+e.substring(t,e.length).replace(r,o)}n(Us,"replaceAt");var Ws=n(e=>{let t={};return Array.isArray(e)&&e.forEach(r=>{let[o,s]=r.split(":");t[o]=s}),t},"processMetaOption"),xo=Ws;var To=l(require("form-data")),Pe=l(require("fs"));async function Co(e,t){let r=O();if(!Pe.default.existsSync(e))return console.error("Failed to import file: couldn't find file at path "+e),{componentsInserted:0,firstImportedId:"null"};let o=new To.default;o.append("import",Pe.default.createReadStream(e));let s={method:"POST",url:"/v1/components/file",params:{...t.csvColumnMapping?.name?{name:`[${t.csvColumnMapping.name}]`}:{},...t.csvColumnMapping?.text?{text:t.csvColumnMapping.text}:{},...t.csvColumnMapping?.notes?{notes:t.csvColumnMapping.notes}:{},...t.csvColumnMapping?.status?{status:t.csvColumnMapping.status}:{},...t.csvColumnMapping?.tags?{tags:t.csvColumnMapping.tags}:{},...t.csvColumnMapping?.componentId?{componentId:t.csvColumnMapping.componentId}:{}},headers:{"content-type":"multipart/form-data"},data:o};try{let{data:i}=await r(s);return i}catch(i){return console.error("Failed to import file."),console.error(i.response?.data?.message||i.message),{componentsInserted:0,firstImportedId:"null"}}}n(Co,"importComponents");async function Io(e,t){if(e.endsWith(".csv")&&(!t.csvColumnMapping?.name||!t.csvColumnMapping?.text))throw new Error(".csv files require the --component-name and --text flags.");let r=await Co(e,t);console.log(JSON.stringify(r))}n(Io,"importComponents");async function So(e){let t=await ae(e);console.log(JSON.stringify(t))}n(So,"showComponentFolders");var Hs=["pull","none","project","project add","project remove"],Qs=[{name:"pull",description:"Sync copy from Ditto into the current working directory",flags:{"--sample-data":{description:"Include sample data. Currently only supports variants."}}},{name:"project",description:"Add a Ditto project to sync copy from",commands:[{name:"add",description:"Add a Ditto project to sync copy from"},{name:"remove",description:"Stop syncing copy from a Ditto project"}]},{name:"component-folders",description:"List component folders in your workspace. More information about component folders can be found here: https://www.dittowords.com/docs/component-folders.",flags:{"-s, --sample-data":{description:"Includes the sample components folder in the output"}}},{name:"generate-suggestions",description:"Find text that can be potentially replaced with Ditto text",flags:{"-d, --directory [value]":{description:"Directory to search for text"},"-f, --files [value]":{description:"Files to search for text (will override -d)",processor:n(e=>e.split(","),"processor")},"-cf, --component-folder [value]":{description:"Component folder to search for matches"}}},{name:"replace",description:"Find and replace Ditto text with code",flags:{"-ln, --line-numbers [value]":{description:"Only replace text on a specific line number",processor:n(e=>e.split(",").map(Number),"processor")}}},{name:"import-components",description:"Import components via a file. For more information please see: https://www.dittowords.com/docs/importing-string-files.",flags:{"-t, --text [value]":{description:"Text column index (.csv format only)"},"-n, --component-name [value]":{description:"Name column indexes (comma separated) (.csv format only)"},"-no, --notes [value]":{description:"Notes column index (.csv format only)"},"-t, --tags [value]":{description:"Tags column index (.csv format only)"},"-s, --status [value]":{description:"Status column index (.csv format only)"},"-c, --component-id [value]":{description:"Component ID column index (.csv format only)"}}}],Xs=n(()=>{Q.program.name("ditto-cli"),Qs.forEach(e=>{let t=Q.program.command(e.name).description(e.description).action(r=>Oe(e.name,r));e.flags&&Object.entries(e.flags).forEach(([r,{description:o,processor:s}])=>{s?t.option(r,o,s):t.option(r,o)}),"commands"in e&&e.commands&&e.commands.forEach(r=>{t.command(r.name).description(r.description).action((o,s)=>{if(e.name==="project"){let i=`${e.name} ${r.name}`;return Oe(i,s)}})})})},"setupCommands"),Ks=n(()=>{Q.program.option("-l, --legacy","Run in legacy mode"),Q.program.option("-m, --meta <data...>","Include arbitrary data in requests to the Ditto API. Ex: -m githubActionRequest:true trigger:manual"),Q.program.version(ut,"-v, --version","Output the current version")},"setupOptions"),Oe=n(async(e,t)=>{let r=Hs.includes(e)&&Br();if(r)try{await Yr()}catch{await b("Exiting Ditto CLI...");return}let{meta:o}=Q.program.opts();switch(e){case"none":case"pull":return je({meta:xo(o),includeSampleData:t.sampleData||!1});case"project":case"project add":return r?void 0:so();case"project remove":return io();case"component-folders":return So({showSampleData:t.sampleData});case"generate-suggestions":return yo({directory:t.directory,files:t.files,componentFolder:t.componentFolder});case"replace":return mo(t.args,{...t?.lineNumbers?{lineNumbers:t.lineNumbers}:{}});case"import-components":{if(t.args.length===0){console.info("Please provide a file path.");return}return Io(t.args[0],{csvColumnMapping:{name:t.componentName,text:t.text,notes:t.notes,tags:t.tags,status:t.status,componentId:t.componentId}})}default:{await b("Exiting Ditto CLI...");return}}},"executeCommand"),ti=n(async()=>{if(Xs(),Ks(),process.argv.length<=2&&process.argv[1].includes("ditto-cli")){await Oe("none",[]);return}Q.program.parse(process.argv)},"legacyAppEntry"),wo=ti;var yn=l(require("@sentry/node")),tt=require("commander");var Yo=require("os"),Tt=l(require("path")),qo=l(require("crypto"));var Vo=require("zod"),Zo=l(require("fs"));var xt=l(require("path")),X=l(require("fs")),be=l(require("fs/promises"));function Rt(e,t=""){let r=xt.default.dirname(e);return X.default.existsSync(r)||X.default.mkdirSync(r),X.default.existsSync(e)?!1:(ei(e,t),!0)}n(Rt,"createFileIfMissingSync");function ei(e,t){X.default.existsSync(xt.default.dirname(e))||X.default.mkdirSync(xt.default.dirname(e),{recursive:!0}),X.default.writeFileSync(e,t,"utf-8")}n(ei,"writeFileSync");async function me(e,t){X.default.existsSync(xt.default.dirname(e))||await be.default.mkdir(xt.default.dirname(e),{recursive:!0}),await be.default.writeFile(e,t,"utf-8")}n(me,"writeFile");var vo=n(e=>e+(/[\r\n]$/.test(e)?"":`
94
- `),"ensureEndsWithNewLine");var $e=l(require("js-yaml"));var v=require("zod");var d=require("zod");var Ee=d.z.enum(["NONE","WIP","REVIEW","FINAL"]),Fo=d.z.object({id:d.z.string(),text:d.z.string(),richText:d.z.string().optional(),status:d.z.string(),notes:d.z.string(),tags:d.z.array(d.z.string()),variableIds:d.z.array(d.z.string()),variantId:d.z.string().nullable()}),ri=Fo.extend({projectId:d.z.string()});function jo(e){return"projectId"in e}n(jo,"isTextItem");var Po=d.z.array(ri),oi=d.z.string(),ni=d.z.record(d.z.string(),d.z.string()),Oo=d.z.union([oi,ni]),si=Fo.extend({folderId:d.z.string().nullable()}),bo=d.z.array(si),ii=d.z.record(d.z.string(),d.z.string()),ai=d.z.string(),Eo=d.z.union([ai,ii]),ci=d.z.object({id:d.z.string(),name:d.z.string()}),Do=d.z.array(ci),pi=d.z.object({id:d.z.string(),name:d.z.string(),description:d.z.string().optional()}),ko=d.z.array(pi),mi=d.z.object({id:d.z.string(),excludeNestedFolders:d.z.boolean().optional()}),Zp=d.z.object({projects:d.z.array(d.z.object({id:d.z.string()})).optional(),components:d.z.object({folders:d.z.array(mi).optional()}).optional(),statuses:d.z.array(Ee).optional()});var L=v.z.object({projects:v.z.array(v.z.object({id:v.z.string()})).optional(),components:v.z.object({folders:v.z.array(v.z.object({id:v.z.string(),excludeNestedFolders:v.z.boolean().optional()})).optional()}).optional(),statuses:v.z.array(Ee).optional(),variants:v.z.array(v.z.object({id:v.z.string()})).optional(),outDir:v.z.string().optional(),richText:v.z.union([v.z.literal("html"),v.z.literal(!1)]).optional(),iosLocales:v.z.array(v.z.record(v.z.string(),v.z.string())).optional()});var $o=require("zod");var q=require("zod");var De=L.extend({format:q.z.literal("json"),framework:q.z.undefined()}).strict(),li=De.extend({framework:q.z.literal("i18next"),type:q.z.literal("module").or(q.z.literal("commonjs")).optional()}).strict(),ui=De.extend({framework:q.z.literal("vue-i18n"),type:q.z.literal("module").or(q.z.literal("commonjs")).optional()}).strict(),Mo=q.z.discriminatedUnion("framework",[De,li,ui]);var ke=require("zod");var Ao=L.extend({format:ke.z.literal("ios-strings"),framework:ke.z.undefined()}).strict();var Me=require("zod");var Ro=L.extend({format:Me.z.literal("ios-stringsdict"),framework:Me.z.undefined()}).strict();var Ae=require("zod");var No=L.extend({format:Ae.z.literal("android"),framework:Ae.z.undefined()}).strict();var Re=require("zod");var _o=L.extend({format:Re.z.literal("json_icu"),framework:Re.z.undefined()}).strict();var Lo=$o.z.union([...Mo.options,No,Ao,Ro,_o]);var _e=class _e extends Error{constructor({type:t,message:r,exitCode:o,data:s}){let i=r||"Something went wrong. Please contact support or try again later.";super(i),this.exitCode=o,this.type=t,this.data=s}};n(_e,"DittoError");var nt=_e;function Jo(e){return e instanceof nt}n(Jo,"isDittoError");function Ne(e,t){return e.type===t}n(Ne,"isDittoErrorType");var di=L.extend({outputs:Vo.z.array(Lo)}).strict(),Le={projects:[],variants:[],statuses:[],components:{folders:[]},outputs:[{format:"json",framework:"i18next"}]};async function Bo(e){let t=gi(e.config);g.setProjectConfig(t)}n(Bo,"initProjectConfig");function gi(e=g.projectConfigFile,t=Le){let r=t;try{Rt(e,$e.default.dump(t));let s=Zo.default.readFileSync(e,"utf8");r=$e.default.load(s)}catch(s){throw new nt({type:"ConfigYamlLoadError",data:{rawErrorMessage:s.message},message:"Could not load the project config file. Please check the file path and that it is a valid YAML file."})}let o=di.safeParse(r);if(!o.success)throw new nt({type:"ConfigParseError",data:{formattedError:JSON.stringify(o.error.flatten(),null,2),messagePrefix:"There is an error in your project config file."}});return o.data}n(gi,"readProjectConfigData");var Ct,K,Nt,_t,It,St,st,$t,Ve=class Ve{constructor(){z(this,Ct);z(this,K);z(this,Nt);z(this,_t);z(this,It);z(this,St);z(this,st);z(this,$t);N(this,Ct,process.env.DITTO_API_HOST||"https://api.dittowords.com"),N(this,K,process.env.DITTO_TOKEN),N(this,Nt,process.env.DITTO_CONFIG_FILE||Tt.default.join((0,Yo.homedir)(),".config","ditto")),N(this,It,process.env.DITTO_PROJECT_CONFIG_FILE||Tt.default.normalize(Tt.default.join("ditto","config.yml"))),N(this,_t,Tt.default.normalize(Tt.default.dirname(R(this,It)))),N(this,St,qo.default.randomUUID()),N(this,st,Le),N(this,$t,process.env.DITTO_OUT_DIR||this.projectConfigDir)}get apiHost(){return R(this,Ct)}set apiHost(t){N(this,Ct,t)}get apiToken(){return R(this,K)}get apiTokenOrThrow(){if(!R(this,K))throw new Error("No API Token found.");return R(this,K)}get configFile(){return R(this,Nt)}get projectConfigFile(){return R(this,It)}get clientId(){return R(this,St)}setClientId(t){N(this,St,t)}setApiToken(t){N(this,K,t)}get projectConfig(){return R(this,st)}setProjectConfig(t){N(this,st,t)}get selectedProjectConfigOutputs(){return R(this,st).outputs}get projectConfigDir(){return R(this,_t)}get outDir(){return this.projectConfig.outDir||R(this,$t)}};Ct=new WeakMap,K=new WeakMap,Nt=new WeakMap,_t=new WeakMap,It=new WeakMap,St=new WeakMap,st=new WeakMap,$t=new WeakMap,n(Ve,"AppContext");var Je=Ve,hi=new Je,g=hi;var U=l(require("chalk"));var yi=n(e=>U.default.magenta(e),"errorText"),xi=n(e=>U.default.yellow(e),"warnText"),Ti=n(e=>U.default.blueBright(e),"info"),Ci=n(e=>U.default.green(e),"success"),Ii=n(e=>U.default.blueBright.underline(e),"url"),Si=n(e=>U.default.grey(e),"subtle"),wi=n(e=>U.default.white(e),"write"),vi=n(e=>U.default.bold(e),"bold"),Fi=n(e=>console.log(e),"writeLine"),C={errorText:yi,warnText:xi,info:Ti,success:Ci,url:Ii,subtle:Si,write:wi,writeLine:Fi,bold:vi};var Ze=class Ze{constructor(t){this.filename=t.filename,this.path=t.path,this.extension=t.extension,this.content=t.content,this.metadata=t.metadata??{}}get fullPath(){return`${this.path}/${this.filename}.${this.extension}`}get filenameWithExtension(){return`${this.filename}.${this.extension}`}get formattedContent(){throw new Error("Not implemented")}};n(Ze,"OutputFile");var E=Ze;var Be=class Be extends E{constructor(t){super({filename:t.filename||"Ditto",path:t.path,extension:"swift",content:t.content??""})}get formattedContent(){return this.content}};n(Be,"SwiftOutputFile");var Lt=Be;var Go=require("axios");var zo=l(require("axios"));function ji({token:e,meta:t}={}){return function(r){return r.baseURL=g.apiHost,r.headers["x-ditto-client-id"]=g.clientId,r.headers["x-ditto-app"]=t?.githubActionRequest==="true"?"github_action":"cli",r.headers.Authorization=e||g.apiToken,r}}n(ji,"defaultInterceptor");var Pi=n(e=>{let t=zo.default.create({});return t.interceptors.request.use(ji(e)),t},"getHttpClient"),D=Pi;async function Ye(e,t){try{return(await D({meta:t}).post("/v2/cli/swiftDriver",e)).data}catch(r){throw r instanceof Go.AxiosError?r:new Error("Sorry! We're having trouble reaching the Ditto API. Please try again later.")}}n(Ye,"generateSwiftDriver");async function qe(e,t){let r=t.components?.folders,o={...r&&{components:{folders:r}},projects:t.projects||[]},s=await Ye(o,e);return new Lt({path:g.outDir,content:s})}n(qe,"getSwiftDriverFile");var Uo=require("axios");var Wo=n((e,t,r)=>{if(!(e instanceof Uo.AxiosError))return new Error("Sorry! We're having trouble reaching the Ditto API. Please try again later.");if(e.response?.status===400){let o=t;return e.response?.data?.message&&(o=e.response.data.message),new Error(`${o}. ${r}`,{cause:e.response?.data})}return e},"handleError");async function Ho(e,t){try{let o=await D({meta:t}).get("/v2/textItems",{params:e});return Po.parse(o.data)}catch(r){throw Wo(r,"Invalid project filters","Please check your project filters and try again.")}}n(Ho,"fetchTextItems");async function Qo(e,t){try{let o=await D({meta:t}).get("/v2/textItems/export",{params:e});return Oo.parse(o.data)}catch(r){throw Wo(r,"Invalid params","Please check your request parameters and try again.")}}n(Qo,"exportTextItems");var Xo=require("axios");var Ko=n((e,t,r)=>{if(!(e instanceof Xo.AxiosError))return new Error("Sorry! We're having trouble reaching the Ditto API. Please try again later.");if(e.response?.status===400){let o=t;return e.response?.data?.message&&(o=e.response.data.message),new Error(`${o}. ${r}`,{cause:e.response?.data})}return e},"handleError");async function tn(e,t){try{let o=await D({meta:t}).get("/v2/components",{params:e});return bo.parse(o.data)}catch(r){throw Ko(r,"Invalid component filters","Please check your component filters and try again.")}}n(tn,"fetchComponents");async function en(e,t){try{let o=await D({meta:t}).get("/v2/components/export",{params:e});return Eo.parse(o.data)}catch(r){throw Ko(r,"Invalid params","Please check your params and try again.")}}n(en,"exportComponents");var ze=class ze extends E{constructor(t){super({filename:t.filename,path:t.path,extension:"json",content:t.content??{},metadata:t.metadata??{}})}get formattedContent(){return JSON.stringify(this.content,null,2)}};n(ze,"JSONOutputFile");var it=ze;var Ge=class Ge{constructor(t,r,o){this.output=t,this.projectConfig=r,this.outDir=t.outDir??g.outDir,this.outputFiles={},this.variablesOutputFile=new it({filename:"variables",path:this.outDir}),this.meta=o}generateTextItemPullFilter(){let t={projects:this.projectConfig.projects,variants:this.projectConfig.variants,statuses:this.projectConfig.statuses};return this.output.projects&&(t.projects=this.output.projects),this.output.variants&&(t.variants=this.output.variants),this.output.statuses&&(t.statuses=this.output.statuses),t}generateComponentPullFilter(){let t={...this.projectConfig.components?.folders&&{folders:this.projectConfig.components.folders},variants:this.projectConfig.variants,statuses:this.projectConfig.statuses};return this.output.components&&(t.folders=this.output.components?.folders),this.output.variants&&(t.variants=this.output.variants),this.output.statuses&&(t.statuses=this.output.statuses),t}generateQueryParams(t={}){let r={filter:JSON.stringify(t)};return this.projectConfig.richText&&(r.richText=this.projectConfig.richText),this.output.richText&&(r.richText=this.output.richText),r}async fetchAPIData(){return{}}transformAPIData(t){return[]}async format(){let t=await this.fetchAPIData(),r=await this.transformAPIData(t);await this.writeFiles(r)}async writeFiles(t){await Promise.all(t.map(r=>me(r.fullPath,r.formattedContent).then(()=>{C.writeLine(`Successfully saved to ${C.info(r.fullPath)}`)})))}};n(Ge,"BaseFormatter");var at=Ge;var rn=require("axios");async function Ue(e){try{let r=await D({meta:e}).get("/v2/projects");return Do.parse(r.data)}catch(t){throw t instanceof rn.AxiosError?t:new Error("Sorry! We're having trouble reaching the Ditto API. Please try again later.")}}n(Ue,"fetchProjects");var on=require("axios");async function We(e){try{let r=await D({meta:e}).get("/v2/variants");return ko.parse(r.data)}catch(t){throw t instanceof on.AxiosError?t:new Error("Sorry! We're having trouble reaching the Ditto API. Please try again later.")}}n(We,"fetchVariants");var j="base";var He=class He extends at{constructor(){super(...arguments);this.variants=[]}async fetchAPIData(){await this.fetchVariants();let[r,o]=await Promise.all([this.fetchTextItemsMap(),this.fetchComponentsMap()]);return{textItemsMap:r,componentsMap:o}}transformAPIData(r){return Object.entries(r.textItemsMap).forEach(([o,s])=>{Object.entries(s).forEach(([i,a])=>{let c=`${o}___${i||j}`;this.createOutputFile(o,c,i,a)})}),Object.entries(r.componentsMap).forEach(([o,s])=>{let i="components",a=`${i}___${o||j}`;this.createOutputFile(i,a,o,s)}),Object.values(this.outputFiles)}async fetchVariants(){let r=this.output.variants??this.projectConfig.variants??[];r.some(o=>o.id==="all")?(r=await We(this.meta),r.push({id:j})):r.length===0&&(r=[{id:j}]),this.variants=r}async fetchTextItemsMap(){if(!this.projectConfig.projects&&!this.output.projects)return{};let r=this.output.projects??this.projectConfig.projects??[],o={};r.length===0&&(r=await Ue(this.meta));let s=[];for(let i of r){o[i.id]={};for(let a of this.variants){let c=a.id===j?void 0:a.id,m={...super.generateQueryParams({projects:[{id:i.id}],statuses:super.generateTextItemPullFilter().statuses}),variantId:c,format:this.exportFormat},h=Qo(m,this.meta).then(u=>{o[i.id][a.id]=u});s.push(h)}}return await Promise.all(s),o}async fetchComponentsMap(){if(!this.projectConfig.components&&!this.output.components)return{};let r={},o=[];for(let s of this.variants){let i=s.id===j?void 0:s.id,{folders:a,statuses:c}=super.generateComponentPullFilter(),m={...super.generateQueryParams({folders:a,statuses:c}),variantId:i,format:this.exportFormat},h=en(m,this.meta).then(u=>{r[s.id]=u});o.push(h)}return await Promise.all(o),r}};n(He,"BaseExportFormatter");var B=He;var Qe=class Qe extends E{constructor(t){super({filename:t.filename,path:t.path,extension:"xml",content:t.content??"",metadata:t.metadata??{}})}get formattedContent(){return this.content}};n(Qe,"AndroidOutputFile");var Jt=Qe;var Xe=class Xe extends B{constructor(){super(...arguments);this.exportFormat="android"}createOutputFile(r,o,s,i){var a;(a=this.outputFiles)[o]??(a[o]=new Jt({filename:o,path:this.outDir,metadata:{variantId:s||j},content:i}))}};n(Xe,"AndroidXMLFormatter");var Vt=Xe;var Ke=class Ke extends E{constructor(t){super({filename:t.filename,path:t.path,extension:"json",content:t.content??{},metadata:t.metadata??{}})}get formattedContent(){return JSON.stringify(this.content,null,2)}};n(Ke,"ICUOutputFile");var Zt=Ke;var tr=class tr extends B{constructor(){super(...arguments);this.exportFormat="json_icu"}createOutputFile(r,o,s,i){var a;(a=this.outputFiles)[o]??(a[o]=new Zt({filename:o,path:this.outDir,metadata:{variantId:s||j},content:i}))}};n(tr,"JSONICUFormatter");var Bt=tr;var er=class er extends E{constructor(t){super({filename:t.filename,path:t.path,extension:"strings",content:t.content??"",metadata:t.metadata??{}})}get formattedContent(){return this.content}};n(er,"IOSStringsOutputFile");var Yt=er;var rr=class rr extends B{constructor(){super(...arguments);this.exportFormat="ios-strings"}createOutputFile(r,o,s,i){var c;let a=this.getVariantLocale(s);(c=this.outputFiles)[o]??(c[o]=new Yt({filename:a?r:o,path:this.getLocalesPath(s),metadata:{variantId:s||j},content:i}))}getVariantLocale(r){if(this.projectConfig.iosLocales)return this.projectConfig.iosLocales.find(o=>o[r])}getLocalesPath(r){let o=this.outDir,s=this.getVariantLocale(r);return s&&(o=`${g.outDir}/${s[r]}.lproj`),o}};n(rr,"IOSStringsFormatter");var qt=rr;var or=class or extends E{constructor(t){super({filename:t.filename,path:t.path,extension:"stringsdict",content:t.content??"",metadata:t.metadata??{}})}get formattedContent(){return this.content}};n(or,"IOSStringsDictOutputFile");var zt=or;var nr=class nr extends B{constructor(){super(...arguments);this.exportFormat="ios-stringsdict"}createOutputFile(r,o,s,i){var c;let a=this.getVariantLocale(s);(c=this.outputFiles)[o]??(c[o]=new zt({filename:a?r:o,path:this.getLocalesPath(s),metadata:{variantId:s||j},content:i}))}getVariantLocale(r){if(this.projectConfig.iosLocales)return this.projectConfig.iosLocales.find(o=>o[r])}getLocalesPath(r){let o=this.outDir,s=this.getVariantLocale(r);return s&&(o=`${g.outDir}/${s[r]}.lproj`),o}};n(nr,"IOSStringsDictFormatter");var Gt=nr;var nn=require("axios"),x=require("zod");var Ut=x.z.object({id:x.z.string(),name:x.z.string()}),Oi=Ut.merge(x.z.object({type:x.z.literal("number"),data:x.z.object({example:x.z.union([x.z.number(),x.z.string()]),fallback:x.z.union([x.z.number(),x.z.string()]).optional()})})),bi=Ut.merge(x.z.object({type:x.z.literal("string"),data:x.z.object({example:x.z.string(),fallback:x.z.string().optional()})})),Ei=Ut.merge(x.z.object({type:x.z.literal("hyperlink"),data:x.z.object({text:x.z.string(),url:x.z.string()})})),Di=Ut.merge(x.z.object({type:x.z.literal("list"),data:x.z.array(x.z.string())})),ki=Ut.merge(x.z.object({type:x.z.literal("map"),data:x.z.record(x.z.string())})),Mi=x.z.discriminatedUnion("type",[bi,Oi,Ei,Di,ki]),Ai=x.z.array(Mi);async function sr(e){try{let r=await D({meta:e}).get("/v2/variables");return Ai.parse(r.data)}catch(t){throw t instanceof nn.AxiosError?t:new Error("Sorry! We're having trouble reaching the Ditto API. Please try again later.")}}n(sr,"fetchVariables");function wt(e,...t){if(t.length>5)throw new Error("Maximum of 5 mixins supported");return t.reduce((r,o)=>o(r),e)}n(wt,"applyMixins");var ir=class ir extends E{constructor(r){super({filename:r.filename,path:r.path,extension:"js",content:r.content??"",metadata:r.metadata??{}});this.indentSpaces=2}get formattedContent(){return vo(this.content??"")}};n(ir,"JavascriptOutputFile");var ct=ir;function Wt(e){var t;return t=class extends e{constructor(){super(...arguments);this.indentSpaces=2}sanitizeStringForJSVariableName(s){return s.replace(/[^a-zA-Z0-9]/g,"_")}formatNamedModules(s){return s.map(i=>i.alias?`${i.name} as ${i.alias}`:i.name).sort().join(", ")}codegenNamedImport(s,i){return`import { ${this.formatNamedModules(s)} } from "${i}";
93
+ `)[J-1],w=Us(V,T.index,u.text,`${u.text}`);t[h].occurrences[i]||(t[h].occurrences[i]=[]),t[h].occurrences[i].push({lineNumber:J,preview:w})}}Object.keys(t[h].occurrences).length===0&&delete t[h]}}})}n(s,"handleFile");for(let i of r)o.push(s(i));return await Promise.all(o),t}n(Gs,"findComponentsInJSXFiles");function Us(e,t,r,o){return e.substring(0,t)+e.substring(t,e.length).replace(r,o)}n(Us,"replaceAt");var Ws=n(e=>{let t={};return Array.isArray(e)&&e.forEach(r=>{let[o,s]=r.split(":");t[o]=s}),t},"processMetaOption"),xo=Ws;var To=l(require("form-data")),Pe=l(require("fs"));async function Co(e,t){let r=O();if(!Pe.default.existsSync(e))return console.error("Failed to import file: couldn't find file at path "+e),{componentsInserted:0,firstImportedId:"null"};let o=new To.default;o.append("import",Pe.default.createReadStream(e));let s={method:"POST",url:"/v1/components/file",params:{...t.csvColumnMapping?.name?{name:`[${t.csvColumnMapping.name}]`}:{},...t.csvColumnMapping?.text?{text:t.csvColumnMapping.text}:{},...t.csvColumnMapping?.notes?{notes:t.csvColumnMapping.notes}:{},...t.csvColumnMapping?.status?{status:t.csvColumnMapping.status}:{},...t.csvColumnMapping?.tags?{tags:t.csvColumnMapping.tags}:{},...t.csvColumnMapping?.componentId?{componentId:t.csvColumnMapping.componentId}:{}},headers:{"content-type":"multipart/form-data"},data:o};try{let{data:i}=await r(s);return i}catch(i){return console.error("Failed to import file."),console.error(i.response?.data?.message||i.message),{componentsInserted:0,firstImportedId:"null"}}}n(Co,"importComponents");async function Io(e,t){if(e.endsWith(".csv")&&(!t.csvColumnMapping?.name||!t.csvColumnMapping?.text))throw new Error(".csv files require the --component-name and --text flags.");let r=await Co(e,t);console.log(JSON.stringify(r))}n(Io,"importComponents");async function So(e){let t=await ae(e);console.log(JSON.stringify(t))}n(So,"showComponentFolders");var Hs=["pull","none","project","project add","project remove"],Qs=[{name:"pull",description:"Sync copy from Ditto into the current working directory",flags:{"--sample-data":{description:"Include sample data. Currently only supports variants."}}},{name:"project",description:"Add a Ditto project to sync copy from",commands:[{name:"add",description:"Add a Ditto project to sync copy from"},{name:"remove",description:"Stop syncing copy from a Ditto project"}]},{name:"component-folders",description:"List component folders in your workspace. More information about component folders can be found here: https://www.dittowords.com/docs/component-folders.",flags:{"-s, --sample-data":{description:"Includes the sample components folder in the output"}}},{name:"generate-suggestions",description:"Find text that can be potentially replaced with Ditto text",flags:{"-d, --directory [value]":{description:"Directory to search for text"},"-f, --files [value]":{description:"Files to search for text (will override -d)",processor:n(e=>e.split(","),"processor")},"-cf, --component-folder [value]":{description:"Component folder to search for matches"}}},{name:"replace",description:"Find and replace Ditto text with code",flags:{"-ln, --line-numbers [value]":{description:"Only replace text on a specific line number",processor:n(e=>e.split(",").map(Number),"processor")}}},{name:"import-components",description:"Import components via a file. For more information please see: https://www.dittowords.com/docs/importing-string-files.",flags:{"-t, --text [value]":{description:"Text column index (.csv format only)"},"-n, --component-name [value]":{description:"Name column indexes (comma separated) (.csv format only)"},"-no, --notes [value]":{description:"Notes column index (.csv format only)"},"-t, --tags [value]":{description:"Tags column index (.csv format only)"},"-s, --status [value]":{description:"Status column index (.csv format only)"},"-c, --component-id [value]":{description:"Component ID column index (.csv format only)"}}}],Xs=n(()=>{Q.program.name("ditto-cli"),Qs.forEach(e=>{let t=Q.program.command(e.name).description(e.description).action(r=>Oe(e.name,r));e.flags&&Object.entries(e.flags).forEach(([r,{description:o,processor:s}])=>{s?t.option(r,o,s):t.option(r,o)}),"commands"in e&&e.commands&&e.commands.forEach(r=>{t.command(r.name).description(r.description).action((o,s)=>{if(e.name==="project"){let i=`${e.name} ${r.name}`;return Oe(i,s)}})})})},"setupCommands"),Ks=n(()=>{Q.program.option("-l, --legacy","Run in legacy mode"),Q.program.option("-m, --meta <data...>","Include arbitrary data in requests to the Ditto API. Ex: -m githubActionRequest:true trigger:manual"),Q.program.version(ut,"-v, --version","Output the current version")},"setupOptions"),Oe=n(async(e,t)=>{let r=Hs.includes(e)&&Br();if(r)try{await zr()}catch{await b("Exiting Ditto CLI...");return}let{meta:o}=Q.program.opts();switch(e){case"none":case"pull":return je({meta:xo(o),includeSampleData:t.sampleData||!1});case"project":case"project add":return r?void 0:so();case"project remove":return io();case"component-folders":return So({showSampleData:t.sampleData});case"generate-suggestions":return yo({directory:t.directory,files:t.files,componentFolder:t.componentFolder});case"replace":return mo(t.args,{...t?.lineNumbers?{lineNumbers:t.lineNumbers}:{}});case"import-components":{if(t.args.length===0){console.info("Please provide a file path.");return}return Io(t.args[0],{csvColumnMapping:{name:t.componentName,text:t.text,notes:t.notes,tags:t.tags,status:t.status,componentId:t.componentId}})}default:{await b("Exiting Ditto CLI...");return}}},"executeCommand"),ti=n(async()=>{if(Xs(),Ks(),process.argv.length<=2&&process.argv[1].includes("ditto-cli")){await Oe("none",[]);return}Q.program.parse(process.argv)},"legacyAppEntry"),wo=ti;var yn=l(require("@sentry/node")),tt=require("commander");var zo=require("os"),Tt=l(require("path")),Yo=l(require("crypto"));var Vo=require("zod"),Zo=l(require("fs"));var xt=l(require("path")),X=l(require("fs")),be=l(require("fs/promises"));function Rt(e,t=""){let r=xt.default.dirname(e);return X.default.existsSync(r)||X.default.mkdirSync(r),X.default.existsSync(e)?!1:(ei(e,t),!0)}n(Rt,"createFileIfMissingSync");function ei(e,t){X.default.existsSync(xt.default.dirname(e))||X.default.mkdirSync(xt.default.dirname(e),{recursive:!0}),X.default.writeFileSync(e,t,"utf-8")}n(ei,"writeFileSync");async function me(e,t){X.default.existsSync(xt.default.dirname(e))||await be.default.mkdir(xt.default.dirname(e),{recursive:!0}),await be.default.writeFile(e,t,"utf-8")}n(me,"writeFile");var vo=n(e=>e+(/[\r\n]$/.test(e)?"":`
94
+ `),"ensureEndsWithNewLine");var $e=l(require("js-yaml"));var v=require("zod");var d=require("zod");var Ee=d.z.enum(["NONE","WIP","REVIEW","FINAL"]),ri=d.z.enum(["zero","one","two","few","many","other"]),Fo=d.z.object({id:d.z.string(),text:d.z.string(),richText:d.z.string().optional(),status:d.z.string(),notes:d.z.string(),tags:d.z.array(d.z.string()),pluralForm:ri.nullable(),variableIds:d.z.array(d.z.string()),variantId:d.z.string().nullable()}),oi=Fo.extend({projectId:d.z.string()});function jo(e){return"projectId"in e}n(jo,"isTextItem");var Po=d.z.array(oi),ni=d.z.string(),si=d.z.record(d.z.string(),d.z.string()),Oo=d.z.union([ni,si]),ii=Fo.extend({folderId:d.z.string().nullable()}),bo=d.z.array(ii),ai=d.z.record(d.z.string(),d.z.string()),ci=d.z.string(),Eo=d.z.union([ci,ai]),pi=d.z.object({id:d.z.string(),name:d.z.string()}),Do=d.z.array(pi),mi=d.z.object({id:d.z.string(),name:d.z.string(),description:d.z.string().optional()}),ko=d.z.array(mi),li=d.z.object({id:d.z.string(),excludeNestedFolders:d.z.boolean().optional()}),Bp=d.z.object({projects:d.z.array(d.z.object({id:d.z.string()})).optional(),components:d.z.object({folders:d.z.array(li).optional()}).optional(),statuses:d.z.array(Ee).optional()});var L=v.z.object({projects:v.z.array(v.z.object({id:v.z.string()})).optional(),components:v.z.object({folders:v.z.array(v.z.object({id:v.z.string(),excludeNestedFolders:v.z.boolean().optional()})).optional()}).optional(),statuses:v.z.array(Ee).optional(),variants:v.z.array(v.z.object({id:v.z.string()})).optional(),outDir:v.z.string().optional(),richText:v.z.union([v.z.literal("html"),v.z.literal(!1)]).optional(),iosLocales:v.z.array(v.z.record(v.z.string(),v.z.string())).optional()});var $o=require("zod");var Y=require("zod");var De=L.extend({format:Y.z.literal("json"),framework:Y.z.undefined()}).strict(),ui=De.extend({framework:Y.z.literal("i18next"),type:Y.z.literal("module").or(Y.z.literal("commonjs")).optional()}).strict(),fi=De.extend({framework:Y.z.literal("vue-i18n"),type:Y.z.literal("module").or(Y.z.literal("commonjs")).optional()}).strict(),Ao=Y.z.discriminatedUnion("framework",[De,ui,fi]);var ke=require("zod");var Mo=L.extend({format:ke.z.literal("ios-strings"),framework:ke.z.undefined()}).strict();var Ae=require("zod");var Ro=L.extend({format:Ae.z.literal("ios-stringsdict"),framework:Ae.z.undefined()}).strict();var Me=require("zod");var No=L.extend({format:Me.z.literal("android"),framework:Me.z.undefined()}).strict();var Re=require("zod");var _o=L.extend({format:Re.z.literal("json_icu"),framework:Re.z.undefined()}).strict();var Lo=$o.z.union([...Ao.options,No,Mo,Ro,_o]);var _e=class _e extends Error{constructor({type:t,message:r,exitCode:o,data:s}){let i=r||"Something went wrong. Please contact support or try again later.";super(i),this.exitCode=o,this.type=t,this.data=s}};n(_e,"DittoError");var nt=_e;function Jo(e){return e instanceof nt}n(Jo,"isDittoError");function Ne(e,t){return e.type===t}n(Ne,"isDittoErrorType");var gi=L.extend({outputs:Vo.z.array(Lo)}).strict(),Le={projects:[],variants:[],statuses:[],components:{folders:[]},outputs:[{format:"json",framework:"i18next"}]};async function Bo(e){let t=hi(e.config);g.setProjectConfig(t)}n(Bo,"initProjectConfig");function hi(e=g.projectConfigFile,t=Le){let r=t;try{Rt(e,$e.default.dump(t));let s=Zo.default.readFileSync(e,"utf8");r=$e.default.load(s)}catch(s){throw new nt({type:"ConfigYamlLoadError",data:{rawErrorMessage:s.message},message:"Could not load the project config file. Please check the file path and that it is a valid YAML file."})}let o=gi.safeParse(r);if(!o.success)throw new nt({type:"ConfigParseError",data:{formattedError:JSON.stringify(o.error.flatten(),null,2),messagePrefix:"There is an error in your project config file."}});return o.data}n(hi,"readProjectConfigData");var Ct,K,Nt,_t,It,St,st,$t,Ve=class Ve{constructor(){q(this,Ct);q(this,K);q(this,Nt);q(this,_t);q(this,It);q(this,St);q(this,st);q(this,$t);N(this,Ct,process.env.DITTO_API_HOST||"https://api.dittowords.com"),N(this,K,process.env.DITTO_TOKEN),N(this,Nt,process.env.DITTO_CONFIG_FILE||Tt.default.join((0,zo.homedir)(),".config","ditto")),N(this,It,process.env.DITTO_PROJECT_CONFIG_FILE||Tt.default.normalize(Tt.default.join("ditto","config.yml"))),N(this,_t,Tt.default.normalize(Tt.default.dirname(R(this,It)))),N(this,St,Yo.default.randomUUID()),N(this,st,Le),N(this,$t,process.env.DITTO_OUT_DIR||this.projectConfigDir)}get apiHost(){return R(this,Ct)}set apiHost(t){N(this,Ct,t)}get apiToken(){return R(this,K)}get apiTokenOrThrow(){if(!R(this,K))throw new Error("No API Token found.");return R(this,K)}get configFile(){return R(this,Nt)}get projectConfigFile(){return R(this,It)}get clientId(){return R(this,St)}setClientId(t){N(this,St,t)}setApiToken(t){N(this,K,t)}get projectConfig(){return R(this,st)}setProjectConfig(t){N(this,st,t)}get selectedProjectConfigOutputs(){return R(this,st).outputs}get projectConfigDir(){return R(this,_t)}get outDir(){return this.projectConfig.outDir||R(this,$t)}};Ct=new WeakMap,K=new WeakMap,Nt=new WeakMap,_t=new WeakMap,It=new WeakMap,St=new WeakMap,st=new WeakMap,$t=new WeakMap,n(Ve,"AppContext");var Je=Ve,yi=new Je,g=yi;var U=l(require("chalk"));var xi=n(e=>U.default.magenta(e),"errorText"),Ti=n(e=>U.default.yellow(e),"warnText"),Ci=n(e=>U.default.blueBright(e),"info"),Ii=n(e=>U.default.green(e),"success"),Si=n(e=>U.default.blueBright.underline(e),"url"),wi=n(e=>U.default.grey(e),"subtle"),vi=n(e=>U.default.white(e),"write"),Fi=n(e=>U.default.bold(e),"bold"),ji=n(e=>console.log(e),"writeLine"),C={errorText:xi,warnText:Ti,info:Ci,success:Ii,url:Si,subtle:wi,write:vi,writeLine:ji,bold:Fi};var Ze=class Ze{constructor(t){this.filename=t.filename,this.path=t.path,this.extension=t.extension,this.content=t.content,this.metadata=t.metadata??{}}get fullPath(){return`${this.path}/${this.filename}.${this.extension}`}get filenameWithExtension(){return`${this.filename}.${this.extension}`}get formattedContent(){throw new Error("Not implemented")}};n(Ze,"OutputFile");var E=Ze;var Be=class Be extends E{constructor(t){super({filename:t.filename||"Ditto",path:t.path,extension:"swift",content:t.content??""})}get formattedContent(){return this.content}};n(Be,"SwiftOutputFile");var Lt=Be;var Go=require("axios");var qo=l(require("axios"));function Pi({token:e,meta:t}={}){return function(r){return r.baseURL=g.apiHost,r.headers["x-ditto-client-id"]=g.clientId,r.headers["x-ditto-app"]=t?.githubActionRequest==="true"?"github_action":"cli",r.headers.Authorization=e||g.apiToken,r}}n(Pi,"defaultInterceptor");var Oi=n(e=>{let t=qo.default.create({});return t.interceptors.request.use(Pi(e)),t},"getHttpClient"),D=Oi;async function ze(e,t){try{return(await D({meta:t}).post("/v2/cli/swiftDriver",e)).data}catch(r){throw r instanceof Go.AxiosError?r:new Error("Sorry! We're having trouble reaching the Ditto API. Please try again later.")}}n(ze,"generateSwiftDriver");async function Ye(e,t){let r=t.components?.folders,o={...r&&{components:{folders:r}},projects:t.projects||[]},s=await ze(o,e);return new Lt({path:g.outDir,content:s})}n(Ye,"getSwiftDriverFile");var Uo=require("axios");var Wo=n((e,t,r)=>{if(!(e instanceof Uo.AxiosError))return new Error("Sorry! We're having trouble reaching the Ditto API. Please try again later.");if(e.response?.status===400){let o=t;return e.response?.data?.message&&(o=e.response.data.message),new Error(`${o}. ${r}`,{cause:e.response?.data})}return e},"handleError");async function Ho(e,t){try{let o=await D({meta:t}).get("/v2/textItems",{params:e});return Po.parse(o.data)}catch(r){throw Wo(r,"Invalid project filters","Please check your project filters and try again.")}}n(Ho,"fetchTextItems");async function Qo(e,t){try{let o=await D({meta:t}).get("/v2/textItems/export",{params:e});return Oo.parse(o.data)}catch(r){throw Wo(r,"Invalid params","Please check your request parameters and try again.")}}n(Qo,"exportTextItems");var Xo=require("axios");var Ko=n((e,t,r)=>{if(!(e instanceof Xo.AxiosError))return new Error("Sorry! We're having trouble reaching the Ditto API. Please try again later.");if(e.response?.status===400){let o=t;return e.response?.data?.message&&(o=e.response.data.message),new Error(`${o}. ${r}`,{cause:e.response?.data})}return e},"handleError");async function tn(e,t){try{let o=await D({meta:t}).get("/v2/components",{params:e});return bo.parse(o.data)}catch(r){throw Ko(r,"Invalid component filters","Please check your component filters and try again.")}}n(tn,"fetchComponents");async function en(e,t){try{let o=await D({meta:t}).get("/v2/components/export",{params:e});return Eo.parse(o.data)}catch(r){throw Ko(r,"Invalid params","Please check your params and try again.")}}n(en,"exportComponents");var qe=class qe extends E{constructor(t){super({filename:t.filename,path:t.path,extension:"json",content:t.content??{},metadata:t.metadata??{}})}get formattedContent(){return JSON.stringify(this.content,null,2)}};n(qe,"JSONOutputFile");var it=qe;var Ge=class Ge{constructor(t,r,o){this.output=t,this.projectConfig=r,this.outDir=t.outDir??g.outDir,this.outputFiles={},this.variablesOutputFile=new it({filename:"variables",path:this.outDir}),this.meta=o}generateTextItemPullFilter(){let t={projects:this.projectConfig.projects,variants:this.projectConfig.variants,statuses:this.projectConfig.statuses};return this.output.projects&&(t.projects=this.output.projects),this.output.variants&&(t.variants=this.output.variants),this.output.statuses&&(t.statuses=this.output.statuses),t}generateComponentPullFilter(){let t={...this.projectConfig.components?.folders&&{folders:this.projectConfig.components.folders},variants:this.projectConfig.variants,statuses:this.projectConfig.statuses};return this.output.components&&(t.folders=this.output.components?.folders),this.output.variants&&(t.variants=this.output.variants),this.output.statuses&&(t.statuses=this.output.statuses),t}generateQueryParams(t={}){let r={filter:JSON.stringify(t)};return this.projectConfig.richText&&(r.richText=this.projectConfig.richText),this.output.richText&&(r.richText=this.output.richText),r}async fetchAPIData(){return{}}transformAPIData(t){return[]}async format(){let t=await this.fetchAPIData(),r=await this.transformAPIData(t);await this.writeFiles(r)}async writeFiles(t){await Promise.all(t.map(r=>me(r.fullPath,r.formattedContent).then(()=>{C.writeLine(`Successfully saved to ${C.info(r.fullPath)}`)})))}};n(Ge,"BaseFormatter");var at=Ge;var rn=require("axios");async function Ue(e){try{let r=await D({meta:e}).get("/v2/projects");return Do.parse(r.data)}catch(t){throw t instanceof rn.AxiosError?t:new Error("Sorry! We're having trouble reaching the Ditto API. Please try again later.")}}n(Ue,"fetchProjects");var on=require("axios");async function We(e){try{let r=await D({meta:e}).get("/v2/variants");return ko.parse(r.data)}catch(t){throw t instanceof on.AxiosError?t:new Error("Sorry! We're having trouble reaching the Ditto API. Please try again later.")}}n(We,"fetchVariants");var j="base";var He=class He extends at{constructor(){super(...arguments);this.variants=[]}async fetchAPIData(){await this.fetchVariants();let[r,o]=await Promise.all([this.fetchTextItemsMap(),this.fetchComponentsMap()]);return{textItemsMap:r,componentsMap:o}}transformAPIData(r){return Object.entries(r.textItemsMap).forEach(([o,s])=>{Object.entries(s).forEach(([i,a])=>{let c=`${o}___${i||j}`;this.createOutputFile(o,c,i,a)})}),Object.entries(r.componentsMap).forEach(([o,s])=>{let i="components",a=`${i}___${o||j}`;this.createOutputFile(i,a,o,s)}),Object.values(this.outputFiles)}async fetchVariants(){let r=this.output.variants??this.projectConfig.variants??[];r.some(o=>o.id==="all")?(r=await We(this.meta),r.push({id:j})):r.length===0&&(r=[{id:j}]),this.variants=r}async fetchTextItemsMap(){if(!this.projectConfig.projects&&!this.output.projects)return{};let r=this.output.projects??this.projectConfig.projects??[],o={};r.length===0&&(r=await Ue(this.meta));let s=[];for(let i of r){o[i.id]={};for(let a of this.variants){let c=a.id===j?void 0:a.id,m={...super.generateQueryParams({projects:[{id:i.id}],statuses:super.generateTextItemPullFilter().statuses}),variantId:c,format:this.exportFormat},h=Qo(m,this.meta).then(u=>{o[i.id][a.id]=u});s.push(h)}}return await Promise.all(s),o}async fetchComponentsMap(){if(!this.projectConfig.components&&!this.output.components)return{};let r={},o=[];for(let s of this.variants){let i=s.id===j?void 0:s.id,{folders:a,statuses:c}=super.generateComponentPullFilter(),m={...super.generateQueryParams({folders:a,statuses:c}),variantId:i,format:this.exportFormat},h=en(m,this.meta).then(u=>{r[s.id]=u});o.push(h)}return await Promise.all(o),r}};n(He,"BaseExportFormatter");var B=He;var Qe=class Qe extends E{constructor(t){super({filename:t.filename,path:t.path,extension:"xml",content:t.content??"",metadata:t.metadata??{}})}get formattedContent(){return this.content}};n(Qe,"AndroidOutputFile");var Jt=Qe;var Xe=class Xe extends B{constructor(){super(...arguments);this.exportFormat="android"}createOutputFile(r,o,s,i){var a;(a=this.outputFiles)[o]??(a[o]=new Jt({filename:o,path:this.outDir,metadata:{variantId:s||j},content:i}))}};n(Xe,"AndroidXMLFormatter");var Vt=Xe;var Ke=class Ke extends E{constructor(t){super({filename:t.filename,path:t.path,extension:"json",content:t.content??{},metadata:t.metadata??{}})}get formattedContent(){return JSON.stringify(this.content,null,2)}};n(Ke,"ICUOutputFile");var Zt=Ke;var tr=class tr extends B{constructor(){super(...arguments);this.exportFormat="json_icu"}createOutputFile(r,o,s,i){var a;(a=this.outputFiles)[o]??(a[o]=new Zt({filename:o,path:this.outDir,metadata:{variantId:s||j},content:i}))}};n(tr,"JSONICUFormatter");var Bt=tr;var er=class er extends E{constructor(t){super({filename:t.filename,path:t.path,extension:"strings",content:t.content??"",metadata:t.metadata??{}})}get formattedContent(){return this.content}};n(er,"IOSStringsOutputFile");var zt=er;var rr=class rr extends B{constructor(){super(...arguments);this.exportFormat="ios-strings"}createOutputFile(r,o,s,i){var c;let a=this.getVariantLocale(s);(c=this.outputFiles)[o]??(c[o]=new zt({filename:a?r:o,path:this.getLocalesPath(s),metadata:{variantId:s||j},content:i}))}getVariantLocale(r){if(this.projectConfig.iosLocales)return this.projectConfig.iosLocales.find(o=>o[r])}getLocalesPath(r){let o=this.outDir,s=this.getVariantLocale(r);return s&&(o=`${g.outDir}/${s[r]}.lproj`),o}};n(rr,"IOSStringsFormatter");var Yt=rr;var or=class or extends E{constructor(t){super({filename:t.filename,path:t.path,extension:"stringsdict",content:t.content??"",metadata:t.metadata??{}})}get formattedContent(){return this.content}};n(or,"IOSStringsDictOutputFile");var qt=or;var nr=class nr extends B{constructor(){super(...arguments);this.exportFormat="ios-stringsdict"}createOutputFile(r,o,s,i){var c;let a=this.getVariantLocale(s);(c=this.outputFiles)[o]??(c[o]=new qt({filename:a?r:o,path:this.getLocalesPath(s),metadata:{variantId:s||j},content:i}))}getVariantLocale(r){if(this.projectConfig.iosLocales)return this.projectConfig.iosLocales.find(o=>o[r])}getLocalesPath(r){let o=this.outDir,s=this.getVariantLocale(r);return s&&(o=`${g.outDir}/${s[r]}.lproj`),o}};n(nr,"IOSStringsDictFormatter");var Gt=nr;var nn=require("axios"),x=require("zod");var Ut=x.z.object({id:x.z.string(),name:x.z.string()}),bi=Ut.merge(x.z.object({type:x.z.literal("number"),data:x.z.object({example:x.z.union([x.z.number(),x.z.string()]),fallback:x.z.union([x.z.number(),x.z.string()]).optional()})})),Ei=Ut.merge(x.z.object({type:x.z.literal("string"),data:x.z.object({example:x.z.string(),fallback:x.z.string().optional()})})),Di=Ut.merge(x.z.object({type:x.z.literal("hyperlink"),data:x.z.object({text:x.z.string(),url:x.z.string()})})),ki=Ut.merge(x.z.object({type:x.z.literal("list"),data:x.z.array(x.z.string())})),Ai=Ut.merge(x.z.object({type:x.z.literal("map"),data:x.z.record(x.z.string())})),Mi=x.z.discriminatedUnion("type",[Ei,bi,Di,ki,Ai]),Ri=x.z.array(Mi);async function sr(e){try{let r=await D({meta:e}).get("/v2/variables");return Ri.parse(r.data)}catch(t){throw t instanceof nn.AxiosError?t:new Error("Sorry! We're having trouble reaching the Ditto API. Please try again later.")}}n(sr,"fetchVariables");function wt(e,...t){if(t.length>5)throw new Error("Maximum of 5 mixins supported");return t.reduce((r,o)=>o(r),e)}n(wt,"applyMixins");var ir=class ir extends E{constructor(r){super({filename:r.filename,path:r.path,extension:"js",content:r.content??"",metadata:r.metadata??{}});this.indentSpaces=2}get formattedContent(){return vo(this.content??"")}};n(ir,"JavascriptOutputFile");var ct=ir;function Wt(e){var t;return t=class extends e{constructor(){super(...arguments);this.indentSpaces=2}sanitizeStringForJSVariableName(s){return s.replace(/[^a-zA-Z0-9]/g,"_")}formatNamedModules(s){return s.map(i=>i.alias?`${i.name} as ${i.alias}`:i.name).sort().join(", ")}codegenNamedImport(s,i){return`import { ${this.formatNamedModules(s)} } from "${i}";
95
95
  `}codegenNamedRequire(s,i){return`const { ${this.formatNamedModules(s)} } = require("${i}");
96
96
  `}codegenDefaultImport(s,i){return`import ${s} from "${i}";
97
97
  `}codegenDefaultRequire(s,i){return`const ${s} = require("${i}");
@@ -109,19 +109,19 @@ We saved your updated configuration to: ${p.info(f.PROJECT_CONFIG_FILE)}
109
109
  `;for(let c of a)o+=`${this.codegenPad(2)}...${this.sanitizeStringForJSVariableName(c.filename)},
110
110
  `;o+=`${this.codegenPad(1)}}${s<r.length-1?`,
111
111
  `:`
112
- `}`}return o+="}",o}};n(pr,"VueI18nFramework");var Qt=pr;function sn(e){if(!e.framework)throw new Error("Only call this function with a framework output");let t=e.framework;switch(t){case"i18next":return new Ht(e);case"vue-i18n":return new Qt(e);default:throw new Error(`Unsupported JSON framework: ${t}`)}}n(sn,"getFrameworkProcessor");var mr=class mr extends wt(at){async fetchAPIData(){let t=await this.fetchTextItems(),r=await this.fetchComponents(),s=(await this.fetchVariables()).reduce((i,a)=>(i[a.id]=a,i),{});return{textItems:t,variablesById:s,components:r}}transformAPIData(t){for(let o=0;o<t.textItems.length;o++){let s=t.textItems[o];this.transformAPITextEntity(s,t.variablesById)}for(let o=0;o<t.components.length;o++){let s=t.components[o];this.transformAPITextEntity(s,t.variablesById)}let r=[...Object.values(this.outputFiles),this.variablesOutputFile];return this.output.framework&&r.push(...sn(this.output).process(this.outputFiles)),r}transformAPITextEntity(t,r){var m;let o=jo(t)?`${t.projectId}___${t.variantId||j}`:`components___${t.variantId||j}`;(m=this.outputFiles)[o]??(m[o]=new it({filename:o,path:this.outDir,metadata:{variantId:t.variantId||j}}));let s=this.output.richText==="html",i=this.projectConfig.richText==="html"&&this.output.richText!==!1,c=(s||i)&&t.richText?t.richText:t.text;this.outputFiles[o].content[t.id]=c;for(let h of t.variableIds){let u=r[h];this.variablesOutputFile.content[h]=u.data}}async fetchTextItems(){if(!this.projectConfig.projects&&!this.output.projects)return[];let t=super.generateTextItemPullFilter();return await Ho(super.generateQueryParams(t),this.meta)}async fetchComponents(){if(!this.projectConfig.components&&!this.output.components)return[];let t=super.generateComponentPullFilter();return await tn(super.generateQueryParams(t),this.meta)}async fetchVariables(){return await sr(this.meta)}};n(mr,"JSONFormatter");var Xt=mr;function lr(e,t,r){let o=e.format;switch(o){case"json":return new Xt(e,t,r).format();case"android":return new Vt(e,t,r).format();case"ios-strings":return new qt(e,t,r).format();case"ios-stringsdict":return new Gt(e,t,r).format();case"json_icu":return new Bt(e,t,r).format();default:throw new Error(`Unsupported output format: ${o}`)}}n(lr,"formatOutput");var Ri=new Set(["ios-strings","ios-stringsdict"]),an=n(async e=>{let t=(g.projectConfig.iosLocales??[]).length>0,o=g.selectedProjectConfigOutputs.some(s=>Ri.has(s.format))&&t;for(let s of g.selectedProjectConfigOutputs)await lr(s,g.projectConfig,e);if(o){let s=await qe(e,g.projectConfig);await me(s.fullPath,s.formattedContent),C.writeLine(`Successfully saved to ${C.info(s.fullPath)}`)}},"pull");var cn=l(require("@sentry/node"));async function vt(e,t=2){e&&C.writeLine(`
112
+ `}`}return o+="}",o}};n(pr,"VueI18nFramework");var Qt=pr;function sn(e){if(!e.framework)throw new Error("Only call this function with a framework output");let t=e.framework;switch(t){case"i18next":return new Ht(e);case"vue-i18n":return new Qt(e);default:throw new Error(`Unsupported JSON framework: ${t}`)}}n(sn,"getFrameworkProcessor");var mr=class mr extends wt(at){async fetchAPIData(){let t=await this.fetchTextItems(),r=await this.fetchComponents(),s=(await this.fetchVariables()).reduce((i,a)=>(i[a.id]=a,i),{});return{textItems:t,variablesById:s,components:r}}transformAPIData(t){for(let o=0;o<t.textItems.length;o++){let s=t.textItems[o];this.transformAPITextEntity(s,t.variablesById)}for(let o=0;o<t.components.length;o++){let s=t.components[o];this.transformAPITextEntity(s,t.variablesById)}let r=[...Object.values(this.outputFiles),this.variablesOutputFile];return this.output.framework&&r.push(...sn(this.output).process(this.outputFiles)),r}transformAPITextEntity(t,r){var m;let o=jo(t)?`${t.projectId}___${t.variantId||j}`:`components___${t.variantId||j}`;(m=this.outputFiles)[o]??(m[o]=new it({filename:o,path:this.outDir,metadata:{variantId:t.variantId||j}}));let s=this.output.richText==="html",i=this.projectConfig.richText==="html"&&this.output.richText!==!1,c=(s||i)&&t.richText?t.richText:t.text;this.outputFiles[o].content[t.id]=c;for(let h of t.variableIds){let u=r[h];this.variablesOutputFile.content[h]=u.data}}async fetchTextItems(){if(!this.projectConfig.projects&&!this.output.projects)return[];let t=super.generateTextItemPullFilter();return await Ho(super.generateQueryParams(t),this.meta)}async fetchComponents(){if(!this.projectConfig.components&&!this.output.components)return[];let t=super.generateComponentPullFilter();return await tn(super.generateQueryParams(t),this.meta)}async fetchVariables(){return await sr(this.meta)}};n(mr,"JSONFormatter");var Xt=mr;function lr(e,t,r){let o=e.format;switch(o){case"json":return new Xt(e,t,r).format();case"android":return new Vt(e,t,r).format();case"ios-strings":return new Yt(e,t,r).format();case"ios-stringsdict":return new Gt(e,t,r).format();case"json_icu":return new Bt(e,t,r).format();default:throw new Error(`Unsupported output format: ${o}`)}}n(lr,"formatOutput");var Ni=new Set(["ios-strings","ios-stringsdict"]),an=n(async e=>{let t=(g.projectConfig.iosLocales??[]).length>0,o=g.selectedProjectConfigOutputs.some(s=>Ni.has(s.format))&&t;for(let s of g.selectedProjectConfigOutputs)await lr(s,g.projectConfig,e);if(o){let s=await Ye(e,g.projectConfig);await me(s.fullPath,s.formattedContent),C.writeLine(`Successfully saved to ${C.info(s.fullPath)}`)}},"pull");var cn=l(require("@sentry/node"));async function vt(e,t=2){e&&C.writeLine(`
113
113
  ${e}
114
- `),await cn.flush(),process.exit(t)}n(vt,"quit");var gn=l(require("fs"));var ur=l(require("fs")),fr=l(require("js-yaml")),Ft=require("zod");var Ni=Ft.z.record(Ft.z.string(),Ft.z.array(Ft.z.object({token:Ft.z.string()})));function le(e=g.configFile){Rt(e);let t=ur.default.readFileSync(e,"utf8"),r=fr.default.load(t),o=Ni.safeParse(r);return o.success?o.data:{}}n(le,"readGlobalConfigData");function _i(e,t){Rt(e);let r=le(e),o=fr.default.dump({...r,...t});ur.default.writeFileSync(e,o,"utf8")}n(_i,"writeGlobalConfigData");function pn(e,t,r){let o=le(e);o[t]=[{token:r}],_i(e,o)}n(pn,"saveToken");var dn=l(require("@sentry/node"));var ln=require("axios");async function Kt(e){try{return(await D({token:e}).get("/token-check")).status===200?{success:!0}:{success:!1,output:[C.errorText("This API key isn't valid. Please try another.")]}}catch(t){return t instanceof ln.AxiosError?t.code==="ENOTFOUND"?{success:!1,output:[C.errorText(`Can't connect to API: ${C.url(g.apiHost)}`)]}:t.response?.status===401||t.response?.status===404?{success:!1,output:[C.errorText("This API key isn't valid. Please try another.")]}:{success:!1,output:[C.errorText("Sorry! We're having trouble reaching the Ditto API. Please try again later.")]}:{success:!1,output:[C.warnText("Sorry! We're having trouble reaching the Ditto API. Please try again later.")]}}}n(Kt,"checkToken");var un=require("enquirer");var $i=n(async e=>{let t=await Kt(e);return t.success?!0:t.output?.join(`
115
- `)||"Invalid API key"},"validate");async function dr(){return await(0,un.prompt)({type:"input",name:"token",message:"What is your API key?",validate:$i})}n(dr,"promptForApiToken");async function gr(){let t=`To get started, you'll need your Ditto API key. You can find this at: ${C.url("https://app.dittowords.com/developers/api-keys")}.`;return C.writeLine(t),(await dr()).token}n(gr,"collectToken");var fn=l(require("url"));function te(e){return e.includes("://")?fn.default.parse(e).hostname||"":e}n(te,"getURLHostname");async function jt(e=g.apiHost){try{let t=await gr();C.writeLine(`Thanks for authenticating. We'll save the key to: ${C.info(g.configFile)}
114
+ `),await cn.flush(),process.exit(t)}n(vt,"quit");var gn=l(require("fs"));var ur=l(require("fs")),fr=l(require("js-yaml")),Ft=require("zod");var _i=Ft.z.record(Ft.z.string(),Ft.z.array(Ft.z.object({token:Ft.z.string()})));function le(e=g.configFile){Rt(e);let t=ur.default.readFileSync(e,"utf8"),r=fr.default.load(t),o=_i.safeParse(r);return o.success?o.data:{}}n(le,"readGlobalConfigData");function $i(e,t){Rt(e);let r=le(e),o=fr.default.dump({...r,...t});ur.default.writeFileSync(e,o,"utf8")}n($i,"writeGlobalConfigData");function pn(e,t,r){let o=le(e);o[t]=[{token:r}],$i(e,o)}n(pn,"saveToken");var dn=l(require("@sentry/node"));var ln=require("axios");async function Kt(e){try{return(await D({token:e}).get("/token-check")).status===200?{success:!0}:{success:!1,output:[C.errorText("This API key isn't valid. Please try another.")]}}catch(t){return t instanceof ln.AxiosError?t.code==="ENOTFOUND"?{success:!1,output:[C.errorText(`Can't connect to API: ${C.url(g.apiHost)}`)]}:t.response?.status===401||t.response?.status===404?{success:!1,output:[C.errorText("This API key isn't valid. Please try another.")]}:{success:!1,output:[C.errorText("Sorry! We're having trouble reaching the Ditto API. Please try again later.")]}:{success:!1,output:[C.warnText("Sorry! We're having trouble reaching the Ditto API. Please try again later.")]}}}n(Kt,"checkToken");var un=require("enquirer");var Li=n(async e=>{let t=await Kt(e);return t.success?!0:t.output?.join(`
115
+ `)||"Invalid API key"},"validate");async function dr(){return await(0,un.prompt)({type:"input",name:"token",message:"What is your API key?",validate:Li})}n(dr,"promptForApiToken");async function gr(){let t=`To get started, you'll need your Ditto API key. You can find this at: ${C.url("https://app.dittowords.com/developers/api-keys")}.`;return C.writeLine(t),(await dr()).token}n(gr,"collectToken");var fn=l(require("url"));function te(e){return e.includes("://")?fn.default.parse(e).hostname||"":e}n(te,"getURLHostname");async function jt(e=g.apiHost){try{let t=await gr();C.writeLine(`Thanks for authenticating. We'll save the key to: ${C.info(g.configFile)}
116
116
  `);let r=te(e);return pn(g.configFile,r,t),g.setApiToken(t),t}catch(t){if(t==="")return await vt("",0),"";let r=dn.captureException(t),o=`
117
117
 
118
- Error ID: ${C.info(r)}`;return await vt(C.errorText("Something went wrong. Please contact support or try again later.")+o),""}}n(jt,"collectAndSaveToken");async function ue(e){return(await Kt(e)).success?e:await jt()}n(ue,"validateToken");async function hr(){if(g.apiToken)return await ue(g.apiToken);if(!gn.default.existsSync(g.configFile))return await jt();let e=le(g.configFile),t=te(g.apiHost);return!e[t]||!e[t][0]||e[t][0].token===""?await jt(t):await ue(e[t][0].token)}n(hr,"initAPIToken");var Li=n(e=>{let t={};return Array.isArray(e)&&e.forEach(r=>{let o=r.split(":");if(o.length>2)return;let[s,i]=o;t[s]=i}),t},"processCommandMetaFlag"),hn=Li;var Ji=[{name:"pull",description:"Sync copy from Ditto",flags:{"-c, --config [value]":{description:"Relative path to the project config file. Defaults to `./ditto/config.yml`. Alternatively, you can set the DITTO_PROJECT_CONFIG_FILE environment variable."}}}],Vi=n(()=>{tt.program.name("ditto-cli"),Ji.forEach(e=>{let t=tt.program.command(e.name).description(e.description).action(r=>Bi(e.name,r));e.flags&&Object.entries(e.flags).forEach(([r,{description:o,processor:s}])=>{s?t.option(r,o,s):t.option(r,o)})})},"setupCommands"),Zi=n(()=>{tt.program.option("--legacy","Run in legacy mode"),tt.program.option("-m, --meta <data...>","Include arbitrary data in requests to the Ditto API. Ex: -m githubActionRequest:true trigger:manual"),tt.program.version(ut,"-v, --version","Output the current version")},"setupOptions"),Bi=n(async(e,t)=>{try{let r=t.opts(),o=await hr();g.setApiToken(o),await Bo(r);let{meta:s}=tt.program.opts();switch(e){case"none":case"pull":return await an(hn(s));default:{await vt(`Invalid command: ${e}. Exiting Ditto CLI...`);return}}}catch(r){process.env.DEBUG==="true"&&console.error(C.info(`Development stack trace:
118
+ Error ID: ${C.info(r)}`;return await vt(C.errorText("Something went wrong. Please contact support or try again later.")+o),""}}n(jt,"collectAndSaveToken");async function ue(e){return(await Kt(e)).success?e:await jt()}n(ue,"validateToken");async function hr(){if(g.apiToken)return await ue(g.apiToken);if(!gn.default.existsSync(g.configFile))return await jt();let e=le(g.configFile),t=te(g.apiHost);return!e[t]||!e[t][0]||e[t][0].token===""?await jt(t):await ue(e[t][0].token)}n(hr,"initAPIToken");var Ji=n(e=>{let t={};return Array.isArray(e)&&e.forEach(r=>{let o=r.split(":");if(o.length>2)return;let[s,i]=o;t[s]=i}),t},"processCommandMetaFlag"),hn=Ji;var Vi=[{name:"pull",description:"Sync copy from Ditto",flags:{"-c, --config [value]":{description:"Relative path to the project config file. Defaults to `./ditto/config.yml`. Alternatively, you can set the DITTO_PROJECT_CONFIG_FILE environment variable."}}}],Zi=n(()=>{tt.program.name("ditto-cli"),Vi.forEach(e=>{let t=tt.program.command(e.name).description(e.description).action(r=>zi(e.name,r));e.flags&&Object.entries(e.flags).forEach(([r,{description:o,processor:s}])=>{s?t.option(r,o,s):t.option(r,o)})})},"setupCommands"),Bi=n(()=>{tt.program.option("--legacy","Run in legacy mode"),tt.program.option("-m, --meta <data...>","Include arbitrary data in requests to the Ditto API. Ex: -m githubActionRequest:true trigger:manual"),tt.program.version(ut,"-v, --version","Output the current version")},"setupOptions"),zi=n(async(e,t)=>{try{let r=t.opts(),o=await hr();g.setApiToken(o),await Bo(r);let{meta:s}=tt.program.opts();switch(e){case"none":case"pull":return await an(hn(s));default:{await vt(`Invalid command: ${e}. Exiting Ditto CLI...`);return}}}catch(r){process.env.DEBUG==="true"&&console.error(C.info(`Development stack trace:
119
119
  `),r);let o,s,i="Something went wrong. Please contact support or try again later.";Jo(r)&&(s=r.exitCode,Ne(r,"ConfigYamlLoadError")?i=r.message:Ne(r,"ConfigParseError")&&(i=`${r.data.messagePrefix}
120
120
 
121
121
  ${r.data.formattedError}`),o={extra:{message:i,...r.data||{}}});let a=yn.captureException(r,o),c=`
122
122
 
123
- Error ID: ${C.info(a)}`;return await vt(C.errorText(i)+c,s)}},"executeCommand"),Yi=n(async()=>{Vi(),Zi(),tt.program.parse(process.argv)},"appEntry"),xn=Yi;var qi="production";Tn.init({dsn:"https://9c1d99fa4267f54c6b914f720b4ed3a2@o979374.ingest.sentry.io/4505705213919232",environment:qi,release:ut});var zi=n(async()=>{process.argv.includes("--legacy")?(console.log(C.warnText(`
123
+ Error ID: ${C.info(a)}`;return await vt(C.errorText(i)+c,s)}},"executeCommand"),Yi=n(async()=>{Zi(),Bi(),tt.program.parse(process.argv)},"appEntry"),xn=Yi;var qi="production";Tn.init({dsn:"https://9c1d99fa4267f54c6b914f720b4ed3a2@o979374.ingest.sentry.io/4505705213919232",environment:qi,release:ut});var Gi=n(async()=>{process.argv.includes("--legacy")?(console.log(C.warnText(`
124
124
  Ditto CLI is running in legacy mode. This mode is deprecated and will be removed in a future release.
125
- `)),wo()):xn()},"main");zi();
125
+ `)),wo()):xn()},"main");Gi();
126
126
 
127
- //# debugId=398d2b1f-57cc-53c0-ae27-83db0f9233e7
127
+ //# debugId=a5767fcf-c338-50c5-8415-301025367dcf
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dittowords/cli",
3
- "version": "5.3.0",
3
+ "version": "5.3.1",
4
4
  "description": "Command Line Interface for Ditto (dittowords.com).",
5
5
  "license": "MIT",
6
6
  "main": "bin/ditto.js",
@@ -8,7 +8,9 @@
8
8
  "prepublishOnly": "ENV=production node esbuild.mjs && sentry-cli sourcemaps inject ./bin && npx sentry-cli sourcemaps upload ./bin --release=\"$(cat package.json | jq -r '.version')\"",
9
9
  "prepare": "husky install",
10
10
  "start": "node esbuild.mjs && node --enable-source-maps --require dotenv/config bin/ditto.js",
11
- "sync": "node esbuild.mjs && node --enable-source-maps --require dotenv/config bin/ditto.js pull"
11
+ "sync": "node esbuild.mjs && node --enable-source-maps --require dotenv/config bin/ditto.js pull",
12
+ "test": "jest",
13
+ "test:watch": "jest --watchAll"
12
14
  },
13
15
  "repository": {
14
16
  "type": "git",