@inlang/sdk 0.36.3 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (727) hide show
  1. package/README.md +1 -1
  2. package/dist/database/initDb.d.ts +7 -0
  3. package/dist/database/initDb.d.ts.map +1 -0
  4. package/dist/database/initDb.js +36 -0
  5. package/dist/database/initDb.js.map +1 -0
  6. package/dist/database/initDbAndSchema.test.d.ts +2 -0
  7. package/dist/database/initDbAndSchema.test.d.ts.map +1 -0
  8. package/dist/database/initDbAndSchema.test.js +110 -0
  9. package/dist/database/initDbAndSchema.test.js.map +1 -0
  10. package/dist/database/jsonbPlugin.d.ts +20 -0
  11. package/dist/database/jsonbPlugin.d.ts.map +1 -0
  12. package/dist/database/jsonbPlugin.js +183 -0
  13. package/dist/database/jsonbPlugin.js.map +1 -0
  14. package/dist/database/jsonbPlugin.test.d.ts +2 -0
  15. package/dist/database/jsonbPlugin.test.d.ts.map +1 -0
  16. package/dist/database/jsonbPlugin.test.js +119 -0
  17. package/dist/database/jsonbPlugin.test.js.map +1 -0
  18. package/dist/database/schema.d.ts +74 -0
  19. package/dist/database/schema.d.ts.map +1 -0
  20. package/dist/database/schema.js +45 -0
  21. package/dist/database/schema.js.map +1 -0
  22. package/dist/helper.d.ts +71 -0
  23. package/dist/helper.d.ts.map +1 -0
  24. package/dist/helper.js +91 -0
  25. package/dist/helper.js.map +1 -0
  26. package/dist/human-id/human-id.d.ts +3 -0
  27. package/dist/human-id/human-id.d.ts.map +1 -0
  28. package/dist/human-id/human-id.js +12 -0
  29. package/dist/human-id/human-id.js.map +1 -0
  30. package/dist/human-id/words.d.ts.map +1 -0
  31. package/dist/{storage/human-id → human-id}/words.js +4 -0
  32. package/dist/human-id/words.js.map +1 -0
  33. package/dist/human-id/words.test.d.ts.map +1 -0
  34. package/dist/{storage/human-id → human-id}/words.test.js +4 -0
  35. package/dist/human-id/words.test.js.map +1 -0
  36. package/dist/import-export/exportFiles.d.ts +11 -0
  37. package/dist/import-export/exportFiles.d.ts.map +1 -0
  38. package/dist/import-export/exportFiles.js +26 -0
  39. package/dist/import-export/exportFiles.js.map +1 -0
  40. package/dist/import-export/importFiles.d.ts +13 -0
  41. package/dist/import-export/importFiles.d.ts.map +1 -0
  42. package/dist/import-export/importFiles.js +124 -0
  43. package/dist/import-export/importFiles.js.map +1 -0
  44. package/dist/import-export/importFiles.test.d.ts +2 -0
  45. package/dist/import-export/importFiles.test.d.ts.map +1 -0
  46. package/dist/import-export/importFiles.test.js +179 -0
  47. package/dist/import-export/importFiles.test.js.map +1 -0
  48. package/dist/import-export/roundtrip.test.d.ts +2 -0
  49. package/dist/import-export/roundtrip.test.d.ts.map +1 -0
  50. package/dist/import-export/roundtrip.test.js +273 -0
  51. package/dist/import-export/roundtrip.test.js.map +1 -0
  52. package/dist/import-export/upsertBundleNestedMatchByProperties.d.ts +4 -0
  53. package/dist/import-export/upsertBundleNestedMatchByProperties.d.ts.map +1 -0
  54. package/dist/import-export/upsertBundleNestedMatchByProperties.js +58 -0
  55. package/dist/import-export/upsertBundleNestedMatchByProperties.js.map +1 -0
  56. package/dist/index.d.ts +21 -18
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +20 -17
  59. package/dist/index.js.map +1 -0
  60. package/dist/json-schema/old-v1-message/fromMessageV1.d.ts +9 -0
  61. package/dist/json-schema/old-v1-message/fromMessageV1.d.ts.map +1 -0
  62. package/dist/json-schema/old-v1-message/fromMessageV1.js +84 -0
  63. package/dist/json-schema/old-v1-message/fromMessageV1.js.map +1 -0
  64. package/dist/json-schema/old-v1-message/fromMessageV1.test.d.ts +2 -0
  65. package/dist/json-schema/old-v1-message/fromMessageV1.test.d.ts.map +1 -0
  66. package/dist/json-schema/old-v1-message/fromMessageV1.test.js +85 -0
  67. package/dist/json-schema/old-v1-message/fromMessageV1.test.js.map +1 -0
  68. package/dist/json-schema/old-v1-message/schemaV1.d.ts +86 -0
  69. package/dist/json-schema/old-v1-message/schemaV1.d.ts.map +1 -0
  70. package/dist/json-schema/old-v1-message/schemaV1.js +35 -0
  71. package/dist/json-schema/old-v1-message/schemaV1.js.map +1 -0
  72. package/dist/json-schema/old-v1-message/toMessageV1.d.ts +9 -0
  73. package/dist/json-schema/old-v1-message/toMessageV1.d.ts.map +1 -0
  74. package/dist/json-schema/old-v1-message/toMessageV1.js +67 -0
  75. package/dist/json-schema/old-v1-message/toMessageV1.js.map +1 -0
  76. package/dist/json-schema/old-v1-message/toMessageV1.test.d.ts +2 -0
  77. package/dist/json-schema/old-v1-message/toMessageV1.test.d.ts.map +1 -0
  78. package/dist/json-schema/old-v1-message/toMessageV1.test.js +85 -0
  79. package/dist/json-schema/old-v1-message/toMessageV1.test.js.map +1 -0
  80. package/dist/json-schema/pattern.d.ts +190 -0
  81. package/dist/json-schema/pattern.d.ts.map +1 -0
  82. package/dist/json-schema/pattern.js +43 -0
  83. package/dist/json-schema/pattern.js.map +1 -0
  84. package/dist/json-schema/settings.d.ts +31 -0
  85. package/dist/json-schema/settings.d.ts.map +1 -0
  86. package/dist/json-schema/settings.js +96 -0
  87. package/dist/json-schema/settings.js.map +1 -0
  88. package/dist/json-schema/settings.test-d.d.ts +2 -0
  89. package/dist/json-schema/settings.test-d.d.ts.map +1 -0
  90. package/dist/json-schema/settings.test-d.js +20 -0
  91. package/dist/json-schema/settings.test-d.js.map +1 -0
  92. package/dist/lix-plugin/applyChanges.d.ts +3 -0
  93. package/dist/lix-plugin/applyChanges.d.ts.map +1 -0
  94. package/dist/lix-plugin/applyChanges.js +127 -0
  95. package/dist/lix-plugin/applyChanges.js.map +1 -0
  96. package/dist/lix-plugin/applyChanges.test.d.ts +2 -0
  97. package/dist/lix-plugin/applyChanges.test.d.ts.map +1 -0
  98. package/dist/lix-plugin/applyChanges.test.js +135 -0
  99. package/dist/lix-plugin/applyChanges.test.js.map +1 -0
  100. package/dist/lix-plugin/detectConflicts.d.ts +3 -0
  101. package/dist/lix-plugin/detectConflicts.d.ts.map +1 -0
  102. package/dist/lix-plugin/detectConflicts.js +47 -0
  103. package/dist/lix-plugin/detectConflicts.js.map +1 -0
  104. package/dist/lix-plugin/detectConflicts.test.d.ts +2 -0
  105. package/dist/lix-plugin/detectConflicts.test.d.ts.map +1 -0
  106. package/dist/lix-plugin/detectConflicts.test.js +251 -0
  107. package/dist/lix-plugin/detectConflicts.test.js.map +1 -0
  108. package/dist/lix-plugin/inlangLixPluginV1.d.ts +8 -0
  109. package/dist/lix-plugin/inlangLixPluginV1.d.ts.map +1 -0
  110. package/dist/lix-plugin/inlangLixPluginV1.js +109 -0
  111. package/dist/lix-plugin/inlangLixPluginV1.js.map +1 -0
  112. package/dist/lix-plugin/inlangLixPluginV1.test.d.ts +2 -0
  113. package/dist/lix-plugin/inlangLixPluginV1.test.d.ts.map +1 -0
  114. package/dist/lix-plugin/inlangLixPluginV1.test.js +418 -0
  115. package/dist/lix-plugin/inlangLixPluginV1.test.js.map +1 -0
  116. package/dist/lix-plugin/merge.test.d.ts +2 -0
  117. package/dist/lix-plugin/merge.test.d.ts.map +1 -0
  118. package/dist/lix-plugin/merge.test.js +120 -0
  119. package/dist/lix-plugin/merge.test.js.map +1 -0
  120. package/dist/lix-plugin/resolveConflictBySelecting.test.d.ts +2 -0
  121. package/dist/lix-plugin/resolveConflictBySelecting.test.d.ts.map +1 -0
  122. package/dist/lix-plugin/resolveConflictBySelecting.test.js +176 -0
  123. package/dist/lix-plugin/resolveConflictBySelecting.test.js.map +1 -0
  124. package/dist/migrations/v2/createMessageV1.d.ts +28 -0
  125. package/dist/migrations/v2/createMessageV1.d.ts.map +1 -0
  126. package/dist/migrations/v2/createMessageV1.js +31 -0
  127. package/dist/migrations/v2/createMessageV1.js.map +1 -0
  128. package/dist/migrations/v2/withLanguageTagToLocaleMigration.d.ts +9 -0
  129. package/dist/migrations/v2/withLanguageTagToLocaleMigration.d.ts.map +1 -0
  130. package/dist/migrations/v2/withLanguageTagToLocaleMigration.js +31 -0
  131. package/dist/migrations/v2/withLanguageTagToLocaleMigration.js.map +1 -0
  132. package/dist/migrations/v2/withLanguageTagToLocaleMigration.test.d.ts +2 -0
  133. package/dist/migrations/v2/withLanguageTagToLocaleMigration.test.d.ts.map +1 -0
  134. package/dist/migrations/v2/withLanguageTagToLocaleMigration.test.js +45 -0
  135. package/dist/migrations/v2/withLanguageTagToLocaleMigration.test.js.map +1 -0
  136. package/dist/plugin/cache.d.ts +6 -0
  137. package/dist/plugin/cache.d.ts.map +1 -0
  138. package/dist/plugin/cache.js +59 -0
  139. package/dist/plugin/cache.js.map +1 -0
  140. package/dist/plugin/cache.test.d.ts +2 -0
  141. package/dist/plugin/cache.test.d.ts.map +1 -0
  142. package/dist/plugin/cache.test.js +61 -0
  143. package/dist/plugin/cache.test.js.map +1 -0
  144. package/dist/plugin/errors.d.ts +41 -0
  145. package/dist/plugin/errors.d.ts.map +1 -0
  146. package/dist/plugin/errors.js +48 -0
  147. package/dist/plugin/errors.js.map +1 -0
  148. package/dist/plugin/importPlugins.d.ts +19 -0
  149. package/dist/plugin/importPlugins.d.ts.map +1 -0
  150. package/dist/plugin/importPlugins.js +43 -0
  151. package/dist/plugin/importPlugins.js.map +1 -0
  152. package/dist/plugin/importPlugins.test.d.ts +2 -0
  153. package/dist/plugin/importPlugins.test.d.ts.map +1 -0
  154. package/dist/plugin/importPlugins.test.js +95 -0
  155. package/dist/plugin/importPlugins.test.js.map +1 -0
  156. package/dist/plugin/meta/ideExtension.d.ts +54 -0
  157. package/dist/plugin/meta/ideExtension.d.ts.map +1 -0
  158. package/dist/plugin/meta/ideExtension.js +5 -0
  159. package/dist/plugin/meta/ideExtension.js.map +1 -0
  160. package/dist/plugin/schema.d.ts +152 -0
  161. package/dist/plugin/schema.d.ts.map +1 -0
  162. package/dist/plugin/schema.js +5 -0
  163. package/dist/plugin/schema.js.map +1 -0
  164. package/dist/project/api.d.ts +74 -0
  165. package/dist/project/api.d.ts.map +1 -0
  166. package/dist/project/api.js +5 -0
  167. package/dist/project/api.js.map +1 -0
  168. package/dist/project/initHandleSaveToLixOnChange.d.ts +14 -0
  169. package/dist/project/initHandleSaveToLixOnChange.d.ts.map +1 -0
  170. package/dist/project/initHandleSaveToLixOnChange.js +87 -0
  171. package/dist/project/initHandleSaveToLixOnChange.js.map +1 -0
  172. package/dist/project/loadProject.d.ts +53 -0
  173. package/dist/project/loadProject.d.ts.map +1 -0
  174. package/dist/project/loadProject.js +167 -0
  175. package/dist/project/loadProject.js.map +1 -0
  176. package/dist/project/loadProject.test.d.ts.map +1 -0
  177. package/dist/project/loadProject.test.js +146 -0
  178. package/dist/project/loadProject.test.js.map +1 -0
  179. package/dist/project/loadProjectFromDirectory.d.ts +77 -0
  180. package/dist/project/loadProjectFromDirectory.d.ts.map +1 -0
  181. package/dist/project/loadProjectFromDirectory.js +584 -0
  182. package/dist/project/loadProjectFromDirectory.js.map +1 -0
  183. package/dist/project/loadProjectFromDirectory.test.d.ts +2 -0
  184. package/dist/project/loadProjectFromDirectory.test.d.ts.map +1 -0
  185. package/dist/project/loadProjectFromDirectory.test.js +663 -0
  186. package/dist/project/loadProjectFromDirectory.test.js.map +1 -0
  187. package/dist/project/loadProjectInMemory.d.ts +8 -0
  188. package/dist/project/loadProjectInMemory.d.ts.map +1 -0
  189. package/dist/project/loadProjectInMemory.js +32 -0
  190. package/dist/project/loadProjectInMemory.js.map +1 -0
  191. package/dist/project/loadProjectInMemory.test.d.ts +2 -0
  192. package/dist/project/loadProjectInMemory.test.d.ts.map +1 -0
  193. package/dist/project/loadProjectInMemory.test.js +27 -0
  194. package/dist/project/loadProjectInMemory.test.js.map +1 -0
  195. package/dist/project/maybeCaptureTelemetry.d.ts +13 -0
  196. package/dist/project/maybeCaptureTelemetry.d.ts.map +1 -0
  197. package/dist/project/maybeCaptureTelemetry.js +53 -0
  198. package/dist/project/maybeCaptureTelemetry.js.map +1 -0
  199. package/dist/project/maybeCaptureTelemetry.test.d.ts +2 -0
  200. package/dist/project/maybeCaptureTelemetry.test.d.ts.map +1 -0
  201. package/dist/project/maybeCaptureTelemetry.test.js +65 -0
  202. package/dist/project/maybeCaptureTelemetry.test.js.map +1 -0
  203. package/dist/project/newProject.d.ts +17 -0
  204. package/dist/project/newProject.d.ts.map +1 -0
  205. package/dist/project/newProject.js +71 -0
  206. package/dist/project/newProject.js.map +1 -0
  207. package/dist/project/newProject.test.d.ts +2 -0
  208. package/dist/project/newProject.test.d.ts.map +1 -0
  209. package/dist/project/newProject.test.js +37 -0
  210. package/dist/project/newProject.test.js.map +1 -0
  211. package/dist/project/saveProjectToDirectory.d.ts +8 -0
  212. package/dist/project/saveProjectToDirectory.d.ts.map +1 -0
  213. package/dist/project/saveProjectToDirectory.js +86 -0
  214. package/dist/project/saveProjectToDirectory.js.map +1 -0
  215. package/dist/project/saveProjectToDirectory.test.d.ts +2 -0
  216. package/dist/project/saveProjectToDirectory.test.d.ts.map +1 -0
  217. package/dist/project/saveProjectToDirectory.test.js +245 -0
  218. package/dist/project/saveProjectToDirectory.test.js.map +1 -0
  219. package/dist/project/state/id$.d.ts +6 -0
  220. package/dist/project/state/id$.d.ts.map +1 -0
  221. package/dist/project/state/id$.js +19 -0
  222. package/dist/project/state/id$.js.map +1 -0
  223. package/dist/project/state/id$.test.d.ts +2 -0
  224. package/dist/project/state/id$.test.d.ts.map +1 -0
  225. package/dist/project/state/id$.test.js +36 -0
  226. package/dist/project/state/id$.test.js.map +1 -0
  227. package/dist/project/state/setSettings.d.ts +7 -0
  228. package/dist/project/state/setSettings.d.ts.map +1 -0
  229. package/dist/project/state/setSettings.js +16 -0
  230. package/dist/project/state/setSettings.js.map +1 -0
  231. package/dist/project/state/setSettings.test.d.ts +2 -0
  232. package/dist/project/state/setSettings.test.d.ts.map +1 -0
  233. package/dist/project/state/setSettings.test.js +58 -0
  234. package/dist/project/state/setSettings.test.js.map +1 -0
  235. package/dist/project/state/settings$.d.ts +7 -0
  236. package/dist/project/state/settings$.d.ts.map +1 -0
  237. package/dist/project/state/settings$.js +21 -0
  238. package/dist/project/state/settings$.js.map +1 -0
  239. package/dist/project/state/settings$.test.d.ts +2 -0
  240. package/dist/project/state/settings$.test.d.ts.map +1 -0
  241. package/dist/project/state/settings$.test.js +51 -0
  242. package/dist/project/state/settings$.test.js.map +1 -0
  243. package/dist/project/state/state.d.ts +58 -0
  244. package/dist/project/state/state.d.ts.map +1 -0
  245. package/dist/project/state/state.js +67 -0
  246. package/dist/project/state/state.js.map +1 -0
  247. package/dist/project/state/state.test.d.ts +2 -0
  248. package/dist/project/state/state.test.d.ts.map +1 -0
  249. package/dist/project/state/state.test.js +103 -0
  250. package/dist/project/state/state.test.js.map +1 -0
  251. package/dist/query-utilities/index.d.ts +5 -0
  252. package/dist/query-utilities/index.d.ts.map +1 -0
  253. package/dist/query-utilities/index.js +8 -0
  254. package/dist/query-utilities/index.js.map +1 -0
  255. package/dist/query-utilities/insertBundleNested.d.ts +4 -0
  256. package/dist/query-utilities/insertBundleNested.d.ts.map +1 -0
  257. package/dist/query-utilities/insertBundleNested.js +39 -0
  258. package/dist/query-utilities/insertBundleNested.js.map +1 -0
  259. package/dist/query-utilities/pollQuery.d.ts +14 -0
  260. package/dist/query-utilities/pollQuery.d.ts.map +1 -0
  261. package/dist/query-utilities/pollQuery.js +22 -0
  262. package/dist/query-utilities/pollQuery.js.map +1 -0
  263. package/dist/query-utilities/pollQuery.test.d.ts +2 -0
  264. package/dist/query-utilities/pollQuery.test.d.ts.map +1 -0
  265. package/dist/query-utilities/pollQuery.test.js +67 -0
  266. package/dist/query-utilities/pollQuery.test.js.map +1 -0
  267. package/dist/query-utilities/selectBundleNested.d.ts +107 -0
  268. package/dist/query-utilities/selectBundleNested.d.ts.map +1 -0
  269. package/dist/query-utilities/selectBundleNested.js +43 -0
  270. package/dist/query-utilities/selectBundleNested.js.map +1 -0
  271. package/dist/query-utilities/updateBundleNested.d.ts +12 -0
  272. package/dist/query-utilities/updateBundleNested.d.ts.map +1 -0
  273. package/dist/query-utilities/updateBundleNested.js +25 -0
  274. package/dist/query-utilities/updateBundleNested.js.map +1 -0
  275. package/dist/query-utilities/upsertBundleNested.d.ts +4 -0
  276. package/dist/query-utilities/upsertBundleNested.d.ts.map +1 -0
  277. package/dist/query-utilities/upsertBundleNested.js +50 -0
  278. package/dist/query-utilities/upsertBundleNested.js.map +1 -0
  279. package/dist/services/env-variables/index.d.ts +6 -0
  280. package/dist/services/env-variables/index.d.ts.map +1 -0
  281. package/dist/services/env-variables/index.js +9 -0
  282. package/dist/services/env-variables/index.js.map +1 -0
  283. package/dist/services/error-reporting/index.d.ts +15 -0
  284. package/dist/services/error-reporting/index.d.ts.map +1 -0
  285. package/dist/services/error-reporting/index.js +30 -0
  286. package/dist/services/error-reporting/index.js.map +1 -0
  287. package/dist/{telemetry → services/telemetry}/capture.d.ts +4 -2
  288. package/dist/services/telemetry/capture.d.ts.map +1 -0
  289. package/dist/services/telemetry/capture.js +77 -0
  290. package/dist/services/telemetry/capture.js.map +1 -0
  291. package/dist/services/telemetry/capture.test.d.ts +2 -0
  292. package/dist/services/telemetry/capture.test.d.ts.map +1 -0
  293. package/dist/services/telemetry/capture.test.js +44 -0
  294. package/dist/services/telemetry/capture.test.js.map +1 -0
  295. package/dist/utilities/detectJsonFormatting.d.ts +11 -0
  296. package/dist/utilities/detectJsonFormatting.d.ts.map +1 -0
  297. package/dist/utilities/detectJsonFormatting.js +83 -0
  298. package/dist/utilities/detectJsonFormatting.js.map +1 -0
  299. package/dist/utilities/detectJsonFormatting.test.d.ts +2 -0
  300. package/dist/utilities/detectJsonFormatting.test.d.ts.map +1 -0
  301. package/dist/utilities/detectJsonFormatting.test.js +33 -0
  302. package/dist/utilities/detectJsonFormatting.test.js.map +1 -0
  303. package/package.json +32 -40
  304. package/src/database/initDb.ts +34 -0
  305. package/src/database/initDbAndSchema.test.ts +125 -0
  306. package/src/database/jsonbPlugin.test.ts +154 -0
  307. package/src/database/jsonbPlugin.ts +215 -0
  308. package/src/database/schema.ts +127 -0
  309. package/src/helper.ts +113 -0
  310. package/src/human-id/human-id.ts +14 -0
  311. package/src/{storage/human-id → human-id}/words.test.ts +14 -14
  312. package/src/{storage/human-id → human-id}/words.ts +4 -4
  313. package/src/import-export/exportFiles.ts +36 -0
  314. package/src/import-export/importFiles.test.ts +211 -0
  315. package/src/import-export/importFiles.ts +142 -0
  316. package/src/import-export/roundtrip.test.ts +313 -0
  317. package/src/import-export/upsertBundleNestedMatchByProperties.ts +74 -0
  318. package/src/index.ts +29 -37
  319. package/src/json-schema/old-v1-message/README.md +1 -0
  320. package/src/json-schema/old-v1-message/fromMessageV1.test.ts +87 -0
  321. package/src/json-schema/old-v1-message/fromMessageV1.ts +99 -0
  322. package/src/json-schema/old-v1-message/schemaV1.ts +66 -0
  323. package/src/json-schema/old-v1-message/toMessageV1.test.ts +87 -0
  324. package/src/json-schema/old-v1-message/toMessageV1.ts +79 -0
  325. package/src/json-schema/pattern.ts +59 -0
  326. package/src/json-schema/settings.test-d.ts +21 -0
  327. package/src/json-schema/settings.ts +138 -0
  328. package/src/lix-plugin/applyChanges.test.ts +150 -0
  329. package/src/lix-plugin/applyChanges.ts +171 -0
  330. package/src/lix-plugin/detectConflicts.test.ts +286 -0
  331. package/src/lix-plugin/detectConflicts.ts +62 -0
  332. package/src/lix-plugin/inlangLixPluginV1.test.ts +439 -0
  333. package/src/lix-plugin/inlangLixPluginV1.ts +132 -0
  334. package/src/lix-plugin/merge.test.ts +133 -0
  335. package/src/lix-plugin/resolveConflictBySelecting.test.ts +188 -0
  336. package/src/migrations/v2/createMessageV1.ts +37 -0
  337. package/src/migrations/v2/withLanguageTagToLocaleMigration.test.ts +51 -0
  338. package/src/migrations/v2/withLanguageTagToLocaleMigration.ts +31 -0
  339. package/src/plugin/cache.test.ts +83 -0
  340. package/src/plugin/cache.ts +79 -0
  341. package/src/plugin/errors.ts +67 -0
  342. package/src/plugin/importPlugins.test.ts +107 -0
  343. package/src/plugin/importPlugins.ts +60 -0
  344. package/src/plugin/meta/ideExtension.ts +56 -0
  345. package/src/plugin/schema.ts +165 -0
  346. package/src/project/api.ts +77 -0
  347. package/src/project/initHandleSaveToLixOnChange.ts +93 -0
  348. package/src/project/loadProject.test.ts +177 -0
  349. package/src/project/loadProject.ts +245 -0
  350. package/src/project/loadProjectFromDirectory.test.ts +854 -0
  351. package/src/project/loadProjectFromDirectory.ts +752 -0
  352. package/src/project/loadProjectInMemory.test.ts +29 -0
  353. package/src/project/loadProjectInMemory.ts +36 -0
  354. package/src/project/maybeCaptureTelemetry.test.ts +72 -0
  355. package/src/project/maybeCaptureTelemetry.ts +61 -0
  356. package/src/project/newProject.test.ts +36 -0
  357. package/src/project/newProject.ts +78 -0
  358. package/src/project/saveProjectToDirectory.test.ts +310 -0
  359. package/src/project/saveProjectToDirectory.ts +100 -0
  360. package/src/query-utilities/index.ts +4 -0
  361. package/src/query-utilities/insertBundleNested.ts +46 -0
  362. package/src/query-utilities/selectBundleNested.ts +46 -0
  363. package/src/query-utilities/updateBundleNested.ts +35 -0
  364. package/src/query-utilities/upsertBundleNested.ts +61 -0
  365. package/src/services/env-variables/createIndexFile.js +40 -0
  366. package/src/{env-variables → services/env-variables}/index.d.ts +8 -5
  367. package/src/services/error-reporting/index.ts +28 -0
  368. package/src/services/telemetry/capture.test.ts +48 -0
  369. package/src/services/telemetry/capture.ts +98 -0
  370. package/src/utilities/detectJsonFormatting.test.ts +38 -0
  371. package/src/utilities/detectJsonFormatting.ts +109 -0
  372. package/dist/adapter/solidAdapter.d.ts +0 -33
  373. package/dist/adapter/solidAdapter.d.ts.map +0 -1
  374. package/dist/adapter/solidAdapter.js +0 -40
  375. package/dist/adapter/solidAdapter.test.d.ts +0 -2
  376. package/dist/adapter/solidAdapter.test.d.ts.map +0 -1
  377. package/dist/adapter/solidAdapter.test.js +0 -356
  378. package/dist/api.d.ts +0 -113
  379. package/dist/api.d.ts.map +0 -1
  380. package/dist/api.js +0 -1
  381. package/dist/api.test-d.d.ts +0 -2
  382. package/dist/api.test-d.d.ts.map +0 -1
  383. package/dist/api.test-d.js +0 -4
  384. package/dist/createMessageLintReportsQuery.d.ts +0 -12
  385. package/dist/createMessageLintReportsQuery.d.ts.map +0 -1
  386. package/dist/createMessageLintReportsQuery.js +0 -176
  387. package/dist/createMessagesQuery.d.ts +0 -19
  388. package/dist/createMessagesQuery.d.ts.map +0 -1
  389. package/dist/createMessagesQuery.js +0 -451
  390. package/dist/createMessagesQuery.test.d.ts +0 -2
  391. package/dist/createMessagesQuery.test.d.ts.map +0 -1
  392. package/dist/createMessagesQuery.test.js +0 -402
  393. package/dist/createNewProject.d.ts +0 -12
  394. package/dist/createNewProject.d.ts.map +0 -1
  395. package/dist/createNewProject.js +0 -38
  396. package/dist/createNewProject.test.d.ts +0 -2
  397. package/dist/createNewProject.test.d.ts.map +0 -1
  398. package/dist/createNewProject.test.js +0 -91
  399. package/dist/createNodeishFsWithAbsolutePaths.d.ts +0 -12
  400. package/dist/createNodeishFsWithAbsolutePaths.d.ts.map +0 -1
  401. package/dist/createNodeishFsWithAbsolutePaths.js +0 -38
  402. package/dist/createNodeishFsWithAbsolutePaths.test.d.ts +0 -2
  403. package/dist/createNodeishFsWithAbsolutePaths.test.d.ts.map +0 -1
  404. package/dist/createNodeishFsWithAbsolutePaths.test.js +0 -44
  405. package/dist/createNodeishFsWithWatcher.d.ts +0 -14
  406. package/dist/createNodeishFsWithWatcher.d.ts.map +0 -1
  407. package/dist/createNodeishFsWithWatcher.js +0 -75
  408. package/dist/createNodeishFsWithWatcher.test.d.ts +0 -2
  409. package/dist/createNodeishFsWithWatcher.test.d.ts.map +0 -1
  410. package/dist/createNodeishFsWithWatcher.test.js +0 -38
  411. package/dist/defaultProjectSettings.d.ts +0 -14
  412. package/dist/defaultProjectSettings.d.ts.map +0 -1
  413. package/dist/defaultProjectSettings.js +0 -22
  414. package/dist/env-variables/index.d.ts +0 -4
  415. package/dist/env-variables/index.d.ts.map +0 -1
  416. package/dist/env-variables/index.js +0 -3
  417. package/dist/errors.d.ts +0 -48
  418. package/dist/errors.d.ts.map +0 -1
  419. package/dist/errors.js +0 -62
  420. package/dist/lint/index.d.ts +0 -3
  421. package/dist/lint/index.d.ts.map +0 -1
  422. package/dist/lint/index.js +0 -2
  423. package/dist/lint/message/errors.d.ts +0 -7
  424. package/dist/lint/message/errors.d.ts.map +0 -1
  425. package/dist/lint/message/errors.js +0 -9
  426. package/dist/lint/message/lintMessages.d.ts +0 -13
  427. package/dist/lint/message/lintMessages.d.ts.map +0 -1
  428. package/dist/lint/message/lintMessages.js +0 -12
  429. package/dist/lint/message/lintMessages.test.d.ts +0 -2
  430. package/dist/lint/message/lintMessages.test.d.ts.map +0 -1
  431. package/dist/lint/message/lintMessages.test.js +0 -107
  432. package/dist/lint/message/lintSingleMessage.d.ts +0 -19
  433. package/dist/lint/message/lintSingleMessage.d.ts.map +0 -1
  434. package/dist/lint/message/lintSingleMessage.js +0 -38
  435. package/dist/lint/message/lintSingleMessage.test.d.ts +0 -2
  436. package/dist/lint/message/lintSingleMessage.test.d.ts.map +0 -1
  437. package/dist/lint/message/lintSingleMessage.test.js +0 -161
  438. package/dist/listProjects.d.ts +0 -5
  439. package/dist/listProjects.d.ts.map +0 -1
  440. package/dist/listProjects.js +0 -38
  441. package/dist/listProjects.test.d.ts +0 -2
  442. package/dist/listProjects.test.d.ts.map +0 -1
  443. package/dist/listProjects.test.js +0 -72
  444. package/dist/loadProject.d.ts +0 -19
  445. package/dist/loadProject.d.ts.map +0 -1
  446. package/dist/loadProject.js +0 -343
  447. package/dist/loadProject.test.d.ts.map +0 -1
  448. package/dist/loadProject.test.js +0 -975
  449. package/dist/messages/errors.d.ts +0 -13
  450. package/dist/messages/errors.d.ts.map +0 -1
  451. package/dist/messages/errors.js +0 -18
  452. package/dist/messages/index.d.ts +0 -3
  453. package/dist/messages/index.d.ts.map +0 -1
  454. package/dist/messages/index.js +0 -2
  455. package/dist/messages/variant.d.ts +0 -46
  456. package/dist/messages/variant.d.ts.map +0 -1
  457. package/dist/messages/variant.js +0 -176
  458. package/dist/messages/variant.test.d.ts +0 -2
  459. package/dist/messages/variant.test.d.ts.map +0 -1
  460. package/dist/messages/variant.test.js +0 -439
  461. package/dist/migrations/maybeAddModuleCache.d.ts +0 -6
  462. package/dist/migrations/maybeAddModuleCache.d.ts.map +0 -1
  463. package/dist/migrations/maybeAddModuleCache.js +0 -62
  464. package/dist/migrations/maybeCreateFirstProjectId.d.ts +0 -16
  465. package/dist/migrations/maybeCreateFirstProjectId.d.ts.map +0 -1
  466. package/dist/migrations/maybeCreateFirstProjectId.js +0 -46
  467. package/dist/migrations/maybeCreateFirstProjectId.test.d.ts +0 -2
  468. package/dist/migrations/maybeCreateFirstProjectId.test.d.ts.map +0 -1
  469. package/dist/migrations/maybeCreateFirstProjectId.test.js +0 -24
  470. package/dist/migrations/migrateToDirectory.d.ts +0 -10
  471. package/dist/migrations/migrateToDirectory.d.ts.map +0 -1
  472. package/dist/migrations/migrateToDirectory.js +0 -48
  473. package/dist/migrations/migrateToDirectory.test.d.ts +0 -2
  474. package/dist/migrations/migrateToDirectory.test.d.ts.map +0 -1
  475. package/dist/migrations/migrateToDirectory.test.js +0 -48
  476. package/dist/parseConfig.d.ts +0 -8
  477. package/dist/parseConfig.d.ts.map +0 -1
  478. package/dist/parseConfig.js +0 -26
  479. package/dist/persistence/batchedIO.d.ts +0 -11
  480. package/dist/persistence/batchedIO.d.ts.map +0 -1
  481. package/dist/persistence/batchedIO.js +0 -49
  482. package/dist/persistence/batchedIO.test.d.ts +0 -2
  483. package/dist/persistence/batchedIO.test.d.ts.map +0 -1
  484. package/dist/persistence/batchedIO.test.js +0 -56
  485. package/dist/persistence/filelock/acquireFileLock.d.ts +0 -3
  486. package/dist/persistence/filelock/acquireFileLock.d.ts.map +0 -1
  487. package/dist/persistence/filelock/acquireFileLock.js +0 -111
  488. package/dist/persistence/filelock/releaseLock.d.ts +0 -3
  489. package/dist/persistence/filelock/releaseLock.d.ts.map +0 -1
  490. package/dist/persistence/filelock/releaseLock.js +0 -24
  491. package/dist/persistence/store.d.ts +0 -107
  492. package/dist/persistence/store.d.ts.map +0 -1
  493. package/dist/persistence/store.js +0 -99
  494. package/dist/persistence/store.test.d.ts +0 -2
  495. package/dist/persistence/store.test.d.ts.map +0 -1
  496. package/dist/persistence/store.test.js +0 -79
  497. package/dist/persistence/storeApi.d.ts +0 -22
  498. package/dist/persistence/storeApi.d.ts.map +0 -1
  499. package/dist/persistence/storeApi.js +0 -1
  500. package/dist/reactivity/map.d.ts +0 -67
  501. package/dist/reactivity/map.d.ts.map +0 -1
  502. package/dist/reactivity/map.js +0 -143
  503. package/dist/reactivity/solid.d.ts +0 -14
  504. package/dist/reactivity/solid.d.ts.map +0 -1
  505. package/dist/reactivity/solid.js +0 -15
  506. package/dist/reactivity/solid.test.d.ts +0 -2
  507. package/dist/reactivity/solid.test.d.ts.map +0 -1
  508. package/dist/reactivity/solid.test.js +0 -189
  509. package/dist/reactivity/trigger.d.ts +0 -11
  510. package/dist/reactivity/trigger.d.ts.map +0 -1
  511. package/dist/reactivity/trigger.js +0 -46
  512. package/dist/resolve-modules/cache.d.ts +0 -6
  513. package/dist/resolve-modules/cache.d.ts.map +0 -1
  514. package/dist/resolve-modules/cache.js +0 -58
  515. package/dist/resolve-modules/errors.d.ts +0 -41
  516. package/dist/resolve-modules/errors.d.ts.map +0 -1
  517. package/dist/resolve-modules/errors.js +0 -45
  518. package/dist/resolve-modules/import.d.ts +0 -19
  519. package/dist/resolve-modules/import.d.ts.map +0 -1
  520. package/dist/resolve-modules/import.js +0 -102
  521. package/dist/resolve-modules/import.test.d.ts +0 -2
  522. package/dist/resolve-modules/import.test.d.ts.map +0 -1
  523. package/dist/resolve-modules/import.test.js +0 -47
  524. package/dist/resolve-modules/index.d.ts +0 -3
  525. package/dist/resolve-modules/index.d.ts.map +0 -1
  526. package/dist/resolve-modules/index.js +0 -2
  527. package/dist/resolve-modules/message-lint-rules/errors.d.ts +0 -9
  528. package/dist/resolve-modules/message-lint-rules/errors.d.ts.map +0 -1
  529. package/dist/resolve-modules/message-lint-rules/errors.js +0 -6
  530. package/dist/resolve-modules/message-lint-rules/resolveMessageLintRules.d.ts +0 -9
  531. package/dist/resolve-modules/message-lint-rules/resolveMessageLintRules.d.ts.map +0 -1
  532. package/dist/resolve-modules/message-lint-rules/resolveMessageLintRules.js +0 -24
  533. package/dist/resolve-modules/plugins/errors.d.ts +0 -33
  534. package/dist/resolve-modules/plugins/errors.d.ts.map +0 -1
  535. package/dist/resolve-modules/plugins/errors.js +0 -38
  536. package/dist/resolve-modules/plugins/resolvePlugins.d.ts +0 -3
  537. package/dist/resolve-modules/plugins/resolvePlugins.d.ts.map +0 -1
  538. package/dist/resolve-modules/plugins/resolvePlugins.js +0 -92
  539. package/dist/resolve-modules/plugins/resolvePlugins.test.d.ts +0 -2
  540. package/dist/resolve-modules/plugins/resolvePlugins.test.d.ts.map +0 -1
  541. package/dist/resolve-modules/plugins/resolvePlugins.test.js +0 -252
  542. package/dist/resolve-modules/plugins/types.d.ts +0 -57
  543. package/dist/resolve-modules/plugins/types.d.ts.map +0 -1
  544. package/dist/resolve-modules/plugins/types.js +0 -1
  545. package/dist/resolve-modules/plugins/types.test.d.ts +0 -2
  546. package/dist/resolve-modules/plugins/types.test.d.ts.map +0 -1
  547. package/dist/resolve-modules/plugins/types.test.js +0 -45
  548. package/dist/resolve-modules/resolveModules.d.ts +0 -3
  549. package/dist/resolve-modules/resolveModules.d.ts.map +0 -1
  550. package/dist/resolve-modules/resolveModules.js +0 -80
  551. package/dist/resolve-modules/resolveModules.test.d.ts +0 -2
  552. package/dist/resolve-modules/resolveModules.test.d.ts.map +0 -1
  553. package/dist/resolve-modules/resolveModules.test.js +0 -185
  554. package/dist/resolve-modules/types.d.ts +0 -63
  555. package/dist/resolve-modules/types.d.ts.map +0 -1
  556. package/dist/resolve-modules/types.js +0 -1
  557. package/dist/resolve-modules/validateModuleSettings.test.d.ts +0 -2
  558. package/dist/resolve-modules/validateModuleSettings.test.d.ts.map +0 -1
  559. package/dist/resolve-modules/validateModuleSettings.test.js +0 -71
  560. package/dist/resolve-modules/validatedModuleSettings.d.ts +0 -7
  561. package/dist/resolve-modules/validatedModuleSettings.d.ts.map +0 -1
  562. package/dist/resolve-modules/validatedModuleSettings.js +0 -11
  563. package/dist/storage/helper.d.ts +0 -11
  564. package/dist/storage/helper.d.ts.map +0 -1
  565. package/dist/storage/helper.js +0 -63
  566. package/dist/storage/helpers.test.d.ts +0 -2
  567. package/dist/storage/helpers.test.d.ts.map +0 -1
  568. package/dist/storage/helpers.test.js +0 -84
  569. package/dist/storage/human-id/human-readable-id.d.ts +0 -3
  570. package/dist/storage/human-id/human-readable-id.d.ts.map +0 -1
  571. package/dist/storage/human-id/human-readable-id.js +0 -20
  572. package/dist/storage/human-id/words.d.ts.map +0 -1
  573. package/dist/storage/human-id/words.test.d.ts.map +0 -1
  574. package/dist/telemetry/capture.d.ts.map +0 -1
  575. package/dist/telemetry/capture.js +0 -39
  576. package/dist/telemetry/groupIdentify.d.ts +0 -13
  577. package/dist/telemetry/groupIdentify.d.ts.map +0 -1
  578. package/dist/telemetry/groupIdentify.js +0 -35
  579. package/dist/test-utilities/createMessage.d.ts +0 -18
  580. package/dist/test-utilities/createMessage.d.ts.map +0 -1
  581. package/dist/test-utilities/createMessage.js +0 -17
  582. package/dist/test-utilities/createMessage.test.d.ts +0 -2
  583. package/dist/test-utilities/createMessage.test.d.ts.map +0 -1
  584. package/dist/test-utilities/createMessage.test.js +0 -106
  585. package/dist/test-utilities/index.d.ts +0 -3
  586. package/dist/test-utilities/index.d.ts.map +0 -1
  587. package/dist/test-utilities/index.js +0 -2
  588. package/dist/test-utilities/sleep.d.ts +0 -4
  589. package/dist/test-utilities/sleep.d.ts.map +0 -1
  590. package/dist/test-utilities/sleep.js +0 -9
  591. package/dist/v2/helper.d.ts +0 -43
  592. package/dist/v2/helper.d.ts.map +0 -1
  593. package/dist/v2/helper.js +0 -75
  594. package/dist/v2/helper.test.d.ts +0 -2
  595. package/dist/v2/helper.test.d.ts.map +0 -1
  596. package/dist/v2/helper.test.js +0 -92
  597. package/dist/v2/index.d.ts +0 -4
  598. package/dist/v2/index.d.ts.map +0 -1
  599. package/dist/v2/index.js +0 -2
  600. package/dist/v2/mocks/index.d.ts +0 -3
  601. package/dist/v2/mocks/index.d.ts.map +0 -1
  602. package/dist/v2/mocks/index.js +0 -2
  603. package/dist/v2/mocks/multipleMatcher/bundle.d.ts +0 -3
  604. package/dist/v2/mocks/multipleMatcher/bundle.d.ts.map +0 -1
  605. package/dist/v2/mocks/multipleMatcher/bundle.js +0 -194
  606. package/dist/v2/mocks/multipleMatcher/bundle.test.d.ts +0 -2
  607. package/dist/v2/mocks/multipleMatcher/bundle.test.d.ts.map +0 -1
  608. package/dist/v2/mocks/multipleMatcher/bundle.test.js +0 -10
  609. package/dist/v2/mocks/plural/bundle.d.ts +0 -3
  610. package/dist/v2/mocks/plural/bundle.d.ts.map +0 -1
  611. package/dist/v2/mocks/plural/bundle.js +0 -162
  612. package/dist/v2/mocks/plural/bundle.test.d.ts +0 -2
  613. package/dist/v2/mocks/plural/bundle.test.d.ts.map +0 -1
  614. package/dist/v2/mocks/plural/bundle.test.js +0 -15
  615. package/dist/v2/shim.d.ts +0 -12
  616. package/dist/v2/shim.d.ts.map +0 -1
  617. package/dist/v2/shim.js +0 -151
  618. package/dist/v2/shim.test.d.ts +0 -2
  619. package/dist/v2/shim.test.d.ts.map +0 -1
  620. package/dist/v2/shim.test.js +0 -49
  621. package/dist/v2/stubQueryApi.d.ts +0 -9
  622. package/dist/v2/stubQueryApi.d.ts.map +0 -1
  623. package/dist/v2/stubQueryApi.js +0 -38
  624. package/dist/v2/types.d.ts +0 -521
  625. package/dist/v2/types.d.ts.map +0 -1
  626. package/dist/v2/types.js +0 -78
  627. package/dist/validateProjectPath.d.ts +0 -17
  628. package/dist/validateProjectPath.d.ts.map +0 -1
  629. package/dist/validateProjectPath.js +0 -31
  630. package/dist/validateProjectPath.test.d.ts +0 -2
  631. package/dist/validateProjectPath.test.d.ts.map +0 -1
  632. package/dist/validateProjectPath.test.js +0 -40
  633. package/dist/versionedInterfaces.d.ts +0 -8
  634. package/dist/versionedInterfaces.d.ts.map +0 -1
  635. package/dist/versionedInterfaces.js +0 -8
  636. package/src/adapter/solidAdapter.test.ts +0 -472
  637. package/src/adapter/solidAdapter.ts +0 -79
  638. package/src/api.test-d.ts +0 -8
  639. package/src/api.ts +0 -116
  640. package/src/createMessageLintReportsQuery.ts +0 -225
  641. package/src/createMessagesQuery.test.ts +0 -538
  642. package/src/createMessagesQuery.ts +0 -635
  643. package/src/createNewProject.test.ts +0 -105
  644. package/src/createNewProject.ts +0 -46
  645. package/src/createNodeishFsWithAbsolutePaths.test.ts +0 -55
  646. package/src/createNodeishFsWithAbsolutePaths.ts +0 -52
  647. package/src/createNodeishFsWithWatcher.test.ts +0 -50
  648. package/src/createNodeishFsWithWatcher.ts +0 -85
  649. package/src/defaultProjectSettings.ts +0 -26
  650. package/src/env-variables/.prettierignore +0 -1
  651. package/src/env-variables/createIndexFile.js +0 -28
  652. package/src/errors.ts +0 -84
  653. package/src/lint/index.ts +0 -2
  654. package/src/lint/message/errors.ts +0 -9
  655. package/src/lint/message/lintMessages.test.ts +0 -126
  656. package/src/lint/message/lintMessages.ts +0 -25
  657. package/src/lint/message/lintSingleMessage.test.ts +0 -191
  658. package/src/lint/message/lintSingleMessage.ts +0 -57
  659. package/src/listProjects.test.ts +0 -91
  660. package/src/listProjects.ts +0 -48
  661. package/src/loadProject.test.ts +0 -1173
  662. package/src/loadProject.ts +0 -460
  663. package/src/messages/errors.ts +0 -25
  664. package/src/messages/index.ts +0 -2
  665. package/src/messages/variant.test.ts +0 -511
  666. package/src/messages/variant.ts +0 -247
  667. package/src/migrations/maybeAddModuleCache.ts +0 -68
  668. package/src/migrations/maybeCreateFirstProjectId.test.ts +0 -31
  669. package/src/migrations/maybeCreateFirstProjectId.ts +0 -51
  670. package/src/migrations/migrateToDirectory.test.ts +0 -54
  671. package/src/migrations/migrateToDirectory.ts +0 -62
  672. package/src/parseConfig.ts +0 -35
  673. package/src/persistence/batchedIO.test.ts +0 -63
  674. package/src/persistence/batchedIO.ts +0 -64
  675. package/src/persistence/filelock/acquireFileLock.ts +0 -129
  676. package/src/persistence/filelock/releaseLock.ts +0 -29
  677. package/src/persistence/store.test.ts +0 -102
  678. package/src/persistence/store.ts +0 -119
  679. package/src/persistence/storeApi.ts +0 -19
  680. package/src/reactivity/map.ts +0 -135
  681. package/src/reactivity/solid.test.ts +0 -222
  682. package/src/reactivity/solid.ts +0 -42
  683. package/src/reactivity/trigger.ts +0 -46
  684. package/src/resolve-modules/cache.ts +0 -89
  685. package/src/resolve-modules/errors.ts +0 -69
  686. package/src/resolve-modules/import.test.ts +0 -62
  687. package/src/resolve-modules/import.ts +0 -133
  688. package/src/resolve-modules/index.ts +0 -2
  689. package/src/resolve-modules/message-lint-rules/errors.ts +0 -9
  690. package/src/resolve-modules/message-lint-rules/resolveMessageLintRules.ts +0 -27
  691. package/src/resolve-modules/plugins/errors.ts +0 -56
  692. package/src/resolve-modules/plugins/resolvePlugins.test.ts +0 -301
  693. package/src/resolve-modules/plugins/resolvePlugins.ts +0 -129
  694. package/src/resolve-modules/plugins/types.test.ts +0 -53
  695. package/src/resolve-modules/plugins/types.ts +0 -76
  696. package/src/resolve-modules/resolveModules.test.ts +0 -224
  697. package/src/resolve-modules/resolveModules.ts +0 -113
  698. package/src/resolve-modules/types.ts +0 -72
  699. package/src/resolve-modules/validateModuleSettings.test.ts +0 -85
  700. package/src/resolve-modules/validatedModuleSettings.ts +0 -19
  701. package/src/storage/helper.ts +0 -74
  702. package/src/storage/helpers.test.ts +0 -95
  703. package/src/storage/human-id/human-readable-id.ts +0 -27
  704. package/src/telemetry/capture.ts +0 -49
  705. package/src/telemetry/groupIdentify.ts +0 -41
  706. package/src/test-utilities/createMessage.test.ts +0 -118
  707. package/src/test-utilities/createMessage.ts +0 -21
  708. package/src/test-utilities/index.ts +0 -2
  709. package/src/test-utilities/sleep.ts +0 -11
  710. package/src/v2/helper.test.ts +0 -95
  711. package/src/v2/helper.ts +0 -98
  712. package/src/v2/index.ts +0 -3
  713. package/src/v2/mocks/index.ts +0 -2
  714. package/src/v2/mocks/multipleMatcher/bundle.test.ts +0 -11
  715. package/src/v2/mocks/multipleMatcher/bundle.ts +0 -196
  716. package/src/v2/mocks/plural/bundle.test.ts +0 -18
  717. package/src/v2/mocks/plural/bundle.ts +0 -164
  718. package/src/v2/shim.test.ts +0 -56
  719. package/src/v2/shim.ts +0 -173
  720. package/src/v2/stubQueryApi.ts +0 -43
  721. package/src/v2/types.ts +0 -159
  722. package/src/validateProjectPath.test.ts +0 -50
  723. package/src/validateProjectPath.ts +0 -38
  724. package/src/versionedInterfaces.ts +0 -9
  725. /package/dist/{storage/human-id → human-id}/words.d.ts +0 -0
  726. /package/dist/{storage/human-id → human-id}/words.test.d.ts +0 -0
  727. /package/dist/{loadProject.test.d.ts → project/loadProject.test.d.ts} +0 -0
