@tanstack/react-query-devtools 4.26.1 → 4.28.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 (43) hide show
  1. package/build/lib/Explorer.esm.js +1 -0
  2. package/build/lib/Explorer.esm.js.map +1 -1
  3. package/build/lib/Explorer.js +1 -0
  4. package/build/lib/Explorer.js.map +1 -1
  5. package/build/lib/Explorer.mjs +1 -0
  6. package/build/lib/Explorer.mjs.map +1 -1
  7. package/build/lib/devtools.d.ts +23 -2
  8. package/build/lib/devtools.esm.js +108 -8
  9. package/build/lib/devtools.esm.js.map +1 -1
  10. package/build/lib/devtools.js +107 -8
  11. package/build/lib/devtools.js.map +1 -1
  12. package/build/lib/devtools.mjs +108 -8
  13. package/build/lib/devtools.mjs.map +1 -1
  14. package/build/lib/index.esm.js +1 -0
  15. package/build/lib/index.esm.js.map +1 -1
  16. package/build/lib/index.js +1 -0
  17. package/build/lib/index.js.map +1 -1
  18. package/build/lib/index.mjs +1 -0
  19. package/build/lib/index.mjs.map +1 -1
  20. package/build/lib/index.prod.esm.js +110 -9
  21. package/build/lib/index.prod.esm.js.map +1 -1
  22. package/build/lib/index.prod.js +109 -9
  23. package/build/lib/index.prod.js.map +1 -1
  24. package/build/lib/index.prod.mjs +110 -9
  25. package/build/lib/index.prod.mjs.map +1 -1
  26. package/build/lib/styledComponents.esm.js +3 -1
  27. package/build/lib/styledComponents.esm.js.map +1 -1
  28. package/build/lib/styledComponents.js +3 -1
  29. package/build/lib/styledComponents.js.map +1 -1
  30. package/build/lib/styledComponents.mjs +3 -1
  31. package/build/lib/styledComponents.mjs.map +1 -1
  32. package/build/lib/theme.esm.js +1 -0
  33. package/build/lib/theme.esm.js.map +1 -1
  34. package/build/lib/theme.js +1 -0
  35. package/build/lib/theme.js.map +1 -1
  36. package/build/lib/theme.mjs +1 -0
  37. package/build/lib/theme.mjs.map +1 -1
  38. package/build/umd/index.development.js +109 -9
  39. package/build/umd/index.development.js.map +1 -1
  40. package/package.json +3 -3
  41. package/src/__tests__/devtools.test.tsx +139 -0
  42. package/src/devtools.tsx +144 -2
  43. package/src/styledComponents.ts +3 -1
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  import { extends as _extends } from './_virtual/_rollupPluginBabelHelpers.esm.js';
2
3
  import * as React from 'react';
