@carlonicora/nextjs-jsonapi 0.0.1 → 1.0.3
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/dist/BlockNoteEditor-VFWG6LXI.js.map +1 -1
- package/dist/JsonApiRequest-ZZLSP26T.js.map +1 -1
- package/dist/atoms/index.js.map +1 -1
- package/dist/chunk-2K3Q24UF.js.map +1 -1
- package/dist/chunk-3FBCC4G3.js.map +1 -1
- package/dist/chunk-4HCRAOS5.js.map +1 -1
- package/dist/chunk-6GKHCVF6.js.map +1 -1
- package/dist/chunk-7QVYU63E.js.map +1 -1
- package/dist/chunk-A5DDIABK.js.map +1 -1
- package/dist/chunk-AWONBQQP.js.map +1 -1
- package/dist/chunk-CXQOWQSY.js.map +1 -1
- package/dist/chunk-DO2HLAZO.js.map +1 -1
- package/dist/chunk-EFJEWLRL.js.map +1 -1
- package/dist/chunk-FY4SXJGU.js.map +1 -1
- package/dist/chunk-H6FMOA6B.js.map +1 -1
- package/dist/chunk-I2REI7OA.js.map +1 -1
- package/dist/chunk-IBS6NI7D.js.map +1 -1
- package/dist/chunk-J4Q36PMP.js.map +1 -1
- package/dist/chunk-JC3WJK65.js.map +1 -1
- package/dist/chunk-LXKSUWAV.js.map +1 -1
- package/dist/chunk-RAF7PNLG.js.map +1 -1
- package/dist/chunk-RUR22SVM.js.map +1 -1
- package/dist/chunk-TEGF6ZWG.js.map +1 -1
- package/dist/chunk-TMVHSY3Y.js.map +1 -1
- package/dist/chunk-V2JJPI7N.js.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/contexts/index.js.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/features/index.js.map +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces/index.js.map +1 -1
- package/dist/permissions/index.js.map +1 -1
- package/dist/request-QFS7NEIE.js.map +1 -1
- package/dist/request-ZYY6RI5X.js.map +1 -1
- package/dist/roles/index.js.map +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/shadcnui/index.js.map +1 -1
- package/dist/token-MJMC26ON.js.map +1 -1
- package/dist/token-UYE7CV6X.js.map +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-JC3WJK65.js","../src/utils/cn.ts","../src/utils/compose-refs.ts","../src/utils/use-mobile.tsx","../src/utils/date-formatter.ts","../src/utils/exists.ts","../src/utils/table-options.ts","../src/utils/schemas/user.object.schema.ts","../src/utils/schemas/entity.object.schema.ts","../src/utils/blocknote-diff.util.ts","../src/utils/blocknote-word-diff-renderer.util.ts"],"names":["z"],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;ACJA,4BAAsC;AACtC,+CAAwB;AAEjB,SAAS,EAAA,CAAA,GAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,oCAAA,wBAAQ,MAAW,CAAC,CAAA;AAC7B;AAFgB,qCAAA,EAAA,EAAA,IAAA,CAAA;ADQhB;AACA;AEZA,yHAAuB;AAQvB,SAAS,MAAA,CAAU,GAAA,EAAqB,KAAA,EAAU;AAChD,EAAA,GAAA,CAAI,OAAO,IAAA,IAAQ,UAAA,EAAY;AAC7B,IAAA,OAAO,GAAA,CAAI,KAAK,CAAA;AAAA,EAClB;AAEA,EAAA,GAAA,CAAI,IAAA,IAAQ,KAAA,GAAQ,IAAA,IAAQ,KAAA,CAAA,EAAW;AACrC,IAAA,GAAA,CAAI,QAAA,EAAU,KAAA;AAAA,EAChB;AACF;AARS,qCAAA,MAAA,EAAA,QAAA,CAAA;AAcT,SAAS,WAAA,CAAA,GAAkB,IAAA,EAA8C;AACvE,EAAA,OAAO,CAAC,IAAA,EAAA,GAAS;AACf,IAAA,IAAI,WAAA,EAAa,KAAA;AACjB,IAAA,MAAM,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAA,GAAQ;AACjC,MAAA,MAAM,QAAA,EAAU,MAAA,CAAO,GAAA,EAAK,IAAI,CAAA;AAChC,MAAA,GAAA,CAAI,CAAC,WAAA,GAAc,OAAO,QAAA,IAAY,UAAA,EAAY;AAChD,QAAA,WAAA,EAAa,IAAA;AAAA,MACf;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAMD,IAAA,GAAA,CAAI,UAAA,EAAY;AACd,MAAA,OAAO,CAAA,EAAA,GAAM;AACX,QAAA,IAAA,CAAA,IAAS,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,QAAA,CAAS,MAAA,EAAQ,CAAA,EAAA,EAAK;AACxC,UAAA,MAAM,QAAA,EAAU,QAAA,CAAS,CAAC,CAAA;AAC1B,UAAA,GAAA,CAAI,OAAO,QAAA,IAAY,UAAA,EAAY;AACjC,YAAA,OAAA,CAAQ,CAAA;AAAA,UACV,EAAA,KAAO;AACL,YAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,IAAI,CAAA;AAAA,UACtB;AAAA,QACF;AAAA,MACF,CAAA;AAAA,IACF;AAAA,EACF,CAAA;AACF;AA5BS,qCAAA,WAAA,EAAA,aAAA,CAAA;AAkCT,SAAS,eAAA,CAAA,GAAsB,IAAA,EAA8C;AAC3E,EAAA,OAAa,KAAA,CAAA,WAAA,CAAY,WAAA,CAAY,GAAG,IAAI,CAAA,EAAG,IAAI,CAAA;AACrD;AAFS,qCAAA,eAAA,EAAA,iBAAA,CAAA;AFJT;AACA;AGnDA;AAEA,IAAM,kBAAA,EAAoB,GAAA;AAEnB,SAAS,WAAA,CAAA,EAAc;AAC5B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,EAAA,EAAU,MAAA,CAAA,QAAA,CAA8B,KAAA,CAAS,CAAA;AAE7E,EAAM,MAAA,CAAA,SAAA,CAAU,CAAA,EAAA,GAAM;AACpB,IAAA,MAAM,IAAA,EAAM,MAAA,CAAO,UAAA,CAAW,CAAA,YAAA,EAAe,kBAAA,EAAoB,CAAC,CAAA,GAAA,CAAK,CAAA;AACvE,IAAA,MAAM,SAAA,kBAAW,qCAAA,CAAA,EAAA,GAAM;AACrB,MAAA,WAAA,CAAY,MAAA,CAAO,WAAA,EAAa,iBAAiB,CAAA;AAAA,IACnD,CAAA,EAFiB,UAAA,CAAA;AAGjB,IAAA,GAAA,CAAI,gBAAA,CAAiB,QAAA,EAAU,QAAQ,CAAA;AACvC,IAAA,WAAA,CAAY,MAAA,CAAO,WAAA,EAAa,iBAAiB,CAAA;AACjD,IAAA,OAAO,CAAA,EAAA,GAAM,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EACzD,CAAA,EAAG,CAAC,CAAC,CAAA;AAEL,EAAA,OAAO,CAAC,CAAC,QAAA;AACX;AAdgB,qCAAA,WAAA,EAAA,aAAA,CAAA;AHgEhB;AACA;AIrEO,IAAM,WAAA,kBAAa,qCAAA,CAAC,SAAA,EAAiB,YAAA,EAAA,GAAuC;AACjF,EAAA,MAAM,cAAA,EAAgB,SAAA,CAAU,SAAA,GAAY,OAAA;AAE5C,EAAA,MAAM,WAAA,kBAAa,qCAAA,CAAC,IAAA,EAAY,OAAA,EAAA,GAC9B,IAAI,IAAA,CAAK,cAAA,CAAe,aAAA,EAAe,OAAO,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,EAD1C,YAAA,CAAA;AAGnB,EAAA,MAAM,IAAA,kBAAM,IAAI,IAAA,CAAK,CAAA;AACrB,EAAA,MAAM,KAAA,EAAO,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,SAAA,CAAU,OAAA,CAAQ,CAAA;AAE/C,EAAA,GAAA,CAAI,aAAA,IAAiB,SAAA,EAAW;AAC9B,IAAA,GAAA,CAAI,KAAA,EAAO,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAM,aAAA,EAAe,WAAA;AAAA,IAAA,KAC1C,aAAA,EAAe,UAAA;AAAA,EACtB;AAEA,EAAA,GAAA,CAAI,aAAA,IAAiB,WAAA,EAAa;AAChC,IAAA,MAAM,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAI,CAAA;AACtC,IAAA,MAAM,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,EAAE,CAAA;AACvC,IAAA,MAAM,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,EAAE,CAAA;AACrC,IAAA,MAAM,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,EAAE,CAAA;AAElC,IAAA,GAAA,CAAI,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,EAAA;AACC,IAAA;AACL,IAAA;AACA,IAAA;AACnB,EAAA;AAGgD,EAAA;AACxC,IAAA;AACC,IAAA;AACF,IAAA;AACP,EAAA;AACgD,EAAA;AACxC,IAAA;AACE,IAAA;AACV,EAAA;AAGsB,EAAA;AACf,IAAA;AACe,MAAA;AACf,IAAA;AACe,MAAA;AACf,IAAA;AACO,MAAA;AACZ,IAAA;AACkB,MAAA;AACpB,EAAA;AA/CwB;AJ6GA;AACA;AKhHJ;AACF,EAAA;AACA,EAAA;AACG,IAAA;AACrB,EAAA;AACO,EAAA;AALa;ALwHI;AACA;AMxHH;AAEG;AAAA,EAAA;AAAA,IAAA;AAAA,EAAA;AAChB,EAAA;AACA,EAAA;AAON,EAAA;AAMK,IAAA;AACe,IAAA;AACtB,EAAA;AAEgF,EAAA;AAC3D,IAAA;AACG,IAAA;AACxB,EAAA;AAEqC,EAAA;AACvB,IAAA;AACd,EAAA;AAEuC,EAAA;AAChB,IAAA;AAEsB,IAAA;AACzC,MAAA;AACF,IAAA;AAEqB,IAAA;AACvB,EAAA;AACF;AAEgC;AAQT,EAAA;AACG,EAAA;AACJ,EAAA;AACtB;AAXgB;AAaA;AAQO,EAAA;AACG,EAAA;AACJ,EAAA;AACtB;AAXgB;ANyGU;AACA;AOjKR;AAEgB;AACnB,EAAA;AACE,EAAA;AACI,EAAA;AACpB;APkKyB;AACA;AQzKR;AAEgBA;AACnB,EAAA;AACE,EAAA;AAChB;AR0KyB;AACA;ASzInB;AAAwB,EAAA;AAAA,IAAA;AAAA,EAAA;AACL,EAAA;AACX,IAAA;AACK,IAAA;AACK,IAAA;AACvB,EAAA;AAAA;AAAA;AAAA;AAME,EAAA;AAIkB,IAAA;AAGE,IAAA;AACL,IAAA;AAGA,IAAA;AACC,MAAA;AACI,QAAA;AAClB,MAAA;AACD,IAAA;AAEkB,IAAA;AACH,MAAA;AACK,QAAA;AACnB,MAAA;AACD,IAAA;AAEgC,IAAA;AAC3B,IAAA;AAGK,IAAA;AACO,MAAA;AAGE,MAAA;AACD,MAAA;AAEF,MAAA;AAEP,QAAA;AACD,UAAA;AACC,UAAA;AACM,UAAA;AACF,UAAA;AACV,QAAA;AACgB,QAAA;AACX,MAAA;AAEQ,QAAA;AACK,UAAA;AAClB,QAAA;AAES,QAAA;AAED,UAAA;AACD,YAAA;AACO,YAAA;AACZ,UAAA;AACgB,UAAA;AACX,QAAA;AAEC,UAAA;AACA,UAAA;AACD,YAAA;AACO,YAAA;AACV,YAAA;AACQ,YAAA;AACR,YAAA;AACF,UAAA;AACgB,UAAA;AAClB,QAAA;AACF,MAAA;AACF,IAAA;AAGW,IAAA;AACO,MAAA;AAGD,MAAA;AAGK,MAAA;AACU,MAAA;AACzB,QAAA;AACC,QAAA;AACM,QAAA;AACO,QAAA;AACnB,MAAA;AACgB,MAAA;AAClB,IAAA;AAGM,IAAA;AAEC,IAAA;AACG,MAAA;AACI,MAAA;AACd,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAK8B,EAAA;AAER,IAAA;AACX,MAAA;AACT,IAAA;AAGoB,IAAA;AACX,MAAA;AACT,IAAA;AAGY,IAAA;AACU,MAAA;AACX,QAAA;AACT,MAAA;AACF,IAAA;AAGkB,IAAA;AACA,IAAA;AAEJ,IAAA;AACL,MAAA;AACT,IAAA;AAEoB,IAAA;AACR,MAAA;AACD,QAAA;AACT,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAKoC,EAAA;AACf,IAAA;AAEC,IAAA;AAEA,IAAA;AAEA,IAAA;AAEE,IAAA;AAEA,IAAA;AACA,MAAA;AACA,MAAA;AACR,QAAA;AACZ,MAAA;AACO,MAAA;AACT,IAAA;AAEqB,IAAA;AACA,IAAA;AAEA,IAAA;AAEH,IAAA;AACI,MAAA;AACA,MAAA;AACtB,IAAA;AAEO,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAME,EAAA;AAKM,IAAA;AACe,IAAA;AAEN,IAAA;AACC,MAAA;AACM,QAAA;AACpB,MAAA;AACD,IAAA;AAEkB,IAAA;AACH,MAAA;AACK,QAAA;AACnB,MAAA;AACD,IAAA;AAEiB,IAAA;AACF,MAAA;AACA,MAAA;AAEI,MAAA;AAGL,MAAA;AACA,MAAA;AAEC,MAAA;AACf,IAAA;AACH,EAAA;AAAA;AAAA;AAAA;AAKe,EAAA;AACK,IAAA;AAEC,IAAA;AACA,IAAA;AAEE,IAAA;AACC,IAAA;AAGJ,IAAA;AACI,IAAA;AAEA,IAAA;AACxB,EAAA;AAAA;AAAA;AAAA;AAKe,EAAA;AACM,IAAA;AAGX,IAAA;AACc,MAAA;AACJ,QAAA;AACd,MAAA;AACO,MAAA;AAED,IAAA;AACZ,EAAA;AAAA;AAAA;AAAA;AAKe,EAAA;AACQ,IAAA;AAIA,IAAA;AACJ,MAAA;AACjB,IAAA;AAEqB,IAAA;AACJ,MAAA;AACjB,IAAA;AAEqB,IAAA;AACH,MAAA;AACR,QAAA;AACS,QAAA;AACE,UAAA;AAAI;AACJ,UAAA;AAAI;AACL,UAAA;AAAS;AACzB,QAAA;AACF,MAAA;AACF,IAAA;AAEmB,IAAA;AACrB,EAAA;AAAA;AAAA;AAAA;AAKO,EAAA;AACgB,IAAA;AACA,IAAA;AAEC,IAAA;AACH,IAAA;AAEd,MAAA;AAGO,QAAA;AACA,QAAA;AACY,QAAA;AACR,QAAA;AACA,QAAA;AACV,MAAA;AACN,IAAA;AACc,IAAA;AAET,MAAA;AAGO,QAAA;AACA,QAAA;AACY,QAAA;AACR,QAAA;AACA,QAAA;AACV,MAAA;AACN,IAAA;AAEsB,IAAA;AACxB,EAAA;AAAA;AAAA;AAAA;AAKwC,EAAA;AACjB,IAAA;AACA,IAAA;AAEF,IAAA;AAGb,IAAA;AAEsB,IAAA;AACZ,IAAA;AAEI,IAAA;AACL,MAAA;AACM,MAAA;AAEA,MAAA;AACZ,QAAA;AACS,UAAA;AACJ,YAAA;AACK,YAAA;AACA,YAAA;AACD,YAAA;AACA,YAAA;AACX,UAAA;AAGI,UAAA;AACS,YAAA;AACJ,cAAA;AACA,cAAA;AACK,cAAA;AACD,cAAA;AACA,cAAA;AACX,YAAA;AACH,UAAA;AACA,UAAA;AAEG,QAAA;AAEe,UAAA;AAEV,YAAA;AACA,YAAA;AAEF,YAAA;AAEI,cAAA;AAGM,cAAA;AACJ,gBAAA;AACA,gBAAA;AACE,gBAAA;AACE,gBAAA;AACA,gBAAA;AACX,cAAA;AAGW,cAAA;AACJ,gBAAA;AACA,gBAAA;AACE,gBAAA;AACE,gBAAA;AACA,gBAAA;AACX,cAAA;AAGD,cAAA;AAGQ,cAAA;AACC,gBAAA;AACC,kBAAA;AACA,kBAAA;AACE,kBAAA;AACR,kBAAA;AACA,kBAAA;AACD,gBAAA;AACH,cAAA;AACK,YAAA;AAEO,cAAA;AACJ,gBAAA;AACA,gBAAA;AACE,gBAAA;AACE,gBAAA;AACA,gBAAA;AACX,cAAA;AAGI,cAAA;AACI,gBAAA;AACC,kBAAA;AACA,kBAAA;AACE,kBAAA;AACR,kBAAA;AACA,kBAAA;AACD,gBAAA;AACH,cAAA;AACF,YAAA;AACK,UAAA;AAEC,YAAA;AACA,YAAA;AAGF,YAAA;AAEI,cAAA;AAGM,cAAA;AACJ,gBAAA;AACA,gBAAA;AACE,gBAAA;AACE,gBAAA;AACA,gBAAA;AACX,cAAA;AAGW,cAAA;AACJ,gBAAA;AACA,gBAAA;AACE,gBAAA;AACE,gBAAA;AACA,gBAAA;AACX,cAAA;AAGD,cAAA;AAGQ,cAAA;AACC,gBAAA;AACC,kBAAA;AACA,kBAAA;AACE,kBAAA;AACR,kBAAA;AACA,kBAAA;AACD,gBAAA;AACH,cAAA;AACK,YAAA;AAEO,cAAA;AACJ,gBAAA;AACA,gBAAA;AACE,gBAAA;AACE,gBAAA;AACA,gBAAA;AACX,cAAA;AAGI,cAAA;AACI,gBAAA;AACC,kBAAA;AACA,kBAAA;AACE,kBAAA;AACR,kBAAA;AACA,kBAAA;AACD,gBAAA;AACH,cAAA;AACF,YAAA;AACF,UAAA;AACA,UAAA;AAEG,QAAA;AAEe,UAAA;AAEV,YAAA;AACA,YAAA;AAGD,YAAA;AAES,cAAA;AACJ,gBAAA;AACA,gBAAA;AACE,gBAAA;AACE,gBAAA;AACA,gBAAA;AACX,cAAA;AAGI,cAAA;AACI,gBAAA;AACC,kBAAA;AACA,kBAAA;AACE,kBAAA;AACR,kBAAA;AACA,kBAAA;AACD,gBAAA;AACH,cAAA;AACF,YAAA;AACK,UAAA;AAEC,YAAA;AACA,YAAA;AAGD,YAAA;AACS,cAAA;AACJ,gBAAA;AACA,gBAAA;AACE,gBAAA;AACE,gBAAA;AACA,gBAAA;AACX,cAAA;AAGI,cAAA;AACI,gBAAA;AACC,kBAAA;AACA,kBAAA;AACE,kBAAA;AACR,kBAAA;AACA,kBAAA;AACD,gBAAA;AACH,cAAA;AACF,YAAA;AACF,UAAA;AACA,UAAA;AACJ,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAAA;AAIkH,EAAA;AAC5F,IAAA;AACJ,MAAA;AAChB,IAAA;AACoB,IAAA;AACJ,MAAA;AAChB,IAAA;AAGgB,IAAA;AACJ,IAAA;AACd,EAAA;AAAA;AAAA;AAAA;AAKe,EAAA;AACD,IAAA;AACA,IAAA;AACsB,IAAA;AAKb,IAAA;AACA,IAAA;AAGA,IAAA;AACH,MAAA;AACG,QAAA;AACD,UAAA;AACT,QAAA;AAGH,UAAA;AACa,YAAA;AAAA;AACA,YAAA;AAAA;AACG,YAAA;AAAC;AACjB,UAAA;AACJ,QAAA;AACF,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAME,EAAA;AAIuG,IAAA;AAC7F,IAAA;AACA,IAAA;AAEU,IAAA;AACD,MAAA;AAEE,QAAA;AACjB,QAAA;AACA,QAAA;AACK,MAAA;AAEC,QAAA;AACA,QAAA;AACA,QAAA;AAEU,QAAA;AAGA,QAAA;AAEC,UAAA;AACf,UAAA;AACS,QAAA;AAEM,UAAA;AACf,UAAA;AACS,QAAA;AAEA,UAAA;AAEA,YAAA;AACA,YAAA;AACP,YAAA;AACA,YAAA;AACK,UAAA;AAEE,YAAA;AACP,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOe,EAAA;AAGG,IAAA;AACR,IAAA;AAES,IAAA;AACC,MAAA;AAEJ,MAAA;AACE,QAAA;AACZ,QAAA;AACA,QAAA;AACF,MAAA;AAGM,MAAA;AACE,MAAA;AAGS,MAAA;AACA,QAAA;AACf,QAAA;AACF,MAAA;AAEmB,MAAA;AAEL,QAAA;AACZ,QAAA;AACA,QAAA;AACF,MAAA;AAGM,MAAA;AACJ,QAAA;AACF,MAAA;AAEI,MAAA;AAEI,QAAA;AACA,QAAA;AAEW,QAAA;AACH,UAAA;AACJ,YAAA;AACC,YAAA;AACO,YAAA;AACf,UAAA;AACH,QAAA;AAEkB,QAAA;AACJ,UAAA;AACJ,YAAA;AACC,YAAA;AACO,YAAA;AACf,UAAA;AACH,QAAA;AACK,MAAA;AAEU,QAAA;AACjB,MAAA;AAEI,MAAA;AACN,IAAA;AAEO,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAKe,EAAA;AAEM,IAAA;AACA,IAAA;AAIE,IAAA;AACvB,EAAA;AAAA;AAAA;AAAA;AAK+B,EAAA;AAER,IAAA;AAGD,IAAA;AACA,IAAA;AAGE,IAAA;AACb,MAAA;AACT,IAAA;AAImB,IAAA;AACA,IAAA;AAEA,IAAA;AAEV,MAAA;AACT,IAAA;AAGsB,IAAA;AACH,IAAA;AAEC,IAAA;AACtB,EAAA;AACF;AT/D0B;AACA;AU7uBb;AAA8B,EAAA;AAAA,IAAA;AAAA,EAAA;AAEvC,EAAA;AAMI,IAAA;AACgB,MAAA;AACpB,IAAA;AACsB,IAAA;AACxB,EAAA;AAEe,EAAA;AAKS,IAAA;AACd,MAAA;AAEW,MAAA;AACF,QAAA;AACA,QAAA;AACf,MAAA;AAEiB,MAAA;AACF,QAAA;AACR,UAAA;AACO,UAAA;AACA,UAAA;AACV,QAAA;AACJ,MAAA;AAEiB,MAAA;AACF,QAAA;AACE,UAAA;AACb,UAAA;AACA,UAAA;AACF,QAAA;AACF,MAAA;AAEO,MAAA;AACR,IAAA;AACH,EAAA;AAGE,EAAA;AAIU,IAAA;AACI,MAAA;AACd,IAAA;AAEU,IAAA;AACI,MAAA;AACd,IAAA;AAEgC,IAAA;AACd,MAAA;AACa,MAAA;AACjB,MAAA;AACG,MAAA;AACC,MAAA;AACT,QAAA;AACP,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAEe,EAAA;AAKM,IAAA;AACV,MAAA;AACW,QAAA;AACH,QAAA;AACA,QAAA;AACE,QAAA;AACC,QAAA;AACT,UAAA;AACP,QAAA;AACF,MAAA;AACF,IAAA;AAEsB,IAAA;AACA,IAAA;AAEF,IAAA;AAEV,IAAA;AACW,MAAA;AACV,QAAA;AACW,UAAA;AACV,UAAA;AACE,UAAA;AACE,UAAA;AACC,UAAA;AACb,QAAA;AACU,MAAA;AACQ,QAAA;AACb,UAAA;AACU,UAAA;AACb,QAAA;AAEW,QAAA;AACL,UAAA;AACG,UAAA;AACV,QAAA;AACH,MAAA;AACe,IAAA;AACI,MAAA;AACV,QAAA;AACW,UAAA;AACV,UAAA;AACE,UAAA;AACE,UAAA;AACC,UAAA;AACb,QAAA;AACU,MAAA;AACQ,QAAA;AACb,UAAA;AACU,UAAA;AACb,QAAA;AAEW,QAAA;AACL,UAAA;AACG,UAAA;AACV,QAAA;AACH,MAAA;AACF,IAAA;AAEgC,IAAA;AACd,MAAA;AACa,MAAA;AACjB,MAAA;AACZ,MAAA;AACgB,MAAA;AACT,QAAA;AACP,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAEe,EAAA;AAKS,IAAA;AACb,MAAA;AACW,QAAA;AACH,QAAA;AACA,QAAA;AACE,QAAA;AACJ,QAAA;AACb,MAAA;AACF,IAAA;AAEqB,IAAA;AAEd,IAAA;AACW,MAAA;AACa,MAAA;AAChB,MAAA;AACE,MAAA;AAEP,MAAA;AACV,IAAA;AACF,EAAA;AAEe,EAAA;AACW,IAAA;AAEJ,IAAA;AACD,MAAA;AAEX,MAAA;AAEc,MAAA;AACH,MAAA;AACG,QAAA;AACA,UAAA;AACX,QAAA;AACQ,UAAA;AACf,QAAA;AACF,MAAA;AACF,IAAA;AAEM,IAAA;AAEC,IAAA;AACT,EAAA;AAE6B,EAAA;AACV,IAAA;AAEO,IAAA;AAEJ,IAAA;AACF,MAAA;AAEJ,MAAA;AACO,QAAA;AAIf,QAAA;AAIA,UAAA;AACF,QAAA;AACF,MAAA;AAEY,MAAA;AACO,QAAA;AAEJ,QAAA;AAEG,QAAA;AACD,UAAA;AACL,YAAA;AACA,YAAA;AACG,YAAA;AACV,UAAA;AACH,QAAA;AAEA,QAAA;AACF,MAAA;AAEoB,MAAA;AACtB,IAAA;AAEO,IAAA;AACT,EAAA;AAEe,EAAA;AACO,IAAA;AAEJ,IAAA;AACP,MAAA;AACT,IAAA;AAEa,IAAA;AACM,MAAA;AAEJ,MAAA;AACJ,QAAA;AACT,MAAA;AAEa,MAAA;AACX,QAAA;AACF,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAEe,EAAA;AACI,IAAA;AACV,MAAA;AACU,QAAA;AACJ,UAAA;AACC,YAAA;AACA,YAAA;AACG,YAAA;AACX,UAAA;AACS,QAAA;AACF,UAAA;AACF,QAAA;AACQ,UAAA;AACJ,YAAA;AACC,cAAA;AACA,cAAA;AACI,cAAA;AACZ,YAAA;AACK,UAAA;AACC,YAAA;AACE,cAAA;AACA,cAAA;AACI,cAAA;AACZ,YAAA;AAEI,YAAA;AACK,cAAA;AACL,gBAAA;AACA,gBAAA;AACQ,kBAAA;AACC,kBAAA;AACT,gBAAA;AACF,cAAA;AACK,YAAA;AACE,cAAA;AACT,YAAA;AACF,UAAA;AACF,QAAA;AAEG,MAAA;AACU,QAAA;AACJ,UAAA;AACE,QAAA;AACF,UAAA;AACC,YAAA;AACA,YAAA;AACG,YAAA;AACX,UAAA;AACK,QAAA;AACQ,UAAA;AACJ,YAAA;AACC,cAAA;AACA,cAAA;AACI,cAAA;AACZ,YAAA;AACK,UAAA;AACC,YAAA;AACE,cAAA;AACA,cAAA;AACI,cAAA;AACZ,YAAA;AAEI,YAAA;AACK,cAAA;AACL,gBAAA;AACA,gBAAA;AACQ,kBAAA;AACC,kBAAA;AACT,gBAAA;AACF,cAAA;AACK,YAAA;AACE,cAAA;AACT,YAAA;AACF,UAAA;AACF,QAAA;AAEG,MAAA;AACL,MAAA;AACS,QAAA;AACC,UAAA;AACS,UAAA;AACN,UAAA;AACX,QAAA;AACJ,IAAA;AACF,EAAA;AAE6B,EAAA;AACT,IAAA;AAEX,IAAA;AACT,EAAA;AAEO,EAAA;AAQY,IAAA;AACA,IAAA;AACE,IAAA;AACG,IAAA;AACA,IAAA;AACD,IAAA;AAEA,IAAA;AACT,MAAA;AACQ,QAAA;AACd,UAAA;AAEa,UAAA;AACX,YAAA;AACS,UAAA;AACT,YAAA;AACF,UAAA;AAEa,UAAA;AACX,YAAA;AACS,UAAA;AACT,YAAA;AACS,UAAA;AACT,YAAA;AACF,UAAA;AACD,QAAA;AACH,MAAA;AAEoB,MAAA;AACH,QAAA;AACjB,MAAA;AAvBmB,IAAA;AA0BF,IAAA;AAEZ,IAAA;AACL,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AACF;AVspB0B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-JC3WJK65.js","sourcesContent":[null,"import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n if (typeof ref === \"function\") {\n return ref(value);\n }\n\n if (ref !== null && ref !== undefined) {\n ref.current = value;\n }\n}\n\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup === \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n\n // React <19 will log an error to the console if a callback ref returns a\n // value. We don't use ref cleanups internally so this will only happen if a\n // user's ref callback returns a value, which we only expect if they are\n // using the cleanup functionality added in React 19.\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup === \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\n\n/**\n * A custom hook that composes multiple refs\n * Accepts callback refs and RefObject(s)\n */\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return React.useCallback(composeRefs(...refs), refs);\n}\n\nexport { composeRefs, useComposedRefs };\n","\"use client\";\n\nimport * as React from \"react\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined);\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n mql.addEventListener(\"change\", onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n return !!isMobile;\n}\n","type FormatOption = \"date\" | \"time\" | \"dateTime\" | \"timeSince\" | \"default\";\n\nexport const formatDate = (eventDate: Date, formatOption: FormatOption): string => {\n const browserLocale = navigator.language || \"en-US\";\n\n const formatPart = (date: Date, options: Intl.DateTimeFormatOptions): string =>\n new Intl.DateTimeFormat(browserLocale, options).format(date);\n\n const now = new Date();\n const diff = now.getTime() - eventDate.getTime();\n\n if (formatOption === \"default\") {\n if (diff < 24 * 60 * 60 * 1000) formatOption = \"timeSince\";\n else formatOption = \"dateTime\";\n }\n\n if (formatOption === \"timeSince\") {\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days} days ago`;\n if (hours > 0) return `${hours} hours ago`;\n if (minutes > 0) return `${minutes} minutes ago`;\n return `${seconds} seconds ago`;\n }\n\n // Define formatting options\n const dateOptions: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n };\n const timeOptions: Intl.DateTimeFormatOptions = {\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n // Format based on the option\n switch (formatOption) {\n case \"date\":\n return formatPart(eventDate, dateOptions);\n case \"time\":\n return formatPart(eventDate, timeOptions);\n case \"dateTime\":\n return `${formatPart(eventDate, dateOptions)} ${formatPart(eventDate, timeOptions)}`;\n default:\n throw new Error(\"Invalid format option\");\n }\n};\n\nexport type { FormatOption };\n","export const exists = <T>(itemOrArray: T | T[] | null | undefined): boolean => {\n if (!itemOrArray) return false;\n if (Array.isArray(itemOrArray)) {\n return itemOrArray.length > 0;\n }\n return true;\n};\n","import { Action, ModuleWithPermissions } from \"../permissions\";\nimport { cloneElement, createElement, Fragment, ReactElement } from \"react\";\n\nexport class TableOptions {\n private _components: ReactElement<any>[];\n private _hasPermissionToModule: <M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }) => boolean;\n\n constructor(\n hasPermissionToModule: <M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }) => boolean,\n ) {\n this._hasPermissionToModule = hasPermissionToModule;\n this._components = [];\n }\n\n addOption<M extends ModuleWithPermissions>(component: ReactElement<any> | null, module?: M, action?: Action): void {\n if (!component || (module && action && !this._hasPermissionToModule({ module, action }))) return;\n this._components.push(component);\n }\n\n getComponents(): ReactElement<any>[] {\n return this._components;\n }\n\n getOptions(): ReactElement<any> | null {\n if (this._components.length === 0) return null;\n\n const response: ReactElement<any>[] = this._components.map((option, index) =>\n cloneElement(option, { key: option.key ?? index }),\n );\n\n return createElement(Fragment, {}, response);\n }\n}\n\nexport function getTableOptions(params: {\n hasPermissionToModule: <M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }) => boolean;\n options: { component: ReactElement<any> | null; module?: ModuleWithPermissions; action?: Action }[];\n}): ReactElement<any> | null {\n const tableOptions = new TableOptions(params.hasPermissionToModule);\n params.options.forEach((option) => tableOptions.addOption(option.component, option.module, option.action));\n return tableOptions.getOptions();\n}\n\nexport function getTableComponents(params: {\n hasPermissionToModule: <M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }) => boolean;\n options: { component: ReactElement<any> | null; module?: ModuleWithPermissions; action?: Action }[];\n}): ReactElement<any>[] {\n const tableOptions = new TableOptions(params.hasPermissionToModule);\n params.options.forEach((option) => tableOptions.addOption(option.component, option.module, option.action));\n return tableOptions.getComponents();\n}\n","import { z } from \"zod\";\n\nexport const userObjectSchema = z.object({\n id: z.string(),\n name: z.string(),\n avatar: z.string().optional(),\n});\n\nexport type UserObject = z.infer<typeof userObjectSchema>;\n","import { z } from \"zod\";\n\nexport const entityObjectSchema = z.object({\n id: z.uuidv4(),\n name: z.string(),\n});\n\nexport type EntityObject = z.infer<typeof entityObjectSchema>;\n","import { PartialBlock } from \"@blocknote/core\";\n\nexport interface WordDiff {\n type: \"added\" | \"removed\" | \"unchanged\";\n text: string;\n diffId: string;\n accepted?: boolean;\n rejected?: boolean;\n}\n\nexport interface DiffBlock {\n id?: string;\n type?: string;\n props?: any;\n content?: any;\n children?: DiffBlock[];\n diffType?: \"added\" | \"removed\" | \"modified\" | \"unchanged\";\n originalContent?: any;\n diffId?: string;\n wordDiffs?: WordDiff[];\n accepted?: boolean;\n rejected?: boolean;\n}\n\nexport interface DiffResult {\n blocks: DiffBlock[];\n hasChanges: boolean;\n}\n\nexport interface BlockDiffOptions {\n ignoreIds?: boolean;\n compareContent?: boolean;\n similarityThreshold?: number;\n}\n\n/**\n * BlockNote Diff Utility\n * Implements a sophisticated diff algorithm for BlockNote document structures\n */\nexport class BlockNoteDiffUtil {\n private static readonly DEFAULT_OPTIONS: BlockDiffOptions = {\n ignoreIds: false,\n compareContent: true,\n similarityThreshold: 0.8,\n };\n\n /**\n * Compare two BlockNote documents and return diff result\n */\n static diff(\n originalBlocks: PartialBlock[] = [],\n newBlocks: PartialBlock[] = [],\n options: BlockDiffOptions = {},\n ): DiffResult {\n const opts = { ...this.DEFAULT_OPTIONS, ...options };\n\n // Create a map for efficient lookups\n const originalMap = new Map<string, PartialBlock>();\n const newMap = new Map<string, PartialBlock>();\n\n // Build maps based on block IDs\n originalBlocks.forEach((block) => {\n if (block.id) {\n originalMap.set(block.id, block);\n }\n });\n\n newBlocks.forEach((block) => {\n if (block.id) {\n newMap.set(block.id, block);\n }\n });\n\n const diffBlocks: DiffBlock[] = [];\n const processedNewIds = new Set<string>();\n\n // Process original blocks to find removed and modified blocks\n for (const originalBlock of originalBlocks) {\n const blockId = originalBlock.id;\n\n // Generate ID if missing\n const processId = blockId || crypto.randomUUID();\n const newBlock = blockId ? newMap.get(blockId) : null;\n\n if (!newBlock) {\n // Block was removed\n const removedBlock: DiffBlock = {\n ...originalBlock,\n id: processId,\n diffType: \"removed\",\n diffId: `removed-${processId}`,\n };\n diffBlocks.push(removedBlock);\n } else {\n // Block exists in both, check for modifications\n if (blockId) {\n processedNewIds.add(blockId);\n }\n\n if (this.areBlocksEqual(originalBlock, newBlock, opts)) {\n // Block is unchanged\n const unchangedBlock: DiffBlock = {\n ...newBlock,\n diffType: \"unchanged\",\n };\n diffBlocks.push(unchangedBlock);\n } else {\n // Block was modified - perform word-level diff\n const wordDiffs = this.generateWordDiffs(originalBlock.content, newBlock.content, processId);\n const modifiedBlock: DiffBlock = {\n ...newBlock,\n diffType: \"modified\",\n originalContent: originalBlock.content as any,\n diffId: `modified-${processId}`,\n wordDiffs: wordDiffs,\n };\n diffBlocks.push(modifiedBlock);\n }\n }\n }\n\n // Process new blocks to find added blocks\n for (const newBlock of newBlocks) {\n const blockId = newBlock.id;\n\n // Skip if block was already processed (has ID and was found in original)\n if (blockId && processedNewIds.has(blockId)) continue;\n\n // This is a new block (either no ID or ID not found in original)\n const generatedId = blockId || crypto.randomUUID();\n const addedBlock: DiffBlock = {\n ...newBlock,\n id: generatedId,\n diffType: \"added\",\n diffId: `added-${generatedId}`,\n };\n diffBlocks.push(addedBlock);\n }\n\n // Sort blocks to maintain original order as much as possible\n const sortedDiffBlocks = this.sortDiffBlocks(diffBlocks, originalBlocks, newBlocks);\n\n return {\n blocks: sortedDiffBlocks,\n hasChanges: sortedDiffBlocks.some((block) => block.diffType !== \"unchanged\"),\n };\n }\n\n /**\n * Compare two blocks for equality\n */\n private static areBlocksEqual(block1: PartialBlock, block2: PartialBlock, options: BlockDiffOptions): boolean {\n // Compare block type\n if (block1.type !== block2.type) {\n return false;\n }\n\n // Compare props (excluding diffType specific props)\n if (!this.deepEqual(block1.props, block2.props)) {\n return false;\n }\n\n // Compare content if enabled\n if (options.compareContent) {\n if (!this.deepEqual(block1.content, block2.content)) {\n return false;\n }\n }\n\n // Compare children recursively\n const children1 = block1.children || [];\n const children2 = block2.children || [];\n\n if (children1.length !== children2.length) {\n return false;\n }\n\n for (let i = 0; i < children1.length; i++) {\n if (!this.areBlocksEqual(children1[i], children2[i], options)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Deep equality comparison for objects\n */\n private static deepEqual(obj1: any, obj2: any): boolean {\n if (obj1 === obj2) return true;\n\n if (obj1 == null || obj2 == null) return obj1 === obj2;\n\n if (typeof obj1 !== typeof obj2) return false;\n\n if (typeof obj1 !== \"object\") return obj1 === obj2;\n\n if (Array.isArray(obj1) !== Array.isArray(obj2)) return false;\n\n if (Array.isArray(obj1)) {\n if (obj1.length !== obj2.length) return false;\n for (let i = 0; i < obj1.length; i++) {\n if (!this.deepEqual(obj1[i], obj2[i])) return false;\n }\n return true;\n }\n\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n\n if (keys1.length !== keys2.length) return false;\n\n for (const key of keys1) {\n if (!keys2.includes(key)) return false;\n if (!this.deepEqual(obj1[key], obj2[key])) return false;\n }\n\n return true;\n }\n\n /**\n * Sort diff blocks to maintain logical order\n */\n private static sortDiffBlocks(\n diffBlocks: DiffBlock[],\n originalBlocks: PartialBlock[],\n newBlocks: PartialBlock[],\n ): DiffBlock[] {\n // Create position maps\n const originalPositions = new Map<string, number>();\n const newPositions = new Map<string, number>();\n\n originalBlocks.forEach((block, index) => {\n if (block.id) {\n originalPositions.set(block.id, index);\n }\n });\n\n newBlocks.forEach((block, index) => {\n if (block.id) {\n newPositions.set(block.id, index);\n }\n });\n\n return diffBlocks.sort((a, b) => {\n const aId = a.id;\n const bId = b.id;\n\n if (!aId || !bId) return 0;\n\n // Prioritize by new positions, fallback to original positions\n const aPos = newPositions.get(aId) ?? originalPositions.get(aId) ?? Infinity;\n const bPos = newPositions.get(bId) ?? originalPositions.get(bId) ?? Infinity;\n\n return aPos - bPos;\n });\n }\n\n /**\n * Calculate similarity between two text contents\n */\n private static calculateSimilarity(content1: any[], content2: any[]): number {\n if (!content1 || !content2) return 0;\n\n const text1 = this.extractTextFromContent(content1);\n const text2 = this.extractTextFromContent(content2);\n\n if (text1 === text2) return 1;\n if (!text1 || !text2) return 0;\n\n // Simple Levenshtein distance-based similarity\n const maxLength = Math.max(text1.length, text2.length);\n const distance = this.levenshteinDistance(text1, text2);\n\n return 1 - distance / maxLength;\n }\n\n /**\n * Extract plain text from BlockNote content array\n */\n private static extractTextFromContent(content: any[]): string {\n if (!Array.isArray(content)) return \"\";\n\n return content\n .map((item) => {\n if (item.type === \"text\") {\n return item.text || \"\";\n }\n return \"\";\n })\n .join(\"\");\n }\n\n /**\n * Calculate Levenshtein distance between two strings\n */\n private static levenshteinDistance(str1: string, str2: string): number {\n const matrix = Array(str2.length + 1)\n .fill(null)\n .map(() => Array(str1.length + 1).fill(null));\n\n for (let i = 0; i <= str1.length; i++) {\n matrix[0][i] = i;\n }\n\n for (let j = 0; j <= str2.length; j++) {\n matrix[j][0] = j;\n }\n\n for (let j = 1; j <= str2.length; j++) {\n for (let i = 1; i <= str1.length; i++) {\n const substitutionCost = str1[i - 1] === str2[j - 1] ? 0 : 1;\n matrix[j][i] = Math.min(\n matrix[j][i - 1] + 1, // deletion\n matrix[j - 1][i] + 1, // insertion\n matrix[j - 1][i - 1] + substitutionCost, // substitution\n );\n }\n }\n\n return matrix[str2.length][str1.length];\n }\n\n /**\n * Generate word-level diffs between two content arrays\n */\n static generateWordDiffs(originalContent: any, newContent: any, blockId: string): WordDiff[] {\n const originalText = this.extractTextFromContent(originalContent || []);\n const newText = this.extractTextFromContent(newContent || []);\n\n if (!originalText && !newText) return [];\n if (!originalText) {\n return newText\n .split(/\\s+/)\n .filter((word) => word.trim())\n .map((word, index) => ({\n type: \"added\" as const,\n text: word,\n diffId: `${blockId}-add-${index}`,\n accepted: false,\n rejected: false,\n }));\n }\n if (!newText) {\n return originalText\n .split(/\\s+/)\n .filter((word) => word.trim())\n .map((word, index) => ({\n type: \"removed\" as const,\n text: word,\n diffId: `${blockId}-remove-${index}`,\n accepted: false,\n rejected: false,\n }));\n }\n\n return this.diffWords(originalText, newText, blockId);\n }\n\n /**\n * Perform word-level diff using word-only approach (no space tokenization)\n */\n private static diffWords(text1: string, text2: string, blockId: string): WordDiff[] {\n const words1 = text1.split(/\\s+/).filter((word) => word.length > 0);\n const words2 = text2.split(/\\s+/).filter((word) => word.length > 0);\n\n const diffs = this.myersDiff(words1, words2);\n\n // Consolidate adjacent changes to reduce fragmentation\n const consolidatedDiffs = this.consolidateAdjacentChanges(diffs);\n\n const result: WordDiff[] = [];\n let diffIndex = 0;\n\n for (let i = 0; i < consolidatedDiffs.length; i++) {\n const diff = consolidatedDiffs[i];\n const isLastDiff = i === consolidatedDiffs.length - 1;\n\n switch (diff.type) {\n case \"equal\":\n result.push({\n type: \"unchanged\",\n text: diff.value,\n diffId: `${blockId}-unchanged-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n\n // Add space after word if not the last diff\n if (!isLastDiff) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n break;\n\n case \"delete\":\n // Check if this is a consolidated change or regular change\n if ((diff as any).consolidated) {\n // This is a consolidated deletion - check if next is consolidated insertion\n const nextDiff = i + 1 < consolidatedDiffs.length ? consolidatedDiffs[i + 1] : null;\n const isConsolidatedReplacement = nextDiff && nextDiff.type === \"insert\" && (nextDiff as any).consolidated;\n\n if (isConsolidatedReplacement) {\n // Use single shared diff ID for the entire consolidated change\n const replacementId = `${blockId}-replace-${diffIndex++}`;\n\n // Add the removed text\n result.push({\n type: \"removed\",\n text: diff.value,\n diffId: replacementId,\n accepted: false,\n rejected: false,\n });\n\n // Add the new text with same diff ID\n result.push({\n type: \"added\",\n text: nextDiff.value,\n diffId: replacementId,\n accepted: false,\n rejected: false,\n });\n\n // Skip the next insert since we handled it\n i++;\n\n // Add space after replacement if not the last\n if (i < consolidatedDiffs.length - 1) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n } else {\n // Consolidated deletion without replacement\n result.push({\n type: \"removed\",\n text: diff.value,\n diffId: `${blockId}-remove-${diffIndex++}`,\n accepted: false,\n rejected: false,\n });\n\n // Add space after deletion if not the last\n if (!isLastDiff) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n }\n } else {\n // Regular single-word processing\n const nextDiff = i + 1 < consolidatedDiffs.length ? consolidatedDiffs[i + 1] : null;\n const isReplacement =\n nextDiff && nextDiff.type === \"insert\" && this.areWordsSimilar(diff.value, nextDiff.value);\n\n if (isReplacement) {\n // Use single shared diff ID for both operations\n const replacementId = `${blockId}-replace-${diffIndex++}`;\n\n // Add the removed word\n result.push({\n type: \"removed\",\n text: diff.value,\n diffId: replacementId,\n accepted: false,\n rejected: false,\n });\n\n // Add the new word with same diff ID (no space between them)\n result.push({\n type: \"added\",\n text: nextDiff.value,\n diffId: replacementId,\n accepted: false,\n rejected: false,\n });\n\n // Skip the next insert since we handled it\n i++;\n\n // Add space after replacement if not the last\n if (i < consolidatedDiffs.length - 1) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n } else {\n // Regular deletion\n result.push({\n type: \"removed\",\n text: diff.value,\n diffId: `${blockId}-remove-${diffIndex++}`,\n accepted: false,\n rejected: false,\n });\n\n // Add space after deletion if not the last\n if (!isLastDiff) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n }\n }\n break;\n\n case \"insert\":\n // Only handle if not already processed as part of replacement or consolidation\n if ((diff as any).consolidated) {\n // This should have been handled in the delete case above\n const prevDiff = i > 0 ? consolidatedDiffs[i - 1] : null;\n const wasProcessedAsConsolidatedReplacement =\n prevDiff && prevDiff.type === \"delete\" && (prevDiff as any).consolidated;\n\n if (!wasProcessedAsConsolidatedReplacement) {\n // Standalone consolidated insertion\n result.push({\n type: \"added\",\n text: diff.value,\n diffId: `${blockId}-add-${diffIndex++}`,\n accepted: false,\n rejected: false,\n });\n\n // Add space after insertion if not the last\n if (!isLastDiff) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n }\n } else {\n // Regular single-word processing\n const prevDiff = i > 0 ? consolidatedDiffs[i - 1] : null;\n const wasProcessedAsReplacement =\n prevDiff && prevDiff.type === \"delete\" && this.areWordsSimilar(prevDiff.value, diff.value);\n\n if (!wasProcessedAsReplacement) {\n result.push({\n type: \"added\",\n text: diff.value,\n diffId: `${blockId}-add-${diffIndex++}`,\n accepted: false,\n rejected: false,\n });\n\n // Add space after insertion if not the last\n if (!isLastDiff) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n }\n }\n break;\n }\n }\n\n return result;\n } /**\n * Improved diff algorithm that better handles word insertions\n * Uses a combination of LCS and heuristics to minimize false changes\n */\n private static myersDiff(a: string[], b: string[]): Array<{ type: \"equal\" | \"delete\" | \"insert\"; value: string }> {\n if (a.length === 0) {\n return b.map((value) => ({ type: \"insert\" as const, value }));\n }\n if (b.length === 0) {\n return a.map((value) => ({ type: \"delete\" as const, value }));\n }\n\n // Use dynamic programming for optimal diff\n const dp = this.computeEditScript(a, b);\n return this.reconstructDiff(a, b, dp);\n }\n\n /**\n * Compute edit script using dynamic programming\n */\n private static computeEditScript(a: string[], b: string[]): number[][] {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array(m + 1)\n .fill(null)\n .map(() => Array(n + 1).fill(0));\n\n // Initialize base cases\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n // Fill the DP table\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (a[i - 1] === b[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1]; // No operation needed\n } else {\n dp[i][j] =\n 1 +\n Math.min(\n dp[i - 1][j], // Delete from a\n dp[i][j - 1], // Insert into a\n dp[i - 1][j - 1], // Replace\n );\n }\n }\n }\n\n return dp;\n }\n\n /**\n * Reconstruct the actual diff from the DP table\n */\n private static reconstructDiff(\n a: string[],\n b: string[],\n dp: number[][],\n ): Array<{ type: \"equal\" | \"delete\" | \"insert\"; value: string; sharedDiffId?: boolean }> {\n const result: Array<{ type: \"equal\" | \"delete\" | \"insert\"; value: string; sharedDiffId?: boolean }> = [];\n let i = a.length;\n let j = b.length;\n\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && a[i - 1] === b[j - 1]) {\n // Equal\n result.unshift({ type: \"equal\", value: a[i - 1] });\n i--;\n j--;\n } else {\n // Determine the best operation with preference for insert/delete over replace\n const deleteCost = i > 0 ? dp[i - 1][j] : Infinity;\n const insertCost = j > 0 ? dp[i][j - 1] : Infinity;\n const replaceCost = i > 0 && j > 0 ? dp[i - 1][j - 1] : Infinity;\n\n const minCost = Math.min(deleteCost, insertCost, replaceCost);\n\n // Prefer insertions and deletions over replacements when costs are equal\n if (minCost === insertCost && j > 0) {\n // Insert\n result.unshift({ type: \"insert\", value: b[j - 1] });\n j--;\n } else if (minCost === deleteCost && i > 0) {\n // Delete\n result.unshift({ type: \"delete\", value: a[i - 1] });\n i--;\n } else if (minCost === replaceCost && i > 0 && j > 0) {\n // Only use replace for similar words, otherwise prefer separate operations\n if (this.areWordsSimilar(a[i - 1], b[j - 1])) {\n // Similar words - treat as replacement with shared diffId\n result.unshift({ type: \"insert\", value: b[j - 1], sharedDiffId: true });\n result.unshift({ type: \"delete\", value: a[i - 1], sharedDiffId: true });\n i--;\n j--;\n } else {\n // Different words - prefer insert over delete when costs are equal\n result.unshift({ type: \"insert\", value: b[j - 1] });\n j--;\n }\n }\n }\n }\n\n return result;\n }\n\n /**\n * Consolidate adjacent changes to reduce fragmentation\n * e.g., if we have: delete \"Key\", insert \"Key!\", delete \"Challenges\"\n * We can consolidate this into: replace [\"Key\", \"Challenges\"] with [\"Key!\"]\n */\n private static consolidateAdjacentChanges(\n diffs: Array<{ type: \"equal\" | \"delete\" | \"insert\"; value: string }>,\n ): Array<{ type: \"equal\" | \"delete\" | \"insert\"; value: string; consolidated?: boolean }> {\n const result = [];\n let i = 0;\n\n while (i < diffs.length) {\n const current = diffs[i];\n\n if (current.type === \"equal\") {\n result.push(current);\n i++;\n continue;\n }\n\n // Look for patterns of adjacent changes that can be consolidated\n const changeSequence = [];\n let j = i;\n\n // Collect adjacent non-equal changes\n while (j < diffs.length && diffs[j].type !== \"equal\") {\n changeSequence.push(diffs[j]);\n j++;\n }\n\n if (changeSequence.length <= 1) {\n // Single change, no consolidation needed\n result.push(current);\n i++;\n continue;\n }\n\n // Check if we should consolidate this sequence\n const shouldConsolidate = this.shouldConsolidateChanges(\n changeSequence as Array<{ type: \"delete\" | \"insert\"; value: string }>,\n );\n\n if (shouldConsolidate) {\n // Create consolidated changes\n const deletedWords = changeSequence.filter((c) => c.type === \"delete\").map((c) => c.value);\n const insertedWords = changeSequence.filter((c) => c.type === \"insert\").map((c) => c.value);\n\n if (deletedWords.length > 0) {\n result.push({\n type: \"delete\" as const,\n value: deletedWords.join(\" \"),\n consolidated: true,\n });\n }\n\n if (insertedWords.length > 0) {\n result.push({\n type: \"insert\" as const,\n value: insertedWords.join(\" \"),\n consolidated: true,\n });\n }\n } else {\n // Don't consolidate, add individual changes\n changeSequence.forEach((change) => result.push(change));\n }\n\n i = j;\n }\n\n return result;\n }\n\n /**\n * Determine if a sequence of changes should be consolidated\n */\n private static shouldConsolidateChanges(changes: Array<{ type: \"delete\" | \"insert\"; value: string }>): boolean {\n // Consolidate if we have both deletions and insertions in the same sequence\n const hasDeletes = changes.some((c) => c.type === \"delete\");\n const hasInserts = changes.some((c) => c.type === \"insert\");\n\n // Only consolidate if we have both types of changes (replacements/modifications)\n // Pure additions or pure deletions are fine as separate changes\n return hasDeletes && hasInserts;\n }\n\n /**\n * Check if two words are similar enough to be considered a replacement\n */\n private static areWordsSimilar(word1: string, word2: string): boolean {\n // If words are exactly the same, they're similar\n if (word1 === word2) return true;\n\n // Consider words similar if they share more than 70% of their characters\n const maxLen = Math.max(word1.length, word2.length);\n const minLen = Math.min(word1.length, word2.length);\n\n // If one word is much longer than the other, they're not similar\n if (maxLen > minLen * 2) {\n return false;\n }\n\n // Special case: if one word is just the other plus punctuation, treat as separate changes\n // e.g., \"Key\" and \"Key!\" should not be considered similar for replacement\n const word1Clean = word1.replace(/[^\\w]/g, \"\");\n const word2Clean = word2.replace(/[^\\w]/g, \"\");\n\n if (word1Clean === word2Clean && word1 !== word2) {\n // One word is just the other with added punctuation - don't treat as replacement\n return false;\n }\n\n // Calculate character overlap using Levenshtein distance\n const distance = this.levenshteinDistance(word1, word2);\n const similarity = 1 - distance / maxLen;\n\n return similarity > 0.7; // Increased threshold to be more conservative\n }\n}\n","import { PartialBlock } from \"@blocknote/core\";\nimport { DiffBlock, WordDiff } from \"./blocknote-diff.util\";\n\nexport class BlockNoteWordDiffRendererUtil {\n static renderWordDiffs(\n diffBlocks: DiffBlock[],\n onAcceptChange?: (diffId: string) => void,\n onRejectChange?: (diffId: string) => void,\n acceptedChanges?: Set<string>,\n rejectedChanges?: Set<string>,\n ): PartialBlock[] {\n if (acceptedChanges || rejectedChanges) {\n diffBlocks = this.updateWordDiffStates(diffBlocks, acceptedChanges, rejectedChanges);\n }\n return diffBlocks.map((block) => this.renderDiffBlock(block, onAcceptChange, onRejectChange));\n }\n\n private static updateWordDiffStates(\n diffBlocks: DiffBlock[],\n acceptedChanges?: Set<string>,\n rejectedChanges?: Set<string>,\n ): DiffBlock[] {\n return diffBlocks.map((block) => {\n const updatedBlock = { ...block };\n\n if (updatedBlock.diffId) {\n updatedBlock.accepted = acceptedChanges?.has(updatedBlock.diffId) || false;\n updatedBlock.rejected = rejectedChanges?.has(updatedBlock.diffId) || false;\n }\n\n if (updatedBlock.wordDiffs) {\n updatedBlock.wordDiffs = updatedBlock.wordDiffs.map((wordDiff) => ({\n ...wordDiff,\n accepted: acceptedChanges?.has(wordDiff.diffId) || false,\n rejected: rejectedChanges?.has(wordDiff.diffId) || false,\n }));\n }\n\n if (updatedBlock.children) {\n updatedBlock.children = this.updateWordDiffStates(\n updatedBlock.children as DiffBlock[],\n acceptedChanges,\n rejectedChanges,\n );\n }\n\n return updatedBlock;\n });\n }\n\n private static renderDiffBlock(\n block: DiffBlock,\n onAcceptChange?: (diffId: string) => void,\n onRejectChange?: (diffId: string) => void,\n ): PartialBlock {\n if (block.diffType === \"modified\" && block.wordDiffs) {\n return this.renderWordLevelDiff(block, onAcceptChange, onRejectChange);\n }\n\n if (block.diffType === \"added\" || block.diffType === \"removed\") {\n return this.renderBlockLevelDiff(block, onAcceptChange, onRejectChange);\n }\n\n const baseBlock: PartialBlock = {\n id: block.id || crypto.randomUUID(),\n type: (block.type as any) || \"paragraph\",\n props: this.getBlockProps(block),\n content: Array.isArray(block.content) ? block.content : [],\n children: block.children?.map((child) =>\n this.renderDiffBlock(child as DiffBlock, onAcceptChange, onRejectChange),\n ),\n };\n\n return baseBlock;\n }\n\n private static renderBlockLevelDiff(\n block: DiffBlock,\n onAcceptChange?: (diffId: string) => void,\n onRejectChange?: (diffId: string) => void,\n ): PartialBlock {\n if (!block.diffId) {\n return {\n id: block.id || crypto.randomUUID(),\n type: (block.type as any) || \"paragraph\",\n props: block.props || {},\n content: Array.isArray(block.content) ? block.content : [],\n children: block.children?.map((child) =>\n this.renderDiffBlock(child as DiffBlock, onAcceptChange, onRejectChange),\n ),\n };\n }\n\n const blockAccepted = block.accepted || false;\n const blockRejected = block.rejected || false;\n\n let content = Array.isArray(block.content) ? [...block.content] : [];\n\n if (block.diffType === \"added\") {\n if (blockRejected) {\n return {\n id: block.id || crypto.randomUUID(),\n type: \"paragraph\",\n props: {},\n content: [],\n children: [],\n };\n } else if (!blockAccepted) {\n content = content.map((item: any) => ({\n ...item,\n styles: { ...item.styles, bold: true },\n }));\n\n content.push({\n type: \"diffActions\",\n props: { diffIds: block.diffId },\n });\n }\n } else if (block.diffType === \"removed\") {\n if (blockAccepted) {\n return {\n id: block.id || crypto.randomUUID(),\n type: \"paragraph\",\n props: {},\n content: [],\n children: [],\n };\n } else if (!blockRejected) {\n content = content.map((item: any) => ({\n ...item,\n styles: { ...item.styles, strike: true },\n }));\n\n content.push({\n type: \"diffActions\",\n props: { diffIds: block.diffId },\n });\n }\n }\n\n const baseBlock: PartialBlock = {\n id: block.id || crypto.randomUUID(),\n type: (block.type as any) || \"paragraph\",\n props: this.getBlockProps(block),\n content: content,\n children: block.children?.map((child) =>\n this.renderDiffBlock(child as DiffBlock, onAcceptChange, onRejectChange),\n ),\n };\n\n return baseBlock;\n }\n\n private static renderWordLevelDiff(\n block: DiffBlock,\n onAcceptChange?: (diffId: string) => void,\n onRejectChange?: (diffId: string) => void,\n ): PartialBlock {\n if (!block.wordDiffs) {\n return {\n id: block.id || crypto.randomUUID(),\n type: (block.type as any) || \"paragraph\",\n props: block.props || {},\n content: Array.isArray(block.content) ? block.content : [],\n children: [],\n };\n }\n\n const content = this.groupAndRenderWordDiffs(block.wordDiffs);\n\n return {\n id: block.id || crypto.randomUUID(),\n type: (block.type as any) || \"paragraph\",\n props: block.props || {},\n content: Array.isArray(content) ? content : [],\n children:\n block.children?.map((child) => this.renderDiffBlock(child as DiffBlock, onAcceptChange, onRejectChange)) || [],\n };\n }\n\n private static groupAndRenderWordDiffs(wordDiffs: WordDiff[]): any[] {\n const content: any[] = [];\n\n for (let i = 0; i < wordDiffs.length; i++) {\n const wordDiff = wordDiffs[i];\n\n const isLastOfGroup = this.isLastDiffInGroup(wordDiffs, i);\n\n const textContent = this.createTextContent(wordDiff, isLastOfGroup);\n if (textContent) {\n if (Array.isArray(textContent)) {\n content.push(...textContent);\n } else {\n content.push(textContent);\n }\n }\n }\n\n const cleanedContent = this.cleanupSpaces(content);\n\n return cleanedContent;\n }\n\n private static cleanupSpaces(content: any[]): any[] {\n const filtered = content.filter((item) => item !== null && item !== undefined);\n\n const cleaned: any[] = [];\n\n for (let i = 0; i < filtered.length; i++) {\n const current = filtered[i];\n\n if (current.type === \"text\" && current.text === \" \") {\n const lastItem = cleaned[cleaned.length - 1];\n\n if (\n i === 0 ||\n i === filtered.length - 1 ||\n (lastItem && lastItem.type === \"text\" && lastItem.text === \" \") ||\n (lastItem && lastItem.type === \"diffActions\")\n ) {\n continue;\n }\n }\n\n if (current.type === \"diffActions\") {\n const nextItem = i + 1 < filtered.length ? filtered[i + 1] : null;\n\n cleaned.push(current);\n\n if (nextItem && nextItem.type === \"text\" && nextItem.text !== \" \" && nextItem.type !== \"diffActions\") {\n cleaned.push({\n type: \"text\",\n text: \" \",\n styles: {},\n });\n }\n\n continue;\n }\n\n cleaned.push(current);\n }\n\n return cleaned;\n }\n\n private static isLastDiffInGroup(wordDiffs: WordDiff[], currentIndex: number): boolean {\n const currentDiff = wordDiffs[currentIndex];\n\n if (currentDiff.type === \"unchanged\") {\n return false;\n }\n\n for (let i = currentIndex + 1; i < wordDiffs.length; i++) {\n const nextDiff = wordDiffs[i];\n\n if (nextDiff.diffId === currentDiff.diffId && (nextDiff.type === \"added\" || nextDiff.type === \"removed\")) {\n return false;\n }\n\n if (nextDiff.type !== \"unchanged\" && nextDiff.diffId !== currentDiff.diffId) {\n break;\n }\n }\n\n return true;\n }\n\n private static createTextContent(wordDiff: WordDiff, isLastOfGroup?: boolean): any[] | any {\n switch (wordDiff.type) {\n case \"added\":\n if (wordDiff.accepted) {\n return {\n type: \"text\",\n text: wordDiff.text,\n styles: {},\n };\n } else if (wordDiff.rejected) {\n return null;\n } else {\n if (wordDiff.text.trim() === \"\") {\n return {\n type: \"text\",\n text: wordDiff.text,\n styles: { backgroundColor: \"#dcfce7\" },\n };\n } else {\n const baseContent = {\n type: \"text\",\n text: wordDiff.text,\n styles: { bold: true },\n };\n\n if (isLastOfGroup) {\n return [\n baseContent,\n {\n type: \"diffActions\",\n props: { diffIds: wordDiff.diffId },\n },\n ];\n } else {\n return baseContent;\n }\n }\n }\n\n case \"removed\":\n if (wordDiff.accepted) {\n return null;\n } else if (wordDiff.rejected) {\n return {\n type: \"text\",\n text: wordDiff.text,\n styles: {},\n };\n } else {\n if (wordDiff.text.trim() === \"\") {\n return {\n type: \"text\",\n text: wordDiff.text,\n styles: { strike: true },\n };\n } else {\n const baseContent = {\n type: \"text\",\n text: wordDiff.text,\n styles: { strike: true },\n };\n\n if (isLastOfGroup) {\n return [\n baseContent,\n {\n type: \"diffActions\",\n props: { diffIds: wordDiff.diffId },\n },\n ];\n } else {\n return baseContent;\n }\n }\n }\n\n case \"unchanged\":\n default:\n return {\n type: \"text\",\n text: wordDiff.text,\n styles: {},\n };\n }\n }\n\n private static getBlockProps(block: DiffBlock): any {\n const baseProps = block.props || {};\n\n return baseProps;\n }\n\n static generateChangeSummary(diffBlocks: DiffBlock[]): {\n totalWords: number;\n addedWords: number;\n removedWords: number;\n acceptedChanges: number;\n rejectedChanges: number;\n pendingChanges: number;\n } {\n let totalWords = 0;\n let addedWords = 0;\n let removedWords = 0;\n let acceptedChanges = 0;\n let rejectedChanges = 0;\n let pendingChanges = 0;\n\n const processBlock = (block: DiffBlock) => {\n if (block.wordDiffs) {\n block.wordDiffs.forEach((wordDiff) => {\n totalWords++;\n\n if (wordDiff.type === \"added\") {\n addedWords++;\n } else if (wordDiff.type === \"removed\") {\n removedWords++;\n }\n\n if (wordDiff.accepted) {\n acceptedChanges++;\n } else if (wordDiff.rejected) {\n rejectedChanges++;\n } else if (wordDiff.type !== \"unchanged\") {\n pendingChanges++;\n }\n });\n }\n\n if (block.children) {\n block.children.forEach((child) => processBlock(child as DiffBlock));\n }\n };\n\n diffBlocks.forEach(processBlock);\n\n return {\n totalWords,\n addedWords,\n removedWords,\n acceptedChanges,\n rejectedChanges,\n pendingChanges,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-JC3WJK65.js","../src/utils/cn.ts","../src/utils/compose-refs.ts","../src/utils/use-mobile.tsx","../src/utils/date-formatter.ts","../src/utils/exists.ts","../src/utils/table-options.ts","../src/utils/schemas/user.object.schema.ts","../src/utils/schemas/entity.object.schema.ts","../src/utils/blocknote-diff.util.ts","../src/utils/blocknote-word-diff-renderer.util.ts"],"names":["z"],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-JC3WJK65.js","sourcesContent":[null,"import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n if (typeof ref === \"function\") {\n return ref(value);\n }\n\n if (ref !== null && ref !== undefined) {\n ref.current = value;\n }\n}\n\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup === \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n\n // React <19 will log an error to the console if a callback ref returns a\n // value. We don't use ref cleanups internally so this will only happen if a\n // user's ref callback returns a value, which we only expect if they are\n // using the cleanup functionality added in React 19.\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup === \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\n\n/**\n * A custom hook that composes multiple refs\n * Accepts callback refs and RefObject(s)\n */\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return React.useCallback(composeRefs(...refs), refs);\n}\n\nexport { composeRefs, useComposedRefs };\n","\"use client\";\n\nimport * as React from \"react\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined);\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n mql.addEventListener(\"change\", onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n return !!isMobile;\n}\n","type FormatOption = \"date\" | \"time\" | \"dateTime\" | \"timeSince\" | \"default\";\n\nexport const formatDate = (eventDate: Date, formatOption: FormatOption): string => {\n const browserLocale = navigator.language || \"en-US\";\n\n const formatPart = (date: Date, options: Intl.DateTimeFormatOptions): string =>\n new Intl.DateTimeFormat(browserLocale, options).format(date);\n\n const now = new Date();\n const diff = now.getTime() - eventDate.getTime();\n\n if (formatOption === \"default\") {\n if (diff < 24 * 60 * 60 * 1000) formatOption = \"timeSince\";\n else formatOption = \"dateTime\";\n }\n\n if (formatOption === \"timeSince\") {\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days} days ago`;\n if (hours > 0) return `${hours} hours ago`;\n if (minutes > 0) return `${minutes} minutes ago`;\n return `${seconds} seconds ago`;\n }\n\n // Define formatting options\n const dateOptions: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n };\n const timeOptions: Intl.DateTimeFormatOptions = {\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n // Format based on the option\n switch (formatOption) {\n case \"date\":\n return formatPart(eventDate, dateOptions);\n case \"time\":\n return formatPart(eventDate, timeOptions);\n case \"dateTime\":\n return `${formatPart(eventDate, dateOptions)} ${formatPart(eventDate, timeOptions)}`;\n default:\n throw new Error(\"Invalid format option\");\n }\n};\n\nexport type { FormatOption };\n","export const exists = <T>(itemOrArray: T | T[] | null | undefined): boolean => {\n if (!itemOrArray) return false;\n if (Array.isArray(itemOrArray)) {\n return itemOrArray.length > 0;\n }\n return true;\n};\n","import { Action, ModuleWithPermissions } from \"../permissions\";\nimport { cloneElement, createElement, Fragment, ReactElement } from \"react\";\n\nexport class TableOptions {\n private _components: ReactElement<any>[];\n private _hasPermissionToModule: <M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }) => boolean;\n\n constructor(\n hasPermissionToModule: <M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }) => boolean,\n ) {\n this._hasPermissionToModule = hasPermissionToModule;\n this._components = [];\n }\n\n addOption<M extends ModuleWithPermissions>(component: ReactElement<any> | null, module?: M, action?: Action): void {\n if (!component || (module && action && !this._hasPermissionToModule({ module, action }))) return;\n this._components.push(component);\n }\n\n getComponents(): ReactElement<any>[] {\n return this._components;\n }\n\n getOptions(): ReactElement<any> | null {\n if (this._components.length === 0) return null;\n\n const response: ReactElement<any>[] = this._components.map((option, index) =>\n cloneElement(option, { key: option.key ?? index }),\n );\n\n return createElement(Fragment, {}, response);\n }\n}\n\nexport function getTableOptions(params: {\n hasPermissionToModule: <M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }) => boolean;\n options: { component: ReactElement<any> | null; module?: ModuleWithPermissions; action?: Action }[];\n}): ReactElement<any> | null {\n const tableOptions = new TableOptions(params.hasPermissionToModule);\n params.options.forEach((option) => tableOptions.addOption(option.component, option.module, option.action));\n return tableOptions.getOptions();\n}\n\nexport function getTableComponents(params: {\n hasPermissionToModule: <M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }) => boolean;\n options: { component: ReactElement<any> | null; module?: ModuleWithPermissions; action?: Action }[];\n}): ReactElement<any>[] {\n const tableOptions = new TableOptions(params.hasPermissionToModule);\n params.options.forEach((option) => tableOptions.addOption(option.component, option.module, option.action));\n return tableOptions.getComponents();\n}\n","import { z } from \"zod\";\n\nexport const userObjectSchema = z.object({\n id: z.string(),\n name: z.string(),\n avatar: z.string().optional(),\n});\n\nexport type UserObject = z.infer<typeof userObjectSchema>;\n","import { z } from \"zod\";\n\nexport const entityObjectSchema = z.object({\n id: z.uuidv4(),\n name: z.string(),\n});\n\nexport type EntityObject = z.infer<typeof entityObjectSchema>;\n","import { PartialBlock } from \"@blocknote/core\";\n\nexport interface WordDiff {\n type: \"added\" | \"removed\" | \"unchanged\";\n text: string;\n diffId: string;\n accepted?: boolean;\n rejected?: boolean;\n}\n\nexport interface DiffBlock {\n id?: string;\n type?: string;\n props?: any;\n content?: any;\n children?: DiffBlock[];\n diffType?: \"added\" | \"removed\" | \"modified\" | \"unchanged\";\n originalContent?: any;\n diffId?: string;\n wordDiffs?: WordDiff[];\n accepted?: boolean;\n rejected?: boolean;\n}\n\nexport interface DiffResult {\n blocks: DiffBlock[];\n hasChanges: boolean;\n}\n\nexport interface BlockDiffOptions {\n ignoreIds?: boolean;\n compareContent?: boolean;\n similarityThreshold?: number;\n}\n\n/**\n * BlockNote Diff Utility\n * Implements a sophisticated diff algorithm for BlockNote document structures\n */\nexport class BlockNoteDiffUtil {\n private static readonly DEFAULT_OPTIONS: BlockDiffOptions = {\n ignoreIds: false,\n compareContent: true,\n similarityThreshold: 0.8,\n };\n\n /**\n * Compare two BlockNote documents and return diff result\n */\n static diff(\n originalBlocks: PartialBlock[] = [],\n newBlocks: PartialBlock[] = [],\n options: BlockDiffOptions = {},\n ): DiffResult {\n const opts = { ...this.DEFAULT_OPTIONS, ...options };\n\n // Create a map for efficient lookups\n const originalMap = new Map<string, PartialBlock>();\n const newMap = new Map<string, PartialBlock>();\n\n // Build maps based on block IDs\n originalBlocks.forEach((block) => {\n if (block.id) {\n originalMap.set(block.id, block);\n }\n });\n\n newBlocks.forEach((block) => {\n if (block.id) {\n newMap.set(block.id, block);\n }\n });\n\n const diffBlocks: DiffBlock[] = [];\n const processedNewIds = new Set<string>();\n\n // Process original blocks to find removed and modified blocks\n for (const originalBlock of originalBlocks) {\n const blockId = originalBlock.id;\n\n // Generate ID if missing\n const processId = blockId || crypto.randomUUID();\n const newBlock = blockId ? newMap.get(blockId) : null;\n\n if (!newBlock) {\n // Block was removed\n const removedBlock: DiffBlock = {\n ...originalBlock,\n id: processId,\n diffType: \"removed\",\n diffId: `removed-${processId}`,\n };\n diffBlocks.push(removedBlock);\n } else {\n // Block exists in both, check for modifications\n if (blockId) {\n processedNewIds.add(blockId);\n }\n\n if (this.areBlocksEqual(originalBlock, newBlock, opts)) {\n // Block is unchanged\n const unchangedBlock: DiffBlock = {\n ...newBlock,\n diffType: \"unchanged\",\n };\n diffBlocks.push(unchangedBlock);\n } else {\n // Block was modified - perform word-level diff\n const wordDiffs = this.generateWordDiffs(originalBlock.content, newBlock.content, processId);\n const modifiedBlock: DiffBlock = {\n ...newBlock,\n diffType: \"modified\",\n originalContent: originalBlock.content as any,\n diffId: `modified-${processId}`,\n wordDiffs: wordDiffs,\n };\n diffBlocks.push(modifiedBlock);\n }\n }\n }\n\n // Process new blocks to find added blocks\n for (const newBlock of newBlocks) {\n const blockId = newBlock.id;\n\n // Skip if block was already processed (has ID and was found in original)\n if (blockId && processedNewIds.has(blockId)) continue;\n\n // This is a new block (either no ID or ID not found in original)\n const generatedId = blockId || crypto.randomUUID();\n const addedBlock: DiffBlock = {\n ...newBlock,\n id: generatedId,\n diffType: \"added\",\n diffId: `added-${generatedId}`,\n };\n diffBlocks.push(addedBlock);\n }\n\n // Sort blocks to maintain original order as much as possible\n const sortedDiffBlocks = this.sortDiffBlocks(diffBlocks, originalBlocks, newBlocks);\n\n return {\n blocks: sortedDiffBlocks,\n hasChanges: sortedDiffBlocks.some((block) => block.diffType !== \"unchanged\"),\n };\n }\n\n /**\n * Compare two blocks for equality\n */\n private static areBlocksEqual(block1: PartialBlock, block2: PartialBlock, options: BlockDiffOptions): boolean {\n // Compare block type\n if (block1.type !== block2.type) {\n return false;\n }\n\n // Compare props (excluding diffType specific props)\n if (!this.deepEqual(block1.props, block2.props)) {\n return false;\n }\n\n // Compare content if enabled\n if (options.compareContent) {\n if (!this.deepEqual(block1.content, block2.content)) {\n return false;\n }\n }\n\n // Compare children recursively\n const children1 = block1.children || [];\n const children2 = block2.children || [];\n\n if (children1.length !== children2.length) {\n return false;\n }\n\n for (let i = 0; i < children1.length; i++) {\n if (!this.areBlocksEqual(children1[i], children2[i], options)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Deep equality comparison for objects\n */\n private static deepEqual(obj1: any, obj2: any): boolean {\n if (obj1 === obj2) return true;\n\n if (obj1 == null || obj2 == null) return obj1 === obj2;\n\n if (typeof obj1 !== typeof obj2) return false;\n\n if (typeof obj1 !== \"object\") return obj1 === obj2;\n\n if (Array.isArray(obj1) !== Array.isArray(obj2)) return false;\n\n if (Array.isArray(obj1)) {\n if (obj1.length !== obj2.length) return false;\n for (let i = 0; i < obj1.length; i++) {\n if (!this.deepEqual(obj1[i], obj2[i])) return false;\n }\n return true;\n }\n\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n\n if (keys1.length !== keys2.length) return false;\n\n for (const key of keys1) {\n if (!keys2.includes(key)) return false;\n if (!this.deepEqual(obj1[key], obj2[key])) return false;\n }\n\n return true;\n }\n\n /**\n * Sort diff blocks to maintain logical order\n */\n private static sortDiffBlocks(\n diffBlocks: DiffBlock[],\n originalBlocks: PartialBlock[],\n newBlocks: PartialBlock[],\n ): DiffBlock[] {\n // Create position maps\n const originalPositions = new Map<string, number>();\n const newPositions = new Map<string, number>();\n\n originalBlocks.forEach((block, index) => {\n if (block.id) {\n originalPositions.set(block.id, index);\n }\n });\n\n newBlocks.forEach((block, index) => {\n if (block.id) {\n newPositions.set(block.id, index);\n }\n });\n\n return diffBlocks.sort((a, b) => {\n const aId = a.id;\n const bId = b.id;\n\n if (!aId || !bId) return 0;\n\n // Prioritize by new positions, fallback to original positions\n const aPos = newPositions.get(aId) ?? originalPositions.get(aId) ?? Infinity;\n const bPos = newPositions.get(bId) ?? originalPositions.get(bId) ?? Infinity;\n\n return aPos - bPos;\n });\n }\n\n /**\n * Calculate similarity between two text contents\n */\n private static calculateSimilarity(content1: any[], content2: any[]): number {\n if (!content1 || !content2) return 0;\n\n const text1 = this.extractTextFromContent(content1);\n const text2 = this.extractTextFromContent(content2);\n\n if (text1 === text2) return 1;\n if (!text1 || !text2) return 0;\n\n // Simple Levenshtein distance-based similarity\n const maxLength = Math.max(text1.length, text2.length);\n const distance = this.levenshteinDistance(text1, text2);\n\n return 1 - distance / maxLength;\n }\n\n /**\n * Extract plain text from BlockNote content array\n */\n private static extractTextFromContent(content: any[]): string {\n if (!Array.isArray(content)) return \"\";\n\n return content\n .map((item) => {\n if (item.type === \"text\") {\n return item.text || \"\";\n }\n return \"\";\n })\n .join(\"\");\n }\n\n /**\n * Calculate Levenshtein distance between two strings\n */\n private static levenshteinDistance(str1: string, str2: string): number {\n const matrix = Array(str2.length + 1)\n .fill(null)\n .map(() => Array(str1.length + 1).fill(null));\n\n for (let i = 0; i <= str1.length; i++) {\n matrix[0][i] = i;\n }\n\n for (let j = 0; j <= str2.length; j++) {\n matrix[j][0] = j;\n }\n\n for (let j = 1; j <= str2.length; j++) {\n for (let i = 1; i <= str1.length; i++) {\n const substitutionCost = str1[i - 1] === str2[j - 1] ? 0 : 1;\n matrix[j][i] = Math.min(\n matrix[j][i - 1] + 1, // deletion\n matrix[j - 1][i] + 1, // insertion\n matrix[j - 1][i - 1] + substitutionCost, // substitution\n );\n }\n }\n\n return matrix[str2.length][str1.length];\n }\n\n /**\n * Generate word-level diffs between two content arrays\n */\n static generateWordDiffs(originalContent: any, newContent: any, blockId: string): WordDiff[] {\n const originalText = this.extractTextFromContent(originalContent || []);\n const newText = this.extractTextFromContent(newContent || []);\n\n if (!originalText && !newText) return [];\n if (!originalText) {\n return newText\n .split(/\\s+/)\n .filter((word) => word.trim())\n .map((word, index) => ({\n type: \"added\" as const,\n text: word,\n diffId: `${blockId}-add-${index}`,\n accepted: false,\n rejected: false,\n }));\n }\n if (!newText) {\n return originalText\n .split(/\\s+/)\n .filter((word) => word.trim())\n .map((word, index) => ({\n type: \"removed\" as const,\n text: word,\n diffId: `${blockId}-remove-${index}`,\n accepted: false,\n rejected: false,\n }));\n }\n\n return this.diffWords(originalText, newText, blockId);\n }\n\n /**\n * Perform word-level diff using word-only approach (no space tokenization)\n */\n private static diffWords(text1: string, text2: string, blockId: string): WordDiff[] {\n const words1 = text1.split(/\\s+/).filter((word) => word.length > 0);\n const words2 = text2.split(/\\s+/).filter((word) => word.length > 0);\n\n const diffs = this.myersDiff(words1, words2);\n\n // Consolidate adjacent changes to reduce fragmentation\n const consolidatedDiffs = this.consolidateAdjacentChanges(diffs);\n\n const result: WordDiff[] = [];\n let diffIndex = 0;\n\n for (let i = 0; i < consolidatedDiffs.length; i++) {\n const diff = consolidatedDiffs[i];\n const isLastDiff = i === consolidatedDiffs.length - 1;\n\n switch (diff.type) {\n case \"equal\":\n result.push({\n type: \"unchanged\",\n text: diff.value,\n diffId: `${blockId}-unchanged-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n\n // Add space after word if not the last diff\n if (!isLastDiff) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n break;\n\n case \"delete\":\n // Check if this is a consolidated change or regular change\n if ((diff as any).consolidated) {\n // This is a consolidated deletion - check if next is consolidated insertion\n const nextDiff = i + 1 < consolidatedDiffs.length ? consolidatedDiffs[i + 1] : null;\n const isConsolidatedReplacement = nextDiff && nextDiff.type === \"insert\" && (nextDiff as any).consolidated;\n\n if (isConsolidatedReplacement) {\n // Use single shared diff ID for the entire consolidated change\n const replacementId = `${blockId}-replace-${diffIndex++}`;\n\n // Add the removed text\n result.push({\n type: \"removed\",\n text: diff.value,\n diffId: replacementId,\n accepted: false,\n rejected: false,\n });\n\n // Add the new text with same diff ID\n result.push({\n type: \"added\",\n text: nextDiff.value,\n diffId: replacementId,\n accepted: false,\n rejected: false,\n });\n\n // Skip the next insert since we handled it\n i++;\n\n // Add space after replacement if not the last\n if (i < consolidatedDiffs.length - 1) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n } else {\n // Consolidated deletion without replacement\n result.push({\n type: \"removed\",\n text: diff.value,\n diffId: `${blockId}-remove-${diffIndex++}`,\n accepted: false,\n rejected: false,\n });\n\n // Add space after deletion if not the last\n if (!isLastDiff) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n }\n } else {\n // Regular single-word processing\n const nextDiff = i + 1 < consolidatedDiffs.length ? consolidatedDiffs[i + 1] : null;\n const isReplacement =\n nextDiff && nextDiff.type === \"insert\" && this.areWordsSimilar(diff.value, nextDiff.value);\n\n if (isReplacement) {\n // Use single shared diff ID for both operations\n const replacementId = `${blockId}-replace-${diffIndex++}`;\n\n // Add the removed word\n result.push({\n type: \"removed\",\n text: diff.value,\n diffId: replacementId,\n accepted: false,\n rejected: false,\n });\n\n // Add the new word with same diff ID (no space between them)\n result.push({\n type: \"added\",\n text: nextDiff.value,\n diffId: replacementId,\n accepted: false,\n rejected: false,\n });\n\n // Skip the next insert since we handled it\n i++;\n\n // Add space after replacement if not the last\n if (i < consolidatedDiffs.length - 1) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n } else {\n // Regular deletion\n result.push({\n type: \"removed\",\n text: diff.value,\n diffId: `${blockId}-remove-${diffIndex++}`,\n accepted: false,\n rejected: false,\n });\n\n // Add space after deletion if not the last\n if (!isLastDiff) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n }\n }\n break;\n\n case \"insert\":\n // Only handle if not already processed as part of replacement or consolidation\n if ((diff as any).consolidated) {\n // This should have been handled in the delete case above\n const prevDiff = i > 0 ? consolidatedDiffs[i - 1] : null;\n const wasProcessedAsConsolidatedReplacement =\n prevDiff && prevDiff.type === \"delete\" && (prevDiff as any).consolidated;\n\n if (!wasProcessedAsConsolidatedReplacement) {\n // Standalone consolidated insertion\n result.push({\n type: \"added\",\n text: diff.value,\n diffId: `${blockId}-add-${diffIndex++}`,\n accepted: false,\n rejected: false,\n });\n\n // Add space after insertion if not the last\n if (!isLastDiff) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n }\n } else {\n // Regular single-word processing\n const prevDiff = i > 0 ? consolidatedDiffs[i - 1] : null;\n const wasProcessedAsReplacement =\n prevDiff && prevDiff.type === \"delete\" && this.areWordsSimilar(prevDiff.value, diff.value);\n\n if (!wasProcessedAsReplacement) {\n result.push({\n type: \"added\",\n text: diff.value,\n diffId: `${blockId}-add-${diffIndex++}`,\n accepted: false,\n rejected: false,\n });\n\n // Add space after insertion if not the last\n if (!isLastDiff) {\n result.push({\n type: \"unchanged\",\n text: \" \",\n diffId: `${blockId}-space-${diffIndex++}`,\n accepted: true,\n rejected: false,\n });\n }\n }\n }\n break;\n }\n }\n\n return result;\n } /**\n * Improved diff algorithm that better handles word insertions\n * Uses a combination of LCS and heuristics to minimize false changes\n */\n private static myersDiff(a: string[], b: string[]): Array<{ type: \"equal\" | \"delete\" | \"insert\"; value: string }> {\n if (a.length === 0) {\n return b.map((value) => ({ type: \"insert\" as const, value }));\n }\n if (b.length === 0) {\n return a.map((value) => ({ type: \"delete\" as const, value }));\n }\n\n // Use dynamic programming for optimal diff\n const dp = this.computeEditScript(a, b);\n return this.reconstructDiff(a, b, dp);\n }\n\n /**\n * Compute edit script using dynamic programming\n */\n private static computeEditScript(a: string[], b: string[]): number[][] {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array(m + 1)\n .fill(null)\n .map(() => Array(n + 1).fill(0));\n\n // Initialize base cases\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n // Fill the DP table\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (a[i - 1] === b[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1]; // No operation needed\n } else {\n dp[i][j] =\n 1 +\n Math.min(\n dp[i - 1][j], // Delete from a\n dp[i][j - 1], // Insert into a\n dp[i - 1][j - 1], // Replace\n );\n }\n }\n }\n\n return dp;\n }\n\n /**\n * Reconstruct the actual diff from the DP table\n */\n private static reconstructDiff(\n a: string[],\n b: string[],\n dp: number[][],\n ): Array<{ type: \"equal\" | \"delete\" | \"insert\"; value: string; sharedDiffId?: boolean }> {\n const result: Array<{ type: \"equal\" | \"delete\" | \"insert\"; value: string; sharedDiffId?: boolean }> = [];\n let i = a.length;\n let j = b.length;\n\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && a[i - 1] === b[j - 1]) {\n // Equal\n result.unshift({ type: \"equal\", value: a[i - 1] });\n i--;\n j--;\n } else {\n // Determine the best operation with preference for insert/delete over replace\n const deleteCost = i > 0 ? dp[i - 1][j] : Infinity;\n const insertCost = j > 0 ? dp[i][j - 1] : Infinity;\n const replaceCost = i > 0 && j > 0 ? dp[i - 1][j - 1] : Infinity;\n\n const minCost = Math.min(deleteCost, insertCost, replaceCost);\n\n // Prefer insertions and deletions over replacements when costs are equal\n if (minCost === insertCost && j > 0) {\n // Insert\n result.unshift({ type: \"insert\", value: b[j - 1] });\n j--;\n } else if (minCost === deleteCost && i > 0) {\n // Delete\n result.unshift({ type: \"delete\", value: a[i - 1] });\n i--;\n } else if (minCost === replaceCost && i > 0 && j > 0) {\n // Only use replace for similar words, otherwise prefer separate operations\n if (this.areWordsSimilar(a[i - 1], b[j - 1])) {\n // Similar words - treat as replacement with shared diffId\n result.unshift({ type: \"insert\", value: b[j - 1], sharedDiffId: true });\n result.unshift({ type: \"delete\", value: a[i - 1], sharedDiffId: true });\n i--;\n j--;\n } else {\n // Different words - prefer insert over delete when costs are equal\n result.unshift({ type: \"insert\", value: b[j - 1] });\n j--;\n }\n }\n }\n }\n\n return result;\n }\n\n /**\n * Consolidate adjacent changes to reduce fragmentation\n * e.g., if we have: delete \"Key\", insert \"Key!\", delete \"Challenges\"\n * We can consolidate this into: replace [\"Key\", \"Challenges\"] with [\"Key!\"]\n */\n private static consolidateAdjacentChanges(\n diffs: Array<{ type: \"equal\" | \"delete\" | \"insert\"; value: string }>,\n ): Array<{ type: \"equal\" | \"delete\" | \"insert\"; value: string; consolidated?: boolean }> {\n const result = [];\n let i = 0;\n\n while (i < diffs.length) {\n const current = diffs[i];\n\n if (current.type === \"equal\") {\n result.push(current);\n i++;\n continue;\n }\n\n // Look for patterns of adjacent changes that can be consolidated\n const changeSequence = [];\n let j = i;\n\n // Collect adjacent non-equal changes\n while (j < diffs.length && diffs[j].type !== \"equal\") {\n changeSequence.push(diffs[j]);\n j++;\n }\n\n if (changeSequence.length <= 1) {\n // Single change, no consolidation needed\n result.push(current);\n i++;\n continue;\n }\n\n // Check if we should consolidate this sequence\n const shouldConsolidate = this.shouldConsolidateChanges(\n changeSequence as Array<{ type: \"delete\" | \"insert\"; value: string }>,\n );\n\n if (shouldConsolidate) {\n // Create consolidated changes\n const deletedWords = changeSequence.filter((c) => c.type === \"delete\").map((c) => c.value);\n const insertedWords = changeSequence.filter((c) => c.type === \"insert\").map((c) => c.value);\n\n if (deletedWords.length > 0) {\n result.push({\n type: \"delete\" as const,\n value: deletedWords.join(\" \"),\n consolidated: true,\n });\n }\n\n if (insertedWords.length > 0) {\n result.push({\n type: \"insert\" as const,\n value: insertedWords.join(\" \"),\n consolidated: true,\n });\n }\n } else {\n // Don't consolidate, add individual changes\n changeSequence.forEach((change) => result.push(change));\n }\n\n i = j;\n }\n\n return result;\n }\n\n /**\n * Determine if a sequence of changes should be consolidated\n */\n private static shouldConsolidateChanges(changes: Array<{ type: \"delete\" | \"insert\"; value: string }>): boolean {\n // Consolidate if we have both deletions and insertions in the same sequence\n const hasDeletes = changes.some((c) => c.type === \"delete\");\n const hasInserts = changes.some((c) => c.type === \"insert\");\n\n // Only consolidate if we have both types of changes (replacements/modifications)\n // Pure additions or pure deletions are fine as separate changes\n return hasDeletes && hasInserts;\n }\n\n /**\n * Check if two words are similar enough to be considered a replacement\n */\n private static areWordsSimilar(word1: string, word2: string): boolean {\n // If words are exactly the same, they're similar\n if (word1 === word2) return true;\n\n // Consider words similar if they share more than 70% of their characters\n const maxLen = Math.max(word1.length, word2.length);\n const minLen = Math.min(word1.length, word2.length);\n\n // If one word is much longer than the other, they're not similar\n if (maxLen > minLen * 2) {\n return false;\n }\n\n // Special case: if one word is just the other plus punctuation, treat as separate changes\n // e.g., \"Key\" and \"Key!\" should not be considered similar for replacement\n const word1Clean = word1.replace(/[^\\w]/g, \"\");\n const word2Clean = word2.replace(/[^\\w]/g, \"\");\n\n if (word1Clean === word2Clean && word1 !== word2) {\n // One word is just the other with added punctuation - don't treat as replacement\n return false;\n }\n\n // Calculate character overlap using Levenshtein distance\n const distance = this.levenshteinDistance(word1, word2);\n const similarity = 1 - distance / maxLen;\n\n return similarity > 0.7; // Increased threshold to be more conservative\n }\n}\n","import { PartialBlock } from \"@blocknote/core\";\nimport { DiffBlock, WordDiff } from \"./blocknote-diff.util\";\n\nexport class BlockNoteWordDiffRendererUtil {\n static renderWordDiffs(\n diffBlocks: DiffBlock[],\n onAcceptChange?: (diffId: string) => void,\n onRejectChange?: (diffId: string) => void,\n acceptedChanges?: Set<string>,\n rejectedChanges?: Set<string>,\n ): PartialBlock[] {\n if (acceptedChanges || rejectedChanges) {\n diffBlocks = this.updateWordDiffStates(diffBlocks, acceptedChanges, rejectedChanges);\n }\n return diffBlocks.map((block) => this.renderDiffBlock(block, onAcceptChange, onRejectChange));\n }\n\n private static updateWordDiffStates(\n diffBlocks: DiffBlock[],\n acceptedChanges?: Set<string>,\n rejectedChanges?: Set<string>,\n ): DiffBlock[] {\n return diffBlocks.map((block) => {\n const updatedBlock = { ...block };\n\n if (updatedBlock.diffId) {\n updatedBlock.accepted = acceptedChanges?.has(updatedBlock.diffId) || false;\n updatedBlock.rejected = rejectedChanges?.has(updatedBlock.diffId) || false;\n }\n\n if (updatedBlock.wordDiffs) {\n updatedBlock.wordDiffs = updatedBlock.wordDiffs.map((wordDiff) => ({\n ...wordDiff,\n accepted: acceptedChanges?.has(wordDiff.diffId) || false,\n rejected: rejectedChanges?.has(wordDiff.diffId) || false,\n }));\n }\n\n if (updatedBlock.children) {\n updatedBlock.children = this.updateWordDiffStates(\n updatedBlock.children as DiffBlock[],\n acceptedChanges,\n rejectedChanges,\n );\n }\n\n return updatedBlock;\n });\n }\n\n private static renderDiffBlock(\n block: DiffBlock,\n onAcceptChange?: (diffId: string) => void,\n onRejectChange?: (diffId: string) => void,\n ): PartialBlock {\n if (block.diffType === \"modified\" && block.wordDiffs) {\n return this.renderWordLevelDiff(block, onAcceptChange, onRejectChange);\n }\n\n if (block.diffType === \"added\" || block.diffType === \"removed\") {\n return this.renderBlockLevelDiff(block, onAcceptChange, onRejectChange);\n }\n\n const baseBlock: PartialBlock = {\n id: block.id || crypto.randomUUID(),\n type: (block.type as any) || \"paragraph\",\n props: this.getBlockProps(block),\n content: Array.isArray(block.content) ? block.content : [],\n children: block.children?.map((child) =>\n this.renderDiffBlock(child as DiffBlock, onAcceptChange, onRejectChange),\n ),\n };\n\n return baseBlock;\n }\n\n private static renderBlockLevelDiff(\n block: DiffBlock,\n onAcceptChange?: (diffId: string) => void,\n onRejectChange?: (diffId: string) => void,\n ): PartialBlock {\n if (!block.diffId) {\n return {\n id: block.id || crypto.randomUUID(),\n type: (block.type as any) || \"paragraph\",\n props: block.props || {},\n content: Array.isArray(block.content) ? block.content : [],\n children: block.children?.map((child) =>\n this.renderDiffBlock(child as DiffBlock, onAcceptChange, onRejectChange),\n ),\n };\n }\n\n const blockAccepted = block.accepted || false;\n const blockRejected = block.rejected || false;\n\n let content = Array.isArray(block.content) ? [...block.content] : [];\n\n if (block.diffType === \"added\") {\n if (blockRejected) {\n return {\n id: block.id || crypto.randomUUID(),\n type: \"paragraph\",\n props: {},\n content: [],\n children: [],\n };\n } else if (!blockAccepted) {\n content = content.map((item: any) => ({\n ...item,\n styles: { ...item.styles, bold: true },\n }));\n\n content.push({\n type: \"diffActions\",\n props: { diffIds: block.diffId },\n });\n }\n } else if (block.diffType === \"removed\") {\n if (blockAccepted) {\n return {\n id: block.id || crypto.randomUUID(),\n type: \"paragraph\",\n props: {},\n content: [],\n children: [],\n };\n } else if (!blockRejected) {\n content = content.map((item: any) => ({\n ...item,\n styles: { ...item.styles, strike: true },\n }));\n\n content.push({\n type: \"diffActions\",\n props: { diffIds: block.diffId },\n });\n }\n }\n\n const baseBlock: PartialBlock = {\n id: block.id || crypto.randomUUID(),\n type: (block.type as any) || \"paragraph\",\n props: this.getBlockProps(block),\n content: content,\n children: block.children?.map((child) =>\n this.renderDiffBlock(child as DiffBlock, onAcceptChange, onRejectChange),\n ),\n };\n\n return baseBlock;\n }\n\n private static renderWordLevelDiff(\n block: DiffBlock,\n onAcceptChange?: (diffId: string) => void,\n onRejectChange?: (diffId: string) => void,\n ): PartialBlock {\n if (!block.wordDiffs) {\n return {\n id: block.id || crypto.randomUUID(),\n type: (block.type as any) || \"paragraph\",\n props: block.props || {},\n content: Array.isArray(block.content) ? block.content : [],\n children: [],\n };\n }\n\n const content = this.groupAndRenderWordDiffs(block.wordDiffs);\n\n return {\n id: block.id || crypto.randomUUID(),\n type: (block.type as any) || \"paragraph\",\n props: block.props || {},\n content: Array.isArray(content) ? content : [],\n children:\n block.children?.map((child) => this.renderDiffBlock(child as DiffBlock, onAcceptChange, onRejectChange)) || [],\n };\n }\n\n private static groupAndRenderWordDiffs(wordDiffs: WordDiff[]): any[] {\n const content: any[] = [];\n\n for (let i = 0; i < wordDiffs.length; i++) {\n const wordDiff = wordDiffs[i];\n\n const isLastOfGroup = this.isLastDiffInGroup(wordDiffs, i);\n\n const textContent = this.createTextContent(wordDiff, isLastOfGroup);\n if (textContent) {\n if (Array.isArray(textContent)) {\n content.push(...textContent);\n } else {\n content.push(textContent);\n }\n }\n }\n\n const cleanedContent = this.cleanupSpaces(content);\n\n return cleanedContent;\n }\n\n private static cleanupSpaces(content: any[]): any[] {\n const filtered = content.filter((item) => item !== null && item !== undefined);\n\n const cleaned: any[] = [];\n\n for (let i = 0; i < filtered.length; i++) {\n const current = filtered[i];\n\n if (current.type === \"text\" && current.text === \" \") {\n const lastItem = cleaned[cleaned.length - 1];\n\n if (\n i === 0 ||\n i === filtered.length - 1 ||\n (lastItem && lastItem.type === \"text\" && lastItem.text === \" \") ||\n (lastItem && lastItem.type === \"diffActions\")\n ) {\n continue;\n }\n }\n\n if (current.type === \"diffActions\") {\n const nextItem = i + 1 < filtered.length ? filtered[i + 1] : null;\n\n cleaned.push(current);\n\n if (nextItem && nextItem.type === \"text\" && nextItem.text !== \" \" && nextItem.type !== \"diffActions\") {\n cleaned.push({\n type: \"text\",\n text: \" \",\n styles: {},\n });\n }\n\n continue;\n }\n\n cleaned.push(current);\n }\n\n return cleaned;\n }\n\n private static isLastDiffInGroup(wordDiffs: WordDiff[], currentIndex: number): boolean {\n const currentDiff = wordDiffs[currentIndex];\n\n if (currentDiff.type === \"unchanged\") {\n return false;\n }\n\n for (let i = currentIndex + 1; i < wordDiffs.length; i++) {\n const nextDiff = wordDiffs[i];\n\n if (nextDiff.diffId === currentDiff.diffId && (nextDiff.type === \"added\" || nextDiff.type === \"removed\")) {\n return false;\n }\n\n if (nextDiff.type !== \"unchanged\" && nextDiff.diffId !== currentDiff.diffId) {\n break;\n }\n }\n\n return true;\n }\n\n private static createTextContent(wordDiff: WordDiff, isLastOfGroup?: boolean): any[] | any {\n switch (wordDiff.type) {\n case \"added\":\n if (wordDiff.accepted) {\n return {\n type: \"text\",\n text: wordDiff.text,\n styles: {},\n };\n } else if (wordDiff.rejected) {\n return null;\n } else {\n if (wordDiff.text.trim() === \"\") {\n return {\n type: \"text\",\n text: wordDiff.text,\n styles: { backgroundColor: \"#dcfce7\" },\n };\n } else {\n const baseContent = {\n type: \"text\",\n text: wordDiff.text,\n styles: { bold: true },\n };\n\n if (isLastOfGroup) {\n return [\n baseContent,\n {\n type: \"diffActions\",\n props: { diffIds: wordDiff.diffId },\n },\n ];\n } else {\n return baseContent;\n }\n }\n }\n\n case \"removed\":\n if (wordDiff.accepted) {\n return null;\n } else if (wordDiff.rejected) {\n return {\n type: \"text\",\n text: wordDiff.text,\n styles: {},\n };\n } else {\n if (wordDiff.text.trim() === \"\") {\n return {\n type: \"text\",\n text: wordDiff.text,\n styles: { strike: true },\n };\n } else {\n const baseContent = {\n type: \"text\",\n text: wordDiff.text,\n styles: { strike: true },\n };\n\n if (isLastOfGroup) {\n return [\n baseContent,\n {\n type: \"diffActions\",\n props: { diffIds: wordDiff.diffId },\n },\n ];\n } else {\n return baseContent;\n }\n }\n }\n\n case \"unchanged\":\n default:\n return {\n type: \"text\",\n text: wordDiff.text,\n styles: {},\n };\n }\n }\n\n private static getBlockProps(block: DiffBlock): any {\n const baseProps = block.props || {};\n\n return baseProps;\n }\n\n static generateChangeSummary(diffBlocks: DiffBlock[]): {\n totalWords: number;\n addedWords: number;\n removedWords: number;\n acceptedChanges: number;\n rejectedChanges: number;\n pendingChanges: number;\n } {\n let totalWords = 0;\n let addedWords = 0;\n let removedWords = 0;\n let acceptedChanges = 0;\n let rejectedChanges = 0;\n let pendingChanges = 0;\n\n const processBlock = (block: DiffBlock) => {\n if (block.wordDiffs) {\n block.wordDiffs.forEach((wordDiff) => {\n totalWords++;\n\n if (wordDiff.type === \"added\") {\n addedWords++;\n } else if (wordDiff.type === \"removed\") {\n removedWords++;\n }\n\n if (wordDiff.accepted) {\n acceptedChanges++;\n } else if (wordDiff.rejected) {\n rejectedChanges++;\n } else if (wordDiff.type !== \"unchanged\") {\n pendingChanges++;\n }\n });\n }\n\n if (block.children) {\n block.children.forEach((child) => processBlock(child as DiffBlock));\n }\n };\n\n diffBlocks.forEach(processBlock);\n\n return {\n totalWords,\n addedWords,\n removedWords,\n acceptedChanges,\n rejectedChanges,\n pendingChanges,\n };\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-LXKSUWAV.js","../src/client/token.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;ACFA,2CAA0B;AAK1B,MAAA,SAAsB,cAAA,CAAA,EAA8C;AAClE,EAAA,OAAO,MAAM,oCAAA,OAAiB,CAAA;AAChC;AAFsB,qCAAA,cAAA,EAAA,gBAAA,CAAA;ADGtB;AACA;AACE;AACF,wCAAC","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-LXKSUWAV.js","sourcesContent":[null,"\"use client\";\n\nimport { getCookie } from \"cookies-next\";\n\n/**\n * Get the authentication token from cookies (client-side only)\n */\nexport async function getClientToken(): Promise<string | undefined> {\n return await getCookie(\"token\");\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-RAF7PNLG.js","../src/contexts/SharedContext.tsx","../src/features/user/contexts/CurrentUserContext.tsx"],"names":["createContext","descriptor","path","jsx","useContext"],"mappings":"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","file":"/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-RAF7PNLG.js","sourcesContent":[null,"import { createContext, ReactNode, useContext } from \"react\";\nimport { BreadcrumbItemData } from \"../interfaces\";\n\nconst SharedContext = createContext<{\n breadcrumbs: BreadcrumbItemData[];\n title: {\n type: string | string[];\n element?: string;\n functions?: ReactNode;\n };\n} | null>(null);\n\ninterface SharedProviderProps {\n children: ReactNode;\n value: {\n breadcrumbs: BreadcrumbItemData[];\n title: {\n type: string;\n element?: string;\n functions?: ReactNode;\n };\n };\n}\n\nexport const SharedProvider = ({ children, value }: SharedProviderProps) => {\n return <SharedContext.Provider value={value}>{children}</SharedContext.Provider>;\n};\n\nexport const useSharedContext = () => {\n const context = useContext(SharedContext);\n if (!context) {\n throw new Error(\"useSharedContext must be used within a SharedProvider\");\n }\n return context;\n};\n","\"use client\";\n\nimport { getCookie } from \"cookies-next\";\nimport { useAtom } from \"jotai\";\nimport { atomWithStorage } from \"jotai/utils\";\nimport { usePathname } from \"next/navigation\";\nimport React, { createContext, useContext, useEffect } from \"react\";\nimport { Modules, rehydrate } from \"../../../core\";\nimport { Action, checkPermissions, ModuleWithPermissions } from \"../../../permissions\";\nimport { getRoleId } from \"../../../roles\";\nimport { CompanyInterface } from \"../../company\";\nimport { FeatureInterface } from \"../../feature\";\nimport { RoleInterface } from \"../../role\";\nimport { UserInterface } from \"../data\";\n\nexport interface CurrentUserContextType<T extends UserInterface = UserInterface> {\n currentUser: T | null;\n company: CompanyInterface | null;\n setUser: (user?: T) => void;\n hasPermissionToModule: <M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }) => boolean;\n hasPermissionToModules: <M extends ModuleWithPermissions>(params: {\n modules: M[];\n action: Action;\n data?: any;\n }) => boolean;\n hasPermissionToPath: (path: string) => boolean;\n hasAccesToFeature: (featureIdentifier: string) => boolean;\n matchUrlToModule: (prarms?: { path: string }) => ModuleWithPermissions | undefined;\n hasRole: (roleId: string) => boolean;\n}\n\nconst userAtom = atomWithStorage(\"user\", null);\n\nconst CurrentUserContext = createContext<CurrentUserContextType | undefined>(undefined);\n\nexport const CurrentUserProvider = ({ children }: { children: React.ReactNode }) => {\n const path = usePathname();\n\n const [dehydratedUser, setDehydratedUser] = useAtom(userAtom);\n\n useEffect(() => {\n const token = getCookie(\"token\");\n if (!token && dehydratedUser) setDehydratedUser(null);\n }, [dehydratedUser, setDehydratedUser]);\n\n const matchUrlToModule = (params?: { path: string }): ModuleWithPermissions | undefined => {\n const moduleKeys = Object.getOwnPropertyNames(Modules).filter(\n (key) => key !== \"prototype\" && key !== \"_factory\" && key !== \"length\" && key !== \"name\",\n );\n\n const matchedModuleKey = moduleKeys.find((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(Modules, key);\n\n if (!descriptor?.get) return false;\n\n const selectedModule = descriptor.get.call(Modules);\n\n return path.toLowerCase().startsWith(selectedModule.pageUrl?.toLowerCase());\n });\n\n if (!matchedModuleKey) return undefined;\n\n const descriptor = Object.getOwnPropertyDescriptor(Modules, matchedModuleKey);\n return descriptor?.get?.call(Modules);\n };\n\n const currentUser = dehydratedUser ? rehydrate<UserInterface>(Modules.User, dehydratedUser) : null;\n\n const company = currentUser?.company ?? null;\n\n const setUser = (user?: UserInterface): void => {\n if (user) setDehydratedUser(user.dehydrate() as any);\n else setDehydratedUser(null);\n };\n\n const hasRole = (roleId: string): boolean => {\n if (!currentUser) return false;\n\n return !!currentUser.roles?.some((userRole: RoleInterface) => userRole.id === roleId);\n };\n\n const hasAccesToFeature = (featureIdentifier: string): boolean => {\n if (hasRole(getRoleId().Administrator)) return true;\n if (!company) return false;\n\n return company.features.some((feature: FeatureInterface) => feature.id === featureIdentifier);\n };\n\n function hasPermissionToModule<M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: M extends ModuleWithPermissions ? any : never;\n }): boolean {\n if (!currentUser) return false;\n\n if (!!params.module.feature && !hasAccesToFeature(params.module.feature)) return false;\n\n return checkPermissions({ module: params.module, action: params.action, data: params.data, user: currentUser });\n }\n\n function hasPermissionToModules<M extends ModuleWithPermissions>(params: {\n modules: M[];\n action: Action;\n data?: M extends ModuleWithPermissions ? any : never;\n }): boolean {\n if (!currentUser) return false;\n\n if (!params.modules.every((module) => !module.feature || hasAccesToFeature(module.feature))) return false;\n\n return params.modules.every((module) =>\n checkPermissions({ module: module, action: params.action, data: params.data, user: currentUser }),\n );\n }\n\n function hasPermissionToPath(path: string): boolean {\n if (!currentUser) return false;\n if (path === \"#\" || path === \"/\") return true;\n\n const selectedModule = matchUrlToModule({ path: path });\n if (!selectedModule) return true;\n\n const response = hasPermissionToModule({ module: selectedModule, action: Action.Read });\n\n return response;\n }\n\n return (\n <CurrentUserContext.Provider\n value={{\n currentUser: currentUser,\n company: company,\n setUser: setUser,\n hasPermissionToModule: hasPermissionToModule,\n hasPermissionToModules: hasPermissionToModules,\n hasPermissionToPath: hasPermissionToPath,\n hasAccesToFeature: hasAccesToFeature,\n matchUrlToModule: matchUrlToModule,\n hasRole: hasRole,\n }}\n >\n {children}\n </CurrentUserContext.Provider>\n );\n};\n\nexport function useCurrentUserContext<T extends UserInterface = UserInterface>(): CurrentUserContextType<T> {\n const context = useContext(CurrentUserContext);\n if (context === undefined) {\n throw new Error(\"useCurrentUserContext must be used within a UserProvider\");\n }\n return context as unknown as CurrentUserContextType<T>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-RAF7PNLG.js","../src/contexts/SharedContext.tsx","../src/features/user/contexts/CurrentUserContext.tsx"],"names":["createContext","descriptor","path","jsx","useContext"],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-RAF7PNLG.js","sourcesContent":[null,"import { createContext, ReactNode, useContext } from \"react\";\nimport { BreadcrumbItemData } from \"../interfaces\";\n\nconst SharedContext = createContext<{\n breadcrumbs: BreadcrumbItemData[];\n title: {\n type: string | string[];\n element?: string;\n functions?: ReactNode;\n };\n} | null>(null);\n\ninterface SharedProviderProps {\n children: ReactNode;\n value: {\n breadcrumbs: BreadcrumbItemData[];\n title: {\n type: string;\n element?: string;\n functions?: ReactNode;\n };\n };\n}\n\nexport const SharedProvider = ({ children, value }: SharedProviderProps) => {\n return <SharedContext.Provider value={value}>{children}</SharedContext.Provider>;\n};\n\nexport const useSharedContext = () => {\n const context = useContext(SharedContext);\n if (!context) {\n throw new Error(\"useSharedContext must be used within a SharedProvider\");\n }\n return context;\n};\n","\"use client\";\n\nimport { getCookie } from \"cookies-next\";\nimport { useAtom } from \"jotai\";\nimport { atomWithStorage } from \"jotai/utils\";\nimport { usePathname } from \"next/navigation\";\nimport React, { createContext, useContext, useEffect } from \"react\";\nimport { Modules, rehydrate } from \"../../../core\";\nimport { Action, checkPermissions, ModuleWithPermissions } from \"../../../permissions\";\nimport { getRoleId } from \"../../../roles\";\nimport { CompanyInterface } from \"../../company\";\nimport { FeatureInterface } from \"../../feature\";\nimport { RoleInterface } from \"../../role\";\nimport { UserInterface } from \"../data\";\n\nexport interface CurrentUserContextType<T extends UserInterface = UserInterface> {\n currentUser: T | null;\n company: CompanyInterface | null;\n setUser: (user?: T) => void;\n hasPermissionToModule: <M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }) => boolean;\n hasPermissionToModules: <M extends ModuleWithPermissions>(params: {\n modules: M[];\n action: Action;\n data?: any;\n }) => boolean;\n hasPermissionToPath: (path: string) => boolean;\n hasAccesToFeature: (featureIdentifier: string) => boolean;\n matchUrlToModule: (prarms?: { path: string }) => ModuleWithPermissions | undefined;\n hasRole: (roleId: string) => boolean;\n}\n\nconst userAtom = atomWithStorage(\"user\", null);\n\nconst CurrentUserContext = createContext<CurrentUserContextType | undefined>(undefined);\n\nexport const CurrentUserProvider = ({ children }: { children: React.ReactNode }) => {\n const path = usePathname();\n\n const [dehydratedUser, setDehydratedUser] = useAtom(userAtom);\n\n useEffect(() => {\n const token = getCookie(\"token\");\n if (!token && dehydratedUser) setDehydratedUser(null);\n }, [dehydratedUser, setDehydratedUser]);\n\n const matchUrlToModule = (params?: { path: string }): ModuleWithPermissions | undefined => {\n const moduleKeys = Object.getOwnPropertyNames(Modules).filter(\n (key) => key !== \"prototype\" && key !== \"_factory\" && key !== \"length\" && key !== \"name\",\n );\n\n const matchedModuleKey = moduleKeys.find((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(Modules, key);\n\n if (!descriptor?.get) return false;\n\n const selectedModule = descriptor.get.call(Modules);\n\n return path.toLowerCase().startsWith(selectedModule.pageUrl?.toLowerCase());\n });\n\n if (!matchedModuleKey) return undefined;\n\n const descriptor = Object.getOwnPropertyDescriptor(Modules, matchedModuleKey);\n return descriptor?.get?.call(Modules);\n };\n\n const currentUser = dehydratedUser ? rehydrate<UserInterface>(Modules.User, dehydratedUser) : null;\n\n const company = currentUser?.company ?? null;\n\n const setUser = (user?: UserInterface): void => {\n if (user) setDehydratedUser(user.dehydrate() as any);\n else setDehydratedUser(null);\n };\n\n const hasRole = (roleId: string): boolean => {\n if (!currentUser) return false;\n\n return !!currentUser.roles?.some((userRole: RoleInterface) => userRole.id === roleId);\n };\n\n const hasAccesToFeature = (featureIdentifier: string): boolean => {\n if (hasRole(getRoleId().Administrator)) return true;\n if (!company) return false;\n\n return company.features.some((feature: FeatureInterface) => feature.id === featureIdentifier);\n };\n\n function hasPermissionToModule<M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: M extends ModuleWithPermissions ? any : never;\n }): boolean {\n if (!currentUser) return false;\n\n if (!!params.module.feature && !hasAccesToFeature(params.module.feature)) return false;\n\n return checkPermissions({ module: params.module, action: params.action, data: params.data, user: currentUser });\n }\n\n function hasPermissionToModules<M extends ModuleWithPermissions>(params: {\n modules: M[];\n action: Action;\n data?: M extends ModuleWithPermissions ? any : never;\n }): boolean {\n if (!currentUser) return false;\n\n if (!params.modules.every((module) => !module.feature || hasAccesToFeature(module.feature))) return false;\n\n return params.modules.every((module) =>\n checkPermissions({ module: module, action: params.action, data: params.data, user: currentUser }),\n );\n }\n\n function hasPermissionToPath(path: string): boolean {\n if (!currentUser) return false;\n if (path === \"#\" || path === \"/\") return true;\n\n const selectedModule = matchUrlToModule({ path: path });\n if (!selectedModule) return true;\n\n const response = hasPermissionToModule({ module: selectedModule, action: Action.Read });\n\n return response;\n }\n\n return (\n <CurrentUserContext.Provider\n value={{\n currentUser: currentUser,\n company: company,\n setUser: setUser,\n hasPermissionToModule: hasPermissionToModule,\n hasPermissionToModules: hasPermissionToModules,\n hasPermissionToPath: hasPermissionToPath,\n hasAccesToFeature: hasAccesToFeature,\n matchUrlToModule: matchUrlToModule,\n hasRole: hasRole,\n }}\n >\n {children}\n </CurrentUserContext.Provider>\n );\n};\n\nexport function useCurrentUserContext<T extends UserInterface = UserInterface>(): CurrentUserContextType<T> {\n const context = useContext(CurrentUserContext);\n if (context === undefined) {\n throw new Error(\"useCurrentUserContext must be used within a UserProvider\");\n }\n return context as unknown as CurrentUserContextType<T>;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-RUR22SVM.js","../src/components/errors/errorToast.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;ACFA,gCAAsB;AAEf,SAAS,UAAA,CAAW,MAAA,EAAwC;AACjE,EAAA,aAAA,CAAM,KAAA,kCAAM,MAAA,2BAAQ,OAAA,UAAS,SAAA,EAAS;AAAA,IACpC,WAAA,EAAa,MAAA,CAAO,MAAA,WAAiB,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,KAAK;AAAA,EACzF,CAAC,CAAA;AACH;AAJgB,qCAAA,UAAA,EAAA,YAAA,CAAA;ADQhB;AACA;AACE;AACF,gCAAC","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-RUR22SVM.js","sourcesContent":[null,"// import { toast } from \"@/hooks/use-toast\";\n\nimport { toast } from \"sonner\";\n\nexport function errorToast(params: { title?: string; error: any }) {\n toast.error(params?.title ?? \"Error\", {\n description: params.error instanceof Error ? params.error.message : String(params.error),\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-TEGF6ZWG.js","../src/core/factories/JsonApiDataFactory.ts","../src/core/utils/translateResponse.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACHO,IAAM,mBAAA,EAAN,MAAyB;AAAA,EAJhC,OAIgC;AAAA,IAAA,qCAAA,IAAA,EAAA,oBAAA,CAAA;AAAA,EAAA;AAAA,EAC9B,OAAc,MAAA,CAAO,QAAA,EAAuC,IAAA,EAAgB;AAC1E,IAAA,MAAM,aAAA,EAAe,kCAAA,CAAkB,GAAA,CAAI,QAAQ,CAAA;AAEnD,IAAA,MAAM,SAAA,EAAW,IAAI,YAAA,CAAa,CAAA;AAClC,IAAA,OAAO,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AAAA,EACpC;AACF,CAAA;ADOA;AACA;AETO,SAAS,aAAA,CAA0C,MAAA,EAG9C;AACV,EAAA,MAAM,aAAA,EAAe,kCAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AAE1D,EAAA,GAAA,CAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,8BAAA,EAAiC,OAAO,MAAA,CAAO,SAAA,IAAa,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AAAA,IAAA;AAC/G,EAAA;AAGF,EAAA;AAEA,EAAA;AACE,IAAA;AAEA,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AAA6B,IAAA;AAG/B,IAAA;AAAO,EAAA;AAEP,IAAA;AACA,IAAA;AAAuB,MAAA;AACA,MAAA;AACrB,IAAA;AAGF,IAAA;AAAO,EAAA;AAEX;AAjCgB;AAuChB;AAOE,EAAA;AAAuC,IAAA;AACjC,IAAA;AACM,IAAA;AACH,IAAA;AACA,EAAA;AAGT,EAAA;AAEA,EAAA;AACE,IAAA;AAAU,MAAA;AACqG,IAAA;AAC/G,EAAA;AAGF,EAAA;AACA,EAAA;AAEA,EAAA;AACE,IAAA;AACA,IAAA;AAAO,EAAA;AAGT,EAAA;AAEA,EAAA;AAEA,EAAA;AACE,IAAA;AAEA,IAAA;AACE,MAAA;AAEA,MAAA;AACE,QAAA;AACA,QAAA;AAA4F,MAAA;AAG9F,MAAA;AACE,QAAA;AACA,QAAA;AAA4F,MAAA;AAC9F,IAAA;AAGF,IAAA;AACE,MAAA;AAEA,MAAA;AACE,QAAA;AACA,QAAA;AACA,QAAA;AAA6B,MAAA;AAG/B,MAAA;AAAgB,IAAA;AAEhB,MAAA;AACA,MAAA;AAAuB,QAAA;AACY,QAAA;AACjC,MAAA;AAGF,MAAA;AAAgB,IAAA;AAClB,EAAA;AAEA,IAAA;AAAe,EAAA;AAGjB,EAAA;AACF;AA3EsB;AFqDtB;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-TEGF6ZWG.js","sourcesContent":[null,"import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { DataClassRegistry } from \"../registry/DataClassRegistry\";\n\nexport class JsonApiDataFactory {\n public static create(classKey: ApiRequestDataTypeInterface, data: any): any {\n const factoryClass = DataClassRegistry.get(classKey);\n\n const instance = new factoryClass() as ApiDataInterface;\n return instance.createJsonApi(data);\n }\n}\n","import { ApiData } from \"../interfaces/ApiData\";\nimport { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../interfaces/ApiResponseInterface\";\nimport { DataClassRegistry } from \"../registry/DataClassRegistry\";\n\n/**\n * Translates raw JSON:API data into typed objects.\n * Does not require API response metadata.\n */\nexport function translateData<T extends ApiDataInterface>(params: {\n classKey: ApiRequestDataTypeInterface;\n data: any;\n}): T | T[] {\n const factoryClass = DataClassRegistry.get(params.classKey);\n\n if (!factoryClass) {\n throw new Error(\n `Class not registered for key: ${typeof params.classKey === \"string\" ? params.classKey : params.classKey.name}`,\n );\n }\n\n const included: any = params.data.included ?? [];\n\n if (Array.isArray(params.data.data)) {\n const responseData: T[] = [];\n\n for (const data of params.data.data) {\n const object = new factoryClass();\n object.rehydrate({ jsonApi: data, included: included, allData: params.data.data });\n responseData.push(object as T);\n }\n\n return responseData as T[];\n } else {\n const responseData = new factoryClass();\n responseData.rehydrate({\n jsonApi: params.data.data,\n included: included,\n });\n\n return responseData as T;\n }\n}\n\n/**\n * Translates a full API response into a typed ApiResponseInterface.\n * Includes pagination support.\n */\nexport async function translateResponse<T extends ApiDataInterface>(params: {\n classKey: ApiRequestDataTypeInterface;\n apiResponse: ApiData;\n companyId?: string;\n language: string;\n paginationHandler?: (endpoint: string) => Promise<ApiResponseInterface>;\n}): Promise<ApiResponseInterface> {\n const response: ApiResponseInterface = {\n ok: true,\n response: 0,\n data: [],\n error: \"\",\n };\n\n const factoryClass = DataClassRegistry.get(params.classKey);\n\n if (!factoryClass) {\n throw new Error(\n `Class not registered for key: ${typeof params.classKey === \"string\" ? params.classKey : params.classKey.name}`,\n );\n }\n\n response.ok = params.apiResponse.ok;\n response.response = params.apiResponse.status;\n\n if (!params.apiResponse.ok) {\n response.error = params.apiResponse?.data?.message ?? params.apiResponse.statusText;\n return response;\n }\n\n if (params.apiResponse.status === 204) return response;\n\n response.raw = params.apiResponse.data;\n\n try {\n const included: any = params.apiResponse.data.included ?? [];\n\n if (params.apiResponse.data.links) {\n response.self = params.apiResponse.data.links.self;\n\n if (params.apiResponse.data.links.next && params.paginationHandler) {\n response.next = params.apiResponse.data.links.next;\n response.nextPage = async () => params.paginationHandler!(params.apiResponse.data.links.next);\n }\n\n if (params.apiResponse.data.links.prev && params.paginationHandler) {\n response.prev = params.apiResponse.data.links.prev;\n response.prevPage = async () => params.paginationHandler!(params.apiResponse.data.links.prev);\n }\n }\n\n if (Array.isArray(params.apiResponse.data.data)) {\n const responseData: T[] = [];\n\n for (const data of params.apiResponse.data.data) {\n const object = new factoryClass();\n object.rehydrate({ jsonApi: data, included: included, allData: params.apiResponse.data.data });\n responseData.push(object as T);\n }\n\n response.data = responseData;\n } else {\n const responseData = new factoryClass();\n responseData.rehydrate({\n jsonApi: params.apiResponse.data.data,\n included: included,\n });\n\n response.data = responseData;\n }\n } catch (e) {\n console.error(e);\n }\n\n return response;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-TMVHSY3Y.js","../src/unified/JsonApiRequest.ts"],"names":[],"mappings":"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","file":"/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-TMVHSY3Y.js","sourcesContent":[null,"import { ApiData } from \"../core/interfaces/ApiData\";\nimport { ApiRequestDataTypeInterface } from \"../core/interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../core/interfaces/ApiResponseInterface\";\nimport { JsonApiDataFactory } from \"../core/factories/JsonApiDataFactory\";\nimport { translateResponse } from \"../core/utils/translateResponse\";\n\n// Type definitions for dynamically imported functions (avoiding typeof import to prevent bundling)\ntype DirectFetchFn = (params: {\n method: string;\n url: string;\n token?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}) => Promise<ApiData>;\n\ntype ServerRequestFn = (params: {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}) => Promise<ApiData>;\n\ntype GetTokenFn = () => Promise<string | undefined>;\n\n// These will be dynamically imported based on environment\nlet _directFetch: DirectFetchFn;\nlet _serverRequest: ServerRequestFn;\nlet _getClientToken: GetTokenFn;\nlet _getServerToken: GetTokenFn;\n\n// Config storage for non-React contexts\nlet _staticConfig: {\n apiUrl: string;\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n} | null = null;\n\n/**\n * Configure the JSON:API client for non-React contexts (e.g., server components).\n * For React contexts, use JsonApiProvider instead.\n */\nexport function configureJsonApi(config: {\n apiUrl: string;\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n}): void {\n _staticConfig = config;\n // Call bootstrapper immediately to register all modules\n if (config.bootstrapper) {\n config.bootstrapper();\n }\n}\n\nasync function getToken(): Promise<string | undefined> {\n if (typeof window === \"undefined\") {\n // Server-side\n if (!_getServerToken) {\n const serverModule = await import(\"../server/token\");\n _getServerToken = serverModule.getServerToken;\n }\n return _getServerToken();\n } else {\n // Client-side\n if (!_getClientToken) {\n const clientModule = await import(\"../client/token\");\n _getClientToken = clientModule.getClientToken;\n }\n return _getClientToken();\n }\n}\n\nasync function makeRequest(params: {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}): Promise<ApiData> {\n if (typeof window !== \"undefined\") {\n // Client-side: use direct fetch\n if (!_directFetch) {\n const clientModule = await import(\"../client/request\");\n _directFetch = clientModule.directFetch;\n }\n return _directFetch({\n method: params.method,\n url: params.url,\n token: params.token,\n body: params.body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: params.additionalHeaders,\n });\n } else {\n // Server-side: use server request with caching\n if (!_serverRequest) {\n const serverModule = await import(\"../server/request\");\n _serverRequest = serverModule.serverRequest;\n }\n return _serverRequest({\n method: params.method,\n url: params.url,\n token: params.token,\n cache: params.cache,\n body: params.body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: params.additionalHeaders,\n });\n }\n}\n\nfunction getApiUrl(): string {\n if (_staticConfig?.apiUrl) {\n return _staticConfig.apiUrl;\n }\n // Fallback to environment variable\n const envUrl = process.env.NEXT_PUBLIC_API_URL;\n if (!envUrl) {\n throw new Error(\"API URL not configured. Use configureJsonApi() or set NEXT_PUBLIC_API_URL environment variable.\");\n }\n return envUrl;\n}\n\nfunction runBootstrapper(): void {\n if (_staticConfig?.bootstrapper) {\n _staticConfig.bootstrapper();\n }\n}\n\nfunction buildUrl(endpoint: string): string {\n const apiUrl = getApiUrl();\n return endpoint.startsWith(\"http\") ? endpoint : `${apiUrl}${endpoint}`;\n}\n\nexport async function JsonApiGet(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n const apiResponse = await makeRequest({\n method: \"GET\",\n url: buildUrl(params.endpoint),\n token,\n cache: params.classKey.cache,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n paginationHandler: async (endpoint: string) =>\n JsonApiGet({\n classKey: params.classKey,\n endpoint,\n companyId: params.companyId,\n language: params.language,\n }),\n });\n}\n\nexport async function JsonApiPost(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n overridesJsonApiCreation?: boolean;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"POST\",\n url: buildUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiPut(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n let body = params.body;\n if (!body) {\n body = {};\n } else {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"PUT\",\n url: buildUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiPatch(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n overridesJsonApiCreation?: boolean;\n responseType?: ApiRequestDataTypeInterface;\n language: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"PATCH\",\n url: buildUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiDelete(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n const apiResponse = await makeRequest({\n method: \"DELETE\",\n url: buildUrl(params.endpoint),\n token,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-TMVHSY3Y.js","../src/unified/JsonApiRequest.ts"],"names":[],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-TMVHSY3Y.js","sourcesContent":[null,"import { ApiData } from \"../core/interfaces/ApiData\";\nimport { ApiRequestDataTypeInterface } from \"../core/interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../core/interfaces/ApiResponseInterface\";\nimport { JsonApiDataFactory } from \"../core/factories/JsonApiDataFactory\";\nimport { translateResponse } from \"../core/utils/translateResponse\";\n\n// Type definitions for dynamically imported functions (avoiding typeof import to prevent bundling)\ntype DirectFetchFn = (params: {\n method: string;\n url: string;\n token?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}) => Promise<ApiData>;\n\ntype ServerRequestFn = (params: {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}) => Promise<ApiData>;\n\ntype GetTokenFn = () => Promise<string | undefined>;\n\n// These will be dynamically imported based on environment\nlet _directFetch: DirectFetchFn;\nlet _serverRequest: ServerRequestFn;\nlet _getClientToken: GetTokenFn;\nlet _getServerToken: GetTokenFn;\n\n// Config storage for non-React contexts\nlet _staticConfig: {\n apiUrl: string;\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n} | null = null;\n\n/**\n * Configure the JSON:API client for non-React contexts (e.g., server components).\n * For React contexts, use JsonApiProvider instead.\n */\nexport function configureJsonApi(config: {\n apiUrl: string;\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n}): void {\n _staticConfig = config;\n // Call bootstrapper immediately to register all modules\n if (config.bootstrapper) {\n config.bootstrapper();\n }\n}\n\nasync function getToken(): Promise<string | undefined> {\n if (typeof window === \"undefined\") {\n // Server-side\n if (!_getServerToken) {\n const serverModule = await import(\"../server/token\");\n _getServerToken = serverModule.getServerToken;\n }\n return _getServerToken();\n } else {\n // Client-side\n if (!_getClientToken) {\n const clientModule = await import(\"../client/token\");\n _getClientToken = clientModule.getClientToken;\n }\n return _getClientToken();\n }\n}\n\nasync function makeRequest(params: {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}): Promise<ApiData> {\n if (typeof window !== \"undefined\") {\n // Client-side: use direct fetch\n if (!_directFetch) {\n const clientModule = await import(\"../client/request\");\n _directFetch = clientModule.directFetch;\n }\n return _directFetch({\n method: params.method,\n url: params.url,\n token: params.token,\n body: params.body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: params.additionalHeaders,\n });\n } else {\n // Server-side: use server request with caching\n if (!_serverRequest) {\n const serverModule = await import(\"../server/request\");\n _serverRequest = serverModule.serverRequest;\n }\n return _serverRequest({\n method: params.method,\n url: params.url,\n token: params.token,\n cache: params.cache,\n body: params.body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: params.additionalHeaders,\n });\n }\n}\n\nfunction getApiUrl(): string {\n if (_staticConfig?.apiUrl) {\n return _staticConfig.apiUrl;\n }\n // Fallback to environment variable\n const envUrl = process.env.NEXT_PUBLIC_API_URL;\n if (!envUrl) {\n throw new Error(\"API URL not configured. Use configureJsonApi() or set NEXT_PUBLIC_API_URL environment variable.\");\n }\n return envUrl;\n}\n\nfunction runBootstrapper(): void {\n if (_staticConfig?.bootstrapper) {\n _staticConfig.bootstrapper();\n }\n}\n\nfunction buildUrl(endpoint: string): string {\n const apiUrl = getApiUrl();\n return endpoint.startsWith(\"http\") ? endpoint : `${apiUrl}${endpoint}`;\n}\n\nexport async function JsonApiGet(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n const apiResponse = await makeRequest({\n method: \"GET\",\n url: buildUrl(params.endpoint),\n token,\n cache: params.classKey.cache,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n paginationHandler: async (endpoint: string) =>\n JsonApiGet({\n classKey: params.classKey,\n endpoint,\n companyId: params.companyId,\n language: params.language,\n }),\n });\n}\n\nexport async function JsonApiPost(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n overridesJsonApiCreation?: boolean;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"POST\",\n url: buildUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiPut(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n let body = params.body;\n if (!body) {\n body = {};\n } else {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"PUT\",\n url: buildUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiPatch(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n overridesJsonApiCreation?: boolean;\n responseType?: ApiRequestDataTypeInterface;\n language: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"PATCH\",\n url: buildUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiDelete(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n const apiResponse = await makeRequest({\n method: \"DELETE\",\n url: buildUrl(params.endpoint),\n token,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n"]}
|