@lasterp/shared 1.0.0-alpha.1 → 1.0.0-alpha.2

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/index.cjs CHANGED
@@ -5,7 +5,6 @@ var react = require('react');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var reactQuery = require('@tanstack/react-query');
7
7
 
8
- // src/client/core.ts
9
8
  async function request(baseUrl, endpoint, options = {}, auth) {
10
9
  const url = `${baseUrl}${endpoint}`;
11
10
  const headers = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/core.ts","../src/providers/frappe.tsx","../src/client/hooks.tsx","../src/client/storage.ts","../src/design/page/api.ts","../src/utils/catalog.ts","../src/utils/types.ts","../src/lasterp/shop/api.ts","../src/lasterp/shop/hooks.tsx"],"names":["camelizeKeys","decamelizeKeys","createContext","setToken","useState","setApiKey","useEffect","jsx","useContext","useQuery"],"mappings":";;;;;;;;AAGA,eAAe,QACb,OAAA,EACA,QAAA,EACA,OAAA,GAAuB,IACvB,IAAA,EACY;AACZ,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA;AAEjC,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,cAAA,EAAgB,kBAAA;AAAA,IAChB,MAAA,EAAQ,kBAAA;AAAA,IACR,GAAI,OAAA,CAAQ;AAAA,GACd;AAEA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,EACjD,CAAA,MAAA,IAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,OAAA,CAAQ,eAAe,IAAI,CAAA,MAAA,EAAS,IAAA,CAAK,OAAO,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,EAC3E;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAChC,GAAG,OAAA;AAAA,IACH,OAAA;AAAA,IACA,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,OAAA,GAA+B,MAAM,QAAA,CAAS,IAAA,EAAK;AAEzD,EAAA,IAAI,CAAC,QAAA,CAAS,EAAA,IAAM,OAAA,CAAQ,GAAA,EAAK;AAE/B,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,cAAA,IAAkB,OAAA,CAAQ,GAAA,IAAO,gBAAA;AAC9D,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,YAAY,CAAA;AAEpC,IAAA,KAAA,CAAM,OAAA,GAAU,YAAA;AAChB,IAAA,KAAA,CAAM,aAAa,QAAA,CAAS,MAAA;AAE5B,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,KAAA,CAAM,MAAM,OAAA,CAAQ,GAAA;AAAA,IACtB;AAEA,IAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,MAAA,KAAA,CAAM,iBAAiB,OAAA,CAAQ,gBAAA;AAAA,IACjC;AAEA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,KAAA,CAAM,UAAU,OAAA,CAAQ,QAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,KAAA;AAAA,EACR;AAEA,EAAA,MAAM,MAAA,GAAS,QAAQ,OAAA,IAAW,OAAA;AAClC,EAAA,OAAOA,mBAAa,MAAM,CAAA;AAC5B;AAEA,eAAsB,UAAA,CACpB,OAAA,EACA,MAAA,EACA,IAAA,EACA,IAAA,EACY;AACZ,EAAA,MAAM,SAAA,GAAYC,oBAAA,CAAe,IAAA,IAAQ,EAAE,CAAA;AAE3C,EAAA,OAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,eAAe,MAAM,CAAA,CAAA;AAAA,IACrB;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,SAAS;AAAA,KAChC;AAAA,IACA;AAAA,GACF;AACF;AAEA,eAAsB,aAAA,CACpB,OAAA,EACA,MAAA,EACA,IAAA,EACA,IAAA,EACY;AACZ,EAAA,MAAM,SAAA,GAAYA,oBAAA,CAAe,IAAA,IAAQ,EAAE,CAAA;AAC3C,EAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AAExC,EAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAClD,IAAA,WAAA,CAAY,MAAA;AAAA,MACV,GAAA;AAAA,MACA,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK;AAAA,KAC1D;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,WAAW,CAAA,YAAA,EAAe,MAAM,CAAA,CAAA,EAAI,WAAA,CAAY,UAAU,CAAA,CAAA;AAChE,EAAA,OAAO,QAAW,OAAA,EAAS,QAAA,EAAU,EAAE,MAAA,EAAQ,KAAA,IAAS,IAAI,CAAA;AAC9D;AAEA,eAAsB,OAAA,CACpB,OAAA,EACA,MAAA,EAQA,IAAA,EACc;AACd,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,MAAA,GAAS,CAAC,MAAM,CAAA;AAAA,IAChB,UAAU,EAAC;AAAA,IACX,OAAA,GAAU,eAAA;AAAA,IACV,UAAA,GAAa,CAAA;AAAA,IACb,eAAA,GAAkB;AAAA,GACpB,GAAI,MAAA;AAEJ,EAAA,MAAM,YAAA,GAAeA,qBAAe,OAAO,CAAA;AAE3C,EAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB;AAAA,IACtC,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,IAC7B,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA;AAAA,IACpC,QAAA,EAAU,OAAA;AAAA,IACV,WAAA,EAAa,WAAW,QAAA,EAAS;AAAA,IACjC,iBAAA,EAAmB,gBAAgB,QAAA;AAAS,GAC7C,CAAA;AAED,EAAA,MAAM,WAAW,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA,EAAI,WAAA,CAAY,UAAU,CAAA,CAAA;AACnE,EAAA,MAAM,WAAW,MAAM,OAAA,CAAuB,SAAS,QAAA,EAAU,IAAI,IAAI,CAAA;AACzE,EAAA,OAAO,QAAA,CAAS,QAAQ,EAAC;AAC3B;AAEA,eAAsB,MAAA,CACpB,OAAA,EACA,OAAA,EACA,IAAA,EACA,IAAA,EACY;AACZ,EAAA,MAAM,WAAW,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AACrE,EAAA,MAAM,WAAW,MAAM,OAAA,CAAqB,SAAS,QAAA,EAAU,IAAI,IAAI,CAAA;AACvE,EAAA,OAAO,QAAA,CAAS,IAAA;AAClB;AAEA,eAAsB,SAAA,CACpB,OAAA,EACA,OAAA,EACA,GAAA,EACA,IAAA,EACY;AACZ,EAAA,MAAM,QAAA,GAAWA,qBAAe,GAAG,CAAA;AACnC,EAAA,MAAM,QAAA,GAAW,iBAAiB,OAAO,CAAA,CAAA;AACzC,EAAA,MAAM,WAAW,MAAM,OAAA;AAAA,IACrB,OAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAQ;AAAA,KAC/B;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,QAAA,CAAS,IAAA;AAClB;AAEA,eAAsB,SAAA,CACpB,OAAA,EACA,OAAA,EACA,IAAA,EACA,KACA,IAAA,EACY;AACZ,EAAA,MAAM,QAAA,GAAWA,qBAAe,GAAG,CAAA;AACnC,EAAA,MAAM,WAAW,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AACrE,EAAA,MAAM,WAAW,MAAM,OAAA;AAAA,IACrB,OAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAQ;AAAA,KAC/B;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,QAAA,CAAS,IAAA;AAClB;AAEA,eAAsB,SAAA,CACpB,OAAA,EACA,OAAA,EACA,IAAA,EACA,IAAA,EACe;AACf,EAAA,MAAM,WAAW,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AACrE,EAAA,MAAM,OAAA;AAAA,IACJ,OAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,GACF;AACF;AAEA,eAAsB,QAAA,CACpB,OAAA,EACA,OAAA,EACA,IAAA,EACA,WACA,IAAA,EACY;AACZ,EAAA,MAAM,QAAA,GAAW,iBAAiB,OAAO,CAAA,CAAA,EAAI,mBAAmB,IAAI,CAAC,aAAa,SAAS,CAAA,EAAA,CAAA;AAC3F,EAAA,MAAM,WAAW,MAAM,OAAA;AAAA,IACrB,OAAA;AAAA,IACA,QAAA;AAAA,IACA,EAAC;AAAA,IACD;AAAA,GACF;AACA,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA;AAErC,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,OAAA,EAAU,SAAS,CAAA,yBAAA,EAA4B,OAAO,IAAI,IAAI,CAAA,CAAA;AAAA,KAChE;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,eAAsB,SACpB,OAAA,EACA,OAAA,EACA,IAAA,EACA,SAAA,EACA,OACA,IAAA,EACY;AACZ,EAAA,OAAO,SAAA,CAAa,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,EAAE,CAAC,SAAS,GAAG,KAAA,EAAM,EAAG,IAAI,CAAA;AAC1E;AAEA,eAAsB,SACpB,OAAA,EACA,OAAA,EACA,OAAA,GAA+B,IAC/B,IAAA,EACiB;AACjB,EAAA,OAAO,UAAA;AAAA,IACL,OAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA,MACE,OAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,eAAsB,cAAA,CACpB,SACA,IAAA,EACc;AACd,EAAA,OAAO,aAAA,CAAc,OAAA,EAAS,6BAAA,EAA+B,IAAI,IAAI,CAAA;AACvE;ACvPA,IAAM,aAAA,GAAgBC,oBAAyC,IAAI,CAAA;AAc5D,SAAS,cAAA,CAAe;AAAA,EAC7B,OAAA;AAAA,EACA,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,aAAA;AAAA,EACR,YAAA,GAAe,IAAA;AAAA,EACf,UAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,KAAA,EAAOC,SAAQ,CAAA,GAAIC,eAA6B,YAAY,CAAA;AACnE,EAAA,MAAM,CAAC,MAAA,EAAQC,UAAS,CAAA,GAAID,cAAA;AAAA,IAC1B;AAAA,GACF;AAEA,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,YAAA,IAAgB,CAAC,YAAA,IAAgB,CAAC,iBAAiB,UAAA,EAAY;AACjE,MAAA,OAAA,CAAQ,QAAQ,UAAA,EAAY,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AAC3C,QAAA,IAAI,KAAK,KAAA,EAAO;AACd,UAAAH,SAAAA,CAAS,KAAK,KAAK,CAAA;AAAA,QACrB,CAAA,MAAA,IAAW,KAAK,MAAA,EAAQ;AACtB,UAAAE,UAAAA,CAAU,KAAK,MAAM,CAAA;AAAA,QACvB;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,YAAA,EAAc,aAAA,EAAe,UAAU,CAAC,CAAA;AAE1D,EAAA,MAAM,KAAA,GAA4B;AAAA,IAChC,OAAA;AAAA,IACA,GAAI,KAAA,KAAU,MAAA,IAAa,EAAE,KAAA,EAAM;AAAA,IACnC,GAAI,MAAA,KAAW,MAAA,IAAa,EAAE,MAAA;AAAO,GACvC;AAEA,EAAA,uBACEE,cAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OACrB,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,eAAA,GAAsC;AACpD,EAAA,MAAM,OAAA,GAAUC,iBAAW,aAAa,CAAA;AAExC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACtE;AAEA,EAAA,OAAO,OAAA;AACT;;;AC3DO,SAAS,SAAA,GAAY;AAC1B,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,KAAW,eAAA,EAAgB;AAEnD,EAAA,MAAM,IAAA,GAAoB;AAAA,IACxB,GAAI,KAAA,IAAS,EAAE,KAAA,EAAM;AAAA,IACrB,GAAI,MAAA,IAAU,EAAE,MAAA;AAAO,GACzB;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,CAAU,MAAA,EAAgB,IAAA,KAC9B,WAAkB,OAAA,EAAS,MAAA,EAAQ,MAAM,IAAI,CAAA;AAAA,IAE/C,OAAA,EAAS,CAAU,MAAA,EAAgB,IAAA,KACjC,cAAqB,OAAA,EAAS,MAAA,EAAQ,MAAM,IAAI,CAAA;AAAA,IAElD,SAAS,CAAU,MAAA,KAOb,OAAA,CAAe,OAAA,EAAS,QAAQ,IAAI,CAAA;AAAA,IAE1C,MAAA,EAAQ,CAAU,OAAA,EAAiB,IAAA,KACjC,OAAc,OAAA,EAAS,OAAA,EAAS,MAAM,IAAI,CAAA;AAAA,IAE5C,SAAA,EAAW,CAAU,OAAA,EAAiB,GAAA,KACpC,UAAiB,OAAA,EAAS,OAAA,EAAS,KAAK,IAAI,CAAA;AAAA,IAE9C,SAAA,EAAW,CACT,OAAA,EACA,IAAA,EACA,GAAA,KACG,UAAiB,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,IAAI,CAAA;AAAA,IAEvD,SAAA,EAAW,CAAC,OAAA,EAAiB,IAAA,KAC3B,UAAc,OAAA,EAAS,OAAA,EAAS,MAAM,IAAI,CAAA;AAAA,IAE5C,OAAA;AAAA,IACA;AAAA,GACF;AACF;;;AClDO,IAAM,iBAAA,GAAoC;AAAA,EAC/C,OAAA,EAAS,CAAC,GAAA,KAAgB;AACxB,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAC1C,IAAA,OAAO,YAAA,CAAa,QAAQ,GAAG,CAAA;AAAA,EACjC,CAAA;AAAA,EACA,OAAA,EAAS,CAAC,GAAA,EAAa,KAAA,KAAkB;AACvC,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,YAAA,CAAa,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACjC,CAAA;AAAA,EACA,UAAA,EAAY,CAAC,GAAA,KAAgB;AAC3B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,EAC7B;AACF;AAEA,IAAI,cAAA,GAAiC,iBAAA;AAE9B,SAAS,kBAAkB,OAAA,EAAyB;AACzD,EAAA,cAAA,GAAiB,OAAA;AACnB;AAEO,SAAS,iBAAA,GAAoC;AAClD,EAAA,OAAO,cAAA;AACT;AAEA,IAAM,SAAA,GAAY,cAAA;AAClB,IAAM,WAAA,GAAc,gBAAA;AACpB,IAAM,cAAA,GAAiB,mBAAA;AAEhB,SAAS,QAAA,GAAmD;AACjE,EAAA,OAAO,cAAA,CAAe,QAAQ,SAAS,CAAA;AACzC;AAEO,SAAS,SAAS,KAAA,EAAqC;AAC5D,EAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,SAAA,EAAW,KAAK,CAAA;AAChD;AAEO,SAAS,UAAA,GAAmC;AACjD,EAAA,OAAO,cAAA,CAAe,WAAW,SAAS,CAAA;AAC5C;AAEA,eAAsB,SAAA,GAA6D;AACjF,EAAA,MAAM,GAAA,GAAM,MAAM,cAAA,CAAe,OAAA,CAAQ,WAAW,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,OAAA,CAAQ,cAAc,CAAA;AAE1D,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,MAAA,EAAQ,OAAO,IAAA;AAE5B,EAAA,OAAO,EAAE,KAAK,MAAA,EAAO;AACvB;AAEA,eAAsB,SAAA,CAAU,KAAa,MAAA,EAA+B;AAC1E,EAAA,MAAM,cAAA,CAAe,OAAA,CAAQ,WAAA,EAAa,GAAG,CAAA;AAC7C,EAAA,MAAM,cAAA,CAAe,OAAA,CAAQ,cAAA,EAAgB,MAAM,CAAA;AACrD;AAEA,eAAsB,WAAA,GAA6B;AACjD,EAAA,MAAM,cAAA,CAAe,WAAW,WAAW,CAAA;AAC3C,EAAA,MAAM,cAAA,CAAe,WAAW,cAAc,CAAA;AAChD;AAEA,eAAsB,SAAA,GAA2B;AAC/C,EAAA,MAAM,UAAA,EAAW;AACjB,EAAA,MAAM,WAAA,EAAY;AACpB;AAEA,eAAsB,eAAA,GAAoC;AACxD,EAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,EAAS;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,EAAA,OAAO,CAAC,CAAC,KAAA,IAAS,CAAC,CAAC,MAAA;AACtB;;;ACvEA,eAAsB,OAAA,CACpB,OAAA,EACA,IAAA,EACA,IAAA,EACe;AACf,EAAA,OAAO,MAAA,CAAa,OAAA,EAAS,aAAA,EAAe,IAAA,EAAM,IAAI,CAAA;AACxD;;;ACRO,SAAS,cAAc,WAAA,EAA0B;AACtD,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,WAAA,CAAY,WAAA;AACrB;;;ACPO,SAAS,gBAAA,CAAiB,MAAc,IAAA,EAAuB;AACpE,EAAA,OAAO,IAAA,CAAK,cAAc,IAAA,EAAM,MAAA,EAAW,EAAE,WAAA,EAAa,QAAA,EAAU,CAAA,KAAM,CAAA;AAC5E;;;ACEA,eAAsB,cAAA,CACpB,OAAA,EACA,MAAA,EAIA,IAAA,EACsB;AACtB,EAAA,OAAO,UAAA;AAAA,IACL,OAAA;AAAA,IACA,sDAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,eAAsB,iBAAA,CACpB,OAAA,EACA,WAAA,EACA,IAAA,EACyB;AACzB,EAAA,OAAO,UAAA;AAAA,IACL,OAAA;AAAA,IACA,yDAAA;AAAA,IACA,EAAE,WAAA,EAAY;AAAA,IACd;AAAA,GACF;AACF;ACxBO,SAAS,cAAA,CACd,QAIA,OAAA,EAIA;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,SAAA,EAAU;AAEpC,EAAA,OAAOC,mBAAA,CAA6B;AAAA,IAClC,QAAA,EAAU,CAAC,cAAA,EAAgB,MAAM,CAAA;AAAA,IACjC,OAAA,EAAS,MAAM,cAAA,CAAe,OAAA,EAAS,QAAQ,IAAI,CAAA;AAAA,IACnD,GAAG;AAAA,GACJ,CAAA;AACH;AAEO,SAAS,iBAAA,CACd,aACA,OAAA,EAIA;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,SAAA,EAAU;AAEpC,EAAA,OAAOA,mBAAA,CAAgC;AAAA,IACrC,QAAA,EAAU,CAAC,iBAAA,EAAmB,WAAW,CAAA;AAAA,IACzC,OAAA,EAAS,MAAM,iBAAA,CAAkB,OAAA,EAAS,aAAa,IAAI,CAAA;AAAA,IAC3D,OAAA,EAAS,CAAC,CAAC,WAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH","file":"index.cjs","sourcesContent":["import { camelizeKeys, decamelizeKeys } from 'humps';\nimport type { FrappeResponse, FrappeError, AuthOptions } from './types';\n\nasync function request<T = any>(\n baseUrl: string,\n endpoint: string,\n options: RequestInit = {},\n auth?: AuthOptions\n): Promise<T> {\n const url = `${baseUrl}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(options.headers as Record<string, string>),\n };\n\n if (auth?.token) {\n headers['Authorization'] = `Bearer ${auth.token}`;\n } else if (auth?.apiKey) {\n headers['Authorization'] = `token ${auth.apiKey.key}:${auth.apiKey.secret}`;\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n credentials: 'include',\n });\n\n const rawData: FrappeResponse<any> = await response.json();\n\n if (!response.ok || rawData.exc) {\n // Create a proper Error object for better serialization in Next.js\n const errorMessage = rawData._error_message || rawData.exc || 'Request failed';\n const error = new Error(errorMessage) as Error & FrappeError;\n\n error.message = errorMessage;\n error.statusCode = response.status;\n\n if (rawData.exc) {\n error.exc = rawData.exc;\n }\n\n if (rawData._server_messages) {\n error.serverMessages = rawData._server_messages;\n }\n\n if (rawData.exc_type) {\n error.excType = rawData.exc_type;\n }\n\n throw error;\n }\n\n const result = rawData.message ?? rawData;\n return camelizeKeys(result) as T;\n}\n\nexport async function frappeCall<T = any>(\n baseUrl: string,\n method: string,\n args?: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeArgs = decamelizeKeys(args ?? {});\n\n return request<T>(\n baseUrl,\n `/api/method/${method}`,\n {\n method: 'POST',\n body: JSON.stringify(snakeArgs),\n },\n auth\n );\n}\n\nexport async function frappeCallGet<T = any>(\n baseUrl: string,\n method: string,\n args?: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeArgs = decamelizeKeys(args ?? {});\n const queryParams = new URLSearchParams();\n\n Object.entries(snakeArgs).forEach(([key, value]) => {\n queryParams.append(\n key,\n typeof value === 'string' ? value : JSON.stringify(value)\n );\n });\n\n const endpoint = `/api/method/${method}?${queryParams.toString()}`;\n return request<T>(baseUrl, endpoint, { method: 'GET' }, auth);\n}\n\nexport async function getList<T = any>(\n baseUrl: string,\n params: {\n doctype: string;\n fields?: string[];\n filters?: Record<string, any>;\n orderBy?: string;\n limitStart?: number;\n limitPageLength?: number;\n },\n auth?: AuthOptions\n): Promise<T[]> {\n const {\n doctype,\n fields = ['name'],\n filters = {},\n orderBy = 'modified desc',\n limitStart = 0,\n limitPageLength = 20,\n } = params;\n\n const snakeFilters = decamelizeKeys(filters);\n\n const queryParams = new URLSearchParams({\n fields: JSON.stringify(fields),\n filters: JSON.stringify(snakeFilters),\n order_by: orderBy,\n limit_start: limitStart.toString(),\n limit_page_length: limitPageLength.toString(),\n });\n\n const endpoint = `/api/resource/${doctype}?${queryParams.toString()}`;\n const response = await request<{ data: T[] }>(baseUrl, endpoint, {}, auth);\n return response.data || [];\n}\n\nexport async function getDoc<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n auth?: AuthOptions\n): Promise<T> {\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}`;\n const response = await request<{ data: T }>(baseUrl, endpoint, {}, auth);\n return response.data;\n}\n\nexport async function createDoc<T = any>(\n baseUrl: string,\n doctype: string,\n doc: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeDoc = decamelizeKeys(doc);\n const endpoint = `/api/resource/${doctype}`;\n const response = await request<{ data: T }>(\n baseUrl,\n endpoint,\n {\n method: 'POST',\n body: JSON.stringify(snakeDoc),\n },\n auth\n );\n return response.data;\n}\n\nexport async function updateDoc<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n doc: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeDoc = decamelizeKeys(doc);\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}`;\n const response = await request<{ data: T }>(\n baseUrl,\n endpoint,\n {\n method: 'PUT',\n body: JSON.stringify(snakeDoc),\n },\n auth\n );\n return response.data;\n}\n\nexport async function deleteDoc(\n baseUrl: string,\n doctype: string,\n name: string,\n auth?: AuthOptions\n): Promise<void> {\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}`;\n await request(\n baseUrl,\n endpoint,\n {\n method: 'DELETE',\n },\n auth\n );\n}\n\nexport async function getValue<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n fieldname: string,\n auth?: AuthOptions\n): Promise<T> {\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}?fields=[\"${fieldname}\"]`;\n const response = await request<{ data: Record<string, T> }>(\n baseUrl,\n endpoint,\n {},\n auth\n );\n const value = response.data[fieldname];\n\n if (value === undefined) {\n throw new Error(\n `Field \"${fieldname}\" not found in document \"${doctype}/${name}\"`\n );\n }\n\n return value;\n}\n\nexport async function setValue<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n fieldname: string,\n value: any,\n auth?: AuthOptions\n): Promise<T> {\n return updateDoc<T>(baseUrl, doctype, name, { [fieldname]: value }, auth);\n}\n\nexport async function getCount(\n baseUrl: string,\n doctype: string,\n filters: Record<string, any> = {},\n auth?: AuthOptions\n): Promise<number> {\n return frappeCall<number>(\n baseUrl,\n 'frappe.client.get_count',\n {\n doctype,\n filters,\n },\n auth\n );\n}\n\nexport async function getCurrentUser(\n baseUrl: string,\n auth?: AuthOptions\n): Promise<any> {\n return frappeCallGet(baseUrl, 'frappe.auth.get_logged_user', {}, auth);\n}\n","'use client';\n\nimport { createContext, useContext, useEffect, useState, type ReactNode } from 'react';\n\nexport interface FrappeContextValue {\n baseUrl: string;\n token?: string;\n apiKey?: {\n key: string;\n secret: string;\n };\n}\n\nconst FrappeContext = createContext<FrappeContextValue | null>(null);\n\nexport interface FrappeProviderProps {\n baseUrl: string;\n token?: string;\n apiKey?: {\n key: string;\n secret: string;\n };\n autoLoadAuth?: boolean;\n onLoadAuth?: () => Promise<{ token?: string; apiKey?: { key: string; secret: string } }> | { token?: string; apiKey?: { key: string; secret: string } };\n children: ReactNode;\n}\n\nexport function FrappeProvider({\n baseUrl,\n token: initialToken,\n apiKey: initialApiKey,\n autoLoadAuth = true,\n onLoadAuth,\n children,\n}: FrappeProviderProps) {\n const [token, setToken] = useState<string | undefined>(initialToken);\n const [apiKey, setApiKey] = useState<{ key: string; secret: string } | undefined>(\n initialApiKey\n );\n\n useEffect(() => {\n if (autoLoadAuth && !initialToken && !initialApiKey && onLoadAuth) {\n Promise.resolve(onLoadAuth()).then((auth) => {\n if (auth.token) {\n setToken(auth.token);\n } else if (auth.apiKey) {\n setApiKey(auth.apiKey);\n }\n });\n }\n }, [autoLoadAuth, initialToken, initialApiKey, onLoadAuth]);\n\n const value: FrappeContextValue = {\n baseUrl,\n ...(token !== undefined && { token }),\n ...(apiKey !== undefined && { apiKey }),\n };\n\n return (\n <FrappeContext.Provider value={value}>\n {children}\n </FrappeContext.Provider>\n );\n}\n\nexport function useFrappeConfig(): FrappeContextValue {\n const context = useContext(FrappeContext);\n\n if (!context) {\n throw new Error('useFrappeConfig must be used within FrappeProvider');\n }\n\n return context;\n}\n","'use client';\n\nimport { useFrappeConfig } from '../providers/frappe';\nimport {\n frappeCall as frappeCallCore,\n frappeCallGet as frappeCallGetCore,\n getDoc as getDocCore,\n getList as getListCore,\n createDoc as createDocCore,\n updateDoc as updateDocCore,\n deleteDoc as deleteDocCore,\n} from './core';\nimport type { AuthOptions } from './types';\n\nexport function useFrappe() {\n const { baseUrl, token, apiKey } = useFrappeConfig();\n\n const auth: AuthOptions = {\n ...(token && { token }),\n ...(apiKey && { apiKey }),\n };\n\n return {\n call: <T = any>(method: string, args?: Record<string, any>) =>\n frappeCallCore<T>(baseUrl, method, args, auth),\n\n callGet: <T = any>(method: string, args?: Record<string, any>) =>\n frappeCallGetCore<T>(baseUrl, method, args, auth),\n\n getList: <T = any>(params: {\n doctype: string;\n fields?: string[];\n filters?: Record<string, any>;\n orderBy?: string;\n limitStart?: number;\n limitPageLength?: number;\n }) => getListCore<T>(baseUrl, params, auth),\n\n getDoc: <T = any>(doctype: string, name: string) =>\n getDocCore<T>(baseUrl, doctype, name, auth),\n\n createDoc: <T = any>(doctype: string, doc: Record<string, any>) =>\n createDocCore<T>(baseUrl, doctype, doc, auth),\n\n updateDoc: <T = any>(\n doctype: string,\n name: string,\n doc: Record<string, any>\n ) => updateDocCore<T>(baseUrl, doctype, name, doc, auth),\n\n deleteDoc: (doctype: string, name: string) =>\n deleteDocCore(baseUrl, doctype, name, auth),\n\n baseUrl,\n auth,\n };\n}\n","export interface StorageAdapter {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n}\n\nexport const webStorageAdapter: StorageAdapter = {\n getItem: (key: string) => {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(key);\n },\n setItem: (key: string, value: string) => {\n if (typeof window === 'undefined') return;\n localStorage.setItem(key, value);\n },\n removeItem: (key: string) => {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(key);\n },\n};\n\nlet currentAdapter: StorageAdapter = webStorageAdapter;\n\nexport function setStorageAdapter(adapter: StorageAdapter) {\n currentAdapter = adapter;\n}\n\nexport function getStorageAdapter(): StorageAdapter {\n return currentAdapter;\n}\n\nconst TOKEN_KEY = 'frappe_token';\nconst API_KEY_KEY = 'frappe_api_key';\nconst API_SECRET_KEY = 'frappe_api_secret';\n\nexport function getToken(): string | null | Promise<string | null> {\n return currentAdapter.getItem(TOKEN_KEY);\n}\n\nexport function setToken(token: string): void | Promise<void> {\n return currentAdapter.setItem(TOKEN_KEY, token);\n}\n\nexport function clearToken(): void | Promise<void> {\n return currentAdapter.removeItem(TOKEN_KEY);\n}\n\nexport async function getApiKey(): Promise<{ key: string; secret: string } | null> {\n const key = await currentAdapter.getItem(API_KEY_KEY);\n const secret = await currentAdapter.getItem(API_SECRET_KEY);\n\n if (!key || !secret) return null;\n\n return { key, secret };\n}\n\nexport async function setApiKey(key: string, secret: string): Promise<void> {\n await currentAdapter.setItem(API_KEY_KEY, key);\n await currentAdapter.setItem(API_SECRET_KEY, secret);\n}\n\nexport async function clearApiKey(): Promise<void> {\n await currentAdapter.removeItem(API_KEY_KEY);\n await currentAdapter.removeItem(API_SECRET_KEY);\n}\n\nexport async function clearAuth(): Promise<void> {\n await clearToken();\n await clearApiKey();\n}\n\nexport async function isAuthenticated(): Promise<boolean> {\n const token = await getToken();\n const apiKey = await getApiKey();\n return !!token || !!apiKey;\n}\n","import { getDoc } from '../../client'\nimport type { AuthOptions } from '../../client'\nimport type { Page } from './types'\n\nexport async function getPage(\n baseUrl: string,\n slug: string,\n auth?: AuthOptions\n): Promise<Page> {\n return getDoc<Page>(baseUrl, 'Design Page', slug, auth)\n}\n","import type {ModelNumber} from \"../lasterp\";\n\nexport function toDescription(modelNumber: ModelNumber) {\n if (!modelNumber) {\n return null;\n }\n return modelNumber.simCardType;\n}\n","export function equalsIgnoreCase(str1: string, str2: string): boolean {\n return str1.localeCompare(str2, undefined, { sensitivity: 'accent' }) === 0;\n};\n","import { frappeCall } from '../../client';\nimport type { AuthOptions } from '../../client';\nimport type { ShopContext, ProductContext } from './types';\n\nexport async function getShopContext(\n baseUrl: string,\n params?: {\n categoryName?: string;\n gradeName?: string;\n },\n auth?: AuthOptions\n): Promise<ShopContext> {\n return frappeCall<ShopContext>(\n baseUrl,\n 'lasterp.shop.controllers.shop_controller.get_context',\n params,\n auth\n );\n}\n\nexport async function getProductContext(\n baseUrl: string,\n productName: string,\n auth?: AuthOptions\n): Promise<ProductContext> {\n return frappeCall<ProductContext>(\n baseUrl,\n 'lasterp.shop.controllers.product_controller.get_context',\n { productName },\n auth\n );\n}\n","'use client';\n\nimport { useQuery, type UseQueryOptions } from '@tanstack/react-query';\nimport { useFrappe } from '../../client';\nimport { getShopContext, getProductContext } from './api';\nimport type { ShopContext, ProductContext } from './types';\n\nexport function useShopContext(\n params?: {\n categoryName?: string;\n gradeName?: string;\n },\n options?: Omit<\n UseQueryOptions<ShopContext, Error>,\n 'queryKey' | 'queryFn'\n >\n) {\n const { baseUrl, auth } = useFrappe();\n\n return useQuery<ShopContext, Error>({\n queryKey: ['shop-context', params],\n queryFn: () => getShopContext(baseUrl, params, auth),\n ...options,\n });\n}\n\nexport function useProductContext(\n productName: string,\n options?: Omit<\n UseQueryOptions<ProductContext, Error>,\n 'queryKey' | 'queryFn'\n >\n) {\n const { baseUrl, auth } = useFrappe();\n\n return useQuery<ProductContext, Error>({\n queryKey: ['product-context', productName],\n queryFn: () => getProductContext(baseUrl, productName, auth),\n enabled: !!productName,\n ...options,\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/client/core.ts","../src/client/context.tsx","../src/client/hooks.tsx","../src/client/storage.ts","../src/design/page/api.ts","../src/utils/catalog.ts","../src/utils/types.ts","../src/lasterp/shop/api.ts","../src/lasterp/shop/hooks.tsx"],"names":["camelizeKeys","decamelizeKeys","createContext","setToken","useState","setApiKey","useEffect","jsx","useContext","useQuery"],"mappings":"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","file":"index.cjs","sourcesContent":["import { camelizeKeys, decamelizeKeys } from 'humps';\nimport type { FrappeResponse, FrappeError, AuthOptions } from './types';\n\nasync function request<T = any>(\n baseUrl: string,\n endpoint: string,\n options: RequestInit = {},\n auth?: AuthOptions\n): Promise<T> {\n const url = `${baseUrl}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(options.headers as Record<string, string>),\n };\n\n if (auth?.token) {\n headers['Authorization'] = `Bearer ${auth.token}`;\n } else if (auth?.apiKey) {\n headers['Authorization'] = `token ${auth.apiKey.key}:${auth.apiKey.secret}`;\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n credentials: 'include',\n });\n\n const rawData: FrappeResponse<any> = await response.json();\n\n if (!response.ok || rawData.exc) {\n // Create a proper Error object for better serialization in Next.js\n const errorMessage = rawData._error_message || rawData.exc || 'Request failed';\n const error = new Error(errorMessage) as Error & FrappeError;\n\n error.message = errorMessage;\n error.statusCode = response.status;\n\n if (rawData.exc) {\n error.exc = rawData.exc;\n }\n\n if (rawData._server_messages) {\n error.serverMessages = rawData._server_messages;\n }\n\n if (rawData.exc_type) {\n error.excType = rawData.exc_type;\n }\n\n throw error;\n }\n\n const result = rawData.message ?? rawData;\n return camelizeKeys(result) as T;\n}\n\nexport async function frappeCall<T = any>(\n baseUrl: string,\n method: string,\n args?: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeArgs = decamelizeKeys(args ?? {});\n\n return request<T>(\n baseUrl,\n `/api/method/${method}`,\n {\n method: 'POST',\n body: JSON.stringify(snakeArgs),\n },\n auth\n );\n}\n\nexport async function frappeCallGet<T = any>(\n baseUrl: string,\n method: string,\n args?: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeArgs = decamelizeKeys(args ?? {});\n const queryParams = new URLSearchParams();\n\n Object.entries(snakeArgs).forEach(([key, value]) => {\n queryParams.append(\n key,\n typeof value === 'string' ? value : JSON.stringify(value)\n );\n });\n\n const endpoint = `/api/method/${method}?${queryParams.toString()}`;\n return request<T>(baseUrl, endpoint, { method: 'GET' }, auth);\n}\n\nexport async function getList<T = any>(\n baseUrl: string,\n params: {\n doctype: string;\n fields?: string[];\n filters?: Record<string, any>;\n orderBy?: string;\n limitStart?: number;\n limitPageLength?: number;\n },\n auth?: AuthOptions\n): Promise<T[]> {\n const {\n doctype,\n fields = ['name'],\n filters = {},\n orderBy = 'modified desc',\n limitStart = 0,\n limitPageLength = 20,\n } = params;\n\n const snakeFilters = decamelizeKeys(filters);\n\n const queryParams = new URLSearchParams({\n fields: JSON.stringify(fields),\n filters: JSON.stringify(snakeFilters),\n order_by: orderBy,\n limit_start: limitStart.toString(),\n limit_page_length: limitPageLength.toString(),\n });\n\n const endpoint = `/api/resource/${doctype}?${queryParams.toString()}`;\n const response = await request<{ data: T[] }>(baseUrl, endpoint, {}, auth);\n return response.data || [];\n}\n\nexport async function getDoc<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n auth?: AuthOptions\n): Promise<T> {\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}`;\n const response = await request<{ data: T }>(baseUrl, endpoint, {}, auth);\n return response.data;\n}\n\nexport async function createDoc<T = any>(\n baseUrl: string,\n doctype: string,\n doc: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeDoc = decamelizeKeys(doc);\n const endpoint = `/api/resource/${doctype}`;\n const response = await request<{ data: T }>(\n baseUrl,\n endpoint,\n {\n method: 'POST',\n body: JSON.stringify(snakeDoc),\n },\n auth\n );\n return response.data;\n}\n\nexport async function updateDoc<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n doc: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeDoc = decamelizeKeys(doc);\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}`;\n const response = await request<{ data: T }>(\n baseUrl,\n endpoint,\n {\n method: 'PUT',\n body: JSON.stringify(snakeDoc),\n },\n auth\n );\n return response.data;\n}\n\nexport async function deleteDoc(\n baseUrl: string,\n doctype: string,\n name: string,\n auth?: AuthOptions\n): Promise<void> {\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}`;\n await request(\n baseUrl,\n endpoint,\n {\n method: 'DELETE',\n },\n auth\n );\n}\n\nexport async function getValue<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n fieldname: string,\n auth?: AuthOptions\n): Promise<T> {\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}?fields=[\"${fieldname}\"]`;\n const response = await request<{ data: Record<string, T> }>(\n baseUrl,\n endpoint,\n {},\n auth\n );\n const value = response.data[fieldname];\n\n if (value === undefined) {\n throw new Error(\n `Field \"${fieldname}\" not found in document \"${doctype}/${name}\"`\n );\n }\n\n return value;\n}\n\nexport async function setValue<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n fieldname: string,\n value: any,\n auth?: AuthOptions\n): Promise<T> {\n return updateDoc<T>(baseUrl, doctype, name, { [fieldname]: value }, auth);\n}\n\nexport async function getCount(\n baseUrl: string,\n doctype: string,\n filters: Record<string, any> = {},\n auth?: AuthOptions\n): Promise<number> {\n return frappeCall<number>(\n baseUrl,\n 'frappe.client.get_count',\n {\n doctype,\n filters,\n },\n auth\n );\n}\n\nexport async function getCurrentUser(\n baseUrl: string,\n auth?: AuthOptions\n): Promise<any> {\n return frappeCallGet(baseUrl, 'frappe.auth.get_logged_user', {}, auth);\n}\n","'use client';\n\nimport { createContext, useContext, useEffect, useState, type ReactNode } from 'react';\n\nexport interface FrappeContextValue {\n baseUrl: string;\n token?: string;\n apiKey?: {\n key: string;\n secret: string;\n };\n}\n\nconst FrappeContext = createContext<FrappeContextValue | null>(null);\n\nexport interface FrappeProviderProps {\n baseUrl: string;\n token?: string;\n apiKey?: {\n key: string;\n secret: string;\n };\n autoLoadAuth?: boolean;\n onLoadAuth?: () => Promise<{ token?: string; apiKey?: { key: string; secret: string } }> | { token?: string; apiKey?: { key: string; secret: string } };\n children: ReactNode;\n}\n\nexport function FrappeProvider({\n baseUrl,\n token: initialToken,\n apiKey: initialApiKey,\n autoLoadAuth = true,\n onLoadAuth,\n children,\n}: FrappeProviderProps) {\n const [token, setToken] = useState<string | undefined>(initialToken);\n const [apiKey, setApiKey] = useState<{ key: string; secret: string } | undefined>(\n initialApiKey\n );\n\n useEffect(() => {\n if (autoLoadAuth && !initialToken && !initialApiKey && onLoadAuth) {\n Promise.resolve(onLoadAuth()).then((auth) => {\n if (auth.token) {\n setToken(auth.token);\n } else if (auth.apiKey) {\n setApiKey(auth.apiKey);\n }\n });\n }\n }, [autoLoadAuth, initialToken, initialApiKey, onLoadAuth]);\n\n const value: FrappeContextValue = {\n baseUrl,\n ...(token !== undefined && { token }),\n ...(apiKey !== undefined && { apiKey }),\n };\n\n return (\n <FrappeContext.Provider value={value}>\n {children}\n </FrappeContext.Provider>\n );\n}\n\nexport function useFrappeConfig(): FrappeContextValue {\n const context = useContext(FrappeContext);\n\n if (!context) {\n throw new Error('useFrappeConfig must be used within FrappeProvider');\n }\n\n return context;\n}\n","'use client';\n\nimport { useFrappeConfig } from './context';\nimport {\n frappeCall as frappeCallCore,\n frappeCallGet as frappeCallGetCore,\n getDoc as getDocCore,\n getList as getListCore,\n createDoc as createDocCore,\n updateDoc as updateDocCore,\n deleteDoc as deleteDocCore,\n} from './core';\nimport type { AuthOptions } from './types';\n\nexport function useFrappe() {\n const { baseUrl, token, apiKey } = useFrappeConfig();\n\n const auth: AuthOptions = {\n ...(token && { token }),\n ...(apiKey && { apiKey }),\n };\n\n return {\n call: <T = any>(method: string, args?: Record<string, any>) =>\n frappeCallCore<T>(baseUrl, method, args, auth),\n\n callGet: <T = any>(method: string, args?: Record<string, any>) =>\n frappeCallGetCore<T>(baseUrl, method, args, auth),\n\n getList: <T = any>(params: {\n doctype: string;\n fields?: string[];\n filters?: Record<string, any>;\n orderBy?: string;\n limitStart?: number;\n limitPageLength?: number;\n }) => getListCore<T>(baseUrl, params, auth),\n\n getDoc: <T = any>(doctype: string, name: string) =>\n getDocCore<T>(baseUrl, doctype, name, auth),\n\n createDoc: <T = any>(doctype: string, doc: Record<string, any>) =>\n createDocCore<T>(baseUrl, doctype, doc, auth),\n\n updateDoc: <T = any>(\n doctype: string,\n name: string,\n doc: Record<string, any>\n ) => updateDocCore<T>(baseUrl, doctype, name, doc, auth),\n\n deleteDoc: (doctype: string, name: string) =>\n deleteDocCore(baseUrl, doctype, name, auth),\n\n baseUrl,\n auth,\n };\n}\n","export interface StorageAdapter {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n}\n\nexport const webStorageAdapter: StorageAdapter = {\n getItem: (key: string) => {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(key);\n },\n setItem: (key: string, value: string) => {\n if (typeof window === 'undefined') return;\n localStorage.setItem(key, value);\n },\n removeItem: (key: string) => {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(key);\n },\n};\n\nlet currentAdapter: StorageAdapter = webStorageAdapter;\n\nexport function setStorageAdapter(adapter: StorageAdapter) {\n currentAdapter = adapter;\n}\n\nexport function getStorageAdapter(): StorageAdapter {\n return currentAdapter;\n}\n\nconst TOKEN_KEY = 'frappe_token';\nconst API_KEY_KEY = 'frappe_api_key';\nconst API_SECRET_KEY = 'frappe_api_secret';\n\nexport function getToken(): string | null | Promise<string | null> {\n return currentAdapter.getItem(TOKEN_KEY);\n}\n\nexport function setToken(token: string): void | Promise<void> {\n return currentAdapter.setItem(TOKEN_KEY, token);\n}\n\nexport function clearToken(): void | Promise<void> {\n return currentAdapter.removeItem(TOKEN_KEY);\n}\n\nexport async function getApiKey(): Promise<{ key: string; secret: string } | null> {\n const key = await currentAdapter.getItem(API_KEY_KEY);\n const secret = await currentAdapter.getItem(API_SECRET_KEY);\n\n if (!key || !secret) return null;\n\n return { key, secret };\n}\n\nexport async function setApiKey(key: string, secret: string): Promise<void> {\n await currentAdapter.setItem(API_KEY_KEY, key);\n await currentAdapter.setItem(API_SECRET_KEY, secret);\n}\n\nexport async function clearApiKey(): Promise<void> {\n await currentAdapter.removeItem(API_KEY_KEY);\n await currentAdapter.removeItem(API_SECRET_KEY);\n}\n\nexport async function clearAuth(): Promise<void> {\n await clearToken();\n await clearApiKey();\n}\n\nexport async function isAuthenticated(): Promise<boolean> {\n const token = await getToken();\n const apiKey = await getApiKey();\n return !!token || !!apiKey;\n}\n","import { getDoc } from '../../client'\nimport type { AuthOptions } from '../../client'\nimport type { Page } from './types'\n\nexport async function getPage(\n baseUrl: string,\n slug: string,\n auth?: AuthOptions\n): Promise<Page> {\n return getDoc<Page>(baseUrl, 'Design Page', slug, auth)\n}\n","import type {ModelNumber} from \"../lasterp\";\n\nexport function toDescription(modelNumber: ModelNumber) {\n if (!modelNumber) {\n return null;\n }\n return modelNumber.simCardType;\n}\n","export function equalsIgnoreCase(str1: string, str2: string): boolean {\n return str1.localeCompare(str2, undefined, { sensitivity: 'accent' }) === 0;\n};\n","import { frappeCall } from '../../client';\nimport type { AuthOptions } from '../../client';\nimport type { ShopContext, ProductContext } from './types';\n\nexport async function getShopContext(\n baseUrl: string,\n params?: {\n categoryName?: string;\n gradeName?: string;\n },\n auth?: AuthOptions\n): Promise<ShopContext> {\n return frappeCall<ShopContext>(\n baseUrl,\n 'lasterp.shop.controllers.shop_controller.get_context',\n params,\n auth\n );\n}\n\nexport async function getProductContext(\n baseUrl: string,\n productName: string,\n auth?: AuthOptions\n): Promise<ProductContext> {\n return frappeCall<ProductContext>(\n baseUrl,\n 'lasterp.shop.controllers.product_controller.get_context',\n { productName },\n auth\n );\n}\n","'use client';\n\nimport { useQuery, type UseQueryOptions } from '@tanstack/react-query';\nimport { useFrappe } from '../../client';\nimport { getShopContext, getProductContext } from './api';\nimport type { ShopContext, ProductContext } from './types';\n\nexport function useShopContext(\n params?: {\n categoryName?: string;\n gradeName?: string;\n },\n options?: Omit<\n UseQueryOptions<ShopContext, Error>,\n 'queryKey' | 'queryFn'\n >\n) {\n const { baseUrl, auth } = useFrappe();\n\n return useQuery<ShopContext, Error>({\n queryKey: ['shop-context', params],\n queryFn: () => getShopContext(baseUrl, params, auth),\n ...options,\n });\n}\n\nexport function useProductContext(\n productName: string,\n options?: Omit<\n UseQueryOptions<ProductContext, Error>,\n 'queryKey' | 'queryFn'\n >\n) {\n const { baseUrl, auth } = useFrappe();\n\n return useQuery<ProductContext, Error>({\n queryKey: ['product-context', productName],\n queryFn: () => getProductContext(baseUrl, productName, auth),\n enabled: !!productName,\n ...options,\n });\n}\n"]}