3
4
  import { displayValue, styled } from './utils.esm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"Explorer.esm.js","sources":["../../src/Explorer.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { displayValue, styled } from './utils'\nimport superjson from 'superjson'\n\nexport const Entry = styled('div', {\n fontFamily: 'Menlo, monospace',\n fontSize: '1em',\n lineHeight: '1.7',\n outline: 'none',\n wordBreak: 'break-word',\n})\n\nexport const Label = styled('span', {\n color: 'white',\n})\n\nexport const LabelButton = styled('button', {\n cursor: 'pointer',\n color: 'white',\n})\n\nexport const ExpandButton = styled('button', {\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n outline: 'inherit',\n background: 'transparent',\n border: 'none',\n padding: 0,\n})\n\ntype CopyState = 'NoCopy' | 'SuccessCopy' | 'ErrorCopy'\n\nexport const CopyButton = ({ value }: { value: unknown }) => {\n const [copyState, setCopyState] = React.useState<CopyState>('NoCopy')\n\n return (\n <button\n onClick={\n copyState === 'NoCopy'\n ? () => {\n navigator.clipboard.writeText(superjson.stringify(value)).then(\n () => {\n setCopyState('SuccessCopy')\n setTimeout(() => {\n setCopyState('NoCopy')\n }, 1500)\n },\n (err) => {\n console.error('Failed to copy: ', err)\n setCopyState('ErrorCopy')\n setTimeout(() => {\n setCopyState('NoCopy')\n }, 1500)\n },\n )\n }\n : undefined\n }\n style={{\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n outline: 'inherit',\n background: 'transparent',\n border: 'none',\n padding: 0,\n }}\n >\n {copyState === 'NoCopy' ? (\n <Copier />\n ) : copyState === 'SuccessCopy' ? (\n <CopiedCopier />\n ) : (\n <ErrorCopier />\n )}\n </button>\n )\n}\n\nexport const Value = styled('span', (_props, theme) => ({\n color: theme.danger,\n}))\n\nexport const SubEntries = styled('div', {\n marginLeft: '.1em',\n paddingLeft: '1em',\n borderLeft: '2px solid rgba(0,0,0,.15)',\n})\n\nexport const Info = styled('span', {\n color: 'grey',\n fontSize: '.7em',\n})\n\ntype ExpanderProps = {\n expanded: boolean\n style?: React.CSSProperties\n}\n\nexport const Expander = ({ expanded, style = {} }: ExpanderProps) => (\n <span\n style={{\n display: 'inline-block',\n transition: 'all .1s ease',\n transform: `rotate(${expanded ? 90 : 0}deg) ${style.transform || ''}`,\n ...style,\n }}\n >\n ▶\n </span>\n)\n\nconst Copier = () => (\n <span\n aria-label=\"Copy object to clipboard\"\n title=\"Copy object to clipboard\"\n style={{\n paddingLeft: '1em',\n }}\n >\n <svg height=\"12\" viewBox=\"0 0 16 12\" width=\"10\">\n <path\n fill=\"currentColor\"\n d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z\"\n ></path>\n <path\n fill=\"currentColor\"\n d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z\"\n ></path>\n </svg>\n </span>\n)\n\nconst ErrorCopier = () => (\n <span\n aria-label=\"Failed copying to clipboard\"\n title=\"Failed copying to clipboard\"\n style={{\n paddingLeft: '1em',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <svg height=\"12\" viewBox=\"0 0 16 12\" width=\"10\" display=\"block\">\n <path\n fill=\"red\"\n d=\"M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z\"\n ></path>\n </svg>\n <span\n style={{\n color: 'red',\n fontSize: '12px',\n paddingLeft: '4px',\n position: 'relative',\n top: '2px',\n }}\n >\n See console\n </span>\n </span>\n)\n\nconst CopiedCopier = () => (\n <span\n aria-label=\"Object copied to clipboard\"\n title=\"Object copied to clipboard\"\n style={{\n paddingLeft: '1em',\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n >\n <svg height=\"16\" viewBox=\"0 0 16 16\" width=\"16\" display=\"block\">\n <path\n fill=\"green\"\n d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"\n ></path>\n </svg>\n </span>\n)\n\ntype Entry = {\n label: string\n}\n\ntype RendererProps = {\n handleEntry: (entry: Entry) => JSX.Element\n label?: string\n value: unknown\n subEntries: Entry[]\n subEntryPages: Entry[][]\n type: string\n expanded: boolean\n copyable: boolean\n toggleExpanded: () => void\n pageSize: number\n}\n\n/**\n * Chunk elements in the array by size\n *\n * when the array cannot be chunked evenly by size, the last chunk will be\n * filled with the remaining elements\n *\n * @example\n * chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']]\n */\nexport function chunkArray<T>(array: T[], size: number): T[][] {\n if (size < 1) return []\n let i = 0\n const result: T[][] = []\n while (i < array.length) {\n result.push(array.slice(i, i + size))\n i = i + size\n }\n return result\n}\n\ntype Renderer = (props: RendererProps) => JSX.Element\n\nexport const DefaultRenderer: Renderer = ({\n handleEntry,\n label,\n value,\n subEntries = [],\n subEntryPages = [],\n type,\n expanded = false,\n copyable = false,\n toggleExpanded,\n pageSize,\n}) => {\n const [expandedPages, setExpandedPages] = React.useState<number[]>([])\n\n return (\n <Entry key={label}>\n {subEntryPages.length ? (\n <>\n <ExpandButton onClick={() => toggleExpanded()}>\n <Expander expanded={expanded} /> {label}{' '}\n <Info>\n {String(type).toLowerCase() === 'iterable' ? '(Iterable) ' : ''}\n {subEntries.length} {subEntries.length > 1 ? `items` : `item`}\n </Info>\n </ExpandButton>\n {copyable ? <CopyButton value={value} /> : null}\n {expanded ? (\n subEntryPages.length === 1 ? (\n <SubEntries>{subEntries.map(handleEntry)}</SubEntries>\n ) : (\n <SubEntries>\n {subEntryPages.map((entries, index) => (\n <div key={index}>\n <Entry>\n <LabelButton\n onClick={() =>\n setExpandedPages((old) =>\n old.includes(index)\n ? old.filter((d) => d !== index)\n : [...old, index],\n )\n }\n >\n <Expander expanded={expanded} /> [{index * pageSize} ...{' '}\n {index * pageSize + pageSize - 1}]\n </LabelButton>\n {expandedPages.includes(index) ? (\n <SubEntries>{entries.map(handleEntry)}</SubEntries>\n ) : null}\n </Entry>\n </div>\n ))}\n </SubEntries>\n )\n ) : null}\n </>\n ) : (\n <>\n <Label>{label}:</Label> <Value>{displayValue(value)}</Value>\n </>\n )}\n </Entry>\n )\n}\n\ntype ExplorerProps = Partial<RendererProps> & {\n renderer?: Renderer\n defaultExpanded?: true | Record<string, boolean>\n copyable?: boolean\n}\n\ntype Property = {\n defaultExpanded?: boolean | Record<string, boolean>\n label: string\n value: unknown\n}\n\nfunction isIterable(x: any): x is Iterable<unknown> {\n return Symbol.iterator in x\n}\n\nexport default function Explorer({\n value,\n defaultExpanded,\n renderer = DefaultRenderer,\n pageSize = 100,\n copyable = false,\n ...rest\n}: ExplorerProps) {\n const [expanded, setExpanded] = React.useState(Boolean(defaultExpanded))\n const toggleExpanded = React.useCallback(() => setExpanded((old) => !old), [])\n\n let type: string = typeof value\n let subEntries: Property[] = []\n\n const makeProperty = (sub: { label: string; value: unknown }): Property => {\n const subDefaultExpanded =\n defaultExpanded === true\n ? { [sub.label]: true }\n : defaultExpanded?.[sub.label]\n return {\n ...sub,\n defaultExpanded: subDefaultExpanded,\n }\n }\n\n if (Array.isArray(value)) {\n type = 'array'\n subEntries = value.map((d, i) =>\n makeProperty({\n label: i.toString(),\n value: d,\n }),\n )\n } else if (\n value !== null &&\n typeof value === 'object' &&\n isIterable(value) &&\n typeof value[Symbol.iterator] === 'function'\n ) {\n type = 'Iterable'\n subEntries = Array.from(value, (val, i) =>\n makeProperty({\n label: i.toString(),\n value: val,\n }),\n )\n } else if (typeof value === 'object' && value !== null) {\n type = 'object'\n subEntries = Object.entries(value).map(([key, val]) =>\n makeProperty({\n label: key,\n value: val,\n }),\n )\n }\n\n const subEntryPages = chunkArray(subEntries, pageSize)\n\n return renderer({\n handleEntry: (entry) => (\n <Explorer\n key={entry.label}\n value={value}\n renderer={renderer}\n copyable={copyable}\n {...rest}\n {...entry}\n />\n ),\n type,\n subEntries,\n subEntryPages,\n value,\n expanded,\n copyable,\n toggleExpanded,\n pageSize,\n ...rest,\n })\n}\n"],"names":["Entry","styled","fontFamily","fontSize","lineHeight","outline","wordBreak","Label","color","LabelButton","cursor","ExpandButton","font","background","border","padding","CopyButton","value","copyState","setCopyState","React","useState","navigator","clipboard","writeText","superjson","stringify","then","setTimeout","err","console","error","undefined","Value","_props","theme","danger","SubEntries","marginLeft","paddingLeft","borderLeft","Info","Expander","expanded","style","display","transition","transform","Copier","ErrorCopier","alignItems","position","top","CopiedCopier","verticalAlign","chunkArray","array","size","i","result","length","push","slice","DefaultRenderer","handleEntry","label","subEntries","subEntryPages","type","copyable","toggleExpanded","pageSize","expandedPages","setExpandedPages","String","toLowerCase","map","entries","index","old","includes","filter","d","displayValue","isIterable","x","Symbol","iterator","Explorer","defaultExpanded","renderer","rest","setExpanded","Boolean","useCallback","makeProperty","sub","subDefaultExpanded","Array","isArray","toString","from","val","Object","key","entry"],"mappings":";;;;;MAMaA,KAAK,GAAGC,MAAM,CAAC,KAAD,EAAQ;AACjCC,EAAAA,UAAU,EAAE,kBADqB;AAEjCC,EAAAA,QAAQ,EAAE,KAFuB;AAGjCC,EAAAA,UAAU,EAAE,KAHqB;AAIjCC,EAAAA,OAAO,EAAE,MAJwB;AAKjCC,EAAAA,SAAS,EAAE,YAAA;AALsB,CAAR,EAApB;MAQMC,KAAK,GAAGN,MAAM,CAAC,MAAD,EAAS;AAClCO,EAAAA,KAAK,EAAE,OAAA;AAD2B,CAAT,EAApB;MAIMC,WAAW,GAAGR,MAAM,CAAC,QAAD,EAAW;AAC1CS,EAAAA,MAAM,EAAE,SADkC;AAE1CF,EAAAA,KAAK,EAAE,OAAA;AAFmC,CAAX,EAA1B;MAKMG,YAAY,GAAGV,MAAM,CAAC,QAAD,EAAW;AAC3CS,EAAAA,MAAM,EAAE,SADmC;AAE3CF,EAAAA,KAAK,EAAE,SAFoC;AAG3CI,EAAAA,IAAI,EAAE,SAHqC;AAI3CP,EAAAA,OAAO,EAAE,SAJkC;AAK3CQ,EAAAA,UAAU,EAAE,aAL+B;AAM3CC,EAAAA,MAAM,EAAE,MANmC;AAO3CC,EAAAA,OAAO,EAAE,CAAA;AAPkC,CAAX,EAA3B;AAYA,MAAMC,UAAU,GAAG,CAAC;AAAEC,EAAAA,KAAAA;AAAF,CAAD,KAAmC;EAC3D,MAAM,CAACC,SAAD,EAAYC,YAAZ,CAAA,GAA4BC,KAAK,CAACC,QAAN,CAA0B,QAA1B,CAAlC,CAAA;EAEA,oBACE,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA;AACE,IAAA,OAAO,EACLH,SAAS,KAAK,QAAd,GACI,MAAM;AACJI,MAAAA,SAAS,CAACC,SAAV,CAAoBC,SAApB,CAA8BC,SAAS,CAACC,SAAV,CAAoBT,KAApB,CAA9B,CAA0DU,CAAAA,IAA1D,CACE,MAAM;QACJR,YAAY,CAAC,aAAD,CAAZ,CAAA;AACAS,QAAAA,UAAU,CAAC,MAAM;UACfT,YAAY,CAAC,QAAD,CAAZ,CAAA;SADQ,EAEP,IAFO,CAAV,CAAA;OAHJ,EAOGU,GAAD,IAAS;AACPC,QAAAA,OAAO,CAACC,KAAR,CAAc,kBAAd,EAAkCF,GAAlC,CAAA,CAAA;QACAV,YAAY,CAAC,WAAD,CAAZ,CAAA;AACAS,QAAAA,UAAU,CAAC,MAAM;UACfT,YAAY,CAAC,QAAD,CAAZ,CAAA;SADQ,EAEP,IAFO,CAAV,CAAA;OAVJ,CAAA,CAAA;AAeD,KAjBL,GAkBIa,SApBR;AAsBE,IAAA,KAAK,EAAE;AACLtB,MAAAA,MAAM,EAAE,SADH;AAELF,MAAAA,KAAK,EAAE,SAFF;AAGLI,MAAAA,IAAI,EAAE,SAHD;AAILP,MAAAA,OAAO,EAAE,SAJJ;AAKLQ,MAAAA,UAAU,EAAE,aALP;AAMLC,MAAAA,MAAM,EAAE,MANH;AAOLC,MAAAA,OAAO,EAAE,CAAA;AAPJ,KAAA;AAtBT,GAAA,EAgCGG,SAAS,KAAK,QAAd,gBACC,KAAC,CAAA,aAAA,CAAA,MAAD,OADD,GAEGA,SAAS,KAAK,aAAd,gBACF,oBAAC,YAAD,EAAA,IAAA,CADE,gBAGF,KAAC,CAAA,aAAA,CAAA,WAAD,OArCJ,CADF,CAAA;AA0CD,EA7CM;AA+CA,MAAMe,KAAK,GAAGhC,MAAM,CAAC,MAAD,EAAS,CAACiC,MAAD,EAASC,KAAT,MAAoB;EACtD3B,KAAK,EAAE2B,KAAK,CAACC,MAAAA;AADyC,CAApB,CAAT,EAApB;MAIMC,UAAU,GAAGpC,MAAM,CAAC,KAAD,EAAQ;AACtCqC,EAAAA,UAAU,EAAE,MAD0B;AAEtCC,EAAAA,WAAW,EAAE,KAFyB;AAGtCC,EAAAA,UAAU,EAAE,2BAAA;AAH0B,CAAR,EAAzB;MAMMC,IAAI,GAAGxC,MAAM,CAAC,MAAD,EAAS;AACjCO,EAAAA,KAAK,EAAE,MAD0B;AAEjCL,EAAAA,QAAQ,EAAE,MAAA;AAFuB,CAAT,EAAnB;AAUA,MAAMuC,QAAQ,GAAG,CAAC;EAAEC,QAAF;AAAYC,EAAAA,KAAK,GAAG,EAAA;AAApB,CAAD,kBACtB,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AACE,EAAA,KAAK,EAAE;AACLC,IAAAA,OAAO,EAAE,cADJ;AAELC,IAAAA,UAAU,EAAE,cAFP;AAGLC,IAAAA,SAAS,EAAYJ,SAAAA,IAAAA,QAAQ,GAAG,EAAH,GAAQ,CAA5B,CAAqCC,GAAAA,OAAAA,IAAAA,KAAK,CAACG,SAAN,IAAmB,EAAxD,CAHJ;IAIL,GAAGH,KAAAA;AAJE,GAAA;AADT,CADK,EAAA,QAAA,EAAA;;AAaP,MAAMI,MAAM,GAAG,mBACb,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AACE,EAAA,YAAA,EAAW,0BADb;AAEE,EAAA,KAAK,EAAC,0BAFR;AAGE,EAAA,KAAK,EAAE;AACLT,IAAAA,WAAW,EAAE,KAAA;AADR,GAAA;AAHT,CAOE,eAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAK,EAAA,MAAM,EAAC,IAAZ;AAAiB,EAAA,OAAO,EAAC,WAAzB;AAAqC,EAAA,KAAK,EAAC,IAAA;AAA3C,CACE,eAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AACE,EAAA,IAAI,EAAC,cADP;AAEE,EAAA,CAAC,EAAC,2MAAA;AAFJ,CAAA,CADF,eAKE,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AACE,EAAA,IAAI,EAAC,cADP;AAEE,EAAA,CAAC,EAAC,iOAAA;AAFJ,CAAA,CALF,CAPF,CADF,CAAA;;AAqBA,MAAMU,WAAW,GAAG,mBAClB,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AACE,EAAA,YAAA,EAAW,6BADb;AAEE,EAAA,KAAK,EAAC,6BAFR;AAGE,EAAA,KAAK,EAAE;AACLV,IAAAA,WAAW,EAAE,KADR;AAELM,IAAAA,OAAO,EAAE,MAFJ;AAGLK,IAAAA,UAAU,EAAE,QAAA;AAHP,GAAA;AAHT,CASE,eAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAK,EAAA,MAAM,EAAC,IAAZ;AAAiB,EAAA,OAAO,EAAC,WAAzB;AAAqC,EAAA,KAAK,EAAC,IAA3C;AAAgD,EAAA,OAAO,EAAC,OAAA;AAAxD,CACE,eAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AACE,EAAA,IAAI,EAAC,KADP;AAEE,EAAA,CAAC,EAAC,uLAAA;AAFJ,CAAA,CADF,CATF,eAeE,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AACE,EAAA,KAAK,EAAE;AACL1C,IAAAA,KAAK,EAAE,KADF;AAELL,IAAAA,QAAQ,EAAE,MAFL;AAGLoC,IAAAA,WAAW,EAAE,KAHR;AAILY,IAAAA,QAAQ,EAAE,UAJL;AAKLC,IAAAA,GAAG,EAAE,KAAA;AALA,GAAA;AADT,CAAA,EAAA,aAAA,CAfF,CADF,CAAA;;AA8BA,MAAMC,YAAY,GAAG,mBACnB,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AACE,EAAA,YAAA,EAAW,4BADb;AAEE,EAAA,KAAK,EAAC,4BAFR;AAGE,EAAA,KAAK,EAAE;AACLd,IAAAA,WAAW,EAAE,KADR;AAELM,IAAAA,OAAO,EAAE,cAFJ;AAGLS,IAAAA,aAAa,EAAE,QAAA;AAHV,GAAA;AAHT,CASE,eAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAK,EAAA,MAAM,EAAC,IAAZ;AAAiB,EAAA,OAAO,EAAC,WAAzB;AAAqC,EAAA,KAAK,EAAC,IAA3C;AAAgD,EAAA,OAAO,EAAC,OAAA;AAAxD,CACE,eAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AACE,EAAA,IAAI,EAAC,OADP;AAEE,EAAA,CAAC,EAAC,iIAAA;AAFJ,CAAA,CADF,CATF,CADF,CAAA;;AAoCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,UAAT,CAAuBC,KAAvB,EAAmCC,IAAnC,EAAwD;AAC7D,EAAA,IAAIA,IAAI,GAAG,CAAX,EAAc,OAAO,EAAP,CAAA;EACd,IAAIC,CAAC,GAAG,CAAR,CAAA;EACA,MAAMC,MAAa,GAAG,EAAtB,CAAA;;AACA,EAAA,OAAOD,CAAC,GAAGF,KAAK,CAACI,MAAjB,EAAyB;AACvBD,IAAAA,MAAM,CAACE,IAAP,CAAYL,KAAK,CAACM,KAAN,CAAYJ,CAAZ,EAAeA,CAAC,GAAGD,IAAnB,CAAZ,CAAA,CAAA;IACAC,CAAC,GAAGA,CAAC,GAAGD,IAAR,CAAA;AACD,GAAA;;AACD,EAAA,OAAOE,MAAP,CAAA;AACD,CAAA;AAIM,MAAMI,eAAyB,GAAG,CAAC;EACxCC,WADwC;EAExCC,KAFwC;EAGxChD,KAHwC;AAIxCiD,EAAAA,UAAU,GAAG,EAJ2B;AAKxCC,EAAAA,aAAa,GAAG,EALwB;EAMxCC,IANwC;AAOxCzB,EAAAA,QAAQ,GAAG,KAP6B;AAQxC0B,EAAAA,QAAQ,GAAG,KAR6B;EASxCC,cATwC;AAUxCC,EAAAA,QAAAA;AAVwC,CAAD,KAWnC;EACJ,MAAM,CAACC,aAAD,EAAgBC,gBAAhB,CAAA,GAAoCrD,KAAK,CAACC,QAAN,CAAyB,EAAzB,CAA1C,CAAA;AAEA,EAAA,oBACE,oBAAC,KAAD,EAAA;AAAO,IAAA,GAAG,EAAE4C,KAAAA;AAAZ,GAAA,EACGE,aAAa,CAACP,MAAd,gBACC,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,eACE,oBAAC,YAAD,EAAA;IAAc,OAAO,EAAE,MAAMU,cAAc,EAAA;AAA3C,GAAA,eACE,oBAAC,QAAD,EAAA;AAAU,IAAA,QAAQ,EAAE3B,QAAAA;AAApB,GAAA,CADF,OACoCsB,KADpC,EAC2C,GAD3C,eAEE,oBAAC,IAAD,EAAA,IAAA,EACGS,MAAM,CAACN,IAAD,CAAN,CAAaO,WAAb,EAAA,KAA+B,UAA/B,GAA4C,aAA5C,GAA4D,EAD/D,EAEGT,UAAU,CAACN,MAFd,EAAA,GAAA,EAEuBM,UAAU,CAACN,MAAX,GAAoB,CAApB,mBAFvB,CAFF,CADF,EAQGS,QAAQ,gBAAG,oBAAC,UAAD,EAAA;AAAY,IAAA,KAAK,EAAEpD,KAAAA;AAAnB,GAAA,CAAH,GAAkC,IAR7C,EASG0B,QAAQ,GACPwB,aAAa,CAACP,MAAd,KAAyB,CAAzB,gBACE,KAAC,CAAA,aAAA,CAAA,UAAD,QAAaM,UAAU,CAACU,GAAX,CAAeZ,WAAf,CAAb,CADF,gBAGE,oBAAC,UAAD,EAAA,IAAA,EACGG,aAAa,CAACS,GAAd,CAAkB,CAACC,OAAD,EAAUC,KAAV,kBACjB,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAK,IAAA,GAAG,EAAEA,KAAAA;AAAV,GAAA,eACE,KAAC,CAAA,aAAA,CAAA,KAAD,EACE,IAAA,eAAA,KAAA,CAAA,aAAA,CAAC,WAAD,EAAA;AACE,IAAA,OAAO,EAAE,MACPL,gBAAgB,CAAEM,GAAD,IACfA,GAAG,CAACC,QAAJ,CAAaF,KAAb,CAAA,GACIC,GAAG,CAACE,MAAJ,CAAYC,CAAD,IAAOA,CAAC,KAAKJ,KAAxB,CADJ,GAEI,CAAC,GAAGC,GAAJ,EAASD,KAAT,CAHU,CAAA;AAFpB,GAAA,eASE,oBAAC,QAAD,EAAA;AAAU,IAAA,QAAQ,EAAEnC,QAAAA;GATtB,CAAA,EAAA,IAAA,EASqCmC,KAAK,GAAGP,QAT7C,EAAA,MAAA,EAS2D,GAT3D,EAUGO,KAAK,GAAGP,QAAR,GAAmBA,QAAnB,GAA8B,CAVjC,EAAA,GAAA,CADF,EAaGC,aAAa,CAACQ,QAAd,CAAuBF,KAAvB,CACC,gBAAA,KAAA,CAAA,aAAA,CAAC,UAAD,EAAA,IAAA,EAAaD,OAAO,CAACD,GAAR,CAAYZ,WAAZ,CAAb,CADD,GAEG,IAfN,CADF,CADD,CADH,CAJK,GA4BL,IArCN,CADD,gBAyCC,KACE,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,eAAA,KAAA,CAAA,aAAA,CAAC,KAAD,EAAA,IAAA,EAAQC,KAAR,EAAA,GAAA,CADF,EAC0B,GAAA,eAAA,KAAA,CAAA,aAAA,CAAC,KAAD,EAAA,IAAA,EAAQkB,YAAY,CAAClE,KAAD,CAApB,CAD1B,CA1CJ,CADF,CAAA;AAiDD,EA/DM;;AA6EP,SAASmE,UAAT,CAAoBC,CAApB,EAAoD;AAClD,EAAA,OAAOC,MAAM,CAACC,QAAP,IAAmBF,CAA1B,CAAA;AACD,CAAA;;AAEc,SAASG,QAAT,CAAkB;EAC/BvE,KAD+B;EAE/BwE,eAF+B;AAG/BC,EAAAA,QAAQ,GAAG3B,eAHoB;AAI/BQ,EAAAA,QAAQ,GAAG,GAJoB;AAK/BF,EAAAA,QAAQ,GAAG,KALoB;EAM/B,GAAGsB,IAAAA;AAN4B,CAAlB,EAOG;AAChB,EAAA,MAAM,CAAChD,QAAD,EAAWiD,WAAX,CAA0BxE,GAAAA,KAAK,CAACC,QAAN,CAAewE,OAAO,CAACJ,eAAD,CAAtB,CAAhC,CAAA;AACA,EAAA,MAAMnB,cAAc,GAAGlD,KAAK,CAAC0E,WAAN,CAAkB,MAAMF,WAAW,CAAEb,GAAD,IAAS,CAACA,GAAX,CAAnC,EAAoD,EAApD,CAAvB,CAAA;EAEA,IAAIX,IAAY,GAAG,OAAOnD,KAA1B,CAAA;EACA,IAAIiD,UAAsB,GAAG,EAA7B,CAAA;;EAEA,MAAM6B,YAAY,GAAIC,GAAD,IAAsD;AACzE,IAAA,MAAMC,kBAAkB,GACtBR,eAAe,KAAK,IAApB,GACI;MAAE,CAACO,GAAG,CAAC/B,KAAL,GAAa,IAAA;KADnB,GAEIwB,eAFJ,IAEIA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,eAAe,CAAGO,GAAG,CAAC/B,KAAP,CAHrB,CAAA;IAIA,OAAO,EACL,GAAG+B,GADE;AAELP,MAAAA,eAAe,EAAEQ,kBAAAA;KAFnB,CAAA;GALF,CAAA;;AAWA,EAAA,IAAIC,KAAK,CAACC,OAAN,CAAclF,KAAd,CAAJ,EAA0B;AACxBmD,IAAAA,IAAI,GAAG,OAAP,CAAA;IACAF,UAAU,GAAGjD,KAAK,CAAC2D,GAAN,CAAU,CAACM,CAAD,EAAIxB,CAAJ,KACrBqC,YAAY,CAAC;AACX9B,MAAAA,KAAK,EAAEP,CAAC,CAAC0C,QAAF,EADI;AAEXnF,MAAAA,KAAK,EAAEiE,CAAAA;AAFI,KAAD,CADD,CAAb,CAAA;GAFF,MAQO,IACLjE,KAAK,KAAK,IAAV,IACA,OAAOA,KAAP,KAAiB,QADjB,IAEAmE,UAAU,CAACnE,KAAD,CAFV,IAGA,OAAOA,KAAK,CAACqE,MAAM,CAACC,QAAR,CAAZ,KAAkC,UAJ7B,EAKL;AACAnB,IAAAA,IAAI,GAAG,UAAP,CAAA;AACAF,IAAAA,UAAU,GAAGgC,KAAK,CAACG,IAAN,CAAWpF,KAAX,EAAkB,CAACqF,GAAD,EAAM5C,CAAN,KAC7BqC,YAAY,CAAC;AACX9B,MAAAA,KAAK,EAAEP,CAAC,CAAC0C,QAAF,EADI;AAEXnF,MAAAA,KAAK,EAAEqF,GAAAA;AAFI,KAAD,CADD,CAAb,CAAA;GAPK,MAaA,IAAI,OAAOrF,KAAP,KAAiB,QAAjB,IAA6BA,KAAK,KAAK,IAA3C,EAAiD;AACtDmD,IAAAA,IAAI,GAAG,QAAP,CAAA;AACAF,IAAAA,UAAU,GAAGqC,MAAM,CAAC1B,OAAP,CAAe5D,KAAf,CAAsB2D,CAAAA,GAAtB,CAA0B,CAAC,CAAC4B,GAAD,EAAMF,GAAN,CAAD,KACrCP,YAAY,CAAC;AACX9B,MAAAA,KAAK,EAAEuC,GADI;AAEXvF,MAAAA,KAAK,EAAEqF,GAAAA;AAFI,KAAD,CADD,CAAb,CAAA;AAMD,GAAA;;AAED,EAAA,MAAMnC,aAAa,GAAGZ,UAAU,CAACW,UAAD,EAAaK,QAAb,CAAhC,CAAA;AAEA,EAAA,OAAOmB,QAAQ,CAAC;AACd1B,IAAAA,WAAW,EAAGyC,KAAD,iBACX,KAAA,CAAA,aAAA,CAAC,QAAD,EAAA,QAAA,CAAA;MACE,GAAG,EAAEA,KAAK,CAACxC,KADb;AAEE,MAAA,KAAK,EAAEhD,KAFT;AAGE,MAAA,QAAQ,EAAEyE,QAHZ;AAIE,MAAA,QAAQ,EAAErB,QAAAA;KACNsB,EAAAA,IALN,EAMMc,KANN,CAFY,CAAA;IAWdrC,IAXc;IAYdF,UAZc;IAadC,aAbc;IAcdlD,KAdc;IAed0B,QAfc;IAgBd0B,QAhBc;IAiBdC,cAjBc;IAkBdC,QAlBc;IAmBd,GAAGoB,IAAAA;AAnBW,GAAD,CAAf,CAAA;AAqBD;;;;"}