@@ -1,1173 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
2
- import { describe, it, expect, vi } from "vitest"
3
- import { loadProject } from "./loadProject.js"
4
- import type {
5
- ProjectSettings,
6
- Plugin,
7
- MessageLintRule,
8
- Message,
9
- NodeishFilesystemSubset,
10
- } from "./versionedInterfaces.js"
11
- import type { ImportFunction } from "./resolve-modules/index.js"
12
- import type { InlangModule } from "@inlang/module"
13
- import {
14
- ProjectSettingsFileJSONSyntaxError,
15
- ProjectSettingsFileNotFoundError,
16
- ProjectSettingsInvalidError,
17
- } from "./errors.js"
18
- import { normalizePath } from "@lix-js/fs"
19
- import { createMessage } from "./test-utilities/createMessage.js"
20
- import { tryCatch } from "@inlang/result"
21
- import { mockRepo } from "@lix-js/client"
22
- import { type Snapshot } from "@lix-js/fs"
23
- // eslint-disable-next-line no-restricted-imports -- test
24
- import { readFileSync } from "node:fs"
25
- // eslint-disable-next-line no-restricted-imports -- test
26
- import { resolve } from "node:path"
27
-
28
- // ------------------------------------------------------------------------------------------------
29
-
30
- const getValue = <T>(subscribable: { subscribe: (subscriber: (value: T) => void) => void }): T => {
31
- let value: T
32
- subscribable.subscribe((v) => void (value = v))
33
- return value!
34
- }
35
-
36
- const settings: ProjectSettings = {
37
- sourceLanguageTag: "en",
38
- languageTags: ["en"],
39
- modules: ["plugin.js", "lintRule.js"],
40
- messageLintRuleLevels: {
41
- "messageLintRule.project.missingTranslation": "error",
42
- },
43
- "plugin.project.i18next": {
44
- pathPattern: "./examples/example01/{languageTag}.json",
45
- variableReferencePattern: ["{", "}"],
46
- },
47
- }
48
-
49
- const mockPlugin: Plugin = {
50
- id: "plugin.project.i18next",
51
- description: { en: "Mock plugin description" },
52
- displayName: { en: "Mock Plugin" },
53
-
54
- loadMessages: () => exampleMessages,
55
- saveMessages: () => undefined as any,
56
- addCustomApi: () => ({
57
- "app.project.ideExtension": {
58
- messageReferenceMatcher: (text: string) => text as any,
59
- },
60
- }),
61
- }
62
-
63
- // TODO: use `createMessage` utility
64
- const exampleMessages: Message[] = [
65
- {
66
- id: "a",
67
- alias: {},
68
- selectors: [],
69
- variants: [
70
- {
71
- languageTag: "en",
72
- match: [],
73
- pattern: [
74
- {
75
- type: "Text",
76
- value: "test",
77
- },
78
- ],
79
- },
80
- ],
81
- },
82
- {
83
- id: "b",
84
- alias: {},
85
- selectors: [],
86
- variants: [
87
- {
88
- languageTag: "en",
89
- match: [],
90
- pattern: [
91
- {
92
- type: "Text",
93
- value: "test",
94
- },
95
- ],
96
- },
97
- ],
98
- },
99
- ]
100
-
101
- const exampleAliasedMessages: Message[] = [
102
- {
103
- id: "raw_tapir_pause_grateful",
104
- alias: {
105
- default: "a",
106
- },
107
- selectors: [],
108
- variants: [
109
- {
110
- languageTag: "en",
111
- match: [],
112
- pattern: [
113
- {
114
- type: "Text",
115
- value: "test",
116
- },
117
- ],
118
- },
119
- ],
120
- },
121
- {
122
- id: "dizzy_halibut_dial_vaguely",
123
- alias: {
124
- default: "b",
125
- },
126
- selectors: [],
127
- variants: [
128
- {
129
- languageTag: "en",
130
- match: [],
131
- pattern: [
132
- {
133
- type: "Text",
134
- value: "test",
135
- },
136
- ],
137
- },
138
- ],
139
- },
140
- ]
141
-
142
- const mockMessageLintRule: MessageLintRule = {
143
- id: "messageLintRule.project.mock",
144
- description: { en: "Mock lint rule description" },
145
- displayName: { en: "Mock Lint Rule" },
146
- run: () => undefined,
147
- }
148
-
149
- const _import: ImportFunction = async (name) =>
150
- ({
151
- default: name === "plugin.js" ? mockPlugin : mockMessageLintRule,
152
- } satisfies InlangModule)
153
-
154
- const ciTestRepoSnapshot = JSON.parse(
155
- readFileSync(resolve(__dirname, "../mocks/ci-test-repo-no-shallow.json"), {
156
- encoding: "utf-8",
157
- })
158
- ) as Snapshot
159
-
160
- // ------------------------------------------------------------------------------------------------
161
-
162
- /**
163
- * Dear Developers,
164
- *
165
- * Inlang projects (folders) are not like .vscode, .git, or .github folders. Treat em
166
- * like files: they can be renamed and moved around.
167
- */
168
- it("should throw if a project (path) does not have a name", async () => {
169
- const repo = await mockRepo()
170
- const project = await tryCatch(() =>
171
- loadProject({
172
- projectPath: "/source-code/.inlang",
173
- repo,
174
- _import,
175
- })
176
- )
177
- expect(project?.error?.message).toMatch('Expected a path ending in "{name}.inlang" but received ')
178
- })
179
-
180
- it("should throw if a project path does not end with .inlang", async () => {
181
- const repo = await mockRepo()
182
-
183
- const invalidPaths = [
184
- "/source-code/frontend.inlang/settings",
185
- "/source-code/frontend.inlang/settings.json",
186
- "/source-code/frontend.inlang.md",
187
- ]
188
-
189
- for (const invalidPath of invalidPaths) {
190
- const project = await tryCatch(() =>
191
- loadProject({
192
- projectPath: invalidPath,
193
- repo,
194
- _import,
195
- })
196
- )
197
- expect(project.error?.message).toMatch(
198
- 'Expected a path ending in "{name}.inlang" but received '
199
- )
200
- }
201
- })
202
-
203
- describe("initialization", () => {
204
- it("should throw if projectPath is not an absolute path", async () => {
205
- const repo = await mockRepo()
206
-
207
- const result = await tryCatch(() =>
208
- loadProject({
209
- projectPath: "relative/path",
210
- repo,
211
- _import,
212
- })
213
- )
214
- expect(result.error?.message).toBe('Expected an absolute path but received "relative/path".')
215
- expect(result.data).toBeUndefined()
216
- })
217
-
218
- it("should generate projectId on missing projectid", async () => {
219
- const repo = await mockRepo({ fromSnapshot: ciTestRepoSnapshot })
220
-
221
- const existing = await repo.nodeishFs
222
- .readFile("/project.inlang/project_id", {
223
- encoding: "utf-8",
224
- })
225
- .catch((error) => {
226
- return { error }
227
- })
228
-
229
- // @ts-ignore
230
- expect(existing.error.code).toBe("ENOENT")
231
-
232
- const result = await tryCatch(() =>
233
- loadProject({
234
- projectPath: "/project.inlang",
235
- repo,
236
- _import,
237
- })
238
- )
239
-
240
- const newId = await repo.nodeishFs
241
- .readFile("/project.inlang/project_id", {
242
- encoding: "utf-8",
243
- })
244
- .catch((error) => {
245
- return { error }
246
- })
247
-
248
- expect(newId).toBe("aef225403be8b526dfb492a4617fd59d8181e8fef2c7f4aff56ab299046e36ed")
249
-
250
- expect(result.error).toBeUndefined()
251
- expect(result.data).toBeDefined()
252
- })
253
-
254
- it("should reuse projectId on existing projectid", async () => {
255
- const repo = await mockRepo({ fromSnapshot: ciTestRepoSnapshot })
256
-
257
- await repo.nodeishFs.writeFile("/project.inlang/project_id", "testId")
258
-
259
- const result = await tryCatch(() =>
260
- loadProject({
261
- projectPath: "/project.inlang",
262
- repo,
263
- _import,
264
- })
265
- )
266
-
267
- const newId = await repo.nodeishFs
268
- .readFile("/project.inlang/project_id", {
269
- encoding: "utf-8",
270
- })
271
- .catch((error) => {
272
- return { error }
273
- })
274
-
275
- expect(newId).toBe("testId")
276
-
277
- expect(result.error).toBeUndefined()
278
- expect(result.data).toBeDefined()
279
- })
280
-
281
- it.skipIf(() => process.platform !== "win32")("should resolve from a windows path", async () => {
282
- const repo = await mockRepo()
283
- const fs = repo.nodeishFs
284
- await fs.mkdir("C:\\Users\\user\\project.inlang", { recursive: true })
285
- await fs.writeFile("C:\\Users\\user\\project.inlang\\settings.json", JSON.stringify(settings))
286
-
287
- const project = await loadProject({
288
- projectPath: "C:\\Users\\user\\project.inlang",
289
- repo,
290
- _import,
291
- })
292
-
293
- expect(project.errors()).toEqual([])
294
- })
295
-
296
- describe("settings", () => {
297
- it("should return an error if settings file is not found", async () => {
298
- const repo = await mockRepo()
299
- const fs = repo.nodeishFs
300
- fs.mkdir("/user/project", { recursive: true })
301
-
302
- const project = await loadProject({
303
- projectPath: "/user/non-existend-project.inlang",
304
- repo,
305
- _import,
306
- })
307
-
308
- expect(project.errors()![0]).toBeInstanceOf(ProjectSettingsFileNotFoundError)
309
- })
310
-
311
- it("should return an error if settings file is not a valid JSON", async () => {
312
- const repo = await mockRepo()
313
- const fs = repo.nodeishFs
314
- await fs.mkdir("/user/project.inlang", { recursive: true })
315
- await fs.writeFile("/user/project.inlang/settings.json", "invalid json")
316
-
317
- const project = await loadProject({
318
- projectPath: "/user/project.inlang",
319
- repo,
320
- _import,
321
- })
322
-
323
- expect(project.errors()![0]).toBeInstanceOf(ProjectSettingsFileJSONSyntaxError)
324
- })
325
-
326
- it("should return an error if settings file is does not match schema", async () => {
327
- const repo = await mockRepo()
328
- const fs = repo.nodeishFs
329
- await fs.mkdir("/user/project.inlang", { recursive: true })
330
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify({}))
331
-
332
- const project = await loadProject({
333
- projectPath: "/user/project.inlang",
334
- repo,
335
- _import,
336
- })
337
-
338
- expect(project.errors()![0]).toBeInstanceOf(ProjectSettingsInvalidError)
339
- })
340
-
341
- it("should return the parsed settings", async () => {
342
- const repo = await mockRepo()
343
- const fs = repo.nodeishFs
344
- await fs.mkdir("/user/project.inlang", { recursive: true })
345
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
346
- const project = await loadProject({
347
- projectPath: "/user/project.inlang",
348
- repo,
349
- _import,
350
- })
351
-
352
- expect(project.settings()).toStrictEqual(settings)
353
- })
354
-
355
- it("should not re-write the settings to disk when initializing", async () => {
356
- const repo = await mockRepo()
357
- const fs = repo.nodeishFs
358
- const settingsWithDifferentFormatting = JSON.stringify(settings, undefined, 4)
359
- await fs.mkdir("/user/project.inlang", { recursive: true })
360
- await fs.writeFile("/user/project.inlang/settings.json", settingsWithDifferentFormatting)
361
-
362
- const project = await loadProject({
363
- projectPath: "/user/project.inlang",
364
- repo,
365
- _import,
366
- })
367
-
368
- const settingsOnDisk = await fs.readFile("/user/project.inlang/settings.json", {
369
- encoding: "utf-8",
370
- })
371
- expect(settingsOnDisk).toBe(settingsWithDifferentFormatting)
372
-
373
- project.setSettings(project.settings())
374
- // TODO: how can we await `setsettings` correctly
375
- await new Promise((resolve) => setTimeout(resolve, 0))
376
-
377
- const newsettingsOnDisk = await fs.readFile("/user/project.inlang/settings.json", {
378
- encoding: "utf-8",
379
- })
380
- expect(newsettingsOnDisk).not.toBe(settingsWithDifferentFormatting)
381
- })
382
- })
383
-
384
- describe("modules", () => {
385
- it("should return an error if an error occurs while resolving a plugin", async () => {
386
- const $badImport: ImportFunction = async () =>
387
- ({
388
- default: {} as Plugin,
389
- } satisfies InlangModule)
390
-
391
- const repo = await mockRepo()
392
- const fs = repo.nodeishFs
393
- await fs.mkdir("/user/project.inlang", { recursive: true })
394
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
395
-
396
- const project = await loadProject({
397
- projectPath: "/user/project.inlang",
398
- repo,
399
- _import: $badImport,
400
- })
401
-
402
- expect(project.errors()).not.toHaveLength(0)
403
- })
404
- // it.todo("should throw if lintRules contain errors ???")
405
- // it.todo("should return meta data")
406
- // it.todo("should return plugins")
407
- // it.todo("should return lint rules")
408
- })
409
-
410
- describe("flow", () => {
411
- it.todo("should not call functions multiple times")
412
- it.todo("should load modules after settings")
413
- it.todo("should not load messages")
414
- it.todo("should not call lint")
415
- })
416
-
417
- describe("instance object", () => {
418
- it.todo("should contain all fields")
419
- })
420
- })
421
-
422
- describe("functionality", () => {
423
- describe("settings", () => {
424
- it("should return the settings", async () => {
425
- const repo = await mockRepo()
426
- const fs = repo.nodeishFs
427
- await fs.mkdir("/user/project.inlang", { recursive: true })
428
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
429
- const project = await loadProject({
430
- projectPath: "/user/project.inlang",
431
- repo,
432
- _import,
433
- })
434
-
435
- expect(getValue(project.settings)).toStrictEqual(settings)
436
- })
437
-
438
- it("should set a new settings", async () => {
439
- const repo = await mockRepo()
440
- const fs = repo.nodeishFs
441
- await fs.mkdir("/user/project.inlang", { recursive: true })
442
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
443
- const project = await loadProject({
444
- projectPath: "/user/project.inlang",
445
- repo,
446
- _import,
447
- })
448
-
449
- expect(project.settings()).toStrictEqual(settings)
450
-
451
- project.setSettings({ ...settings, languageTags: ["en", "de"] })
452
- expect(getValue(project.settings)).toStrictEqual({ ...settings, languageTags: ["en", "de"] })
453
- expect(project.settings()!.languageTags).toStrictEqual(["en", "de"])
454
-
455
- project.setSettings({ ...settings, languageTags: ["en", "de", "fr"] })
456
- expect(getValue(project.settings)).toStrictEqual({
457
- ...settings,
458
- languageTags: ["en", "de", "fr"],
459
- })
460
- expect(project.settings()!.languageTags).toStrictEqual(["en", "de", "fr"])
461
- })
462
- })
463
-
464
- describe("setSettings", () => {
465
- it("should fail if settings are not valid", async () => {
466
- const repo = await mockRepo()
467
- const fs = repo.nodeishFs
468
- await fs.mkdir("/user/project.inlang", { recursive: true })
469
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
470
- const project = await loadProject({
471
- projectPath: "/user/project.inlang",
472
- repo,
473
- _import,
474
- })
475
-
476
- const result = project.setSettings({} as ProjectSettings)
477
- expect(result.data).toBeUndefined()
478
- expect(result.error).toBeInstanceOf(ProjectSettingsInvalidError)
479
- })
480
-
481
- it("should throw an error if sourceLanguageTag is not in languageTags", async () => {
482
- const repo = await mockRepo()
483
- const fs = repo.nodeishFs
484
- await fs.mkdir("/user/project.inlang", { recursive: true })
485
-
486
- const settings: ProjectSettings = {
487
- sourceLanguageTag: "en",
488
- languageTags: ["de"],
489
- modules: [],
490
- }
491
-
492
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
493
-
494
- const project = await loadProject({
495
- projectPath: "/user/project.inlang",
496
- repo,
497
- _import,
498
- })
499
-
500
- expect(project.errors()).toHaveLength(1)
501
- expect(project.errors()![0]).toBeInstanceOf(ProjectSettingsInvalidError)
502
- })
503
-
504
- it("should write settings to disk", async () => {
505
- const repo = await mockRepo()
506
- const fs = repo.nodeishFs
507
- await fs.mkdir("/user/project.inlang", { recursive: true })
508
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
509
- const project = await loadProject({
510
- projectPath: "/user/project.inlang",
511
- repo,
512
- _import,
513
- })
514
-
515
- const before = await fs.readFile("/user/project.inlang/settings.json", { encoding: "utf-8" })
516
- expect(before).toBeDefined()
517
-
518
- const result = project.setSettings({ ...settings, languageTags: ["en", "nl", "de"] })
519
- expect(result.data).toBeUndefined()
520
- expect(result.error).toBeUndefined()
521
-
522
- // TODO: how to wait for fs.writeFile to finish?
523
- await new Promise((resolve) => setTimeout(resolve, 50))
524
-
525
- const after = await fs.readFile("/user/project.inlang/settings.json", { encoding: "utf-8" })
526
- expect(after).toBeDefined()
527
- expect(after).not.toBe(before)
528
- })
529
- })
530
-
531
- describe("installed", () => {
532
- it("should return the installed items", async () => {
533
- const repo = await mockRepo()
534
- const fs = repo.nodeishFs
535
- const settings: ProjectSettings = {
536
- sourceLanguageTag: "en",
537
- languageTags: ["en"],
538
- modules: ["plugin.js", "lintRule.js"],
539
- }
540
- await fs.mkdir("/user/project.inlang", { recursive: true })
541
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
542
- const project = await loadProject({
543
- projectPath: "/user/project.inlang",
544
- repo,
545
- _import,
546
- })
547
-
548
- expect(project.installed.plugins()[0]).toStrictEqual({
549
- id: mockPlugin.id,
550
- description: mockPlugin.description,
551
- displayName: mockPlugin.displayName,
552
- module: settings.modules[0],
553
- settingsSchema: mockPlugin.settingsSchema,
554
- })
555
-
556
- expect(project.installed.messageLintRules()[0]).toEqual({
557
- id: mockMessageLintRule.id,
558
- description: mockMessageLintRule.description,
559
- displayName: mockMessageLintRule.displayName,
560
- module: settings.modules[1],
561
- level: "warning",
562
- settingsSchema: mockMessageLintRule.settingsSchema,
563
- })
564
- })
565
-
566
- it("should apply 'warning' as default lint level to lint rules that have no lint level defined in the settings", async () => {
567
- const repo = await mockRepo()
568
- const fs = repo.nodeishFs
569
-
570
- const settings: ProjectSettings = {
571
- sourceLanguageTag: "en",
572
- languageTags: ["en"],
573
- modules: ["plugin.js", "lintRule.js"],
574
- }
575
-
576
- await fs.mkdir("/user/project.inlang", { recursive: true })
577
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
578
-
579
- const project = await loadProject({
580
- projectPath: "/user/project.inlang",
581
- repo,
582
- _import,
583
- })
584
-
585
- expect(project.installed.messageLintRules()[0]?.level).toBe("warning")
586
- })
587
-
588
- // yep, this is a typical "hm, we have a bug here, let's write a test for it" test
589
- it("should return lint reports if disabled is not set", async () => {
590
- const _mockLintRule: MessageLintRule = {
591
- id: "messageLintRule.namespace.mock",
592
- description: { en: "Mock lint rule description" },
593
- displayName: { en: "Mock Lint Rule" },
594
- run: ({ report }) => {
595
- report({
596
- messageId: "some-message-1",
597
- languageTag: "en",
598
- body: { en: "lintrule1" },
599
- })
600
- },
601
- }
602
- const _mockPlugin: Plugin = {
603
- id: "plugin.project.i18next",
604
- description: { en: "Mock plugin description" },
605
- displayName: { en: "Mock Plugin" },
606
-
607
- loadMessages: () => [{ id: "some-message", alias: {}, selectors: [], variants: [] }],
608
- saveMessages: () => undefined,
609
- }
610
- const repo = await mockRepo()
611
- const fs = repo.nodeishFs
612
- await fs.mkdir("/user/project.inlang", { recursive: true })
613
- await fs.writeFile(
614
- "/user/project.inlang/settings.json",
615
- JSON.stringify({
616
- sourceLanguageTag: "en",
617
- languageTags: ["en"],
618
- modules: ["plugin.js", "lintRule.js"],
619
- } satisfies ProjectSettings)
620
- )
621
-
622
- const _import: ImportFunction = async (name) => {
623
- return {
624
- default: name === "plugin.js" ? _mockPlugin : _mockLintRule,
625
- } satisfies InlangModule
626
- }
627
- const project = await loadProject({
628
- projectPath: "/user/project.inlang",
629
- repo,
630
- _import,
631
- })
632
-
633
- await new Promise((resolve) => setTimeout(resolve, 510))
634
-
635
- expect(await project.query.messageLintReports.getAll.settled()).toHaveLength(1)
636
- expect((await project.query.messageLintReports.getAll.settled())?.[0]?.ruleId).toBe(
637
- _mockLintRule.id
638
- )
639
- expect(project.installed.messageLintRules()).toHaveLength(1)
640
- })
641
-
642
- it("should return lint reports for a single message", async () => {
643
- const _mockLintRule: MessageLintRule = {
644
- id: "messageLintRule.namepsace.mock",
645
- description: { en: "Mock lint rule description" },
646
- displayName: { en: "Mock Lint Rule" },
647
-
648
- run: ({ report }) => {
649
- report({
650
- messageId: "some-message",
651
- languageTag: "en",
652
- body: { en: "lintrule1" },
653
- })
654
- },
655
- }
656
- const _mockPlugin: Plugin = {
657
- id: "plugin.project.i18next",
658
- description: { en: "Mock plugin description" },
659
- displayName: { en: "Mock Plugin" },
660
-
661
- loadMessages: () => [{ id: "some-message", alias: {}, selectors: [], variants: [] }],
662
- saveMessages: () => undefined,
663
- }
664
- const repo = await mockRepo()
665
- const fs = repo.nodeishFs
666
- await fs.mkdir("/user/project.inlang", { recursive: true })
667
- await fs.writeFile(
668
- "/user/project.inlang/settings.json",
669
- JSON.stringify({
670
- sourceLanguageTag: "en",
671
- languageTags: ["en"],
672
- modules: ["plugin.js", "lintRule.js"],
673
- } satisfies ProjectSettings)
674
- )
675
- const _import: ImportFunction = async (name) => {
676
- return {
677
- default: name === "plugin.js" ? _mockPlugin : _mockLintRule,
678
- } satisfies InlangModule
679
- }
680
-
681
- const project = await loadProject({
682
- projectPath: "/user/project.inlang",
683
- repo,
684
- _import,
685
- })
686
-
687
- await new Promise((resolve) => setTimeout(resolve, 510))
688
-
689
- expect(
690
- await project.query.messageLintReports.get({ where: { messageId: "some-message" } })
691
- ).toHaveLength(1)
692
- })
693
- })
694
-
695
- describe("errors", () => {
696
- it("should return the errors", async () => {
697
- const repo = await mockRepo()
698
- const fs = repo.nodeishFs
699
- await fs.mkdir("/user/project.inlang", { recursive: true })
700
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
701
- const project = await loadProject({
702
- projectPath: "/user/project.inlang",
703
- repo,
704
- _import,
705
- })
706
- project.errors.subscribe((errors) => {
707
- expect(errors).toStrictEqual([])
708
- })
709
- })
710
- })
711
-
712
- describe("customApi", () => {
713
- it("should return the app specific api", async () => {
714
- const repo = await mockRepo()
715
- const fs = repo.nodeishFs
716
- await fs.mkdir("/user/project.inlang", { recursive: true })
717
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
718
- const project = await loadProject({
719
- projectPath: "/user/project.inlang",
720
- repo,
721
- _import,
722
- })
723
-
724
- project.customApi.subscribe((api) => {
725
- expect(api["app.project.ideExtension"]).toBeDefined()
726
- })
727
- })
728
- })
729
-
730
- describe("messages", () => {
731
- it("should return the messages", async () => {
732
- const repo = await mockRepo()
733
- const fs = repo.nodeishFs
734
- await fs.mkdir("/user/project.inlang", { recursive: true })
735
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
736
- const project = await loadProject({
737
- projectPath: "/user/project.inlang",
738
- repo,
739
- _import,
740
- })
741
-
742
- expect(Object.values(project.query.messages.getAll())).toEqual(exampleMessages)
743
- })
744
- })
745
-
746
- describe("messages with aliases", () => {
747
- it("should return the messages", async () => {
748
- const repo = await mockRepo()
749
- const fs = repo.nodeishFs
750
- await fs.mkdir("/user/project.inlang", { recursive: true })
751
- await fs.writeFile(
752
- "/user/project.inlang/settings.json",
753
- JSON.stringify({ ...settings, experimental: { aliases: true } })
754
- )
755
- const project = await loadProject({
756
- projectPath: "/user/project.inlang",
757
- repo,
758
- _import,
759
- })
760
-
761
- expect(Object.values(project.query.messages.getAll())).toEqual(exampleAliasedMessages)
762
- })
763
- })
764
-
765
- describe("query", () => {
766
- it("should call saveMessages() on updates", async () => {
767
- const repo = await mockRepo()
768
- const fs = repo.nodeishFs
769
-
770
- const settings: ProjectSettings = {
771
- sourceLanguageTag: "en",
772
- languageTags: ["en", "de"],
773
- modules: ["plugin.js"],
774
- "plugin.project.json": {
775
- pathPattern: "./resources/{languageTag}.json",
776
- },
777
- }
778
-
779
- await fs.mkdir("/user/project.inlang", { recursive: true })
780
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
781
-
782
- await fs.mkdir("./resources")
783
-
784
- const mockSaveFn = vi.fn()
785
-
786
- const _mockPlugin: Plugin = {
787
- id: "plugin.project.json",
788
- description: { en: "Mock plugin description" },
789
- displayName: { en: "Mock Plugin" },
790
-
791
- loadMessages: () => exampleMessages,
792
- saveMessages: mockSaveFn,
793
- }
794
-
795
- const _import = async () => {
796
- return {
797
- default: _mockPlugin,
798
- } satisfies InlangModule
799
- }
800
-
801
- const project = await loadProject({
802
- projectPath: "/user/project.inlang",
803
- repo,
804
- _import,
805
- })
806
-
807
- await project.query.messages.upsert({
808
- where: { id: "a" },
809
- data: {
810
- id: "a",
811
- alias: {},
812
- selectors: [],
813
- variants: [
814
- {
815
- languageTag: "en",
816
- match: [],
817
- pattern: [
818
- {
819
- type: "Text",
820
- value: "a en",
821
- },
822
- ],
823
- },
824
- {
825
- languageTag: "de",
826
- match: [],
827
- pattern: [
828
- {
829
- type: "Text",
830
- value: "a de",
831
- },
832
- ],
833
- },
834
- ],
835
- },
836
- })
837
-
838
- await project.query.messages.upsert({
839
- where: { id: "b" },
840
- data: {
841
- id: "b",
842
- alias: {},
843
- selectors: [],
844
- variants: [
845
- {
846
- languageTag: "en",
847
- match: [],
848
- pattern: [
849
- {
850
- type: "Text",
851
- value: "b en",
852
- },
853
- ],
854
- },
855
- {
856
- languageTag: "de",
857
- match: [],
858
- pattern: [
859
- {
860
- type: "Text",
861
- value: "b de",
862
- },
863
- ],
864
- },
865
- ],
866
- },
867
- })
868
-
869
- // lets wait for the next tick
870
- await new Promise((resolve) => setTimeout(resolve, 100))
871
-
872
- expect(mockSaveFn.mock.calls.length).toBe(1)
873
-
874
- expect(mockSaveFn.mock.calls[0][0].settings).toStrictEqual(settings)
875
-
876
- expect(Object.values(mockSaveFn.mock.calls[0][0].messages)).toStrictEqual([
877
- {
878
- id: "a",
879
- alias: {},
880
- selectors: [],
881
- variants: [
882
- {
883
- languageTag: "de",
884
- match: [],
885
- pattern: [
886
- {
887
- type: "Text",
888
- value: "a de",
889
- },
890
- ],
891
- },
892
- {
893
- languageTag: "en",
894
- match: [],
895
- pattern: [
896
- {
897
- type: "Text",
898
- value: "a en",
899
- },
900
- ],
901
- },
902
- ],
903
- },
904
- {
905
- id: "b",
906
- alias: {},
907
- selectors: [],
908
- variants: [
909
- {
910
- languageTag: "de",
911
- match: [],
912
- pattern: [
913
- {
914
- type: "Text",
915
- value: "b de",
916
- },
917
- ],
918
- },
919
- {
920
- languageTag: "en",
921
- match: [],
922
- pattern: [
923
- {
924
- type: "Text",
925
- value: "b en",
926
- },
927
- ],
928
- },
929
- ],
930
- },
931
- ])
932
- })
933
-
934
- /*
935
- * Passing all messages to saveMessages() simplifies plugins by an order of magnitude.
936
- *
937
- * The alternative would be to pass only the messages that changed to saveMessages().
938
- * But, this would require plugins to maintain a separate data structure of messages
939
- * and create optimizations, leading to (unjustified) complexity for plugin authors.
940
- *
941
- * Pros:
942
- * - plugins don't need to transform the data (time complexity).
943
- * - plugins don't to maintain a separate data structure (space complexity).
944
- * - plugin authors don't need to deal with optimizations (ecosystem complexity).
945
- *
946
- * Cons:
947
- * - Might be slow for a large number of messages. The requirement hasn't popped up yet though.
948
- */
949
- it("should pass all messages, regardless of which message changed, to saveMessages()", async () => {
950
- const repo = await mockRepo()
951
- const fs = repo.nodeishFs
952
-
953
- const settings: ProjectSettings = {
954
- sourceLanguageTag: "en",
955
- languageTags: ["en", "de"],
956
- modules: ["plugin.js"],
957
- "plugin.placeholder.name": {
958
- pathPattern: "./resources/{languageTag}.json",
959
- },
960
- }
961
-
962
- await fs.mkdir("./project.inlang", { recursive: true })
963
- await fs.writeFile("./project.inlang/settings.json", JSON.stringify(settings))
964
-
965
- const mockSaveFn = vi.fn()
966
-
967
- const _mockPlugin: Plugin = {
968
- id: "plugin.placeholder.name",
969
- description: "Mock plugin description",
970
- displayName: "Mock Plugin",
971
-
972
- loadMessages: () => [
973
- createMessage("first", { en: "first message" }),
974
- createMessage("second", { en: "second message" }),
975
- createMessage("third", { en: "third message" }),
976
- ],
977
- saveMessages: mockSaveFn,
978
- }
979
-
980
- const _import = async () => {
981
- return {
982
- default: _mockPlugin,
983
- } satisfies InlangModule
984
- }
985
-
986
- const project = await loadProject({
987
- projectPath: "/project.inlang",
988
- repo,
989
- _import,
990
- })
991
-
992
- project.query.messages.create({ data: createMessage("fourth", { en: "fourth message" }) })
993
-
994
- await new Promise((resolve) => setTimeout(resolve, 510))
995
-
996
- expect(mockSaveFn.mock.calls.length).toBe(1)
997
- expect(mockSaveFn.mock.calls[0][0].messages).toHaveLength(4)
998
-
999
- project.query.messages.create({ data: createMessage("fifth", { en: "fifth message" }) })
1000
-
1001
- await new Promise((resolve) => setTimeout(resolve, 510))
1002
-
1003
- expect(mockSaveFn.mock.calls.length).toBe(2)
1004
- expect(mockSaveFn.mock.calls[1][0].messages).toHaveLength(5)
1005
-
1006
- project.query.messages.delete({ where: { id: "fourth" } })
1007
-
1008
- await new Promise((resolve) => setTimeout(resolve, 510))
1009
-
1010
- expect(mockSaveFn.mock.calls.length).toBe(3)
1011
- expect(mockSaveFn.mock.calls[2][0].messages).toHaveLength(4)
1012
- })
1013
- })
1014
-
1015
- describe("lint", () => {
1016
- it("should return the message lint reports", async () => {
1017
- const settings: ProjectSettings = {
1018
- sourceLanguageTag: "en",
1019
- languageTags: ["en"],
1020
- modules: ["lintRule.js"],
1021
- }
1022
- const repo = await mockRepo()
1023
- const fs = repo.nodeishFs
1024
- await fs.mkdir("/user/project.inlang", { recursive: true })
1025
- await fs.writeFile("/user/project.inlang/settings.json", JSON.stringify(settings))
1026
- const project = await loadProject({
1027
- projectPath: "/user/project.inlang",
1028
- repo,
1029
- _import: async () => ({
1030
- default: mockMessageLintRule,
1031
- }),
1032
- })
1033
- // TODO: test with real lint rules
1034
- const r = await project.query.messageLintReports.getAll.settled()
1035
- expect(r).toEqual([])
1036
- })
1037
- })
1038
-
1039
- describe("watcher", () => {
1040
- it("changing files in resources should trigger callback of message query", async () => {
1041
- const repo = await mockRepo()
1042
- const fs = repo.nodeishFs
1043
-
1044
- const messages = {
1045
- $schema: "https://inlang.com/schema/inlang-message-format",
1046
- data: [
1047
- {
1048
- id: "test",
1049
- selectors: [],
1050
- variants: [
1051
- {
1052
- match: [],
1053
- languageTag: "en",
1054
- pattern: [
1055
- {
1056
- type: "Text",
1057
- value: "test",
1058
- },
1059
- ],
1060
- },
1061
- ],
1062
- },
1063
- ],
1064
- }
1065
-
1066
- const newMessage = {
1067
- id: "test2",
1068
- selectors: [],
1069
- variants: [
1070
- {
1071
- match: [],
1072
- languageTag: "en",
1073
- pattern: [
1074
- {
1075
- type: "Text",
1076
- value: "test",
1077
- },
1078
- ],
1079
- },
1080
- ],
1081
- }
1082
-
1083
- await fs.writeFile("./messages.json", JSON.stringify(messages))
1084
-
1085
- const getMessages = async (customFs: NodeishFilesystemSubset) => {
1086
- const file = await customFs.readFile("./messages.json", { encoding: "utf-8" })
1087
- return JSON.parse(file.toString()).data
1088
- }
1089
-
1090
- const mockMessageFormatPlugin: Plugin = {
1091
- id: "plugin.inlang.messageFormat",
1092
- description: { en: "Mock plugin description" },
1093
- displayName: { en: "Mock Plugin" },
1094
-
1095
- loadMessages: async (args) => await getMessages(args.nodeishFs),
1096
- saveMessages: () => undefined as any,
1097
- }
1098
-
1099
- const settings: ProjectSettings = {
1100
- sourceLanguageTag: "en",
1101
- languageTags: ["en"],
1102
- modules: ["plugin.js"],
1103
- "plugin.inlang.messageFormat": {
1104
- filePath: "./messages.json",
1105
- },
1106
- }
1107
-
1108
- await fs.mkdir("./project.inlang", { recursive: true })
1109
- await fs.writeFile("./project.inlang/settings.json", JSON.stringify(settings))
1110
-
1111
- // establish watcher
1112
- const project = await loadProject({
1113
- projectPath: normalizePath("/project.inlang"),
1114
- repo,
1115
- _import: async () => ({
1116
- default: mockMessageFormatPlugin,
1117
- }),
1118
- })
1119
-
1120
- let counter = 0
1121
- let messageCount = 0
1122
-
1123
- project.query.messages.getAll.subscribe((messages) => {
1124
- counter = counter + 1
1125
- messageCount = messages.length
1126
- })
1127
-
1128
- // subscribe fires once
1129
- expect(counter).toBe(1)
1130
-
1131
- // saving the file without changing should not trigger a message query
1132
- await fs.writeFile("./messages.json", JSON.stringify(messages))
1133
- await new Promise((resolve) => setTimeout(resolve, 200)) // file event will lock a file and be handled sequentially - give it time to pickup the change
1134
-
1135
- // we didn't change the message we write into message.json - shouldn't change the messages
1136
- expect(counter).toBe(1)
1137
- expect(messageCount).toBe(1)
1138
-
1139
- // saving the file without changing should trigger a change
1140
- messages.data[0]!.variants[0]!.pattern[0]!.value = "changed"
1141
- await fs.writeFile("./messages.json", JSON.stringify(messages))
1142
- await new Promise((resolve) => setTimeout(resolve, 200)) // file event will lock a file and be handled sequentially - give it time to pickup the change
1143
-
1144
- expect(counter).toBe(2)
1145
- expect(messageCount).toBe(1)
1146
-
1147
- messages.data[0]!.variants[0]!.pattern[0]!.value = "changed3"
1148
-
1149
- // change file - update message
1150
- await fs.writeFile("./messages.json", JSON.stringify(messages))
1151
- await new Promise((resolve) => setTimeout(resolve, 200)) // file event will lock a file and be handled sequentially - give it time to pickup the change
1152
-
1153
- expect(counter).toBe(3)
1154
- expect(messageCount).toBe(1)
1155
-
1156
- // change file - add a message
1157
- messages.data.push(newMessage)
1158
- await fs.writeFile("./messages.json", JSON.stringify(messages))
1159
- await new Promise((resolve) => setTimeout(resolve, 200)) // file event will lock a file and be handled sequentially - give it time to pickup the change
1160
-
1161
- expect(counter).toBe(4)
1162
- expect(messageCount).toBe(2)
1163
-
1164
- // change file - remove a message
1165
- messages.data.pop()
1166
- await fs.writeFile("./messages.json", JSON.stringify(messages))
1167
- await new Promise((resolve) => setTimeout(resolve, 200)) // file event will lock a file and be handled sequentially - give it time to pickup the change
1168
-
1169
- expect(counter).toBe(5)
1170
- expect(messageCount).toBe(1)
1171
- })
1172
- })
1173
- })