@inlang/sdk 2.4.9 → 2.4.10

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 (44) hide show
  1. package/dist/database/jsonPlugin.d.ts +11 -0
  2. package/dist/database/jsonPlugin.d.ts.map +1 -0
  3. package/dist/database/jsonPlugin.js +197 -0
  4. package/dist/database/jsonPlugin.js.map +1 -0
  5. package/dist/project/fs-sync.playground.test.d.ts +2 -0
  6. package/dist/project/fs-sync.playground.test.d.ts.map +1 -0
  7. package/dist/project/fs-sync.playground.test.js +535 -0
  8. package/dist/project/fs-sync.playground.test.js.map +1 -0
  9. package/dist/project/loadProjectFromDirectory.d.ts.map +1 -1
  10. package/dist/project/loadProjectFromDirectory.js +7 -3
  11. package/dist/project/loadProjectFromDirectory.js.map +1 -1
  12. package/dist/schema-definitions/bundle.d.ts +22 -0
  13. package/dist/schema-definitions/bundle.d.ts.map +1 -0
  14. package/dist/schema-definitions/bundle.js +18 -0
  15. package/dist/schema-definitions/bundle.js.map +1 -0
  16. package/dist/schema-definitions/bundle.test.d.ts +2 -0
  17. package/dist/schema-definitions/bundle.test.d.ts.map +1 -0
  18. package/dist/schema-definitions/bundle.test.js +23 -0
  19. package/dist/schema-definitions/bundle.test.js.map +1 -0
  20. package/dist/schema-definitions/index.d.ts +4 -0
  21. package/dist/schema-definitions/index.d.ts.map +1 -0
  22. package/dist/schema-definitions/index.js +4 -0
  23. package/dist/schema-definitions/index.js.map +1 -0
  24. package/dist/schema-definitions/message.d.ts +35 -0
  25. package/dist/schema-definitions/message.d.ts.map +1 -0
  26. package/dist/schema-definitions/message.js +26 -0
  27. package/dist/schema-definitions/message.js.map +1 -0
  28. package/dist/schema-definitions/message.test.d.ts +2 -0
  29. package/dist/schema-definitions/message.test.d.ts.map +1 -0
  30. package/dist/schema-definitions/message.test.js +45 -0
  31. package/dist/schema-definitions/message.test.js.map +1 -0
  32. package/dist/schema-definitions/variant.d.ts +35 -0
  33. package/dist/schema-definitions/variant.d.ts.map +1 -0
  34. package/dist/schema-definitions/variant.js +26 -0
  35. package/dist/schema-definitions/variant.js.map +1 -0
  36. package/dist/schema-definitions/variant.test.d.ts +2 -0
  37. package/dist/schema-definitions/variant.test.d.ts.map +1 -0
  38. package/dist/schema-definitions/variant.test.js +67 -0
  39. package/dist/schema-definitions/variant.test.js.map +1 -0
  40. package/dist/services/env-variables/index.d.ts +2 -2
  41. package/dist/services/env-variables/index.js +3 -3
  42. package/dist/services/env-variables/index.js.map +1 -1
  43. package/package.json +4 -4
  44. package/src/project/loadProjectFromDirectory.ts +10 -5
