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