UNPKG

wana

Version:

Easy observable state for React

1 lines 8.88 kB
{"version":3,"file":"debug.mjs","sources":["../src/debug/format.ts","../src/debug/logChange.ts","../src/debug/logChanges.ts","../src/debug/useChangeLog.ts","../src/debug/useObserverLog.ts","../src/debug/logRender.ts","../src/debug/useRenderLog.ts"],"sourcesContent":["import { is } from '@alloc/is'\n\ntype Indexable<T> = { [key: string]: T }\n\nexport function format(\n message: string,\n values: Indexable<any>,\n styles: Indexable<string> = {}\n) {\n const args: any[] = []\n const formatted = message.replace(/\\$(\\w+)/g, (_, key) => {\n const value =\n key in styles && typeof values[key] == 'object'\n ? JSON.stringify(values[key])\n : values[key]\n\n const style =\n key in styles ? styles[key] : is.string(value) ? 'color: #5162FF' : null\n\n if (is.string(style)) {\n args.push(style, String(value), '')\n return '%c%s%c'\n }\n\n args.push(value)\n return '%O'\n })\n return [formatted].concat(args)\n}\n","import { is } from '@alloc/is'\nimport { isDev } from '@alloc/is-dev'\nimport { getDebug } from '../debug'\nimport { Change } from '../observable'\nimport { format } from './format'\n\nlet prevTime = Date.now()\n\nexport function logChange(change: Change, targetId?: string) {\n let verb: string\n let meta: object\n if (change.op == 'add') {\n verb = 'Added'\n meta = { value: change.value }\n } else if (change.op == 'remove') {\n verb = 'Removed'\n meta = { oldValue: change.oldValue }\n } else if (change.op == 'replace') {\n verb = 'Replaced'\n meta = { value: change.value, oldValue: change.oldValue }\n } else if (change.op == 'splice') {\n verb = 'Spliced'\n meta = { value: change.value, oldValue: change.oldValue }\n } else {\n verb = 'Cleared'\n meta = { oldValue: change.oldValue }\n }\n\n console.log(\n ...format(\n '$verb $key of $targetId with',\n {\n verb,\n key: is.string(change.key) ? `\"${change.key}\"` : change.key,\n targetId:\n targetId ||\n (getDebug(change.target) || change.target.constructor).name,\n },\n {\n verb: '',\n targetId: 'color: #7BB347',\n }\n ),\n meta,\n change.target\n )\n\n if (isDev && console.groupCollapsed) {\n const now = Date.now()\n console.groupCollapsed(`Stack trace (+${now - prevTime}ms)`)\n console.trace()\n console.groupEnd()\n prevTime = now\n }\n}\n\ndeclare global {\n interface Console {\n groupCollapsed(name: string): void\n groupEnd(): void\n }\n}\n","import { Change, ObserverTarget } from '../observable'\nimport { $O } from '../symbols'\nimport { logChange } from './logChange'\n\nexport type ChangeLogConfig = {\n name?: string\n onChange?: (change: Change) => void\n}\n\nexport function logChanges(\n target: ObserverTarget,\n { name, onChange }: ChangeLogConfig = {}\n) {\n const observable = target[$O]\n if (!observable) {\n throw Error('Expected an observable object')\n }\n\n const observers = observable.get($O)\n const observer = {\n onChange: (change: Change) => {\n if (onChange) {\n onChange(change)\n }\n logChange(change, name)\n },\n dispose: () => {\n observers.delete(observer)\n },\n }\n\n observers.add(observer)\n return observer\n}\n","import { useChanges } from '../ui/useChanges'\nimport { logChange } from './logChange'\nimport { ChangeLogConfig } from './logChanges'\n\ndeclare const process: any\n\n/**\n * Log any shallow changes to the given observable object.\n */\nexport function useChangeLog(\n target: object,\n { name, onChange }: ChangeLogConfig = {}\n) {\n useChanges(target, change => {\n if (onChange) {\n onChange(change)\n }\n if (process.env.NODE_ENV !== 'test') {\n logChange(change, name)\n }\n })\n}\n","import { is } from '@alloc/is'\nimport { useEffect } from 'react'\nimport { getCurrentAuto, getDebug } from '../debug'\nimport { $O } from '../symbols'\nimport { format } from './format'\n\nexport function useObserverLog(name?: string) {\n const auto = getCurrentAuto()\n if (!auto) {\n throw Error('Cannot call \"useObserverLog\" outside a \"withAuto\" component')\n }\n useEffect(() => {\n const { observer } = auto\n if (observer) {\n const { observed } = observer\n\n let [message, ...args] = format(\n '$count values were observed by $name',\n { count: observed.size, name: name || getDebug(auto).name },\n { name: 'color: #7BB347' }\n )\n\n observed.forEach(({ key, owner }) => {\n const [line, ...vars] = format(\n '\\n $key of $target',\n {\n key: key == $O ? 'all' : is.string(key) ? `\"${key}\"` : key,\n target: owner.source,\n },\n key == $O ? { key: '' } : undefined\n )\n message += line\n args.push(...vars)\n })\n\n console.log(message, ...args)\n }\n })\n}\n","import { Auto } from '../auto'\nimport { getDebug } from '../debug'\n\nexport function logRender(\n auto: Auto,\n depth: number,\n component: React.ComponentType<any> & { __render?: any }\n) {\n if (!component.displayName) {\n console.warn(\n 'Component without \"displayName\" is harder to debug',\n component.__render || component\n )\n }\n const indent = ' '.repeat(depth)\n const debug = getDebug(auto)\n console.debug(indent + '<' + debug.name + ' />', '⚛️' + debug.renders, [\n ...debug.actions!,\n ])\n}\n","import { isDev } from '@alloc/is-dev'\nimport { getCurrentAuto } from '../debug'\nimport { globals } from '../globals'\nimport { useAutoDepth } from '../ui/context'\nimport { logRender } from './logRender'\n\n// Track which component began rendering most recently.\nlet lastComponent: React.ComponentType | undefined\n\nif (isDev) {\n const { onRender } = globals\n globals.onRender = (auto, depth, component) => {\n lastComponent = component\n if (onRender) {\n onRender(auto, depth, component)\n }\n }\n}\n\nexport function useRenderLog() {\n const depth = useAutoDepth()\n if (isDev) {\n const auto = getCurrentAuto()\n if (!auto || !lastComponent) {\n throw Error('Cannot call \"useRenderLog\" outside a \"withAuto\" component')\n }\n logRender(auto, depth, lastComponent)\n }\n}\n"],"names":[],"mappings":"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"}