@kalada/codemirror 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -1
- package/dist/chunk-GCHU6EL7.js +566 -0
- package/dist/chunk-GCHU6EL7.js.map +1 -0
- package/dist/editor.cjs +568 -0
- package/dist/editor.cjs.map +1 -0
- package/dist/editor.d.cts +74 -0
- package/dist/editor.d.ts +74 -0
- package/dist/editor.js +3 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.cjs +717 -358
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +166 -365
- package/dist/index.js.map +1 -1
- package/package.json +11 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/line-separator.ts","../src/render.ts","../src/translation.ts","../src/session-helpers.ts","../src/tooltip-state.ts","../src/session.ts"],"names":["positionAt","codeMirrorHover"],"mappings":";;;;;;;AAEO,SAAS,oBAAoB,IAAA,EAAsB;AACxD,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,MAAA;AAClC,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,cAAc,IAAA,EAAoB;AAChD,EAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,aAAa,CAAC,CAAA;AAC1C;AAEO,SAAS,cAAA,CAAe,UAAgB,aAAA,EAA+B;AAC5E,EAAA,OAAO,QAAA,CAAS,WAAA,CAAY,CAAA,EAAG,QAAA,CAAS,QAAQ,aAAa,CAAA;AAC/D;;;ACXO,SAAS,YAAA,CAAa,MAAiB,QAAA,EAA2B;AACvE,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,QAAA;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,OAAO,IAAA,EAAkB;AACvB,MAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,aAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,SAAS,CAAA;AAC5C,MAAA,GAAA,CAAI,SAAA,GAAY,iBAAA;AAChB,MAAA,GAAA,CAAI,YAAA,CAAa,QAAQ,SAAS,CAAA;AAClC,MAAA,GAAA,CAAI,YAAA,CAAa,cAAc,+BAA+B,CAAA;AAC9D,MAAA,aAAA,CAAc,UAAU,GAAA,EAAK,oBAAA,EAAsB,KAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAC,CAAA;AAC5E,MAAA,aAAA,CAAc,UAAU,GAAA,EAAK,mCAAA,EAAqC,CAAC,YAAA,CAAa,IAAI,CAAC,CAAC,CAAA;AACtF,MAAA,aAAA,CAAc,UAAU,GAAA,EAAK,8BAAA,EAAgC,CAAC,UAAA,CAAW,IAAI,CAAC,CAAC,CAAA;AAC/E,MAAA,aAAA,CAAc,UAAU,GAAA,EAAK,wBAAA,EAA0B,KAAK,QAAA,CAAS,GAAA,CAAI,YAAY,CAAC,CAAA;AACtF,MAAA,OAAO,EAAE,GAAA,EAAI;AAAA,IACf;AAAA,GACF;AACF;AAEA,SAAS,aAAA,CACP,QAAA,EACA,MAAA,EACA,OAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC7C,EAAA,KAAA,CAAM,WAAA,GAAc,OAAA;AACpB,EAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AACnB,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACxC,EAAA,KAAA,MAAW,SAAS,MAAA,CAAO,MAAA,GAAS,IAAI,MAAA,GAAS,CAAC,MAAM,CAAA,EAAG;AACzD,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,EAClB;AACA,EAAA,MAAA,CAAO,OAAO,IAAI,CAAA;AACpB;AAEA,SAAS,UAAU,OAAA,EAA+B;AAChD,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CACpB,GAAA;AAAA,IACC,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAW,KAC5B,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,QAAQ,CAAA,EAAA,EAAK,UAAA,GAAa,eAAe,cAAc,CAAA,CAAA;AAAA,GACvE,CACC,KAAK,IAAI,CAAA;AACZ,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,CAAA,GAAK,EAAA;AACvD,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,EAAG,MAAM,KAAK,OAAA,CAAQ,QAAQ,CAAA,UAAA,EAAa,MAAA,IAAU,MAAM,CAAA,CAAA;AACnF;AAEA,SAAS,aAAa,IAAA,EAAyB;AAC7C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,SAAA,GAAY,YAAY,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AACzF,EAAA,OAAO,GAAG,IAAA,CAAK,MAAA,CAAO,QAAQ,OAAA,GAAU,SAAS,KAAK,IAAI,CAAA,CAAA;AAC5D;AAEA,SAAS,WAAW,IAAA,EAAyB;AAC3C,EAAA,OAAO,CAAA,QAAA,EAAW,KAAK,MAAM,CAAA,CAAA;AAC/B;AAEA,SAAS,aAAa,QAAA,EAAmC;AACvD,EAAA,OAAO,CAAA,EAAG,SAAS,IAAI,CAAA,IAAA,EAAO,SAAS,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,MAAM,CAAA,CAAA;AACjE;;;ACrDO,SAAS,eACd,QAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,EACA,gBAAgB,IAAA,EACK;AACrB,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,OAAA,CAAQ,YAAY,CAAC,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,MAAM,QAAA,KAAa;AAC1D,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,IAAA,EAAM,KAAA;AAAA,MACN,EAAA,EAAI,GAAA;AAAA,MACJ,QAAQ,QAAA,CAAS,WAAA,CAAY,CAAA,EAAG,QAAA,CAAS,QAAQ,aAAa;AAAA,KAC/D,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,MAAM,SAAA,GAAY,gBAAgB,OAAO,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS,WAAW,IAAA,EAAM,QAAA,EAAU,QAAA,CAAS,SAAS,CAAC,CAAA;AACzF,EAAA,IAAI,WAAW,KAAA,CAAM,CAAC,SAAS,IAAA,KAAS,IAAI,GAAG,OAAO,UAAA;AACtD,EAAA,OAAO,CAAC,iBAAA,CAAkB,QAAA,EAAU,MAAA,CAAO,WAAA,CAAY,GAAG,MAAA,CAAO,MAAA,EAAQ,aAAa,CAAC,CAAC,CAAA;AAC1F;AAEO,SAAS,cAAA,CACd,UACA,KAAA,EAC+C;AAC/C,EAAA,MAAM,IAAA,GAAO,SAAS,QAAA,EAAU,KAAA,CAAM,MAAM,IAAA,EAAM,KAAA,CAAM,MAAM,SAAS,CAAA;AACvE,EAAA,MAAM,EAAA,GAAK,SAAS,QAAA,EAAU,KAAA,CAAM,IAAI,IAAA,EAAM,KAAA,CAAM,IAAI,SAAS,CAAA;AACjE,EAAA,OAAO,IAAA,KAAS,QAAQ,EAAA,KAAO,IAAA,IAAQ,OAAO,EAAA,GAAK,IAAA,GAAO,EAAE,IAAA,EAAM,EAAA,EAAG;AACvE;AAEO,SAAS,iBAAA,CACd,UACA,KAAA,EACwC;AACxC,EAAA,OAAO,cAAA,CAAe,UAAU,KAAK,CAAA,IAAK,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAE;AAC7D;AAEA,SAAS,UAAA,CAAW,IAAA,EAAkB,QAAA,EAAgB,KAAA,EAAwC;AAC5F,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,QAAA,EAAU,IAAA,CAAK,IAAI,CAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,QAAA,EAAU,IAAA,CAAK,EAAE,CAAA;AACxC,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,KAAM,IAAA,CAAK,IAAA,IAAQ,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,KAAM,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA;AACnF,EAAA,OAAO,EAAE,OAAO,EAAE,KAAA,EAAO,KAAI,EAAG,IAAA,EAAM,KAAK,MAAA,EAAO;AACpD;AAEA,SAAS,UAAA,CAAW,UAAgB,MAAA,EAAgB;AAClD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AACnC,EAAA,OAAO,EAAE,MAAM,IAAA,CAAK,MAAA,GAAS,GAAG,SAAA,EAAW,MAAA,GAAS,KAAK,IAAA,EAAK;AAChE;AAEA,SAAS,QAAA,CAAS,QAAA,EAAgB,IAAA,EAAc,SAAA,EAAkC;AAChF,EAAA,IACE,CAAC,MAAA,CAAO,aAAA,CAAc,IAAI,CAAA,IAC1B,CAAC,MAAA,CAAO,aAAA,CAAc,SAAS,CAAA,IAC/B,IAAA,GAAO,CAAA,IACP,YAAY,CAAA,EACZ;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,IAAQ,QAAA,CAAS,KAAA,EAAO,OAAO,IAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,IAAA,GAAO,CAAC,CAAA;AACpC,EAAA,OAAO,SAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,OAAO,SAAA,GAAY,IAAA;AAC9D;AAEA,SAAS,gBAAgB,KAAA,EAA4C;AACnE,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,EAAA,CAAG,EAAE,CAAA;AAC7B,IAAA,IACE,QAAA,IACA,QAAA,CAAS,IAAA,KAAS,IAAA,CAAK,IAAA,IACvB,QAAA,CAAS,EAAA,KAAO,IAAA,CAAK,EAAA,IACrB,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,EAAA,EACnB;AACA,MAAA,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,GAAI,EAAE,GAAG,QAAA,EAAU,MAAA,EAAQ,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAG;AAAA,IACxF,CAAA,MAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,UAA4B,IAAA,EAAwB;AAC7E,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,WAAW,CAAA,EAAE;AAAA,MAC/B,KAAK,QAAA,CAAS,SAAA,CAAU,UAAA,CAAW,QAAA,CAAS,KAAK,MAAM;AAAA,KACzD;AAAA,IACA;AAAA,GACF;AACF;;;ACrFO,SAASA,WAAAA,CAAW,UAAgB,MAAA,EAAgB;AACzD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AACnC,EAAA,OAAO,EAAE,MAAM,IAAA,CAAK,MAAA,GAAS,GAAG,SAAA,EAAW,MAAA,GAAS,KAAK,IAAA,EAAK;AAChE;AAEO,SAAS,iBAAA,CACd,QACA,IAAA,EACA;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,MAAM,GAAA,EAAK,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA;AAClF,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,CAAO,OAAO,OAAO,IAAA;AACpC,EAAA,OAAO,EAAE,GAAG,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO,MAAM,IAAI,CAAA,EAAG,GAAA,EAAK,KAAA,CAAM,EAAA,EAAG;AACpE;AAEO,SAAS,mBAAA,CACd,YACA,IAAA,EACY;AACZ,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,GACrB,iBAAA,CAAkB,KAAK,KAAA,CAAM,GAAA,EAAK,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA,GACzD,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAE;AACrB,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,UAAU,OAAA,EAAS,OAAA,EAAS,WAAW,OAAA,EAAQ;AACpE;AAEO,SAAS,gBAAgB,IAAA,EAA0B;AACxD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,WAAA;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAC5D,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,gBAAA,CAAiB,UAA4B,IAAA,EAAc;AACzE,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,WAAW,CAAA,EAAE;AAAA,MAC/B,KAAK,QAAA,CAAS,SAAA,CAAU,UAAA,CAAW,QAAA,CAAS,KAAK,MAAM;AAAA,KACzD;AAAA,IACA;AAAA,GACF;AACF;AC9CO,IAAM,kBAAA,GAAqB,YAAY,MAAA,EAAuB;AAE9D,IAAM,oBAAA,GAAuB,WAAW,MAAA,CAA2B;AAAA,EACxE,MAAA,EAAQ,MAAM,EAAC;AAAA,EACf,MAAA,CAAO,OAAO,WAAA,EAAa;AACzB,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,KAAA,MAAW,MAAA,IAAU,YAAY,OAAA,EAAS;AACxC,MAAA,IAAI,MAAA,CAAO,EAAA,CAAG,kBAAkB,CAAA,EAAG,IAAA,GAAO,MAAA,CAAO,KAAA,GAAQ,CAAC,MAAA,CAAO,KAAK,CAAA,GAAI,EAAC;AAAA,IAC7E;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA,OAAA,EAAS,CAAC,KAAA,KAAU,WAAA,CAAY,QAAA,CAAS,CAAC,KAAK,CAAA,EAAG,CAAC,KAAA,KAAU,KAAA,CAAM,KAAA,CAAM,KAAK,CAAC;AACjF,CAAC,CAAA;;;AC4BM,SAAS,0BACd,OAAA,EACqB;AACrB,EAAA,OAAO,IAAI,cAAc,OAAO,CAAA;AAClC;AACA,IAAM,gBAAN,MAAmD;AAAA,EACxC,SAAA;AAAA,EACQ,OAAA;AAAA,EACA,GAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA,GAAgB,IAAI,WAAA,EAAY;AAAA,EACzC,IAAA,GAA0B,IAAA;AAAA,EAC1B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY,CAAA;AAAA,EACZ,eAAA,GAAkB,CAAA;AAAA,EAClB,UAAA,GAAa,CAAA;AAAA,EACb,gBAAA,GAAmB,CAAA;AAAA,EACnB,gBAAA,GAAkC,IAAA;AAAA,EAE1C,YAAY,OAAA,EAAqC;AAC/C,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,GAAA,GAAM,QAAQ,QAAA,CAAS,GAAA;AAC5B,IAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,gBAAA;AAChC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAQ,QAAQ,CAAA;AACzD,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,IAAA;AAC3B,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,OAAA;AACvB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,eAAA,EAAgB;AAAA,EACxC;AAAA,EACA,kBAAA,GAA2B;AACzB,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,WAAA,CAAY,MAAM,KAAK,CAAA;AAC5B,IAAA,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,EAC/B;AAAA,EACA,gBAAgB,IAAA,EAAoB;AAClC,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,MAAM,IAAI,UAAU,mCAAmC,CAAA;AACrF,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,SAAA,GAAY,oBAAoB,IAAI,CAAA;AAC1C,MAAA,IAAA,CAAK,QAAA,CAAS;AAAA,QACZ,OAAA,EAAS,EAAE,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,MAAA,EAAQ,aAAA,CAAc,IAAI,CAAA,EAAE;AAAA,QAC3E,SAAA,EAAW,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA;AAAA,QACnC,WAAA,EAAa,WAAA,CAAY,YAAA,CAAa,EAAA,CAAG,IAAI,CAAA;AAAA,QAC7C,OAAA,EACE,SAAA,KAAc,IAAA,CAAK,KAAA,CAAM,SAAA,GACrB,MAAA,GACA,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY,WAAA,CAAY,aAAA,CAAc,EAAA,CAAG,SAAS,CAAC;AAAA,OAC7E,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,KAAK,eAAA,EAAgB;AACrC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe;AAAA,MAC3C,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,OAAA,EAAS,KAAK,YAAA,EAAa;AAAA,MAC3B,KAAA,EAAO,CAAC,gBAAA,CAAiB,OAAA,EAAS,IAAI,CAAC;AAAA,KACxC,CAAA;AACD,IAAA,IAAA,CAAK,eAAe,QAAA,CAAS,IAAA;AAC7B,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,EACtB;AAAA,EACA,MAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,IAAA,MAAM,QAAQ,IAAA,CAAK,eAAA;AACnB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAK,GAAA,EAAK;AAAA,MAC3C,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,YAAA,EAAc,KAAK;AAAA,KACpD,CAAA;AACD,IAAA,IACE,MAAA,CAAO,IAAA,KAAS,QAAA,IAChB,CAAC,MAAA,CAAO,IAAA,IACR,CAAC,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,YAAY,CAAA,EACnD;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAQ,cAAA,CAAe,IAAA,CAAK,MAAM,GAAA,EAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AAC9D,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,IAAA,IAAA,CAAK,QAAA,CAAS;AAAA,MACZ,OAAA,EAAS,EAAE,GAAG,KAAA,EAAO,QAAQ,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,MAC7D,WAAA,EAAa,WAAA,CAAY,YAAA,CAAa,EAAA,CAAG,IAAI;AAAA,KAC9C,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EACA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,IAAI,CAAA;AACrC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA;AAAA,EACrC;AAAA,EAEQ,eAAA,GAAkB;AACxB,IAAA,MAAM,OAAA,GAAU,IAAA;AAChB,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,MAAA,CAAO,CAAC,IAAA,KAAS;AAC5C,MAAA,OAAA,CAAQ,OAAO,IAAI,CAAA;AACnB,MAAA,OAAO;AAAA,QACL,OAAO,MAAA,EAA0B;AAC/B,UAAA,OAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,QAC3B,CAAA;AAAA,QACA,OAAA,GAAgB;AACd,UAAA,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,QACrB;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,IAAA,CAAK,aAAA,CAAc,EAAA,CAAG,WAAA,CAAY,aAAA,CAAc,GAAG,mBAAA,CAAoB,IAAA,CAAK,YAAY,CAAC,CAAC,CAAA;AAAA,MAC1F,OAAA,EAAQ;AAAA,MACR,cAAA,CAAe,EAAE,QAAA,EAAU,CAAC,CAAC,OAAA,KAAY,IAAA,CAAK,QAAA,CAAS,OAAO,CAAC,CAAA,EAAG,CAAA;AAAA,MAClEC,cAAA,CAAgB,CAAC,IAAA,EAAM,QAAA,KAAa,KAAK,YAAA,CAAa,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,MACrE,oBAAA;AAAA,MACA,OAAO,EAAA,CAAG;AAAA,QACR,GAAG,gBAAA;AAAA,QACH,GAAG,aAAA;AAAA,QACH,EAAE,KAAK,aAAA,EAAe,GAAA,EAAK,CAAC,IAAA,KAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA,EAAE;AAAA,QAC9D,EAAE,KAAK,QAAA,EAAU,GAAA,EAAK,CAAC,IAAA,KAAS,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AAAE,OAC9D,CAAA;AAAA,MACD,WAAW,iBAAA,CAAkB,EAAA,CAAG,EAAE,YAAA,EAAc,4BAA4B;AAAA,KAC9E;AAAA,EACF;AAAA,EAEQ,OAAO,IAAA,EAAwB;AACrC,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,IAAA;AAC7B,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAC5D,IAAA,IAAI,cAAA,CAAe,KAAK,KAAA,CAAM,GAAA,EAAK,KAAK,KAAA,CAAM,SAAS,CAAA,KAAM,IAAA,CAAK,YAAA,EAAc;AAC9E,MAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,IACjF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,IAAa,CAAA;AAClB,IAAA,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEQ,OAAO,IAAA,EAAwB;AACrC,IAAA,IAAI,IAAA,CAAK,SAAS,IAAA,EAAM;AACxB,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,IAAa,CAAA;AAAA,EACpB;AAAA,EAEQ,WAAW,MAAA,EAA0B;AAC3C,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAC,MAAA,CAAO,UAAA,EAAY;AACzC,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,KAAA,MAAW,WAAA,IAAe,OAAO,YAAA,EAAc;AAC7C,MAAA,IAAI,WAAA,CAAY,UAAA,EAAY,IAAA,CAAK,gBAAA,CAAiB,WAAW,CAAA;AAAA,IAC/D;AACA,IAAA,IAAA,CAAK,eAAe,cAAA,CAAe,MAAA,CAAO,MAAM,GAAA,EAAK,MAAA,CAAO,MAAM,SAAS,CAAA;AAC3E,IAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,IAAI,CAAA;AAAA,EACtC;AAAA,EAEQ,iBAAiB,WAAA,EAAsC;AAC7D,IAAA,MAAM,OAAA,GAAU,KAAK,eAAA,EAAgB;AACrC,IAAA,MAAM,YAAY,cAAA,CAAe,WAAA,CAAY,WAAW,GAAA,EAAK,WAAA,CAAY,WAAW,SAAS,CAAA;AAC7F,IAAA,IAAI,OAAA,CAAQ,SAAS,SAAA,EAAW;AAC9B,MAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,IACtE;AACA,IAAA,MAAM,KAAA,GAAQ,cAAA;AAAA,MACZ,YAAY,UAAA,CAAW,GAAA;AAAA,MACvB,WAAA,CAAY,MAAA;AAAA,MACZ,WAAA,CAAY,OAAA;AAAA,MACZ,OAAA;AAAA,MACA,YAAY,KAAA,CAAM;AAAA,KACpB;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe;AAAA,MAC3C,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,OAAA,EAAS,KAAK,YAAA,EAAa;AAAA,MAC3B;AAAA,KACD,CAAA;AACD,IAAA,IAAI,QAAA,CAAS,SAAS,cAAA,CAAe,WAAA,CAAY,QAAQ,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AACrF,MAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,IAC5E;AACA,IAAA,IAAA,CAAK,eAAe,QAAA,CAAS,IAAA;AAC7B,IAAA,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,EACtB;AAAA,EAEQ,SAAS,OAAA,EAA+D;AAC9E,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,KAAA,KAAU,QAAQ,KAAA,IAAS,IAAA,CAAK,UAAU,OAAO,IAAA;AACnE,IAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,CAAK,eAAA;AACrB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,GAAA,EAAKD,WAAAA,CAAW,OAAA,CAAQ,KAAA,CAAM,GAAA,EAAK,OAAA,CAAQ,GAAG,CAAA,EAAG;AAAA,MAC3F,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,YAAA,EAAc,KAAK;AAAA,KACpD,CAAA;AACD,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,YAAA,IAAgB,CAAC,IAAA,CAAK,YAAY,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,YAAY,CAAA,EAAG;AACxF,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,UAAA,GAAa,OAAO,KAAA,CAAM,GAAA;AAAA,MAAI,CAAC,IAAA,KACnC,IAAA,CAAK,oBAAoB,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAK;AAAA,KACpD;AACA,IAAA,MAAM,YAAY,UAAA,CAAW,MAAA,CAAO,CAAC,KAAA,KAAU,UAAU,IAAI,CAAA;AAC7D,IAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,IAAA,OAAO,QACH,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,IAAI,KAAA,CAAM,EAAA,EAAI,OAAA,EAAS,SAAA,CAAU,IAAI,CAAC,EAAE,QAAO,KAAM,MAAM,GAAE,GACjF,IAAA;AAAA,EACN;AAAA,EAEQ,mBAAA,CACN,IAAA,EACA,QAAA,EACA,IAAA,EACA,KAAA,EACmE;AACnE,IAAA,MAAM,QAAQ,cAAA,CAAe,IAAA,CAAK,MAAM,GAAA,EAAK,IAAA,CAAK,KAAK,KAAK,CAAA;AAC5D,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,MAAM,MAAA,GAAqB;AAAA,MACzB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,IAAA,EAAM,IAAA,CAAK,IAAA,KAAS,SAAA,GAAY,aAAa,IAAA,CAAK,IAAA;AAAA,MAClD,QAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,KAAK,QAAQ,CAAA,CAAA;AAAA,MACzC,KAAA,EAAO,IAAA,CAAK,OAAA,KAAY,QAAA,GAAW,EAAA,GAAK,CAAA;AAAA,MACxC,KAAA,EAAO,CAAC,MAAA,KAAW,IAAA,CAAK,gBAAgB,MAAA,EAAQ,IAAA,EAAM,UAAU,KAAK;AAAA,KACvE;AACA,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAO;AAAA,EAC5B;AAAA,EAEQ,eAAA,CACN,IAAA,EACA,IAAA,EACA,QAAA,EACA,KAAA,EACM;AACN,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,UAAU,IAAA,EAAM,KAAA,EAAO,YAAY,CAAA,EAAG;AAC5D,IAAA,MAAM,QAAQ,cAAA,CAAe,IAAA,CAAK,MAAM,GAAA,EAAK,IAAA,CAAK,KAAK,KAAK,CAAA;AAC5D,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAA,CAAK,QAAA,CAAS,EAAE,OAAA,EAAS,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK,EAAG,CAAA;AAAA,EACjE;AAAA,EAEQ,YAAA,CAAa,MAAkB,MAAA,EAAgC;AACrE,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAAA,EACvC;AAAA,EAEQ,cAAc,IAAA,EAA2B;AAC/C,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,CAAa,IAAA,EAAM,KAAK,KAAA,CAAM,SAAA,CAAU,KAAK,IAAI,CAAA;AACtE,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,IAAA,IAAA,CAAK,SAAS,EAAE,OAAA,EAAS,mBAAmB,EAAA,CAAG,OAAO,GAAG,CAAA;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CAAa,MAAkB,MAAA,EAAgC;AACrE,IAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,CAAK,UAAA;AACrB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,GAAA,EAAKA,WAAAA,CAAW,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,MAAM,CAAA,EAAG;AAAA,MAC9E,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,KAAK;AAAA,KAC/C,CAAA;AACD,IAAA,IACE,MAAA,CAAO,IAAA,KAAS,OAAA,IAChB,CAAC,MAAA,CAAO,KAAA,IACR,CAAC,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA,EAC9C;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,iBAAA,CAAkB,QAAQ,IAAI,CAAA;AAAA,EACvC;AAAA,EAEQ,kBAAkB,IAAA,EAA2B;AACnD,IAAA,IAAA,CAAK,WAAA,CAAY,MAAM,KAAK,CAAA;AAC5B,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,WAAA,CAAY,MAAkB,WAAA,EAA4B;AAChE,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,MAAM,YAAA,GAAe,EAAE,OAAA,EAAS,CAAC,mBAAmB,EAAA,CAAG,IAAI,CAAA,EAAG,kBAAkB,CAAA,EAAE;AAClF,IAAA,IAAI,WAAA,OAAkB,QAAA,CAAS,YAAA,EAAc,eAAe,IAAA,CAAK,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,SACtE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACjC;AAAA,EACQ,oBAAoB,IAAA,EAAwB;AAClD,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,CAAK,gBAAA;AACrB,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,IAAA,IAAA,CAAK,gBAAA,GAAmB,eAAA,CAAgB,IAAI,CAAA,CAAE,sBAAsB,MAAM;AACxE,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,KAAK,GAAA,EAAK;AAAA,QAChD,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,aAAA,EAAe,KAAK;AAAA,OACrD,CAAA;AACD,MAAA,IAAI,MAAA,CAAO,SAAS,aAAA,IAAiB,CAAC,KAAK,WAAA,CAAY,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,aAAa,CAAA;AACvF,QAAA;AACF,MAAA,IAAI,IAAA,CAAK,cAAc,SAAA,EAAW;AAClC,MAAA,IAAA,CAAK,QAAA;AAAA,QACH,cAAA;AAAA,UACE,IAAA,CAAK,KAAA;AAAA,UACL,MAAA,CAAO,YAAY,GAAA,CAAI,CAAC,UAAU,mBAAA,CAAoB,KAAA,EAAO,IAAI,CAAC;AAAA;AACpE,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EACQ,sBAAA,GAA+B;AACrC,IAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,IAAA,IAAQ,CAAC,KAAK,IAAA,EAAM;AAClD,IAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,CAAE,oBAAA,CAAqB,KAAK,gBAAgB,CAAA;AACrE,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,EAC1B;AAAA,EAEQ,YAAA,CAAa,MAAmB,KAAA,EAAe;AACrD,IAAA,OAAO;AAAA,MACL,yBAAyB,MAAM,IAAA,CAAK,YAAY,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,KAAM;AAAA,KACvE;AAAA,EACF;AAAA,EAEQ,WAAA,CACN,QAAA,EACA,IAAA,EACA,KAAA,EACA,IAAA,EACS;AACT,IAAA,OACE,CAAC,IAAA,CAAK,QAAA,IACN,KAAK,IAAA,KAAS,IAAA,IACd,KAAK,KAAA,CAAM,IAAI,MAAM,KAAA,IACrB,QAAA,IAAY,YACZ,QAAA,CAAS,MAAA,KAAW,aACpB,IAAA,CAAK,OAAA,CAAQ,UAAU,QAAQ,CAAA;AAAA,EAEnC;AAAA,EAEQ,MAAM,IAAA,EAA2B;AACvC,IAAA,IAAI,IAAA,KAAS,YAAA,EAAc,OAAO,IAAA,CAAK,eAAA;AACvC,IAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,IAAA,CAAK,UAAA;AAClC,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA,EAEQ,kBAAA,GAA2B;AACjC,IAAA,IAAA,CAAK,eAAA,IAAmB,CAAA;AACxB,IAAA,IAAA,CAAK,UAAA,IAAc,CAAA;AACnB,IAAA,IAAA,CAAK,gBAAA,IAAoB,CAAA;AAAA,EAC3B;AAAA,EAEQ,YAAA,GAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,YAAY,MAAA,CAAO,gBAAA;AAC1B,MAAA,MAAM,IAAI,WAAW,oCAAoC,CAAA;AAC3D,IAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AACjB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEQ,eAAA,GAAoC;AAC1C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,KAAK,GAAG,CAAA;AAClD,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,oCAAoC,CAAA;AACnE,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,OAAO,QAAA,EAAkC;AAC/C,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,mBAAmB,QAAQ,CAAA;AAAA,IAClC,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACxE;AACF,CAAA","file":"index.js","sourcesContent":["import { Text } from \"@codemirror/state\";\n\nexport function detectLineSeparator(text: string): string {\n if (text.includes(\"\\r\\n\")) return \"\\r\\n\";\n if (text.includes(\"\\r\")) return \"\\r\";\n return \"\\n\";\n}\n\nexport function textForEditor(text: string): Text {\n return Text.of(text.split(/\\r\\n|\\r|\\n/u));\n}\n\nexport function textFromEditor(document: Text, lineSeparator: string): string {\n return document.sliceString(0, document.length, lineSeparator);\n}\n","import type { EditorView, Tooltip } from \"@codemirror/view\";\nimport type { HoverInfo, ShapeSummary, ToolingEvidence } from \"@kalada/language-service\";\n\nexport function hoverTooltip(info: HoverInfo, position: number): Tooltip {\n return {\n pos: position,\n above: true,\n create(view: EditorView) {\n const document = view.dom.ownerDocument;\n const dom = document.createElement(\"section\");\n dom.className = \"cm-kalada-hover\";\n dom.setAttribute(\"role\", \"tooltip\");\n dom.setAttribute(\"aria-label\", \"Kalada expression information\");\n appendSection(document, dom, \"Input editor shape\", info.input.map(shapeText));\n appendSection(document, dom, \"Output Kalada semantic projection\", [semanticText(info)]);\n appendSection(document, dom, \"Presence / branch conditions\", [accessText(info)]);\n appendSection(document, dom, \"Limit/unknown evidence\", info.evidence.map(evidenceText));\n return { dom };\n },\n };\n}\n\nfunction appendSection(\n document: Document,\n parent: HTMLElement,\n heading: string,\n values: readonly string[],\n): void {\n const title = document.createElement(\"strong\");\n title.textContent = heading;\n parent.append(title);\n const list = document.createElement(\"ul\");\n for (const value of values.length > 0 ? values : [\"None\"]) {\n const item = document.createElement(\"li\");\n item.textContent = value;\n list.append(item);\n }\n parent.append(list);\n}\n\nfunction shapeText(summary: ShapeSummary): string {\n const fields = summary.fields\n .map(\n ({ name, presence, accessible }) =>\n `${name} (${presence}, ${accessible ? \"accessible\" : \"inspect only\"})`,\n )\n .join(\", \");\n const scalar = summary.scalar ? ` ${summary.scalar}` : \"\";\n return `${summary.kind}${scalar}; ${summary.presence}; fields: ${fields || \"none\"}`;\n}\n\nfunction semanticText(info: HoverInfo): string {\n const type = info.output.type === \"dynamic\" ? \"dynamic\" : JSON.stringify(info.output.type);\n return `${info.output.known ? \"Known\" : \"Unknown\"}: ${type}`;\n}\n\nfunction accessText(info: HoverInfo): string {\n return `Access: ${info.access}`;\n}\n\nfunction evidenceText(evidence: ToolingEvidence): string {\n return `${evidence.code} at ${evidence.path.join(\".\") || \"root\"}`;\n}\n","import type { Text } from \"@codemirror/state\";\nimport type { DocumentSnapshot, TextEdit, Utf16LineIndex } from \"@kalada/language-service\";\n\ninterface OffsetEdit {\n readonly from: number;\n readonly to: number;\n readonly insert: string;\n}\n\nexport function changesToEdits(\n startDoc: Text,\n newDoc: Text,\n changes: Readonly<{ iterChanges: (callback: ChangeCallback) => void }>,\n snapshot: DocumentSnapshot,\n lineSeparator = \"\\n\",\n): readonly TextEdit[] {\n const offsets: OffsetEdit[] = [];\n changes.iterChanges((fromA, toA, _fromB, _toB, inserted) => {\n offsets.push({\n from: fromA,\n to: toA,\n insert: inserted.sliceString(0, inserted.length, lineSeparator),\n });\n });\n const coalesced = coalesceInserts(offsets);\n const translated = coalesced.map((edit) => offsetEdit(edit, startDoc, snapshot.lineIndex));\n if (translated.every((edit) => edit !== null)) return translated as readonly TextEdit[];\n return [wholeDocumentEdit(snapshot, newDoc.sliceString(0, newDoc.length, lineSeparator))];\n}\n\nexport function rangeToOffsets(\n document: Text,\n range: TextEdit[\"range\"],\n): Readonly<{ from: number; to: number }> | null {\n const from = offsetAt(document, range.start.line, range.start.character);\n const to = offsetAt(document, range.end.line, range.end.character);\n return from === null || to === null || from > to ? null : { from, to };\n}\n\nexport function diagnosticOffsets(\n document: Text,\n range: TextEdit[\"range\"],\n): Readonly<{ from: number; to: number }> {\n return rangeToOffsets(document, range) ?? { from: 0, to: 0 };\n}\n\nfunction offsetEdit(edit: OffsetEdit, document: Text, index: Utf16LineIndex): TextEdit | null {\n const start = positionAt(document, edit.from);\n const end = positionAt(document, edit.to);\n if (index.offsetAt(start) !== edit.from || index.offsetAt(end) !== edit.to) return null;\n return { range: { start, end }, text: edit.insert };\n}\n\nfunction positionAt(document: Text, offset: number) {\n const line = document.lineAt(offset);\n return { line: line.number - 1, character: offset - line.from };\n}\n\nfunction offsetAt(document: Text, line: number, character: number): number | null {\n if (\n !Number.isSafeInteger(line) ||\n !Number.isSafeInteger(character) ||\n line < 0 ||\n character < 0\n ) {\n return null;\n }\n if (line >= document.lines) return null;\n const found = document.line(line + 1);\n return character <= found.length ? found.from + character : null;\n}\n\nfunction coalesceInserts(edits: readonly OffsetEdit[]): OffsetEdit[] {\n const output: OffsetEdit[] = [];\n for (const edit of edits) {\n const previous = output.at(-1);\n if (\n previous &&\n previous.from === edit.from &&\n previous.to === edit.to &&\n edit.from === edit.to\n ) {\n output[output.length - 1] = { ...previous, insert: `${previous.insert}${edit.insert}` };\n } else output.push(edit);\n }\n return output;\n}\n\nfunction wholeDocumentEdit(snapshot: DocumentSnapshot, text: string): TextEdit {\n return {\n range: {\n start: { line: 0, character: 0 },\n end: snapshot.lineIndex.positionAt(snapshot.text.length),\n },\n text,\n };\n}\n\ntype ChangeCallback = (\n fromA: number,\n toA: number,\n fromB: number,\n toB: number,\n inserted: Text,\n) => void;\n","import type { Diagnostic } from \"@codemirror/lint\";\nimport type { Text } from \"@codemirror/state\";\nimport type { EditorView } from \"@codemirror/view\";\nimport type {\n DocumentSnapshot,\n HoverResult,\n LanguageServiceDiagnostic,\n} from \"@kalada/language-service\";\nimport { hoverTooltip } from \"./render.js\";\nimport { diagnosticOffsets, rangeToOffsets } from \"./translation.js\";\n\nexport function positionAt(document: Text, offset: number) {\n const line = document.lineAt(offset);\n return { line: line.number - 1, character: offset - line.from };\n}\n\nexport function translatedTooltip(\n result: Extract<HoverResult, { kind: \"hover\" }>,\n view: EditorView,\n) {\n const range = result.hover ? rangeToOffsets(view.state.doc, result.hover.range) : null;\n if (!range || !result.hover) return null;\n return { ...hoverTooltip(result.hover, range.from), end: range.to };\n}\n\nexport function translateDiagnostic(\n diagnostic: LanguageServiceDiagnostic,\n view: EditorView,\n): Diagnostic {\n const range = diagnostic.source\n ? diagnosticOffsets(view.state.doc, diagnostic.source.range)\n : { from: 0, to: 0 };\n return { ...range, severity: \"error\", message: diagnostic.message };\n}\n\nexport function animationWindow(view: EditorView): Window {\n const window = view.dom.ownerDocument.defaultView;\n if (!window) throw new Error(\"CodeMirror view has no window\");\n return window;\n}\n\nexport function wholeReplacement(snapshot: DocumentSnapshot, text: string) {\n return {\n range: {\n start: { line: 0, character: 0 },\n end: snapshot.lineIndex.positionAt(snapshot.text.length),\n },\n text,\n };\n}\n","import { StateEffect, StateField } from \"@codemirror/state\";\nimport { showTooltip, type Tooltip } from \"@codemirror/view\";\n\nexport const setKeyboardTooltip = StateEffect.define<Tooltip | null>();\n\nexport const keyboardTooltipField = StateField.define<readonly Tooltip[]>({\n create: () => [],\n update(value, transaction) {\n let next = value;\n for (const effect of transaction.effects) {\n if (effect.is(setKeyboardTooltip)) next = effect.value ? [effect.value] : [];\n }\n return next;\n },\n provide: (field) => showTooltip.computeN([field], (state) => state.field(field)),\n});\n","import {\n autocompletion,\n type CompletionResult as CodeMirrorCompletionResult,\n type Completion,\n type CompletionContext,\n closeCompletion,\n completionKeymap,\n} from \"@codemirror/autocomplete\";\nimport { history, historyKeymap } from \"@codemirror/commands\";\nimport { setDiagnostics } from \"@codemirror/lint\";\nimport {\n Compartment,\n EditorSelection,\n EditorState,\n type Transaction as EditorTransaction,\n Transaction,\n} from \"@codemirror/state\";\nimport {\n closeHoverTooltips,\n hoverTooltip as codeMirrorHover,\n EditorView,\n keymap,\n type Tooltip,\n ViewPlugin,\n type ViewUpdate,\n} from \"@codemirror/view\";\nimport type {\n CompletionItem,\n DocumentSnapshot,\n LanguageService,\n SnapshotIdentity,\n} from \"@kalada/language-service\";\nimport type { KaladaEditorSession, KaladaEditorSessionOptions } from \"./contracts.js\";\nimport { detectLineSeparator, textForEditor, textFromEditor } from \"./line-separator.js\";\nimport {\n animationWindow,\n positionAt,\n translateDiagnostic,\n translatedTooltip,\n wholeReplacement,\n} from \"./session-helpers.js\";\nimport { keyboardTooltipField, setKeyboardTooltip } from \"./tooltip-state.js\";\nimport { changesToEdits, rangeToOffsets } from \"./translation.js\";\nexport function createKaladaEditorSession(\n options: KaladaEditorSessionOptions,\n): KaladaEditorSession {\n return new EditorSession(options);\n}\nclass EditorSession implements KaladaEditorSession {\n readonly extension;\n private readonly service: LanguageService;\n private readonly uri: string;\n private readonly onDocumentChange?: (snapshot: DocumentSnapshot) => void;\n private readonly lineSeparator = new Compartment();\n private view: EditorView | null = null;\n private expectedText: string;\n private revision: number;\n private disposed = false;\n private viewEpoch = 0;\n private completionEpoch = 0;\n private hoverEpoch = 0;\n private diagnosticsEpoch = 0;\n private diagnosticsFrame: number | null = null;\n\n constructor(options: KaladaEditorSessionOptions) {\n this.service = options.service;\n this.uri = options.document.uri;\n this.onDocumentChange = options.onDocumentChange;\n const opened = this.service.openDocument(options.document);\n this.expectedText = opened.text;\n this.revision = opened.version;\n this.extension = this.createExtension();\n }\n refreshEnvironment(): void {\n this.assertOpen();\n this.invalidateRequests();\n const view = this.view;\n if (!view) return;\n this.clearEditor(view, false);\n this.scheduleDiagnostics(view);\n }\n replaceDocument(text: string): void {\n this.assertOpen();\n if (typeof text !== \"string\") throw new TypeError(\"Replacement text must be a string\");\n const view = this.view;\n if (view) {\n const separator = detectLineSeparator(text);\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: textForEditor(text) },\n selection: EditorSelection.cursor(0),\n annotations: Transaction.addToHistory.of(true),\n effects:\n separator === view.state.lineBreak\n ? undefined\n : this.lineSeparator.reconfigure(EditorState.lineSeparator.of(separator)),\n });\n return;\n }\n const current = this.requireDocument();\n const snapshot = this.service.updateDocument({\n uri: this.uri,\n version: this.nextRevision(),\n edits: [wholeReplacement(current, text)],\n });\n this.expectedText = snapshot.text;\n this.invalidateRequests();\n this.notify(snapshot);\n }\n format(): boolean {\n this.assertOpen();\n const view = this.view;\n if (!view) return false;\n const epoch = this.completionEpoch;\n const result = this.service.format(this.uri, {\n cancellation: this.cancellation(\"completion\", epoch),\n });\n if (\n result.kind !== \"format\" ||\n !result.edit ||\n !this.publishable(result, view, epoch, \"completion\")\n ) {\n return false;\n }\n const range = rangeToOffsets(view.state.doc, result.edit.range);\n if (!range) return false;\n view.dispatch({\n changes: { ...range, insert: textForEditor(result.edit.text) },\n annotations: Transaction.addToHistory.of(true),\n });\n return true;\n }\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.invalidateRequests();\n this.cancelDiagnosticsFrame();\n const view = this.view;\n if (view) this.clearEditor(view, true);\n this.view = null;\n this.service.closeDocument(this.uri);\n }\n\n private createExtension() {\n const session = this;\n const lifecycle = ViewPlugin.define((view) => {\n session.attach(view);\n return {\n update(update: ViewUpdate): void {\n session.updateView(update);\n },\n destroy(): void {\n session.detach(view);\n },\n };\n });\n return [\n lifecycle,\n this.lineSeparator.of(EditorState.lineSeparator.of(detectLineSeparator(this.expectedText))),\n history(),\n autocompletion({ override: [(context) => this.complete(context)] }),\n codeMirrorHover((view, position) => this.pointerHover(view, position)),\n keyboardTooltipField,\n keymap.of([\n ...completionKeymap,\n ...historyKeymap,\n { key: \"Mod-Shift-h\", run: (view) => this.keyboardHover(view) },\n { key: \"Escape\", run: (view) => this.clearInteractions(view) },\n ]),\n EditorView.contentAttributes.of({ \"aria-label\": \"Kalada expression editor\" }),\n ];\n }\n\n private attach(view: EditorView): void {\n this.assertOpen();\n if (this.view && this.view !== view)\n throw new Error(\"Kalada editor session already has a view\");\n if (textFromEditor(view.state.doc, view.state.lineBreak) !== this.expectedText) {\n throw new Error(\"CodeMirror document does not match the opened Kalada document\");\n }\n this.view = view;\n this.viewEpoch += 1;\n this.scheduleDiagnostics(view);\n }\n\n private detach(view: EditorView): void {\n if (this.view !== view) return;\n this.cancelDiagnosticsFrame();\n this.invalidateRequests();\n this.view = null;\n this.viewEpoch += 1;\n }\n\n private updateView(update: ViewUpdate): void {\n if (this.disposed || !update.docChanged) return;\n this.invalidateRequests();\n for (const transaction of update.transactions) {\n if (transaction.docChanged) this.applyTransaction(transaction);\n }\n this.expectedText = textFromEditor(update.state.doc, update.state.lineBreak);\n this.scheduleDiagnostics(update.view);\n }\n\n private applyTransaction(transaction: EditorTransaction): void {\n const current = this.requireDocument();\n const startText = textFromEditor(transaction.startState.doc, transaction.startState.lineBreak);\n if (current.text !== startText) {\n throw new Error(\"CodeMirror and language-service snapshots diverged\");\n }\n const edits = changesToEdits(\n transaction.startState.doc,\n transaction.newDoc,\n transaction.changes,\n current,\n transaction.state.lineBreak,\n );\n const snapshot = this.service.updateDocument({\n uri: this.uri,\n version: this.nextRevision(),\n edits,\n });\n if (snapshot.text !== textFromEditor(transaction.newDoc, transaction.state.lineBreak)) {\n throw new Error(\"CodeMirror transaction translation changed document text\");\n }\n this.expectedText = snapshot.text;\n this.notify(snapshot);\n }\n\n private complete(context: CompletionContext): CodeMirrorCompletionResult | null {\n const view = this.view;\n if (!view || view.state !== context.state || this.disposed) return null;\n const epoch = ++this.completionEpoch;\n const result = this.service.completion(this.uri, positionAt(context.state.doc, context.pos), {\n cancellation: this.cancellation(\"completion\", epoch),\n });\n if (result.kind !== \"completion\" || !this.publishable(result, view, epoch, \"completion\")) {\n return null;\n }\n const translated = result.items.map((item) =>\n this.translateCompletion(item, result, view, epoch),\n );\n const available = translated.filter((entry) => entry !== null);\n const first = available[0];\n return first\n ? { from: first.from, to: first.to, options: available.map(({ option }) => option) }\n : null;\n }\n\n private translateCompletion(\n item: CompletionItem,\n identity: SnapshotIdentity,\n view: EditorView,\n epoch: number,\n ): Readonly<{ from: number; to: number; option: Completion }> | null {\n const range = rangeToOffsets(view.state.doc, item.edit.range);\n if (!range) return null;\n const option: Completion = {\n label: item.label,\n type: item.kind === \"binding\" ? \"variable\" : item.kind,\n detail: `${item.support}, ${item.presence}`,\n boost: item.support === \"common\" ? 10 : 0,\n apply: (target) => this.applyCompletion(target, item, identity, epoch),\n };\n return { ...range, option };\n }\n\n private applyCompletion(\n view: EditorView,\n item: CompletionItem,\n identity: SnapshotIdentity,\n epoch: number,\n ): void {\n if (!this.publishable(identity, view, epoch, \"completion\")) return;\n const range = rangeToOffsets(view.state.doc, item.edit.range);\n if (!range) return;\n view.dispatch({ changes: { ...range, insert: item.edit.text } });\n }\n\n private pointerHover(view: EditorView, offset: number): Tooltip | null {\n return this.requestHover(view, offset);\n }\n\n private keyboardHover(view: EditorView): boolean {\n const tooltip = this.requestHover(view, view.state.selection.main.head);\n if (!tooltip) return false;\n view.dispatch({ effects: setKeyboardTooltip.of(tooltip) });\n return true;\n }\n\n private requestHover(view: EditorView, offset: number): Tooltip | null {\n const epoch = ++this.hoverEpoch;\n const result = this.service.hover(this.uri, positionAt(view.state.doc, offset), {\n cancellation: this.cancellation(\"hover\", epoch),\n });\n if (\n result.kind !== \"hover\" ||\n !result.hover ||\n !this.publishable(result, view, epoch, \"hover\")\n ) {\n return null;\n }\n return translatedTooltip(result, view);\n }\n\n private clearInteractions(view: EditorView): boolean {\n this.clearEditor(view, false);\n view.focus();\n return true;\n }\n\n private clearEditor(view: EditorView, diagnostics: boolean): void {\n closeCompletion(view);\n const interactions = { effects: [setKeyboardTooltip.of(null), closeHoverTooltips] };\n if (diagnostics) view.dispatch(interactions, setDiagnostics(view.state, []));\n else view.dispatch(interactions);\n }\n private scheduleDiagnostics(view: EditorView): void {\n this.cancelDiagnosticsFrame();\n const epoch = ++this.diagnosticsEpoch;\n const viewEpoch = this.viewEpoch;\n this.diagnosticsFrame = animationWindow(view).requestAnimationFrame(() => {\n this.diagnosticsFrame = null;\n const result = this.service.diagnostics(this.uri, {\n cancellation: this.cancellation(\"diagnostics\", epoch),\n });\n if (result.kind !== \"diagnostics\" || !this.publishable(result, view, epoch, \"diagnostics\"))\n return;\n if (this.viewEpoch !== viewEpoch) return;\n view.dispatch(\n setDiagnostics(\n view.state,\n result.diagnostics.map((entry) => translateDiagnostic(entry, view)),\n ),\n );\n });\n }\n private cancelDiagnosticsFrame(): void {\n if (this.diagnosticsFrame === null || !this.view) return;\n animationWindow(this.view).cancelAnimationFrame(this.diagnosticsFrame);\n this.diagnosticsFrame = null;\n }\n\n private cancellation(kind: RequestKind, epoch: number) {\n return {\n isCancellationRequested: () => this.disposed || this.epoch(kind) !== epoch,\n };\n }\n\n private publishable(\n identity: SnapshotIdentity,\n view: EditorView,\n epoch: number,\n kind: RequestKind,\n ): boolean {\n return (\n !this.disposed &&\n this.view === view &&\n this.epoch(kind) === epoch &&\n \"status\" in identity &&\n identity.status === \"current\" &&\n this.service.isCurrent(identity)\n );\n }\n\n private epoch(kind: RequestKind): number {\n if (kind === \"completion\") return this.completionEpoch;\n if (kind === \"hover\") return this.hoverEpoch;\n return this.diagnosticsEpoch;\n }\n\n private invalidateRequests(): void {\n this.completionEpoch += 1;\n this.hoverEpoch += 1;\n this.diagnosticsEpoch += 1;\n }\n\n private nextRevision(): number {\n if (this.revision >= Number.MAX_SAFE_INTEGER)\n throw new RangeError(\"Kalada document revision exhausted\");\n this.revision += 1;\n return this.revision;\n }\n\n private requireDocument(): DocumentSnapshot {\n const document = this.service.getDocument(this.uri);\n if (!document) throw new Error(\"Kalada editor document is not open\");\n return document;\n }\n\n private notify(snapshot: DocumentSnapshot): void {\n try {\n this.onDocumentChange?.(snapshot);\n } catch {}\n }\n\n private assertOpen(): void {\n if (this.disposed) throw new Error(\"Kalada editor session is disposed\");\n }\n}\ntype RequestKind = \"completion\" | \"hover\" | \"diagnostics\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/kalada-provider.ts","../src/render.ts","../src/session-helpers.ts","../src/translation.ts","../src/session.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { HoverInfo, LanguageService, SnapshotIdentity } from \"@kalada/language-service\";\nimport type {\n EditorHover,\n EditorIdentity,\n EditorProvider,\n EditorRequest,\n EditorResult,\n} from \"./editor-contracts.js\";\n\nexport class KaladaProvider implements EditorProvider {\n readonly service: LanguageService;\n readonly uri: string;\n readonly hovers = new WeakMap<EditorHover, HoverInfo>();\n private readonly identities = new WeakMap<EditorIdentity, SnapshotIdentity>();\n\n constructor(service: LanguageService, uri: string) {\n this.service = service;\n this.uri = uri;\n }\n\n isCurrent(identity: EditorIdentity): boolean {\n const original = this.identities.get(identity);\n return !!original && this.service.isCurrent(original);\n }\n\n diagnostics(request: EditorRequest) {\n const result = this.service.diagnostics(this.uri, cancellation(request));\n if (result.kind !== \"diagnostics\" || !this.service.isCurrent(result)) return null;\n return this.tagged(\n request,\n result,\n result.diagnostics.map((item) => ({\n ...(item.source ? this.range(item.source.range) : { from: 0, to: 0 }),\n message: item.message,\n severity: \"error\" as const,\n })),\n );\n }\n\n completion(request: EditorRequest, offset: number) {\n const result = this.service.completion(\n this.uri,\n this.document().lineIndex.positionAt(offset),\n cancellation(request),\n );\n if (result.kind !== \"completion\" || !this.service.isCurrent(result)) return null;\n return this.tagged(\n request,\n result,\n result.items.map((item) => ({\n label: item.label,\n edit: { ...this.range(item.edit.range), text: item.edit.text },\n type: item.kind === \"binding\" ? \"variable\" : item.kind,\n detail: `${item.support}, ${item.presence}`,\n boost: item.support === \"common\" ? 10 : 0,\n })),\n );\n }\n\n hover(request: EditorRequest, offset: number) {\n const result = this.service.hover(\n this.uri,\n this.document().lineIndex.positionAt(offset),\n cancellation(request),\n );\n if (result.kind !== \"hover\" || !result.hover || !this.service.isCurrent(result)) return null;\n const hover = { ...this.range(result.hover.range), content: \"\" };\n this.hovers.set(hover, result.hover);\n return this.tagged(request, result, hover);\n }\n\n format(request: EditorRequest) {\n const result = this.service.format(this.uri, cancellation(request));\n if (result.kind !== \"format\" || !result.edit || !this.service.isCurrent(result)) return null;\n return this.tagged(request, result, {\n ...this.range(result.edit.range),\n text: result.edit.text,\n });\n }\n\n private tagged<T>(request: EditorRequest, original: SnapshotIdentity, value: T): EditorResult<T> {\n const result = {\n uri: this.uri,\n version: request.snapshot.version,\n environmentGeneration: request.snapshot.environmentGeneration,\n value,\n };\n this.identities.set(result, original);\n return result;\n }\n\n private range(source: {\n readonly start: { readonly line: number; readonly character: number };\n readonly end: { readonly line: number; readonly character: number };\n }) {\n const document = this.document();\n return {\n from: document.lineIndex.offsetAt(source.start),\n to: document.lineIndex.offsetAt(source.end),\n };\n }\n\n private document() {\n const document = this.service.getDocument(this.uri);\n if (!document) throw new Error(\"Kalada editor document is not open\");\n return document;\n }\n}\n\nfunction cancellation(request: EditorRequest) {\n return { cancellation: { isCancellationRequested: () => request.signal.aborted } };\n}\n","import type { EditorView, Tooltip } from \"@codemirror/view\";\nimport type { HoverInfo, ShapeSummary, ToolingEvidence } from \"@kalada/language-service\";\n\nexport function hoverTooltip(info: HoverInfo, position: number): Tooltip {\n return {\n pos: position,\n above: true,\n create(view: EditorView) {\n const document = view.dom.ownerDocument;\n const dom = document.createElement(\"section\");\n dom.className = \"cm-kalada-hover\";\n dom.setAttribute(\"role\", \"tooltip\");\n dom.setAttribute(\"aria-label\", \"Kalada expression information\");\n appendSection(document, dom, \"Input editor shape\", info.input.map(shapeText));\n appendSection(document, dom, \"Output Kalada semantic projection\", [semanticText(info)]);\n appendSection(document, dom, \"Presence / branch conditions\", [accessText(info)]);\n appendSection(document, dom, \"Limit/unknown evidence\", info.evidence.map(evidenceText));\n return { dom };\n },\n };\n}\n\nfunction appendSection(\n document: Document,\n parent: HTMLElement,\n heading: string,\n values: readonly string[],\n): void {\n const title = document.createElement(\"strong\");\n title.textContent = heading;\n parent.append(title);\n const list = document.createElement(\"ul\");\n for (const value of values.length > 0 ? values : [\"None\"]) {\n const item = document.createElement(\"li\");\n item.textContent = value;\n list.append(item);\n }\n parent.append(list);\n}\n\nfunction shapeText(summary: ShapeSummary): string {\n const fields = summary.fields\n .map(\n ({ name, presence, accessible }) =>\n `${name} (${presence}, ${accessible ? \"accessible\" : \"inspect only\"})`,\n )\n .join(\", \");\n const scalar = summary.scalar ? ` ${summary.scalar}` : \"\";\n return `${summary.kind}${scalar}; ${summary.presence}; fields: ${fields || \"none\"}`;\n}\n\nfunction semanticText(info: HoverInfo): string {\n const type = info.output.type === \"dynamic\" ? \"dynamic\" : JSON.stringify(info.output.type);\n return `${info.output.known ? \"Known\" : \"Unknown\"}: ${type}`;\n}\n\nfunction accessText(info: HoverInfo): string {\n return `Access: ${info.access}`;\n}\n\nfunction evidenceText(evidence: ToolingEvidence): string {\n return `${evidence.code} at ${evidence.path.join(\".\") || \"root\"}`;\n}\n","import type { DocumentSnapshot } from \"@kalada/language-service\";\n\nexport function wholeReplacement(snapshot: DocumentSnapshot, text: string) {\n return {\n range: {\n start: { line: 0, character: 0 },\n end: snapshot.lineIndex.positionAt(snapshot.text.length),\n },\n text,\n };\n}\n","import type { Text } from \"@codemirror/state\";\nimport type { DocumentSnapshot, TextEdit, Utf16LineIndex } from \"@kalada/language-service\";\n\ninterface OffsetEdit {\n readonly from: number;\n readonly to: number;\n readonly insert: string;\n}\n\nexport function changesToEdits(\n startDoc: Text,\n newDoc: Text,\n changes: Readonly<{ iterChanges: (callback: ChangeCallback) => void }>,\n snapshot: DocumentSnapshot,\n lineSeparator = \"\\n\",\n): readonly TextEdit[] {\n const offsets: OffsetEdit[] = [];\n changes.iterChanges((fromA, toA, _fromB, _toB, inserted) => {\n offsets.push({\n from: fromA,\n to: toA,\n insert: inserted.sliceString(0, inserted.length, lineSeparator),\n });\n });\n const coalesced = coalesceInserts(offsets);\n const translated = coalesced.map((edit) => offsetEdit(edit, startDoc, snapshot.lineIndex));\n if (translated.every((edit) => edit !== null)) return translated as readonly TextEdit[];\n return [wholeDocumentEdit(snapshot, newDoc.sliceString(0, newDoc.length, lineSeparator))];\n}\n\nexport function rangeToOffsets(\n document: Text,\n range: TextEdit[\"range\"],\n): Readonly<{ from: number; to: number }> | null {\n const from = offsetAt(document, range.start.line, range.start.character);\n const to = offsetAt(document, range.end.line, range.end.character);\n return from === null || to === null || from > to ? null : { from, to };\n}\n\nexport function diagnosticOffsets(\n document: Text,\n range: TextEdit[\"range\"],\n): Readonly<{ from: number; to: number }> {\n return rangeToOffsets(document, range) ?? { from: 0, to: 0 };\n}\n\nfunction offsetEdit(edit: OffsetEdit, document: Text, index: Utf16LineIndex): TextEdit | null {\n const start = positionAt(document, edit.from);\n const end = positionAt(document, edit.to);\n if (index.offsetAt(start) !== edit.from || index.offsetAt(end) !== edit.to) return null;\n return { range: { start, end }, text: edit.insert };\n}\n\nfunction positionAt(document: Text, offset: number) {\n const line = document.lineAt(offset);\n return { line: line.number - 1, character: offset - line.from };\n}\n\nfunction offsetAt(document: Text, line: number, character: number): number | null {\n if (\n !Number.isSafeInteger(line) ||\n !Number.isSafeInteger(character) ||\n line < 0 ||\n character < 0\n ) {\n return null;\n }\n if (line >= document.lines) return null;\n const found = document.line(line + 1);\n return character <= found.length ? found.from + character : null;\n}\n\nfunction coalesceInserts(edits: readonly OffsetEdit[]): OffsetEdit[] {\n const output: OffsetEdit[] = [];\n for (const edit of edits) {\n const previous = output.at(-1);\n if (\n previous &&\n previous.from === edit.from &&\n previous.to === edit.to &&\n edit.from === edit.to\n ) {\n output[output.length - 1] = { ...previous, insert: `${previous.insert}${edit.insert}` };\n } else output.push(edit);\n }\n return output;\n}\n\nfunction wholeDocumentEdit(snapshot: DocumentSnapshot, text: string): TextEdit {\n return {\n range: {\n start: { line: 0, character: 0 },\n end: snapshot.lineIndex.positionAt(snapshot.text.length),\n },\n text,\n };\n}\n\ntype ChangeCallback = (\n fromA: number,\n toA: number,\n fromB: number,\n toB: number,\n inserted: Text,\n) => void;\n","import type { DocumentSnapshot } from \"@kalada/language-service\";\nimport type { KaladaEditorSession, KaladaEditorSessionOptions } from \"./contracts.js\";\nimport type { EditorSnapshot } from \"./editor-contracts.js\";\nimport { type EditorBridge, NeutralEditorSession } from \"./editor-session.js\";\nimport { KaladaProvider } from \"./kalada-provider.js\";\nimport { hoverTooltip } from \"./render.js\";\nimport { wholeReplacement } from \"./session-helpers.js\";\nimport { changesToEdits } from \"./translation.js\";\n\nexport function createKaladaEditorSession(\n options: KaladaEditorSessionOptions,\n): KaladaEditorSession {\n const { service } = options;\n const opened = service.openDocument(options.document);\n let disposed = false;\n const provider = new KaladaProvider(service, opened.uri);\n const committed = new WeakMap<EditorSnapshot, DocumentSnapshot>();\n const core = new NeutralEditorSession(\n {\n document: opened,\n ariaLabel: \"Kalada expression editor\",\n provider,\n onDocumentChange: (identity) => {\n const snapshot = committed.get(identity);\n if (snapshot) options.onDocumentChange?.(snapshot);\n },\n },\n kaladaBridge(provider, (identity, snapshot) => committed.set(identity, snapshot)),\n );\n return {\n extension: core.extension,\n refreshEnvironment: () => core.refreshEnvironment(),\n replaceDocument: (text) => core.replaceDocument(text),\n format() {\n const formatted = core.format();\n if (typeof formatted !== \"boolean\") throw new Error(\"Kalada formatting must be synchronous\");\n return formatted;\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n core.dispose();\n service.closeDocument(opened.uri);\n },\n };\n}\n\nfunction kaladaBridge(\n provider: KaladaProvider,\n committed: (identity: EditorSnapshot, snapshot: DocumentSnapshot) => void,\n): EditorBridge {\n return {\n filterCompletions: true,\n isCurrent: (identity) => provider.isCurrent(identity),\n matches(snapshot) {\n const current = provider.service.getDocument(provider.uri);\n return (\n !!current &&\n current.uri === snapshot.uri &&\n current.version === snapshot.version &&\n current.text === snapshot.text\n );\n },\n changed(snapshot, previous, transaction) {\n const current = provider.service.getDocument(provider.uri);\n if (!current || current.text !== previous.text || current.version !== previous.version)\n throw new Error(\"CodeMirror and language-service snapshots diverged\");\n const updated = provider.service.updateDocument({\n uri: provider.uri,\n version: snapshot.version,\n edits: transaction\n ? changesToEdits(\n transaction.startState.doc,\n transaction.newDoc,\n transaction.changes,\n current,\n transaction.state.lineBreak,\n )\n : [wholeReplacement(current, snapshot.text)],\n });\n if (updated.text !== snapshot.text)\n throw new Error(\"CodeMirror transaction translation changed document text\");\n committed(snapshot, updated);\n },\n renderHover(hover, from, to) {\n const info = provider.hovers.get(hover);\n if (!info) throw new Error(\"Missing Kalada hover presentation\");\n return { ...hoverTooltip(info, from), end: to };\n },\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kalada/codemirror",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Thin CodeMirror 6 integration for the Kalada language service",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -28,6 +28,16 @@
|
|
|
28
28
|
"default": "./dist/index.cjs"
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
|
+
"./editor": {
|
|
32
|
+
"import": {
|
|
33
|
+
"types": "./dist/editor.d.ts",
|
|
34
|
+
"default": "./dist/editor.js"
|
|
35
|
+
},
|
|
36
|
+
"require": {
|
|
37
|
+
"types": "./dist/editor.d.cts",
|
|
38
|
+
"default": "./dist/editor.cjs"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
31
41
|
"./package.json": "./package.json"
|
|
32
42
|
},
|
|
33
43
|
"scripts": {
|