glotfile 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -0
  3. package/bin/glotfile.js +7 -0
  4. package/dist/server/cli.js +5172 -0
  5. package/dist/server/server.js +3936 -0
  6. package/dist/ui/assets/ad-B18i8NGa.svg +150 -0
  7. package/dist/ui/assets/ae-CZRtWSox.svg +6 -0
  8. package/dist/ui/assets/af-C77Rf6cE.svg +81 -0
  9. package/dist/ui/assets/ag-C8MykuG2.svg +14 -0
  10. package/dist/ui/assets/ai-Dmedkf4v.svg +29 -0
  11. package/dist/ui/assets/al-10QRkakw.svg +5 -0
  12. package/dist/ui/assets/am-DMt4_dd4.svg +5 -0
  13. package/dist/ui/assets/ao-tXuRa6vm.svg +13 -0
  14. package/dist/ui/assets/aq-CF5jO-0h.svg +5 -0
  15. package/dist/ui/assets/ar-Be8Ju1cG.svg +32 -0
  16. package/dist/ui/assets/arab-C4CYPgyC.svg +109 -0
  17. package/dist/ui/assets/as-Dekqy8Of.svg +72 -0
  18. package/dist/ui/assets/asean-WMtZ-US_.svg +13 -0
  19. package/dist/ui/assets/at-DGA_6m5E.svg +4 -0
  20. package/dist/ui/assets/au-DAHDIuPI.svg +8 -0
  21. package/dist/ui/assets/aw-W0PWLK5p.svg +186 -0
  22. package/dist/ui/assets/ax-DvLIy84U.svg +18 -0
  23. package/dist/ui/assets/az-Bk-bYNxy.svg +8 -0
  24. package/dist/ui/assets/ba-WdDiSMvP.svg +12 -0
  25. package/dist/ui/assets/bb-DJxbaxmT.svg +6 -0
  26. package/dist/ui/assets/bd-BF9t1-60.svg +4 -0
  27. package/dist/ui/assets/be-CLLkK3PN.svg +7 -0
  28. package/dist/ui/assets/bf-YclsoDuF.svg +7 -0
  29. package/dist/ui/assets/bg-GUQenraa.svg +5 -0
  30. package/dist/ui/assets/bh-BQqEGq6F.svg +4 -0
  31. package/dist/ui/assets/bi-CRmKY6RQ.svg +15 -0
  32. package/dist/ui/assets/bj-14PhO9bM.svg +14 -0
  33. package/dist/ui/assets/bl-4CI2YcwX.svg +5 -0
  34. package/dist/ui/assets/bm-BeYgB2z9.svg +97 -0
  35. package/dist/ui/assets/bn-B6T3O78g.svg +36 -0
  36. package/dist/ui/assets/bo-CcUiMqkJ.svg +673 -0
  37. package/dist/ui/assets/bq-BYpdxEeT.svg +5 -0
  38. package/dist/ui/assets/br-Cu5YU29T.svg +45 -0
  39. package/dist/ui/assets/bs-7Gd_oriM.svg +13 -0
  40. package/dist/ui/assets/bt-BTo4qm10.svg +89 -0
  41. package/dist/ui/assets/bv-wM9JLv4R.svg +13 -0
  42. package/dist/ui/assets/bw-n5ZaAnGL.svg +7 -0
  43. package/dist/ui/assets/by-C621sBpd.svg +18 -0
  44. package/dist/ui/assets/bz-BCKHR4_q.svg +145 -0
  45. package/dist/ui/assets/ca-PYUrLVUV.svg +4 -0
  46. package/dist/ui/assets/cc-BNT6Xjzk.svg +19 -0
  47. package/dist/ui/assets/cd-BGclsrP6.svg +5 -0
  48. package/dist/ui/assets/cefta-2dDBYygd.svg +13 -0
  49. package/dist/ui/assets/cf-DRetLmp-.svg +15 -0
  50. package/dist/ui/assets/cg-CwIyG6SE.svg +12 -0
  51. package/dist/ui/assets/ch-sfriZoF1.svg +9 -0
  52. package/dist/ui/assets/ci-C8Q8IYTn.svg +7 -0
  53. package/dist/ui/assets/ck-DfXMUOTo.svg +9 -0
  54. package/dist/ui/assets/cl-BgYYb4qP.svg +13 -0
  55. package/dist/ui/assets/cm-D4yjdmKT.svg +15 -0
  56. package/dist/ui/assets/cn-DifnnI3t.svg +11 -0
  57. package/dist/ui/assets/co-DV591zMm.svg +7 -0
  58. package/dist/ui/assets/cp-K_ay05Q_.svg +7 -0
  59. package/dist/ui/assets/cr-BlYVN-_Q.svg +7 -0
  60. package/dist/ui/assets/cu-L6XVZNgo.svg +13 -0
  61. package/dist/ui/assets/cv-CPsfcOfk.svg +13 -0
  62. package/dist/ui/assets/cw-BbrnximR.svg +14 -0
  63. package/dist/ui/assets/cx-DpYD6n6U.svg +15 -0
  64. package/dist/ui/assets/cy-bZuP8hmf.svg +6 -0
  65. package/dist/ui/assets/cz-WWBC5Aeb.svg +5 -0
  66. package/dist/ui/assets/de-B-2o-4Z9.svg +5 -0
  67. package/dist/ui/assets/dg-CJPJrjiZ.svg +130 -0
  68. package/dist/ui/assets/dj-hp_BwbmO.svg +13 -0
  69. package/dist/ui/assets/dk-DmS9BCZB.svg +5 -0
  70. package/dist/ui/assets/dm-Cbhezfe1.svg +152 -0
  71. package/dist/ui/assets/do-B86d445t.svg +121 -0
  72. package/dist/ui/assets/dz-Dytc1TFu.svg +5 -0
  73. package/dist/ui/assets/eac-CwGQsyAM.svg +48 -0
  74. package/dist/ui/assets/ec-CaVOFQ3t.svg +138 -0
  75. package/dist/ui/assets/ee-DufrxGIR.svg +5 -0
  76. package/dist/ui/assets/eg-YC70hswZ.svg +38 -0
  77. package/dist/ui/assets/eh-0awM4TVj.svg +16 -0
  78. package/dist/ui/assets/er-X83uml6t.svg +8 -0
  79. package/dist/ui/assets/es-ct-CVyhLp7O.svg +4 -0
  80. package/dist/ui/assets/es-d5m8M5h8.svg +544 -0
  81. package/dist/ui/assets/es-ga-D9xG2hYr.svg +187 -0
  82. package/dist/ui/assets/es-pv-CO3NM2SE.svg +5 -0
  83. package/dist/ui/assets/et-DwdlzOIx.svg +14 -0
  84. package/dist/ui/assets/eu-Brdgz8ab.svg +28 -0
  85. package/dist/ui/assets/fi-DWUIkfjL.svg +5 -0
  86. package/dist/ui/assets/fj-DEAVMg38.svg +120 -0
  87. package/dist/ui/assets/fk-nuUF_Ak3.svg +90 -0
  88. package/dist/ui/assets/fm-B4Z83GL0.svg +11 -0
  89. package/dist/ui/assets/fo-DFjwyWur.svg +12 -0
  90. package/dist/ui/assets/fr-DVvUyOqI.svg +5 -0
  91. package/dist/ui/assets/ga-BklUhLH_.svg +7 -0
  92. package/dist/ui/assets/gb-DTXiLQoe.svg +7 -0
  93. package/dist/ui/assets/gb-eng-C8iDhGHN.svg +5 -0
  94. package/dist/ui/assets/gb-nir-D4gikpNq.svg +132 -0
  95. package/dist/ui/assets/gb-sct-fW5q01ek.svg +4 -0
  96. package/dist/ui/assets/gb-wls-Bxz9hxvX.svg +9 -0
  97. package/dist/ui/assets/gd-CO-whzUe.svg +27 -0
  98. package/dist/ui/assets/ge-B2RiL-Ih.svg +6 -0
  99. package/dist/ui/assets/gf-DWl5zcw0.svg +5 -0
  100. package/dist/ui/assets/gg-jdOQS2nU.svg +9 -0
  101. package/dist/ui/assets/gh-r3LP_X7q.svg +6 -0
  102. package/dist/ui/assets/gi-BJKE9SzW.svg +32 -0
  103. package/dist/ui/assets/gl-CHaBnMib.svg +4 -0
  104. package/dist/ui/assets/gm-Bu99atwn.svg +14 -0
  105. package/dist/ui/assets/gn-1dJNy9oQ.svg +7 -0
  106. package/dist/ui/assets/gp-DNyt_wTA.svg +5 -0
  107. package/dist/ui/assets/gq-Cag8QTk2.svg +23 -0
  108. package/dist/ui/assets/gr-C5PU0p9p.svg +16 -0
  109. package/dist/ui/assets/gs-DiiNa0F5.svg +133 -0
  110. package/dist/ui/assets/gt-CJo5DI-7.svg +204 -0
  111. package/dist/ui/assets/gu-Di1JYREk.svg +19 -0
  112. package/dist/ui/assets/gw-D249VY33.svg +13 -0
  113. package/dist/ui/assets/gy-CcVYUM2E.svg +9 -0
  114. package/dist/ui/assets/hk-CUNIaSX0.svg +8 -0
  115. package/dist/ui/assets/hm-Dh6t_Tj3.svg +8 -0
  116. package/dist/ui/assets/hn-CRjyS_bm.svg +18 -0
  117. package/dist/ui/assets/hr-fzLfaANM.svg +58 -0
  118. package/dist/ui/assets/ht-DIMg4gti.svg +116 -0
  119. package/dist/ui/assets/hu-7Q5wwIIi.svg +7 -0
  120. package/dist/ui/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
  121. package/dist/ui/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
  122. package/dist/ui/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
  123. package/dist/ui/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
  124. package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
  125. package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
  126. package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
  127. package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
  128. package/dist/ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  129. package/dist/ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  130. package/dist/ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  131. package/dist/ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  132. package/dist/ui/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
  133. package/dist/ui/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
  134. package/dist/ui/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
  135. package/dist/ui/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
  136. package/dist/ui/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
  137. package/dist/ui/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
  138. package/dist/ui/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
  139. package/dist/ui/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
  140. package/dist/ui/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
  141. package/dist/ui/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
  142. package/dist/ui/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
  143. package/dist/ui/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
  144. package/dist/ui/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
  145. package/dist/ui/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
  146. package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
  147. package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
  148. package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
  149. package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
  150. package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
  151. package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
  152. package/dist/ui/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
  153. package/dist/ui/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
  154. package/dist/ui/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
  155. package/dist/ui/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
  156. package/dist/ui/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
  157. package/dist/ui/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
  158. package/dist/ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  159. package/dist/ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  160. package/dist/ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  161. package/dist/ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  162. package/dist/ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  163. package/dist/ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  164. package/dist/ui/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
  165. package/dist/ui/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
  166. package/dist/ui/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
  167. package/dist/ui/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
  168. package/dist/ui/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
  169. package/dist/ui/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
  170. package/dist/ui/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
  171. package/dist/ui/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
  172. package/dist/ui/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
  173. package/dist/ui/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
  174. package/dist/ui/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
  175. package/dist/ui/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
  176. package/dist/ui/assets/ic-CSo4d8tH.svg +7 -0
  177. package/dist/ui/assets/id-DiSP6Fmm.svg +4 -0
  178. package/dist/ui/assets/ie-ChAXClx3.svg +7 -0
  179. package/dist/ui/assets/il-_56OEGLa.svg +14 -0
  180. package/dist/ui/assets/im--VPIqfkF.svg +36 -0
  181. package/dist/ui/assets/in-Cdwu6Bq7.svg +25 -0
  182. package/dist/ui/assets/index-BqcYDTXL.css +1 -0
  183. package/dist/ui/assets/index-DK-AGskd.js +1805 -0
  184. package/dist/ui/assets/io-13HOfeJD.svg +130 -0
  185. package/dist/ui/assets/iq-Dp8HDzo2.svg +10 -0
  186. package/dist/ui/assets/ir-cCIgaNf6.svg +219 -0
  187. package/dist/ui/assets/is-CZjefTNV.svg +12 -0
  188. package/dist/ui/assets/it-Br7q0Zh6.svg +7 -0
  189. package/dist/ui/assets/je-DyWbhIiC.svg +62 -0
  190. package/dist/ui/assets/jm-CItSr3iX.svg +8 -0
  191. package/dist/ui/assets/jo-BAF1FGbm.svg +16 -0
  192. package/dist/ui/assets/jp-BIMmfxpO.svg +11 -0
  193. package/dist/ui/assets/ke-C8foqndp.svg +23 -0
  194. package/dist/ui/assets/kg-B0FsxZiL.svg +4 -0
  195. package/dist/ui/assets/kh-BeWfuE30.svg +61 -0
  196. package/dist/ui/assets/ki-p_fAQGbS.svg +36 -0
  197. package/dist/ui/assets/km-B5tqtGG7.svg +16 -0
  198. package/dist/ui/assets/kn-DVPxDkNY.svg +14 -0
  199. package/dist/ui/assets/kp-CrDKzoxe.svg +15 -0
  200. package/dist/ui/assets/kr-BCXH1Hao.svg +24 -0
  201. package/dist/ui/assets/kw-fSBzmd30.svg +13 -0
  202. package/dist/ui/assets/ky-Dpsu1myA.svg +103 -0
  203. package/dist/ui/assets/kz-CwKXYZ8s.svg +36 -0
  204. package/dist/ui/assets/la-CuJflhIW.svg +12 -0
  205. package/dist/ui/assets/lb-BSjpYEoo.svg +15 -0
  206. package/dist/ui/assets/lc-CNvab8Ae.svg +8 -0
  207. package/dist/ui/assets/li-CHdhvNcr.svg +43 -0
  208. package/dist/ui/assets/lk-DUkgV9Tq.svg +22 -0
  209. package/dist/ui/assets/lr-B84vu3Ds.svg +14 -0
  210. package/dist/ui/assets/ls-5Xk3Mxq5.svg +8 -0
  211. package/dist/ui/assets/lt-DoukV-Sm.svg +7 -0
  212. package/dist/ui/assets/lu-DOI02Msy.svg +5 -0
  213. package/dist/ui/assets/lv-C-KfY8Yc.svg +6 -0
  214. package/dist/ui/assets/ly-BWpTK3ux.svg +13 -0
  215. package/dist/ui/assets/ma-BTRNTRUj.svg +4 -0
  216. package/dist/ui/assets/mc-PK078JHl.svg +6 -0
  217. package/dist/ui/assets/md-DRlxvNwm.svg +70 -0
  218. package/dist/ui/assets/me-Cv4Gwqah.svg +116 -0
  219. package/dist/ui/assets/mf-BaAGWwAq.svg +5 -0
  220. package/dist/ui/assets/mg-C168LHXW.svg +7 -0
  221. package/dist/ui/assets/mh-gxuIp6Wk.svg +7 -0
  222. package/dist/ui/assets/mk-D9SIMr-a.svg +5 -0
  223. package/dist/ui/assets/ml-DVf6ujpi.svg +7 -0
  224. package/dist/ui/assets/mm-lwT09MQ0.svg +12 -0
  225. package/dist/ui/assets/mn-CgXyw0O9.svg +14 -0
  226. package/dist/ui/assets/mo-BAtCjuYA.svg +9 -0
  227. package/dist/ui/assets/mp-CrOApEqW.svg +86 -0
  228. package/dist/ui/assets/mq-BFnJ22KI.svg +5 -0
  229. package/dist/ui/assets/mr-D6G1wpeZ.svg +6 -0
  230. package/dist/ui/assets/ms-DxciGbUu.svg +29 -0
  231. package/dist/ui/assets/mt-YqzKx9xl.svg +58 -0
  232. package/dist/ui/assets/mu-mcq7cUFl.svg +8 -0
  233. package/dist/ui/assets/mv-BynAllfM.svg +6 -0
  234. package/dist/ui/assets/mw-C15nc1xZ.svg +10 -0
  235. package/dist/ui/assets/mx-Cc8Ccfe8.svg +382 -0
  236. package/dist/ui/assets/my-Co4JeeyE.svg +26 -0
  237. package/dist/ui/assets/mz-Drlr_USV.svg +21 -0
  238. package/dist/ui/assets/na-D79ffb4Z.svg +16 -0
  239. package/dist/ui/assets/nc-5j7wEmDR.svg +13 -0
  240. package/dist/ui/assets/ne-B1jPOYkl.svg +6 -0
  241. package/dist/ui/assets/nf-Dl00mlk2.svg +9 -0
  242. package/dist/ui/assets/ng-su4NM9If.svg +6 -0
  243. package/dist/ui/assets/ni-CcFCSQxm.svg +129 -0
  244. package/dist/ui/assets/nl-BnOa6UiA.svg +5 -0
  245. package/dist/ui/assets/no-qf2JPO73.svg +7 -0
  246. package/dist/ui/assets/np-CIuq5GKd.svg +13 -0
  247. package/dist/ui/assets/nr-DERIdzkN.svg +12 -0
  248. package/dist/ui/assets/nu-BfgWvGcd.svg +10 -0
  249. package/dist/ui/assets/nz-5vODdBjz.svg +36 -0
  250. package/dist/ui/assets/om-DcqxRdQL.svg +115 -0
  251. package/dist/ui/assets/pa-BLNN9G2-.svg +14 -0
  252. package/dist/ui/assets/pc-BJpYiA9b.svg +33 -0
  253. package/dist/ui/assets/pe-BLqhuu1C.svg +4 -0
  254. package/dist/ui/assets/pf-C8ahG68q.svg +19 -0
  255. package/dist/ui/assets/pg-BAYpbp9Z.svg +9 -0
  256. package/dist/ui/assets/ph-BEzTn62K.svg +6 -0
  257. package/dist/ui/assets/pk-CWMEc3ad.svg +15 -0
  258. package/dist/ui/assets/pl-o38JROoc.svg +6 -0
  259. package/dist/ui/assets/pm-CHiP5UmZ.svg +5 -0
  260. package/dist/ui/assets/pn-DgxdtieE.svg +53 -0
  261. package/dist/ui/assets/pr-B4tMV0xm.svg +13 -0
  262. package/dist/ui/assets/ps-DO8YKYeS.svg +6 -0
  263. package/dist/ui/assets/pt-DZ2ADgIR.svg +57 -0
  264. package/dist/ui/assets/pw-CQP52WMX.svg +11 -0
  265. package/dist/ui/assets/py-mNzh0mZC.svg +157 -0
  266. package/dist/ui/assets/qa-Dkmpc78M.svg +4 -0
  267. package/dist/ui/assets/re-Bk4ipYK1.svg +5 -0
  268. package/dist/ui/assets/ro-CoSeqKY1.svg +7 -0
  269. package/dist/ui/assets/rs-BfwKwXtn.svg +292 -0
  270. package/dist/ui/assets/ru-D-4tNwXt.svg +5 -0
  271. package/dist/ui/assets/rw-D7nbSYKI.svg +13 -0
  272. package/dist/ui/assets/sa-Dh79zbT9.svg +25 -0
  273. package/dist/ui/assets/sb-BDTYjcbk.svg +13 -0
  274. package/dist/ui/assets/sc-CRNsSLg9.svg +7 -0
  275. package/dist/ui/assets/sd-ClziNjGr.svg +13 -0
  276. package/dist/ui/assets/se-8C923vhy.svg +4 -0
  277. package/dist/ui/assets/sg-DGYIMG0G.svg +13 -0
  278. package/dist/ui/assets/sh-DNImvbrE.svg +7 -0
  279. package/dist/ui/assets/sh-ac-FjwY7RYr.svg +689 -0
  280. package/dist/ui/assets/sh-hl-CqtQPzWZ.svg +164 -0
  281. package/dist/ui/assets/sh-ta-CPJublpi.svg +76 -0
  282. package/dist/ui/assets/si-BMKT-Tec.svg +18 -0
  283. package/dist/ui/assets/sj-BFFEGknm.svg +7 -0
  284. package/dist/ui/assets/sk-K9BNIYAO.svg +9 -0
  285. package/dist/ui/assets/sl-DxLJY5vJ.svg +7 -0
  286. package/dist/ui/assets/sm-DGBIRFB_.svg +75 -0
  287. package/dist/ui/assets/sn-S8ipNF1U.svg +8 -0
  288. package/dist/ui/assets/so-DlzA2Fco.svg +11 -0
  289. package/dist/ui/assets/sr-Co7OKBh3.svg +6 -0
  290. package/dist/ui/assets/ss-CxVEpdPD.svg +8 -0
  291. package/dist/ui/assets/st-C1Nd1c3V.svg +16 -0
  292. package/dist/ui/assets/sv-CJIHhYwF.svg +593 -0
  293. package/dist/ui/assets/sx-nDhIaDNb.svg +56 -0
  294. package/dist/ui/assets/sy-DwSud114.svg +6 -0
  295. package/dist/ui/assets/sz-qxMwa2gs.svg +34 -0
  296. package/dist/ui/assets/tc-dtelpZmc.svg +50 -0
  297. package/dist/ui/assets/td-BsuVhZpT.svg +7 -0
  298. package/dist/ui/assets/tf-Co33RhQH.svg +15 -0
  299. package/dist/ui/assets/tg-CP1-sc35.svg +14 -0
  300. package/dist/ui/assets/th-tzq84hgd.svg +7 -0
  301. package/dist/ui/assets/tj-b-aWfOTb.svg +22 -0
  302. package/dist/ui/assets/tk-CDucsEss.svg +5 -0
  303. package/dist/ui/assets/tl-wpo93AGk.svg +13 -0
  304. package/dist/ui/assets/tm-C_WSgUcv.svg +204 -0
  305. package/dist/ui/assets/tn-BcKCZULf.svg +4 -0
  306. package/dist/ui/assets/to-D8uVsoxb.svg +10 -0
  307. package/dist/ui/assets/tr-Cd6FO9Bg.svg +8 -0
  308. package/dist/ui/assets/tt-CTnr7aY5.svg +5 -0
  309. package/dist/ui/assets/tv-DDqkVT-n.svg +9 -0
  310. package/dist/ui/assets/tw-d-Mf-0VT.svg +34 -0
  311. package/dist/ui/assets/tz-BjLtHeil.svg +13 -0
  312. package/dist/ui/assets/ua-Bq0XgQqK.svg +6 -0
  313. package/dist/ui/assets/ug-ByL2ejGl.svg +30 -0
  314. package/dist/ui/assets/um-Bhke9Eic.svg +9 -0
  315. package/dist/ui/assets/un-Bqg4Cbbh.svg +16 -0
  316. package/dist/ui/assets/us-C73uVeEr.svg +9 -0
  317. package/dist/ui/assets/uy-DD6peej-.svg +28 -0
  318. package/dist/ui/assets/uz-C2f-Cubn.svg +30 -0
  319. package/dist/ui/assets/va-B9-hqIE-.svg +190 -0
  320. package/dist/ui/assets/vc-COpmFovN.svg +8 -0
  321. package/dist/ui/assets/ve-BSqnIB9l.svg +26 -0
  322. package/dist/ui/assets/vg-C7xY6pic.svg +59 -0
  323. package/dist/ui/assets/vi-BC_zcciE.svg +28 -0
  324. package/dist/ui/assets/vn-BEAEijd0.svg +11 -0
  325. package/dist/ui/assets/vu-D6k0NQlg.svg +21 -0
  326. package/dist/ui/assets/wf-DrxpOO_G.svg +5 -0
  327. package/dist/ui/assets/ws-vzJNwdVm.svg +7 -0
  328. package/dist/ui/assets/xk-Bj15g7cp.svg +5 -0
  329. package/dist/ui/assets/xx-zm_JmrXl.svg +4 -0
  330. package/dist/ui/assets/ye-BwST9gXC.svg +7 -0
  331. package/dist/ui/assets/yt-DIfEG0ex.svg +5 -0
  332. package/dist/ui/assets/za-Jz40JTrv.svg +17 -0
  333. package/dist/ui/assets/zm-BmsW91ne.svg +27 -0
  334. package/dist/ui/assets/zw-U0m7oJ5e.svg +21 -0
  335. package/dist/ui/index.html +13 -0
  336. package/package.json +68 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 James Dempster
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,234 @@
1
+ # Glotfile
2
+
3
+ A local-first, git-native translation manager. All your app's copy lives in one
4
+ JSON file you commit to your repo, you edit and AI-translate it through a local
5
+ web UI, and you export to whatever locale formats your apps consume — no SaaS,
6
+ no hosted database, nothing leaves your machine except the AI calls you choose
7
+ to make.
8
+
9
+ - **One source of truth** — every string and translation lives in `glotfile.json`, committed alongside your code. Versioning, review, and rollback come from git. For large catalogs, run `glotfile split` to store the catalog as a `glotfile/` directory with one file per locale — so a one-locale change is a one-file `git diff` instead of a multi-megabyte one. The in-app experience is identical.
10
+ - **Local web UI** — run one command, edit in the browser, changes save straight back to the file.
11
+ - **AI translation** — fill in missing languages with Anthropic, OpenAI, or AWS Bedrock, using per-key context, a glossary, and screenshots.
12
+ - **Export anywhere** — generate Flutter ARB, Laravel PHP, i18next JSON, gettext `.po`, and Apple `.stringsdict` from the same source.
13
+
14
+ ---
15
+
16
+ ## Requirements
17
+
18
+ - Node **^20.19.0 || >=22.12.0**
19
+
20
+ ## Getting started
21
+
22
+ Glotfile is designed to run with no install via `npx glotfile`. It's pre-1.0 and
23
+ not yet published to npm, so for now run it from a checkout of this repo:
24
+
25
+ ```bash
26
+ npm install
27
+ npm run build # builds the UI + server into dist/
28
+ node bin/glotfile.js # same as the `glotfile` command
29
+ ```
30
+
31
+ That starts a local server bound to `127.0.0.1`, opens your browser, and — if
32
+ there's no `glotfile.json` in the current directory yet — starts from sensible
33
+ defaults and writes the file as soon as you make your first edit.
34
+
35
+ > Working on Glotfile itself? `npm run dev` runs the Vite UI with hot-reload and
36
+ > the server side-by-side.
37
+
38
+ ---
39
+
40
+ ## The state file: `glotfile.json`
41
+
42
+ Everything is derived from this one file at the root of your project. It's
43
+ written deterministically (stable key order, fixed indent, one trailing
44
+ newline) so git diffs stay small and reviewable. A fresh file looks like this:
45
+
46
+ ```json
47
+ {
48
+ "version": 2,
49
+ "config": {
50
+ "sourceLocale": "en",
51
+ "locales": ["en"],
52
+ "outputs": [
53
+ { "adapter": "flutter-arb", "path": "lib/l10n/app_{locale}.arb" },
54
+ { "adapter": "laravel-php", "path": "lang/{locale}/{namespace}.php" }
55
+ ],
56
+ "ai": { "provider": "anthropic", "model": "claude-opus-4-8", "endpoint": null, "region": null, "batchSize": 25 },
57
+ "format": { "indent": 2, "sortKeys": true, "finalNewline": true },
58
+ "spelling": { "customWords": [] }
59
+ },
60
+ "glossary": [],
61
+ "keys": {}
62
+ }
63
+ ```
64
+
65
+ - **`sourceLocale` / `locales`** — the language you author in, and every language you maintain.
66
+ - **`keys`** — a flat map of dot-notation keys (e.g. `auth.signIn.button`), each with a value per locale, a review `state`, and optional metadata (context, tags, max length, screenshot, notes).
67
+ - **`outputs`** — where exported locale files are written, one entry per format (see [Output formats](#output-formats)).
68
+ - **`ai`** — which model translates and how (see [AI translation](#ai-translation)).
69
+ - **`glossary`** — do-not-translate terms and forced per-locale translations.
70
+
71
+ You normally never edit this file by hand — the UI does it for you.
72
+
73
+ ---
74
+
75
+ ## Commands
76
+
77
+ Run `glotfile <command>` (or `node bin/glotfile.js <command>` from a checkout).
78
+ All commands accept `--file <path>` (`-f`) to target a state file other than
79
+ `./glotfile.json`. Run `glotfile --help` for the command list, or
80
+ `glotfile <command> --help` for a command's options.
81
+
82
+ | Command | What it does |
83
+ |---|---|
84
+ | `glotfile` &nbsp;or&nbsp; `glotfile serve` | Start the local web UI and open the browser. |
85
+ | `glotfile translate` | AI-translate strings (writes results back to `glotfile.json`). |
86
+ | `glotfile export` | Write the locale files for every configured output. |
87
+ | `glotfile prune --empty-source` | List keys whose source value is empty (dry run); add `--write` to remove them. |
88
+ | `glotfile prune --unused` | List keys with no code reference in the last scan (dry run); add `--write` to remove them. Runs a scan first. |
89
+
90
+ ### `translate` options
91
+
92
+ ```bash
93
+ glotfile translate # fill empty values (the default)
94
+ glotfile translate --all # re-translate every string
95
+ glotfile translate --locale fr,de # only these target languages
96
+ glotfile translate --key "auth.*" # only keys matching a glob
97
+ ```
98
+
99
+ These combine. With no flags, only empty values are filled; `--all` re-translates
100
+ every string (a `reviewed` value is never overwritten either way).
101
+
102
+ ### `export` options
103
+
104
+ ```bash
105
+ glotfile export # write all configured outputs
106
+ glotfile export --adapter laravel-php # just one format
107
+ ```
108
+
109
+ Re-running `export` with no changes produces a zero-line diff — safe to run in
110
+ CI to check your locale files are up to date.
111
+
112
+ ### `prune` options
113
+
114
+ ```bash
115
+ glotfile prune --empty-source # list keys with an empty source (dry run)
116
+ glotfile prune --empty-source --write # remove them
117
+
118
+ glotfile prune --unused # list keys with no code reference (dry run)
119
+ glotfile prune --unused --write # remove them
120
+ ```
121
+
122
+ `--unused` runs a scan first, so the result reflects your current code, and
123
+ treats keys referenced only by a dynamic prefix (e.g. `t('errors.' + code)`) as
124
+ used. The selectors combine: `prune --unused --empty-source --write` removes the
125
+ union of both sets.
126
+
127
+ Dry-run by default — it prints what it would remove and changes nothing until
128
+ `--write` is passed. Recovery is via git, like every other edit.
129
+
130
+ ---
131
+
132
+ ## The web UI
133
+
134
+ `glotfile serve` opens a single-page app for managing the catalog:
135
+
136
+ - **Editor** — a searchable, filterable table of every key with the source string and each target language side by side. Create, rename, and delete keys; edit values inline; toggle each value's review **state** (`source` → `machine` → `reviewed` / `needs-review`). Filter by missing, machine (unreviewed), tag, or free text.
137
+ - **Per-key metadata** — context for humans and the AI, tags, a max length, freeform notes, and a screenshot showing where the string appears.
138
+ - **Plurals** — manage CLDR plural forms (`one`, `other`, …) per language.
139
+ - **Languages** — add or remove the locales you maintain.
140
+ - **Glossary** — terms to never translate, and forced translations per language; these are injected into every AI request.
141
+ - **Screenshots** — attach an image to a key so vision-capable models can see the UI context.
142
+ - **Settings** — edit the `config` block (source locale, outputs, AI provider/model, formatting, custom spelling dictionary).
143
+ - **AI log** — a record of recent translation runs (prompts and results; never your API keys or image bytes).
144
+
145
+ The UI also surfaces **checks** (missing values, placeholder mismatches, length
146
+ and glossary violations) and an **export preview** before you write files.
147
+
148
+ ---
149
+
150
+ ## Output formats
151
+
152
+ Add entries to `config.outputs`; each names an adapter and a path template
153
+ (`{locale}` and `{namespace}` are substituted). Available adapters:
154
+
155
+ | Adapter | Target |
156
+ |---|---|
157
+ | `flutter-arb` | Flutter `.arb` files |
158
+ | `laravel-php` | Laravel `lang/**/*.php` arrays |
159
+ | `i18next-json` | i18next / generic JSON |
160
+ | `gettext-po` | gettext `.po` |
161
+ | `apple-stringsdict` | Apple `.stringsdict` |
162
+
163
+ Placeholders (`{name}`, `{{count}}`, `%s`, `:name`) and ICU plural/select
164
+ structure are preserved across formats; where a conversion would be lossy the
165
+ export warns rather than corrupting output.
166
+
167
+ ---
168
+
169
+ ## AI translation
170
+
171
+ Translation is the only feature that needs network access or credentials —
172
+ everything else works offline. Configure the provider in `config.ai` (via the
173
+ Settings panel or by editing the file), make sure the credentials are in your
174
+ environment, then translate from the **Editor** or with `glotfile translate`.
175
+
176
+ Glotfile reads credentials from the environment, including a local `.env` file
177
+ in the project directory. For example:
178
+
179
+ ```bash
180
+ # .env
181
+ ANTHROPIC_API_KEY=sk-ant-...
182
+ ```
183
+
184
+ Three providers are supported — Anthropic (default), OpenAI, and AWS Bedrock
185
+ (Amazon Nova, Claude, and Meta Llama). For the full setup of each — required
186
+ env vars, model ids, regions, and the optional SDKs to install — see
187
+ **[docs/ai-providers.md](docs/ai-providers.md)**.
188
+
189
+ What the translator does for you:
190
+
191
+ - Sends each string with its key context, relevant glossary terms, the target locale, any max length, and (for vision-capable models) its screenshot.
192
+ - Preserves interpolation placeholders and ICU plural/select structure, and validates them on the way back — a translation that drops a placeholder or busts a length limit is rejected, not written.
193
+ - Writes results as **`machine`** state and **never overwrites a value you've marked `reviewed`**, so human edits are safe.
194
+ - Skips screenshots for models that can't see them (and tells you), so any model still works.
195
+
196
+ ---
197
+
198
+ ## Suggested workflow
199
+
200
+ 1. Run `glotfile serve`, add keys and source copy as you build a feature.
201
+ 2. `glotfile translate` (or the Editor's translate action) to fill the other languages.
202
+ 3. Review machine translations in the UI; promote good ones to `reviewed`.
203
+ 4. `glotfile export` to regenerate your apps' locale files.
204
+ 5. Commit `glotfile.json` together with your code — the diff is the review.
205
+
206
+ Because the catalog is just a file in your repo, branching, pull-request review,
207
+ and rollback all work the way they already do for code.
208
+
209
+ ## Large catalogs: split storage
210
+
211
+ A catalog grows with every key and locale. Past a few megabytes, a single
212
+ `glotfile.json` makes `git diff` slow, overflows GitHub's render limit, and
213
+ conflicts badly. Run:
214
+
215
+ ```
216
+ glotfile split
217
+ ```
218
+
219
+ This converts `glotfile.json` into a `glotfile/` directory:
220
+
221
+ ```
222
+ glotfile/
223
+ config.json # { $schema, version, config, glossary } — everything except keys
224
+ keys.json # per-key metadata (tags, notes, context, plurals)
225
+ locales/
226
+ en.json # one file per locale
227
+ fr.json
228
+ ...
229
+ ```
230
+
231
+ Now translating a locale, or adding a key, changes only the relevant file(s).
232
+ New projects stay as a single `glotfile.json`; splitting is an explicit,
233
+ one-time, reviewable commit. The CLI, web UI, and exports behave identically
234
+ either way.
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { main } from "../dist/server/cli.js";
3
+
4
+ main(process.argv.slice(2)).catch((err) => {
5
+ console.error(err instanceof Error ? err.message : String(err));
6
+ process.exit(1);
7
+ });