1
+ {"version":3,"file":"Explorer.esm.js","sources":["../../src/Explorer.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { displayValue, styled } from './utils'\nimport superjson from 'superjson'\n\nexport const Entry = styled('div', {\n fontFamily: 'Menlo, monospace',\n fontSize: '1em',\n lineHeight: '1.7',\n outline: 'none',\n wordBreak: 'break-word',\n})\n\nexport const Label = styled('span', {\n color: 'white',\n})\n\nexport const LabelButton = styled('button', {\n cursor: 'pointer',\n color: 'white',\n})\n\nexport const ExpandButton = styled('button', {\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n outline: 'inherit',\n background: 'transparent',\n border: 'none',\n padding: 0,\n})\n\ntype CopyState = 'NoCopy' | 'SuccessCopy' | 'ErrorCopy'\n\nexport const CopyButton = ({ value }: { value: unknown }) => {\n const [copyState, setCopyState] = React.useState<CopyState>('NoCopy')\n\n return (\n <button\n onClick={\n copyState === 'NoCopy'\n ? () => {\n navigator.clipboard.writeText(superjson.stringify(value)).then(\n () => {\n setCopyState('SuccessCopy')\n setTimeout(() => {\n setCopyState('NoCopy')\n }, 1500)\n },\n (err) => {\n console.error('Failed to copy: ', err)\n setCopyState('ErrorCopy')\n setTimeout(() => {\n setCopyState('NoCopy')\n }, 1500)\n },\n )\n }\n : undefined\n }\n style={{\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n outline: 'inherit',\n background: 'transparent',\n border: 'none',\n padding: 0,\n }}\n >\n {copyState === 'NoCopy' ? (\n <Copier />\n ) : copyState === 'SuccessCopy' ? (\n <CopiedCopier />\n ) : (\n <ErrorCopier />\n )}\n </button>\n )\n}\n\nexport const Value = styled('span', (_props, theme) => ({\n color: theme.danger,\n}))\n\nexport const SubEntries = styled('div', {\n marginLeft: '.1em',\n paddingLeft: '1em',\n borderLeft: '2px solid rgba(0,0,0,.15)',\n})\n\nexport const Info = styled('span', {\n color: 'grey',\n fontSize: '.7em',\n})\n\ntype ExpanderProps = {\n expanded: boolean\n style?: React.CSSProperties\n}\n\nexport const Expander = ({ expanded, style = {} }: ExpanderProps) => (\n <span\n style={{\n display: 'inline-block',\n transition: 'all .1s ease',\n transform: `rotate(${expanded ? 90 : 0}deg) ${style.transform || ''}`,\n ...style,\n }}\n >\n ▶\n </span>\n)\n\nconst Copier = () => (\n <span\n aria-label=\"Copy object to clipboard\"\n title=\"Copy object to clipboard\"\n style={{\n paddingLeft: '1em',\n }}\n >\n <svg height=\"12\" viewBox=\"0 0 16 12\" width=\"10\">\n <path\n fill=\"currentColor\"\n d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z\"\n ></path>\n <path\n fill=\"currentColor\"\n d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z\"\n ></path>\n </svg>\n </span>\n)\n\nconst ErrorCopier = () => (\n <span\n aria-label=\"Failed copying to clipboard\"\n title=\"Failed copying to clipboard\"\n style={{\n paddingLeft: '1em',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <svg height=\"12\" viewBox=\"0 0 16 12\" width=\"10\" display=\"block\">\n <path\n fill=\"red\"\n d=\"M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z\"\n ></path>\n </svg>\n <span\n style={{\n color: 'red',\n fontSize: '12px',\n paddingLeft: '4px',\n position: 'relative',\n top: '2px',\n }}\n >\n See console\n </span>\n </span>\n)\n\nconst CopiedCopier = () => (\n <span\n aria-label=\"Object copied to clipboard\"\n title=\"Object copied to clipboard\"\n style={{\n paddingLeft: '1em',\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n >\n <svg height=\"16\" viewBox=\"0 0 16 16\" width=\"16\" display=\"block\">\n <path\n fill=\"green\"\n d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"\n ></path>\n </svg>\n </span>\n)\n\ntype Entry = {\n label: string\n}\n\ntype RendererProps = {\n handleEntry: (entry: Entry) => JSX.Element\n label?: string\n value: unknown\n subEntries: Entry[]\n subEntryPages: Entry[][]\n type: string\n expanded: boolean\n copyable: boolean\n toggleExpanded: () => void\n pageSize: number\n}\n\n/**\n * Chunk elements in the array by size\n *\n * when the array cannot be chunked evenly by size, the last chunk will be\n * filled with the remaining elements\n *\n * @example\n * chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']]\n */\nexport function chunkArray<T>(array: T[], size: number): T[][] {\n if (size < 1) return []\n let i = 0\n const result: T[][] = []\n while (i < array.length) {\n result.push(array.slice(i, i + size))\n i = i + size\n }\n return result\n}\n\ntype Renderer = (props: RendererProps) => JSX.Element\n\nexport const DefaultRenderer: Renderer = ({\n handleEntry,\n label,\n value,\n subEntries = [],\n subEntryPages = [],\n type,\n expanded = false,\n copyable = false,\n toggleExpanded,\n pageSize,\n}) => {\n const [expandedPages, setExpandedPages] = React.useState<number[]>([])\n\n return (\n <Entry key={label}>\n {subEntryPages.length ? (\n <>\n <ExpandButton onClick={() => toggleExpanded()}>\n <Expander expanded={expanded} /> {label}{' '}\n <Info>\n {String(type).toLowerCase() === 'iterable' ? '(Iterable) ' : ''}\n {subEntries.length} {subEntries.length > 1 ? `items` : `item`}\n </Info>\n </ExpandButton>\n {copyable ? <CopyButton value={value} /> : null}\n {expanded ? (\n subEntryPages.length === 1 ? (\n <SubEntries>{subEntries.map(handleEntry)}</SubEntries>\n ) : (\n <SubEntries>\n {subEntryPages.map((entries, index) => (\n <div key={index}>\n <Entry>\n <LabelButton\n onClick={() =>\n setExpandedPages((old) =>\n old.includes(index)\n ? old.filter((d) => d !== index)\n : [...old, index],\n )\n }\n >\n <Expander expanded={expanded} /> [{index * pageSize} ...{' '}\n {index * pageSize + pageSize - 1}]\n </LabelButton>\n {expandedPages.includes(index) ? (\n <SubEntries>{entries.map(handleEntry)}</SubEntries>\n ) : null}\n </Entry>\n </div>\n ))}\n </SubEntries>\n )\n ) : null}\n </>\n ) : (\n <>\n <Label>{label}:</Label> <Value>{displayValue(value)}</Value>\n </>\n )}\n </Entry>\n )\n}\n\ntype ExplorerProps = Partial<RendererProps> & {\n renderer?: Renderer\n defaultExpanded?: true | Record<string, boolean>\n copyable?: boolean\n}\n\ntype Property = {\n defaultExpanded?: boolean | Record<string, boolean>\n label: string\n value: unknown\n}\n\nfunction isIterable(x: any): x is Iterable<unknown> {\n return Symbol.iterator in x\n}\n\nexport default function Explorer({\n value,\n defaultExpanded,\n renderer = DefaultRenderer,\n pageSize = 100,\n copyable = false,\n ...rest\n}: ExplorerProps) {\n const [expanded, setExpanded] = React.useState(Boolean(defaultExpanded))\n const toggleExpanded = React.useCallback(() => setExpanded((old) => !old), [])\n\n let type: string = typeof value\n let subEntries: Property[] = []\n\n const makeProperty = (sub: { label: string; value: unknown }): Property => {\n const subDefaultExpanded =\n defaultExpanded === true\n ? { [sub.label]: true }\n : defaultExpanded?.[sub.label]\n return {\n ...sub,\n defaultExpanded: subDefaultExpanded,\n }\n }\n\n if (Array.isArray(value)) {\n type = 'array'\n subEntries = value.map((d, i) =>\n makeProperty({\n label: i.toString(),\n value: d,\n }),\n )\n } else if (\n value !== null &&\n typeof value === 'object' &&\n isIterable(value) &&\n typeof value[Symbol.iterator] === 'function'\n ) {\n type = 'Iterable'\n subEntries = Array.from(value, (val, i) =>\n makeProperty({\n label: i.toString(),\n value: val,\n }),\n )\n } else if (typeof value === 'object' && value !== null) {\n type = 'object'\n subEntries = Object.entries(value).map(([key, val]) =>\n makeProperty({\n label: key,\n value: val,\n }),\n )\n }\n\n const subEntryPages = chunkArray(subEntries, pageSize)\n\n return renderer({\n handleEntry: (entry) => (\n <Explorer\n key={entry.label}\n value={value}\n renderer={renderer}\n copyable={copyable}\n {...rest}\n {...entry}\n />\n ),\n type,\n subEntries,\n subEntryPages,\n value,\n expanded,\n copyable,\n toggleExpanded,\n pageSize,\n ...rest,\n })\n}\n"],"names":["fontFamily","fontSize","lineHeight","outline","wordBreak","color","cursor","font","background","border","padding","value","navigator","setTimeout","console","marginLeft","paddingLeft","borderLeft","style","display","transition","transform","alignItems","position","top","verticalAlign","result","subEntries","subEntryPages","expanded","copyable","pageSize","renderer","defaultExpanded","type","label","handleEntry"],"mappings":";;;;;;;AAOEA;AACAC;AACAC;AACAC;AACAC;AALiC;;AASjCC;AADkC;;AAKlCC;AACAD;AAF0C;;AAM1CC;AACAD;AACAE;AACAJ;AACAK;AACAC;AACAC;AAP2C;AAYtC;AAAsBC;AAAF;;;AAKrB;AAGQC;;AAGIC;;;;AAKAC;;AAEAD;;;;AAKL;AAGP;AACEP;AACAD;AACAE;AACAJ;AACAK;AACAC;AACAC;AAPK;AAtBT;AAyCH;AAEM;;AAAiD;;AAKtDK;AACAC;AACAC;AAHsC;;AAOtCZ;AACAJ;AAFiC;AAU5B;;AAA8BiB;AAAZ;AAErB;AACEC;AACAC;AACAC;;AAHK;AADT;;AAYF;AAEI;AACA;AACA;AACEL;AADK;AAHT;AAOO;AAAY;AAAoB;AAArC;AAEI;AACA;AAFF;AAKE;AACA;AAFF;;AAQN;AAEI;AACA;AACA;AACEA;AACAG;AACAG;AAHK;AAHT;AASO;AAAY;AAAoB;AAAW;AAAhD;AAEI;AACA;AAFF;AAMA;AACEjB;AACAJ;AACAe;AACAO;AACAC;AALK;AADT;;AAcJ;AAEI;AACA;AACA;AACER;AACAG;AACAM;AAHK;AAHT;AASO;AAAY;AAAoB;AAAW;AAAhD;AAEI;AACA;AAFF;;AAyBN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACL;;;;AAGA;AACEC;;AAED;;AACD;AACD;AAIM;;;;AAILC;AACAC;;AAEAC;AACAC;;AAEAC;AAVwC;;AAcxC;AACS;AAAP;;AAGM;AACY;AAAV;AAMsB;AAAZ;AAOC;AAAL;AAGM;AADF;AASY;;AAoBjC;;AAcD;AACE;AACD;;AAEc;;;AAGbC;AACAD;AACAD;;AAL+B;AAQ/B;AACA;;;;;AAME;;;;AAMEG;;;;AAIJ;AACEC;;AAGIC;AACAxB;AAFW;;AAWfuB;AACAP;AAEIQ;AACAxB;AAFW;;AAMfuB;AACAP;AAEIQ;AACAxB;AAFW;AAKhB;;AAED;AAEA;AACEyB;;AAGI;AACA;AACA;;;;;;;;;;;AANU;AAqBjB;;"}
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  'use strict';
2
3
 
3
4
  Object.defineProperty(exports, '__esModule', { value: true });
@@ -1 +1 @@
1
- {"version":3,"file":"Explorer.js","sources":["../../src/Explorer.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { displayValue, styled } from './utils'\nimport superjson from 'superjson'\n\nexport const Entry = styled('div', {\n fontFamily: 'Menlo, monospace',\n fontSize: '1em',\n lineHeight: '1.7',\n outline: 'none',\n wordBreak: 'break-word',\n})\n\nexport const Label = styled('span', {\n color: 'white',\n})\n\nexport const LabelButton = styled('button', {\n cursor: 'pointer',\n color: 'white',\n})\n\nexport const ExpandButton = styled('button', {\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n outline: 'inherit',\n background: 'transparent',\n border: 'none',\n padding: 0,\n})\n\ntype CopyState = 'NoCopy' | 'SuccessCopy' | 'ErrorCopy'\n\nexport const CopyButton = ({ value }: { value: unknown }) => {\n const [copyState, setCopyState] = React.useState<CopyState>('NoCopy')\n\n return (\n <button\n onClick={\n copyState === 'NoCopy'\n ? () => {\n navigator.clipboard.writeText(superjson.stringify(value)).then(\n () => {\n setCopyState('SuccessCopy')\n setTimeout(() => {\n setCopyState('NoCopy')\n }, 1500)\n },\n (err) => {\n console.error('Failed to copy: ', err)\n setCopyState('ErrorCopy')\n setTimeout(() => {\n setCopyState('NoCopy')\n }, 1500)\n },\n )\n }\n : undefined\n }\n style={{\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n outline: 'inherit',\n background: 'transparent',\n border: 'none',\n padding: 0,\n }}\n >\n {copyState === 'NoCopy' ? (\n <Copier />\n ) : copyState === 'SuccessCopy' ? (\n <CopiedCopier />\n ) : (\n <ErrorCopier />\n )}\n </button>\n )\n}\n\nexport const Value = styled('span', (_props, theme) => ({\n color: theme.danger,\n}))\n\nexport const SubEntries = styled('div', {\n marginLeft: '.1em',\n paddingLeft: '1em',\n borderLeft: '2px solid rgba(0,0,0,.15)',\n})\n\nexport const Info = styled('span', {\n color: 'grey',\n fontSize: '.7em',\n})\n\ntype ExpanderProps = {\n expanded: boolean\n style?: React.CSSProperties\n}\n\nexport const Expander = ({ expanded, style = {} }: ExpanderProps) => (\n <span\n style={{\n display: 'inline-block',\n transition: 'all .1s ease',\n transform: `rotate(${expanded ? 90 : 0}deg) ${style.transform || ''}`,\n ...style,\n }}\n >\n ▶\n </span>\n)\n\nconst Copier = () => (\n <span\n aria-label=\"Copy object to clipboard\"\n title=\"Copy object to clipboard\"\n style={{\n paddingLeft: '1em',\n }}\n >\n <svg height=\"12\" viewBox=\"0 0 16 12\" width=\"10\">\n <path\n fill=\"currentColor\"\n d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z\"\n ></path>\n <path\n fill=\"currentColor\"\n d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z\"\n ></path>\n </svg>\n </span>\n)\n\nconst ErrorCopier = () => (\n <span\n aria-label=\"Failed copying to clipboard\"\n title=\"Failed copying to clipboard\"\n style={{\n paddingLeft: '1em',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <svg height=\"12\" viewBox=\"0 0 16 12\" width=\"10\" display=\"block\">\n <path\n fill=\"red\"\n d=\"M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z\"\n ></path>\n </svg>\n <span\n style={{\n color: 'red',\n fontSize: '12px',\n paddingLeft: '4px',\n position: 'relative',\n top: '2px',\n }}\n >\n See console\n </span>\n </span>\n)\n\nconst CopiedCopier = () => (\n <span\n aria-label=\"Object copied to clipboard\"\n title=\"Object copied to clipboard\"\n style={{\n paddingLeft: '1em',\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n >\n <svg height=\"16\" viewBox=\"0 0 16 16\" width=\"16\" display=\"block\">\n <path\n fill=\"green\"\n d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"\n ></path>\n </svg>\n </span>\n)\n\ntype Entry = {\n label: string\n}\n\ntype RendererProps = {\n handleEntry: (entry: Entry) => JSX.Element\n label?: string\n value: unknown\n subEntries: Entry[]\n subEntryPages: Entry[][]\n type: string\n expanded: boolean\n copyable: boolean\n toggleExpanded: () => void\n pageSize: number\n}\n\n/**\n * Chunk elements in the array by size\n *\n * when the array cannot be chunked evenly by size, the last chunk will be\n * filled with the remaining elements\n *\n * @example\n * chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']]\n */\nexport function chunkArray<T>(array: T[], size: number): T[][] {\n if (size < 1) return []\n let i = 0\n const result: T[][] = []\n while (i < array.length) {\n result.push(array.slice(i, i + size))\n i = i + size\n }\n return result\n}\n\ntype Renderer = (props: RendererProps) => JSX.Element\n\nexport const DefaultRenderer: Renderer = ({\n handleEntry,\n label,\n value,\n subEntries = [],\n subEntryPages = [],\n type,\n expanded = false,\n copyable = false,\n toggleExpanded,\n pageSize,\n}) => {\n const [expandedPages, setExpandedPages] = React.useState<number[]>([])\n\n return (\n <Entry key={label}>\n {subEntryPages.length ? (\n <>\n <ExpandButton onClick={() => toggleExpanded()}>\n <Expander expanded={expanded} /> {label}{' '}\n <Info>\n {String(type).toLowerCase() === 'iterable' ? '(Iterable) ' : ''}\n {subEntries.length} {subEntries.length > 1 ? `items` : `item`}\n </Info>\n </ExpandButton>\n {copyable ? <CopyButton value={value} /> : null}\n {expanded ? (\n subEntryPages.length === 1 ? (\n <SubEntries>{subEntries.map(handleEntry)}</SubEntries>\n ) : (\n <SubEntries>\n {subEntryPages.map((entries, index) => (\n <div key={index}>\n <Entry>\n <LabelButton\n onClick={() =>\n setExpandedPages((old) =>\n old.includes(index)\n ? old.filter((d) => d !== index)\n : [...old, index],\n )\n }\n >\n <Expander expanded={expanded} /> [{index * pageSize} ...{' '}\n {index * pageSize + pageSize - 1}]\n </LabelButton>\n {expandedPages.includes(index) ? (\n <SubEntries>{entries.map(handleEntry)}</SubEntries>\n ) : null}\n </Entry>\n </div>\n ))}\n </SubEntries>\n )\n ) : null}\n </>\n ) : (\n <>\n <Label>{label}:</Label> <Value>{displayValue(value)}</Value>\n </>\n )}\n </Entry>\n )\n}\n\ntype ExplorerProps = Partial<RendererProps> & {\n renderer?: Renderer\n defaultExpanded?: true | Record<string, boolean>\n copyable?: boolean\n}\n\ntype Property = {\n defaultExpanded?: boolean | Record<string, boolean>\n label: string\n value: unknown\n}\n\nfunction isIterable(x: any): x is Iterable<unknown> {\n return Symbol.iterator in x\n}\n\nexport default function Explorer({\n value,\n defaultExpanded,\n renderer = DefaultRenderer,\n pageSize = 100,\n copyable = false,\n ...rest\n}: ExplorerProps) {\n const [expanded, setExpanded] = React.useState(Boolean(defaultExpanded))\n const toggleExpanded = React.useCallback(() => setExpanded((old) => !old), [])\n\n let type: string = typeof value\n let subEntries: Property[] = []\n\n const makeProperty = (sub: { label: string; value: unknown }): Property => {\n const subDefaultExpanded =\n defaultExpanded === true\n ? { [sub.label]: true }\n : defaultExpanded?.[sub.label]\n return {\n ...sub,\n defaultExpanded: subDefaultExpanded,\n }\n }\n\n if (Array.isArray(value)) {\n type = 'array'\n subEntries = value.map((d, i) =>\n makeProperty({\n label: i.toString(),\n value: d,\n }),\n )\n } else if (\n value !== null &&\n typeof value === 'object' &&\n isIterable(value) &&\n typeof value[Symbol.iterator] === 'function'\n ) {\n type = 'Iterable'\n subEntries = Array.from(value, (val, i) =>\n makeProperty({\n label: i.toString(),\n value: val,\n }),\n )\n } else if (typeof value === 'object' && value !== null) {\n type = 'object'\n subEntries = Object.entries(value).map(([key, val]) =>\n makeProperty({\n label: key,\n value: val,\n }),\n )\n }\n\n const subEntryPages = chunkArray(subEntries, pageSize)\n\n return renderer({\n handleEntry: (entry) => (\n <Explorer\n key={entry.label}\n value={value}\n renderer={renderer}\n copyable={copyable}\n {...rest}\n {...entry}\n />\n ),\n type,\n subEntries,\n subEntryPages,\n value,\n expanded,\n copyable,\n toggleExpanded,\n pageSize,\n ...rest,\n })\n}\n"],"names":["Entry","styled","fontFamily","fontSize","lineHeight","outline","wordBreak","Label","color","LabelButton","cursor","ExpandButton","font","background","border","padding","CopyButton","value","copyState","setCopyState","React","useState","navigator","clipboard","writeText","superjson","stringify","then","setTimeout","err","console","error","undefined","Value","_props","theme","danger","SubEntries","marginLeft","paddingLeft","borderLeft","Info","Expander","expanded","style","display","transition","transform","Copier","ErrorCopier","alignItems","position","top","CopiedCopier","verticalAlign","chunkArray","array","size","i","result","length","push","slice","DefaultRenderer","handleEntry","label","subEntries","subEntryPages","type","copyable","toggleExpanded","pageSize","expandedPages","setExpandedPages","String","toLowerCase","map","entries","index","old","includes","filter","d","displayValue","isIterable","x","Symbol","iterator","Explorer","defaultExpanded","renderer","rest","setExpanded","Boolean","useCallback","makeProperty","sub","subDefaultExpanded","Array","isArray","toString","from","val","Object","key","entry","_extends"],"mappings":"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"}
1
+ {"version":3,"file":"Explorer.js","sources":["../../src/Explorer.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { displayValue, styled } from './utils'\nimport superjson from 'superjson'\n\nexport const Entry = styled('div', {\n fontFamily: 'Menlo, monospace',\n fontSize: '1em',\n lineHeight: '1.7',\n outline: 'none',\n wordBreak: 'break-word',\n})\n\nexport const Label = styled('span', {\n color: 'white',\n})\n\nexport const LabelButton = styled('button', {\n cursor: 'pointer',\n color: 'white',\n})\n\nexport const ExpandButton = styled('button', {\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n outline: 'inherit',\n background: 'transparent',\n border: 'none',\n padding: 0,\n})\n\ntype CopyState = 'NoCopy' | 'SuccessCopy' | 'ErrorCopy'\n\nexport const CopyButton = ({ value }: { value: unknown }) => {\n const [copyState, setCopyState] = React.useState<CopyState>('NoCopy')\n\n return (\n <button\n onClick={\n copyState === 'NoCopy'\n ? () => {\n navigator.clipboard.writeText(superjson.stringify(value)).then(\n () => {\n setCopyState('SuccessCopy')\n setTimeout(() => {\n setCopyState('NoCopy')\n }, 1500)\n },\n (err) => {\n console.error('Failed to copy: ', err)\n setCopyState('ErrorCopy')\n setTimeout(() => {\n setCopyState('NoCopy')\n }, 1500)\n },\n )\n }\n : undefined\n }\n style={{\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n outline: 'inherit',\n background: 'transparent',\n border: 'none',\n padding: 0,\n }}\n >\n {copyState === 'NoCopy' ? (\n <Copier />\n ) : copyState === 'SuccessCopy' ? (\n <CopiedCopier />\n ) : (\n <ErrorCopier />\n )}\n </button>\n )\n}\n\nexport const Value = styled('span', (_props, theme) => ({\n color: theme.danger,\n}))\n\nexport const SubEntries = styled('div', {\n marginLeft: '.1em',\n paddingLeft: '1em',\n borderLeft: '2px solid rgba(0,0,0,.15)',\n})\n\nexport const Info = styled('span', {\n color: 'grey',\n fontSize: '.7em',\n})\n\ntype ExpanderProps = {\n expanded: boolean\n style?: React.CSSProperties\n}\n\nexport const Expander = ({ expanded, style = {} }: ExpanderProps) => (\n <span\n style={{\n display: 'inline-block',\n transition: 'all .1s ease',\n transform: `rotate(${expanded ? 90 : 0}deg) ${style.transform || ''}`,\n ...style,\n }}\n >\n ▶\n </span>\n)\n\nconst Copier = () => (\n <span\n aria-label=\"Copy object to clipboard\"\n title=\"Copy object to clipboard\"\n style={{\n paddingLeft: '1em',\n }}\n >\n <svg height=\"12\" viewBox=\"0 0 16 12\" width=\"10\">\n <path\n fill=\"currentColor\"\n d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z\"\n ></path>\n <path\n fill=\"currentColor\"\n d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z\"\n ></path>\n </svg>\n </span>\n)\n\nconst ErrorCopier = () => (\n <span\n aria-label=\"Failed copying to clipboard\"\n title=\"Failed copying to clipboard\"\n style={{\n paddingLeft: '1em',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <svg height=\"12\" viewBox=\"0 0 16 12\" width=\"10\" display=\"block\">\n <path\n fill=\"red\"\n d=\"M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z\"\n ></path>\n </svg>\n <span\n style={{\n color: 'red',\n fontSize: '12px',\n paddingLeft: '4px',\n position: 'relative',\n top: '2px',\n }}\n >\n See console\n </span>\n </span>\n)\n\nconst CopiedCopier = () => (\n <span\n aria-label=\"Object copied to clipboard\"\n title=\"Object copied to clipboard\"\n style={{\n paddingLeft: '1em',\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n >\n <svg height=\"16\" viewBox=\"0 0 16 16\" width=\"16\" display=\"block\">\n <path\n fill=\"green\"\n d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"\n ></path>\n </svg>\n </span>\n)\n\ntype Entry = {\n label: string\n}\n\ntype RendererProps = {\n handleEntry: (entry: Entry) => JSX.Element\n label?: string\n value: unknown\n subEntries: Entry[]\n subEntryPages: Entry[][]\n type: string\n expanded: boolean\n copyable: boolean\n toggleExpanded: () => void\n pageSize: number\n}\n\n/**\n * Chunk elements in the array by size\n *\n * when the array cannot be chunked evenly by size, the last chunk will be\n * filled with the remaining elements\n *\n * @example\n * chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']]\n */\nexport function chunkArray<T>(array: T[], size: number): T[][] {\n if (size < 1) return []\n let i = 0\n const result: T[][] = []\n while (i < array.length) {\n result.push(array.slice(i, i + size))\n i = i + size\n }\n return result\n}\n\ntype Renderer = (props: RendererProps) => JSX.Element\n\nexport const DefaultRenderer: Renderer = ({\n handleEntry,\n label,\n value,\n subEntries = [],\n subEntryPages = [],\n type,\n expanded = false,\n copyable = false,\n toggleExpanded,\n pageSize,\n}) => {\n const [expandedPages, setExpandedPages] = React.useState<number[]>([])\n\n return (\n <Entry key={label}>\n {subEntryPages.length ? (\n <>\n <ExpandButton onClick={() => toggleExpanded()}>\n <Expander expanded={expanded} /> {label}{' '}\n <Info>\n {String(type).toLowerCase() === 'iterable' ? '(Iterable) ' : ''}\n {subEntries.length} {subEntries.length > 1 ? `items` : `item`}\n </Info>\n </ExpandButton>\n {copyable ? <CopyButton value={value} /> : null}\n {expanded ? (\n subEntryPages.length === 1 ? (\n <SubEntries>{subEntries.map(handleEntry)}</SubEntries>\n ) : (\n <SubEntries>\n {subEntryPages.map((entries, index) => (\n <div key={index}>\n <Entry>\n <LabelButton\n onClick={() =>\n setExpandedPages((old) =>\n old.includes(index)\n ? old.filter((d) => d !== index)\n : [...old, index],\n )\n }\n >\n <Expander expanded={expanded} /> [{index * pageSize} ...{' '}\n {index * pageSize + pageSize - 1}]\n </LabelButton>\n {expandedPages.includes(index) ? (\n <SubEntries>{entries.map(handleEntry)}</SubEntries>\n ) : null}\n </Entry>\n </div>\n ))}\n </SubEntries>\n )\n ) : null}\n </>\n ) : (\n <>\n <Label>{label}:</Label> <Value>{displayValue(value)}</Value>\n </>\n )}\n </Entry>\n )\n}\n\ntype ExplorerProps = Partial<RendererProps> & {\n renderer?: Renderer\n defaultExpanded?: true | Record<string, boolean>\n copyable?: boolean\n}\n\ntype Property = {\n defaultExpanded?: boolean | Record<string, boolean>\n label: string\n value: unknown\n}\n\nfunction isIterable(x: any): x is Iterable<unknown> {\n return Symbol.iterator in x\n}\n\nexport default function Explorer({\n value,\n defaultExpanded,\n renderer = DefaultRenderer,\n pageSize = 100,\n copyable = false,\n ...rest\n}: ExplorerProps) {\n const [expanded, setExpanded] = React.useState(Boolean(defaultExpanded))\n const toggleExpanded = React.useCallback(() => setExpanded((old) => !old), [])\n\n let type: string = typeof value\n let subEntries: Property[] = []\n\n const makeProperty = (sub: { label: string; value: unknown }): Property => {\n const subDefaultExpanded =\n defaultExpanded === true\n ? { [sub.label]: true }\n : defaultExpanded?.[sub.label]\n return {\n ...sub,\n defaultExpanded: subDefaultExpanded,\n }\n }\n\n if (Array.isArray(value)) {\n type = 'array'\n subEntries = value.map((d, i) =>\n makeProperty({\n label: i.toString(),\n value: d,\n }),\n )\n } else if (\n value !== null &&\n typeof value === 'object' &&\n isIterable(value) &&\n typeof value[Symbol.iterator] === 'function'\n ) {\n type = 'Iterable'\n subEntries = Array.from(value, (val, i) =>\n makeProperty({\n label: i.toString(),\n value: val,\n }),\n )\n } else if (typeof value === 'object' && value !== null) {\n type = 'object'\n subEntries = Object.entries(value).map(([key, val]) =>\n makeProperty({\n label: key,\n value: val,\n }),\n )\n }\n\n const subEntryPages = chunkArray(subEntries, pageSize)\n\n return renderer({\n handleEntry: (entry) => (\n <Explorer\n key={entry.label}\n value={value}\n renderer={renderer}\n copyable={copyable}\n {...rest}\n {...entry}\n />\n ),\n type,\n subEntries,\n subEntryPages,\n value,\n expanded,\n copyable,\n toggleExpanded,\n pageSize,\n ...rest,\n })\n}\n"],"names":["fontFamily","fontSize","lineHeight","outline","wordBreak","color","cursor","font","background","border","padding","value","navigator","setTimeout","console","marginLeft","paddingLeft","borderLeft","style","display","transition","transform","alignItems","position","top","verticalAlign","result","subEntries","subEntryPages","expanded","copyable","pageSize","renderer","defaultExpanded","type","label","handleEntry"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOEA;AACAC;AACAC;AACAC;AACAC;AALiC;;AASjCC;AADkC;;AAKlCC;AACAD;AAF0C;;AAM1CC;AACAD;AACAE;AACAJ;AACAK;AACAC;AACAC;AAP2C;AAYtC;AAAsBC;AAAF;;;AAKrB;AAGQC;;AAGIC;;;;AAKAC;;AAEAD;;;;AAKL;AAGP;AACEP;AACAD;AACAE;AACAJ;AACAK;AACAC;AACAC;AAPK;AAtBT;AAyCH;AAEM;;AAAiD;;AAKtDK;AACAC;AACAC;AAHsC;;AAOtCZ;AACAJ;AAFiC;AAU5B;;AAA8BiB;AAAZ;AAErB;AACEC;AACAC;AACAC;;AAHK;AADT;;AAYF;AAEI;AACA;AACA;AACEL;AADK;AAHT;AAOO;AAAY;AAAoB;AAArC;AAEI;AACA;AAFF;AAKE;AACA;AAFF;;AAQN;AAEI;AACA;AACA;AACEA;AACAG;AACAG;AAHK;AAHT;AASO;AAAY;AAAoB;AAAW;AAAhD;AAEI;AACA;AAFF;AAMA;AACEjB;AACAJ;AACAe;AACAO;AACAC;AALK;AADT;;AAcJ;AAEI;AACA;AACA;AACER;AACAG;AACAM;AAHK;AAHT;AASO;AAAY;AAAoB;AAAW;AAAhD;AAEI;AACA;AAFF;;AAyBN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACL;;;;AAGA;AACEC;;AAED;;AACD;AACD;AAIM;;;;AAILC;AACAC;;AAEAC;AACAC;;AAEAC;AAVwC;;AAcxC;AACS;AAAP;;AAGM;AACY;AAAV;AAMsB;AAAZ;AAOC;AAAL;AAGM;AADF;AASY;;AAoBjC;;AAcD;AACE;AACD;;AAEc;;;AAGbC;AACAD;AACAD;;AAL+B;AAQ/B;AACA;;;;;AAME;;;;AAMEG;;;;AAIJ;AACEC;;AAGIC;AACAxB;AAFW;;AAWfuB;AACAP;AAEIQ;AACAxB;AAFW;;AAMfuB;AACAP;AAEIQ;AACAxB;AAFW;AAKhB;;AAED;AAEA;AACEyB;;AAGI;AACA;AACA;;;;;;;;;;;AANU;AAqBjB;;;;;;;;;;;;;"}
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  import { extends as _extends } from './_virtual/_rollupPluginBabelHelpers.mjs';
2
3
  import * as React from 'react';
3
4
  import { displayValue, styled } from './utils.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"Explorer.mjs","sources":["../../src/Explorer.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { displayValue, styled } from './utils'\nimport superjson from 'superjson'\n\nexport const Entry = styled('div', {\n fontFamily: 'Menlo, monospace',\n fontSize: '1em',\n lineHeight: '1.7',\n outline: 'none',\n wordBreak: 'break-word',\n})\n\nexport const Label = styled('span', {\n color: 'white',\n})\n\nexport const LabelButton = styled('button', {\n cursor: 'pointer',\n color: 'white',\n})\n\nexport const ExpandButton = styled('button', {\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n outline: 'inherit',\n background: 'transparent',\n border: 'none',\n padding: 0,\n})\n\ntype CopyState = 'NoCopy' | 'SuccessCopy' | 'ErrorCopy'\n\nexport const CopyButton = ({ value }: { value: unknown }) => {\n const [copyState, setCopyState] = React.useState<CopyState>('NoCopy')\n\n return (\n <button\n onClick={\n copyState === 'NoCopy'\n ? () => {\n navigator.clipboard.writeText(superjson.stringify(value)).then(\n () => {\n setCopyState('SuccessCopy')\n setTimeout(() => {\n setCopyState('NoCopy')\n }, 1500)\n },\n (err) => {\n console.error('Failed to copy: ', err)\n setCopyState('ErrorCopy')\n setTimeout(() => {\n setCopyState('NoCopy')\n }, 1500)\n },\n )\n }\n : undefined\n }\n style={{\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n outline: 'inherit',\n background: 'transparent',\n border: 'none',\n padding: 0,\n }}\n >\n {copyState === 'NoCopy' ? (\n <Copier />\n ) : copyState === 'SuccessCopy' ? (\n <CopiedCopier />\n ) : (\n <ErrorCopier />\n )}\n </button>\n )\n}\n\nexport const Value = styled('span', (_props, theme) => ({\n color: theme.danger,\n}))\n\nexport const SubEntries = styled('div', {\n marginLeft: '.1em',\n paddingLeft: '1em',\n borderLeft: '2px solid rgba(0,0,0,.15)',\n})\n\nexport const Info = styled('span', {\n color: 'grey',\n fontSize: '.7em',\n})\n\ntype ExpanderProps = {\n expanded: boolean\n style?: React.CSSProperties\n}\n\nexport const Expander = ({ expanded, style = {} }: ExpanderProps) => (\n <span\n style={{\n display: 'inline-block',\n transition: 'all .1s ease',\n transform: `rotate(${expanded ? 90 : 0}deg) ${style.transform || ''}`,\n ...style,\n }}\n >\n ▶\n </span>\n)\n\nconst Copier = () => (\n <span\n aria-label=\"Copy object to clipboard\"\n title=\"Copy object to clipboard\"\n style={{\n paddingLeft: '1em',\n }}\n >\n <svg height=\"12\" viewBox=\"0 0 16 12\" width=\"10\">\n <path\n fill=\"currentColor\"\n d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z\"\n ></path>\n <path\n fill=\"currentColor\"\n d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z\"\n ></path>\n </svg>\n </span>\n)\n\nconst ErrorCopier = () => (\n <span\n aria-label=\"Failed copying to clipboard\"\n title=\"Failed copying to clipboard\"\n style={{\n paddingLeft: '1em',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <svg height=\"12\" viewBox=\"0 0 16 12\" width=\"10\" display=\"block\">\n <path\n fill=\"red\"\n d=\"M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z\"\n ></path>\n </svg>\n <span\n style={{\n color: 'red',\n fontSize: '12px',\n paddingLeft: '4px',\n position: 'relative',\n top: '2px',\n }}\n >\n See console\n </span>\n </span>\n)\n\nconst CopiedCopier = () => (\n <span\n aria-label=\"Object copied to clipboard\"\n title=\"Object copied to clipboard\"\n style={{\n paddingLeft: '1em',\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n >\n <svg height=\"16\" viewBox=\"0 0 16 16\" width=\"16\" display=\"block\">\n <path\n fill=\"green\"\n d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"\n ></path>\n </svg>\n </span>\n)\n\ntype Entry = {\n label: string\n}\n\ntype RendererProps = {\n handleEntry: (entry: Entry) => JSX.Element\n label?: string\n value: unknown\n subEntries: Entry[]\n subEntryPages: Entry[][]\n type: string\n expanded: boolean\n copyable: boolean\n toggleExpanded: () => void\n pageSize: number\n}\n\n/**\n * Chunk elements in the array by size\n *\n * when the array cannot be chunked evenly by size, the last chunk will be\n * filled with the remaining elements\n *\n * @example\n * chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']]\n */\nexport function chunkArray<T>(array: T[], size: number): T[][] {\n if (size < 1) return []\n let i = 0\n const result: T[][] = []\n while (i < array.length) {\n result.push(array.slice(i, i + size))\n i = i + size\n }\n return result\n}\n\ntype Renderer = (props: RendererProps) => JSX.Element\n\nexport const DefaultRenderer: Renderer = ({\n handleEntry,\n label,\n value,\n subEntries = [],\n subEntryPages = [],\n type,\n expanded = false,\n copyable = false,\n toggleExpanded,\n pageSize,\n}) => {\n const [expandedPages, setExpandedPages] = React.useState<number[]>([])\n\n return (\n <Entry key={label}>\n {subEntryPages.length ? (\n <>\n <ExpandButton onClick={() => toggleExpanded()}>\n <Expander expanded={expanded} /> {label}{' '}\n <Info>\n {String(type).toLowerCase() === 'iterable' ? '(Iterable) ' : ''}\n {subEntries.length} {subEntries.length > 1 ? `items` : `item`}\n </Info>\n </ExpandButton>\n {copyable ? <CopyButton value={value} /> : null}\n {expanded ? (\n subEntryPages.length === 1 ? (\n <SubEntries>{subEntries.map(handleEntry)}</SubEntries>\n ) : (\n <SubEntries>\n {subEntryPages.map((entries, index) => (\n <div key={index}>\n <Entry>\n <LabelButton\n onClick={() =>\n setExpandedPages((old) =>\n old.includes(index)\n ? old.filter((d) => d !== index)\n : [...old, index],\n )\n }\n >\n <Expander expanded={expanded} /> [{index * pageSize} ...{' '}\n {index * pageSize + pageSize - 1}]\n </LabelButton>\n {expandedPages.includes(index) ? (\n <SubEntries>{entries.map(handleEntry)}</SubEntries>\n ) : null}\n </Entry>\n </div>\n ))}\n </SubEntries>\n )\n ) : null}\n </>\n ) : (\n <>\n <Label>{label}:</Label> <Value>{displayValue(value)}</Value>\n </>\n )}\n </Entry>\n )\n}\n\ntype ExplorerProps = Partial<RendererProps> & {\n renderer?: Renderer\n defaultExpanded?: true | Record<string, boolean>\n copyable?: boolean\n}\n\ntype Property = {\n defaultExpanded?: boolean | Record<string, boolean>\n label: string\n value: unknown\n}\n\nfunction isIterable(x: any): x is Iterable<unknown> {\n return Symbol.iterator in x\n}\n\nexport default function Explorer({\n value,\n defaultExpanded,\n renderer = DefaultRenderer,\n pageSize = 100,\n copyable = false,\n ...rest\n}: ExplorerProps) {\n const [expanded, setExpanded] = React.useState(Boolean(defaultExpanded))\n const toggleExpanded = React.useCallback(() => setExpanded((old) => !old), [])\n\n let type: string = typeof value\n let subEntries: Property[] = []\n\n const makeProperty = (sub: { label: string; value: unknown }): Property => {\n const subDefaultExpanded =\n defaultExpanded === true\n ? { [sub.label]: true }\n : defaultExpanded?.[sub.label]\n return {\n ...sub,\n defaultExpanded: subDefaultExpanded,\n }\n }\n\n if (Array.isArray(value)) {\n type = 'array'\n subEntries = value.map((d, i) =>\n makeProperty({\n label: i.toString(),\n value: d,\n }),\n )\n } else if (\n value !== null &&\n typeof value === 'object' &&\n isIterable(value) &&\n typeof value[Symbol.iterator] === 'function'\n ) {\n type = 'Iterable'\n subEntries = Array.from(value, (val, i) =>\n makeProperty({\n label: i.toString(),\n value: val,\n }),\n )\n } else if (typeof value === 'object' && value !== null) {\n type = 'object'\n subEntries = Object.entries(value).map(([key, val]) =>\n makeProperty({\n label: key,\n value: val,\n }),\n )\n }\n\n const subEntryPages = chunkArray(subEntries, pageSize)\n\n return renderer({\n handleEntry: (entry) => (\n <Explorer\n key={entry.label}\n value={value}\n renderer={renderer}\n copyable={copyable}\n {...rest}\n {...entry}\n />\n ),\n type,\n subEntries,\n subEntryPages,\n value,\n expanded,\n copyable,\n toggleExpanded,\n pageSize,\n ...rest,\n })\n}\n"],"names":["Entry","styled","fontFamily","fontSize","lineHeight","outline","wordBreak","Label","color","LabelButton","cursor","ExpandButton","font","background","border","padding","CopyButton","value","copyState","setCopyState","React","useState","navigator","clipboard","writeText","superjson","stringify","then","setTimeout","err","console","error","undefined","Value","_props","theme","danger","SubEntries","marginLeft","paddingLeft","borderLeft","Info","Expander","expanded","style","display","transition","transform","Copier","ErrorCopier","alignItems","position","top","CopiedCopier","verticalAlign","chunkArray","array","size","i","result","length","push","slice","DefaultRenderer","handleEntry","label","subEntries","subEntryPages","type","copyable","toggleExpanded","pageSize","expandedPages","setExpandedPages","String","toLowerCase","map","entries","index","old","includes","filter","d","displayValue","isIterable","x","Symbol","iterator","Explorer","defaultExpanded","renderer","rest","setExpanded","Boolean","useCallback","makeProperty","sub","subDefaultExpanded","Array","isArray","toString","from","val","Object","key","entry"],"mappings":"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"}