@@ -1 +1 @@
1
- {"version":3,"file":"loadProjectFromDirectory.js","sourceRoot":"/","sources":["project/loadProjectFromDirectory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAY,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,QAAQ,MAAM,WAAW,CAAC;AAKjC,OAAO,EAAE,aAAa,EAAE,MAAM,gDAAgD,CAAC;AAG/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mCAAmC,EAAE,MAAM,yDAAyD,CAAC;AAG9G;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC7C,IAGC;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAClC,CAAC;IAErB,IAAI,QAAQ,GAAuB,SAAS,CAAC;IAE7C,IAAI,CAAC;QACJ,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CACzC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EACtC,MAAM,CACN,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,oCAAoC;QACpC,2CAA2C;QAC3C,KAAK;QACL,wBAAwB;QACxB,KAAK;QACL,yBAAyB;IAC1B,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC;QAC5C,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,QAAQ;QACR,IAAI,EAAE,IAAI,CAAC,IAAI;KACf,CAAC,CAAC;IAEH,MAAM,8BAA8B,GAAG;QACtC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;QAC9B,GAAG,WAAW,CAAC,sBAAsB;KACrC,CAAC;IAEF,mDAAmD;IACnD,6BAA6B;IAC7B,0DAA0D;IAC1D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;QAC/B,QAAQ;KACR,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAExD,MAAM,cAAc,CAAC;QACpB,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,EAAE,OAAO;QACZ,YAAY,EAAE,SAAS;KACvB,CAAC,CAAC;IAEH,kJAAkJ;IAClJ,sCAAsC;IACtC,kEAAkE;IAClE,0GAA0G;IAC1G,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACzC,GAAG,IAAI;QACP,cAAc,EAAE,8BAA8B;QAC9C,YAAY,EAAE,QAAQ;YACrB,CAAC,CAAC,mEAAmE;gBACpE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YACrC,CAAC,CAAC,SAAS;QACZ,IAAI,EAAE,MAAM,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;KACpC,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,QAAQ,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAEjC,MAAM,cAAc,CAAC;QACpB,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,YAAY,EAAE,IAAI,CAAC,YAAY;KAC/B,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/C,MAAM,EAAE,eAAe,EAAE,mBAAmB,EAAE,GAC7C,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAE/B,yFAAyF;IACzF,6BAA6B;IAC7B,oJAAoJ;IACpJ,8FAA8F;IAC9F,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACd,+BAA+B;YAC9B,eAAe,CAAC,MAAM;YACtB,yCAAyC;YACzC,eAAe,CAAC,MAAM;YACtB,gBAAgB,CACjB,CAAC;IACH,CAAC;IACD,MAAM,0BAA0B,GAAY,EAAE,CAAC;IAE/C,6BAA6B;IAC7B,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC9B,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC;gBACxD,QAAQ,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;aACtC,CAAC,CAAC;YACH,KAAK,MAAM,YAAY,IAAI,iBAAiB,EAAE,CAAC;gBAC9C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;gBACvE,IAAI,CAAC;oBACJ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACvD,KAAK,CAAC,IAAI,CAAC;wBACV,MAAM,EAAE,YAAY,CAAC,MAAM;wBAC3B,OAAO,EAAE,IAAI;wBACb,yBAAyB,EAAE,YAAY,CAAC,QAAQ;qBAChD,CAAC,CAAC;gBACJ,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACZ,iDAAiD;oBACjD,IAAK,CAAS,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACnC,SAAS;oBACV,CAAC;oBACD,0BAA0B,CAAC,IAAI,CAC9B,IAAI,uBAAuB,CAAC;wBAC3B,KAAK,EAAE,CAAU;wBACjB,IAAI,EAAE,YAAY,CAAC,IAAI;qBACvB,CAAC,CACF,CAAC;gBACH,CAAC;YACF,CAAC;QACF,CAAC;QAED,MAAM,OAAO,CAAC,WAAW,CAAC;YACzB,SAAS,EAAE,MAAM,CAAC,GAAG;YACrB,KAAK;SACL,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,kBAAkB,CAAC;YACxB,OAAO;YACP,SAAS,EAAE,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE;YAClC,cAAc,EAAE,MAAM,CAAC,YAAa;YACpC,WAAW,EAAE,IAAI,CAAC,IAAI;YACtB,EAAE,EAAE,IAAI,CAAC,EAAE;SACX,CAAC,CAAC;IACJ,CAAC;IAED,OAAO;QACN,GAAG,OAAO;QACV,MAAM,EAAE;YACP,GAAG,EAAE,KAAK,IAAI,EAAE;gBACf,OAAO;oBACN,GAAG,6BAA6B,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;oBAC5D,GAAG,WAAW,CAAC,MAAM;oBACrB,GAAG,0BAA0B;iBAC7B,CAAC;YACH,CAAC;YACD,eAAe;YACf,iEAAiE;YACjE,SAAS;YACT,gDAAgD;YAChD,eAAe;YACf,iDAAiD;YACjD,4BAA4B;YAC5B,oCAAoC;YACpC,QAAQ;YACR,OAAO;YACP,KAAK;SACL;KACD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAMjC;IACA,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;QACtD,QAAQ,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;QAC3C,mCAAmC;QACnC,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC;KAChE,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,EAAE,CAAC;IAEzB,KAAK,MAAM,aAAa,IAAI,oBAAoB,EAAE,CAAC;QAClD,MAAM,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;QAEnD,aAAa,CAAC,IAAI,CACjB,mCAAmC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,CACnE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACzC,CAAC;AAUD,SAAS,iBAAiB,CAAC,CAAc,EAAE,CAAc;IACxD,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAEhD,2CAA2C;IAC3C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAEhC,oBAAoB;IACpB,KAAK,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAS,6BAA6B,CACrC,MAAwB;IAExB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9B,IACC,KAAK,YAAY,iBAAiB;YAClC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,KAAK,EACxC,CAAC;YACF,OAAO,KAAK,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,IAK7B;IACA,2IAA2I;IAC3I,KAAK,UAAU,qBAAqB,CACnC,OAAe,EACf,YAAyB;QAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACP,gFAAgF;gBAChF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAA2B,CAAC;gBAEtE,MAAM,YAAY,GAAG,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAElE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;oBACjC,YAAY,CAAC,YAAY,CAAC,GAAG;wBAC5B,OAAO,EAAE,IAAI;wBACb,KAAK,EAAE,SAAS;qBAChB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,IAAI,iBAAiB,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;wBACjE,YAAY,CAAC,YAAY,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC;oBAC5C,CAAC;yBAAM,CAAC;wBACP,YAAY,CAAC,YAAY,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC;wBAC7C,YAAY,CAAC,YAAY,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;oBAC3C,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,KAAK,UAAU,aAAa,CAAC,eAA4B;QACxD,oDAAoD;QACpD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;aAClC,UAAU,CAAC,MAAM,CAAC;aAClB,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC;aACvC,SAAS,EAAE;aACX,OAAO,EAAE,CAAC;QAEZ,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,uBAAuB,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAChE,gFAAgF;YAChF,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC9B,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG;oBACjC,OAAO,EAAE,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM;oBAC9C,KAAK,EAAE,SAAS;iBAChB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,IACC,iBAAiB,CAChB,uBAAuB,CAAC,OAAO,EAC/B,SAAS,CAAC,IAAI,CAAC,MAAqB,CACpC,EACA,CAAC;oBACF,uBAAuB,CAAC,KAAK,GAAG,OAAO,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACP,uBAAuB,CAAC,KAAK,GAAG,SAAS,CAAC;oBAC1C,uBAAuB,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI;yBAC9C,MAAqB,CAAC;gBACzB,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,KAAK,UAAU,mBAAmB,CAAC,YAGlC;QACA,+DAA+D;QAC/D,mCAAmC;QACnC,iBAAiB;QACjB,yBAAyB;QACzB,aAAa;QACb,eAAe;QACf,+CAA+C;QAC/C,gBAAgB;QAChB,8CAA8C;QAC9C,OAAO;QACP,IAAI;QAEJ,cAAc;QACd,8GAA8G;QAC9G,2GAA2G;QAC3G,+FAA+F;QAC/F,+GAA+G;QAC/G,+FAA+F;QAC/F,+FAA+F;QAE/F,oDAAoD;QAEpD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;YACzE,2BAA2B;YAC3B,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBACjC,gBAAgB;oBAChB,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;oBACnD,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG;wBAClC,KAAK,EAAE,OAAO;wBACd,OAAO,EAAE,OAAO,CAAC,OAAO;qBACxB,CAAC;oBACF,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACP,kCAAkC;oBAClC,qEAAqE;oBACrE,MAAM,IAAI,KAAK,CACd,0CAA0C;wBACzC,IAAI;wBACJ,aAAa;wBACb,OAAO,CAAC,KAAK;wBACb,8BAA8B,CAC/B,CAAC;gBACH,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAClD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBACjC,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;wBAClC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;4BAC1D,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC;4BACzB,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC;wBACzB,CAAC;6BAAM,CAAC;4BACP,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;4BACnD,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;4BACnC,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC;4BACzB,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC;wBACzB,CAAC;oBACF,CAAC;yBAAM,CAAC;wBACP,mBAAmB;wBACnB,MAAM,IAAI,KAAK,CACd,0CAA0C;4BACzC,IAAI;4BACJ,aAAa;4BACb,OAAO,CAAC,KAAK;4BACb,+BAA+B,CAChC,CAAC;oBACH,CAAC;gBACF,CAAC;qBAAM,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;oBACtC,IAAI,QAAQ,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;wBAChC,uBAAuB;oBACxB,CAAC;yBAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;wBACzC,eAAe;wBACf,IAAI,CAAC,EAAE,CAAC,aAAa;wBACpB,iDAAiD;wBACjD,IAAI,CAAC,IAAI,GAAG,IAAI,EAChB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC7B,CAAC;wBACF,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;wBACnC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC;wBACxB,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC;oBAC1B,CAAC;yBAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;wBACtC,iBAAiB;wBACjB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;wBACrC,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC;wBACvB,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC;oBACzB,CAAC;gBACF,CAAC;qBAAM,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxC,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;wBAClC,uEAAuE;wBACvE,MAAM,IAAI,KAAK,CACd,0CAA0C;4BACzC,IAAI;4BACJ,aAAa;4BACb,OAAO,CAAC,KAAK;4BACb,mCAAmC,CACpC,CAAC;oBACH,CAAC;yBAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;wBACvC,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;wBACnD,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;wBAEnC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC;oBACzB,CAAC;yBAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;wBACzC,iHAAiH;wBACjH,OAAO,CAAC,IAAI,CACX,0CAA0C;4BACzC,IAAI;4BACJ,yEAAyE,CAC1E,CAAC;wBACF,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;wBACnD,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;wBACnC,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC;wBACzB,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC;oBACzB,CAAC;yBAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;wBACtC,OAAO,CAAC,IAAI,CACX,oGAAoG,CACpG,CAAC;wBACF,4BAA4B;wBAC5B,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;wBACnC,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC;wBACzB,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC;oBACzB,CAAC;gBACF,CAAC;qBAAM,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;oBACrC,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;wBAClC,uEAAuE;wBACvE,MAAM,IAAI,KAAK,CACd,0CAA0C;4BACzC,IAAI;4BACJ,aAAa;4BACb,OAAO,CAAC,KAAK;4BACb,mCAAmC,CACpC,CAAC;oBACH,CAAC;yBAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;wBACvC,gFAAgF;wBAChF,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;6BACf,UAAU,CAAC,MAAM,CAAC;6BAClB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;6BACxB,OAAO,EAAE,CAAC;wBACZ,0EAA0E;wBAC1E,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC;oBACzB,CAAC;yBAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;wBACzC,iHAAiH;wBACjH,OAAO,CAAC,IAAI,CACX,gHAAgH,CAChH,CAAC;wBACF,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;6BACf,UAAU,CAAC,MAAM,CAAC;6BAClB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;6BACxB,OAAO,EAAE,CAAC;wBACZ,0EAA0E;wBAC1E,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC;wBACxB,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC;oBACxB,CAAC;yBAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;wBACtC,OAAO,CAAC,IAAI,CACX,kFAAkF,CAClF,CAAC;wBACF,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC;wBACxB,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC;oBACxB,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3E,0BAA0B;YAC1B,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,IAAI,QAAQ,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC;oBACjC,gBAAgB;oBAChB,iCAAiC;oBACjC,IAAI,CAAC;wBACJ,IAAI,CAAC,EAAE,CAAC,SAAS,CAChB,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAChD;4BACC,SAAS,EAAE,IAAI;yBACf,CACD,CAAC;oBACH,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACZ,qCAAqC;wBACrC,0DAA0D;wBAC1D,IAAK,CAAS,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;4BACnC,MAAM,CAAC,CAAC;wBACT,CAAC;oBACF,CAAC;oBACD,aAAa;oBACb,IAAI,CAAC,EAAE,CAAC,aAAa,CACpB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAC9B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC7B,CAAC;oBACF,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG;wBACjC,KAAK,EAAE,OAAO;wBACd,OAAO,EAAE,QAAQ,CAAC,OAAO;qBACzB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,mBAAmB;oBACnB,oEAAoE;oBACpE,MAAM,IAAI,KAAK,CACd,0CAA0C;wBACzC,IAAI;wBACJ,yBAAyB;wBACzB,QAAQ,CAAC,KAAK;wBACd,gCAAgC,CACjC,CAAC;gBACH,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,IACC,QAAQ,CAAC,KAAK,KAAK,MAAM;oBACzB,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,EAC/C,CAAC;oBACF,OAAO,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBACxC,OAAO,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACxC,CAAC;qBAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBACrE,MAAM,IAAI,KAAK,CACd,wDAAwD;wBACvD,QAAQ,CAAC,KAAK;wBACd,YAAY;wBACZ,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,CACtC,CAAC;gBACH,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,KAAK,UAAU,SAAS,CACvB,OAAe,EACf,UAGC,EACD,QAAiB;QAEjB,8GAA8G;QAC9G,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9D,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC;QACxB,CAAC;QAED,8GAA8G;QAC9G,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAChE,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC;QACzB,CAAC;QAED,yCAAyC;QACzC,MAAM,qBAAqB,CAAC,OAAO,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;QAE9D,wCAAwC;QACxC,MAAM,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAE9C,gBAAgB;QAChB,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAEtC,IAAI,QAAQ,EAAE,CAAC;YACd,UAAU,CAAC,GAAG,EAAE;gBACf,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC1C,CAAC,EAAE,QAAQ,CAAC,CAAC;QACd,CAAC;QAED,OAAO;IACR,CAAC;IAED,4BAA4B;IAC5B,MAAM,SAAS,CACd,IAAI,CAAC,IAAI,EACT,EAAE,YAAY,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,EACvC,IAAI,CAAC,YAAY,CACjB,CAAC;IAEF,OAAO;AACR,CAAC;AAED,KAAK,UAAU,eAAe,CAC7B,IAA+C,EAC/C,IAAY,EACZ,IAAiB;IAEjB,2CAA2C;IAC3C,iDAAiD;IACjD,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAExE,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;QACzC,SAAS,GAAG,GAAG,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SACf,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe;SAClC,MAAM,CAAC;QACP,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC;KAC1B,CAAC;SACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAClB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAC7D;SACA,OAAO,EAAE,CAAC;AACb,CAAC;AACD;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,OAAgC;IAC1D,MAAM,eAAe,GAAmB,EAAE,CAAC;IAC3C,MAAM,mBAAmB,GAAmB,EAAE,CAAC;IAE/C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IACC,MAAM,CAAC,YAAY;YACnB,MAAM,CAAC,YAAY;YACnB,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,EAC1C,CAAC;YACF,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACrD,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACF,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,kBAAkB,CAAC,IAKjC;IACA,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,sBAAsB,GAAG,EAAE,CAAC;IAClC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAClD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,SAAS;QACV,CAAC;QACD,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC;YACJ,IAAI,YAAY,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACvE,IAAI,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;gBACnD,SAAS;YACV,CAAC;YACD,IAAI,IAAI,CAAC,4BAA4B,EAAE,CAAC;gBACvC,YAAY,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,YAAY,CAAC,CAAC;YACtE,CAAC;YACD,MAAM,kBAAkB,GACvB,8BAA8B,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;YACnE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM;YACvC,kBAAkB,CAAC,kBAAkB,CACrC,CAAC;YACF,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAU,EAAE,CAAC,CAAC,CAAC;YAC1E,SAAS;QACV,CAAC;IACF,CAAC;IACD,OAAO;QACN,MAAM;QACN,sBAAsB;KACtB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACnD,YAAY,MAAc;QACzB,KAAK,CACJ,iBAAiB,MAAM,yKAAyK,CAChM,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IACzC,CAAC;CACD;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAChC,EAA8B,EAC9B,WAAmB;IAEnB,OAAO;QACN,wCAAwC;QACxC,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC3B,OAAO,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACzE,CAAC;QACD,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;YACzB,OAAO,EAAE,CAAC,SAAS,CAAC,uBAAuB,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;YACf,OAAO,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACjB,OAAO,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;KACD,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CACtC,WAAmB,EACnB,QAAgB;IAEhB,mDAAmD;IACnD,MAAM,qBAAqB,GAAG,QAAQ;SACpC,SAAS,CAAC,WAAW,CAAC;SACtB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE5E,+EAA+E;IAC/E,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAE5D,sDAAsD;IACtD,IAAI,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7C,OAAO,kBAAkB,CAAC;IAC3B,CAAC;IAED,iCAAiC;IACjC,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAEvE,gDAAgD;IAChD,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACjD,IAAI,CAAS;IAEb,YAAY,IAAoC;QAC/C,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;CACD","sourcesContent":["import { newProject } from \"./newProject.js\";\nimport { loadProjectInMemory } from \"./loadProjectInMemory.js\";\nimport { closeLix, openLixInMemory, toBlob, type Lix } from \"@lix-js/sdk\";\nimport fs from \"node:fs\";\nimport nodePath from \"node:path\";\nimport type {\n\tInlangPlugin,\n\tNodeFsPromisesSubsetLegacy,\n} from \"../plugin/schema.js\";\nimport { fromMessageV1 } from \"../json-schema/old-v1-message/fromMessageV1.js\";\nimport type { ProjectSettings } from \"../json-schema/settings.js\";\nimport type { PreprocessPluginBeforeImportFunction } from \"../plugin/importPlugins.js\";\nimport { PluginImportError } from \"../plugin/errors.js\";\nimport { upsertBundleNestedMatchByProperties } from \"../import-export/upsertBundleNestedMatchByProperties.js\";\nimport type { ImportFile } from \"./api.js\";\n\n/**\n * Loads a project from a directory.\n *\n * Main use case are dev tools that want to load a project from a directory\n * that is stored in git.\n */\nexport async function loadProjectFromDirectory(\n\targs: { path: string; fs: typeof fs; syncInterval?: number } & Omit<\n\t\tParameters<typeof loadProjectInMemory>[0],\n\t\t\"blob\"\n\t>\n) {\n\tconst settingsPath = nodePath.join(args.path, \"settings.json\");\n\tconst settings = JSON.parse(\n\t\tawait args.fs.promises.readFile(settingsPath, \"utf8\")\n\t) as ProjectSettings;\n\n\tlet inlangId: string | undefined = undefined;\n\n\ttry {\n\t\tinlangId = await args.fs.promises.readFile(\n\t\t\tnodePath.join(args.path, \"project_id\"),\n\t\t\t\"utf8\"\n\t\t);\n\t} catch {\n\t\t// await args.fs.promises.writeFile(\n\t\t// \tnodePath.join(args.path, \"project_id\"),\n\t\t// \t,\n\t\t// \t{ encoding: \"utf8\" }\n\t\t// );\n\t\t// file doesn't exist yet\n\t}\n\n\tconst localImport = await importLocalPlugins({\n\t\tfs: args.fs,\n\t\tsettings,\n\t\tpath: args.path,\n\t});\n\n\tconst providePluginsWithLocalPlugins = [\n\t\t...(args.providePlugins ?? []),\n\t\t...localImport.locallyImportedPlugins,\n\t];\n\n\t// Loading a new lix to sync the fs files to before\n\t// opening the inlang project\n\t// https://github.com/opral/inlang-paraglide-js/issues/498\n\tconst newLix = await newProject({\n\t\tsettings,\n\t});\n\n\tconst tempLix = await openLixInMemory({ blob: newLix });\n\n\tawait syncLixFsFiles({\n\t\tfs: args.fs,\n\t\tpath: args.path,\n\t\tlix: tempLix,\n\t\tsyncInterval: undefined,\n\t});\n\n\t// TODO call tempProject.lix.settled() to wait for the new settings file, and remove reload of the proejct as soon as reactive settings has landed\n\t// NOTE: we need to ensure two things:\n\t// 1. settled needs to include the changes from the copyFiles call\n\t// 2. the changes created from the copyFiles call need to be realized and lead to a signal on the settings\n\tconst project = await loadProjectInMemory({\n\t\t...args,\n\t\tprovidePlugins: providePluginsWithLocalPlugins,\n\t\tlixKeyValues: inlangId\n\t\t\t? // reversing the id to have distinguishable lix ids from inlang ids\n\t\t\t\t[{ key: \"lix_id\", value: inlangId }]\n\t\t\t: undefined,\n\t\tblob: await toBlob({ lix: tempLix }),\n\t});\n\n\t// Closing the temp lix\n\tawait closeLix({ lix: tempLix });\n\n\tawait syncLixFsFiles({\n\t\tfs: args.fs,\n\t\tpath: args.path,\n\t\tlix: project.lix,\n\t\tsyncInterval: args.syncInterval,\n\t});\n\n\tconst allPlugins = await project.plugins.get();\n\tconst { loadSavePlugins, importExportPlugins } =\n\t\tcategorizePlugins(allPlugins);\n\n\t// TODO i guess we should move this validation logic into sdk2/src/project/loadProject.ts\n\t// Two scenarios could arise:\n\t// 1. set settings is called from an app - it should detect and reject the setting of settings -> app need to be able to validate before calling set\n\t// 2. the settings file loaded from disc here is corrupted -> user has to fix the file on disc\n\tif (loadSavePlugins.length > 1) {\n\t\tthrow new Error(\n\t\t\t\"Max one loadMessages (found: \" +\n\t\t\t\tloadSavePlugins.length +\n\t\t\t\t\") and one saveMessages plugins (found: \" +\n\t\t\t\tloadSavePlugins.length +\n\t\t\t\t\") are allowed \"\n\t\t);\n\t}\n\tconst importedResourceFileErrors: Error[] = [];\n\n\t// import files from local fs\n\tfor (const plugin of importExportPlugins) {\n\t\tconst files: ImportFile[] = [];\n\t\tif (plugin.toBeImportedFiles) {\n\t\t\tconst toBeImportedFiles = await plugin.toBeImportedFiles({\n\t\t\t\tsettings: await project.settings.get(),\n\t\t\t});\n\t\t\tfor (const toBeImported of toBeImportedFiles) {\n\t\t\t\tconst absolute = absolutePathFromProject(args.path, toBeImported.path);\n\t\t\t\ttry {\n\t\t\t\t\tconst data = await args.fs.promises.readFile(absolute);\n\t\t\t\t\tfiles.push({\n\t\t\t\t\t\tlocale: toBeImported.locale,\n\t\t\t\t\t\tcontent: data,\n\t\t\t\t\t\ttoBeImportedFilesMetadata: toBeImported.metadata,\n\t\t\t\t\t});\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// https://github.com/opral/inlang-sdk/issues/202\n\t\t\t\t\tif ((e as any)?.code === \"ENOENT\") {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\timportedResourceFileErrors.push(\n\t\t\t\t\t\tnew ResourceFileImportError({\n\t\t\t\t\t\t\tcause: e as Error,\n\t\t\t\t\t\t\tpath: toBeImported.path,\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tawait project.importFiles({\n\t\t\tpluginKey: plugin.key,\n\t\t\tfiles,\n\t\t});\n\t}\n\n\tfor (const plugin of loadSavePlugins) {\n\t\tawait loadLegacyMessages({\n\t\t\tproject,\n\t\t\tpluginKey: plugin.key ?? plugin.id,\n\t\t\tloadMessagesFn: plugin.loadMessages!,\n\t\t\tprojectPath: args.path,\n\t\t\tfs: args.fs,\n\t\t});\n\t}\n\n\treturn {\n\t\t...project,\n\t\terrors: {\n\t\t\tget: async () => {\n\t\t\t\treturn [\n\t\t\t\t\t...filterLocalPluginImportErrors(await project.errors.get()),\n\t\t\t\t\t...localImport.errors,\n\t\t\t\t\t...importedResourceFileErrors,\n\t\t\t\t];\n\t\t\t},\n\t\t\t// subscribe: (\n\t\t\t// \tcallback: Parameters<InlangProject[\"errors\"][\"subscribe\"]>[0]\n\t\t\t// ) => {\n\t\t\t// \treturn project.errors.subscribe((value) => {\n\t\t\t// \t\tcallback([\n\t\t\t// \t\t\t...withLocallyImportedPluginWarning(value),\n\t\t\t// \t\t\t...localImport.errors,\n\t\t\t// \t\t\t...importedResourceFileErrors,\n\t\t\t// \t\t]);\n\t\t\t// \t});\n\t\t\t// },\n\t\t},\n\t};\n}\n\nasync function loadLegacyMessages(args: {\n\tproject: Awaited<ReturnType<typeof loadProjectInMemory>>;\n\tpluginKey: NonNullable<InlangPlugin[\"key\"] | InlangPlugin[\"id\"]>;\n\tloadMessagesFn: Required<InlangPlugin>[\"loadMessages\"];\n\tprojectPath: string;\n\tfs: typeof fs;\n}) {\n\tconst loadedLegacyMessages = await args.loadMessagesFn({\n\t\tsettings: await args.project.settings.get(),\n\t\t// @ts-expect-error - type mismatch\n\t\tnodeishFs: withAbsolutePaths(args.fs.promises, args.projectPath),\n\t});\n\tconst upsertQueries = [];\n\n\tfor (const legacyMessage of loadedLegacyMessages) {\n\t\tconst messageBundle = fromMessageV1(legacyMessage);\n\n\t\tupsertQueries.push(\n\t\t\tupsertBundleNestedMatchByProperties(args.project.db, messageBundle)\n\t\t);\n\t}\n\n\treturn await Promise.all(upsertQueries);\n}\n\ntype FsFileState = Record<\n\tstring,\n\t{\n\t\t/*mtime: number, hash: string, */ content: ArrayBuffer;\n\t\tstate: \"known\" | \"unknown\" | \"updated\" | \"gone\";\n\t}\n>;\n\nfunction arrayBuffersEqual(a: ArrayBuffer, b: ArrayBuffer) {\n\tif (a.byteLength !== b.byteLength) return false;\n\n\t// Create views for byte-by-byte comparison\n\tconst view1 = new Uint8Array(a);\n\tconst view2 = new Uint8Array(b);\n\n\t// Compare each byte\n\tfor (const [i, element] of view1.entries()) {\n\t\tif (element !== view2[i]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Filters out errors that are related to local plugins because\n * `loadProjectFromDirectory()` can import local plugins.\n */\nfunction filterLocalPluginImportErrors(\n\terrors: readonly Error[]\n): readonly Error[] {\n\treturn errors.filter((error) => {\n\t\tif (\n\t\t\terror instanceof PluginImportError &&\n\t\t\terror.plugin.startsWith(\"http\") === false\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t});\n}\n\n/**\n * Watches a directory and copies files into lix, keeping them in sync.\n */\nasync function syncLixFsFiles(args: {\n\tfs: typeof fs;\n\tpath: string;\n\tlix: Lix;\n\tsyncInterval?: number;\n}) {\n\t// NOTE this function is async - while it runs 100% sync in the naiv implementation - we may want to change to an async version to optimize\n\tasync function checkFsStateRecursive(\n\t\tdirPath: string,\n\t\tcurrentState: FsFileState\n\t) {\n\t\tconst entries = args.fs.readdirSync(dirPath, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = nodePath.join(dirPath, entry.name);\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tcheckFsStateRecursive(fullPath, currentState);\n\t\t\t} else {\n\t\t\t\t// NOTE we could start with comparing the mdate and skip file read completely...\n\t\t\t\tconst data = args.fs.readFileSync(fullPath) as unknown as ArrayBuffer;\n\n\t\t\t\tconst relativePath = \"/\" + nodePath.relative(args.path, fullPath);\n\n\t\t\t\tif (!currentState[relativePath]) {\n\t\t\t\t\tcurrentState[relativePath] = {\n\t\t\t\t\t\tcontent: data,\n\t\t\t\t\t\tstate: \"unknown\",\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tif (arrayBuffersEqual(currentState[relativePath].content, data)) {\n\t\t\t\t\t\tcurrentState[relativePath].state = \"known\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrentState[relativePath].state = \"updated\";\n\t\t\t\t\t\tcurrentState[relativePath].content = data;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function checkLixState(currentLixState: FsFileState) {\n\t\t// go through all files in lix and check there state\n\t\tconst filesInLix = await args.lix.db\n\t\t\t.selectFrom(\"file\")\n\t\t\t.where(\"path\", \"not like\", \"%db.sqlite\")\n\t\t\t.selectAll()\n\t\t\t.execute();\n\n\t\tfor (const fileInLix of filesInLix) {\n\t\t\tconst currentStateOfFileInLix = currentLixState[fileInLix.path];\n\t\t\t// NOTE we could start with comparing the mdate and skip file read completely...\n\t\t\tif (!currentStateOfFileInLix) {\n\t\t\t\tcurrentLixState[fileInLix.path] = {\n\t\t\t\t\tcontent: new Uint8Array(fileInLix.data).buffer,\n\t\t\t\t\tstate: \"unknown\",\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tarrayBuffersEqual(\n\t\t\t\t\t\tcurrentStateOfFileInLix.content,\n\t\t\t\t\t\tfileInLix.data.buffer as ArrayBuffer\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcurrentStateOfFileInLix.state = \"known\";\n\t\t\t\t} else {\n\t\t\t\t\tcurrentStateOfFileInLix.state = \"updated\";\n\t\t\t\t\tcurrentStateOfFileInLix.content = fileInLix.data\n\t\t\t\t\t\t.buffer as ArrayBuffer;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function syncUpFsAndLixFiles(statesToSync: {\n\t\tfsFileStates: FsFileState;\n\t\tlixFileStates: FsFileState;\n\t}) {\n\t\t// for (const file of Object.keys(statesToSync.fsFileStates)) {\n\t\t// \tif (file.includes(\"gitignore\"))\n\t\t// \t\tconsole.log(\n\t\t// \t\t\t\"fsFileStates : \" +\n\t\t// \t\t\t\tfile +\n\t\t// \t\t\t\t\" fs \" +\n\t\t// \t\t\t\tstatesToSync.fsFileStates[file]?.state +\n\t\t// \t\t\t\t\" lix \" +\n\t\t// \t\t\t\tstatesToSync.lixFileStates[file]?.state\n\t\t// \t\t);\n\t\t// }\n\n\t\t// Sync cases:\n\t\t// fs - no state for file | fs - unkonwn | fs - known | fs - updated | fs - gone\n\t\t// lix - no state for file \tNOTHING\t(1)\t | ADD TO LIX(2) | ERROR (3) | ERROR (4) | ERROR (5)\n\t\t// lix - unknown\t\t\t\t\tADD TO FS (6) | USE FS VER.(7) | ERROR (8) | CASE (9) | CASE (10)\n\t\t// lix - known ERROR (11) | ERROR (12) | NOTHING(13) | ERROR (14) | ERROR (15)\n\t\t// lix - updated\t\t\t\t\tERROR (16) | ERROR (17) | USE LIX (18) | CASE (19) | CASE (20)\n\t\t// lix - gone \t\t\t\t\t\tERROR (21) | ERROR (22) | DELETE FS (23)| CASE (24) | CASE (25)\n\n\t\t// TODO check export import from saveFileToDirectory\n\n\t\tfor (const [path, fsState] of Object.entries(statesToSync.fsFileStates)) {\n\t\t\t// no state for file in LIX\n\t\t\tif (!statesToSync.lixFileStates[path]) {\n\t\t\t\tif (fsState.state === \"unknown\") {\n\t\t\t\t\t// ADD TO LIX(2)\n\t\t\t\t\tawait upsertFileInLix(args, path, fsState.content);\n\t\t\t\t\tstatesToSync.lixFileStates[path] = {\n\t\t\t\t\t\tstate: \"known\",\n\t\t\t\t\t\tcontent: fsState.content,\n\t\t\t\t\t};\n\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t} else {\n\t\t\t\t\t// ERROR (3), ERROR (4), ERROR (5)\n\t\t\t\t\t// The file does not exist in lix but its state differs from unknown?\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Illeagal lix<->fs sync state. The file [\" +\n\t\t\t\t\t\t\tpath +\n\t\t\t\t\t\t\t\"] that was \" +\n\t\t\t\t\t\t\tfsState.state +\n\t\t\t\t\t\t\t\" on disc did not exit in lix\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst lixState = statesToSync.lixFileStates[path];\n\t\t\t\tif (fsState.state === \"unknown\") {\n\t\t\t\t\tif (lixState.state === \"unknown\") {\n\t\t\t\t\t\tif (arrayBuffersEqual(lixState.content, fsState.content)) {\n\t\t\t\t\t\t\tlixState.state = \"known\";\n\t\t\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait upsertFileInLix(args, path, fsState.content);\n\t\t\t\t\t\t\tlixState.content = fsState.content;\n\t\t\t\t\t\t\tlixState.state = \"known\";\n\t\t\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// ERROR 12, 17, 22\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Illeagal lix<->fs sync state. The file [\" +\n\t\t\t\t\t\t\t\tpath +\n\t\t\t\t\t\t\t\t\"] that was \" +\n\t\t\t\t\t\t\t\tfsState.state +\n\t\t\t\t\t\t\t\t\" but did exist in lix already\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (fsState.state === \"known\") {\n\t\t\t\t\tif (lixState.state === \"known\") {\n\t\t\t\t\t\t// NO OP - NOTHING(13)\n\t\t\t\t\t} else if (lixState.state === \"updated\") {\n\t\t\t\t\t\t// USE LIX (18)\n\t\t\t\t\t\targs.fs.writeFileSync(\n\t\t\t\t\t\t\t// TODO check platform dependent folder separator\n\t\t\t\t\t\t\targs.path + path,\n\t\t\t\t\t\t\tBuffer.from(lixState.content)\n\t\t\t\t\t\t);\n\t\t\t\t\t\tfsState.content = lixState.content;\n\t\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t\t\tlixState.state = \"known\";\n\t\t\t\t\t} else if (lixState.state === \"gone\") {\n\t\t\t\t\t\t// DELETE FS (23)\n\t\t\t\t\t\targs.fs.unlinkSync(args.path + path);\n\t\t\t\t\t\tfsState.state = \"gone\";\n\t\t\t\t\t\tlixState.state = \"gone\";\n\t\t\t\t\t}\n\t\t\t\t} else if (fsState.state === \"updated\") {\n\t\t\t\t\tif (lixState.state === \"unknown\") {\n\t\t\t\t\t\t// TODO A file was added to lix while a known file from fs was updated?\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Illeagal lix<->fs sync state. The file [\" +\n\t\t\t\t\t\t\t\tpath +\n\t\t\t\t\t\t\t\t\"] that was \" +\n\t\t\t\t\t\t\t\tfsState.state +\n\t\t\t\t\t\t\t\t\" but it was not known by lix yet?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (lixState.state === \"known\") {\n\t\t\t\t\t\tawait upsertFileInLix(args, path, fsState.content);\n\t\t\t\t\t\tlixState.content = fsState.content;\n\n\t\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t\t} else if (lixState.state === \"updated\") {\n\t\t\t\t\t\t// seems like we saw an update on the file in fs while some changes on lix have not been reached fs? FS -> Winns?\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"seems like we saw an update on the file \" +\n\t\t\t\t\t\t\t\tpath +\n\t\t\t\t\t\t\t\t\" in fs while some changes on lix have not been reached fs? FS -> Winns?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait upsertFileInLix(args, path, fsState.content);\n\t\t\t\t\t\tlixState.content = fsState.content;\n\t\t\t\t\t\tlixState.state = \"known\";\n\t\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t\t} else if (lixState.state === \"gone\") {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"seems like we saw an delete in lix while some changes on fs have not been reached fs? FS -> Winns?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// TODO update the lix state\n\t\t\t\t\t\tlixState.content = fsState.content;\n\t\t\t\t\t\tlixState.state = \"known\";\n\t\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t\t}\n\t\t\t\t} else if (fsState.state === \"gone\") {\n\t\t\t\t\tif (lixState.state === \"unknown\") {\n\t\t\t\t\t\t// TODO A file was added to lix while a known file from fs was removed?\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Illeagal lix<->fs sync state. The file [\" +\n\t\t\t\t\t\t\t\tpath +\n\t\t\t\t\t\t\t\t\"] that was \" +\n\t\t\t\t\t\t\t\tfsState.state +\n\t\t\t\t\t\t\t\t\" but it was not known by lix yet?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (lixState.state === \"known\") {\n\t\t\t\t\t\t// file is in known state with lix - means we have only changes on the fs - easy\n\t\t\t\t\t\tawait args.lix.db\n\t\t\t\t\t\t\t.deleteFrom(\"file\")\n\t\t\t\t\t\t\t.where(\"path\", \"=\", path)\n\t\t\t\t\t\t\t.execute();\n\t\t\t\t\t\t// NOTE: states where both are gone will get removed in the lix state loop\n\t\t\t\t\t\tlixState.state = \"gone\";\n\t\t\t\t\t} else if (lixState.state === \"updated\") {\n\t\t\t\t\t\t// seems like we saw an update on the file in fs while some changes on lix have not been reached fs? FS -> Winns?\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"seems like we saw an update on the file in fs while some changes on lix have not been reached fs? FS -> Winns?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait args.lix.db\n\t\t\t\t\t\t\t.deleteFrom(\"file\")\n\t\t\t\t\t\t\t.where(\"path\", \"=\", path)\n\t\t\t\t\t\t\t.execute();\n\t\t\t\t\t\t// NOTE: states where both are gone will get removed in the lix state loop\n\t\t\t\t\t\tlixState.state = \"gone\";\n\t\t\t\t\t\tfsState.state = \"gone\";\n\t\t\t\t\t} else if (lixState.state === \"gone\") {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"seems like we saw an delete in lix while we have a delete in lix simultaniously?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlixState.state = \"gone\";\n\t\t\t\t\t\tfsState.state = \"gone\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [path, lixState] of Object.entries(statesToSync.lixFileStates)) {\n\t\t\t// no state for file in fs\n\t\t\tif (!statesToSync.fsFileStates[path]) {\n\t\t\t\tif (lixState.state == \"unknown\") {\n\t\t\t\t\t// ADD TO FS (6)\n\t\t\t\t\t// create directory if not exists\n\t\t\t\t\ttry {\n\t\t\t\t\t\targs.fs.mkdirSync(\n\t\t\t\t\t\t\tnodePath.dirname(nodePath.join(args.path, path)),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\trecursive: true,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// ignore if directory already exists\n\t\t\t\t\t\t// https://github.com/opral/inlang-paraglide-js/issues/377\n\t\t\t\t\t\tif ((e as any)?.code !== \"EEXIST\") {\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// write file\n\t\t\t\t\targs.fs.writeFileSync(\n\t\t\t\t\t\tnodePath.join(args.path, path),\n\t\t\t\t\t\tBuffer.from(lixState.content)\n\t\t\t\t\t);\n\t\t\t\t\tstatesToSync.fsFileStates[path] = {\n\t\t\t\t\t\tstate: \"known\",\n\t\t\t\t\t\tcontent: lixState.content,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\t// ERROR (11) 16 21\n\t\t\t\t\t// The file does not exist on fs but its state differs from unknown?\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Illeagal lix<->fs sync state. The file [\" +\n\t\t\t\t\t\t\tpath +\n\t\t\t\t\t\t\t\"] that was in the state\" +\n\t\t\t\t\t\t\tlixState.state +\n\t\t\t\t\t\t\t\" for lix did not exist on disk\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tlixState.state === \"gone\" &&\n\t\t\t\t\tstatesToSync.fsFileStates[path].state === \"gone\"\n\t\t\t\t) {\n\t\t\t\t\tdelete statesToSync.lixFileStates[path];\n\t\t\t\t\tdelete statesToSync.fsFileStates[path];\n\t\t\t\t} else if (lixState.state !== statesToSync.fsFileStates[path].state) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"At this stage both states should be in sync lix state \" +\n\t\t\t\t\t\t\tlixState.state +\n\t\t\t\t\t\t\t\" fs state \" +\n\t\t\t\t\t\t\tstatesToSync.fsFileStates[path].state\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function syncFiles(\n\t\tdirPath: string,\n\t\tfileStates: {\n\t\t\tlixFileStates: FsFileState;\n\t\t\tfsFileStates: FsFileState;\n\t\t},\n\t\tinterval?: number\n\t) {\n\t\t// mark all states as removed - checkFsStateRecursive will update those that exist on the disc correspondingly\n\t\tfor (const fsState of Object.values(fileStates.fsFileStates)) {\n\t\t\tfsState.state = \"gone\";\n\t\t}\n\n\t\t// mark all states as removed - checkFsStateRecursive will update those that exist on the disc correspondingly\n\t\tfor (const lixState of Object.values(fileStates.lixFileStates)) {\n\t\t\tlixState.state = \"gone\";\n\t\t}\n\n\t\t// read states from disc - detect changes\n\t\tawait checkFsStateRecursive(dirPath, fileStates.fsFileStates);\n\n\t\t// read states form lix - detect changes\n\t\tawait checkLixState(fileStates.lixFileStates);\n\n\t\t// sync fs<->lix\n\t\tawait syncUpFsAndLixFiles(fileStates);\n\n\t\tif (interval) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tsyncFiles(dirPath, fileStates, interval);\n\t\t\t}, interval);\n\t\t}\n\n\t\treturn;\n\t}\n\n\t// Initial copy of all files\n\tawait syncFiles(\n\t\targs.path,\n\t\t{ fsFileStates: {}, lixFileStates: {} },\n\t\targs.syncInterval\n\t);\n\n\treturn;\n}\n\nasync function upsertFileInLix(\n\targs: { fs: typeof fs; path: string; lix: Lix },\n\tpath: string,\n\tdata: ArrayBuffer\n) {\n\t// force posix path when upserting into lix\n\t// https://github.com/opral/inlang-sdk/issues/229\n\tlet posixPath = path.split(nodePath.win32.sep).join(nodePath.posix.sep);\n\n\tif (posixPath.startsWith(\"/\") === false) {\n\t\tposixPath = \"/\" + posixPath;\n\t}\n\n\tawait args.lix.db\n\t\t.insertInto(\"file\") // change queue\n\t\t.values({\n\t\t\tpath: posixPath,\n\t\t\tdata: new Uint8Array(data),\n\t\t})\n\t\t.onConflict((oc) =>\n\t\t\toc.column(\"path\").doUpdateSet({ data: new Uint8Array(data) })\n\t\t)\n\t\t.execute();\n}\n/**\n * Filters legacy load and save messages plugins.\n *\n * Legacy plugins are plugins that implement loadMessages and saveMessages but not importFiles and exportFiles.\n */\nfunction categorizePlugins(plugins: readonly InlangPlugin[]) {\n\tconst loadSavePlugins: InlangPlugin[] = [];\n\tconst importExportPlugins: InlangPlugin[] = [];\n\n\tfor (const plugin of plugins) {\n\t\tif (\n\t\t\tplugin.loadMessages &&\n\t\t\tplugin.saveMessages &&\n\t\t\t!(plugin.importFiles && plugin.exportFiles)\n\t\t) {\n\t\t\tloadSavePlugins.push(plugin);\n\t\t} else if (plugin.importFiles || plugin.exportFiles) {\n\t\t\timportExportPlugins.push(plugin);\n\t\t}\n\t}\n\n\treturn { loadSavePlugins, importExportPlugins };\n}\n\n/**\n * Imports local plugins for backwards compatibility.\n *\n * https://github.com/opral/inlang-sdk/issues/171\n */\nasync function importLocalPlugins(args: {\n\tfs: typeof fs;\n\tsettings: ProjectSettings;\n\tpath: string;\n\tpreprocessPluginBeforeImport?: PreprocessPluginBeforeImportFunction;\n}) {\n\tconst errors: Error[] = [];\n\tconst locallyImportedPlugins = [];\n\tfor (const module of args.settings.modules ?? []) {\n\t\tif (module.startsWith(\"http\")) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst modulePath = absolutePathFromProject(args.path, module);\n\t\ttry {\n\t\t\tlet moduleAsText = await args.fs.promises.readFile(modulePath, \"utf8\");\n\t\t\tif (moduleAsText.includes(\"messageLintRule\")) {\n\t\t\t\terrors.push(new WarningDeprecatedLintRule(module));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (args.preprocessPluginBeforeImport) {\n\t\t\t\tmoduleAsText = await args.preprocessPluginBeforeImport(moduleAsText);\n\t\t\t}\n\t\t\tconst moduleWithMimeType =\n\t\t\t\t\"data:application/javascript,\" + encodeURIComponent(moduleAsText);\n\t\t\tconst { default: plugin } = await import(\n\t\t\t\t/* @vite-ignore */ moduleWithMimeType\n\t\t\t);\n\t\t\tlocallyImportedPlugins.push(plugin);\n\t\t} catch (e) {\n\t\t\terrors.push(new PluginImportError({ plugin: module, cause: e as Error }));\n\t\t\tcontinue;\n\t\t}\n\t}\n\treturn {\n\t\terrors,\n\t\tlocallyImportedPlugins,\n\t};\n}\n\nexport class WarningDeprecatedLintRule extends Error {\n\tconstructor(module: string) {\n\t\tsuper(\n\t\t\t`The lint rule ${module} is deprecated. Please remove the lint rule from the settings. Lint rules are interim built into apps and will be succeeded by more generilizable lix validation rules.`\n\t\t);\n\t\tthis.name = \"WarningDeprecatedLintRule\";\n\t}\n}\n\n/**\n * Resolving absolute paths for fs functions.\n *\n * This mapping is required for backwards compatibility.\n * Relative paths in the project.inlang/settings.json\n * file are resolved to absolute paths with `*.inlang`\n * being pruned.\n *\n * @example\n * \"/website/project.inlang\"\n * \"./local-plugins/mock-plugin.js\"\n * -> \"/website/local-plugins/mock-plugin.js\"\n *\n */\nexport function withAbsolutePaths(\n\tfs: NodeFsPromisesSubsetLegacy,\n\tprojectPath: string\n): NodeFsPromisesSubsetLegacy {\n\treturn {\n\t\t// @ts-expect-error - node type mismatch\n\t\treadFile: (path, options) => {\n\t\t\treturn fs.readFile(absolutePathFromProject(projectPath, path), options);\n\t\t},\n\t\twriteFile: (path, data) => {\n\t\t\treturn fs.writeFile(absolutePathFromProject(projectPath, path), data);\n\t\t},\n\t\tmkdir: (path) => {\n\t\t\treturn fs.mkdir(absolutePathFromProject(projectPath, path));\n\t\t},\n\t\treaddir: (path) => {\n\t\t\treturn fs.readdir(absolutePathFromProject(projectPath, path));\n\t\t},\n\t};\n}\n\n/**\n * Joins a path from a project path.\n *\n * @example\n * absolutePathFromProject(\"/project.inlang\", \"./local-plugins/mock-plugin.js\") -> \"/local-plugins/mock-plugin.js\"\n *\n * absolutePathFromProject(\"/website/project.inlang\", \"./mock-plugin.js\") -> \"/website/mock-plugin.js\"\n */\nexport function absolutePathFromProject(\n\tprojectPath: string,\n\tfilePath: string\n): string {\n\t// Normalize paths for consistency across platforms\n\tconst normalizedProjectPath = nodePath\n\t\t.normalize(projectPath)\n\t\t.replace(/\\\\/g, \"/\");\n\tconst normalizedFilePath = nodePath.normalize(filePath).replace(/\\\\/g, \"/\");\n\n\t// Remove the last part of the project path (file name) to get the project root\n\tconst projectRoot = nodePath.dirname(normalizedProjectPath);\n\n\t// If filePath is already absolute, return it directly\n\tif (nodePath.isAbsolute(normalizedFilePath)) {\n\t\treturn normalizedFilePath;\n\t}\n\n\t// Compute absolute resolved path\n\tconst resolvedPath = nodePath.resolve(projectRoot, normalizedFilePath);\n\n\t// Ensure final path always uses forward slashes\n\treturn resolvedPath.replace(/\\\\/g, \"/\");\n}\n\nexport class ResourceFileImportError extends Error {\n\tpath: string;\n\n\tconstructor(args: { cause: Error; path: string }) {\n\t\tsuper(\"Could not import a resource file\");\n\t\tthis.name = \"ResourceFileImportError\";\n\t\tthis.cause = args.cause;\n\t\tthis.path = args.path;\n\t}\n}\n"]}
1
+ {"version":3,"file":"loadProjectFromDirectory.js","sourceRoot":"/","sources":["project/loadProjectFromDirectory.ts"],"names":[],"mappings":"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","sourcesContent":["import { newProject } from \"./newProject.js\";\nimport { loadProjectInMemory } from \"./loadProjectInMemory.js\";\nimport { closeLix, openLixInMemory, toBlob, type Lix } from \"@lix-js/sdk\";\nimport fs from \"node:fs\";\nimport nodePath from \"node:path\";\nimport type {\n\tInlangPlugin,\n\tNodeFsPromisesSubsetLegacy,\n} from \"../plugin/schema.js\";\nimport { fromMessageV1 } from \"../json-schema/old-v1-message/fromMessageV1.js\";\nimport type { ProjectSettings } from \"../json-schema/settings.js\";\nimport type { PreprocessPluginBeforeImportFunction } from \"../plugin/importPlugins.js\";\nimport { PluginImportError } from \"../plugin/errors.js\";\nimport { upsertBundleNestedMatchByProperties } from \"../import-export/upsertBundleNestedMatchByProperties.js\";\nimport type { ImportFile } from \"./api.js\";\n\n/**\n * Loads a project from a directory.\n *\n * Main use case are dev tools that want to load a project from a directory\n * that is stored in git.\n */\nexport async function loadProjectFromDirectory(\n\targs: { path: string; fs: typeof fs; syncInterval?: number } & Omit<\n\t\tParameters<typeof loadProjectInMemory>[0],\n\t\t\"blob\"\n\t>\n) {\n\tconst settingsPath = nodePath.join(args.path, \"settings.json\");\n\tconst settings = JSON.parse(\n\t\tawait args.fs.promises.readFile(settingsPath, \"utf8\")\n\t) as ProjectSettings;\n\n\tlet inlangId: string | undefined = undefined;\n\n\ttry {\n\t\tinlangId = await args.fs.promises.readFile(\n\t\t\tnodePath.join(args.path, \"project_id\"),\n\t\t\t\"utf8\"\n\t\t);\n\t} catch {\n\t\t// await args.fs.promises.writeFile(\n\t\t// \tnodePath.join(args.path, \"project_id\"),\n\t\t// \t,\n\t\t// \t{ encoding: \"utf8\" }\n\t\t// );\n\t\t// file doesn't exist yet\n\t}\n\n\tconst localImport = await importLocalPlugins({\n\t\tfs: args.fs,\n\t\tsettings,\n\t\tpath: args.path,\n\t});\n\n\tconst providePluginsWithLocalPlugins = [\n\t\t...(args.providePlugins ?? []),\n\t\t...localImport.locallyImportedPlugins,\n\t];\n\n\t// Loading a new lix to sync the fs files to before\n\t// opening the inlang project\n\t// https://github.com/opral/inlang-paraglide-js/issues/498\n\tconst newLix = await newProject({\n\t\tsettings,\n\t});\n\n\tconst tempLix = await openLixInMemory({ blob: newLix });\n\n\tawait syncLixFsFiles({\n\t\tfs: args.fs,\n\t\tpath: args.path,\n\t\tlix: tempLix,\n\t\tsyncInterval: undefined,\n\t});\n\n\t// TODO call tempProject.lix.settled() to wait for the new settings file, and remove reload of the proejct as soon as reactive settings has landed\n\t// NOTE: we need to ensure two things:\n\t// 1. settled needs to include the changes from the copyFiles call\n\t// 2. the changes created from the copyFiles call need to be realized and lead to a signal on the settings\n\tconst project = await loadProjectInMemory({\n\t\t...args,\n\t\tprovidePlugins: providePluginsWithLocalPlugins,\n\t\tlixKeyValues: inlangId\n\t\t\t? // reversing the id to have distinguishable lix ids from inlang ids\n\t\t\t\t[{ key: \"lix_id\", value: inlangId }]\n\t\t\t: undefined,\n\t\tblob: await toBlob({ lix: tempLix }),\n\t});\n\n\t// Closing the temp lix\n\tawait closeLix({ lix: tempLix });\n\n\tawait syncLixFsFiles({\n\t\tfs: args.fs,\n\t\tpath: args.path,\n\t\tlix: project.lix,\n\t\tsyncInterval: args.syncInterval,\n\t});\n\n\tconst allPlugins = await project.plugins.get();\n\tconst { loadSavePlugins, importExportPlugins } =\n\t\tcategorizePlugins(allPlugins);\n\n\t// TODO i guess we should move this validation logic into sdk2/src/project/loadProject.ts\n\t// Two scenarios could arise:\n\t// 1. set settings is called from an app - it should detect and reject the setting of settings -> app need to be able to validate before calling set\n\t// 2. the settings file loaded from disc here is corrupted -> user has to fix the file on disc\n\tif (loadSavePlugins.length > 1) {\n\t\tthrow new Error(\n\t\t\t\"Max one loadMessages (found: \" +\n\t\t\t\tloadSavePlugins.length +\n\t\t\t\t\") and one saveMessages plugins (found: \" +\n\t\t\t\tloadSavePlugins.length +\n\t\t\t\t\") are allowed \"\n\t\t);\n\t}\n\tconst importedResourceFileErrors: Error[] = [];\n\n\t// import files from local fs\n\tfor (const plugin of importExportPlugins) {\n\t\tconst files: ImportFile[] = [];\n\t\tif (plugin.toBeImportedFiles) {\n\t\t\tconst toBeImportedFiles = await plugin.toBeImportedFiles({\n\t\t\t\tsettings: await project.settings.get(),\n\t\t\t});\n\t\t\tfor (const toBeImported of toBeImportedFiles) {\n\t\t\t\tconst absolute = absolutePathFromProject(args.path, toBeImported.path);\n\t\t\t\ttry {\n\t\t\t\t\tconst data = await args.fs.promises.readFile(absolute);\n\t\t\t\t\tfiles.push({\n\t\t\t\t\t\tlocale: toBeImported.locale,\n\t\t\t\t\t\tcontent: data,\n\t\t\t\t\t\ttoBeImportedFilesMetadata: toBeImported.metadata,\n\t\t\t\t\t});\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// https://github.com/opral/inlang-sdk/issues/202\n\t\t\t\t\tif ((e as any)?.code === \"ENOENT\") {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\timportedResourceFileErrors.push(\n\t\t\t\t\t\tnew ResourceFileImportError({\n\t\t\t\t\t\t\tcause: e as Error,\n\t\t\t\t\t\t\tpath: toBeImported.path,\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tawait project.importFiles({\n\t\t\tpluginKey: plugin.key,\n\t\t\tfiles,\n\t\t});\n\t}\n\n\tfor (const plugin of loadSavePlugins) {\n\t\tawait loadLegacyMessages({\n\t\t\tproject,\n\t\t\tpluginKey: plugin.key ?? plugin.id,\n\t\t\tloadMessagesFn: plugin.loadMessages!,\n\t\t\tprojectPath: args.path,\n\t\t\tfs: args.fs,\n\t\t});\n\t}\n\n\treturn {\n\t\t...project,\n\t\terrors: {\n\t\t\tget: async () => {\n\t\t\t\treturn [\n\t\t\t\t\t...filterLocalPluginImportErrors(await project.errors.get()),\n\t\t\t\t\t...localImport.errors,\n\t\t\t\t\t...importedResourceFileErrors,\n\t\t\t\t];\n\t\t\t},\n\t\t\t// subscribe: (\n\t\t\t// \tcallback: Parameters<InlangProject[\"errors\"][\"subscribe\"]>[0]\n\t\t\t// ) => {\n\t\t\t// \treturn project.errors.subscribe((value) => {\n\t\t\t// \t\tcallback([\n\t\t\t// \t\t\t...withLocallyImportedPluginWarning(value),\n\t\t\t// \t\t\t...localImport.errors,\n\t\t\t// \t\t\t...importedResourceFileErrors,\n\t\t\t// \t\t]);\n\t\t\t// \t});\n\t\t\t// },\n\t\t},\n\t};\n}\n\nasync function loadLegacyMessages(args: {\n\tproject: Awaited<ReturnType<typeof loadProjectInMemory>>;\n\tpluginKey: NonNullable<InlangPlugin[\"key\"] | InlangPlugin[\"id\"]>;\n\tloadMessagesFn: Required<InlangPlugin>[\"loadMessages\"];\n\tprojectPath: string;\n\tfs: typeof fs;\n}) {\n\tconst loadedLegacyMessages = await args.loadMessagesFn({\n\t\tsettings: await args.project.settings.get(),\n\t\t// @ts-expect-error - type mismatch\n\t\tnodeishFs: withAbsolutePaths(args.fs.promises, args.projectPath),\n\t});\n\tconst upsertQueries = [];\n\n\tfor (const legacyMessage of loadedLegacyMessages) {\n\t\tconst messageBundle = fromMessageV1(legacyMessage);\n\n\t\tupsertQueries.push(\n\t\t\tupsertBundleNestedMatchByProperties(args.project.db, messageBundle)\n\t\t);\n\t}\n\n\treturn await Promise.all(upsertQueries);\n}\n\ntype FsFileState = Record<\n\tstring,\n\t{\n\t\t/*mtime: number, hash: string, */ content: ArrayBuffer;\n\t\tstate: \"known\" | \"unknown\" | \"updated\" | \"gone\";\n\t}\n>;\n\nfunction arrayBuffersEqual(a: ArrayBuffer, b: ArrayBuffer) {\n\tif (a.byteLength !== b.byteLength) return false;\n\n\t// Create views for byte-by-byte comparison\n\tconst view1 = new Uint8Array(a);\n\tconst view2 = new Uint8Array(b);\n\n\t// Compare each byte\n\tfor (const [i, element] of view1.entries()) {\n\t\tif (element !== view2[i]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Filters out errors that are related to local plugins because\n * `loadProjectFromDirectory()` can import local plugins.\n */\nfunction filterLocalPluginImportErrors(\n\terrors: readonly Error[]\n): readonly Error[] {\n\treturn errors.filter((error) => {\n\t\tif (\n\t\t\terror instanceof PluginImportError &&\n\t\t\terror.plugin.startsWith(\"http\") === false\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t});\n}\n\n/**\n * Watches a directory and copies files into lix, keeping them in sync.\n */\nasync function syncLixFsFiles(args: {\n\tfs: typeof fs;\n\tpath: string;\n\tlix: Lix;\n\tsyncInterval?: number;\n}) {\n\t// NOTE this function is async - while it runs 100% sync in the naiv implementation - we may want to change to an async version to optimize\n\tasync function checkFsStateRecursive(\n\t\tdirPath: string,\n\t\tcurrentState: FsFileState\n\t) {\n\t\tconst entries = args.fs.readdirSync(dirPath, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = nodePath.join(dirPath, entry.name);\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tcheckFsStateRecursive(fullPath, currentState);\n\t\t\t} else {\n\t\t\t\t// NOTE we could start with comparing the mdate and skip file read completely...\n\t\t\t\tconst data = args.fs.readFileSync(fullPath) as unknown as ArrayBuffer;\n\n\t\t\t\tconst relativePath = \"/\" + nodePath.relative(args.path, fullPath);\n\n\t\t\t\tif (!currentState[relativePath]) {\n\t\t\t\t\tcurrentState[relativePath] = {\n\t\t\t\t\t\tcontent: data,\n\t\t\t\t\t\tstate: \"unknown\",\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tif (arrayBuffersEqual(currentState[relativePath].content, data)) {\n\t\t\t\t\t\tcurrentState[relativePath].state = \"known\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrentState[relativePath].state = \"updated\";\n\t\t\t\t\t\tcurrentState[relativePath].content = data;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function checkLixState(currentLixState: FsFileState) {\n\t\t// go through all files in lix and check there state\n\t\tconst filesInLix = await args.lix.db\n\t\t\t.selectFrom(\"file\")\n\t\t\t.where(\"path\", \"not like\", \"%db.sqlite\")\n\t\t\t.selectAll()\n\t\t\t.execute();\n\n\t\tfor (const fileInLix of filesInLix) {\n\t\t\tconst currentStateOfFileInLix = currentLixState[fileInLix.path];\n\t\t\t// NOTE we could start with comparing the mdate and skip file read completely...\n\t\t\tif (!currentStateOfFileInLix) {\n\t\t\t\tcurrentLixState[fileInLix.path] = {\n\t\t\t\t\tcontent: new Uint8Array(fileInLix.data).buffer,\n\t\t\t\t\tstate: \"unknown\",\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tarrayBuffersEqual(\n\t\t\t\t\t\tcurrentStateOfFileInLix.content,\n\t\t\t\t\t\tfileInLix.data.buffer as ArrayBuffer\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcurrentStateOfFileInLix.state = \"known\";\n\t\t\t\t} else {\n\t\t\t\t\tcurrentStateOfFileInLix.state = \"updated\";\n\t\t\t\t\tcurrentStateOfFileInLix.content = fileInLix.data\n\t\t\t\t\t\t.buffer as ArrayBuffer;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function syncUpFsAndLixFiles(statesToSync: {\n\t\tfsFileStates: FsFileState;\n\t\tlixFileStates: FsFileState;\n\t}) {\n\t\t// for (const file of Object.keys(statesToSync.fsFileStates)) {\n\t\t// \tif (file.includes(\"gitignore\"))\n\t\t// \t\tconsole.log(\n\t\t// \t\t\t\"fsFileStates : \" +\n\t\t// \t\t\t\tfile +\n\t\t// \t\t\t\t\" fs \" +\n\t\t// \t\t\t\tstatesToSync.fsFileStates[file]?.state +\n\t\t// \t\t\t\t\" lix \" +\n\t\t// \t\t\t\tstatesToSync.lixFileStates[file]?.state\n\t\t// \t\t);\n\t\t// }\n\n\t\t// Sync cases:\n\t\t// fs - no state for file | fs - unkonwn | fs - known | fs - updated | fs - gone\n\t\t// lix - no state for file \tNOTHING\t(1)\t | ADD TO LIX(2) | ERROR (3) | ERROR (4) | ERROR (5)\n\t\t// lix - unknown\t\t\t\t\tADD TO FS (6) | USE FS VER.(7) | ERROR (8) | CASE (9) | CASE (10)\n\t\t// lix - known ERROR (11) | ERROR (12) | NOTHING(13) | ERROR (14) | ERROR (15)\n\t\t// lix - updated\t\t\t\t\tERROR (16) | ERROR (17) | USE LIX (18) | CASE (19) | CASE (20)\n\t\t// lix - gone \t\t\t\t\t\tERROR (21) | ERROR (22) | DELETE FS (23)| CASE (24) | CASE (25)\n\n\t\t// TODO check export import from saveFileToDirectory\n\n\t\tfor (const [path, fsState] of Object.entries(statesToSync.fsFileStates)) {\n\t\t\t// no state for file in LIX\n\t\t\tif (!statesToSync.lixFileStates[path]) {\n\t\t\t\tif (fsState.state === \"unknown\") {\n\t\t\t\t\t// ADD TO LIX(2)\n\t\t\t\t\tawait upsertFileInLix(args, path, fsState.content);\n\t\t\t\t\tstatesToSync.lixFileStates[path] = {\n\t\t\t\t\t\tstate: \"known\",\n\t\t\t\t\t\tcontent: fsState.content,\n\t\t\t\t\t};\n\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t} else {\n\t\t\t\t\t// ERROR (3), ERROR (4), ERROR (5)\n\t\t\t\t\t// The file does not exist in lix but its state differs from unknown?\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Illeagal lix<->fs sync state. The file [\" +\n\t\t\t\t\t\t\tpath +\n\t\t\t\t\t\t\t\"] that was \" +\n\t\t\t\t\t\t\tfsState.state +\n\t\t\t\t\t\t\t\" on disc did not exit in lix\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst lixState = statesToSync.lixFileStates[path];\n\t\t\t\tif (fsState.state === \"unknown\") {\n\t\t\t\t\tif (lixState.state === \"unknown\") {\n\t\t\t\t\t\tif (arrayBuffersEqual(lixState.content, fsState.content)) {\n\t\t\t\t\t\t\tlixState.state = \"known\";\n\t\t\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait upsertFileInLix(args, path, fsState.content);\n\t\t\t\t\t\t\tlixState.content = fsState.content;\n\t\t\t\t\t\t\tlixState.state = \"known\";\n\t\t\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// ERROR 12, 17, 22\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Illeagal lix<->fs sync state. The file [\" +\n\t\t\t\t\t\t\t\tpath +\n\t\t\t\t\t\t\t\t\"] that was \" +\n\t\t\t\t\t\t\t\tfsState.state +\n\t\t\t\t\t\t\t\t\" but did exist in lix already\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (fsState.state === \"known\") {\n\t\t\t\t\tif (lixState.state === \"known\") {\n\t\t\t\t\t\t// NO OP - NOTHING(13)\n\t\t\t\t\t} else if (lixState.state === \"updated\") {\n\t\t\t\t\t\t// USE LIX (18)\n\t\t\t\t\t\targs.fs.writeFileSync(\n\t\t\t\t\t\t\t// TODO check platform dependent folder separator\n\t\t\t\t\t\t\targs.path + path,\n\t\t\t\t\t\t\tBuffer.from(lixState.content)\n\t\t\t\t\t\t);\n\t\t\t\t\t\tfsState.content = lixState.content;\n\t\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t\t\tlixState.state = \"known\";\n\t\t\t\t\t} else if (lixState.state === \"gone\") {\n\t\t\t\t\t\t// DELETE FS (23)\n\t\t\t\t\t\targs.fs.unlinkSync(args.path + path);\n\t\t\t\t\t\tfsState.state = \"gone\";\n\t\t\t\t\t\tlixState.state = \"gone\";\n\t\t\t\t\t}\n\t\t\t\t} else if (fsState.state === \"updated\") {\n\t\t\t\t\tif (lixState.state === \"unknown\") {\n\t\t\t\t\t\t// TODO A file was added to lix while a known file from fs was updated?\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Illeagal lix<->fs sync state. The file [\" +\n\t\t\t\t\t\t\t\tpath +\n\t\t\t\t\t\t\t\t\"] that was \" +\n\t\t\t\t\t\t\t\tfsState.state +\n\t\t\t\t\t\t\t\t\" but it was not known by lix yet?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (lixState.state === \"known\") {\n\t\t\t\t\t\tawait upsertFileInLix(args, path, fsState.content);\n\t\t\t\t\t\tlixState.content = fsState.content;\n\n\t\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t\t} else if (lixState.state === \"updated\") {\n\t\t\t\t\t\t// seems like we saw an update on the file in fs while some changes on lix have not been reached fs? FS -> Winns?\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"seems like we saw an update on the file \" +\n\t\t\t\t\t\t\t\tpath +\n\t\t\t\t\t\t\t\t\" in fs while some changes on lix have not been reached fs? FS -> Winns?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait upsertFileInLix(args, path, fsState.content);\n\t\t\t\t\t\tlixState.content = fsState.content;\n\t\t\t\t\t\tlixState.state = \"known\";\n\t\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t\t} else if (lixState.state === \"gone\") {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"seems like we saw an delete in lix while some changes on fs have not been reached fs? FS -> Winns?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// TODO update the lix state\n\t\t\t\t\t\tlixState.content = fsState.content;\n\t\t\t\t\t\tlixState.state = \"known\";\n\t\t\t\t\t\tfsState.state = \"known\";\n\t\t\t\t\t}\n\t\t\t\t} else if (fsState.state === \"gone\") {\n\t\t\t\t\tif (lixState.state === \"unknown\") {\n\t\t\t\t\t\t// TODO A file was added to lix while a known file from fs was removed?\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Illeagal lix<->fs sync state. The file [\" +\n\t\t\t\t\t\t\t\tpath +\n\t\t\t\t\t\t\t\t\"] that was \" +\n\t\t\t\t\t\t\t\tfsState.state +\n\t\t\t\t\t\t\t\t\" but it was not known by lix yet?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (lixState.state === \"known\") {\n\t\t\t\t\t\t// file is in known state with lix - means we have only changes on the fs - easy\n\t\t\t\t\t\tawait args.lix.db\n\t\t\t\t\t\t\t.deleteFrom(\"file\")\n\t\t\t\t\t\t\t.where(\"path\", \"=\", path)\n\t\t\t\t\t\t\t.execute();\n\t\t\t\t\t\t// NOTE: states where both are gone will get removed in the lix state loop\n\t\t\t\t\t\tlixState.state = \"gone\";\n\t\t\t\t\t} else if (lixState.state === \"updated\") {\n\t\t\t\t\t\t// seems like we saw an update on the file in fs while some changes on lix have not been reached fs? FS -> Winns?\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"seems like we saw an update on the file in fs while some changes on lix have not been reached fs? FS -> Winns?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait args.lix.db\n\t\t\t\t\t\t\t.deleteFrom(\"file\")\n\t\t\t\t\t\t\t.where(\"path\", \"=\", path)\n\t\t\t\t\t\t\t.execute();\n\t\t\t\t\t\t// NOTE: states where both are gone will get removed in the lix state loop\n\t\t\t\t\t\tlixState.state = \"gone\";\n\t\t\t\t\t\tfsState.state = \"gone\";\n\t\t\t\t\t} else if (lixState.state === \"gone\") {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"seems like we saw an delete in lix while we have a delete in lix simultaniously?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlixState.state = \"gone\";\n\t\t\t\t\t\tfsState.state = \"gone\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [path, lixState] of Object.entries(statesToSync.lixFileStates)) {\n\t\t\t// no state for file in fs\n\t\t\tif (!statesToSync.fsFileStates[path]) {\n\t\t\t\tif (lixState.state == \"unknown\") {\n\t\t\t\t\t// ADD TO FS (6)\n\t\t\t\t\t// create directory if not exists\n\t\t\t\t\ttry {\n\t\t\t\t\t\targs.fs.mkdirSync(\n\t\t\t\t\t\t\tnodePath.dirname(nodePath.join(args.path, path)),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\trecursive: true,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// ignore if directory already exists\n\t\t\t\t\t\t// https://github.com/opral/inlang-paraglide-js/issues/377\n\t\t\t\t\t\tif ((e as any)?.code !== \"EEXIST\") {\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// write file\n\t\t\t\t\targs.fs.writeFileSync(\n\t\t\t\t\t\tnodePath.join(args.path, path),\n\t\t\t\t\t\tBuffer.from(lixState.content)\n\t\t\t\t\t);\n\t\t\t\t\tstatesToSync.fsFileStates[path] = {\n\t\t\t\t\t\tstate: \"known\",\n\t\t\t\t\t\tcontent: lixState.content,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\t// ERROR (11) 16 21\n\t\t\t\t\t// The file does not exist on fs but its state differs from unknown?\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Illeagal lix<->fs sync state. The file [\" +\n\t\t\t\t\t\t\tpath +\n\t\t\t\t\t\t\t\"] that was in the state\" +\n\t\t\t\t\t\t\tlixState.state +\n\t\t\t\t\t\t\t\" for lix did not exist on disk\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tlixState.state === \"gone\" &&\n\t\t\t\t\tstatesToSync.fsFileStates[path].state === \"gone\"\n\t\t\t\t) {\n\t\t\t\t\tdelete statesToSync.lixFileStates[path];\n\t\t\t\t\tdelete statesToSync.fsFileStates[path];\n\t\t\t\t} else if (lixState.state !== statesToSync.fsFileStates[path].state) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"At this stage both states should be in sync lix state \" +\n\t\t\t\t\t\t\tlixState.state +\n\t\t\t\t\t\t\t\" fs state \" +\n\t\t\t\t\t\t\tstatesToSync.fsFileStates[path].state\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function syncFiles(\n\t\tdirPath: string,\n\t\tfileStates: {\n\t\t\tlixFileStates: FsFileState;\n\t\t\tfsFileStates: FsFileState;\n\t\t},\n\t\tinterval?: number\n\t) {\n\t\t// mark all states as removed - checkFsStateRecursive will update those that exist on the disc correspondingly\n\t\tfor (const fsState of Object.values(fileStates.fsFileStates)) {\n\t\t\tfsState.state = \"gone\";\n\t\t}\n\n\t\t// mark all states as removed - checkFsStateRecursive will update those that exist on the disc correspondingly\n\t\tfor (const lixState of Object.values(fileStates.lixFileStates)) {\n\t\t\tlixState.state = \"gone\";\n\t\t}\n\n\t\t// read states from disc - detect changes\n\t\tawait checkFsStateRecursive(dirPath, fileStates.fsFileStates);\n\n\t\t// read states form lix - detect changes\n\t\tawait checkLixState(fileStates.lixFileStates);\n\n\t\t// sync fs<->lix\n\t\tawait syncUpFsAndLixFiles(fileStates);\n\n\t\tif (interval) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tsyncFiles(dirPath, fileStates, interval);\n\t\t\t}, interval);\n\t\t}\n\n\t\treturn;\n\t}\n\n\t// Initial copy of all files\n\tawait syncFiles(\n\t\targs.path,\n\t\t{ fsFileStates: {}, lixFileStates: {} },\n\t\targs.syncInterval\n\t);\n\n\treturn;\n}\n\nasync function upsertFileInLix(\n\targs: { fs: typeof fs; path: string; lix: Lix },\n\tpath: string,\n\tdata: ArrayBuffer\n) {\n\t// force posix path when upserting into lix\n\t// https://github.com/opral/inlang-sdk/issues/229\n\tlet posixPath = path.split(nodePath.win32.sep).join(nodePath.posix.sep);\n\n\tif (posixPath.startsWith(\"/\") === false) {\n\t\tposixPath = \"/\" + posixPath;\n\t}\n\n\tawait args.lix.db\n\t\t.insertInto(\"file\") // change queue\n\t\t.values({\n\t\t\tpath: posixPath,\n\t\t\tdata: new Uint8Array(data),\n\t\t})\n\t\t.onConflict((oc) =>\n\t\t\toc.column(\"path\").doUpdateSet({ data: new Uint8Array(data) })\n\t\t)\n\t\t.execute();\n}\n/**\n * Filters legacy load and save messages plugins.\n *\n * Legacy plugins are plugins that implement loadMessages and saveMessages but not importFiles and exportFiles.\n */\nfunction categorizePlugins(plugins: readonly InlangPlugin[]) {\n\tconst loadSavePlugins: InlangPlugin[] = [];\n\tconst importExportPlugins: InlangPlugin[] = [];\n\n\tfor (const plugin of plugins) {\n\t\tif (\n\t\t\tplugin.loadMessages &&\n\t\t\tplugin.saveMessages &&\n\t\t\t!(plugin.importFiles && plugin.exportFiles)\n\t\t) {\n\t\t\tloadSavePlugins.push(plugin);\n\t\t} else if (plugin.importFiles || plugin.exportFiles) {\n\t\t\timportExportPlugins.push(plugin);\n\t\t}\n\t}\n\n\treturn { loadSavePlugins, importExportPlugins };\n}\n\n/**\n * Imports local plugins for backwards compatibility.\n *\n * https://github.com/opral/inlang-sdk/issues/171\n */\nasync function importLocalPlugins(args: {\n\tfs: typeof fs;\n\tsettings: ProjectSettings;\n\tpath: string;\n\tpreprocessPluginBeforeImport?: PreprocessPluginBeforeImportFunction;\n}) {\n\tconst errors: Error[] = [];\n\tconst locallyImportedPlugins = [];\n\tfor (const module of args.settings.modules ?? []) {\n\t\tif (module.startsWith(\"http\")) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst modulePath = absolutePathFromProject(args.path, module);\n\t\ttry {\n\t\t\tlet moduleAsText = await args.fs.promises.readFile(modulePath, \"utf8\");\n\t\t\tif (moduleAsText.includes(\"messageLintRule\")) {\n\t\t\t\terrors.push(new WarningDeprecatedLintRule(module));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (args.preprocessPluginBeforeImport) {\n\t\t\t\tmoduleAsText = await args.preprocessPluginBeforeImport(moduleAsText);\n\t\t\t}\n\n\t\t\t// In bun we need to do dynamic imports differently\n\t\t\tconst pluginAsUrl = process.versions.bun\n\t\t\t\t? URL.createObjectURL(\n\t\t\t\t\t\tnew Blob([moduleAsText], { type: \"text/javascript\" })\n\t\t\t\t\t)\n\t\t\t\t: \"data:application/javascript,\" + encodeURIComponent(moduleAsText);\n\n\t\t\tconst { default: plugin } = await import(/* @vite-ignore */ pluginAsUrl);\n\t\t\tlocallyImportedPlugins.push(plugin);\n\t\t\tif (process.versions.bun) URL.revokeObjectURL(pluginAsUrl);\n\t\t} catch (e) {\n\t\t\terrors.push(new PluginImportError({ plugin: module, cause: e as Error }));\n\t\t\tcontinue;\n\t\t}\n\t}\n\treturn {\n\t\terrors,\n\t\tlocallyImportedPlugins,\n\t};\n}\n\nexport class WarningDeprecatedLintRule extends Error {\n\tconstructor(module: string) {\n\t\tsuper(\n\t\t\t`The lint rule ${module} is deprecated. Please remove the lint rule from the settings. Lint rules are interim built into apps and will be succeeded by more generilizable lix validation rules.`\n\t\t);\n\t\tthis.name = \"WarningDeprecatedLintRule\";\n\t}\n}\n\n/**\n * Resolving absolute paths for fs functions.\n *\n * This mapping is required for backwards compatibility.\n * Relative paths in the project.inlang/settings.json\n * file are resolved to absolute paths with `*.inlang`\n * being pruned.\n *\n * @example\n * \"/website/project.inlang\"\n * \"./local-plugins/mock-plugin.js\"\n * -> \"/website/local-plugins/mock-plugin.js\"\n *\n */\nexport function withAbsolutePaths(\n\tfs: NodeFsPromisesSubsetLegacy,\n\tprojectPath: string\n): NodeFsPromisesSubsetLegacy {\n\treturn {\n\t\t// @ts-expect-error - node type mismatch\n\t\treadFile: (path, options) => {\n\t\t\treturn fs.readFile(absolutePathFromProject(projectPath, path), options);\n\t\t},\n\t\twriteFile: (path, data) => {\n\t\t\treturn fs.writeFile(absolutePathFromProject(projectPath, path), data);\n\t\t},\n\t\tmkdir: (path) => {\n\t\t\treturn fs.mkdir(absolutePathFromProject(projectPath, path));\n\t\t},\n\t\treaddir: (path) => {\n\t\t\treturn fs.readdir(absolutePathFromProject(projectPath, path));\n\t\t},\n\t};\n}\n\n/**\n * Joins a path from a project path.\n *\n * @example\n * absolutePathFromProject(\"/project.inlang\", \"./local-plugins/mock-plugin.js\") -> \"/local-plugins/mock-plugin.js\"\n *\n * absolutePathFromProject(\"/website/project.inlang\", \"./mock-plugin.js\") -> \"/website/mock-plugin.js\"\n */\nexport function absolutePathFromProject(\n\tprojectPath: string,\n\tfilePath: string\n): string {\n\t// Normalize paths for consistency across platforms\n\tconst normalizedProjectPath = nodePath\n\t\t.normalize(projectPath)\n\t\t.replace(/\\\\/g, \"/\");\n\tconst normalizedFilePath = nodePath.normalize(filePath).replace(/\\\\/g, \"/\");\n\n\t// Remove the last part of the project path (file name) to get the project root\n\tconst projectRoot = nodePath.dirname(normalizedProjectPath);\n\n\t// If filePath is already absolute, return it directly\n\tif (nodePath.isAbsolute(normalizedFilePath)) {\n\t\treturn normalizedFilePath;\n\t}\n\n\t// Compute absolute resolved path\n\tconst resolvedPath = nodePath.resolve(projectRoot, normalizedFilePath);\n\n\t// Ensure final path always uses forward slashes\n\treturn resolvedPath.replace(/\\\\/g, \"/\");\n}\n\nexport class ResourceFileImportError extends Error {\n\tpath: string;\n\n\tconstructor(args: { cause: Error; path: string }) {\n\t\tsuper(\"Could not import a resource file\");\n\t\tthis.name = \"ResourceFileImportError\";\n\t\tthis.cause = args.cause;\n\t\tthis.path = args.path;\n\t}\n}\n"]}
@@ -0,0 +1,22 @@
1
+ export declare const InlangBundleSchema: {
2
+ readonly "x-lix-key": "inlang_bundle";
3
+ readonly "x-lix-version": "1.0";
4
+ readonly "x-lix-primary-key": ["/id"];
5
+ readonly "x-lix-override-lixcols": {
6
+ readonly lixcol_file_id: "\"inlang\"";
7
+ readonly lixcol_plugin_key: "\"inlang_sdk\"";
8
+ };
9
+ readonly type: "object";
10
+ readonly properties: {
11
+ readonly id: {
12
+ readonly type: "string";
13
+ readonly "x-lix-default": "lix_human_id()";
14
+ };
15
+ readonly declarations: {
16
+ readonly default: readonly [];
17
+ };
18
+ };
19
+ readonly required: readonly ["id", "declarations"];
20
+ readonly additionalProperties: false;
21
+ };
22
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"/","sources":["schema-definitions/bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;CAeS,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { JSONTypeSchema } from "@lix-js/sdk";
2
+ export const InlangBundleSchema = {
3
+ "x-lix-key": "inlang_bundle",
4
+ "x-lix-version": "1.0",
5
+ "x-lix-primary-key": ["/id"],
6
+ "x-lix-override-lixcols": {
7
+ lixcol_file_id: '"inlang"',
8
+ lixcol_plugin_key: '"inlang_sdk"',
9
+ },
10
+ type: "object",
11
+ properties: {
12
+ id: { type: "string", "x-lix-default": "lix_human_id()" },
13
+ declarations: { ...JSONTypeSchema, default: [] },
14
+ },
15
+ required: ["id", "declarations"],
16
+ additionalProperties: false,
17
+ };
18
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"/","sources":["schema-definitions/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA4B,MAAM,aAAa,CAAC;AAEvE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,WAAW,EAAE,eAAe;IAC5B,eAAe,EAAE,KAAK;IACtB,mBAAmB,EAAE,CAAC,KAAK,CAAC;IAC5B,wBAAwB,EAAE;QACzB,cAAc,EAAE,UAAU;QAC1B,iBAAiB,EAAE,cAAc;KACjC;IACD,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACX,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE;QACzD,YAAY,EAAE,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,EAAE,EAAE;KAChD;IACD,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC;IAChC,oBAAoB,EAAE,KAAK;CACY,CAAC","sourcesContent":["import { JSONTypeSchema, type LixSchemaDefinition } from \"@lix-js/sdk\";\n\nexport const InlangBundleSchema = {\n\t\"x-lix-key\": \"inlang_bundle\",\n\t\"x-lix-version\": \"1.0\",\n\t\"x-lix-primary-key\": [\"/id\"],\n\t\"x-lix-override-lixcols\": {\n\t\tlixcol_file_id: '\"inlang\"',\n\t\tlixcol_plugin_key: '\"inlang_sdk\"',\n\t},\n\ttype: \"object\",\n\tproperties: {\n\t\tid: { type: \"string\", \"x-lix-default\": \"lix_human_id()\" },\n\t\tdeclarations: { ...JSONTypeSchema, default: [] },\n\t},\n\trequired: [\"id\", \"declarations\"],\n\tadditionalProperties: false,\n} as const satisfies LixSchemaDefinition;\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bundle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.test.d.ts","sourceRoot":"/","sources":["schema-definitions/bundle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { expect, test } from "vitest";
2
+ import { newProject } from "../project/newProject.js";
3
+ import { loadProjectInMemory } from "../project/loadProjectInMemory.js";
4
+ test("bundle schema accepts JSON declarations via project.db", async () => {
5
+ const project = await loadProjectInMemory({ blob: await newProject() });
6
+ await expect(project.db
7
+ .insertInto("bundle")
8
+ .values({
9
+ id: "json-enabled-bundle",
10
+ declarations: [{ name: "namespace", type: "input-variable" }],
11
+ })
12
+ .execute()).resolves.not.toThrow();
13
+ const inserted = await project.db
14
+ .selectFrom("bundle")
15
+ .selectAll()
16
+ .where("id", "=", "json-enabled-bundle")
17
+ .executeTakeFirstOrThrow();
18
+ expect(inserted.declarations).toEqual([
19
+ { name: "namespace", type: "input-variable" },
20
+ ]);
21
+ await project.close();
22
+ });
23
+ //# sourceMappingURL=bundle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.test.js","sourceRoot":"/","sources":["schema-definitions/bundle.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;IACzE,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAExE,MAAM,MAAM,CACX,OAAO,CAAC,EAAE;SACR,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC;QACP,EAAE,EAAE,qBAAqB;QACzB,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;KAC7D,CAAC;SACD,OAAO,EAAE,CACX,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAEzB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE;SAC/B,UAAU,CAAC,QAAQ,CAAC;SACpB,SAAS,EAAE;SACX,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,qBAAqB,CAAC;SACvC,uBAAuB,EAAE,CAAC;IAE5B,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;QACrC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE;KAC7C,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC","sourcesContent":["import { expect, test } from \"vitest\";\nimport { newProject } from \"../project/newProject.js\";\nimport { loadProjectInMemory } from \"../project/loadProjectInMemory.js\";\n\ntest(\"bundle schema accepts JSON declarations via project.db\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait expect(\n\t\tproject.db\n\t\t\t.insertInto(\"bundle\")\n\t\t\t.values({\n\t\t\t\tid: \"json-enabled-bundle\",\n\t\t\t\tdeclarations: [{ name: \"namespace\", type: \"input-variable\" }],\n\t\t\t})\n\t\t\t.execute()\n\t).resolves.not.toThrow();\n\n\tconst inserted = await project.db\n\t\t.selectFrom(\"bundle\")\n\t\t.selectAll()\n\t\t.where(\"id\", \"=\", \"json-enabled-bundle\")\n\t\t.executeTakeFirstOrThrow();\n\n\texpect(inserted.declarations).toEqual([\n\t\t{ name: \"namespace\", type: \"input-variable\" },\n\t]);\n\n\tawait project.close();\n});\n"]}
@@ -0,0 +1,4 @@
1
+ export { InlangBundleSchema } from "./bundle.js";
2
+ export { InlangMessageSchema } from "./message.js";
3
+ export { InlangVariantSchema } from "./variant.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["schema-definitions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { InlangBundleSchema } from "./bundle.js";
2
+ export { InlangMessageSchema } from "./message.js";
3
+ export { InlangVariantSchema } from "./variant.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["schema-definitions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["export { InlangBundleSchema } from \"./bundle.js\";\nexport { InlangMessageSchema } from \"./message.js\";\nexport { InlangVariantSchema } from \"./variant.js\";\n"]}
@@ -0,0 +1,35 @@
1
+ export declare const InlangMessageSchema: {
2
+ readonly "x-lix-key": "inlang_message";
3
+ readonly "x-lix-version": "1.0";
4
+ readonly "x-lix-primary-key": ["/id"];
5
+ readonly "x-lix-foreign-keys": [{
6
+ readonly properties: ["/bundleId"];
7
+ readonly references: {
8
+ readonly schemaKey: "inlang_bundle";
9
+ readonly properties: ["/id"];
10
+ };
11
+ }];
12
+ readonly "x-lix-override-lixcols": {
13
+ readonly lixcol_file_id: "\"inlang\"";
14
+ readonly lixcol_plugin_key: "\"inlang_sdk\"";
15
+ };
16
+ readonly type: "object";
17
+ readonly properties: {
18
+ readonly id: {
19
+ readonly type: "string";
20
+ readonly "x-lix-default": "lix_uuid_v7()";
21
+ };
22
+ readonly bundleId: {
23
+ readonly type: "string";
24
+ };
25
+ readonly locale: {
26
+ readonly type: "string";
27
+ };
28
+ readonly selectors: {
29
+ readonly default: readonly [];
30
+ };
31
+ };
32
+ readonly required: readonly ["id", "bundleId", "locale", "selectors"];
33
+ readonly additionalProperties: false;
34
+ };
35
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"/","sources":["schema-definitions/message.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuBQ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { JSONTypeSchema } from "@lix-js/sdk";
2
+ export const InlangMessageSchema = {
3
+ "x-lix-key": "inlang_message",
4
+ "x-lix-version": "1.0",
5
+ "x-lix-primary-key": ["/id"],
6
+ "x-lix-foreign-keys": [
7
+ {
8
+ properties: ["/bundleId"],
9
+ references: { schemaKey: "inlang_bundle", properties: ["/id"] },
10
+ },
11
+ ],
12
+ "x-lix-override-lixcols": {
13
+ lixcol_file_id: '"inlang"',
14
+ lixcol_plugin_key: '"inlang_sdk"',
15
+ },
16
+ type: "object",
17
+ properties: {
18
+ id: { type: "string", "x-lix-default": "lix_uuid_v7()" },
19
+ bundleId: { type: "string" },
20
+ locale: { type: "string" },
21
+ selectors: { ...JSONTypeSchema, default: [] },
22
+ },
23
+ required: ["id", "bundleId", "locale", "selectors"],
24
+ additionalProperties: false,
25
+ };
26
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"/","sources":["schema-definitions/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA4B,MAAM,aAAa,CAAC;AAEvE,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAClC,WAAW,EAAE,gBAAgB;IAC7B,eAAe,EAAE,KAAK;IACtB,mBAAmB,EAAE,CAAC,KAAK,CAAC;IAC5B,oBAAoB,EAAE;QACrB;YACC,UAAU,EAAE,CAAC,WAAW,CAAC;YACzB,UAAU,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE;SAC/D;KACD;IACD,wBAAwB,EAAE;QACzB,cAAc,EAAE,UAAU;QAC1B,iBAAiB,EAAE,cAAc;KACjC;IACD,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACX,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE;QACxD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC5B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,SAAS,EAAE,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,EAAE,EAAE;KAC7C;IACD,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC;IACnD,oBAAoB,EAAE,KAAK;CACY,CAAC","sourcesContent":["import { JSONTypeSchema, type LixSchemaDefinition } from \"@lix-js/sdk\";\n\nexport const InlangMessageSchema = {\n\t\"x-lix-key\": \"inlang_message\",\n\t\"x-lix-version\": \"1.0\",\n\t\"x-lix-primary-key\": [\"/id\"],\n\t\"x-lix-foreign-keys\": [\n\t\t{\n\t\t\tproperties: [\"/bundleId\"],\n\t\t\treferences: { schemaKey: \"inlang_bundle\", properties: [\"/id\"] },\n\t\t},\n\t],\n\t\"x-lix-override-lixcols\": {\n\t\tlixcol_file_id: '\"inlang\"',\n\t\tlixcol_plugin_key: '\"inlang_sdk\"',\n\t},\n\ttype: \"object\",\n\tproperties: {\n\t\tid: { type: \"string\", \"x-lix-default\": \"lix_uuid_v7()\" },\n\t\tbundleId: { type: \"string\" },\n\t\tlocale: { type: \"string\" },\n\t\tselectors: { ...JSONTypeSchema, default: [] },\n\t},\n\trequired: [\"id\", \"bundleId\", \"locale\", \"selectors\"],\n\tadditionalProperties: false,\n} as const satisfies LixSchemaDefinition;\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=message.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.test.d.ts","sourceRoot":"/","sources":["schema-definitions/message.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import { expect, test } from "vitest";
2
+ import { newProject } from "../project/newProject.js";
3
+ import { loadProjectInMemory } from "../project/loadProjectInMemory.js";
4
+ import { uuidV7 } from "@lix-js/sdk";
5
+ test("message schema stores selectors and respects bundle foreign key", async () => {
6
+ const project = await loadProjectInMemory({ blob: await newProject() });
7
+ const bundleId = "bundle-for-message";
8
+ await project.db
9
+ .insertInto("bundle")
10
+ .values({ id: bundleId, declarations: [] })
11
+ .execute();
12
+ const messageId = await uuidV7({ lix: project.lix });
13
+ const selectors = [{ type: "variable-reference", name: "platform" }];
14
+ await expect(project.db
15
+ .insertInto("message")
16
+ .values({
17
+ id: messageId,
18
+ bundleId,
19
+ locale: "en",
20
+ selectors,
21
+ })
22
+ .execute()).resolves.not.toThrow();
23
+ const stored = await project.db
24
+ .selectFrom("message")
25
+ .selectAll()
26
+ .where("id", "=", messageId)
27
+ .executeTakeFirstOrThrow();
28
+ expect(stored.bundleId).toBe(bundleId);
29
+ expect(stored.locale).toBe("en");
30
+ expect(stored.selectors).toEqual(selectors);
31
+ await project.close();
32
+ });
33
+ test("message schema enforces bundle foreign key", async () => {
34
+ const project = await loadProjectInMemory({ blob: await newProject() });
35
+ await expect(project.db
36
+ .insertInto("message")
37
+ .values({
38
+ bundleId: "missing-bundle",
39
+ locale: "en",
40
+ selectors: [],
41
+ })
42
+ .execute()).rejects.toThrow(/foreign key constraint/i);
43
+ await project.close();
44
+ });
45
+ //# sourceMappingURL=message.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.test.js","sourceRoot":"/","sources":["schema-definitions/message.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;IAClF,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,oBAAoB,CAAC;IACtC,MAAM,OAAO,CAAC,EAAE;SACd,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;SAC1C,OAAO,EAAE,CAAC;IAEZ,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,CAAC,EAAE,IAAI,EAAE,oBAA6B,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAE9E,MAAM,MAAM,CACX,OAAO,CAAC,EAAE;SACR,UAAU,CAAC,SAAS,CAAC;SACrB,MAAM,CAAC;QACP,EAAE,EAAE,SAAS;QACb,QAAQ;QACR,MAAM,EAAE,IAAI;QACZ,SAAS;KACT,CAAC;SACD,OAAO,EAAE,CACX,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAEzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE;SAC7B,UAAU,CAAC,SAAS,CAAC;SACrB,SAAS,EAAE;SACX,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC;SAC3B,uBAAuB,EAAE,CAAC;IAE5B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE5C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;IAC7D,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAExE,MAAM,MAAM,CACX,OAAO,CAAC,EAAE;SACR,UAAU,CAAC,SAAS,CAAC;SACrB,MAAM,CAAC;QACP,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,EAAE;KACb,CAAC;SACD,OAAO,EAAE,CACX,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAE7C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC","sourcesContent":["import { expect, test } from \"vitest\";\nimport { newProject } from \"../project/newProject.js\";\nimport { loadProjectInMemory } from \"../project/loadProjectInMemory.js\";\nimport { uuidV7 } from \"@lix-js/sdk\";\n\ntest(\"message schema stores selectors and respects bundle foreign key\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\tconst bundleId = \"bundle-for-message\";\n\tawait project.db\n\t\t.insertInto(\"bundle\")\n\t\t.values({ id: bundleId, declarations: [] })\n\t\t.execute();\n\n\tconst messageId = await uuidV7({ lix: project.lix });\n\tconst selectors = [{ type: \"variable-reference\" as const, name: \"platform\" }];\n\n\tawait expect(\n\t\tproject.db\n\t\t\t.insertInto(\"message\")\n\t\t\t.values({\n\t\t\t\tid: messageId,\n\t\t\t\tbundleId,\n\t\t\t\tlocale: \"en\",\n\t\t\t\tselectors,\n\t\t\t})\n\t\t\t.execute()\n\t).resolves.not.toThrow();\n\n\tconst stored = await project.db\n\t\t.selectFrom(\"message\")\n\t\t.selectAll()\n\t\t.where(\"id\", \"=\", messageId)\n\t\t.executeTakeFirstOrThrow();\n\n\texpect(stored.bundleId).toBe(bundleId);\n\texpect(stored.locale).toBe(\"en\");\n\texpect(stored.selectors).toEqual(selectors);\n\n\tawait project.close();\n});\n\ntest(\"message schema enforces bundle foreign key\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait expect(\n\t\tproject.db\n\t\t\t.insertInto(\"message\")\n\t\t\t.values({\n\t\t\t\tbundleId: \"missing-bundle\",\n\t\t\t\tlocale: \"en\",\n\t\t\t\tselectors: [],\n\t\t\t})\n\t\t\t.execute()\n\t).rejects.toThrow(/foreign key constraint/i);\n\n\tawait project.close();\n});\n"]}
@@ -0,0 +1,35 @@
1
+ export declare const InlangVariantSchema: {
2
+ readonly "x-lix-key": "inlang_variant";
3
+ readonly "x-lix-version": "1.0";
4
+ readonly "x-lix-primary-key": ["/id"];
5
+ readonly "x-lix-foreign-keys": [{
6
+ readonly properties: ["/messageId"];
7
+ readonly references: {
8
+ readonly schemaKey: "inlang_message";
9
+ readonly properties: ["/id"];
10
+ };
11
+ }];
12
+ readonly "x-lix-override-lixcols": {
13
+ readonly lixcol_file_id: "\"inlang\"";
14
+ readonly lixcol_plugin_key: "\"inlang_sdk\"";
15
+ };
16
+ readonly type: "object";
17
+ readonly properties: {
18
+ readonly id: {
19
+ readonly type: "string";
20
+ readonly "x-lix-default": "lix_uuid_v7()";
21
+ };
22
+ readonly messageId: {
23
+ readonly type: "string";
24
+ };
25
+ readonly matches: {
26
+ readonly default: readonly [];
27
+ };
28
+ readonly pattern: {
29
+ readonly default: readonly [];
30
+ };
31
+ };
32
+ readonly required: readonly ["id", "messageId", "matches", "pattern"];
33
+ readonly additionalProperties: false;
34
+ };
35
+ //# sourceMappingURL=variant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variant.d.ts","sourceRoot":"/","sources":["schema-definitions/variant.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuBQ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { JSONTypeSchema } from "@lix-js/sdk";
2
+ export const InlangVariantSchema = {
3
+ "x-lix-key": "inlang_variant",
4
+ "x-lix-version": "1.0",
5
+ "x-lix-primary-key": ["/id"],
6
+ "x-lix-foreign-keys": [
7
+ {
8
+ properties: ["/messageId"],
9
+ references: { schemaKey: "inlang_message", properties: ["/id"] },
10
+ },
11
+ ],
12
+ "x-lix-override-lixcols": {
13
+ lixcol_file_id: '"inlang"',
14
+ lixcol_plugin_key: '"inlang_sdk"',
15
+ },
16
+ type: "object",
17
+ properties: {
18
+ id: { type: "string", "x-lix-default": "lix_uuid_v7()" },
19
+ messageId: { type: "string" },
20
+ matches: { ...JSONTypeSchema, default: [] },
21
+ pattern: { ...JSONTypeSchema, default: [] },
22
+ },
23
+ required: ["id", "messageId", "matches", "pattern"],
24
+ additionalProperties: false,
25
+ };
26
+ //# sourceMappingURL=variant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variant.js","sourceRoot":"/","sources":["schema-definitions/variant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA4B,MAAM,aAAa,CAAC;AAEvE,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAClC,WAAW,EAAE,gBAAgB;IAC7B,eAAe,EAAE,KAAK;IACtB,mBAAmB,EAAE,CAAC,KAAK,CAAC;IAC5B,oBAAoB,EAAE;QACrB;YACC,UAAU,EAAE,CAAC,YAAY,CAAC;YAC1B,UAAU,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE;SAChE;KACD;IACD,wBAAwB,EAAE;QACzB,cAAc,EAAE,UAAU;QAC1B,iBAAiB,EAAE,cAAc;KACjC;IACD,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACX,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE;QACxD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC7B,OAAO,EAAE,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,EAAE,EAAE;QAC3C,OAAO,EAAE,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,EAAE,EAAE;KAC3C;IACD,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC;IACnD,oBAAoB,EAAE,KAAK;CACY,CAAC","sourcesContent":["import { JSONTypeSchema, type LixSchemaDefinition } from \"@lix-js/sdk\";\n\nexport const InlangVariantSchema = {\n\t\"x-lix-key\": \"inlang_variant\",\n\t\"x-lix-version\": \"1.0\",\n\t\"x-lix-primary-key\": [\"/id\"],\n\t\"x-lix-foreign-keys\": [\n\t\t{\n\t\t\tproperties: [\"/messageId\"],\n\t\t\treferences: { schemaKey: \"inlang_message\", properties: [\"/id\"] },\n\t\t},\n\t],\n\t\"x-lix-override-lixcols\": {\n\t\tlixcol_file_id: '\"inlang\"',\n\t\tlixcol_plugin_key: '\"inlang_sdk\"',\n\t},\n\ttype: \"object\",\n\tproperties: {\n\t\tid: { type: \"string\", \"x-lix-default\": \"lix_uuid_v7()\" },\n\t\tmessageId: { type: \"string\" },\n\t\tmatches: { ...JSONTypeSchema, default: [] },\n\t\tpattern: { ...JSONTypeSchema, default: [] },\n\t},\n\trequired: [\"id\", \"messageId\", \"matches\", \"pattern\"],\n\tadditionalProperties: false,\n} as const satisfies LixSchemaDefinition;\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=variant.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variant.test.d.ts","sourceRoot":"/","sources":["schema-definitions/variant.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ import { expect, test } from "vitest";
2
+ import { uuidV7 } from "@lix-js/sdk";
3
+ import { newProject } from "../project/newProject.js";
4
+ import { loadProjectInMemory } from "../project/loadProjectInMemory.js";
5
+ test("variant schema persists matches and pattern JSON", async () => {
6
+ const project = await loadProjectInMemory({ blob: await newProject() });
7
+ const bundleId = "bundle-for-variant";
8
+ await project.db
9
+ .insertInto("bundle")
10
+ .values({ id: bundleId, declarations: [] })
11
+ .execute();
12
+ const messageId = await uuidV7({ lix: project.lix });
13
+ await project.db
14
+ .insertInto("message")
15
+ .values({
16
+ id: messageId,
17
+ bundleId,
18
+ locale: "en",
19
+ selectors: [],
20
+ })
21
+ .execute();
22
+ const variantId = await uuidV7({ lix: project.lix });
23
+ const matches = [
24
+ { type: "literal-match", key: "platform", value: "web" },
25
+ ];
26
+ const pattern = [{ type: "text", value: "Hello web" }];
27
+ await expect(project.db
28
+ .insertInto("variant")
29
+ .values({
30
+ id: variantId,
31
+ messageId,
32
+ matches,
33
+ pattern,
34
+ })
35
+ .execute()).resolves.not.toThrow();
36
+ const stored = await project.db
37
+ .selectFrom("variant")
38
+ .selectAll()
39
+ .where("id", "=", variantId)
40
+ .executeTakeFirstOrThrow();
41
+ expect(stored.messageId).toBe(messageId);
42
+ expect(stored.matches).toEqual(matches);
43
+ expect(stored.pattern).toEqual(pattern);
44
+ await project.close();
45
+ });
46
+ test("variant schema enforces message foreign key", async () => {
47
+ const project = await loadProjectInMemory({ blob: await newProject() });
48
+ let wasRejected = false;
49
+ try {
50
+ await project.db
51
+ .insertInto("variant")
52
+ .values({
53
+ id: await uuidV7({ lix: project.lix }),
54
+ messageId: "missing-message",
55
+ matches: [],
56
+ pattern: [],
57
+ })
58
+ .execute();
59
+ }
60
+ catch (error) {
61
+ wasRejected = true;
62
+ expect(error?.resultCode ?? error.message).toBeDefined();
63
+ }
64
+ expect(wasRejected).toBe(true);
65
+ await project.close();
66
+ });
67
+ //# sourceMappingURL=variant.test.js.map