@knapsack/utils 5.0.0--canary.6593.4738696.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.lintstagedrc.mjs +2 -2
  2. package/CHANGELOG.md +151 -0
  3. package/dist/.tsbuildinfo-es +1 -1
  4. package/dist/arrays.d.ts.map +1 -1
  5. package/dist/arrays.js.map +1 -1
  6. package/dist/arrays.mjs.map +1 -1
  7. package/dist/dates.js.map +1 -1
  8. package/dist/dates.mjs +1 -1
  9. package/dist/dates.mjs.map +1 -1
  10. package/dist/fetcher.js.map +1 -1
  11. package/dist/fetcher.mjs.map +1 -1
  12. package/dist/functions.d.ts +15 -1
  13. package/dist/functions.d.ts.map +1 -1
  14. package/dist/functions.js +1 -1
  15. package/dist/functions.js.map +1 -1
  16. package/dist/functions.mjs +1 -1
  17. package/dist/functions.mjs.map +1 -1
  18. package/dist/ids.d.ts +1 -0
  19. package/dist/ids.d.ts.map +1 -1
  20. package/dist/ids.js +1 -1
  21. package/dist/ids.js.map +1 -1
  22. package/dist/ids.mjs +1 -1
  23. package/dist/ids.mjs.map +1 -1
  24. package/dist/immer.d.ts +1 -1
  25. package/dist/immer.d.ts.map +1 -1
  26. package/dist/immer.js +1 -1
  27. package/dist/immer.js.map +1 -1
  28. package/dist/immer.mjs +1 -1
  29. package/dist/immer.mjs.map +1 -1
  30. package/dist/index.js +2 -2
  31. package/dist/index.js.map +1 -1
  32. package/dist/index.mjs +2 -2
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/is-types.js.map +1 -1
  35. package/dist/is-types.mjs.map +1 -1
  36. package/dist/js-env.js.map +1 -1
  37. package/dist/js-env.mjs.map +1 -1
  38. package/dist/loose-equal.js.map +1 -1
  39. package/dist/loose-equal.mjs.map +1 -1
  40. package/dist/misc.js.map +1 -1
  41. package/dist/misc.mjs.map +1 -1
  42. package/dist/objects.d.ts.map +1 -1
  43. package/dist/objects.js +1 -1
  44. package/dist/objects.js.map +1 -1
  45. package/dist/objects.mjs +1 -1
  46. package/dist/objects.mjs.map +1 -1
  47. package/dist/paths.js.map +1 -1
  48. package/dist/paths.mjs.map +1 -1
  49. package/dist/strings.js.map +1 -1
  50. package/dist/strings.mjs.map +1 -1
  51. package/dist/type-tools.d.ts.map +1 -1
  52. package/dist/type-tools.js.map +1 -1
  53. package/dist/type-tools.mjs.map +1 -1
  54. package/dist/urls.d.ts +12 -0
  55. package/dist/urls.d.ts.map +1 -1
  56. package/dist/urls.js +2 -2
  57. package/dist/urls.js.map +1 -1
  58. package/dist/urls.mjs +2 -2
  59. package/dist/urls.mjs.map +1 -1
  60. package/dist/validation.js.map +1 -1
  61. package/dist/validation.mjs.map +1 -1
  62. package/package.json +15 -17
  63. package/vitest.config.ts +7 -0
  64. package/.eslintrc.js +0 -4
  65. package/ava.config.cjs +0 -3
package/dist/immer.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/immer.ts"],"names":["enablePatches","compressPatches","baseData","allPatches","produceWithPatches","draft","applyPatches","__name","applyPatchesSafely","data","changes","logError","logAppClientData","acc","change","i","error","LOG_IMMER_APP_CLIENT_DATA","metadata"],"mappings":"yHAcAA,mBAAAA,GAMO,SAASC,CAAAA,CAAwC,CACtD,QAAA,CAAAC,CACA,CAAA,OAAA,CAASC,CACX,CAGG,CAAA,CACD,OAAOC,wBAAAA,CAAmBF,CAAWG,CAAAA,CAAAA,EAAU,CAC7CC,kBAAaD,CAAAA,CAAAA,CAAOF,CAAW,CAAA,IAAA,EAAM,EACvC,CAAC,CACH,CAVgBI,CAAAN,CAAAA,CAAAA,CAAA,iBAgBT,CAAA,CAAA,SAASO,EAA2C,CACzD,IAAA,CAAAC,CACA,CAAA,OAAA,CAAAC,CACA,CAAA,QAAA,CAAAC,CAAW,CAAA,OAAA,CAAQ,KACnB,CAAA,gBAAA,CAAAC,CAAmB,CAAA,KACrB,CAKS,CAAA,CACP,OAAOF,CAAQ,CAAA,MAAA,CAAO,CAACG,CAAAA,CAAKC,CAAQC,CAAAA,CAAAA,GAAM,CACxC,GAAI,CACF,OAAOT,kBAAAA,CAAaO,CAAKC,CAAAA,CAAAA,CAAO,OAAO,CACzC,CAAA,MAASE,CAAO,CAAA,CACd,GAAM,CAAE,yBAAAC,CAAAA,CAA0B,CAAI,CAAA,OAAA,CAAQ,GACxCC,CAAAA,CAAAA,CACJN,CAAoBK,EAAAA,CAAAA,CAChB,CAAE,IAAAR,CAAAA,CAAAA,CAAM,MAAAK,CAAAA,CAAO,CACfA,CAAAA,CAAAA,CACN,OAAAH,CACE,CAAA,CAAA,wEAAA,EAA2EI,CAAC,CAAA,EAAA,EAC1EC,CAAiB,YAAA,KAAA,CAAQA,EAAM,OAAU,CAAA,EAC3C,CACAE,CAAAA,CAAAA,CACF,CACOL,CAAAA,CACT,CACF,CAAA,CAAGJ,CAAI,CACT,CA7BgBF,CAAAA,CAAAC,CAAA,CAAA,oBAAA,CAAA","file":"immer.js","sourcesContent":["import {\n Patch,\n applyPatches,\n enablePatches,\n produceWithPatches,\n produce,\n isDraft,\n type Draft,\n type Objectish,\n} from 'immer';\n\nexport { produce, produceWithPatches, applyPatches, isDraft };\nexport type { Patch, Draft };\n\nenablePatches();\n\n/**\n * Take an array of Immer patches and compress them down to the smallest amount of patches\n * @link https://medium.com/@dedels/using-immer-to-compress-immer-patches-f382835b6c69\n */\nexport function compressPatches<Data extends Objectish>({\n baseData,\n patches: allPatches,\n}: {\n baseData: Data;\n patches: Patch[][] | Patch[];\n}) {\n return produceWithPatches(baseData, (draft) => {\n applyPatches(draft, allPatches.flat());\n });\n}\n\n/**\n * Loop over changes to applyPatches in small batches (safer) instead of all at once\n * If there are errors, it will skip that change and continue on\n */\nexport function applyPatchesSafely<Data extends Objectish>({\n data,\n changes,\n logError = console.error,\n logAppClientData = false,\n}: {\n data: Data;\n changes: { patches: Patch[] }[];\n logError?: (msg: unknown, ...optionalMsgs: unknown[]) => void;\n logAppClientData?: boolean;\n}): Data {\n return changes.reduce((acc, change, i) => {\n try {\n return applyPatches(acc, change.patches);\n } catch (error) {\n const { LOG_IMMER_APP_CLIENT_DATA } = process.env;\n const metadata =\n logAppClientData || LOG_IMMER_APP_CLIENT_DATA\n ? { data, change }\n : change;\n logError(\n `applyPatchesSafely had issues (and so will skip) with patches in change ${i}: ${\n error instanceof Error ? error.message : ''\n }`,\n metadata,\n );\n return acc;\n }\n }, data);\n}\n"]}
1
+ {"version":3,"sources":["../src/immer.ts"],"names":["enablePatches","compressPatches","baseData","allPatches","produceWithPatches","draft","applyPatches","__name","applyPatchesSafely","data","changes","logError","logAppClientData","acc","change","i","error","LOG_IMMER_APP_CLIENT_DATA","metadata"],"mappings":"yHAcAA,mBAAAA,GAMO,SAASC,CAAAA,CAAwC,CACtD,QAAA,CAAAC,CAAAA,CACA,OAAA,CAASC,CACX,CAAA,CAGG,CACD,OAAOC,wBAAAA,CAAmBF,CAAAA,CAAWG,CAAAA,EAAU,CAC7CC,kBAAAA,CAAaD,CAAAA,CAAOF,CAAAA,CAAW,IAAA,EAAM,EACvC,CAAC,CACH,CAVgBI,CAAAA,CAAAN,CAAAA,CAAA,iBAAA,CAAA,CAgBT,SAASO,EAA2C,CACzD,IAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CAAW,OAAA,CAAQ,KAAA,CACnB,gBAAA,CAAAC,CAAAA,CAAmB,KACrB,CAAA,CAKS,CACP,OAAOF,CAAAA,CAAQ,MAAA,CAAO,CAACG,CAAAA,CAAKC,CAAAA,CAAQC,CAAAA,GAAM,CACxC,GAAI,CACF,OAAOT,kBAAAA,CAAaO,CAAAA,CAAKC,CAAAA,CAAO,OAAO,CACzC,CAAA,MAASE,CAAAA,CAAO,CACd,GAAM,CAAE,yBAAA,CAAAC,CAA0B,CAAA,CAAI,OAAA,CAAQ,GAAA,CACxCC,CAAAA,CACJN,CAAAA,EAAoBK,CAAAA,CAChB,CAAE,IAAA,CAAAR,CAAAA,CAAM,MAAA,CAAAK,CAAO,CAAA,CACfA,CAAAA,CACN,OAAAH,CAAAA,CACE,CAAA,wEAAA,EAA2EI,CAAC,CAAA,EAAA,EAC1EC,CAAAA,YAAiB,KAAA,CAAQA,EAAM,OAAA,CAAU,EAC3C,CAAA,CAAA,CACAE,CACF,CAAA,CACOL,CACT,CACF,CAAA,CAAGJ,CAAI,CACT,CA7BgBF,CAAAA,CAAAC,CAAAA,CAAA,oBAAA,CAAA","file":"immer.js","sourcesContent":["import {\n type Patch,\n applyPatches,\n enablePatches,\n produceWithPatches,\n produce,\n isDraft,\n type Draft,\n type Objectish,\n} from 'immer';\n\nexport { produce, produceWithPatches, applyPatches, isDraft };\nexport type { Patch, Draft };\n\nenablePatches();\n\n/**\n * Take an array of Immer patches and compress them down to the smallest amount of patches\n * @link https://medium.com/@dedels/using-immer-to-compress-immer-patches-f382835b6c69\n */\nexport function compressPatches<Data extends Objectish>({\n baseData,\n patches: allPatches,\n}: {\n baseData: Data;\n patches: Patch[][] | Patch[];\n}) {\n return produceWithPatches(baseData, (draft) => {\n applyPatches(draft, allPatches.flat());\n });\n}\n\n/**\n * Loop over changes to applyPatches in small batches (safer) instead of all at once\n * If there are errors, it will skip that change and continue on\n */\nexport function applyPatchesSafely<Data extends Objectish>({\n data,\n changes,\n logError = console.error,\n logAppClientData = false,\n}: {\n data: Data;\n changes: { patches: Patch[] }[];\n logError?: (msg: unknown, ...optionalMsgs: unknown[]) => void;\n logAppClientData?: boolean;\n}): Data {\n return changes.reduce((acc, change, i) => {\n try {\n return applyPatches(acc, change.patches);\n } catch (error) {\n const { LOG_IMMER_APP_CLIENT_DATA } = process.env;\n const metadata =\n logAppClientData || LOG_IMMER_APP_CLIENT_DATA\n ? { data, change }\n : change;\n logError(\n `applyPatchesSafely had issues (and so will skip) with patches in change ${i}: ${\n error instanceof Error ? error.message : ''\n }`,\n metadata,\n );\n return acc;\n }\n }, data);\n}\n"]}
package/dist/immer.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import {enablePatches,produceWithPatches,applyPatches}from'immer';export{applyPatches,isDraft,produce,produceWithPatches}from'immer';var P=Object.defineProperty;var r=(t,e)=>P(t,"name",{value:e,configurable:true});enablePatches();function x({baseData:t,patches:e}){return produceWithPatches(t,a=>{applyPatches(a,e.flat());})}r(x,"compressPatches");function g({data:t,changes:e,logError:a=console.error,logAppClientData:p=false}){return e.reduce((o,s,h)=>{try{return applyPatches(o,s.patches)}catch(c){let{LOG_IMMER_APP_CLIENT_DATA:i}=process.env,l=p||i?{data:t,change:s}:s;return a(`applyPatchesSafely had issues (and so will skip) with patches in change ${h}: ${c instanceof Error?c.message:""}`,l),o}},t)}r(g,"applyPatchesSafely");export{g as applyPatchesSafely,x as compressPatches};//# sourceMappingURL=immer.mjs.map
1
+ import {enablePatches,produceWithPatches,applyPatches}from'immer';export{applyPatches,isDraft,produce,produceWithPatches}from'immer';var P=Object.defineProperty;var r=(t,e)=>P(t,"name",{value:e,configurable:true});enablePatches();function m({baseData:t,patches:e}){return produceWithPatches(t,a=>{applyPatches(a,e.flat());})}r(m,"compressPatches");function x({data:t,changes:e,logError:a=console.error,logAppClientData:p=false}){return e.reduce((o,s,h)=>{try{return applyPatches(o,s.patches)}catch(c){let{LOG_IMMER_APP_CLIENT_DATA:i}=process.env,l=p||i?{data:t,change:s}:s;return a(`applyPatchesSafely had issues (and so will skip) with patches in change ${h}: ${c instanceof Error?c.message:""}`,l),o}},t)}r(x,"applyPatchesSafely");export{x as applyPatchesSafely,m as compressPatches};//# sourceMappingURL=immer.mjs.map
2
2
  //# sourceMappingURL=immer.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/immer.ts"],"names":["enablePatches","compressPatches","baseData","allPatches","produceWithPatches","draft","applyPatches","__name","applyPatchesSafely","data","changes","logError","logAppClientData","acc","change","i","error","LOG_IMMER_APP_CLIENT_DATA","metadata"],"mappings":"sNAcAA,aAAAA,GAMO,SAASC,CAAAA,CAAwC,CACtD,QAAA,CAAAC,CACA,CAAA,OAAA,CAASC,CACX,CAGG,CAAA,CACD,OAAOC,kBAAAA,CAAmBF,CAAWG,CAAAA,CAAAA,EAAU,CAC7CC,YAAaD,CAAAA,CAAAA,CAAOF,CAAW,CAAA,IAAA,EAAM,EACvC,CAAC,CACH,CAVgBI,CAAAN,CAAAA,CAAAA,CAAA,iBAgBT,CAAA,CAAA,SAASO,EAA2C,CACzD,IAAA,CAAAC,CACA,CAAA,OAAA,CAAAC,CACA,CAAA,QAAA,CAAAC,CAAW,CAAA,OAAA,CAAQ,KACnB,CAAA,gBAAA,CAAAC,CAAmB,CAAA,KACrB,CAKS,CAAA,CACP,OAAOF,CAAQ,CAAA,MAAA,CAAO,CAACG,CAAAA,CAAKC,CAAQC,CAAAA,CAAAA,GAAM,CACxC,GAAI,CACF,OAAOT,YAAAA,CAAaO,CAAKC,CAAAA,CAAAA,CAAO,OAAO,CACzC,CAAA,MAASE,CAAO,CAAA,CACd,GAAM,CAAE,yBAAAC,CAAAA,CAA0B,CAAI,CAAA,OAAA,CAAQ,GACxCC,CAAAA,CAAAA,CACJN,CAAoBK,EAAAA,CAAAA,CAChB,CAAE,IAAAR,CAAAA,CAAAA,CAAM,MAAAK,CAAAA,CAAO,CACfA,CAAAA,CAAAA,CACN,OAAAH,CACE,CAAA,CAAA,wEAAA,EAA2EI,CAAC,CAAA,EAAA,EAC1EC,CAAiB,YAAA,KAAA,CAAQA,EAAM,OAAU,CAAA,EAC3C,CACAE,CAAAA,CAAAA,CACF,CACOL,CAAAA,CACT,CACF,CAAA,CAAGJ,CAAI,CACT,CA7BgBF,CAAAA,CAAAC,CAAA,CAAA,oBAAA,CAAA","file":"immer.mjs","sourcesContent":["import {\n Patch,\n applyPatches,\n enablePatches,\n produceWithPatches,\n produce,\n isDraft,\n type Draft,\n type Objectish,\n} from 'immer';\n\nexport { produce, produceWithPatches, applyPatches, isDraft };\nexport type { Patch, Draft };\n\nenablePatches();\n\n/**\n * Take an array of Immer patches and compress them down to the smallest amount of patches\n * @link https://medium.com/@dedels/using-immer-to-compress-immer-patches-f382835b6c69\n */\nexport function compressPatches<Data extends Objectish>({\n baseData,\n patches: allPatches,\n}: {\n baseData: Data;\n patches: Patch[][] | Patch[];\n}) {\n return produceWithPatches(baseData, (draft) => {\n applyPatches(draft, allPatches.flat());\n });\n}\n\n/**\n * Loop over changes to applyPatches in small batches (safer) instead of all at once\n * If there are errors, it will skip that change and continue on\n */\nexport function applyPatchesSafely<Data extends Objectish>({\n data,\n changes,\n logError = console.error,\n logAppClientData = false,\n}: {\n data: Data;\n changes: { patches: Patch[] }[];\n logError?: (msg: unknown, ...optionalMsgs: unknown[]) => void;\n logAppClientData?: boolean;\n}): Data {\n return changes.reduce((acc, change, i) => {\n try {\n return applyPatches(acc, change.patches);\n } catch (error) {\n const { LOG_IMMER_APP_CLIENT_DATA } = process.env;\n const metadata =\n logAppClientData || LOG_IMMER_APP_CLIENT_DATA\n ? { data, change }\n : change;\n logError(\n `applyPatchesSafely had issues (and so will skip) with patches in change ${i}: ${\n error instanceof Error ? error.message : ''\n }`,\n metadata,\n );\n return acc;\n }\n }, data);\n}\n"]}