1
+ {"version":3,"file":"Explorer.mjs","sources":["../../src/Explorer.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { displayValue, styled } from './utils'\nimport superjson from 'superjson'\n\nexport const Entry = styled('div', {\n fontFamily: 'Menlo, monospace',\n fontSize: '1em',\n lineHeight: '1.7',\n outline: 'none',\n wordBreak: 'break-word',\n})\n\nexport const Label = styled('span', {\n color: 'white',\n})\n\nexport const LabelButton = styled('button', {\n cursor: 'pointer',\n color: 'white',\n})\n\nexport const ExpandButton = styled('button', {\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n outline: 'inherit',\n background: 'transparent',\n border: 'none',\n padding: 0,\n})\n\ntype CopyState = 'NoCopy' | 'SuccessCopy' | 'ErrorCopy'\n\nexport const CopyButton = ({ value }: { value: unknown }) => {\n const [copyState, setCopyState] = React.useState<CopyState>('NoCopy')\n\n return (\n <button\n onClick={\n copyState === 'NoCopy'\n ? () => {\n navigator.clipboard.writeText(superjson.stringify(value)).then(\n () => {\n setCopyState('SuccessCopy')\n setTimeout(() => {\n setCopyState('NoCopy')\n }, 1500)\n },\n (err) => {\n console.error('Failed to copy: ', err)\n setCopyState('ErrorCopy')\n setTimeout(() => {\n setCopyState('NoCopy')\n }, 1500)\n },\n )\n }\n : undefined\n }\n style={{\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n outline: 'inherit',\n background: 'transparent',\n border: 'none',\n padding: 0,\n }}\n >\n {copyState === 'NoCopy' ? (\n <Copier />\n ) : copyState === 'SuccessCopy' ? (\n <CopiedCopier />\n ) : (\n <ErrorCopier />\n )}\n </button>\n )\n}\n\nexport const Value = styled('span', (_props, theme) => ({\n color: theme.danger,\n}))\n\nexport const SubEntries = styled('div', {\n marginLeft: '.1em',\n paddingLeft: '1em',\n borderLeft: '2px solid rgba(0,0,0,.15)',\n})\n\nexport const Info = styled('span', {\n color: 'grey',\n fontSize: '.7em',\n})\n\ntype ExpanderProps = {\n expanded: boolean\n style?: React.CSSProperties\n}\n\nexport const Expander = ({ expanded, style = {} }: ExpanderProps) => (\n <span\n style={{\n display: 'inline-block',\n transition: 'all .1s ease',\n transform: `rotate(${expanded ? 90 : 0}deg) ${style.transform || ''}`,\n ...style,\n }}\n >\n ▶\n </span>\n)\n\nconst Copier = () => (\n <span\n aria-label=\"Copy object to clipboard\"\n title=\"Copy object to clipboard\"\n style={{\n paddingLeft: '1em',\n }}\n >\n <svg height=\"12\" viewBox=\"0 0 16 12\" width=\"10\">\n <path\n fill=\"currentColor\"\n d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z\"\n ></path>\n <path\n fill=\"currentColor\"\n d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z\"\n ></path>\n </svg>\n </span>\n)\n\nconst ErrorCopier = () => (\n <span\n aria-label=\"Failed copying to clipboard\"\n title=\"Failed copying to clipboard\"\n style={{\n paddingLeft: '1em',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <svg height=\"12\" viewBox=\"0 0 16 12\" width=\"10\" display=\"block\">\n <path\n fill=\"red\"\n d=\"M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z\"\n ></path>\n </svg>\n <span\n style={{\n color: 'red',\n fontSize: '12px',\n paddingLeft: '4px',\n position: 'relative',\n top: '2px',\n }}\n >\n See console\n </span>\n </span>\n)\n\nconst CopiedCopier = () => (\n <span\n aria-label=\"Object copied to clipboard\"\n title=\"Object copied to clipboard\"\n style={{\n paddingLeft: '1em',\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n >\n <svg height=\"16\" viewBox=\"0 0 16 16\" width=\"16\" display=\"block\">\n <path\n fill=\"green\"\n d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\"\n ></path>\n </svg>\n </span>\n)\n\ntype Entry = {\n label: string\n}\n\ntype RendererProps = {\n handleEntry: (entry: Entry) => JSX.Element\n label?: string\n value: unknown\n subEntries: Entry[]\n subEntryPages: Entry[][]\n type: string\n expanded: boolean\n copyable: boolean\n toggleExpanded: () => void\n pageSize: number\n}\n\n/**\n * Chunk elements in the array by size\n *\n * when the array cannot be chunked evenly by size, the last chunk will be\n * filled with the remaining elements\n *\n * @example\n * chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']]\n */\nexport function chunkArray<T>(array: T[], size: number): T[][] {\n if (size < 1) return []\n let i = 0\n const result: T[][] = []\n while (i < array.length) {\n result.push(array.slice(i, i + size))\n i = i + size\n }\n return result\n}\n\ntype Renderer = (props: RendererProps) => JSX.Element\n\nexport const DefaultRenderer: Renderer = ({\n handleEntry,\n label,\n value,\n subEntries = [],\n subEntryPages = [],\n type,\n expanded = false,\n copyable = false,\n toggleExpanded,\n pageSize,\n}) => {\n const [expandedPages, setExpandedPages] = React.useState<number[]>([])\n\n return (\n <Entry key={label}>\n {subEntryPages.length ? (\n <>\n <ExpandButton onClick={() => toggleExpanded()}>\n <Expander expanded={expanded} /> {label}{' '}\n <Info>\n {String(type).toLowerCase() === 'iterable' ? '(Iterable) ' : ''}\n {subEntries.length} {subEntries.length > 1 ? `items` : `item`}\n </Info>\n </ExpandButton>\n {copyable ? <CopyButton value={value} /> : null}\n {expanded ? (\n subEntryPages.length === 1 ? (\n <SubEntries>{subEntries.map(handleEntry)}</SubEntries>\n ) : (\n <SubEntries>\n {subEntryPages.map((entries, index) => (\n <div key={index}>\n <Entry>\n <LabelButton\n onClick={() =>\n setExpandedPages((old) =>\n old.includes(index)\n ? old.filter((d) => d !== index)\n : [...old, index],\n )\n }\n >\n <Expander expanded={expanded} /> [{index * pageSize} ...{' '}\n {index * pageSize + pageSize - 1}]\n </LabelButton>\n {expandedPages.includes(index) ? (\n <SubEntries>{entries.map(handleEntry)}</SubEntries>\n ) : null}\n </Entry>\n </div>\n ))}\n </SubEntries>\n )\n ) : null}\n </>\n ) : (\n <>\n <Label>{label}:</Label> <Value>{displayValue(value)}</Value>\n </>\n )}\n </Entry>\n )\n}\n\ntype ExplorerProps = Partial<RendererProps> & {\n renderer?: Renderer\n defaultExpanded?: true | Record<string, boolean>\n copyable?: boolean\n}\n\ntype Property = {\n defaultExpanded?: boolean | Record<string, boolean>\n label: string\n value: unknown\n}\n\nfunction isIterable(x: any): x is Iterable<unknown> {\n return Symbol.iterator in x\n}\n\nexport default function Explorer({\n value,\n defaultExpanded,\n renderer = DefaultRenderer,\n pageSize = 100,\n copyable = false,\n ...rest\n}: ExplorerProps) {\n const [expanded, setExpanded] = React.useState(Boolean(defaultExpanded))\n const toggleExpanded = React.useCallback(() => setExpanded((old) => !old), [])\n\n let type: string = typeof value\n let subEntries: Property[] = []\n\n const makeProperty = (sub: { label: string; value: unknown }): Property => {\n const subDefaultExpanded =\n defaultExpanded === true\n ? { [sub.label]: true }\n : defaultExpanded?.[sub.label]\n return {\n ...sub,\n defaultExpanded: subDefaultExpanded,\n }\n }\n\n if (Array.isArray(value)) {\n type = 'array'\n subEntries = value.map((d, i) =>\n makeProperty({\n label: i.toString(),\n value: d,\n }),\n )\n } else if (\n value !== null &&\n typeof value === 'object' &&\n isIterable(value) &&\n typeof value[Symbol.iterator] === 'function'\n ) {\n type = 'Iterable'\n subEntries = Array.from(value, (val, i) =>\n makeProperty({\n label: i.toString(),\n value: val,\n }),\n )\n } else if (typeof value === 'object' && value !== null) {\n type = 'object'\n subEntries = Object.entries(value).map(([key, val]) =>\n makeProperty({\n label: key,\n value: val,\n }),\n )\n }\n\n const subEntryPages = chunkArray(subEntries, pageSize)\n\n return renderer({\n handleEntry: (entry) => (\n <Explorer\n key={entry.label}\n value={value}\n renderer={renderer}\n copyable={copyable}\n {...rest}\n {...entry}\n />\n ),\n type,\n subEntries,\n subEntryPages,\n value,\n expanded,\n copyable,\n toggleExpanded,\n pageSize,\n ...rest,\n })\n}\n"],"names":["fontFamily","fontSize","lineHeight","outline","wordBreak","color","cursor","font","background","border","padding","value","navigator","setTimeout","console","marginLeft","paddingLeft","borderLeft","style","display","transition","transform","alignItems","position","top","verticalAlign","result","subEntries","subEntryPages","expanded","copyable","pageSize","renderer","defaultExpanded","type","label","handleEntry"],"mappings":";;;;;;;AAOEA;AACAC;AACAC;AACAC;AACAC;AALiC;;AASjCC;AADkC;;AAKlCC;AACAD;AAF0C;;AAM1CC;AACAD;AACAE;AACAJ;AACAK;AACAC;AACAC;AAP2C;AAYtC;AAAsBC;AAAF;;;AAKrB;AAGQC;;AAGIC;;;;AAKAC;;AAEAD;;;;AAKL;AAGP;AACEP;AACAD;AACAE;AACAJ;AACAK;AACAC;AACAC;AAPK;AAtBT;AAyCH;AAEM;;AAAiD;;AAKtDK;AACAC;AACAC;AAHsC;;AAOtCZ;AACAJ;AAFiC;AAU5B;;AAA8BiB;AAAZ;AAErB;AACEC;AACAC;AACAC;;AAHK;AADT;;AAYF;AAEI;AACA;AACA;AACEL;AADK;AAHT;AAOO;AAAY;AAAoB;AAArC;AAEI;AACA;AAFF;AAKE;AACA;AAFF;;AAQN;AAEI;AACA;AACA;AACEA;AACAG;AACAG;AAHK;AAHT;AASO;AAAY;AAAoB;AAAW;AAAhD;AAEI;AACA;AAFF;AAMA;AACEjB;AACAJ;AACAe;AACAO;AACAC;AALK;AADT;;AAcJ;AAEI;AACA;AACA;AACER;AACAG;AACAM;AAHK;AAHT;AASO;AAAY;AAAoB;AAAW;AAAhD;AAEI;AACA;AAFF;;AAyBN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACL;;;;AAGA;AACEC;;AAED;;AACD;AACD;AAIM;;;;AAILC;AACAC;;AAEAC;AACAC;;AAEAC;AAVwC;;AAcxC;AACS;AAAP;;AAGM;AACY;AAAV;AAMsB;AAAZ;AAOC;AAAL;AAGM;AADF;AASY;;AAoBjC;;AAcD;AACE;AACD;;AAEc;;;AAGbC;AACAD;AACAD;;AAL+B;AAQ/B;AACA;;;;;AAME;;;;AAMEG;;;;AAIJ;AACEC;;AAGIC;AACAxB;AAFW;;AAWfuB;AACAP;AAEIQ;AACAxB;AAFW;;AAMfuB;AACAP;AAEIQ;AACAxB;AAFW;AAKhB;;AAED;AAEA;AACEyB;;AAGI;AACA;AACA;;;;;;;;;;;AANU;AAqBjB;;"}
@@ -1,6 +1,19 @@
1
1
  import * as React from 'react';