package/dist/index.js CHANGED
@@ -4,7 +4,6 @@ import { createContext, useState, useEffect, useContext } from 'react';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
  import { useQuery } from '@tanstack/react-query';
6
6
 
7
- // src/client/core.ts
8
7
  async function request(baseUrl, endpoint, options = {}, auth) {
9
8
  const url = `${baseUrl}${endpoint}`;
10
9
  const headers = {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/core.ts","../src/providers/frappe.tsx","../src/client/hooks.tsx","../src/client/storage.ts","../src/design/page/api.ts","../src/utils/catalog.ts","../src/utils/types.ts","../src/lasterp/shop/api.ts","../src/lasterp/shop/hooks.tsx"],"names":["setToken","setApiKey"],"mappings":"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","file":"index.js","sourcesContent":["import { camelizeKeys, decamelizeKeys } from 'humps';\nimport type { FrappeResponse, FrappeError, AuthOptions } from './types';\n\nasync function request<T = any>(\n baseUrl: string,\n endpoint: string,\n options: RequestInit = {},\n auth?: AuthOptions\n): Promise<T> {\n const url = `${baseUrl}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(options.headers as Record<string, string>),\n };\n\n if (auth?.token) {\n headers['Authorization'] = `Bearer ${auth.token}`;\n } else if (auth?.apiKey) {\n headers['Authorization'] = `token ${auth.apiKey.key}:${auth.apiKey.secret}`;\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n credentials: 'include',\n });\n\n const rawData: FrappeResponse<any> = await response.json();\n\n if (!response.ok || rawData.exc) {\n // Create a proper Error object for better serialization in Next.js\n const errorMessage = rawData._error_message || rawData.exc || 'Request failed';\n const error = new Error(errorMessage) as Error & FrappeError;\n\n error.message = errorMessage;\n error.statusCode = response.status;\n\n if (rawData.exc) {\n error.exc = rawData.exc;\n }\n\n if (rawData._server_messages) {\n error.serverMessages = rawData._server_messages;\n }\n\n if (rawData.exc_type) {\n error.excType = rawData.exc_type;\n }\n\n throw error;\n }\n\n const result = rawData.message ?? rawData;\n return camelizeKeys(result) as T;\n}\n\nexport async function frappeCall<T = any>(\n baseUrl: string,\n method: string,\n args?: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeArgs = decamelizeKeys(args ?? {});\n\n return request<T>(\n baseUrl,\n `/api/method/${method}`,\n {\n method: 'POST',\n body: JSON.stringify(snakeArgs),\n },\n auth\n );\n}\n\nexport async function frappeCallGet<T = any>(\n baseUrl: string,\n method: string,\n args?: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeArgs = decamelizeKeys(args ?? {});\n const queryParams = new URLSearchParams();\n\n Object.entries(snakeArgs).forEach(([key, value]) => {\n queryParams.append(\n key,\n typeof value === 'string' ? value : JSON.stringify(value)\n );\n });\n\n const endpoint = `/api/method/${method}?${queryParams.toString()}`;\n return request<T>(baseUrl, endpoint, { method: 'GET' }, auth);\n}\n\nexport async function getList<T = any>(\n baseUrl: string,\n params: {\n doctype: string;\n fields?: string[];\n filters?: Record<string, any>;\n orderBy?: string;\n limitStart?: number;\n limitPageLength?: number;\n },\n auth?: AuthOptions\n): Promise<T[]> {\n const {\n doctype,\n fields = ['name'],\n filters = {},\n orderBy = 'modified desc',\n limitStart = 0,\n limitPageLength = 20,\n } = params;\n\n const snakeFilters = decamelizeKeys(filters);\n\n const queryParams = new URLSearchParams({\n fields: JSON.stringify(fields),\n filters: JSON.stringify(snakeFilters),\n order_by: orderBy,\n limit_start: limitStart.toString(),\n limit_page_length: limitPageLength.toString(),\n });\n\n const endpoint = `/api/resource/${doctype}?${queryParams.toString()}`;\n const response = await request<{ data: T[] }>(baseUrl, endpoint, {}, auth);\n return response.data || [];\n}\n\nexport async function getDoc<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n auth?: AuthOptions\n): Promise<T> {\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}`;\n const response = await request<{ data: T }>(baseUrl, endpoint, {}, auth);\n return response.data;\n}\n\nexport async function createDoc<T = any>(\n baseUrl: string,\n doctype: string,\n doc: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeDoc = decamelizeKeys(doc);\n const endpoint = `/api/resource/${doctype}`;\n const response = await request<{ data: T }>(\n baseUrl,\n endpoint,\n {\n method: 'POST',\n body: JSON.stringify(snakeDoc),\n },\n auth\n );\n return response.data;\n}\n\nexport async function updateDoc<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n doc: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeDoc = decamelizeKeys(doc);\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}`;\n const response = await request<{ data: T }>(\n baseUrl,\n endpoint,\n {\n method: 'PUT',\n body: JSON.stringify(snakeDoc),\n },\n auth\n );\n return response.data;\n}\n\nexport async function deleteDoc(\n baseUrl: string,\n doctype: string,\n name: string,\n auth?: AuthOptions\n): Promise<void> {\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}`;\n await request(\n baseUrl,\n endpoint,\n {\n method: 'DELETE',\n },\n auth\n );\n}\n\nexport async function getValue<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n fieldname: string,\n auth?: AuthOptions\n): Promise<T> {\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}?fields=[\"${fieldname}\"]`;\n const response = await request<{ data: Record<string, T> }>(\n baseUrl,\n endpoint,\n {},\n auth\n );\n const value = response.data[fieldname];\n\n if (value === undefined) {\n throw new Error(\n `Field \"${fieldname}\" not found in document \"${doctype}/${name}\"`\n );\n }\n\n return value;\n}\n\nexport async function setValue<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n fieldname: string,\n value: any,\n auth?: AuthOptions\n): Promise<T> {\n return updateDoc<T>(baseUrl, doctype, name, { [fieldname]: value }, auth);\n}\n\nexport async function getCount(\n baseUrl: string,\n doctype: string,\n filters: Record<string, any> = {},\n auth?: AuthOptions\n): Promise<number> {\n return frappeCall<number>(\n baseUrl,\n 'frappe.client.get_count',\n {\n doctype,\n filters,\n },\n auth\n );\n}\n\nexport async function getCurrentUser(\n baseUrl: string,\n auth?: AuthOptions\n): Promise<any> {\n return frappeCallGet(baseUrl, 'frappe.auth.get_logged_user', {}, auth);\n}\n","'use client';\n\nimport { createContext, useContext, useEffect, useState, type ReactNode } from 'react';\n\nexport interface FrappeContextValue {\n baseUrl: string;\n token?: string;\n apiKey?: {\n key: string;\n secret: string;\n };\n}\n\nconst FrappeContext = createContext<FrappeContextValue | null>(null);\n\nexport interface FrappeProviderProps {\n baseUrl: string;\n token?: string;\n apiKey?: {\n key: string;\n secret: string;\n };\n autoLoadAuth?: boolean;\n onLoadAuth?: () => Promise<{ token?: string; apiKey?: { key: string; secret: string } }> | { token?: string; apiKey?: { key: string; secret: string } };\n children: ReactNode;\n}\n\nexport function FrappeProvider({\n baseUrl,\n token: initialToken,\n apiKey: initialApiKey,\n autoLoadAuth = true,\n onLoadAuth,\n children,\n}: FrappeProviderProps) {\n const [token, setToken] = useState<string | undefined>(initialToken);\n const [apiKey, setApiKey] = useState<{ key: string; secret: string } | undefined>(\n initialApiKey\n );\n\n useEffect(() => {\n if (autoLoadAuth && !initialToken && !initialApiKey && onLoadAuth) {\n Promise.resolve(onLoadAuth()).then((auth) => {\n if (auth.token) {\n setToken(auth.token);\n } else if (auth.apiKey) {\n setApiKey(auth.apiKey);\n }\n });\n }\n }, [autoLoadAuth, initialToken, initialApiKey, onLoadAuth]);\n\n const value: FrappeContextValue = {\n baseUrl,\n ...(token !== undefined && { token }),\n ...(apiKey !== undefined && { apiKey }),\n };\n\n return (\n <FrappeContext.Provider value={value}>\n {children}\n </FrappeContext.Provider>\n );\n}\n\nexport function useFrappeConfig(): FrappeContextValue {\n const context = useContext(FrappeContext);\n\n if (!context) {\n throw new Error('useFrappeConfig must be used within FrappeProvider');\n }\n\n return context;\n}\n","'use client';\n\nimport { useFrappeConfig } from '../providers/frappe';\nimport {\n frappeCall as frappeCallCore,\n frappeCallGet as frappeCallGetCore,\n getDoc as getDocCore,\n getList as getListCore,\n createDoc as createDocCore,\n updateDoc as updateDocCore,\n deleteDoc as deleteDocCore,\n} from './core';\nimport type { AuthOptions } from './types';\n\nexport function useFrappe() {\n const { baseUrl, token, apiKey } = useFrappeConfig();\n\n const auth: AuthOptions = {\n ...(token && { token }),\n ...(apiKey && { apiKey }),\n };\n\n return {\n call: <T = any>(method: string, args?: Record<string, any>) =>\n frappeCallCore<T>(baseUrl, method, args, auth),\n\n callGet: <T = any>(method: string, args?: Record<string, any>) =>\n frappeCallGetCore<T>(baseUrl, method, args, auth),\n\n getList: <T = any>(params: {\n doctype: string;\n fields?: string[];\n filters?: Record<string, any>;\n orderBy?: string;\n limitStart?: number;\n limitPageLength?: number;\n }) => getListCore<T>(baseUrl, params, auth),\n\n getDoc: <T = any>(doctype: string, name: string) =>\n getDocCore<T>(baseUrl, doctype, name, auth),\n\n createDoc: <T = any>(doctype: string, doc: Record<string, any>) =>\n createDocCore<T>(baseUrl, doctype, doc, auth),\n\n updateDoc: <T = any>(\n doctype: string,\n name: string,\n doc: Record<string, any>\n ) => updateDocCore<T>(baseUrl, doctype, name, doc, auth),\n\n deleteDoc: (doctype: string, name: string) =>\n deleteDocCore(baseUrl, doctype, name, auth),\n\n baseUrl,\n auth,\n };\n}\n","export interface StorageAdapter {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n}\n\nexport const webStorageAdapter: StorageAdapter = {\n getItem: (key: string) => {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(key);\n },\n setItem: (key: string, value: string) => {\n if (typeof window === 'undefined') return;\n localStorage.setItem(key, value);\n },\n removeItem: (key: string) => {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(key);\n },\n};\n\nlet currentAdapter: StorageAdapter = webStorageAdapter;\n\nexport function setStorageAdapter(adapter: StorageAdapter) {\n currentAdapter = adapter;\n}\n\nexport function getStorageAdapter(): StorageAdapter {\n return currentAdapter;\n}\n\nconst TOKEN_KEY = 'frappe_token';\nconst API_KEY_KEY = 'frappe_api_key';\nconst API_SECRET_KEY = 'frappe_api_secret';\n\nexport function getToken(): string | null | Promise<string | null> {\n return currentAdapter.getItem(TOKEN_KEY);\n}\n\nexport function setToken(token: string): void | Promise<void> {\n return currentAdapter.setItem(TOKEN_KEY, token);\n}\n\nexport function clearToken(): void | Promise<void> {\n return currentAdapter.removeItem(TOKEN_KEY);\n}\n\nexport async function getApiKey(): Promise<{ key: string; secret: string } | null> {\n const key = await currentAdapter.getItem(API_KEY_KEY);\n const secret = await currentAdapter.getItem(API_SECRET_KEY);\n\n if (!key || !secret) return null;\n\n return { key, secret };\n}\n\nexport async function setApiKey(key: string, secret: string): Promise<void> {\n await currentAdapter.setItem(API_KEY_KEY, key);\n await currentAdapter.setItem(API_SECRET_KEY, secret);\n}\n\nexport async function clearApiKey(): Promise<void> {\n await currentAdapter.removeItem(API_KEY_KEY);\n await currentAdapter.removeItem(API_SECRET_KEY);\n}\n\nexport async function clearAuth(): Promise<void> {\n await clearToken();\n await clearApiKey();\n}\n\nexport async function isAuthenticated(): Promise<boolean> {\n const token = await getToken();\n const apiKey = await getApiKey();\n return !!token || !!apiKey;\n}\n","import { getDoc } from '../../client'\nimport type { AuthOptions } from '../../client'\nimport type { Page } from './types'\n\nexport async function getPage(\n baseUrl: string,\n slug: string,\n auth?: AuthOptions\n): Promise<Page> {\n return getDoc<Page>(baseUrl, 'Design Page', slug, auth)\n}\n","import type {ModelNumber} from \"../lasterp\";\n\nexport function toDescription(modelNumber: ModelNumber) {\n if (!modelNumber) {\n return null;\n }\n return modelNumber.simCardType;\n}\n","export function equalsIgnoreCase(str1: string, str2: string): boolean {\n return str1.localeCompare(str2, undefined, { sensitivity: 'accent' }) === 0;\n};\n","import { frappeCall } from '../../client';\nimport type { AuthOptions } from '../../client';\nimport type { ShopContext, ProductContext } from './types';\n\nexport async function getShopContext(\n baseUrl: string,\n params?: {\n categoryName?: string;\n gradeName?: string;\n },\n auth?: AuthOptions\n): Promise<ShopContext> {\n return frappeCall<ShopContext>(\n baseUrl,\n 'lasterp.shop.controllers.shop_controller.get_context',\n params,\n auth\n );\n}\n\nexport async function getProductContext(\n baseUrl: string,\n productName: string,\n auth?: AuthOptions\n): Promise<ProductContext> {\n return frappeCall<ProductContext>(\n baseUrl,\n 'lasterp.shop.controllers.product_controller.get_context',\n { productName },\n auth\n );\n}\n","'use client';\n\nimport { useQuery, type UseQueryOptions } from '@tanstack/react-query';\nimport { useFrappe } from '../../client';\nimport { getShopContext, getProductContext } from './api';\nimport type { ShopContext, ProductContext } from './types';\n\nexport function useShopContext(\n params?: {\n categoryName?: string;\n gradeName?: string;\n },\n options?: Omit<\n UseQueryOptions<ShopContext, Error>,\n 'queryKey' | 'queryFn'\n >\n) {\n const { baseUrl, auth } = useFrappe();\n\n return useQuery<ShopContext, Error>({\n queryKey: ['shop-context', params],\n queryFn: () => getShopContext(baseUrl, params, auth),\n ...options,\n });\n}\n\nexport function useProductContext(\n productName: string,\n options?: Omit<\n UseQueryOptions<ProductContext, Error>,\n 'queryKey' | 'queryFn'\n >\n) {\n const { baseUrl, auth } = useFrappe();\n\n return useQuery<ProductContext, Error>({\n queryKey: ['product-context', productName],\n queryFn: () => getProductContext(baseUrl, productName, auth),\n enabled: !!productName,\n ...options,\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/client/core.ts","../src/client/context.tsx","../src/client/hooks.tsx","../src/client/storage.ts","../src/design/page/api.ts","../src/utils/catalog.ts","../src/utils/types.ts","../src/lasterp/shop/api.ts","../src/lasterp/shop/hooks.tsx"],"names":["setToken","setApiKey"],"mappings":"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","file":"index.js","sourcesContent":["import { camelizeKeys, decamelizeKeys } from 'humps';\nimport type { FrappeResponse, FrappeError, AuthOptions } from './types';\n\nasync function request<T = any>(\n baseUrl: string,\n endpoint: string,\n options: RequestInit = {},\n auth?: AuthOptions\n): Promise<T> {\n const url = `${baseUrl}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(options.headers as Record<string, string>),\n };\n\n if (auth?.token) {\n headers['Authorization'] = `Bearer ${auth.token}`;\n } else if (auth?.apiKey) {\n headers['Authorization'] = `token ${auth.apiKey.key}:${auth.apiKey.secret}`;\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n credentials: 'include',\n });\n\n const rawData: FrappeResponse<any> = await response.json();\n\n if (!response.ok || rawData.exc) {\n // Create a proper Error object for better serialization in Next.js\n const errorMessage = rawData._error_message || rawData.exc || 'Request failed';\n const error = new Error(errorMessage) as Error & FrappeError;\n\n error.message = errorMessage;\n error.statusCode = response.status;\n\n if (rawData.exc) {\n error.exc = rawData.exc;\n }\n\n if (rawData._server_messages) {\n error.serverMessages = rawData._server_messages;\n }\n\n if (rawData.exc_type) {\n error.excType = rawData.exc_type;\n }\n\n throw error;\n }\n\n const result = rawData.message ?? rawData;\n return camelizeKeys(result) as T;\n}\n\nexport async function frappeCall<T = any>(\n baseUrl: string,\n method: string,\n args?: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeArgs = decamelizeKeys(args ?? {});\n\n return request<T>(\n baseUrl,\n `/api/method/${method}`,\n {\n method: 'POST',\n body: JSON.stringify(snakeArgs),\n },\n auth\n );\n}\n\nexport async function frappeCallGet<T = any>(\n baseUrl: string,\n method: string,\n args?: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeArgs = decamelizeKeys(args ?? {});\n const queryParams = new URLSearchParams();\n\n Object.entries(snakeArgs).forEach(([key, value]) => {\n queryParams.append(\n key,\n typeof value === 'string' ? value : JSON.stringify(value)\n );\n });\n\n const endpoint = `/api/method/${method}?${queryParams.toString()}`;\n return request<T>(baseUrl, endpoint, { method: 'GET' }, auth);\n}\n\nexport async function getList<T = any>(\n baseUrl: string,\n params: {\n doctype: string;\n fields?: string[];\n filters?: Record<string, any>;\n orderBy?: string;\n limitStart?: number;\n limitPageLength?: number;\n },\n auth?: AuthOptions\n): Promise<T[]> {\n const {\n doctype,\n fields = ['name'],\n filters = {},\n orderBy = 'modified desc',\n limitStart = 0,\n limitPageLength = 20,\n } = params;\n\n const snakeFilters = decamelizeKeys(filters);\n\n const queryParams = new URLSearchParams({\n fields: JSON.stringify(fields),\n filters: JSON.stringify(snakeFilters),\n order_by: orderBy,\n limit_start: limitStart.toString(),\n limit_page_length: limitPageLength.toString(),\n });\n\n const endpoint = `/api/resource/${doctype}?${queryParams.toString()}`;\n const response = await request<{ data: T[] }>(baseUrl, endpoint, {}, auth);\n return response.data || [];\n}\n\nexport async function getDoc<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n auth?: AuthOptions\n): Promise<T> {\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}`;\n const response = await request<{ data: T }>(baseUrl, endpoint, {}, auth);\n return response.data;\n}\n\nexport async function createDoc<T = any>(\n baseUrl: string,\n doctype: string,\n doc: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeDoc = decamelizeKeys(doc);\n const endpoint = `/api/resource/${doctype}`;\n const response = await request<{ data: T }>(\n baseUrl,\n endpoint,\n {\n method: 'POST',\n body: JSON.stringify(snakeDoc),\n },\n auth\n );\n return response.data;\n}\n\nexport async function updateDoc<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n doc: Record<string, any>,\n auth?: AuthOptions\n): Promise<T> {\n const snakeDoc = decamelizeKeys(doc);\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}`;\n const response = await request<{ data: T }>(\n baseUrl,\n endpoint,\n {\n method: 'PUT',\n body: JSON.stringify(snakeDoc),\n },\n auth\n );\n return response.data;\n}\n\nexport async function deleteDoc(\n baseUrl: string,\n doctype: string,\n name: string,\n auth?: AuthOptions\n): Promise<void> {\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}`;\n await request(\n baseUrl,\n endpoint,\n {\n method: 'DELETE',\n },\n auth\n );\n}\n\nexport async function getValue<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n fieldname: string,\n auth?: AuthOptions\n): Promise<T> {\n const endpoint = `/api/resource/${doctype}/${encodeURIComponent(name)}?fields=[\"${fieldname}\"]`;\n const response = await request<{ data: Record<string, T> }>(\n baseUrl,\n endpoint,\n {},\n auth\n );\n const value = response.data[fieldname];\n\n if (value === undefined) {\n throw new Error(\n `Field \"${fieldname}\" not found in document \"${doctype}/${name}\"`\n );\n }\n\n return value;\n}\n\nexport async function setValue<T = any>(\n baseUrl: string,\n doctype: string,\n name: string,\n fieldname: string,\n value: any,\n auth?: AuthOptions\n): Promise<T> {\n return updateDoc<T>(baseUrl, doctype, name, { [fieldname]: value }, auth);\n}\n\nexport async function getCount(\n baseUrl: string,\n doctype: string,\n filters: Record<string, any> = {},\n auth?: AuthOptions\n): Promise<number> {\n return frappeCall<number>(\n baseUrl,\n 'frappe.client.get_count',\n {\n doctype,\n filters,\n },\n auth\n );\n}\n\nexport async function getCurrentUser(\n baseUrl: string,\n auth?: AuthOptions\n): Promise<any> {\n return frappeCallGet(baseUrl, 'frappe.auth.get_logged_user', {}, auth);\n}\n","'use client';\n\nimport { createContext, useContext, useEffect, useState, type ReactNode } from 'react';\n\nexport interface FrappeContextValue {\n baseUrl: string;\n token?: string;\n apiKey?: {\n key: string;\n secret: string;\n };\n}\n\nconst FrappeContext = createContext<FrappeContextValue | null>(null);\n\nexport interface FrappeProviderProps {\n baseUrl: string;\n token?: string;\n apiKey?: {\n key: string;\n secret: string;\n };\n autoLoadAuth?: boolean;\n onLoadAuth?: () => Promise<{ token?: string; apiKey?: { key: string; secret: string } }> | { token?: string; apiKey?: { key: string; secret: string } };\n children: ReactNode;\n}\n\nexport function FrappeProvider({\n baseUrl,\n token: initialToken,\n apiKey: initialApiKey,\n autoLoadAuth = true,\n onLoadAuth,\n children,\n}: FrappeProviderProps) {\n const [token, setToken] = useState<string | undefined>(initialToken);\n const [apiKey, setApiKey] = useState<{ key: string; secret: string } | undefined>(\n initialApiKey\n );\n\n useEffect(() => {\n if (autoLoadAuth && !initialToken && !initialApiKey && onLoadAuth) {\n Promise.resolve(onLoadAuth()).then((auth) => {\n if (auth.token) {\n setToken(auth.token);\n } else if (auth.apiKey) {\n setApiKey(auth.apiKey);\n }\n });\n }\n }, [autoLoadAuth, initialToken, initialApiKey, onLoadAuth]);\n\n const value: FrappeContextValue = {\n baseUrl,\n ...(token !== undefined && { token }),\n ...(apiKey !== undefined && { apiKey }),\n };\n\n return (\n <FrappeContext.Provider value={value}>\n {children}\n </FrappeContext.Provider>\n );\n}\n\nexport function useFrappeConfig(): FrappeContextValue {\n const context = useContext(FrappeContext);\n\n if (!context) {\n throw new Error('useFrappeConfig must be used within FrappeProvider');\n }\n\n return context;\n}\n","'use client';\n\nimport { useFrappeConfig } from './context';\nimport {\n frappeCall as frappeCallCore,\n frappeCallGet as frappeCallGetCore,\n getDoc as getDocCore,\n getList as getListCore,\n createDoc as createDocCore,\n updateDoc as updateDocCore,\n deleteDoc as deleteDocCore,\n} from './core';\nimport type { AuthOptions } from './types';\n\nexport function useFrappe() {\n const { baseUrl, token, apiKey } = useFrappeConfig();\n\n const auth: AuthOptions = {\n ...(token && { token }),\n ...(apiKey && { apiKey }),\n };\n\n return {\n call: <T = any>(method: string, args?: Record<string, any>) =>\n frappeCallCore<T>(baseUrl, method, args, auth),\n\n callGet: <T = any>(method: string, args?: Record<string, any>) =>\n frappeCallGetCore<T>(baseUrl, method, args, auth),\n\n getList: <T = any>(params: {\n doctype: string;\n fields?: string[];\n filters?: Record<string, any>;\n orderBy?: string;\n limitStart?: number;\n limitPageLength?: number;\n }) => getListCore<T>(baseUrl, params, auth),\n\n getDoc: <T = any>(doctype: string, name: string) =>\n getDocCore<T>(baseUrl, doctype, name, auth),\n\n createDoc: <T = any>(doctype: string, doc: Record<string, any>) =>\n createDocCore<T>(baseUrl, doctype, doc, auth),\n\n updateDoc: <T = any>(\n doctype: string,\n name: string,\n doc: Record<string, any>\n ) => updateDocCore<T>(baseUrl, doctype, name, doc, auth),\n\n deleteDoc: (doctype: string, name: string) =>\n deleteDocCore(baseUrl, doctype, name, auth),\n\n baseUrl,\n auth,\n };\n}\n","export interface StorageAdapter {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n}\n\nexport const webStorageAdapter: StorageAdapter = {\n getItem: (key: string) => {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(key);\n },\n setItem: (key: string, value: string) => {\n if (typeof window === 'undefined') return;\n localStorage.setItem(key, value);\n },\n removeItem: (key: string) => {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(key);\n },\n};\n\nlet currentAdapter: StorageAdapter = webStorageAdapter;\n\nexport function setStorageAdapter(adapter: StorageAdapter) {\n currentAdapter = adapter;\n}\n\nexport function getStorageAdapter(): StorageAdapter {\n return currentAdapter;\n}\n\nconst TOKEN_KEY = 'frappe_token';\nconst API_KEY_KEY = 'frappe_api_key';\nconst API_SECRET_KEY = 'frappe_api_secret';\n\nexport function getToken(): string | null | Promise<string | null> {\n return currentAdapter.getItem(TOKEN_KEY);\n}\n\nexport function setToken(token: string): void | Promise<void> {\n return currentAdapter.setItem(TOKEN_KEY, token);\n}\n\nexport function clearToken(): void | Promise<void> {\n return currentAdapter.removeItem(TOKEN_KEY);\n}\n\nexport async function getApiKey(): Promise<{ key: string; secret: string } | null> {\n const key = await currentAdapter.getItem(API_KEY_KEY);\n const secret = await currentAdapter.getItem(API_SECRET_KEY);\n\n if (!key || !secret) return null;\n\n return { key, secret };\n}\n\nexport async function setApiKey(key: string, secret: string): Promise<void> {\n await currentAdapter.setItem(API_KEY_KEY, key);\n await currentAdapter.setItem(API_SECRET_KEY, secret);\n}\n\nexport async function clearApiKey(): Promise<void> {\n await currentAdapter.removeItem(API_KEY_KEY);\n await currentAdapter.removeItem(API_SECRET_KEY);\n}\n\nexport async function clearAuth(): Promise<void> {\n await clearToken();\n await clearApiKey();\n}\n\nexport async function isAuthenticated(): Promise<boolean> {\n const token = await getToken();\n const apiKey = await getApiKey();\n return !!token || !!apiKey;\n}\n","import { getDoc } from '../../client'\nimport type { AuthOptions } from '../../client'\nimport type { Page } from './types'\n\nexport async function getPage(\n baseUrl: string,\n slug: string,\n auth?: AuthOptions\n): Promise<Page> {\n return getDoc<Page>(baseUrl, 'Design Page', slug, auth)\n}\n","import type {ModelNumber} from \"../lasterp\";\n\nexport function toDescription(modelNumber: ModelNumber) {\n if (!modelNumber) {\n return null;\n }\n return modelNumber.simCardType;\n}\n","export function equalsIgnoreCase(str1: string, str2: string): boolean {\n return str1.localeCompare(str2, undefined, { sensitivity: 'accent' }) === 0;\n};\n","import { frappeCall } from '../../client';\nimport type { AuthOptions } from '../../client';\nimport type { ShopContext, ProductContext } from './types';\n\nexport async function getShopContext(\n baseUrl: string,\n params?: {\n categoryName?: string;\n gradeName?: string;\n },\n auth?: AuthOptions\n): Promise<ShopContext> {\n return frappeCall<ShopContext>(\n baseUrl,\n 'lasterp.shop.controllers.shop_controller.get_context',\n params,\n auth\n );\n}\n\nexport async function getProductContext(\n baseUrl: string,\n productName: string,\n auth?: AuthOptions\n): Promise<ProductContext> {\n return frappeCall<ProductContext>(\n baseUrl,\n 'lasterp.shop.controllers.product_controller.get_context',\n { productName },\n auth\n );\n}\n","'use client';\n\nimport { useQuery, type UseQueryOptions } from '@tanstack/react-query';\nimport { useFrappe } from '../../client';\nimport { getShopContext, getProductContext } from './api';\nimport type { ShopContext, ProductContext } from './types';\n\nexport function useShopContext(\n params?: {\n categoryName?: string;\n gradeName?: string;\n },\n options?: Omit<\n UseQueryOptions<ShopContext, Error>,\n 'queryKey' | 'queryFn'\n >\n) {\n const { baseUrl, auth } = useFrappe();\n\n return useQuery<ShopContext, Error>({\n queryKey: ['shop-context', params],\n queryFn: () => getShopContext(baseUrl, params, auth),\n ...options,\n });\n}\n\nexport function useProductContext(\n productName: string,\n options?: Omit<\n UseQueryOptions<ProductContext, Error>,\n 'queryKey' | 'queryFn'\n >\n) {\n const { baseUrl, auth } = useFrappe();\n\n return useQuery<ProductContext, Error>({\n queryKey: ['product-context', productName],\n queryFn: () => getProductContext(baseUrl, productName, auth),\n enabled: !!productName,\n ...options,\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lasterp/shared",
3
- "version": "1.0.0-alpha.1",
3
+ "version": "1.0.0-alpha.2",
4
4
  "type": "module",
5
5
  "description": "Shared types and business logic for LastERP Web and Native apps",
6
6
  "main": "./dist/index.cjs",
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { useFrappeConfig } from '../providers/frappe';
3
+ import { useFrappeConfig } from './context';
4
4
  import {
5
5
  frappeCall as frappeCallCore,
6
6
  frappeCallGet as frappeCallGetCore,
@@ -13,9 +13,8 @@ export {
13
13
  } from './core';
14
14
 
15
15
  export type { FrappeResponse, FrappeError, AuthOptions } from './types';
16
-
17
- export { FrappeProvider, useFrappeConfig } from '../providers/frappe';
18
- export type { FrappeContextValue, FrappeProviderProps } from '../providers/frappe';
16
+ export { FrappeProvider, useFrappeConfig } from './context';
17
+ export type { FrappeContextValue, FrappeProviderProps } from './context';
19
18
  export { useFrappe } from './hooks';
20
19
 
21
20
  export * from './storage';