1
+ {"version":3,"sources":["../src/immer.ts"],"names":["enablePatches","compressPatches","baseData","allPatches","produceWithPatches","draft","applyPatches","__name","applyPatchesSafely","data","changes","logError","logAppClientData","acc","change","i","error","LOG_IMMER_APP_CLIENT_DATA","metadata"],"mappings":"sNAcAA,aAAAA,GAMO,SAASC,CAAAA,CAAwC,CACtD,QAAA,CAAAC,CAAAA,CACA,OAAA,CAASC,CACX,CAAA,CAGG,CACD,OAAOC,kBAAAA,CAAmBF,CAAAA,CAAWG,CAAAA,EAAU,CAC7CC,YAAAA,CAAaD,CAAAA,CAAOF,CAAAA,CAAW,IAAA,EAAM,EACvC,CAAC,CACH,CAVgBI,CAAAA,CAAAN,CAAAA,CAAA,iBAAA,CAAA,CAgBT,SAASO,EAA2C,CACzD,IAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CAAW,OAAA,CAAQ,KAAA,CACnB,gBAAA,CAAAC,CAAAA,CAAmB,KACrB,CAAA,CAKS,CACP,OAAOF,CAAAA,CAAQ,MAAA,CAAO,CAACG,CAAAA,CAAKC,CAAAA,CAAQC,CAAAA,GAAM,CACxC,GAAI,CACF,OAAOT,YAAAA,CAAaO,CAAAA,CAAKC,CAAAA,CAAO,OAAO,CACzC,CAAA,MAASE,CAAAA,CAAO,CACd,GAAM,CAAE,yBAAA,CAAAC,CAA0B,CAAA,CAAI,OAAA,CAAQ,GAAA,CACxCC,CAAAA,CACJN,CAAAA,EAAoBK,CAAAA,CAChB,CAAE,IAAA,CAAAR,CAAAA,CAAM,MAAA,CAAAK,CAAO,CAAA,CACfA,CAAAA,CACN,OAAAH,CAAAA,CACE,CAAA,wEAAA,EAA2EI,CAAC,CAAA,EAAA,EAC1EC,CAAAA,YAAiB,KAAA,CAAQA,EAAM,OAAA,CAAU,EAC3C,CAAA,CAAA,CACAE,CACF,CAAA,CACOL,CACT,CACF,CAAA,CAAGJ,CAAI,CACT,CA7BgBF,CAAAA,CAAAC,CAAAA,CAAA,oBAAA,CAAA","file":"immer.mjs","sourcesContent":["import {\n type Patch,\n applyPatches,\n enablePatches,\n produceWithPatches,\n produce,\n isDraft,\n type Draft,\n type Objectish,\n} from 'immer';\n\nexport { produce, produceWithPatches, applyPatches, isDraft };\nexport type { Patch, Draft };\n\nenablePatches();\n\n/**\n * Take an array of Immer patches and compress them down to the smallest amount of patches\n * @link https://medium.com/@dedels/using-immer-to-compress-immer-patches-f382835b6c69\n */\nexport function compressPatches<Data extends Objectish>({\n baseData,\n patches: allPatches,\n}: {\n baseData: Data;\n patches: Patch[][] | Patch[];\n}) {\n return produceWithPatches(baseData, (draft) => {\n applyPatches(draft, allPatches.flat());\n });\n}\n\n/**\n * Loop over changes to applyPatches in small batches (safer) instead of all at once\n * If there are errors, it will skip that change and continue on\n */\nexport function applyPatchesSafely<Data extends Objectish>({\n data,\n changes,\n logError = console.error,\n logAppClientData = false,\n}: {\n data: Data;\n changes: { patches: Patch[] }[];\n logError?: (msg: unknown, ...optionalMsgs: unknown[]) => void;\n logAppClientData?: boolean;\n}): Data {\n return changes.reduce((acc, change, i) => {\n try {\n return applyPatches(acc, change.patches);\n } catch (error) {\n const { LOG_IMMER_APP_CLIENT_DATA } = process.env;\n const metadata =\n logAppClientData || LOG_IMMER_APP_CLIENT_DATA\n ? { data, change }\n : change;\n logError(\n `applyPatchesSafely had issues (and so will skip) with patches in change ${i}: ${\n error instanceof Error ? error.message : ''\n }`,\n metadata,\n );\n return acc;\n }\n }, data);\n}\n"]}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';var uniqBy_js=require('lodash/uniqBy.js'),dateFns=require('date-fns'),Z=require('lodash/camelCase.js'),H=require('just-kebab-case'),Q=require('lodash/upperFirst.js'),tsExpect=require('ts-expect'),S=require('lodash/isEmpty.js'),snakeCase_js=require('lodash/snakeCase.js'),capitalize_js=require('lodash/capitalize.js'),debounce_js=require('lodash/debounce.js'),throttle_js=require('lodash/throttle.js'),memoizee=require('memoizee'),profile_js=require('memoizee/profile.js'),function_js=require('fp-ts/lib/function.js'),nanoid=require('nanoid'),uuid=require('uuid'),st=require('slugify'),immer=require('immer'),U=require('clean-deep'),groupBy_js=require('lodash/groupBy.js'),deepmerge=require('deepmerge'),superstruct=require('superstruct');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var uniqBy_js__default=/*#__PURE__*/_interopDefault(uniqBy_js);var Z__default=/*#__PURE__*/_interopDefault(Z);var H__default=/*#__PURE__*/_interopDefault(H);var Q__default=/*#__PURE__*/_interopDefault(Q);var S__default=/*#__PURE__*/_interopDefault(S);var snakeCase_js__default=/*#__PURE__*/_interopDefault(snakeCase_js);var capitalize_js__default=/*#__PURE__*/_interopDefault(capitalize_js);var debounce_js__default=/*#__PURE__*/_interopDefault(debounce_js);var throttle_js__default=/*#__PURE__*/_interopDefault(throttle_js);var memoizee__default=/*#__PURE__*/_interopDefault(memoizee);var profile_js__default=/*#__PURE__*/_interopDefault(profile_js);var st__default=/*#__PURE__*/_interopDefault(st);var U__default=/*#__PURE__*/_interopDefault(U);var groupBy_js__default=/*#__PURE__*/_interopDefault(groupBy_js);var deepmerge__default=/*#__PURE__*/_interopDefault(deepmerge);var C=Object.create;var y=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var N=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var r=(t,e)=>y(t,"name",{value:e,configurable:true});var _=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var F=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of v(e))!L.call(t,o)&&o!==n&&y(t,o,{get:()=>e[o],enumerable:!(s=M(e,o))||s.enumerable});return t};var K=(t,e,n)=>(n=t!=null?C(N(t)):{},F(!t||!t.__esModule?y(n,"default",{value:t,enumerable:true}):n,t));var P=_(()=>{});function ht(t){let e={};return t.forEach(n=>{e[`${n}::${typeof n}`]=n;}),Object.keys(e).map(n=>e[n])}r(ht,"uniqueArray");function wt(t,e){return t.some(n=>e.includes(n))}r(wt,"hasItemsInItems");function bt({items:t,key:e,errorMsgPrefix:n}){let s=[],o=[];if(t.forEach(i=>{let a=String(i[e]);s.includes(a)?o.push(i):s.push(a);}),o.length>0){let i=o.map(a=>`"${a[e]}"`).join(", ");throw new Error(`${n||`Each item in the array requires unique "${e}" prop.`} These ids are duplicates: ${i}`)}}r(bt,"assertUniqueIdInArray");function Tt(t){let e=new Set(t);return t.length===e.size}r(Tt,"isArrayOfStringsUnique");function Rt(t){let e=new Set;return t.filter(n=>e.has(n)?true:(e.add(n),false))}r(Rt,"getNonUniqueStringsFromArray");function kt(t,e){return t.reduce((n,s)=>{let{[e]:o}=s;if(n[o])throw new Error(`Duplicate key: ${o}`);return n[o]=s,n},{})}r(kt,"arrayToDictionary");var R=class{static{r(this,"Queue");}items;constructor(e){this.items=e||[];}add(e){this.items.push(e);}next(){return this.items.shift()}peekAtNext(){return this.items[0]}clear(){this.items=[];}get length(){return this.items.length}isEmpty(){return this.items.length===0}};var k=class{static{r(this,"Stack");}items;constructor(e){this.items=e||[];}add(e){this.items.unshift(e);}next(){return this.items.shift()}peekAtNext(){return this.items[0]}clear(){this.items=[];}get length(){return this.items.length}isEmpty(){return this.items.length===0}};var At=r(()=>new Date().toISOString(),"now");function Ct({date:t,relative:e,includeTime:n,prefix:s}){if(!dateFns.isValid(t))return console.error("formatDate: Invalid date provided:",t),null;let o,i;if(e)i=Math.abs(dateFns.differenceInSeconds(new Date,t))<60?"just now":dateFns.formatDistanceToNowStrict(t,{addSuffix:true});else {let a=t.getFullYear()===new Date().getFullYear();n?o=a?"MMM dd 'at' hh:mm aaa":"MMM dd, yyyy 'at' hh:mm aaa":o=a?"MMM dd":"MMM dd, yyyy",i=dateFns.format(t,o);}return s?`${s} ${i}`:i}r(Ct,"formatDate");var Mt=r(()=>new Date().toISOString(),"nowInIsoDate"),vt=r(()=>dateFns.subDays(new Date,1).toISOString(),"yesterdayInIsoDate");function Nt(t,e){return dateFns.compareAsc(dateFns.parseISO(t.date),dateFns.parseISO(e.date))}r(Nt,"sortDateAsc");function Lt(t,e){return dateFns.compareDesc(dateFns.parseISO(t.date),dateFns.parseISO(e.date))}r(Lt,"sortDateDesc");var _t=r(t=>new Date(Date.now()+t*60*1e3).toISOString(),"minutesFromNowInIsoDate");function Ft({hours:t=0,minutes:e=0,seconds:n=0}){return t*36e5+e*6e4+n*1e3}r(Ft,"toMilliseconds");var Wt=typeof window<"u"&&typeof window.document<"u",Bt=typeof self=="object"&&self.constructor&&self.constructor.name==="DedicatedWorkerGlobalScope",h=typeof process<"u"&&process.versions!=null&&process.versions.node!=null,zt=r(()=>typeof window<"u"&&window.name==="nodejs"||navigator.userAgent.includes("Node.js")||navigator.userAgent.includes("jsdom"),"isJsDom");var se=K(P());function Ht(t){return Object.keys(t)}r(Ht,"keys");function Qt(t){return Object.entries(t)}r(Qt,"entries");function Xt(t,e){return t in e}r(Xt,"isObjKey");function Yt(t){return t!=null}r(Yt,"isDefined");var X=r(t=>t.split(".").map(H__default.default).join("-"),"cssKebabCase"),le=r(t=>`--${X(t)}`,"cssVarName");function E(t){return t.replace(/[*+?^${}()|[\]\\]/g,"\\$&")}r(E,"escapeRegEx");function me(t,e){let n=E(e).toLowerCase();return E(t).toLowerCase().search(n)!==-1}r(me,"containsString");function Y(t){return Q__default.default(t)}r(Y,"capitalizeFirstLetter");function ge(t){return !t||t.length===0?false:t[0]===t[0].toUpperCase()}r(ge,"isFirstLetterCapital");function tt(t){return Y(Z__default.default(t))}r(tt,"upperCamelCase");var de=tt;function et(t){return h?Buffer.from(t,"base64").toString():atob(t)}r(et,"base64ToString");function xe(t){return h?Buffer.from(t).toString("base64"):btoa(t)}r(xe,"stringToBase64");function ye(t){if(typeof t!="string")return false;let e=t.replace(/\s+/g,"").replace(/={0,2}$/,"");return !/[^\s0-9a-zA-Z+/]/.test(e)||!/[^\s0-9a-zA-Z\-_]/.test(e)}r(ye,"isBase64");function he(t){return t.indexOf(" ")!==-1}r(he,"stringHasSpaces");function we(t){if(!t.startsWith("@")&&!t.includes("/"))return t;let[,e]=t.split("/");return e||t}r(we,"removeNpmScope");function O(t){if(typeof t!="string")return false;try{new URL(t);return true}catch{return false}}r(O,"isUrl");var rt=/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,nt=r(t=>typeof t=="string"&&t.length<=320&&rt.test(t),"isEmail"),be=r(t=>nt(t)?t.substring(t.indexOf("@")+1):null,"getDomainFromEmail"),Te=r(t=>{let[e,n]=et(t).split(":");return {username:e,password:n}},"decodeBasicAuth");function Re(t){let e=String(t).trim(),n=/([a-zA-Z%])+$/,s=e.match(n),o,i;if(s){let a=s.index;o=parseFloat(e.slice(0,a)),[i]=s;}else o=parseFloat(e),i="";if(Number.isNaN(o))throw new Error(`Invalid value, not a number: ${t}`);return {value:o,unit:i}}r(Re,"parseNumberWithUnit");function ke(t){return /^[a-zA-Z]/.test(t)}r(ke,"startsWithLetter");function Pe(t){return !t||typeof t!="string"?t:t.replace(/^"(.*)"$/,"$1").replace(/^'(.*)'$/,"$1")}r(Pe,"removeWrappingQuotes");var Se=r(t=>{if(!t||S__default.default(t))return;if(!t.includes("="))return t;let e=t.split(","),n=[];return e.forEach(s=>{let[o,i]=s.split("=");if(!(!i||["false","off","no"].includes(i)))return ["true","on","yes"].includes(i)?n.push(o):n.push(i)}),n.join(", ")},"getShortName");var f=class extends Error{static{r(this,"FetcherError");}status;statusText;url;constructor(e,{status:n,statusText:s,url:o,cause:i}){super(e,{cause:i}),this.status=n,this.statusText=s,this.url=o;}};async function Ae({url:t,query:e,body:n,headers:s={},signal:o}){try{if(typeof t=="string"&&!O(t))throw new Error(`Cannot fetch from an invalid url: "${t}"`);if(typeof t!="string"&&!(t instanceof URL))throw new Error(`Url must be a string or URL instance: "${t}"`);let i=n?"POST":"GET",a="";try{let c=t instanceof URL?t:new URL(t);e&&Object.entries(e).forEach(([A,x])=>{typeof x>"u"||x!==null&&c.searchParams.set(A,`${x}`);}),a=c.toString();}catch(c){throw new Error(`Could not start fetcher because was not able to add query params to URL successfully. Url: ${t}, Query params: ${JSON.stringify(e??{})}. ${c instanceof Error?c.message:""}`)}let p={Accept:"application/json"};n&&(p["Content-Type"]="application/json");let u=await fetch(a,{method:i,headers:{...p,...s},body:n?JSON.stringify(n):void 0,signal:o}),m=u.headers.get("Content-Type")?.includes("json");if(!u.ok){let c=m?await u.json():{};throw c?.error?.message?new f(c.error.message,{status:u.status,statusText:u.statusText,url:a}):c?.message?new f(c.message,{status:u.status,statusText:u.statusText,url:a}):new f(`${u.statusText} ${u.status}`,{status:u.status,statusText:u.statusText,url:a})}if(!m){let c=await u.text();throw new f(`Expected JSON response but received text instead: ${c}`,{status:u.status,statusText:u.statusText,url:a})}return await u.json()}catch(i){throw i instanceof f?i:new f(i.message,{url:t.toString(),cause:i})}}r(Ae,"fetcher");var ve=r(t=>new Promise(e=>setTimeout(e,t)),"delay");async function Ne(t){try{return {data:await t,error:null}}catch(e){return {data:null,error:e}}}r(Ne,"tryCatch");function ot({params:t,urlSearchParams:e}){return Object.entries(t??{}).forEach(([n,s])=>{if(s!=null)if(s instanceof URL)e.set(n,s.toString());else if(Array.isArray(s))e.set(n,s.join(" "));else {let o=`${s}`;if(o==="")return;e.set(n,o);}}),e}r(ot,"addQueryParams");function Qe({url:t,origin:e,queryParams:n}){if(!e&&typeof t=="string"&&!t.startsWith("http"))throw new Error('When using "createUrl" either pass in a full "url" or provide an "origin"');let s=typeof t=="string"?new URL(t,e):e?new URL(t.toString(),e):t;return ot({params:n,urlSearchParams:s.searchParams}),s}r(Qe,"createUrlWithParams");function Xe({a:t,b:e}){return new URL(t).toString()===new URL(e).toString()}r(Xe,"areUrlsSame");function it(t){if(typeof t!="string")return false;try{let e=new URL(t);return e.protocol.startsWith("http:")||e.protocol.startsWith("https:")}catch{return t.startsWith("//")}}r(it,"isRemoteUrl");var Ye=r(t=>t.startsWith("data:"),"isDataUrl"),I=r(t=>{let{string:e,strict:n=true,lowerCase:s=true}=typeof t=="string"?{string:t}:t;return st__default.default(e,{lower:s,trim:true,strict:n})},"slugify"),tr=r(t=>{let e=/^\/([^/]+)\/([^/]+)/,n=t.match(e);if(!n)return null;let[s,o,i]=n;return [o,i]},"extractPathParts");function er({fileId:t,nodeId:e,version:n}){if(!t||t.trim().length===0)throw new Error(`Invalid Figma URL, missing file id: ${t}`);let s=new URL(`https://www.figma.com/file/${t}`);return e&&s.searchParams.set("node-id",e),n&&s.searchParams.set("version-id",n.toString()),s.toString()}r(er,"createFigmaUrl");function rr(t){let e=new URL(t);if(e.hostname!=="www.figma.com"&&e.hostname!=="figma.com"||!it(t))throw new Error(`Please provide a valid Figma URL, got ${t}`);let n=e.searchParams.get("node-id")||void 0,s=e.searchParams.get("version-id")||void 0,[,o,i]=e.pathname.split("/");switch(o){case "proto":case "file":case "board":case "design":{if(!i)throw new Error(`Invalid Figma URL, missing file id: ${t}`);return {type:o,fileId:i,nodeId:n,version:s}}default:throw new Error(`Please provide a valid Figma URL, got ${t}`)}}r(rr,"parseFigmaUrl");function nr(t){return new URLSearchParams(Object.fromEntries(Object.entries(t).filter(([,e])=>typeof e=="string"?e.length>0:e!=null).map(([e,n])=>[e,`${n}`]))).toString()}r(nr,"createQueryParams");var cr=r(()=>uuid.v4(),"makeUuid"),pr=r(()=>I({string:nanoid.nanoid(10),lowerCase:false}),"makeShortId");immer.enablePatches();function yr({baseData:t,patches:e}){return immer.produceWithPatches(t,n=>{immer.applyPatches(n,e.flat());})}r(yr,"compressPatches");function hr({data:t,changes:e,logError:n=console.error,logAppClientData:s=false}){return e.reduce((o,i,a)=>{try{return immer.applyPatches(o,i.patches)}catch(p){let{LOG_IMMER_APP_CLIENT_DATA:u}=process.env,m=s||u?{data:t,change:i}:i;return n(`applyPatchesSafely had issues (and so will skip) with patches in change ${a}: ${p instanceof Error?p.message:""}`,m),o}},t)}r(hr,"applyPatchesSafely");var l=r(t=>t!==null&&typeof t=="object"&&!Array.isArray(t),"isObject");function Tr(t){return l(t)&&Object.keys(t).length===0}r(Tr,"isObjectEmpty");var ft=Object.prototype.toString,d=r(t=>ft.call(t),"toTypeString"),w=Array.isArray,Rr=r(t=>d(t)==="[object Map]","isMap"),kr=r(t=>d(t)==="[object Set]","isSet"),b=r(t=>t instanceof Date,"isDate"),$=r(t=>typeof t=="function","isFunction"),lt=r(t=>typeof t=="string","isString"),Pr=r(t=>typeof t=="number","isNumber"),Sr=r(t=>typeof t=="symbol","isSymbol"),Er=r(t=>l(t)&&$(t.then)&&$(t.catch),"isPromise"),Or=r(t=>d(t).slice(8,-1),"toRawType"),Ir=r(t=>d(t)==="[object Object]","isPlainObject"),Dr=r(t=>lt(t)&&t!=="NaN"&&t[0]!=="-"&&`${parseInt(t,10)}`===t,"isIntegerKey");function mt(t,e){if(t.length!==e.length)return false;let n=true;for(let s=0;n&&s<t.length;s++)n=T(t[s],e[s]);return n}r(mt,"looseCompareArrays");function T(t,e){if(t===e)return true;if(b(t)&&b(e))return t.getTime()===e.getTime();if(w(t)&&w(e))return mt(t,e);if(l(t)&&l(e)){let n=Object.keys(t).length,s=Object.keys(e).length;if(n!==s)return false;for(let o in t){let i=t.hasOwnProperty(o),a=e.hasOwnProperty(o);if(i&&!a||!i&&a||!T(t[o],e[o]))return false}}return String(t)===String(e)}r(T,"looseEqual");function Ar(t,e){return t.findIndex(n=>T(n,e))}r(Ar,"looseIndexOf");function vr(t){return Math.floor(Math.random()*Math.floor(t))}r(vr,"getRandomInt");var gt=r(()=>{let t=new Date().getTime();return ()=>new Date().getTime()-t},"timer"),Nr=r(()=>{let t=gt();return ()=>t()/1e3},"timerInSeconds");function qr(t){return Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{})}r(qr,"sortObject");var Wr=r(t=>U__default.default(t),"removeEmptyObjects");function Br(t){return U__default.default(t,{undefinedValues:true,nullValues:true,emptyArrays:false,emptyObjects:false,emptyStrings:true})}r(Br,"removeUndefinedProps");function j(t){if(typeof t!="object"||!t)return t;if(Array.isArray(t)){let s=[];return t.forEach((o,i)=>{s[i]=j(o);}),s}let e=Object.keys(t).sort(),n={};return e.forEach(s=>{n[s]=j(t[s]);}),n}r(j,"sortKeysRecursive");function zr(t){if(!l(t))throw new Error("Expected an object to flatten");let e={};function n(s,o){Object.entries(s).forEach(([i,a])=>{let p=[...o,i];l(a)&&(e[p.join(".")]=a,n(a,p));});}return r(n,"dive"),n(t,[]),e}r(zr,"flatten");function Jr(t){return Object.entries(t).map(([e,n])=>({id:e,...n}))}r(Jr,"dictionaryToArray");function Vr(t){return Object.entries(t).reduce((e,[n,s])=>(e[n]={id:n,...s},e),{})}r(Vr,"updateDictionaryWithId");var tn=r(t=>{try{if(!t)return "";let e=t.split(/[/\\]/),s=e[e.length-1].split(".");return s.length===1?s[0]:s.slice(0,-1).join(".")}catch{return t}},"getFileNameFromPath");function sn(t){if(t instanceof superstruct.StructError){let[e]=t.failures();if(!e)return "";let{path:n,message:s}=e;return n.length===0?s:`At path: ${n.join(".")} -- ${s}`}return t instanceof Error?t.message:""}r(sn,"getSuperstructErrorMsg");
2
- Object.defineProperty(exports,"uniqBy",{enumerable:true,get:function(){return uniqBy_js__default.default}});Object.defineProperty(exports,"camelCase",{enumerable:true,get:function(){return Z__default.default}});Object.defineProperty(exports,"kebabCase",{enumerable:true,get:function(){return H__default.default}});Object.defineProperty(exports,"paramCase",{enumerable:true,get:function(){return H__default.default}});Object.defineProperty(exports,"expectNever",{enumerable:true,get:function(){return tsExpect.expectNever}});Object.defineProperty(exports,"expectType",{enumerable:true,get:function(){return tsExpect.expectType}});Object.defineProperty(exports,"isEmpty",{enumerable:true,get:function(){return S__default.default}});Object.defineProperty(exports,"snakeCase",{enumerable:true,get:function(){return snakeCase_js__default.default}});Object.defineProperty(exports,"capitalize",{enumerable:true,get:function(){return capitalize_js__default.default}});Object.defineProperty(exports,"debounce",{enumerable:true,get:function(){return debounce_js__default.default}});Object.defineProperty(exports,"throttle",{enumerable:true,get:function(){return throttle_js__default.default}});Object.defineProperty(exports,"memoize",{enumerable:true,get:function(){return memoizee__default.default}});Object.defineProperty(exports,"memoizeeProfile",{enumerable:true,get:function(){return profile_js__default.default}});Object.defineProperty(exports,"flow",{enumerable:true,get:function(){return function_js.flow}});Object.defineProperty(exports,"applyPatches",{enumerable:true,get:function(){return immer.applyPatches}});Object.defineProperty(exports,"isDraft",{enumerable:true,get:function(){return immer.isDraft}});Object.defineProperty(exports,"produce",{enumerable:true,get:function(){return immer.produce}});Object.defineProperty(exports,"produceWithPatches",{enumerable:true,get:function(){return immer.produceWithPatches}});Object.defineProperty(exports,"groupBy",{enumerable:true,get:function(){return groupBy_js__default.default}});Object.defineProperty(exports,"deepMerge",{enumerable:true,get:function(){return deepmerge__default.default}});exports.FetcherError=f;exports.Queue=R;exports.Stack=k;exports.TsToolbelt=se;exports.addQueryParams=ot;exports.applyPatchesSafely=hr;exports.areUrlsSame=Xe;exports.arrayToDictionary=kt;exports.assertUniqueIdInArray=bt;exports.base64ToString=et;exports.capitalizeFirstLetter=Y;exports.compressPatches=yr;exports.containsString=me;exports.createFigmaUrl=er;exports.createQueryParams=nr;exports.createUrlWithParams=Qe;exports.cssKebabCase=X;exports.cssVarName=le;exports.decodeBasicAuth=Te;exports.delay=ve;exports.dictionaryToArray=Jr;exports.entries=Qt;exports.escapeRegEx=E;exports.extractPathParts=tr;exports.fetcher=Ae;exports.flatten=zr;exports.formatDate=Ct;exports.getDomainFromEmail=be;exports.getFileNameFromPath=tn;exports.getNonUniqueStringsFromArray=Rt;exports.getRandomInt=vr;exports.getShortName=Se;exports.getSuperstructErrorMsg=sn;exports.hasItemsInItems=wt;exports.isArray=w;exports.isArrayOfStringsUnique=Tt;exports.isBase64=ye;exports.isBrowser=Wt;exports.isDataUrl=Ye;exports.isDate=b;exports.isDefined=Yt;exports.isEmail=nt;exports.isFirstLetterCapital=ge;exports.isFunction=$;exports.isIntegerKey=Dr;exports.isJsDom=zt;exports.isMap=Rr;exports.isNode=h;exports.isNumber=Pr;exports.isObjKey=Xt;exports.isObject=l;exports.isObjectEmpty=Tr;exports.isPlainObject=Ir;exports.isPromise=Er;exports.isRemoteUrl=it;exports.isSet=kr;exports.isString=lt;exports.isSymbol=Sr;exports.isUrl=O;exports.isWebWorker=Bt;exports.keys=Ht;exports.looseEqual=T;exports.looseIndexOf=Ar;exports.makeShortId=pr;exports.makeUuid=cr;exports.minutesFromNowInIsoDate=_t;exports.now=At;exports.nowInIsoDate=Mt;exports.objectToString=ft;exports.parseFigmaUrl=rr;exports.parseNumberWithUnit=Re;exports.pascalCase=de;exports.removeEmptyObjects=Wr;exports.removeNpmScope=we;exports.removeUndefinedProps=Br;exports.removeWrappingQuotes=Pe;exports.slugify=I;exports.sortDateAsc=Nt;exports.sortDateDesc=Lt;exports.sortKeysRecursive=j;exports.sortObject=qr;exports.startsWithLetter=ke;exports.stringHasSpaces=he;exports.stringToBase64=xe;exports.timer=gt;exports.timerInSeconds=Nr;exports.toMilliseconds=Ft;exports.toRawType=Or;exports.toTypeString=d;exports.tryCatch=Ne;exports.uniqueArray=ht;exports.updateDictionaryWithId=Vr;exports.upperCamelCase=tt;exports.yesterdayInIsoDate=vt;//# sourceMappingURL=index.js.map
1
+ 'use strict';var uniqBy_js=require('lodash/uniqBy.js'),dateFns=require('date-fns'),Z=require('lodash/camelCase.js'),H=require('just-kebab-case'),Q=require('lodash/upperFirst.js'),tsExpect=require('ts-expect'),S=require('lodash/isEmpty.js'),snakeCase_js=require('lodash/snakeCase.js'),capitalize_js=require('lodash/capitalize.js'),debounce_js=require('lodash/debounce.js'),throttle_js=require('lodash/throttle.js'),memoizee=require('memoizee'),profile_js=require('memoizee/profile.js'),function_js=require('fp-ts/lib/function.js'),nanoid=require('nanoid'),uuid=require('uuid'),st=require('slugify'),immer=require('immer'),j=require('clean-deep'),groupBy_js=require('lodash/groupBy.js'),deepmerge=require('deepmerge'),superstruct=require('superstruct');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var uniqBy_js__default=/*#__PURE__*/_interopDefault(uniqBy_js);var Z__default=/*#__PURE__*/_interopDefault(Z);var H__default=/*#__PURE__*/_interopDefault(H);var Q__default=/*#__PURE__*/_interopDefault(Q);var S__default=/*#__PURE__*/_interopDefault(S);var snakeCase_js__default=/*#__PURE__*/_interopDefault(snakeCase_js);var capitalize_js__default=/*#__PURE__*/_interopDefault(capitalize_js);var debounce_js__default=/*#__PURE__*/_interopDefault(debounce_js);var throttle_js__default=/*#__PURE__*/_interopDefault(throttle_js);var memoizee__default=/*#__PURE__*/_interopDefault(memoizee);var profile_js__default=/*#__PURE__*/_interopDefault(profile_js);var st__default=/*#__PURE__*/_interopDefault(st);var j__default=/*#__PURE__*/_interopDefault(j);var groupBy_js__default=/*#__PURE__*/_interopDefault(groupBy_js);var deepmerge__default=/*#__PURE__*/_interopDefault(deepmerge);var C=Object.create;var h=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var N=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var r=(t,e)=>h(t,"name",{value:e,configurable:true});var _=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var F=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of v(e))!L.call(t,o)&&o!==n&&h(t,o,{get:()=>e[o],enumerable:!(s=M(e,o))||s.enumerable});return t};var K=(t,e,n)=>(n=t!=null?C(N(t)):{},F(!t||!t.__esModule?h(n,"default",{value:t,enumerable:true}):n,t));var k=_(()=>{});function wt(t){let e={};return t.forEach(n=>{e[`${n}::${typeof n}`]=n;}),Object.keys(e).map(n=>e[n])}r(wt,"uniqueArray");function Tt(t,e){return t.some(n=>e.includes(n))}r(Tt,"hasItemsInItems");function bt({items:t,key:e,errorMsgPrefix:n}){let s=[],o=[];if(t.forEach(i=>{let a=String(i[e]);s.includes(a)?o.push(i):s.push(a);}),o.length>0){let i=o.map(a=>`"${a[e]}"`).join(", ");throw new Error(`${n||`Each item in the array requires unique "${e}" prop.`} These ids are duplicates: ${i}`)}}r(bt,"assertUniqueIdInArray");function Rt(t){let e=new Set(t);return t.length===e.size}r(Rt,"isArrayOfStringsUnique");function Et(t){let e=new Set;return t.filter(n=>e.has(n)?true:(e.add(n),false))}r(Et,"getNonUniqueStringsFromArray");function Pt(t,e){return t.reduce((n,s)=>{let{[e]:o}=s;if(n[o])throw new Error(`Duplicate key: ${o}`);return n[o]=s,n},{})}r(Pt,"arrayToDictionary");var E=class{static{r(this,"Queue");}items;constructor(e){this.items=e||[];}add(e){this.items.push(e);}next(){return this.items.shift()}peekAtNext(){return this.items[0]}clear(){this.items=[];}get length(){return this.items.length}isEmpty(){return this.items.length===0}};var P=class{static{r(this,"Stack");}items;constructor(e){this.items=e||[];}add(e){this.items.unshift(e);}next(){return this.items.shift()}peekAtNext(){return this.items[0]}clear(){this.items=[];}get length(){return this.items.length}isEmpty(){return this.items.length===0}};var Ct=r(()=>new Date().toISOString(),"now");function Mt({date:t,relative:e,includeTime:n,prefix:s}){if(!dateFns.isValid(t))return console.error("formatDate: Invalid date provided:",t),null;let o,i;if(e)i=Math.abs(dateFns.differenceInSeconds(new Date,t))<60?"just now":dateFns.formatDistanceToNowStrict(t,{addSuffix:true});else {let a=t.getFullYear()===new Date().getFullYear();n?o=a?"MMM dd 'at' hh:mm aaa":"MMM dd, yyyy 'at' hh:mm aaa":o=a?"MMM dd":"MMM dd, yyyy",i=dateFns.format(t,o);}return s?`${s} ${i}`:i}r(Mt,"formatDate");var vt=r(()=>new Date().toISOString(),"nowInIsoDate"),Nt=r(()=>dateFns.subDays(new Date,1).toISOString(),"yesterdayInIsoDate");function Lt(t,e){return dateFns.compareAsc(dateFns.parseISO(t.date),dateFns.parseISO(e.date))}r(Lt,"sortDateAsc");function _t(t,e){return dateFns.compareDesc(dateFns.parseISO(t.date),dateFns.parseISO(e.date))}r(_t,"sortDateDesc");var Ft=r(t=>new Date(Date.now()+t*60*1e3).toISOString(),"minutesFromNowInIsoDate");function Kt({hours:t=0,minutes:e=0,seconds:n=0}){return t*36e5+e*6e4+n*1e3}r(Kt,"toMilliseconds");var Wt=typeof window<"u"&&typeof window.document<"u",Bt=typeof self=="object"&&self.constructor&&self.constructor.name==="DedicatedWorkerGlobalScope",w=typeof process<"u"&&process.versions!=null&&process.versions.node!=null,zt=r(()=>typeof window<"u"&&window.name==="nodejs"||navigator.userAgent.includes("Node.js")||navigator.userAgent.includes("jsdom"),"isJsDom");var oe=K(k());function Qt(t){return Object.keys(t)}r(Qt,"keys");function Xt(t){return Object.entries(t)}r(Xt,"entries");function Yt(t,e){return t in e}r(Yt,"isObjKey");function te(t){return t!=null}r(te,"isDefined");var X=r(t=>t.split(".").map(H__default.default).join("-"),"cssKebabCase"),me=r(t=>`--${X(t)}`,"cssVarName");function O(t){return t.replace(/[*+?^${}()|[\]\\]/g,"\\$&")}r(O,"escapeRegEx");function de(t,e){let n=O(e).toLowerCase();return O(t).toLowerCase().search(n)!==-1}r(de,"containsString");function Y(t){return Q__default.default(t)}r(Y,"capitalizeFirstLetter");function ge(t){return !t||t.length===0?false:t[0]===t[0].toUpperCase()}r(ge,"isFirstLetterCapital");function tt(t){return Y(Z__default.default(t))}r(tt,"upperCamelCase");var xe=tt;function et(t){return w?Buffer.from(t,"base64").toString():atob(t)}r(et,"base64ToString");function ye(t){return w?Buffer.from(t).toString("base64"):btoa(t)}r(ye,"stringToBase64");function he(t){if(typeof t!="string")return false;let e=t.replace(/\s+/g,"").replace(/={0,2}$/,"");return !/[^\s0-9a-zA-Z+/]/.test(e)||!/[^\s0-9a-zA-Z\-_]/.test(e)}r(he,"isBase64");function we(t){return t.indexOf(" ")!==-1}r(we,"stringHasSpaces");function Te(t){if(!t.startsWith("@")&&!t.includes("/"))return t;let[,e]=t.split("/");return e||t}r(Te,"removeNpmScope");function I(t){if(typeof t!="string")return false;try{new URL(t);return true}catch{return false}}r(I,"isUrl");var rt=/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,nt=r(t=>typeof t=="string"&&t.length<=320&&rt.test(t),"isEmail"),be=r(t=>nt(t)?t.substring(t.indexOf("@")+1):null,"getDomainFromEmail"),Re=r(t=>{let[e,n]=et(t).split(":");return {username:e,password:n}},"decodeBasicAuth");function Ee(t){let e=String(t).trim(),n=/([a-zA-Z%])+$/,s=e.match(n),o,i;if(s){let a=s.index;o=parseFloat(e.slice(0,a)),[i]=s;}else o=parseFloat(e),i="";if(Number.isNaN(o))throw new Error(`Invalid value, not a number: ${t}`);return {value:o,unit:i}}r(Ee,"parseNumberWithUnit");function Pe(t){return /^[a-zA-Z]/.test(t)}r(Pe,"startsWithLetter");function ke(t){return !t||typeof t!="string"?t:t.replace(/^"(.*)"$/,"$1").replace(/^'(.*)'$/,"$1")}r(ke,"removeWrappingQuotes");var Se=r(t=>{if(!t||S__default.default(t))return;if(!t.includes("="))return t;let e=t.split(","),n=[];return e.forEach(s=>{let[o,i]=s.split("=");if(!(!i||["false","off","no"].includes(i)))return ["true","on","yes"].includes(i)?n.push(o):n.push(i)}),n.join(", ")},"getShortName");var f=class extends Error{static{r(this,"FetcherError");}status;statusText;url;constructor(e,{status:n,statusText:s,url:o,cause:i}){super(e,{cause:i}),this.status=n,this.statusText=s,this.url=o;}};async function Ce({url:t,query:e,body:n,headers:s={},signal:o}){try{if(typeof t=="string"&&!I(t))throw new Error(`Cannot fetch from an invalid url: "${t}"`);if(typeof t!="string"&&!(t instanceof URL))throw new Error(`Url must be a string or URL instance: "${t}"`);let i=n?"POST":"GET",a="";try{let c=t instanceof URL?t:new URL(t);e&&Object.entries(e).forEach(([A,y])=>{typeof y>"u"||y!==null&&c.searchParams.set(A,`${y}`);}),a=c.toString();}catch(c){throw new Error(`Could not start fetcher because was not able to add query params to URL successfully. Url: ${t}, Query params: ${JSON.stringify(e??{})}. ${c instanceof Error?c.message:""}`)}let p={Accept:"application/json"};n&&(p["Content-Type"]="application/json");let u=await fetch(a,{method:i,headers:{...p,...s},body:n?JSON.stringify(n):void 0,signal:o}),d=u.headers.get("Content-Type")?.includes("json");if(!u.ok){let c=d?await u.json():{};throw c?.error?.message?new f(c.error.message,{status:u.status,statusText:u.statusText,url:a}):c?.message?new f(c.message,{status:u.status,statusText:u.statusText,url:a}):new f(`${u.statusText} ${u.status}`,{status:u.status,statusText:u.statusText,url:a})}if(!d){let c=await u.text();throw new f(`Expected JSON response but received text instead: ${c}`,{status:u.status,statusText:u.statusText,url:a})}return await u.json()}catch(i){throw i instanceof f?i:new f(i.message,{url:t.toString(),cause:i})}}r(Ce,"fetcher");var Ne=r(t=>new Promise(e=>setTimeout(e,t)),"delay");function Le(t){if(typeof t=="function")try{let e=t();return e instanceof Promise?e.then(n=>({data:n,error:null}),n=>({data:null,error:n})):{data:e,error:null}}catch(e){return {data:null,error:e}}return t.then(e=>({data:e,error:null}),e=>({data:null,error:e}))}r(Le,"tryCatch");function ot({params:t,urlSearchParams:e}){return Object.entries(t??{}).forEach(([n,s])=>{if(s!=null)if(s instanceof URL)e.set(n,s.toString());else if(Array.isArray(s))e.set(n,s.join(" "));else {let o=`${s}`;if(o==="")return;e.set(n,o);}}),e}r(ot,"addQueryParams");function Xe({url:t,origin:e,queryParams:n}){if(!e&&typeof t=="string"&&!t.startsWith("http"))throw new Error('When using "createUrl" either pass in a full "url" or provide an "origin"');let s=typeof t=="string"?new URL(t,e):e?new URL(t.toString(),e):t;return ot({params:n,urlSearchParams:s.searchParams}),s}r(Xe,"createUrlWithParams");function Ye({a:t,b:e}){return new URL(t).toString()===new URL(e).toString()}r(Ye,"areUrlsSame");function it(t){if(typeof t!="string")return false;try{let e=new URL(t);return e.protocol.startsWith("http:")||e.protocol.startsWith("https:")}catch{return t.startsWith("//")}}r(it,"isRemoteUrl");var tr=r(t=>t.startsWith("data:"),"isDataUrl"),m=r(t=>{let{string:e,strict:n=true,lowerCase:s=true}=typeof t=="string"?{string:t}:t;return st__default.default(e,{lower:s,trim:true,strict:n})},"slugify"),er=r(t=>{let e=/^\/([^/]+)\/([^/]+)/,n=t.match(e);if(!n)return null;let[s,o,i]=n;return [o,i]},"extractPathParts");function rr({fileId:t,nodeId:e,version:n}){if(!t||t.trim().length===0)throw new Error(`Invalid Figma URL, missing file id: ${t}`);let s=new URL(`https://www.figma.com/file/${t}`);return e&&s.searchParams.set("node-id",e),n&&s.searchParams.set("version-id",n.toString()),s.toString()}r(rr,"createFigmaUrl");function nr(t){let e=new URL(t);if(e.hostname!=="www.figma.com"&&e.hostname!=="figma.com"||!it(t))throw new Error(`Please provide a valid Figma URL, got ${t}`);let n=e.searchParams.get("node-id")||void 0,s=e.searchParams.get("version-id")||void 0,[,o,i]=e.pathname.split("/");switch(o){case "proto":case "file":case "board":case "design":{if(!i)throw new Error(`Invalid Figma URL, missing file id: ${t}`);return {type:o,fileId:i,nodeId:n,version:s}}default:throw new Error(`Please provide a valid Figma URL, got ${t}`)}}r(nr,"parseFigmaUrl");function sr(t){return new URLSearchParams(Object.fromEntries(Object.entries(t).filter(([,e])=>typeof e=="string"?e.length>0:e!=null).map(([e,n])=>[e,`${n}`]))).toString()}r(sr,"createQueryParams");function or({filename:t}){let e=m([...t.split(".")].pop()||""),n=m(e?t.substring(0,t.lastIndexOf(".")):t);if(!n)throw new Error(`Invalid filename: ${t}`);return e?`${n}.${e}`:n}r(or,"createSafeFilename");var fr=r(()=>uuid.v4(),"makeUuid"),lr=r(()=>uuid.v7(),"makeUuidV7"),mr=r(()=>m({string:nanoid.nanoid(10),lowerCase:false}),"makeShortId");immer.enablePatches();function wr({baseData:t,patches:e}){return immer.produceWithPatches(t,n=>{immer.applyPatches(n,e.flat());})}r(wr,"compressPatches");function Tr({data:t,changes:e,logError:n=console.error,logAppClientData:s=false}){return e.reduce((o,i,a)=>{try{return immer.applyPatches(o,i.patches)}catch(p){let{LOG_IMMER_APP_CLIENT_DATA:u}=process.env,d=s||u?{data:t,change:i}:i;return n(`applyPatchesSafely had issues (and so will skip) with patches in change ${a}: ${p instanceof Error?p.message:""}`,d),o}},t)}r(Tr,"applyPatchesSafely");var l=r(t=>t!==null&&typeof t=="object"&&!Array.isArray(t),"isObject");function Er(t){return l(t)&&Object.keys(t).length===0}r(Er,"isObjectEmpty");var lt=Object.prototype.toString,x=r(t=>lt.call(t),"toTypeString"),T=Array.isArray,Pr=r(t=>x(t)==="[object Map]","isMap"),kr=r(t=>x(t)==="[object Set]","isSet"),b=r(t=>t instanceof Date,"isDate"),$=r(t=>typeof t=="function","isFunction"),mt=r(t=>typeof t=="string","isString"),Sr=r(t=>typeof t=="number","isNumber"),Or=r(t=>typeof t=="symbol","isSymbol"),Ir=r(t=>l(t)&&$(t.then)&&$(t.catch),"isPromise"),Dr=r(t=>x(t).slice(8,-1),"toRawType"),$r=r(t=>x(t)==="[object Object]","isPlainObject"),Ur=r(t=>mt(t)&&t!=="NaN"&&t[0]!=="-"&&`${parseInt(t,10)}`===t,"isIntegerKey");function dt(t,e){if(t.length!==e.length)return false;let n=true;for(let s=0;n&&s<t.length;s++)n=R(t[s],e[s]);return n}r(dt,"looseCompareArrays");function R(t,e){if(t===e)return true;if(b(t)&&b(e))return t.getTime()===e.getTime();if(T(t)&&T(e))return dt(t,e);if(l(t)&&l(e)){let n=Object.keys(t).length,s=Object.keys(e).length;if(n!==s)return false;for(let o in t){let i=t.hasOwnProperty(o),a=e.hasOwnProperty(o);if(i&&!a||!i&&a||!R(t[o],e[o]))return false}}return String(t)===String(e)}r(R,"looseEqual");function Mr(t,e){return t.findIndex(n=>R(n,e))}r(Mr,"looseIndexOf");function Lr(t){return Math.floor(Math.random()*Math.floor(t))}r(Lr,"getRandomInt");var gt=r(()=>{let t=new Date().getTime();return ()=>new Date().getTime()-t},"timer"),_r=r(()=>{let t=gt();return ()=>t()/1e3},"timerInSeconds");function Wr(t){return Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{})}r(Wr,"sortObject");var Br=r(t=>j__default.default(t),"removeEmptyObjects");function zr(t){return j__default.default(t,{undefinedValues:true,nullValues:true,emptyArrays:false,emptyObjects:false,emptyStrings:true})}r(zr,"removeUndefinedProps");function U(t){if(typeof t!="object"||!t)return t;if(Array.isArray(t)){let s=[];return t.forEach((o,i)=>{s[i]=U(o);}),s}let e=Object.keys(t).sort(),n={};return e.forEach(s=>{n[s]=U(t[s]);}),n}r(U,"sortKeysRecursive");function Jr(t){if(!l(t))throw new Error("Expected an object to flatten");let e={};function n(s,o){Object.entries(s).forEach(([i,a])=>{let p=[...o,i];l(a)&&(e[p.join(".")]=a,n(a,p));});}return r(n,"dive"),n(t,[]),e}r(Jr,"flatten");function Gr(t){return Object.entries(t).map(([e,n])=>({id:e,...n}))}r(Gr,"dictionaryToArray");function Zr(t){return Object.entries(t).reduce((e,[n,s])=>(e[n]={id:n,...s},e),{})}r(Zr,"updateDictionaryWithId");var rn=r(t=>{try{if(!t)return "";let e=t.split(/[/\\]/),s=e[e.length-1].split(".");return s.length===1?s[0]:s.slice(0,-1).join(".")}catch{return t}},"getFileNameFromPath");function an(t){if(t instanceof superstruct.StructError){let[e]=t.failures();if(!e)return "";let{path:n,message:s}=e;return n.length===0?s:`At path: ${n.join(".")} -- ${s}`}return t instanceof Error?t.message:""}r(an,"getSuperstructErrorMsg");
2
+ Object.defineProperty(exports,"uniqBy",{enumerable:true,get:function(){return uniqBy_js__default.default}});Object.defineProperty(exports,"camelCase",{enumerable:true,get:function(){return Z__default.default}});Object.defineProperty(exports,"kebabCase",{enumerable:true,get:function(){return H__default.default}});Object.defineProperty(exports,"paramCase",{enumerable:true,get:function(){return H__default.default}});Object.defineProperty(exports,"expectNever",{enumerable:true,get:function(){return tsExpect.expectNever}});Object.defineProperty(exports,"expectType",{enumerable:true,get:function(){return tsExpect.expectType}});Object.defineProperty(exports,"isEmpty",{enumerable:true,get:function(){return S__default.default}});Object.defineProperty(exports,"snakeCase",{enumerable:true,get:function(){return snakeCase_js__default.default}});Object.defineProperty(exports,"capitalize",{enumerable:true,get:function(){return capitalize_js__default.default}});Object.defineProperty(exports,"debounce",{enumerable:true,get:function(){return debounce_js__default.default}});Object.defineProperty(exports,"throttle",{enumerable:true,get:function(){return throttle_js__default.default}});Object.defineProperty(exports,"memoize",{enumerable:true,get:function(){return memoizee__default.default}});Object.defineProperty(exports,"memoizeeProfile",{enumerable:true,get:function(){return profile_js__default.default}});Object.defineProperty(exports,"flow",{enumerable:true,get:function(){return function_js.flow}});Object.defineProperty(exports,"applyPatches",{enumerable:true,get:function(){return immer.applyPatches}});Object.defineProperty(exports,"isDraft",{enumerable:true,get:function(){return immer.isDraft}});Object.defineProperty(exports,"produce",{enumerable:true,get:function(){return immer.produce}});Object.defineProperty(exports,"produceWithPatches",{enumerable:true,get:function(){return immer.produceWithPatches}});Object.defineProperty(exports,"groupBy",{enumerable:true,get:function(){return groupBy_js__default.default}});Object.defineProperty(exports,"deepMerge",{enumerable:true,get:function(){return deepmerge__default.default}});exports.FetcherError=f;exports.Queue=E;exports.Stack=P;exports.TsToolbelt=oe;exports.addQueryParams=ot;exports.applyPatchesSafely=Tr;exports.areUrlsSame=Ye;exports.arrayToDictionary=Pt;exports.assertUniqueIdInArray=bt;exports.base64ToString=et;exports.capitalizeFirstLetter=Y;exports.compressPatches=wr;exports.containsString=de;exports.createFigmaUrl=rr;exports.createQueryParams=sr;exports.createSafeFilename=or;exports.createUrlWithParams=Xe;exports.cssKebabCase=X;exports.cssVarName=me;exports.decodeBasicAuth=Re;exports.delay=Ne;exports.dictionaryToArray=Gr;exports.entries=Xt;exports.escapeRegEx=O;exports.extractPathParts=er;exports.fetcher=Ce;exports.flatten=Jr;exports.formatDate=Mt;exports.getDomainFromEmail=be;exports.getFileNameFromPath=rn;exports.getNonUniqueStringsFromArray=Et;exports.getRandomInt=Lr;exports.getShortName=Se;exports.getSuperstructErrorMsg=an;exports.hasItemsInItems=Tt;exports.isArray=T;exports.isArrayOfStringsUnique=Rt;exports.isBase64=he;exports.isBrowser=Wt;exports.isDataUrl=tr;exports.isDate=b;exports.isDefined=te;exports.isEmail=nt;exports.isFirstLetterCapital=ge;exports.isFunction=$;exports.isIntegerKey=Ur;exports.isJsDom=zt;exports.isMap=Pr;exports.isNode=w;exports.isNumber=Sr;exports.isObjKey=Yt;exports.isObject=l;exports.isObjectEmpty=Er;exports.isPlainObject=$r;exports.isPromise=Ir;exports.isRemoteUrl=it;exports.isSet=kr;exports.isString=mt;exports.isSymbol=Or;exports.isUrl=I;exports.isWebWorker=Bt;exports.keys=Qt;exports.looseEqual=R;exports.looseIndexOf=Mr;exports.makeShortId=mr;exports.makeUuid=fr;exports.makeUuidV7=lr;exports.minutesFromNowInIsoDate=Ft;exports.now=Ct;exports.nowInIsoDate=vt;exports.objectToString=lt;exports.parseFigmaUrl=nr;exports.parseNumberWithUnit=Ee;exports.pascalCase=xe;exports.removeEmptyObjects=Br;exports.removeNpmScope=Te;exports.removeUndefinedProps=zr;exports.removeWrappingQuotes=ke;exports.slugify=m;exports.sortDateAsc=Lt;exports.sortDateDesc=_t;exports.sortKeysRecursive=U;exports.sortObject=Wr;exports.startsWithLetter=Pe;exports.stringHasSpaces=we;exports.stringToBase64=ye;exports.timer=gt;exports.timerInSeconds=_r;exports.toMilliseconds=Kt;exports.toRawType=Dr;exports.toTypeString=x;exports.tryCatch=Le;exports.uniqueArray=wt;exports.updateDictionaryWithId=Zr;exports.upperCamelCase=tt;exports.yesterdayInIsoDate=Nt;//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/ts-toolbelt@9.6.0/node_modules/ts-toolbelt/out/index.js","../src/arrays.ts","../src/data-structures/queue.ts","../src/data-structures/stack.ts","../src/dates.ts","../src/js-env.ts","../src/type-tools.ts","../src/strings.ts","../src/fetcher.ts","../src/functions.ts","../src/urls.ts","../src/ids.ts","../src/immer.ts","../src/is-types.ts","../src/loose-equal.ts","../src/misc.ts","../src/objects.ts","../src/paths.ts","../src/validation.ts"],"names":["require_out","__commonJSMin","uniqueArray","ar","j","v","__name","hasItemsInItems","arrayA","arrayB","a","assertUniqueIdInArray","items","key","errorMsgPrefix","ids","duplicates","item","itemKey","duplicateIdList","d","isArrayOfStringsUnique","arr","unique","getNonUniqueStringsFromArray","arrayToDictionary","array","keyProp","acc","Queue","initialItems","Stack","now","formatDate","date","relative","includeTime","prefix","isValid","dateFormat","output","differenceInSeconds","formatDistanceToNowStrict","isCurrentYear","format","nowInIsoDate","yesterdayInIsoDate","subDays","sortDateAsc","b","compareAsc","parseISO","sortDateDesc","compareDesc","minutesFromNowInIsoDate","minutes","toMilliseconds","hours","seconds","isBrowser","isWebWorker","isNode","isJsDom","TsToolbelt","keys","obj","entries","isObjKey","isDefined","value","cssKebabCase","str","kebabCase","cssVarName","name","escapeRegEx","string","containsString","haystack","needle","needleNormalized","capitalizeFirstLetter","upperFirst","isFirstLetterCapital","upperCamelCase","camelCase","pascalCase","base64ToString","b64","stringToBase64","isBase64","src","s","stringHasSpaces","removeNpmScope","pkgName","isUrl","url","emailMatcher","isEmail","email","getDomainFromEmail","decodeBasicAuth","auth","username","password","parseNumberWithUnit","stringValue","unitRegex","match","numberValue","unit","unitIndex","startsWithLetter","removeWrappingQuotes","getShortName","default","nameParts","shortNameParts","part","FetcherError","message","status","statusText","cause","fetcher","query","body","customHeaders","signal","method","fetchUrl","u","error","headers","res","resIsJson","resp","text","delay","ms","r","tryCatch","promise","addQueryParams","params","urlSearchParams","createUrlWithParams","origin","queryParams","areUrlsSame","isRemoteUrl","pathUrl","isDataUrl","dataString","slugify","opt","strict","lowerCase","slugifyBase","extractPathParts","path","regex","_","entityType","entityId","createFigmaUrl","fileId","nodeId","version","parseFigmaUrl","figmaUrl","type","createQueryParams","k","makeUuid","uuid","makeShortId","nanoid","enablePatches","compressPatches","baseData","allPatches","produceWithPatches","draft","applyPatches","applyPatchesSafely","data","changes","logError","logAppClientData","change","i","LOG_IMMER_APP_CLIENT_DATA","metadata","isObject","val","isObjectEmpty","objectToString","toTypeString","isArray","isMap","isSet","isDate","isFunction","isString","isNumber","isSymbol","isPromise","toRawType","isPlainObject","isIntegerKey","looseCompareArrays","equal","looseEqual","aKeysCount","bKeysCount","aHasKey","bHasKey","looseIndexOf","getRandomInt","max","timer","startTime","timerInSeconds","timerEnd","sortObject","theObject","removeEmptyObjects","cleanDeep","removeUndefinedProps","sortKeysRecursive","object","newArray","index","sortedKeys","sortedObject","flatten","flattenedObj","dive","thisObj","thisPath","dictionaryToArray","dictionary","id","updateDictionaryWithId","dict","getFileNameFromPath","parts","parts2","getSuperstructErrorMsg","structError","StructError","failure"],"mappings":"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","file":"index.js","sourcesContent":["","export { default as uniqBy } from 'lodash/uniqBy.js';\n\n/**\n * Make an array unique by removing duplicate entries.\n * @param ar - Array to make unique\n * @returns A unique array\n */\nexport function uniqueArray<T>(ar: T[]): T[] {\n const j = {};\n ar.forEach((v) => {\n j[`${v}::${typeof v}`] = v;\n });\n return Object.keys(j).map((v) => j[v]);\n}\n\n/**\n * Is Some Of This Array In That Array?\n * Are any of the items in arrayA in arrayB?\n */\nexport function hasItemsInItems<T extends string | number | boolean>(\n arrayA: T[],\n arrayB: T[],\n): boolean {\n return arrayA.some((a) => arrayB.includes(a));\n}\n\n/**\n * Used to ensure that the `id` prop in each object in an array is unique\n */\nexport function assertUniqueIdInArray<T, Key extends string & keyof T>({\n items,\n key,\n errorMsgPrefix,\n}: {\n items: T[] | readonly T[];\n /** Can be `id` or `value` */\n key: Key;\n errorMsgPrefix?: string;\n}) {\n const ids: string[] = [];\n const duplicates: T[] = [];\n items.forEach((item) => {\n const itemKey = String(item[key]);\n if (ids.includes(itemKey)) {\n duplicates.push(item);\n } else {\n ids.push(itemKey);\n }\n });\n if (duplicates.length > 0) {\n const duplicateIdList = duplicates.map((d) => `\"${d[key]}\"`).join(', ');\n throw new Error(\n `${\n errorMsgPrefix ||\n `Each item in the array requires unique \"${key}\" prop.`\n } These ids are duplicates: ${duplicateIdList}`,\n );\n }\n}\n\nexport function isArrayOfStringsUnique(arr: string[]): boolean {\n const unique = new Set(arr);\n return arr.length === unique.size;\n}\n\nexport function getNonUniqueStringsFromArray(arr: string[]): string[] {\n const unique = new Set<string>();\n return arr.filter((a) => {\n if (unique.has(a)) {\n return true;\n }\n unique.add(a);\n return false;\n });\n}\n\n/**\n * Converts an array of objects to a dictionary using a specified key.\n *\n * @see {@link dictionaryToArray}\n *\n * @example\n * const array = [\n * { id: '123', name: 'foo' },\n * { id: '456', name: 'bar' }\n * ];\n * const result = arrayToDictionary(array);\n * // Result: { '123': { name: 'foo' }, '456': { name: 'bar' } }\n *\n * const customResult = arrayToDictionary(array, 'name');\n * // Result: { 'foo': { id: '123' }, 'bar': { id: '456' } }\n */\nexport function arrayToDictionary<\n T extends Record<string, unknown>,\n K extends keyof T & string,\n>(\n /**\n * The array of objects to convert\n */\n array: T[],\n /**\n * The property to use as the dictionary key\n */\n keyProp: K,\n): Record<string, T> {\n return array.reduce((acc, item) => {\n const { [keyProp]: key } = item;\n if (acc[key as string]) {\n throw new Error(`Duplicate key: ${key}`);\n }\n acc[key as string] = item;\n return acc;\n }, {} as Record<string, T>);\n}\n","/**\n * Creates a First In, First Out (FIFO) data structure list\n */\nexport class Queue<Item> {\n items: Item[];\n constructor(initialItems?: Item[]) {\n this.items = initialItems || [];\n }\n\n /** Add to end of the line */\n add(item: Item): void {\n this.items.push(item);\n }\n\n /** Get first in line */\n next(): Item | undefined {\n return this.items.shift();\n }\n\n peekAtNext(): Item | undefined {\n return this.items[0];\n }\n\n clear(): void {\n this.items = [];\n }\n\n get length(): number {\n return this.items.length;\n }\n\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n}\n","/**\n * Creates a Last In, First Out (LIFO) data structure list\n */\nexport class Stack<Item> {\n items: Item[];\n constructor(initialItems?: Item[]) {\n this.items = initialItems || [];\n }\n\n /** Add item to top of list */\n add(item: Item): void {\n this.items.unshift(item);\n }\n\n /** Remove item from top of list */\n next(): Item {\n return this.items.shift() as Item;\n }\n\n /** Look at item from top of list w/o removing */\n peekAtNext(): Item {\n return this.items[0];\n }\n\n clear(): void {\n this.items = [];\n }\n\n get length(): number {\n return this.items.length;\n }\n\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n}\n","import {\n format,\n parseISO,\n compareAsc,\n compareDesc,\n subDays,\n formatDistanceToNowStrict,\n differenceInSeconds,\n isValid,\n} from 'date-fns';\n\n/**\n * ISO date string (`2021-10-15T15:42:43.083Z`)\n */\nexport type DateIsoString =\n `${number}-${number}-${number}T${number}:${number}:${number}.${number}Z`;\n\nexport const now = (): string => new Date().toISOString();\n\n/**\n * Formats a date as a human-readable string.\n *\n * Options:\n * - If `relative` is true, returns a relative time string like:\n * - 'just now' (within 60 seconds)\n * - '4 days ago', 'in 2 hours', etc.\n * - If `relative` is false or omitted:\n * - Dates from the current year are formatted as 'MMM dd' (e.g., 'Apr 16')\n * - Dates from other years are formatted as 'MMM dd, yyyy' (e.g., 'Oct 24, 2024')\n * - If `includeTime` is true, the time is appended (e.g., 'Apr 16 at 03:45 PM')\n *\n * If `prefix` is provided, it will be prepended to the result (e.g., 'Updated Apr 16').\n *\n * If the provided date is invalid, logs an error and returns null.\n *\n * @param date - The date to format\n * @param relative - Whether to format the date as a relative time string\n * @param includeTime - Whether to include time in the formatted date\n * @param prefix - Optional prefix to prepend to the output string\n *\n * @example\n * formatDate({ date: new Date('2025-04-16') }) // 'Apr 16'\n * formatDate({ date: new Date('2024-10-24') }) // 'Oct 24, 2024'\n * formatDate({ date: new Date(), relative: true }) // 'just now'\n * formatDate({ date: new Date(), prefix: 'Updated', relative: true }) // 'Updated just now'\n */\nexport function formatDate({\n date,\n relative,\n includeTime,\n prefix,\n}: {\n date: Date;\n relative?: boolean;\n includeTime?: boolean;\n prefix?: string;\n}): string | null {\n if (!isValid(date)) {\n console.error('formatDate: Invalid date provided:', date);\n return null;\n }\n\n let dateFormat: string;\n let output: string;\n\n if (relative) {\n const secondsDiff = Math.abs(differenceInSeconds(new Date(), date));\n output =\n secondsDiff < 60\n ? 'just now'\n : formatDistanceToNowStrict(date, { addSuffix: true });\n } else {\n const isCurrentYear = date.getFullYear() === new Date().getFullYear();\n if (includeTime) {\n dateFormat = isCurrentYear\n ? `MMM dd 'at' hh:mm aaa`\n : `MMM dd, yyyy 'at' hh:mm aaa`;\n } else {\n dateFormat = isCurrentYear ? 'MMM dd' : 'MMM dd, yyyy';\n }\n output = format(date, dateFormat);\n }\n\n return prefix ? `${prefix} ${output}` : output;\n}\n\n/** Get the ISO date string (`2021-10-15T15:42:43.083Z`) for right now */\nexport const nowInIsoDate = (): string => new Date().toISOString();\n\nexport const yesterdayInIsoDate = (): string =>\n subDays(new Date(), 1).toISOString();\n\nexport function sortDateAsc(a: { date: string }, b: { date: string }): number {\n return compareAsc(parseISO(a.date), parseISO(b.date));\n}\n\nexport function sortDateDesc(a: { date: string }, b: { date: string }): number {\n return compareDesc(parseISO(a.date), parseISO(b.date));\n}\n\nexport const minutesFromNowInIsoDate = (minutes: number): string => {\n return new Date(Date.now() + minutes * 60 * 1000).toISOString();\n};\n\n/**\n * Converts hours, minutes, and seconds to milliseconds\n * @param h - hours (optional)\n * @param m - minutes (optional)\n * @param s - seconds (optional)\n * @returns total milliseconds\n */\nexport function toMilliseconds({\n hours = 0,\n minutes = 0,\n seconds = 0,\n}: {\n hours?: number;\n minutes?: number;\n seconds?: number;\n}) {\n const MS_PER_SECOND = 1000;\n const MS_PER_MINUTE = 60 * MS_PER_SECOND;\n const MS_PER_HOUR = 60 * MS_PER_MINUTE;\n\n return (\n hours * MS_PER_HOUR + minutes * MS_PER_MINUTE + seconds * MS_PER_SECOND\n );\n}\n","/* global window self */\n\n// Thanks! https://github.com/flexdinesh/browser-or-node/blob/master/src/index.js\n\nexport const isBrowser =\n typeof window !== 'undefined' && typeof window.document !== 'undefined';\n\n/* eslint-disable no-restricted-globals */\nexport const isWebWorker =\n typeof self === 'object' &&\n self.constructor &&\n self.constructor.name === 'DedicatedWorkerGlobalScope';\n/* eslint-enable no-restricted-globals */\n\nexport const isNode =\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\n/**\n * @see https://github.com/jsdom/jsdom/releases/tag/12.0.0\n * @see https://github.com/jsdom/jsdom/issues/1537\n */\n/* eslint-disable no-undef */\nexport const isJsDom = () =>\n (typeof window !== 'undefined' && window.name === 'nodejs') ||\n navigator.userAgent.includes('Node.js') ||\n navigator.userAgent.includes('jsdom');\n","import type { FC, Component } from 'react';\nimport type {\n PackageJson as PackageJsonBase,\n TsConfigJson as TsConfigJsonBase,\n} from 'type-fest';\n\nexport { expectNever, expectType } from 'ts-expect';\nexport type { TypeEqual, TypeOf } from 'ts-expect';\nexport type {\n Except,\n Simplify,\n Merge,\n SetRequired,\n SetOptional,\n AsyncReturnType,\n PartialDeep,\n} from 'type-fest';\n// https://github.com/millsp/ts-toolbelt\nexport * as TsToolbelt from 'ts-toolbelt';\nexport { default as isEmpty } from 'lodash/isEmpty.js';\n\n/**\n * Turns `() => Promise<string>` into `string`\n */\nexport type PromiseResult<T> = T extends (...args: unknown[]) => unknown\n ? Awaited<ReturnType<T>>\n : never;\n\n/**\n * Opposite of `keyof`\n * @example\n * type Foo = { a: string; b: number; c: boolean };\n * type Bar = ValueOf<Foo>; // string | number | boolean\n */\nexport type ValueOf<T> = T[keyof T];\n\nexport type GetValueOrAsyncReturnValue<X> = X extends (\n ...args: unknown[]\n) => unknown\n ? Awaited<X>\n : X;\n\n/**\n * @template V would get `string` if passed in either `string` or `() => Promise<string>`\n */\nexport type ValueOrGetValue<V> = V extends (\n ...args: unknown[]\n) => Promise<infer X>\n ? X\n : V;\n\n/**\n * Typesafe `Object.keys()` that returns better than `string[]`\n */\nexport function keys<O extends Record<string, unknown>>(\n obj: O,\n): Array<keyof O> {\n return Object.keys(obj) as Array<keyof O>;\n}\n\n/**\n * Typesafe `Object.entries()` that retains the keys actual string value instead of just `string`\n */\nexport function entries<O extends Record<string, unknown>>(\n obj: O,\n): Array<[keyof O, O[keyof O]]> {\n return Object.entries(obj) as Array<[keyof O, O[keyof O]]>;\n}\n\n/**\n * Typesafe way to check if a key is in an object\n */\nexport function isObjKey<T extends Record<string | number | symbol, unknown>>(\n key: string | number | symbol,\n obj: T,\n): key is keyof T {\n return key in obj;\n}\n\n/**\n * Check whether a value is defined (non-nullable), meaning it is neither `null`\n * or `undefined`. This can be useful as a type-guard, as for example:\n * `[1, null].filter(Boolean)` does not always type-guard correctly.\n * @example\n * ```\n * import {isDefined} from 'ts-extras';\n * [1, null, 2, undefined].filter(isDefined); // => [1, 2]\n *\n```\n*/\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\n/**\n * Get Props from a React Component\n * @example\n * type Props = PropsFrom<typeof Button>;\n */\nexport type PropsFrom<TheComponent> = TheComponent extends FC<infer Props>\n ? Props\n : TheComponent extends Component<infer Props>\n ? Props\n : never;\n\nexport interface PackageJson extends PackageJsonBase, Record<string, unknown> {\n scripts?: {\n [scriptName: string]: string;\n };\n exports?: {\n [key: string]: PackageJsonBase.Exports;\n };\n}\n\nexport interface TsConfigJson\n extends TsConfigJsonBase,\n Record<string, unknown> {}\n\n/**\n * Expands object types recursively\n * @link https://stackoverflow.com/a/57683652\n * @deprecated Use `Simplify` instead\n */\nexport type ExpandRecursively<T> = T extends Record<string, unknown>\n ? T extends infer O\n ? { [K in keyof O]: ExpandRecursively<O[K]> }\n : never\n : T;\n\n/**\n * Workaround to allow typed info to work with Object.entries\n */\nexport type Entries<T> = {\n [K in keyof T]: [K, T[K]];\n}[keyof T][];\n\ndeclare const __brandKey: unique symbol;\n","import camelCase from 'lodash/camelCase.js';\nimport kebabCase from 'just-kebab-case'; // Why not lodash/kebabCase? https://github.com/lodash/lodash/issues/2843#issuecomment-262255270\nimport upperFirst from 'lodash/upperFirst.js';\nimport { isNode } from './js-env';\nimport { isEmpty } from './type-tools';\n\nexport { default as snakeCase } from 'lodash/snakeCase.js';\nexport { default as capitalize } from 'lodash/capitalize.js';\nexport { camelCase, kebabCase, kebabCase as paramCase };\n\n/**\n * Lower and split on dots, that's it. Do NOT split standalone strings on\n * numbers, caps, etc. Note that we split/join specifically to process each\n * segment of a token name, ie if `color.primary`, we process 'color' and 'primary'\n * individually\n */\nexport const cssKebabCase = (str: string) =>\n str.split('.').map(kebabCase).join('-');\nexport const cssVarName = (name: string) => `--${cssKebabCase(name)}`;\n\n/**\n * This function takes a string and escapes any regex related characters\n * Intended to be used to \"cleanse\" user input of regex that causes failures when using string operators\n */\nexport function escapeRegEx(string: string): string {\n return string.replace(/[*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\n/**\n * Basic \"fuzzy\" search of one string within another.\n * Both the haystack and needle are escaped for regex characters, then converted to lower case\n * If the needle appears in the haystack, will return true, otherwise returns false\n * @param {string} haystack - string to seach within\n * @param {string} needle - string being searched for\n * @returns {boolean}\n */\nexport function containsString(haystack: string, needle: string): boolean {\n const needleNormalized = escapeRegEx(needle).toLowerCase();\n const haystackNormalized = escapeRegEx(haystack).toLowerCase();\n return haystackNormalized.search(needleNormalized) !== -1;\n}\n\nexport function capitalizeFirstLetter(string: string): string {\n return upperFirst(string);\n}\n\nexport function isFirstLetterCapital(str: string): boolean {\n if (!str || str.length === 0) return false;\n return str[0] === str[0].toUpperCase();\n}\n\n/**\n * Transform into a string of capitalized words without separators. How React Component names are transformed.\n * aka PascalCase\n */\nexport function upperCamelCase(str: string): string {\n return capitalizeFirstLetter(camelCase(str));\n}\nexport const pascalCase = upperCamelCase;\n\nexport function base64ToString(b64: string): string {\n return isNode ? Buffer.from(b64, 'base64').toString() : atob(b64);\n}\n\nexport function stringToBase64(string: string): string {\n return isNode ? Buffer.from(string).toString('base64') : btoa(string);\n}\n\n/**\n * check if a value is a valid Base64 string\n */\nexport function isBase64(src: unknown): src is string {\n if (typeof src !== 'string') return false;\n const s = src.replace(/\\s+/g, '').replace(/={0,2}$/, '');\n return !/[^\\s0-9a-zA-Z+/]/.test(s) || !/[^\\s0-9a-zA-Z\\-_]/.test(s);\n}\n\nexport function stringHasSpaces(string: string): boolean {\n return string.indexOf(' ') !== -1;\n}\n\n/**\n * Removes the NPM \"@scope\" in pkg names\n * `@scope/name` => `name`\n * `name` => `name`\n */\nexport function removeNpmScope(pkgName: string): string {\n if (!pkgName.startsWith('@') && !pkgName.includes('/')) {\n return pkgName;\n }\n const [, name] = pkgName.split('/');\n if (!name) return pkgName;\n return name;\n}\n\nexport function isUrl(url: unknown): url is string {\n if (typeof url !== 'string') return false;\n try {\n const _u = new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n// RFC 5322 spec, https://emailregex.com/\nconst emailMatcher =\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n/**\n * Check that email is < 320 chars (according to spec), then if passes regex.\n * @link https://www.rfc-editor.org/errata/eid1690#:~:text=It%20should%20say%3A-,In%20addition%20to%20restrictions%20on%20syntax%2C%20there%20is%20a%20length,total%20length%20of%20320%20characters.\n */\nexport const isEmail = (email: unknown): email is string =>\n typeof email === 'string' && email.length <= 320 && emailMatcher.test(email);\n\n/**\n * Returns \"knapsack.cloud\" from \"bloom@knapsack.cloud\", if valid email\n */\nexport const getDomainFromEmail = (email: string): string | null =>\n isEmail(email) ? email.substring(email.indexOf('@') + 1) : null;\n\n/**\n * Basic auth headers are username:password in base64, decode and compare\n */\nexport const decodeBasicAuth = (\n auth: string,\n): { username: string; password: string } => {\n const [username, password] = base64ToString(auth).split(':');\n return { username, password };\n};\n\n/**\n * Parse a string that may contain a unit, like \"10px\" or \"10%\"\n */\nexport function parseNumberWithUnit(value: string | number): {\n value: number;\n unit?: string;\n} {\n const stringValue = String(value).trim();\n const unitRegex = /([a-zA-Z%])+$/;\n const match = stringValue.match(unitRegex);\n\n let numberValue: number;\n let unit: string;\n\n if (match) {\n const unitIndex = match.index;\n numberValue = parseFloat(stringValue.slice(0, unitIndex));\n [unit] = match;\n } else {\n numberValue = parseFloat(stringValue);\n unit = '';\n }\n if (Number.isNaN(numberValue)) {\n throw new Error(`Invalid value, not a number: ${value}`);\n }\n\n return { value: numberValue, unit };\n}\n\n/**\n * Check if a strings first character is a letter\n */\nexport function startsWithLetter(str: string): boolean {\n return /^[a-zA-Z]/.test(str);\n}\n\n/**\n * Removes wrapping single or double quotes from a string\n */\nexport function removeWrappingQuotes(str: string): string {\n if (!str || typeof str !== 'string') return str;\n return (\n str\n // remove double quotes\n .replace(/^\"(.*)\"$/, '$1')\n // remove single quotes\n .replace(/^'(.*)'$/, '$1')\n );\n}\n\n/**\n * Transforms a name string containing key-value pairs into a shortened version.\n *\n * Example:\n * Input: \"mode=dark, status=on, debug=false\"\n * Output: \"dark, status\"\n */\nexport const getShortName = (name: string) => {\n if (!name || isEmpty(name)) return;\n\n if (!name.includes('=')) {\n return name;\n }\n\n const nameParts = name.split(',');\n const shortNameParts: string[] = [];\n\n nameParts.forEach((part) => {\n const [key, value] = part.split('=');\n\n if (!value || ['false', 'off', 'no'].includes(value)) {\n return;\n }\n if (['true', 'on', 'yes'].includes(value)) {\n return shortNameParts.push(key);\n }\n return shortNameParts.push(value);\n });\n return shortNameParts.join(', ');\n};\n","import { isUrl } from './strings';\n\nexport class FetcherError extends Error {\n status?: number;\n statusText?: string;\n url: string;\n constructor(\n message: string,\n {\n status,\n statusText,\n url,\n cause,\n }: { status?: number; statusText?: string; url: string; cause?: Error },\n ) {\n super(message, { cause });\n this.status = status;\n this.statusText = statusText;\n this.url = url;\n }\n}\n\nexport async function fetcher<T = Record<string, unknown>>({\n url,\n query,\n body,\n headers: customHeaders = {},\n signal,\n}: {\n url: string | URL;\n query?: Record<string, string | boolean | number>;\n body?: Record<string, any>;\n headers?: RequestInit['headers'];\n signal?: AbortSignal;\n}): Promise<T> {\n try {\n if (typeof url === 'string' && !isUrl(url)) {\n throw new Error(`Cannot fetch from an invalid url: \"${url}\"`);\n }\n if (typeof url !== 'string' && !(url instanceof URL)) {\n throw new Error(`Url must be a string or URL instance: \"${url}\"`);\n }\n const method = body ? 'POST' : 'GET';\n let fetchUrl = '';\n try {\n const u = url instanceof URL ? url : new URL(url);\n if (query) {\n Object.entries(query).forEach(([key, value]) => {\n if (typeof value === 'undefined') return;\n if (value === null) return;\n u.searchParams.set(key, `${value}`);\n });\n }\n fetchUrl = u.toString();\n } catch (error) {\n throw new Error(\n `Could not start fetcher because was not able to add query params to URL successfully. Url: ${url}, Query params: ${JSON.stringify(\n query ?? {},\n )}. ${error instanceof Error ? error.message : ''}`,\n );\n }\n\n const headers: RequestInit['headers'] = {\n Accept: 'application/json',\n };\n if (body) headers['Content-Type'] = 'application/json';\n\n const res = await fetch(fetchUrl, {\n method,\n headers: { ...headers, ...customHeaders },\n body: body ? JSON.stringify(body) : undefined,\n signal,\n });\n const resIsJson = res.headers.get('Content-Type')?.includes('json');\n\n if (!res.ok) {\n const resp = resIsJson ? await res.json() : {};\n if (resp?.error?.message) {\n throw new FetcherError(resp.error.message, {\n status: res.status,\n statusText: res.statusText,\n url: fetchUrl,\n });\n } else if (resp?.message) {\n throw new FetcherError(resp.message, {\n status: res.status,\n statusText: res.statusText,\n url: fetchUrl,\n });\n } else {\n throw new FetcherError(`${res.statusText} ${res.status}`, {\n status: res.status,\n statusText: res.statusText,\n url: fetchUrl,\n });\n }\n }\n\n if (!resIsJson) {\n const text = await res.text();\n throw new FetcherError(\n `Expected JSON response but received text instead: ${text}`,\n {\n status: res.status,\n statusText: res.statusText,\n url: fetchUrl,\n },\n );\n }\n\n const data: T = await res.json();\n return data;\n } catch (error) {\n if (error instanceof FetcherError) {\n throw error;\n }\n throw new FetcherError(error.message, {\n url: url.toString(),\n cause: error,\n });\n }\n}\n","export { default as debounce } from 'lodash/debounce.js';\nexport { default as throttle } from 'lodash/throttle.js';\n\n// https://www.npmjs.com/package/memoizee\nexport { default as memoize } from 'memoizee';\nexport { default as memoizeeProfile } from 'memoizee/profile.js';\nexport { flow } from 'fp-ts/lib/function.js';\n\n/**\n * Create a fake time delay in an async function useful for testing\n * @example\n * await delay(1000);\n */\nexport const delay = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\n// Types for the result object with discriminated union\ntype Success<T> = {\n data: T;\n error: null;\n};\n\ntype Failure<E> = {\n data: null;\n error: E;\n};\n\ntype Result<T, E = Error> = Success<T> | Failure<E>;\n\n/**\n * Wraps a promise in a try/catch and returns a result object with the data or error\n *\n * As long as `strictNullChecks: true` then doing something like `if (error) throw error` is required to use `data`\n *\n * @example\n * const { data, error } = await tryCatch(() => someAsyncFunction({ id: 42 }));\n * if (error) {\n * throw error;\n * }\n * data.info;\n */\nexport async function tryCatch<T, E = Error>(\n promise: Promise<T>,\n): Promise<Result<T, E>> {\n try {\n const data = await promise;\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as E };\n }\n}\n","import slugifyBase from 'slugify';\n\nexport type QueryParamsInput = Record<\n string,\n string | number | boolean | undefined | null | string[] | URL\n>;\n\n/**\n * Util to add query params in a type safe way\n * URL's will be stringified\n * `booleans` & `numbers` will be stringified\n * `null` & `undefined` will be ommitted\n * Arrays of strings will be joined with a space\n *\n * @example\n * ```ts\n * const urlSearchParams = new URLSearchParams();\n * addQueryParams({\n * params: { foo: 'bar', count: 42, tags: ['one', 'two'] },\n * urlSearchParams,\n * });\n * ```\n *\n * @see {@link createUrlWithParams} for creating a full URL\n */\nexport function addQueryParams<Params extends QueryParamsInput>({\n params,\n urlSearchParams,\n}: {\n params: Params;\n /**\n * This will be mutated in place AND returned\n */\n urlSearchParams: URLSearchParams;\n}) {\n Object.entries(params ?? {}).forEach(([key, value]) => {\n if (value === undefined || value === null) return;\n if (value instanceof URL) {\n urlSearchParams.set(key, value.toString());\n } else if (Array.isArray(value)) {\n urlSearchParams.set(key, value.join(' '));\n } else {\n const v = `${value}`;\n if (v === '') return;\n urlSearchParams.set(key, v);\n }\n });\n return urlSearchParams;\n}\n\n/**\n * Creates a URL with query parameters, supporting both full URLs and relative paths\n * @example\n * ```ts\n * createUrlWithParams({\n * url: 'https://example.com',\n * queryParams: { foo: 'bar', count: 42, tags: ['one', 'two'] }\n * })\n * // => URL('https://example.com?foo=bar&count=42&tags=one%20two')\n * ```\n *\n * @see {@link addQueryParams} for adding just query params\n */\nexport function createUrlWithParams<Params extends QueryParamsInput>({\n /** Can either be a full URL or a relative one (but that requires passing in \"origin\") */\n url,\n /** Base URL to use when url is a relative path */\n origin,\n /**\n * URL's will be stringified\n * Arrays of strings will be joined with a space\n * Other values will be stringified\n */\n queryParams,\n}: {\n /**\n * Can either be a full URL or a relative one (but that requires passing in \"origin\")\n */\n url: string | URL;\n /**\n * URL's will be stringified\n * Arrays of strings will be joined with a space\n * Other values will be stringified\n */\n queryParams: Params;\n origin?: string;\n}) {\n if (!origin && typeof url === 'string' && !url.startsWith('http')) {\n throw new Error(\n `When using \"createUrl\" either pass in a full \"url\" or provide an \"origin\"`,\n );\n }\n\n const u =\n // eslint-disable-next-line no-nested-ternary\n typeof url === 'string'\n ? new URL(url, origin)\n : origin\n ? new URL(url.toString(), origin)\n : url;\n addQueryParams({ params: queryParams, urlSearchParams: u.searchParams });\n return u;\n}\n\nexport interface GitLabParsedUrl {\n fullPath: string;\n}\n\nexport interface BitbucketParsedUrl {\n fullPath: string;\n}\n\nexport interface GitHubParsedUrl {\n owner: string;\n repoName: string;\n}\n\nexport function areUrlsSame({ a, b }: { a: string; b: string }) {\n return new URL(a).toString() === new URL(b).toString();\n}\n\nexport function isRemoteUrl(url: string): boolean {\n if (typeof url !== 'string') return false;\n try {\n // Throws here if malformed URL\n const pathUrl = new URL(url);\n // Be VERY specific with protocols here, since URL() does no protocol validation\n return (\n pathUrl.protocol.startsWith('http:') ||\n pathUrl.protocol.startsWith('https:')\n );\n } catch (e) {\n // Starting a url with '//' is invalid to URL(), but we support it\n return url.startsWith('//');\n }\n}\n\n/**\n * @link https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\n */\nexport const isDataUrl = (dataString: string): boolean =>\n dataString.startsWith('data:');\n\nexport const slugify = (\n opt:\n | string\n | {\n string: string;\n /**\n * Removes all special characters. Necessary when used to create JS targets\n * that are invalid when special characters are present.\n */\n strict?: boolean;\n lowerCase?: boolean;\n },\n): string => {\n const {\n string,\n strict = true,\n lowerCase = true,\n } = typeof opt === 'string' ? { string: opt } : opt;\n return slugifyBase(string, {\n lower: lowerCase,\n trim: true,\n strict,\n });\n};\n\n/**\n * When dealing with nav paths, we need to find the entity type of the link (first\n * part, e.g. 'page' or 'pattern') and the entity id (second part, e.g. 'home').\n */\nexport const extractPathParts = (path: string): string[] | null => {\n const regex = /^\\/([^/]+)\\/([^/]+)/;\n const match = path.match(regex);\n\n if (!match) return null;\n\n const [_, entityType, entityId] = match;\n return [entityType, entityId];\n};\n\nexport function createFigmaUrl({\n fileId,\n nodeId,\n version,\n}: {\n fileId: string;\n nodeId?: string;\n version?: string | number;\n}) {\n if (!fileId || fileId.trim().length === 0) {\n throw new Error(`Invalid Figma URL, missing file id: ${fileId}`);\n }\n const url = new URL(`https://www.figma.com/file/${fileId}`);\n if (nodeId) {\n url.searchParams.set('node-id', nodeId);\n }\n if (version) {\n url.searchParams.set('version-id', version.toString());\n }\n return url.toString();\n}\n\nexport function parseFigmaUrl(figmaUrl: string): {\n type: 'proto' | 'file' | 'design' | 'board';\n fileId: string;\n nodeId?: string;\n version?: string;\n} {\n const url = new URL(figmaUrl);\n // tried to update to use the regex from figma, but it ended up being too strict\n // noting here in case we revisit\n // /https:\\/\\/[\\w\\.-]+\\.?figma.com\\/([\\w-]+)\\/([0-9a-zA-Z]{22,128})(?:\\/.*)?$/;\n if (\n (url.hostname !== 'www.figma.com' && url.hostname !== 'figma.com') ||\n !isRemoteUrl(figmaUrl) // Ensure it's a http/https URL.\n ) {\n throw new Error(`Please provide a valid Figma URL, got ${figmaUrl}`);\n }\n const nodeId = url.searchParams.get('node-id') || undefined;\n const version = url.searchParams.get('version-id') || undefined;\n const [, type, fileId] = url.pathname.split('/');\n switch (type) {\n case 'proto':\n case 'file':\n case 'board':\n case 'design': {\n if (!fileId) {\n throw new Error(`Invalid Figma URL, missing file id: ${figmaUrl}`);\n }\n return {\n type,\n fileId,\n nodeId,\n version,\n };\n }\n default:\n throw new Error(`Please provide a valid Figma URL, got ${figmaUrl}`);\n }\n}\n\n/**\n * Create a query string from an object of params\n * Does not include undefined, null, or empty string values\n * Does not include leading `?`\n */\nexport function createQueryParams(\n params: Record<string, string | number | boolean | undefined | null>,\n) {\n return new URLSearchParams(\n Object.fromEntries(\n Object.entries(params)\n .filter(([, v]) => {\n if (typeof v === 'string') {\n // removing empty strings\n return v.length > 0;\n }\n // removing null or undefined\n return v !== undefined && v !== null;\n })\n .map(([k, v]): [string, string] => [\n k,\n // sending up non-strings as strings\n `${v}`,\n ]),\n ),\n ).toString();\n}\n","import { nanoid } from 'nanoid';\nimport { v4 as uuid } from 'uuid';\nimport { slugify } from './urls';\n\nexport const makeUuid = () => uuid();\n\n/**\n * Short ID that is also slugified\n */\nexport const makeShortId = () =>\n slugify({\n string: nanoid(10),\n lowerCase: false,\n });\n","import {\n Patch,\n applyPatches,\n enablePatches,\n produceWithPatches,\n produce,\n isDraft,\n type Draft,\n type Objectish,\n} from 'immer';\n\nexport { produce, produceWithPatches, applyPatches, isDraft };\nexport type { Patch, Draft };\n\nenablePatches();\n\n/**\n * Take an array of Immer patches and compress them down to the smallest amount of patches\n * @link https://medium.com/@dedels/using-immer-to-compress-immer-patches-f382835b6c69\n */\nexport function compressPatches<Data extends Objectish>({\n baseData,\n patches: allPatches,\n}: {\n baseData: Data;\n patches: Patch[][] | Patch[];\n}) {\n return produceWithPatches(baseData, (draft) => {\n applyPatches(draft, allPatches.flat());\n });\n}\n\n/**\n * Loop over changes to applyPatches in small batches (safer) instead of all at once\n * If there are errors, it will skip that change and continue on\n */\nexport function applyPatchesSafely<Data extends Objectish>({\n data,\n changes,\n logError = console.error,\n logAppClientData = false,\n}: {\n data: Data;\n changes: { patches: Patch[] }[];\n logError?: (msg: unknown, ...optionalMsgs: unknown[]) => void;\n logAppClientData?: boolean;\n}): Data {\n return changes.reduce((acc, change, i) => {\n try {\n return applyPatches(acc, change.patches);\n } catch (error) {\n const { LOG_IMMER_APP_CLIENT_DATA } = process.env;\n const metadata =\n logAppClientData || LOG_IMMER_APP_CLIENT_DATA\n ? { data, change }\n : change;\n logError(\n `applyPatchesSafely had issues (and so will skip) with patches in change ${i}: ${\n error instanceof Error ? error.message : ''\n }`,\n metadata,\n );\n return acc;\n }\n }, data);\n}\n","export const isObject = (\n val: unknown,\n): val is Record<string | symbol, unknown> =>\n val !== null && typeof val === 'object' && !Array.isArray(val);\n\nexport function isObjectEmpty(\n val: unknown,\n): val is Record<string | symbol, unknown> {\n return isObject(val) && Object.keys(val).length === 0;\n}\n\nexport const objectToString = Object.prototype.toString;\nexport const toTypeString = (value: unknown): string =>\n objectToString.call(value);\n\n// eslint-disable-next-line prefer-destructuring\nexport const isArray = Array.isArray;\nexport const isMap = (val: unknown): val is Map<any, any> =>\n toTypeString(val) === '[object Map]';\nexport const isSet = (val: unknown): val is Set<any> =>\n toTypeString(val) === '[object Set]';\n\nexport const isDate = (val: unknown): val is Date => val instanceof Date;\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const isFunction = (val: unknown): val is Function =>\n typeof val === 'function';\nexport const isString = (val: unknown): val is string =>\n typeof val === 'string';\nexport const isNumber = (val: unknown): val is number =>\n typeof val === 'number';\nexport const isSymbol = (val: unknown): val is symbol =>\n typeof val === 'symbol';\n\nexport const isPromise = <T = any>(val: unknown): val is Promise<T> => {\n return isObject(val) && isFunction(val.then) && isFunction(val.catch);\n};\n\nexport const toRawType = (value: unknown): string => {\n // extract \"RawType\" from strings like \"[object RawType]\"\n return toTypeString(value).slice(8, -1);\n};\n\nexport const isPlainObject = (val: unknown): val is Record<string, unknown> =>\n toTypeString(val) === '[object Object]';\n\nexport const isIntegerKey = (key: unknown): boolean =>\n isString(key) &&\n key !== 'NaN' &&\n key[0] !== '-' &&\n `${parseInt(key, 10)}` === key;\n","import { isArray, isDate, isObject } from './is-types';\n\n// Thanks! https://github.com/vuejs/vue-next/blob/master/packages/shared/src/looseEqual.ts\n\nfunction looseCompareArrays(a: unknown[], b: unknown[]): boolean {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\n\nexport function looseEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n\n if (isDate(a) && isDate(b)) {\n return a.getTime() === b.getTime();\n }\n\n if (isArray(a) && isArray(b)) {\n return looseCompareArrays(a, b);\n }\n\n if (isObject(a) && isObject(b)) {\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n // eslint-disable-next-line guard-for-in\n for (const key in a) {\n // eslint-disable-next-line no-prototype-builtins\n const aHasKey = a.hasOwnProperty(key);\n // eslint-disable-next-line no-prototype-builtins\n const bHasKey = b.hasOwnProperty(key);\n if (\n (aHasKey && !bHasKey) ||\n (!aHasKey && bHasKey) ||\n !looseEqual(a[key], b[key])\n ) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\n\nexport function looseIndexOf(arr: unknown[], val: unknown): number {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n","/**\n * Get Random Integer\n */\nexport function getRandomInt(max: number): number {\n return Math.floor(Math.random() * Math.floor(max));\n}\n\n/**\n * Timer results in ms\n */\nexport const timer = (): (() => number) => {\n const startTime = new Date().getTime();\n return () => new Date().getTime() - startTime;\n};\n/**\n * The above timer, but in seconds instead of ms\n */\nexport const timerInSeconds = (): (() => number) => {\n const timerEnd = timer();\n return () => timerEnd() / 1000;\n};\n","import cleanDeep from 'clean-deep';\nimport { isObject } from './is-types';\n\nexport { default as groupBy } from 'lodash/groupBy.js';\n// @todo: look into lodash/merge vs deepMerge behavior differences and use cases (ie. immutable vs not)\n// export { default as deepMerge } from 'lodash/merge.js';\nexport { default as deepMerge } from 'deepmerge';\n\n/**\n * Sort object by alphabetizing keys.\n */\nexport function sortObject<T extends Record<string, unknown>>(theObject: T): T {\n return Object.keys(theObject)\n .sort()\n .reduce((obj, key: keyof T) => {\n obj[key] = theObject[key];\n return obj;\n }, <T>{});\n}\n\n/**\n * Remove empty objects in nested object.\n * Leverage stringify to convert empty objects to undefined, which is removed\n * during stringification.\n */\nexport const removeEmptyObjects = <T extends Record<string, unknown>>(\n src: T,\n): Partial<T> => cleanDeep(src);\n\n/**\n * Removes keys like `{ x: undefined }` from the object\n */\nexport function removeUndefinedProps<T extends Record<PropertyKey, unknown>>(\n obj: T,\n): T {\n return cleanDeep(obj, {\n undefinedValues: true,\n nullValues: true,\n emptyArrays: false,\n emptyObjects: false,\n emptyStrings: true,\n }) as T;\n}\n\n/**\n * Sort object and arrays recursively by alphabetizing keys.\n */\nexport function sortKeysRecursive(object) {\n if (typeof object !== 'object' || !object) return object;\n if (Array.isArray(object)) {\n const newArray: any[] = [];\n object.forEach((item, index) => {\n newArray[index] = sortKeysRecursive(item);\n });\n return newArray;\n }\n const sortedKeys = Object.keys(object).sort();\n const sortedObject = {};\n sortedKeys.forEach((key) => {\n sortedObject[key] = sortKeysRecursive(object[key]);\n });\n return sortedObject;\n}\n\n/**\n * Turn a nested object into a single-level object with dot notation keys and\n * values equal to the deepest **object** in the nested object.\n */\nexport function flatten(\n obj: Record<string, unknown>,\n): Record<string, Record<string, unknown>> {\n if (!isObject(obj)) {\n throw new Error('Expected an object to flatten');\n }\n const flattenedObj: Record<string, Record<string, unknown>> = {};\n\n function dive(thisObj: Record<string, unknown>, path: string[]) {\n Object.entries(thisObj).forEach(([key, value]) => {\n const thisPath = [...path, key];\n if (isObject(value)) {\n flattenedObj[thisPath.join('.')] = value;\n dive(value, thisPath);\n }\n });\n }\n\n dive(obj, []);\n\n return flattenedObj;\n}\n\n/**\n * This function takes a dictionary of objects and returns an array of objects with the `id` merged into the object.\n * Helpful when you have a dictionary of objects and you want to add the `id` to the object (from dictionary key) then want to use array methods.\n * Example:\n * ```ts\n * const dictionary = {\n * '123': { name: 'foo' },\n * '456': { name: 'bar' },\n * }\n *\n * dictionaryToArray(dictionary).forEach(({ id, name }) => {\n * // stuff\n * })\n * ```\n * @see {@link updateDictionaryWithId}\n * @see {@link arrayToDictionary}\n */\nexport function dictionaryToArray<T extends Record<string, any>>(\n dictionary: Record<string, T>,\n): (T & { id: string })[] {\n return Object.entries(dictionary).map(([id, value]) => ({\n id,\n ...value,\n }));\n}\n\n/**\n * This function takes a dictionary of objects and returns a dictionary of objects with the `id` merged into the object.\n * Helpful when you have a dictionary of objects and you want to add the `id` to the object (from dictionary key)\n * @see {@link dictionaryToArray}\n * @example\n * ```ts\n * const dictionary = {\n * '123': { name: 'foo' },\n * '456': { name: 'bar' },\n * }\n *\n * const dictionaryWithId = updateDictionaryWithId(dictionary)\n * // Which is now:\n * {\n * '123': { id: '123', name: 'foo' },\n * '456': { id: '456', name: 'bar' },\n * }\n * ```\n */\nexport function updateDictionaryWithId<T extends Record<string, any>>(\n dict: Record<string, T>,\n): Record<string, T & { id: string }> {\n return Object.entries(dict).reduce((acc, [id, value]) => {\n acc[id] = {\n id,\n ...value,\n };\n return acc;\n }, {} as Record<string, T & { id: string }>);\n}\n","/**\n * @fileoverview Paths\n * This provides utilities for working with file paths.\n * It may have things that could be from Node.js's `path` module but that's b/c it's for browser usage.\n */\n\n/**\n * Gets the file name from a path string, similar to Node's path.parse().name\n */\nexport const getFileNameFromPath = (path: string): string => {\n try {\n if (!path) return '';\n // Split on forward or back slashes\n const parts = path.split(/[/\\\\]/);\n // Get last part\n const fileName = parts[parts.length - 1];\n // Remove extension if exists\n const parts2 = fileName.split('.');\n // If only one part, return it\n if (parts2.length === 1) return parts2[0];\n // If multiple parts, return all except last\n return parts2.slice(0, -1).join('.');\n } catch (_) {\n return path;\n }\n};\n","import { StructError } from 'superstruct';\n\nexport function getSuperstructErrorMsg(\n structError: StructError | Error | unknown,\n): string {\n if (structError instanceof StructError) {\n // just doing first error b/c showing all can be kinda crazy. may want to change in future\n const [failure] = structError.failures();\n if (!failure) return '';\n const { path, message } = failure;\n const msg =\n path.length === 0 ? message : `At path: ${path.join('.')} -- ${message}`;\n return msg;\n }\n if (structError instanceof Error) {\n return structError.message;\n }\n return '';\n}\n"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/ts-toolbelt@9.6.0/node_modules/ts-toolbelt/out/index.js","../src/arrays.ts","../src/data-structures/queue.ts","../src/data-structures/stack.ts","../src/dates.ts","../src/js-env.ts","../src/type-tools.ts","../src/strings.ts","../src/fetcher.ts","../src/functions.ts","../src/urls.ts","../src/ids.ts","../src/immer.ts","../src/is-types.ts","../src/loose-equal.ts","../src/misc.ts","../src/objects.ts","../src/paths.ts","../src/validation.ts"],"names":["require_out","__commonJSMin","uniqueArray","ar","j","v","__name","hasItemsInItems","arrayA","arrayB","a","assertUniqueIdInArray","items","key","errorMsgPrefix","ids","duplicates","item","itemKey","duplicateIdList","d","isArrayOfStringsUnique","arr","unique","getNonUniqueStringsFromArray","arrayToDictionary","array","keyProp","acc","Queue","initialItems","Stack","now","formatDate","date","relative","includeTime","prefix","isValid","dateFormat","output","differenceInSeconds","formatDistanceToNowStrict","isCurrentYear","format","nowInIsoDate","yesterdayInIsoDate","subDays","sortDateAsc","b","compareAsc","parseISO","sortDateDesc","compareDesc","minutesFromNowInIsoDate","minutes","toMilliseconds","hours","seconds","isBrowser","isWebWorker","isNode","isJsDom","TsToolbelt","keys","obj","entries","isObjKey","isDefined","value","cssKebabCase","str","kebabCase","cssVarName","name","escapeRegEx","string","containsString","haystack","needle","needleNormalized","capitalizeFirstLetter","upperFirst","isFirstLetterCapital","upperCamelCase","camelCase","pascalCase","base64ToString","b64","stringToBase64","isBase64","src","s","stringHasSpaces","removeNpmScope","pkgName","isUrl","url","emailMatcher","isEmail","email","getDomainFromEmail","decodeBasicAuth","auth","username","password","parseNumberWithUnit","stringValue","unitRegex","match","numberValue","unit","unitIndex","startsWithLetter","removeWrappingQuotes","getShortName","default","nameParts","shortNameParts","part","FetcherError","message","status","statusText","cause","fetcher","query","body","customHeaders","signal","method","fetchUrl","u","error","headers","res","resIsJson","resp","text","delay","ms","r","tryCatch","promiseOrFn","result","data","addQueryParams","params","urlSearchParams","createUrlWithParams","origin","queryParams","areUrlsSame","isRemoteUrl","pathUrl","isDataUrl","dataString","slugify","opt","strict","lowerCase","slugifyBase","extractPathParts","path","regex","_","entityType","entityId","createFigmaUrl","fileId","nodeId","version","parseFigmaUrl","figmaUrl","type","createQueryParams","k","createSafeFilename","filename","ext","base","makeUuid","uuidV4","makeUuidV7","uuidV7","makeShortId","nanoid","enablePatches","compressPatches","baseData","allPatches","produceWithPatches","draft","applyPatches","applyPatchesSafely","changes","logError","logAppClientData","change","i","LOG_IMMER_APP_CLIENT_DATA","metadata","isObject","val","isObjectEmpty","objectToString","toTypeString","isArray","isMap","isSet","isDate","isFunction","isString","isNumber","isSymbol","isPromise","toRawType","isPlainObject","isIntegerKey","looseCompareArrays","equal","looseEqual","aKeysCount","bKeysCount","aHasKey","bHasKey","looseIndexOf","getRandomInt","max","timer","startTime","timerInSeconds","timerEnd","sortObject","theObject","removeEmptyObjects","cleanDeep","removeUndefinedProps","sortKeysRecursive","object","newArray","index","sortedKeys","sortedObject","flatten","flattenedObj","dive","thisObj","thisPath","dictionaryToArray","dictionary","id","updateDictionaryWithId","dict","getFileNameFromPath","parts","parts2","getSuperstructErrorMsg","structError","StructError","failure"],"mappings":"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","file":"index.js","sourcesContent":["","export { default as uniqBy } from 'lodash/uniqBy.js';\n\n/**\n * Make an array unique by removing duplicate entries.\n * @param ar - Array to make unique\n * @returns A unique array\n */\nexport function uniqueArray<T>(ar: T[]): T[] {\n const j = {};\n ar.forEach((v) => {\n j[`${v}::${typeof v}`] = v;\n });\n return Object.keys(j).map((v) => j[v]);\n}\n\n/**\n * Is Some Of This Array In That Array?\n * Are any of the items in arrayA in arrayB?\n */\nexport function hasItemsInItems<T extends string | number | boolean>(\n arrayA: T[],\n arrayB: T[],\n): boolean {\n return arrayA.some((a) => arrayB.includes(a));\n}\n\n/**\n * Used to ensure that the `id` prop in each object in an array is unique\n */\nexport function assertUniqueIdInArray<T, Key extends string & keyof T>({\n items,\n key,\n errorMsgPrefix,\n}: {\n items: T[] | readonly T[];\n /** Can be `id` or `value` */\n key: Key;\n errorMsgPrefix?: string;\n}) {\n const ids: string[] = [];\n const duplicates: T[] = [];\n items.forEach((item) => {\n const itemKey = String(item[key]);\n if (ids.includes(itemKey)) {\n duplicates.push(item);\n } else {\n ids.push(itemKey);\n }\n });\n if (duplicates.length > 0) {\n const duplicateIdList = duplicates.map((d) => `\"${d[key]}\"`).join(', ');\n throw new Error(\n `${\n errorMsgPrefix ||\n `Each item in the array requires unique \"${key}\" prop.`\n } These ids are duplicates: ${duplicateIdList}`,\n );\n }\n}\n\nexport function isArrayOfStringsUnique(arr: string[]): boolean {\n const unique = new Set(arr);\n return arr.length === unique.size;\n}\n\nexport function getNonUniqueStringsFromArray(arr: string[]): string[] {\n const unique = new Set<string>();\n return arr.filter((a) => {\n if (unique.has(a)) {\n return true;\n }\n unique.add(a);\n return false;\n });\n}\n\n/**\n * Converts an array of objects to a dictionary using a specified key.\n *\n * @see {@link dictionaryToArray}\n *\n * @example\n * const array = [\n * { id: '123', name: 'foo' },\n * { id: '456', name: 'bar' }\n * ];\n * const result = arrayToDictionary(array);\n * // Result: { '123': { name: 'foo' }, '456': { name: 'bar' } }\n *\n * const customResult = arrayToDictionary(array, 'name');\n * // Result: { 'foo': { id: '123' }, 'bar': { id: '456' } }\n */\nexport function arrayToDictionary<\n T extends Record<string, unknown>,\n K extends keyof T & string,\n>(\n /**\n * The array of objects to convert\n */\n array: T[],\n /**\n * The property to use as the dictionary key\n */\n keyProp: K,\n): Record<string, T> {\n return array.reduce(\n (acc, item) => {\n const { [keyProp]: key } = item;\n if (acc[key as string]) {\n throw new Error(`Duplicate key: ${key}`);\n }\n acc[key as string] = item;\n return acc;\n },\n {} as Record<string, T>,\n );\n}\n","/**\n * Creates a First In, First Out (FIFO) data structure list\n */\nexport class Queue<Item> {\n items: Item[];\n constructor(initialItems?: Item[]) {\n this.items = initialItems || [];\n }\n\n /** Add to end of the line */\n add(item: Item): void {\n this.items.push(item);\n }\n\n /** Get first in line */\n next(): Item | undefined {\n return this.items.shift();\n }\n\n peekAtNext(): Item | undefined {\n return this.items[0];\n }\n\n clear(): void {\n this.items = [];\n }\n\n get length(): number {\n return this.items.length;\n }\n\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n}\n","/**\n * Creates a Last In, First Out (LIFO) data structure list\n */\nexport class Stack<Item> {\n items: Item[];\n constructor(initialItems?: Item[]) {\n this.items = initialItems || [];\n }\n\n /** Add item to top of list */\n add(item: Item): void {\n this.items.unshift(item);\n }\n\n /** Remove item from top of list */\n next(): Item {\n return this.items.shift() as Item;\n }\n\n /** Look at item from top of list w/o removing */\n peekAtNext(): Item {\n return this.items[0];\n }\n\n clear(): void {\n this.items = [];\n }\n\n get length(): number {\n return this.items.length;\n }\n\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n}\n","import {\n format,\n parseISO,\n compareAsc,\n compareDesc,\n subDays,\n formatDistanceToNowStrict,\n differenceInSeconds,\n isValid,\n} from 'date-fns';\n\n/**\n * ISO date string (`2021-10-15T15:42:43.083Z`)\n */\nexport type DateIsoString =\n `${number}-${number}-${number}T${number}:${number}:${number}.${number}Z`;\n\nexport const now = (): string => new Date().toISOString();\n\n/**\n * Formats a date as a human-readable string.\n *\n * Options:\n * - If `relative` is true, returns a relative time string like:\n * - 'just now' (within 60 seconds)\n * - '4 days ago', 'in 2 hours', etc.\n * - If `relative` is false or omitted:\n * - Dates from the current year are formatted as 'MMM dd' (e.g., 'Apr 16')\n * - Dates from other years are formatted as 'MMM dd, yyyy' (e.g., 'Oct 24, 2024')\n * - If `includeTime` is true, the time is appended (e.g., 'Apr 16 at 03:45 PM')\n *\n * If `prefix` is provided, it will be prepended to the result (e.g., 'Updated Apr 16').\n *\n * If the provided date is invalid, logs an error and returns null.\n *\n * @param date - The date to format\n * @param relative - Whether to format the date as a relative time string\n * @param includeTime - Whether to include time in the formatted date\n * @param prefix - Optional prefix to prepend to the output string\n *\n * @example\n * formatDate({ date: new Date('2025-04-16') }) // 'Apr 16'\n * formatDate({ date: new Date('2024-10-24') }) // 'Oct 24, 2024'\n * formatDate({ date: new Date(), relative: true }) // 'just now'\n * formatDate({ date: new Date(), prefix: 'Updated', relative: true }) // 'Updated just now'\n */\nexport function formatDate({\n date,\n relative,\n includeTime,\n prefix,\n}: {\n date: Date;\n relative?: boolean;\n includeTime?: boolean;\n prefix?: string;\n}): string | null {\n if (!isValid(date)) {\n console.error('formatDate: Invalid date provided:', date);\n return null;\n }\n\n let dateFormat: string;\n let output: string;\n\n if (relative) {\n const secondsDiff = Math.abs(differenceInSeconds(new Date(), date));\n output =\n secondsDiff < 60\n ? 'just now'\n : formatDistanceToNowStrict(date, { addSuffix: true });\n } else {\n const isCurrentYear = date.getFullYear() === new Date().getFullYear();\n if (includeTime) {\n dateFormat = isCurrentYear\n ? `MMM dd 'at' hh:mm aaa`\n : `MMM dd, yyyy 'at' hh:mm aaa`;\n } else {\n dateFormat = isCurrentYear ? 'MMM dd' : 'MMM dd, yyyy';\n }\n output = format(date, dateFormat);\n }\n\n return prefix ? `${prefix} ${output}` : output;\n}\n\n/** Get the ISO date string (`2021-10-15T15:42:43.083Z`) for right now */\nexport const nowInIsoDate = (): string => new Date().toISOString();\n\nexport const yesterdayInIsoDate = (): string =>\n subDays(new Date(), 1).toISOString();\n\nexport function sortDateAsc(a: { date: string }, b: { date: string }): number {\n return compareAsc(parseISO(a.date), parseISO(b.date));\n}\n\nexport function sortDateDesc(a: { date: string }, b: { date: string }): number {\n return compareDesc(parseISO(a.date), parseISO(b.date));\n}\n\nexport const minutesFromNowInIsoDate = (minutes: number): string => {\n return new Date(Date.now() + minutes * 60 * 1000).toISOString();\n};\n\n/**\n * Converts hours, minutes, and seconds to milliseconds\n * @param h - hours (optional)\n * @param m - minutes (optional)\n * @param s - seconds (optional)\n * @returns total milliseconds\n */\nexport function toMilliseconds({\n hours = 0,\n minutes = 0,\n seconds = 0,\n}: {\n hours?: number;\n minutes?: number;\n seconds?: number;\n}) {\n const MS_PER_SECOND = 1000;\n const MS_PER_MINUTE = 60 * MS_PER_SECOND;\n const MS_PER_HOUR = 60 * MS_PER_MINUTE;\n\n return (\n hours * MS_PER_HOUR + minutes * MS_PER_MINUTE + seconds * MS_PER_SECOND\n );\n}\n","/* global window self */\n\n// Thanks! https://github.com/flexdinesh/browser-or-node/blob/master/src/index.js\n\nexport const isBrowser =\n typeof window !== 'undefined' && typeof window.document !== 'undefined';\n\n/* eslint-disable no-restricted-globals */\nexport const isWebWorker =\n typeof self === 'object' &&\n self.constructor &&\n self.constructor.name === 'DedicatedWorkerGlobalScope';\n/* eslint-enable no-restricted-globals */\n\nexport const isNode =\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\n/**\n * @see https://github.com/jsdom/jsdom/releases/tag/12.0.0\n * @see https://github.com/jsdom/jsdom/issues/1537\n */\n/* eslint-disable no-undef */\nexport const isJsDom = () =>\n (typeof window !== 'undefined' && window.name === 'nodejs') ||\n navigator.userAgent.includes('Node.js') ||\n navigator.userAgent.includes('jsdom');\n","import type { FC, Component } from 'react';\nimport type {\n PackageJson as PackageJsonBase,\n TsConfigJson as TsConfigJsonBase,\n} from 'type-fest';\n\nexport { expectNever, expectType } from 'ts-expect';\nexport type { TypeEqual, TypeOf } from 'ts-expect';\nexport type {\n Except,\n Simplify,\n Merge,\n SetRequired,\n SetOptional,\n AsyncReturnType,\n PartialDeep,\n} from 'type-fest';\n// https://github.com/millsp/ts-toolbelt\nexport * as TsToolbelt from 'ts-toolbelt';\nexport { default as isEmpty } from 'lodash/isEmpty.js';\n\n/**\n * Turns `() => Promise<string>` into `string`\n */\nexport type PromiseResult<T> = T extends (...args: unknown[]) => unknown\n ? Awaited<ReturnType<T>>\n : never;\n\n/**\n * Opposite of `keyof`\n * @example\n * type Foo = { a: string; b: number; c: boolean };\n * type Bar = ValueOf<Foo>; // string | number | boolean\n */\nexport type ValueOf<T> = T[keyof T];\n\nexport type GetValueOrAsyncReturnValue<X> = X extends (\n ...args: unknown[]\n) => unknown\n ? Awaited<X>\n : X;\n\n/**\n * @template V would get `string` if passed in either `string` or `() => Promise<string>`\n */\nexport type ValueOrGetValue<V> = V extends (\n ...args: unknown[]\n) => Promise<infer X>\n ? X\n : V;\n\n/**\n * Typesafe `Object.keys()` that returns better than `string[]`\n */\nexport function keys<O extends Record<string, unknown>>(\n obj: O,\n): Array<keyof O> {\n return Object.keys(obj) as Array<keyof O>;\n}\n\n/**\n * Typesafe `Object.entries()` that retains the keys actual string value instead of just `string`\n */\nexport function entries<O extends Record<string, unknown>>(\n obj: O,\n): Array<[keyof O, O[keyof O]]> {\n return Object.entries(obj) as Array<[keyof O, O[keyof O]]>;\n}\n\n/**\n * Typesafe way to check if a key is in an object\n */\nexport function isObjKey<T extends Record<string | number | symbol, unknown>>(\n key: string | number | symbol,\n obj: T,\n): key is keyof T {\n return key in obj;\n}\n\n/**\n * Check whether a value is defined (non-nullable), meaning it is neither `null`\n * or `undefined`. This can be useful as a type-guard, as for example:\n * `[1, null].filter(Boolean)` does not always type-guard correctly.\n * @example\n * ```\n * import {isDefined} from 'ts-extras';\n * [1, null, 2, undefined].filter(isDefined); // => [1, 2]\n *\n```\n*/\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\n/**\n * Get Props from a React Component\n * @example\n * type Props = PropsFrom<typeof Button>;\n */\nexport type PropsFrom<TheComponent> =\n TheComponent extends FC<infer Props>\n ? Props\n : TheComponent extends Component<infer Props>\n ? Props\n : never;\n\nexport interface PackageJson extends PackageJsonBase, Record<string, unknown> {\n scripts?: {\n [scriptName: string]: string;\n };\n exports?: {\n [key: string]: PackageJsonBase.Exports;\n };\n}\n\nexport interface TsConfigJson\n extends TsConfigJsonBase, Record<string, unknown> {}\n\n/**\n * Expands object types recursively\n * @link https://stackoverflow.com/a/57683652\n * @deprecated Use `Simplify` instead\n */\nexport type ExpandRecursively<T> =\n T extends Record<string, unknown>\n ? T extends infer O\n ? { [K in keyof O]: ExpandRecursively<O[K]> }\n : never\n : T;\n\n/**\n * Workaround to allow typed info to work with Object.entries\n */\nexport type Entries<T> = {\n [K in keyof T]: [K, T[K]];\n}[keyof T][];\n\ndeclare const __brandKey: unique symbol;\n","import camelCase from 'lodash/camelCase.js';\nimport kebabCase from 'just-kebab-case'; // Why not lodash/kebabCase? https://github.com/lodash/lodash/issues/2843#issuecomment-262255270\nimport upperFirst from 'lodash/upperFirst.js';\nimport { isNode } from './js-env';\nimport { isEmpty } from './type-tools';\n\nexport { default as snakeCase } from 'lodash/snakeCase.js';\nexport { default as capitalize } from 'lodash/capitalize.js';\nexport { camelCase, kebabCase, kebabCase as paramCase };\n\n/**\n * Lower and split on dots, that's it. Do NOT split standalone strings on\n * numbers, caps, etc. Note that we split/join specifically to process each\n * segment of a token name, ie if `color.primary`, we process 'color' and 'primary'\n * individually\n */\nexport const cssKebabCase = (str: string) =>\n str.split('.').map(kebabCase).join('-');\nexport const cssVarName = (name: string) => `--${cssKebabCase(name)}`;\n\n/**\n * This function takes a string and escapes any regex related characters\n * Intended to be used to \"cleanse\" user input of regex that causes failures when using string operators\n */\nexport function escapeRegEx(string: string): string {\n return string.replace(/[*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\n/**\n * Basic \"fuzzy\" search of one string within another.\n * Both the haystack and needle are escaped for regex characters, then converted to lower case\n * If the needle appears in the haystack, will return true, otherwise returns false\n * @param {string} haystack - string to seach within\n * @param {string} needle - string being searched for\n * @returns {boolean}\n */\nexport function containsString(haystack: string, needle: string): boolean {\n const needleNormalized = escapeRegEx(needle).toLowerCase();\n const haystackNormalized = escapeRegEx(haystack).toLowerCase();\n return haystackNormalized.search(needleNormalized) !== -1;\n}\n\nexport function capitalizeFirstLetter(string: string): string {\n return upperFirst(string);\n}\n\nexport function isFirstLetterCapital(str: string): boolean {\n if (!str || str.length === 0) return false;\n return str[0] === str[0].toUpperCase();\n}\n\n/**\n * Transform into a string of capitalized words without separators. How React Component names are transformed.\n * aka PascalCase\n */\nexport function upperCamelCase(str: string): string {\n return capitalizeFirstLetter(camelCase(str));\n}\nexport const pascalCase = upperCamelCase;\n\nexport function base64ToString(b64: string): string {\n return isNode ? Buffer.from(b64, 'base64').toString() : atob(b64);\n}\n\nexport function stringToBase64(string: string): string {\n return isNode ? Buffer.from(string).toString('base64') : btoa(string);\n}\n\n/**\n * check if a value is a valid Base64 string\n */\nexport function isBase64(src: unknown): src is string {\n if (typeof src !== 'string') return false;\n const s = src.replace(/\\s+/g, '').replace(/={0,2}$/, '');\n return !/[^\\s0-9a-zA-Z+/]/.test(s) || !/[^\\s0-9a-zA-Z\\-_]/.test(s);\n}\n\nexport function stringHasSpaces(string: string): boolean {\n return string.indexOf(' ') !== -1;\n}\n\n/**\n * Removes the NPM \"@scope\" in pkg names\n * `@scope/name` => `name`\n * `name` => `name`\n */\nexport function removeNpmScope(pkgName: string): string {\n if (!pkgName.startsWith('@') && !pkgName.includes('/')) {\n return pkgName;\n }\n const [, name] = pkgName.split('/');\n if (!name) return pkgName;\n return name;\n}\n\nexport function isUrl(url: unknown): url is string {\n if (typeof url !== 'string') return false;\n try {\n const _u = new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n// RFC 5322 spec, https://emailregex.com/\nconst emailMatcher =\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n/**\n * Check that email is < 320 chars (according to spec), then if passes regex.\n * @link https://www.rfc-editor.org/errata/eid1690#:~:text=It%20should%20say%3A-,In%20addition%20to%20restrictions%20on%20syntax%2C%20there%20is%20a%20length,total%20length%20of%20320%20characters.\n */\nexport const isEmail = (email: unknown): email is string =>\n typeof email === 'string' && email.length <= 320 && emailMatcher.test(email);\n\n/**\n * Returns \"knapsack.cloud\" from \"bloom@knapsack.cloud\", if valid email\n */\nexport const getDomainFromEmail = (email: string): string | null =>\n isEmail(email) ? email.substring(email.indexOf('@') + 1) : null;\n\n/**\n * Basic auth headers are username:password in base64, decode and compare\n */\nexport const decodeBasicAuth = (\n auth: string,\n): { username: string; password: string } => {\n const [username, password] = base64ToString(auth).split(':');\n return { username, password };\n};\n\n/**\n * Parse a string that may contain a unit, like \"10px\" or \"10%\"\n */\nexport function parseNumberWithUnit(value: string | number): {\n value: number;\n unit?: string;\n} {\n const stringValue = String(value).trim();\n const unitRegex = /([a-zA-Z%])+$/;\n const match = stringValue.match(unitRegex);\n\n let numberValue: number;\n let unit: string;\n\n if (match) {\n const unitIndex = match.index;\n numberValue = parseFloat(stringValue.slice(0, unitIndex));\n [unit] = match;\n } else {\n numberValue = parseFloat(stringValue);\n unit = '';\n }\n if (Number.isNaN(numberValue)) {\n throw new Error(`Invalid value, not a number: ${value}`);\n }\n\n return { value: numberValue, unit };\n}\n\n/**\n * Check if a strings first character is a letter\n */\nexport function startsWithLetter(str: string): boolean {\n return /^[a-zA-Z]/.test(str);\n}\n\n/**\n * Removes wrapping single or double quotes from a string\n */\nexport function removeWrappingQuotes(str: string): string {\n if (!str || typeof str !== 'string') return str;\n return (\n str\n // remove double quotes\n .replace(/^\"(.*)\"$/, '$1')\n // remove single quotes\n .replace(/^'(.*)'$/, '$1')\n );\n}\n\n/**\n * Transforms a name string containing key-value pairs into a shortened version.\n *\n * Example:\n * Input: \"mode=dark, status=on, debug=false\"\n * Output: \"dark, status\"\n */\nexport const getShortName = (name: string) => {\n if (!name || isEmpty(name)) return;\n\n if (!name.includes('=')) {\n return name;\n }\n\n const nameParts = name.split(',');\n const shortNameParts: string[] = [];\n\n nameParts.forEach((part) => {\n const [key, value] = part.split('=');\n\n if (!value || ['false', 'off', 'no'].includes(value)) {\n return;\n }\n if (['true', 'on', 'yes'].includes(value)) {\n return shortNameParts.push(key);\n }\n return shortNameParts.push(value);\n });\n return shortNameParts.join(', ');\n};\n","import { isUrl } from './strings';\n\nexport class FetcherError extends Error {\n status?: number;\n statusText?: string;\n url: string;\n constructor(\n message: string,\n {\n status,\n statusText,\n url,\n cause,\n }: { status?: number; statusText?: string; url: string; cause?: Error },\n ) {\n super(message, { cause });\n this.status = status;\n this.statusText = statusText;\n this.url = url;\n }\n}\n\nexport async function fetcher<T = Record<string, unknown>>({\n url,\n query,\n body,\n headers: customHeaders = {},\n signal,\n}: {\n url: string | URL;\n query?: Record<string, string | boolean | number>;\n body?: Record<string, any>;\n headers?: RequestInit['headers'];\n signal?: AbortSignal;\n}): Promise<T> {\n try {\n if (typeof url === 'string' && !isUrl(url)) {\n throw new Error(`Cannot fetch from an invalid url: \"${url}\"`);\n }\n if (typeof url !== 'string' && !(url instanceof URL)) {\n throw new Error(`Url must be a string or URL instance: \"${url}\"`);\n }\n const method = body ? 'POST' : 'GET';\n let fetchUrl = '';\n try {\n const u = url instanceof URL ? url : new URL(url);\n if (query) {\n Object.entries(query).forEach(([key, value]) => {\n if (typeof value === 'undefined') return;\n if (value === null) return;\n u.searchParams.set(key, `${value}`);\n });\n }\n fetchUrl = u.toString();\n } catch (error) {\n throw new Error(\n `Could not start fetcher because was not able to add query params to URL successfully. Url: ${url}, Query params: ${JSON.stringify(\n query ?? {},\n )}. ${error instanceof Error ? error.message : ''}`,\n );\n }\n\n const headers: RequestInit['headers'] = {\n Accept: 'application/json',\n };\n if (body) headers['Content-Type'] = 'application/json';\n\n const res = await fetch(fetchUrl, {\n method,\n headers: { ...headers, ...customHeaders },\n body: body ? JSON.stringify(body) : undefined,\n signal,\n });\n const resIsJson = res.headers.get('Content-Type')?.includes('json');\n\n if (!res.ok) {\n const resp = resIsJson ? await res.json() : {};\n if (resp?.error?.message) {\n throw new FetcherError(resp.error.message, {\n status: res.status,\n statusText: res.statusText,\n url: fetchUrl,\n });\n } else if (resp?.message) {\n throw new FetcherError(resp.message, {\n status: res.status,\n statusText: res.statusText,\n url: fetchUrl,\n });\n } else {\n throw new FetcherError(`${res.statusText} ${res.status}`, {\n status: res.status,\n statusText: res.statusText,\n url: fetchUrl,\n });\n }\n }\n\n if (!resIsJson) {\n const text = await res.text();\n throw new FetcherError(\n `Expected JSON response but received text instead: ${text}`,\n {\n status: res.status,\n statusText: res.statusText,\n url: fetchUrl,\n },\n );\n }\n\n const data: T = await res.json();\n return data;\n } catch (error) {\n if (error instanceof FetcherError) {\n throw error;\n }\n throw new FetcherError(error.message, {\n url: url.toString(),\n cause: error,\n });\n }\n}\n","export { default as debounce } from 'lodash/debounce.js';\nexport { default as throttle } from 'lodash/throttle.js';\n\n// https://www.npmjs.com/package/memoizee\nexport { default as memoize } from 'memoizee';\nexport { default as memoizeeProfile } from 'memoizee/profile.js';\nexport { flow } from 'fp-ts/lib/function.js';\n\n/**\n * Create a fake time delay in an async function useful for testing\n * @example\n * await delay(1000);\n */\nexport const delay = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\n// Types for the result object with discriminated union\ntype Success<T> = {\n data: T;\n error: null;\n};\n\ntype Failure<E> = {\n data: null;\n error: E;\n};\n\ntype Result<T, E = Error> = Success<T> | Failure<E>;\n\n/**\n * Wraps a function or promise in a try/catch and returns a result object with the data or error.\n *\n * Works with both sync and async functions:\n * - Sync functions return `Result<T, E>` directly\n * - Async functions/promises return `Promise<Result<T, E>>`\n *\n * As long as `strictNullChecks: true` then doing something like `if (error) throw error` is required to use `data`\n *\n * @example\n * // Async usage\n * const { data, error } = await tryCatch(() => someAsyncFunction({ id: 42 }));\n * if (error) {\n * throw error;\n * }\n * data.info;\n *\n * @example\n * // Sync usage\n * const { data, error } = tryCatch(() => JSON.parse(jsonString));\n * if (error) {\n * console.error('Invalid JSON');\n * }\n */\n// Overload: async function returning Promise<T>\nexport function tryCatch<T, E = Error>(\n fn: () => Promise<T>,\n): Promise<Result<T, E>>;\n// Overload: direct Promise<T>\nexport function tryCatch<T, E = Error>(\n promise: Promise<T>,\n): Promise<Result<T, E>>;\n// Overload: sync function returning T\nexport function tryCatch<T, E = Error>(fn: () => T): Result<T, E>;\n// Implementation\nexport function tryCatch<T, E = Error>(\n promiseOrFn: Promise<T> | (() => T | Promise<T>),\n): Result<T, E> | Promise<Result<T, E>> {\n if (typeof promiseOrFn === 'function') {\n try {\n const result = promiseOrFn();\n // If the function returned a promise, handle it asynchronously\n if (result instanceof Promise) {\n return result.then(\n (data) => ({ data, error: null }),\n (error) => ({ data: null, error: error as E }),\n );\n }\n return { data: result, error: null };\n } catch (error) {\n return { data: null, error: error as E };\n }\n }\n // It's a promise\n return promiseOrFn.then(\n (data) => ({ data, error: null }),\n (error) => ({ data: null, error: error as E }),\n );\n}\n","import slugifyBase from 'slugify';\n\nexport type QueryParamsInput = Record<\n string,\n string | number | boolean | undefined | null | string[] | URL\n>;\n\n/**\n * Util to add query params in a type safe way\n * URL's will be stringified\n * `booleans` & `numbers` will be stringified\n * `null` & `undefined` will be ommitted\n * Arrays of strings will be joined with a space\n *\n * @example\n * ```ts\n * const urlSearchParams = new URLSearchParams();\n * addQueryParams({\n * params: { foo: 'bar', count: 42, tags: ['one', 'two'] },\n * urlSearchParams,\n * });\n * ```\n *\n * @see {@link createUrlWithParams} for creating a full URL\n */\nexport function addQueryParams<Params extends QueryParamsInput>({\n params,\n urlSearchParams,\n}: {\n params: Params;\n /**\n * This will be mutated in place AND returned\n */\n urlSearchParams: URLSearchParams;\n}) {\n Object.entries(params ?? {}).forEach(([key, value]) => {\n if (value === undefined || value === null) return;\n if (value instanceof URL) {\n urlSearchParams.set(key, value.toString());\n } else if (Array.isArray(value)) {\n urlSearchParams.set(key, value.join(' '));\n } else {\n const v = `${value}`;\n if (v === '') return;\n urlSearchParams.set(key, v);\n }\n });\n return urlSearchParams;\n}\n\n/**\n * Creates a URL with query parameters, supporting both full URLs and relative paths\n * @example\n * ```ts\n * createUrlWithParams({\n * url: 'https://example.com',\n * queryParams: { foo: 'bar', count: 42, tags: ['one', 'two'] }\n * })\n * // => URL('https://example.com?foo=bar&count=42&tags=one%20two')\n * ```\n *\n * @see {@link addQueryParams} for adding just query params\n */\nexport function createUrlWithParams<Params extends QueryParamsInput>({\n /** Can either be a full URL or a relative one (but that requires passing in \"origin\") */\n url,\n /** Base URL to use when url is a relative path */\n origin,\n /**\n * URL's will be stringified\n * Arrays of strings will be joined with a space\n * Other values will be stringified\n */\n queryParams,\n}: {\n /**\n * Can either be a full URL or a relative one (but that requires passing in \"origin\")\n */\n url: string | URL;\n /**\n * URL's will be stringified\n * Arrays of strings will be joined with a space\n * Other values will be stringified\n */\n queryParams: Params;\n origin?: string;\n}) {\n if (!origin && typeof url === 'string' && !url.startsWith('http')) {\n throw new Error(\n `When using \"createUrl\" either pass in a full \"url\" or provide an \"origin\"`,\n );\n }\n\n const u =\n // eslint-disable-next-line no-nested-ternary\n typeof url === 'string'\n ? new URL(url, origin)\n : origin\n ? new URL(url.toString(), origin)\n : url;\n addQueryParams({ params: queryParams, urlSearchParams: u.searchParams });\n return u;\n}\n\nexport interface GitLabParsedUrl {\n fullPath: string;\n}\n\nexport interface BitbucketParsedUrl {\n fullPath: string;\n}\n\nexport interface GitHubParsedUrl {\n owner: string;\n repoName: string;\n}\n\nexport function areUrlsSame({ a, b }: { a: string; b: string }) {\n return new URL(a).toString() === new URL(b).toString();\n}\n\nexport function isRemoteUrl(url: string): boolean {\n if (typeof url !== 'string') return false;\n try {\n // Throws here if malformed URL\n const pathUrl = new URL(url);\n // Be VERY specific with protocols here, since URL() does no protocol validation\n return (\n pathUrl.protocol.startsWith('http:') ||\n pathUrl.protocol.startsWith('https:')\n );\n } catch (e) {\n // Starting a url with '//' is invalid to URL(), but we support it\n return url.startsWith('//');\n }\n}\n\n/**\n * @link https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\n */\nexport const isDataUrl = (dataString: string): boolean =>\n dataString.startsWith('data:');\n\nexport const slugify = (\n opt:\n | string\n | {\n string: string;\n /**\n * Removes all special characters. Necessary when used to create JS targets\n * that are invalid when special characters are present.\n */\n strict?: boolean;\n lowerCase?: boolean;\n },\n): string => {\n const {\n string,\n strict = true,\n lowerCase = true,\n } = typeof opt === 'string' ? { string: opt } : opt;\n return slugifyBase(string, {\n lower: lowerCase,\n trim: true,\n strict,\n });\n};\n\n/**\n * When dealing with nav paths, we need to find the entity type of the link (first\n * part, e.g. 'page' or 'pattern') and the entity id (second part, e.g. 'home').\n */\nexport const extractPathParts = (path: string): string[] | null => {\n const regex = /^\\/([^/]+)\\/([^/]+)/;\n const match = path.match(regex);\n\n if (!match) return null;\n\n const [_, entityType, entityId] = match;\n return [entityType, entityId];\n};\n\nexport function createFigmaUrl({\n fileId,\n nodeId,\n version,\n}: {\n fileId: string;\n nodeId?: string;\n version?: string | number;\n}) {\n if (!fileId || fileId.trim().length === 0) {\n throw new Error(`Invalid Figma URL, missing file id: ${fileId}`);\n }\n const url = new URL(`https://www.figma.com/file/${fileId}`);\n if (nodeId) {\n url.searchParams.set('node-id', nodeId);\n }\n if (version) {\n url.searchParams.set('version-id', version.toString());\n }\n return url.toString();\n}\n\nexport function parseFigmaUrl(figmaUrl: string): {\n type: 'proto' | 'file' | 'design' | 'board';\n fileId: string;\n nodeId?: string;\n version?: string;\n} {\n const url = new URL(figmaUrl);\n // tried to update to use the regex from figma, but it ended up being too strict\n // noting here in case we revisit\n // /https:\\/\\/[\\w\\.-]+\\.?figma.com\\/([\\w-]+)\\/([0-9a-zA-Z]{22,128})(?:\\/.*)?$/;\n if (\n (url.hostname !== 'www.figma.com' && url.hostname !== 'figma.com') ||\n !isRemoteUrl(figmaUrl) // Ensure it's a http/https URL.\n ) {\n throw new Error(`Please provide a valid Figma URL, got ${figmaUrl}`);\n }\n const nodeId = url.searchParams.get('node-id') || undefined;\n const version = url.searchParams.get('version-id') || undefined;\n const [, type, fileId] = url.pathname.split('/');\n switch (type) {\n case 'proto':\n case 'file':\n case 'board':\n case 'design': {\n if (!fileId) {\n throw new Error(`Invalid Figma URL, missing file id: ${figmaUrl}`);\n }\n return {\n type,\n fileId,\n nodeId,\n version,\n };\n }\n default:\n throw new Error(`Please provide a valid Figma URL, got ${figmaUrl}`);\n }\n}\n\n/**\n * Create a query string from an object of params\n * Does not include undefined, null, or empty string values\n * Does not include leading `?`\n */\nexport function createQueryParams(\n params: Record<string, string | number | boolean | undefined | null>,\n) {\n return new URLSearchParams(\n Object.fromEntries(\n Object.entries(params)\n .filter(([, v]) => {\n if (typeof v === 'string') {\n // removing empty strings\n return v.length > 0;\n }\n // removing null or undefined\n return v !== undefined && v !== null;\n })\n .map(([k, v]): [string, string] => [\n k,\n // sending up non-strings as strings\n `${v}`,\n ]),\n ),\n ).toString();\n}\n\n/**\n * Creates a safe filename by slugifying the filename and removing any special characters\n * Will throw if the filename does not exist or is just an extension (e.g. '.jpg')\n * @example\n * ```ts\n * createSafeFilename({ filename: 'test.jpg' }) // => 'test.jpg'\n * createSafeFilename({ filename: 'test.jpg.png' }) // => 'testjpg.png'\n * createSafeFilename({ filename: 'test jpg.pdf' }) // => 'test-jpg.pdf'\n */\nexport function createSafeFilename({ filename }: { filename: string }): string {\n const ext = slugify([...filename.split('.')].pop() || '');\n const base = ext\n ? slugify(filename.substring(0, filename.lastIndexOf('.')))\n : slugify(filename);\n if (!base) {\n throw new Error(`Invalid filename: ${filename}`);\n }\n return ext ? `${base}.${ext}` : base;\n}\n","import { nanoid } from 'nanoid';\nimport { v4 as uuidV4, v7 as uuidV7 } from 'uuid';\nimport { slugify } from './urls';\n\nexport const makeUuid = () => uuidV4();\nexport const makeUuidV7 = () => uuidV7();\n\n/**\n * Short ID that is also slugified\n */\nexport const makeShortId = () =>\n slugify({\n string: nanoid(10),\n lowerCase: false,\n });\n","import {\n type Patch,\n applyPatches,\n enablePatches,\n produceWithPatches,\n produce,\n isDraft,\n type Draft,\n type Objectish,\n} from 'immer';\n\nexport { produce, produceWithPatches, applyPatches, isDraft };\nexport type { Patch, Draft };\n\nenablePatches();\n\n/**\n * Take an array of Immer patches and compress them down to the smallest amount of patches\n * @link https://medium.com/@dedels/using-immer-to-compress-immer-patches-f382835b6c69\n */\nexport function compressPatches<Data extends Objectish>({\n baseData,\n patches: allPatches,\n}: {\n baseData: Data;\n patches: Patch[][] | Patch[];\n}) {\n return produceWithPatches(baseData, (draft) => {\n applyPatches(draft, allPatches.flat());\n });\n}\n\n/**\n * Loop over changes to applyPatches in small batches (safer) instead of all at once\n * If there are errors, it will skip that change and continue on\n */\nexport function applyPatchesSafely<Data extends Objectish>({\n data,\n changes,\n logError = console.error,\n logAppClientData = false,\n}: {\n data: Data;\n changes: { patches: Patch[] }[];\n logError?: (msg: unknown, ...optionalMsgs: unknown[]) => void;\n logAppClientData?: boolean;\n}): Data {\n return changes.reduce((acc, change, i) => {\n try {\n return applyPatches(acc, change.patches);\n } catch (error) {\n const { LOG_IMMER_APP_CLIENT_DATA } = process.env;\n const metadata =\n logAppClientData || LOG_IMMER_APP_CLIENT_DATA\n ? { data, change }\n : change;\n logError(\n `applyPatchesSafely had issues (and so will skip) with patches in change ${i}: ${\n error instanceof Error ? error.message : ''\n }`,\n metadata,\n );\n return acc;\n }\n }, data);\n}\n","export const isObject = (\n val: unknown,\n): val is Record<string | symbol, unknown> =>\n val !== null && typeof val === 'object' && !Array.isArray(val);\n\nexport function isObjectEmpty(\n val: unknown,\n): val is Record<string | symbol, unknown> {\n return isObject(val) && Object.keys(val).length === 0;\n}\n\nexport const objectToString = Object.prototype.toString;\nexport const toTypeString = (value: unknown): string =>\n objectToString.call(value);\n\n// eslint-disable-next-line prefer-destructuring\nexport const isArray = Array.isArray;\nexport const isMap = (val: unknown): val is Map<any, any> =>\n toTypeString(val) === '[object Map]';\nexport const isSet = (val: unknown): val is Set<any> =>\n toTypeString(val) === '[object Set]';\n\nexport const isDate = (val: unknown): val is Date => val instanceof Date;\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const isFunction = (val: unknown): val is Function =>\n typeof val === 'function';\nexport const isString = (val: unknown): val is string =>\n typeof val === 'string';\nexport const isNumber = (val: unknown): val is number =>\n typeof val === 'number';\nexport const isSymbol = (val: unknown): val is symbol =>\n typeof val === 'symbol';\n\nexport const isPromise = <T = any>(val: unknown): val is Promise<T> => {\n return isObject(val) && isFunction(val.then) && isFunction(val.catch);\n};\n\nexport const toRawType = (value: unknown): string => {\n // extract \"RawType\" from strings like \"[object RawType]\"\n return toTypeString(value).slice(8, -1);\n};\n\nexport const isPlainObject = (val: unknown): val is Record<string, unknown> =>\n toTypeString(val) === '[object Object]';\n\nexport const isIntegerKey = (key: unknown): boolean =>\n isString(key) &&\n key !== 'NaN' &&\n key[0] !== '-' &&\n `${parseInt(key, 10)}` === key;\n","import { isArray, isDate, isObject } from './is-types';\n\n// Thanks! https://github.com/vuejs/vue-next/blob/master/packages/shared/src/looseEqual.ts\n\nfunction looseCompareArrays(a: unknown[], b: unknown[]): boolean {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\n\nexport function looseEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n\n if (isDate(a) && isDate(b)) {\n return a.getTime() === b.getTime();\n }\n\n if (isArray(a) && isArray(b)) {\n return looseCompareArrays(a, b);\n }\n\n if (isObject(a) && isObject(b)) {\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n // eslint-disable-next-line guard-for-in\n for (const key in a) {\n // eslint-disable-next-line no-prototype-builtins\n const aHasKey = a.hasOwnProperty(key);\n // eslint-disable-next-line no-prototype-builtins\n const bHasKey = b.hasOwnProperty(key);\n if (\n (aHasKey && !bHasKey) ||\n (!aHasKey && bHasKey) ||\n !looseEqual(a[key], b[key])\n ) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\n\nexport function looseIndexOf(arr: unknown[], val: unknown): number {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n","/**\n * Get Random Integer\n */\nexport function getRandomInt(max: number): number {\n return Math.floor(Math.random() * Math.floor(max));\n}\n\n/**\n * Timer results in ms\n */\nexport const timer = (): (() => number) => {\n const startTime = new Date().getTime();\n return () => new Date().getTime() - startTime;\n};\n/**\n * The above timer, but in seconds instead of ms\n */\nexport const timerInSeconds = (): (() => number) => {\n const timerEnd = timer();\n return () => timerEnd() / 1000;\n};\n","import cleanDeep from 'clean-deep';\nimport { isObject } from './is-types';\n\nexport { default as groupBy } from 'lodash/groupBy.js';\n// @todo: look into lodash/merge vs deepMerge behavior differences and use cases (ie. immutable vs not)\n// export { default as deepMerge } from 'lodash/merge.js';\nexport { default as deepMerge } from 'deepmerge';\n\n/**\n * Sort object by alphabetizing keys.\n */\nexport function sortObject<T extends Record<string, unknown>>(theObject: T): T {\n return Object.keys(theObject)\n .sort()\n .reduce(\n (obj, key: keyof T) => {\n obj[key] = theObject[key];\n return obj;\n },\n <T>{},\n );\n}\n\n/**\n * Remove empty objects in nested object.\n * Leverage stringify to convert empty objects to undefined, which is removed\n * during stringification.\n */\nexport const removeEmptyObjects = <T extends Record<string, unknown>>(\n src: T,\n): Partial<T> => cleanDeep(src);\n\n/**\n * Removes keys like `{ x: undefined }` from the object\n */\nexport function removeUndefinedProps<T extends Record<PropertyKey, unknown>>(\n obj: T,\n): T {\n return cleanDeep(obj, {\n undefinedValues: true,\n nullValues: true,\n emptyArrays: false,\n emptyObjects: false,\n emptyStrings: true,\n }) as T;\n}\n\n/**\n * Sort object and arrays recursively by alphabetizing keys.\n */\nexport function sortKeysRecursive(object) {\n if (typeof object !== 'object' || !object) return object;\n if (Array.isArray(object)) {\n const newArray: any[] = [];\n object.forEach((item, index) => {\n newArray[index] = sortKeysRecursive(item);\n });\n return newArray;\n }\n const sortedKeys = Object.keys(object).sort();\n const sortedObject = {};\n sortedKeys.forEach((key) => {\n sortedObject[key] = sortKeysRecursive(object[key]);\n });\n return sortedObject;\n}\n\n/**\n * Turn a nested object into a single-level object with dot notation keys and\n * values equal to the deepest **object** in the nested object.\n */\nexport function flatten(\n obj: Record<string, unknown>,\n): Record<string, Record<string, unknown>> {\n if (!isObject(obj)) {\n throw new Error('Expected an object to flatten');\n }\n const flattenedObj: Record<string, Record<string, unknown>> = {};\n\n function dive(thisObj: Record<string, unknown>, path: string[]) {\n Object.entries(thisObj).forEach(([key, value]) => {\n const thisPath = [...path, key];\n if (isObject(value)) {\n flattenedObj[thisPath.join('.')] = value;\n dive(value, thisPath);\n }\n });\n }\n\n dive(obj, []);\n\n return flattenedObj;\n}\n\n/**\n * This function takes a dictionary of objects and returns an array of objects with the `id` merged into the object.\n * Helpful when you have a dictionary of objects and you want to add the `id` to the object (from dictionary key) then want to use array methods.\n * Example:\n * ```ts\n * const dictionary = {\n * '123': { name: 'foo' },\n * '456': { name: 'bar' },\n * }\n *\n * dictionaryToArray(dictionary).forEach(({ id, name }) => {\n * // stuff\n * })\n * ```\n * @see {@link updateDictionaryWithId}\n * @see {@link arrayToDictionary}\n */\nexport function dictionaryToArray<T extends Record<string, any>>(\n dictionary: Record<string, T>,\n): (T & { id: string })[] {\n return Object.entries(dictionary).map(([id, value]) => ({\n id,\n ...value,\n }));\n}\n\n/**\n * This function takes a dictionary of objects and returns a dictionary of objects with the `id` merged into the object.\n * Helpful when you have a dictionary of objects and you want to add the `id` to the object (from dictionary key)\n * @see {@link dictionaryToArray}\n * @example\n * ```ts\n * const dictionary = {\n * '123': { name: 'foo' },\n * '456': { name: 'bar' },\n * }\n *\n * const dictionaryWithId = updateDictionaryWithId(dictionary)\n * // Which is now:\n * {\n * '123': { id: '123', name: 'foo' },\n * '456': { id: '456', name: 'bar' },\n * }\n * ```\n */\nexport function updateDictionaryWithId<T extends Record<string, any>>(\n dict: Record<string, T>,\n): Record<string, T & { id: string }> {\n return Object.entries(dict).reduce(\n (acc, [id, value]) => {\n acc[id] = {\n id,\n ...value,\n };\n return acc;\n },\n {} as Record<string, T & { id: string }>,\n );\n}\n","/**\n * @fileoverview Paths\n * This provides utilities for working with file paths.\n * It may have things that could be from Node.js's `path` module but that's b/c it's for browser usage.\n */\n\n/**\n * Gets the file name from a path string, similar to Node's path.parse().name\n */\nexport const getFileNameFromPath = (path: string): string => {\n try {\n if (!path) return '';\n // Split on forward or back slashes\n const parts = path.split(/[/\\\\]/);\n // Get last part\n const fileName = parts[parts.length - 1];\n // Remove extension if exists\n const parts2 = fileName.split('.');\n // If only one part, return it\n if (parts2.length === 1) return parts2[0];\n // If multiple parts, return all except last\n return parts2.slice(0, -1).join('.');\n } catch (_) {\n return path;\n }\n};\n","import { StructError } from 'superstruct';\n\nexport function getSuperstructErrorMsg(\n structError: StructError | Error | unknown,\n): string {\n if (structError instanceof StructError) {\n // just doing first error b/c showing all can be kinda crazy. may want to change in future\n const [failure] = structError.failures();\n if (!failure) return '';\n const { path, message } = failure;\n const msg =\n path.length === 0 ? message : `At path: ${path.join('.')} -- ${message}`;\n return msg;\n }\n if (structError instanceof Error) {\n return structError.message;\n }\n return '';\n}\n"]}