2
- import type { ContextOptions } from '@tanstack/react-query';
2
+ import type { ContextOptions, Query } from '@tanstack/react-query';
3
3
  import type { Corner, Side } from './utils';
4
+ export interface DevToolsErrorType {
5
+ /**
6
+ * The name of the error.
7
+ */
8
+ name: string;
9
+ /**
10
+ * How the error is initialized. Whatever it returns MUST implement toString() so
11
+ * we can check against the current error.
12
+ */
13
+ initializer: (query: Query) => {
14
+ toString(): string;
15
+ };
16
+ }
4
17
  export interface DevtoolsOptions extends ContextOptions {
5
18
  /**
6
19
  * Set this true if you want the dev tools to default to being open
@@ -38,6 +51,10 @@ export interface DevtoolsOptions extends ContextOptions {
38
51
  * nonce for style element for CSP
39
52
  */
40
53
  styleNonce?: string;
54
+ /**
55
+ * Use this so you can define custom errors that can be shown in the devtools.
56
+ */
57
+ errorTypes?: DevToolsErrorType[];
41
58
  }
42
59
  interface DevtoolsPanelOptions extends ContextOptions {
43
60
  /**
@@ -81,7 +98,11 @@ interface DevtoolsPanelOptions extends ContextOptions {
81
98
  * Use this to add props to the close button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc.
82
99
  */
83
100
  closeButtonProps?: React.ComponentPropsWithoutRef<'button'>;
101
+ /**
102
+ * Use this so you can define custom errors that can be shown in the devtools.
103
+ */
104
+ errorTypes?: DevToolsErrorType[];
84
105
  }
85
- export declare function ReactQueryDevtools({ initialIsOpen, panelProps, closeButtonProps, toggleButtonProps, position, containerElement: Container, context, styleNonce, panelPosition: initialPanelPosition, }: DevtoolsOptions): React.ReactElement | null;
106
+ export declare function ReactQueryDevtools({ initialIsOpen, panelProps, closeButtonProps, toggleButtonProps, position, containerElement: Container, context, styleNonce, panelPosition: initialPanelPosition, errorTypes, }: DevtoolsOptions): React.ReactElement | null;
86
107
  export declare const ReactQueryDevtoolsPanel: React.ForwardRefExoticComponent<DevtoolsPanelOptions & React.RefAttributes<HTMLDivElement>>;
87
108
  export {};
@@ -1,5 +1,7 @@
1
+ 'use client';
1
2
  import { extends as _extends } from './_virtual/_rollupPluginBabelHelpers.esm.js';
2
3
  import * as React from 'react';
4
+ import { useMemo } from 'react';
3
5
  import { useQueryClient, onlineManager, notifyManager } from '@tanstack/react-query';
4
6
  import { rankItem } from '@tanstack/match-sorter-utils';
5
7
  import useLocalStorage from './useLocalStorage.esm.js';
@@ -20,7 +22,8 @@ function ReactQueryDevtools({
20
22
  containerElement: Container = 'aside',
21
23
  context,
22
24
  styleNonce,
23
- panelPosition: initialPanelPosition = 'bottom'
25
+ panelPosition: initialPanelPosition = 'bottom',
26
+ errorTypes = []
24
27
  }) {
25
28
  const rootRef = React.useRef(null);
26
29
  const panelRef = React.useRef(null);
@@ -199,7 +202,8 @@ function ReactQueryDevtools({
199
202
  style: style,
200
203
  isOpen: isResolvedOpen,
201
204
  setIsOpen: setIsOpen,
202
- onDragStart: e => handleDragStart(panelRef.current, e)
205
+ onDragStart: e => handleDragStart(panelRef.current, e),
206
+ errorTypes: errorTypes
203
207
  }))), !isResolvedOpen ? /*#__PURE__*/React.createElement("button", _extends({
204
208
  type: "button"
205
209
  }, otherToggleButtonProps, {
@@ -264,6 +268,7 @@ const ReactQueryDevtoolsPanel = /*#__PURE__*/React.forwardRef(function ReactQuer
264
268
  showCloseButton,
265
269
  position,
266
270
  closeButtonProps = {},
271
+ errorTypes = [],
267
272
  ...panelProps
268
273
  } = props;
269
274
  const {
@@ -382,7 +387,9 @@ const ReactQueryDevtoolsPanel = /*#__PURE__*/React.forwardRef(function ReactQuer
382
387
  }, "Bottom")) : null), /*#__PURE__*/React.createElement("div", {
383
388
  style: {
384
389
  display: 'flex',
385
- alignItems: 'center'
390
+ alignItems: 'center',
391
+ flexWrap: 'wrap',
392
+ gap: '0.5em'
386
393
  }
387
394
  }, /*#__PURE__*/React.createElement(Input, {
388
395
  placeholder: "Filter",
@@ -394,7 +401,6 @@ const ReactQueryDevtoolsPanel = /*#__PURE__*/React.forwardRef(function ReactQuer
394
401
  },
395
402
  style: {
396
403
  flex: '1',
397
- marginRight: '.5em',
398
404
  width: '100%'
399
405
  }
400
406
  }), /*#__PURE__*/React.createElement(Select, {
@@ -494,7 +500,8 @@ const ReactQueryDevtoolsPanel = /*#__PURE__*/React.forwardRef(function ReactQuer
494
500
  }))), activeQueryHash && isOpen ? /*#__PURE__*/React.createElement(ActiveQuery, {
495
501
  activeQueryHash: activeQueryHash,
496
502
  queryCache: queryCache,
497
- queryClient: queryClient
503
+ queryClient: queryClient,
504
+ errorTypes: errorTypes
498
505
  }) : null, showCloseButton ? /*#__PURE__*/React.createElement(Button, _extends({
499
506
  type: "button",
500
507
  "aria-controls": "ReactQueryDevtoolsPanel",
@@ -519,7 +526,8 @@ const ReactQueryDevtoolsPanel = /*#__PURE__*/React.forwardRef(function ReactQuer
519
526
  const ActiveQuery = ({
520
527
  queryCache,
521
528
  activeQueryHash,
522
- queryClient
529
+ queryClient,
530
+ errorTypes
523
531
  }) => {
524
532
  var _useSubscribeToQueryC, _useSubscribeToQueryC2;
525
533
 
@@ -545,10 +553,44 @@ const ActiveQuery = ({
545
553
  promise == null ? void 0 : promise.catch(noop);
546
554
  };
547
555
 
556
+ const currentErrorTypeName = useMemo(() => {
557
+ if (activeQuery && activeQueryState != null && activeQueryState.error) {
558
+ const errorType = errorTypes.find(type => {
559
+ var _activeQueryState$err;
560
+
561
+ return type.initializer(activeQuery).toString() === ((_activeQueryState$err = activeQueryState.error) == null ? void 0 : _activeQueryState$err.toString());
562
+ });
563
+ return errorType == null ? void 0 : errorType.name;
564
+ }
565
+
566
+ return undefined;
567
+ }, [activeQuery, activeQueryState == null ? void 0 : activeQueryState.error, errorTypes]);
568
+
548
569
  if (!activeQuery || !activeQueryState) {
549
570
  return null;
550
571
  }
551
572
 
573
+ const triggerError = errorType => {
574
+ var _errorType$initialize;
575
+
576
+ const error = (_errorType$initialize = errorType == null ? void 0 : errorType.initializer(activeQuery)) != null ? _errorType$initialize : new Error('Unknown error from devtools');
577
+ const __previousQueryOptions = activeQuery.options;
578
+ activeQuery.setState({
579
+ status: 'error',
580
+ error,
581
+ fetchMeta: { ...activeQuery.state.fetchMeta,
582
+ __previousQueryOptions
583
+ }
584
+ });
585
+ };
586
+
587
+ const restoreQueryAfterLoadingOrError = () => {
588
+ activeQuery.fetch(activeQuery.state.fetchMeta.__previousQueryOptions, {
589
+ // Make sure this fetch will cancel the previous one
590
+ cancelRefetch: true
591
+ });
592
+ };
593
+
552
594
  return /*#__PURE__*/React.createElement(ActiveQueryPanel, null, /*#__PURE__*/React.createElement("div", {
553
595
  style: {
554
596
  padding: '.5em',
@@ -615,7 +657,11 @@ const ActiveQuery = ({
615
657
  }
616
658
  }, "Actions"), /*#__PURE__*/React.createElement("div", {
617
659
  style: {
618
- padding: '0.5em'
660
+ padding: '0.5em',
661
+ display: 'flex',
662
+ flexWrap: 'wrap',
663
+ gap: '0.5em',
664
+ alignItems: 'flex-end'
619
665
  }
620
666
  }, /*#__PURE__*/React.createElement(Button, {
621
667
  type: "button",
@@ -643,7 +689,61 @@ const ActiveQuery = ({
643
689
  style: {
644
690
  background: defaultTheme.danger
645
691
  }
646
- }, "Remove")), /*#__PURE__*/React.createElement("div", {
692
+ }, "Remove"), ' ', /*#__PURE__*/React.createElement(Button, {
693
+ type: "button",
694
+ onClick: () => {
695
+ if (activeQuery.state.data === undefined) {
696
+ restoreQueryAfterLoadingOrError();
697
+ } else {
698
+ const __previousQueryOptions = activeQuery.options; // Trigger a fetch in order to trigger suspense as well.
699
+
700
+ activeQuery.fetch({ ...__previousQueryOptions,
701
+ queryFn: () => {
702
+ return new Promise(() => {// Never resolve
703
+ });
704
+ },
705
+ cacheTime: -1
706
+ });
707
+ activeQuery.setState({
708
+ data: undefined,
709
+ status: 'loading',
710
+ fetchMeta: { ...activeQuery.state.fetchMeta,
711
+ __previousQueryOptions
712
+ }
713
+ });
714
+ }
715
+ },
716
+ style: {
717
+ background: defaultTheme.paused
718
+ }
719
+ }, activeQuery.state.status === 'loading' ? 'Restore' : 'Trigger', ' ', "loading"), ' ', errorTypes.length === 0 || activeQuery.state.status === 'error' ? /*#__PURE__*/React.createElement(Button, {
720
+ type: "button",
721
+ onClick: () => {
722
+ if (!activeQuery.state.error) {
723
+ triggerError();
724
+ } else {
725
+ queryClient.resetQueries(activeQuery);
726
+ }
727
+ },
728
+ style: {
729
+ background: defaultTheme.danger
730
+ }
731
+ }, activeQuery.state.status === 'error' ? 'Restore' : 'Trigger', " error") : /*#__PURE__*/React.createElement("label", null, "Trigger error:", /*#__PURE__*/React.createElement(Select, {
732
+ value: currentErrorTypeName != null ? currentErrorTypeName : '',
733
+ style: {
734
+ marginInlineStart: '.5em'
735
+ },
736
+ onChange: e => {
737
+ const errorType = errorTypes.find(t => t.name === e.target.value);
738
+ triggerError(errorType);
739
+ }
740
+ }, /*#__PURE__*/React.createElement("option", {
741
+ key: "",
742
+ value: ""
743
+ }), errorTypes.map(errorType => /*#__PURE__*/React.createElement("option", {
744
+ key: errorType.name,
745
+ value: errorType.name
746
+ }, errorType.name))))), /*#__PURE__*/React.createElement("div", {
647
747
  style: {
648
748
  background: defaultTheme.backgroundAlt,
649
749
  padding: '.5em',