@tomorrowevening/theatric 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +203 -0
- package/README.md +294 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1792 -0
- package/dist/index.js.map +7 -0
- package/dist/tsdoc-metadata.json +11 -0
- package/package.json +50 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../../../node_modules/lodash-es/isArray.js", "../../../node_modules/lodash-es/_freeGlobal.js", "../../../node_modules/lodash-es/_root.js", "../../../node_modules/lodash-es/_Symbol.js", "../../../node_modules/lodash-es/_getRawTag.js", "../../../node_modules/lodash-es/_objectToString.js", "../../../node_modules/lodash-es/_baseGetTag.js", "../../../node_modules/lodash-es/isObjectLike.js", "../../../node_modules/lodash-es/isObject.js", "../../../node_modules/lodash-es/isFunction.js", "../../../node_modules/lodash-es/_coreJsData.js", "../../../node_modules/lodash-es/_isMasked.js", "../../../node_modules/lodash-es/_toSource.js", "../../../node_modules/lodash-es/_baseIsNative.js", "../../../node_modules/lodash-es/_getValue.js", "../../../node_modules/lodash-es/_getNative.js", "../../../node_modules/lodash-es/_nativeCreate.js", "../../../node_modules/lodash-es/_hashClear.js", "../../../node_modules/lodash-es/_hashDelete.js", "../../../node_modules/lodash-es/_hashGet.js", "../../../node_modules/lodash-es/_hashHas.js", "../../../node_modules/lodash-es/_hashSet.js", "../../../node_modules/lodash-es/_Hash.js", "../../../node_modules/lodash-es/_listCacheClear.js", "../../../node_modules/lodash-es/eq.js", "../../../node_modules/lodash-es/_assocIndexOf.js", "../../../node_modules/lodash-es/_listCacheDelete.js", "../../../node_modules/lodash-es/_listCacheGet.js", "../../../node_modules/lodash-es/_listCacheHas.js", "../../../node_modules/lodash-es/_listCacheSet.js", "../../../node_modules/lodash-es/_ListCache.js", "../../../node_modules/lodash-es/_Map.js", "../../../node_modules/lodash-es/_mapCacheClear.js", "../../../node_modules/lodash-es/_isKeyable.js", "../../../node_modules/lodash-es/_getMapData.js", "../../../node_modules/lodash-es/_mapCacheDelete.js", "../../../node_modules/lodash-es/_mapCacheGet.js", "../../../node_modules/lodash-es/_mapCacheHas.js", "../../../node_modules/lodash-es/_mapCacheSet.js", "../../../node_modules/lodash-es/_MapCache.js", "../../../node_modules/lodash-es/_overArg.js", "../../dataverse/src/pointer.ts", "../../dataverse/src/utils/Stack.ts", "../../dataverse/src/prism/discoveryMechanism.ts", "../../dataverse/src/prism/prism.ts", "../../dataverse/src/Atom.ts", "../../dataverse/src/pointerToPrism.ts", "../../dataverse/src/Ticker.ts", "../../../node_modules/lodash-es/_stackClear.js", "../../../node_modules/lodash-es/_stackDelete.js", "../../../node_modules/lodash-es/_stackGet.js", "../../../node_modules/lodash-es/_stackHas.js", "../../../node_modules/lodash-es/_stackSet.js", "../../../node_modules/lodash-es/_Stack.js", "../../../node_modules/lodash-es/_setCacheAdd.js", "../../../node_modules/lodash-es/_setCacheHas.js", "../../../node_modules/lodash-es/_SetCache.js", "../../../node_modules/lodash-es/_arraySome.js", "../../../node_modules/lodash-es/_cacheHas.js", "../../../node_modules/lodash-es/_equalArrays.js", "../../../node_modules/lodash-es/_Uint8Array.js", "../../../node_modules/lodash-es/_mapToArray.js", "../../../node_modules/lodash-es/_setToArray.js", "../../../node_modules/lodash-es/_equalByTag.js", "../../../node_modules/lodash-es/_arrayPush.js", "../../../node_modules/lodash-es/_baseGetAllKeys.js", "../../../node_modules/lodash-es/_arrayFilter.js", "../../../node_modules/lodash-es/stubArray.js", "../../../node_modules/lodash-es/_getSymbols.js", "../../../node_modules/lodash-es/_baseTimes.js", "../../../node_modules/lodash-es/_baseIsArguments.js", "../../../node_modules/lodash-es/isArguments.js", "../../../node_modules/lodash-es/stubFalse.js", "../../../node_modules/lodash-es/isBuffer.js", "../../../node_modules/lodash-es/_isIndex.js", "../../../node_modules/lodash-es/isLength.js", "../../../node_modules/lodash-es/_baseIsTypedArray.js", "../../../node_modules/lodash-es/_baseUnary.js", "../../../node_modules/lodash-es/_nodeUtil.js", "../../../node_modules/lodash-es/isTypedArray.js", "../../../node_modules/lodash-es/_arrayLikeKeys.js", "../../../node_modules/lodash-es/_isPrototype.js", "../../../node_modules/lodash-es/_nativeKeys.js", "../../../node_modules/lodash-es/_baseKeys.js", "../../../node_modules/lodash-es/isArrayLike.js", "../../../node_modules/lodash-es/keys.js", "../../../node_modules/lodash-es/_getAllKeys.js", "../../../node_modules/lodash-es/_equalObjects.js", "../../../node_modules/lodash-es/_DataView.js", "../../../node_modules/lodash-es/_Promise.js", "../../../node_modules/lodash-es/_Set.js", "../../../node_modules/lodash-es/_WeakMap.js", "../../../node_modules/lodash-es/_getTag.js", "../../../node_modules/lodash-es/_baseIsEqualDeep.js", "../../../node_modules/lodash-es/_baseIsEqual.js", "../../../node_modules/lodash-es/isEqualWith.js", "../../../node_modules/lodash-es/isEqual.js"],
|
|
4
|
+
"sourcesContent": ["import type {\r\n IProject,\r\n IProjectConfig,\r\n ISheetObject,\r\n UnknownShorthandCompoundProps,\r\n} from '@tomorrowevening/theatre-core'\r\nimport {val} from '@tomorrowevening/theatre-core'\r\nimport {getProject} from '@tomorrowevening/theatre-core'\r\nimport type {Pointer} from '@tomorrowevening/theatre-dataverse'\r\nimport {isPointer} from '@tomorrowevening/theatre-dataverse'\r\nimport studio from '@tomorrowevening/theatre-studio'\r\nimport isEqualWith from 'lodash-es/isEqualWith'\r\nimport isEqual from 'lodash-es/isEqual'\r\nimport {useEffect, useMemo, useState, useRef} from 'react'\r\n\r\ntype KeysMatching<T extends object, V> = {\r\n [K in keyof T]-?: T[K] extends V ? K : never\r\n}[keyof T]\r\n\r\ntype OmitMatching<T extends object, V> = Omit<T, KeysMatching<T, V>>\r\n\r\n// Because treeshaking studio relies on static checks like the following, we can't make including studio configurable at runtime.\r\n// What we can do, if there arises a need to use studio in production with theatric, is to let users provide their own studio instance.\r\n// That way we can treeshake our own, and the user can give us theirs, if they want to.\r\n\r\nif (process.env.NODE_ENV === 'development') {\r\n studio.initialize()\r\n}\r\n\r\n// Just to be able to treeshake studio out of the bundle\r\nconst maybeTransaction =\r\n process.env.NODE_ENV === 'development'\r\n ? studio.transaction.bind(studio)\r\n : () => {}\r\n\r\nlet _projectConfig: IProjectConfig['state'] | undefined = undefined\r\n\r\n// used for comparing config objects, to avoid re-rendering when the config object is recreated\r\n// but the values are the same except for functions\r\nfunction equalityCheckWithFunctionsAlwaysEqual(\r\n a: unknown,\r\n b: unknown,\r\n): boolean | undefined {\r\n if (typeof a === 'function' && typeof b === 'function') {\r\n return true\r\n }\r\n}\r\n\r\nexport function initialize(config: IProjectConfig): Promise<void> {\r\n if (_project) {\r\n console.warn(\r\n 'Theatric has already been initialized, either through another initialize call, or by calling useControls() before calling initialize().',\r\n )\r\n return _project.ready.then(() => {})\r\n }\r\n _projectConfig = config\r\n const project = callGetProject()\r\n return project.ready.then(() => {})\r\n}\r\n\r\nexport function getAssetUrl(asset: {\r\n type: 'image' | 'file'\r\n id: string | undefined\r\n}): string | undefined {\r\n if (!_project) {\r\n throw new Error(\r\n 'Theatric has not been initialized yet. Please call initialize() before calling getAssetUrl().',\r\n )\r\n }\r\n if (!_project.isReady) {\r\n throw new Error(\r\n 'Calling `getAssetUrl()` before `initialize()` is resolved.\\n' +\r\n 'The best way to solve this is to delay rendering your react app until `project.ready` is resolved, like this: \\n\\n' +\r\n '```\\n' +\r\n 'project.ready.then(() => {ReactDom.render(...)})\\n' +\r\n '```',\r\n )\r\n }\r\n return _project.getAssetUrl(asset)\r\n}\r\n\r\nconst allProps: Record<string, UnknownShorthandCompoundProps[]> = {}\r\nconst allActions: Record<string, Record<string, () => void>[]> = {}\r\n\r\ntype Button = {\r\n type: 'button'\r\n onClick: () => void\r\n}\r\ntype Buttons = {\r\n [key: string]: Button\r\n}\r\n\r\ntype ControlsAndButtons = {\r\n [key: string]: {type: 'button'} | UnknownShorthandCompoundProps[string]\r\n}\r\n\r\n/**\r\n * The type of the `$set()` function returned by `useControls()`.\r\n */\r\ntype Setter<Config extends UnknownShorthandCompoundProps> = <S>(\r\n pointer: (p: ISheetObject<Config>['props']) => Pointer<S>,\r\n value: S,\r\n) => void\r\n\r\n/**\r\n * The type of the `$get()` function returned by `useControls()`.\r\n */\r\ntype Getter<Config extends UnknownShorthandCompoundProps> = <S>(\r\n pointer: (p: ISheetObject<Config>['props']) => Pointer<S>,\r\n) => S\r\n\r\nexport function useControls<Config extends ControlsAndButtons>(\r\n config: Config,\r\n options: {panel?: string; folder?: string} = {},\r\n): ISheetObject<OmitMatching<Config, {type: 'button'}>>['value'] & {\r\n $set: Setter<OmitMatching<Config, {type: 'button'}>>\r\n $get: Getter<OmitMatching<Config, {type: 'button'}>>\r\n} {\r\n // initialize state to null, if it hasn't been initialized yet\r\n if (_projectConfig === undefined) {\r\n _projectConfig = null\r\n }\r\n\r\n /*\r\n * This is a performance hack just to avoid a bunch of unnecessary calculations and effect runs whenever the hook is called,\r\n * since the config object is very likely not memoized by the user.\r\n * Since the config object can include functions, we can't rely for correctness on just deep comparing the config object,\r\n * we also have to perform a deep comparison on the theatre object values in onValuesChange before calling setState in order\r\n * to truly make sure we avoid infinite loops in this case, since then the config object will always be reported to be different by isEqual.\r\n *\r\n * Note: normally object.onValuesChange wouldn't be called twice with the same values, but when the object is reconfigured (which it is),\r\n * this doesn't seem to be the case.\r\n *\r\n * Also note: normally it'd be illegal to set refs during render (since renders might not be committed), but it is fine here\r\n * because we are only using it for memoization, _config is never going to be stale.\r\n */\r\n const configRef = useRef(config)\r\n const _config = useMemo(() => {\r\n let currentConfig = configRef.current\r\n\r\n if (\r\n !isEqualWith(\r\n config,\r\n configRef.current,\r\n equalityCheckWithFunctionsAlwaysEqual,\r\n )\r\n ) {\r\n configRef.current = config\r\n currentConfig = config\r\n }\r\n\r\n return currentConfig\r\n }, [config])\r\n\r\n const {folder} = options\r\n\r\n const controlsWithoutButtons = useMemo(\r\n () =>\r\n Object.fromEntries(\r\n Object.entries(_config).filter(\r\n ([key, value]) => (value as any).type !== 'button',\r\n ),\r\n ) as UnknownShorthandCompoundProps,\r\n [_config],\r\n )\r\n\r\n const buttons = useMemo(\r\n () =>\r\n Object.fromEntries(\r\n Object.entries(_config).filter(\r\n ([key, value]) => (value as any).type === 'button',\r\n ),\r\n ) as unknown as Buttons,\r\n [_config],\r\n )\r\n\r\n const props = useMemo(\r\n () =>\r\n folder ? {[folder]: controlsWithoutButtons} : controlsWithoutButtons,\r\n [folder, controlsWithoutButtons],\r\n )\r\n\r\n const actions = useMemo(\r\n () =>\r\n Object.fromEntries(\r\n Object.entries(buttons).map(([key, value]) => [\r\n `${folder ? `${folder}: ` : ''}${key}`,\r\n () => {\r\n // the value of the button is a function, so we can't use it as a dependency, but we can use it as a ref\r\n // @ts-ignore\r\n configRef.current[key].onClick?.()\r\n },\r\n ]),\r\n ),\r\n [buttons, folder],\r\n )\r\n\r\n const sheet = useMemo(() => callGetProject().sheet('Panels'), [])\r\n\r\n const panel = options.panel ?? 'Default panel'\r\n const allPanelProps = allProps[panel] ?? (allProps[panel] = [])\r\n const allPanelActions = allActions[panel] ?? (allActions[panel] = [])\r\n\r\n // have to do this to make sure the values are immediately available\r\n const object = useMemo(\r\n () =>\r\n sheet.object(panel, Object.assign({}, ...allProps[panel], props), {\r\n reconfigure: true,\r\n __actions__THIS_API_IS_UNSTABLE_AND_WILL_CHANGE_IN_THE_NEXT_VERSION:\r\n Object.assign({}, ...allActions[panel], actions),\r\n }),\r\n [panel, props, actions],\r\n )\r\n\r\n useEffect(() => {\r\n allPanelProps.push(props)\r\n allPanelActions.push(actions)\r\n // cleanup runs after render, so we have to reconfigure with the new props here too, doing it during render just makes sure that\r\n // the very first values returned are not undefined\r\n let obj = sheet.object(panel, Object.assign({}, ...allPanelProps), {\r\n reconfigure: true,\r\n __actions__THIS_API_IS_UNSTABLE_AND_WILL_CHANGE_IN_THE_NEXT_VERSION:\r\n Object.assign({}, ...allPanelActions),\r\n })\r\n\r\n selectObjectIfNecessary(obj)\r\n\r\n return () => {\r\n allPanelProps.splice(allPanelProps.indexOf(props), 1)\r\n allActions[panel].splice(allPanelActions.indexOf(actions), 1)\r\n sheet.object(panel, Object.assign({}, ...allPanelProps), {\r\n reconfigure: true,\r\n __actions__THIS_API_IS_UNSTABLE_AND_WILL_CHANGE_IN_THE_NEXT_VERSION:\r\n Object.assign({}, ...allPanelActions),\r\n })\r\n }\r\n }, [props, actions, allPanelActions, allPanelProps, sheet, panel])\r\n\r\n const [values, setValues] = useState(\r\n (folder ? object.value[folder] : object.value) as ISheetObject<\r\n OmitMatching<Config, {type: 'button'}>\r\n >['value'],\r\n )\r\n\r\n const valuesRef = useRef(object.value)\r\n\r\n useEffect(() => {\r\n const unsub = object.onValuesChange((newValues) => {\r\n if (folder) newValues = newValues[folder]\r\n\r\n // Normally object.onValuesChange wouldn't be called twice with the same values, but when the object is reconfigured (like we do above),\r\n // this doesn't seem to be the case, so we need to explicitly do this here to avoid infinite loops.\r\n if (isEqual(newValues, valuesRef.current)) return\r\n\r\n valuesRef.current = newValues\r\n setValues(newValues as any)\r\n })\r\n\r\n return unsub\r\n }, [object])\r\n\r\n const $setAndGet = useMemo(() => {\r\n const rootPointer = folder\r\n ? (object as ISheetObject).props[folder]\r\n : object.props\r\n\r\n const $set: Setter<OmitMatching<Config, {type: 'button'}>> = (\r\n getPointer,\r\n value,\r\n ) => {\r\n if (typeof getPointer !== 'function') {\r\n throw new Error(\r\n `The first argument to $set must be a function that returns a pointer. Instead, it was ${typeof getPointer}`,\r\n )\r\n }\r\n\r\n const pointer = getPointer(rootPointer as any)\r\n if (!isPointer(pointer)) {\r\n throw new Error(\r\n `The function passed to $set must return a pointer. Instead, it returned ${pointer}`,\r\n )\r\n }\r\n // this is not ideal because it will create a separate undo level for each set call,\r\n // but this is the only thing that theatre's public API allows us to do.\r\n // Wrapping the whole thing in a transaction wouldn't work either because side effects\r\n // would be run twice.\r\n maybeTransaction((api) => {\r\n api.set(pointer, value)\r\n })\r\n }\r\n\r\n const $get: Getter<OmitMatching<Config, {type: 'button'}>> = (\r\n getPointer,\r\n ) => {\r\n if (typeof getPointer !== 'function') {\r\n throw new Error(\r\n `The first argument to $get must be a function that returns a pointer. Instead, it was ${typeof getPointer}`,\r\n )\r\n }\r\n\r\n const pointer = getPointer(rootPointer as any)\r\n if (!isPointer(pointer)) {\r\n throw new Error(\r\n `The function passed to $get must return a pointer. Instead, it returned ${pointer}`,\r\n )\r\n }\r\n\r\n return val(pointer)\r\n }\r\n\r\n return {$set, $get}\r\n }, [folder, object])\r\n\r\n return {...values, ...$setAndGet}\r\n}\r\n\r\nexport {types} from '@tomorrowevening/theatre-core'\r\n\r\nexport const button = (onClick: Button['onClick']) => {\r\n return {\r\n type: 'button' as const,\r\n onClick,\r\n }\r\n}\r\n\r\nlet _project: undefined | IProject\r\n\r\nfunction callGetProject() {\r\n if (_project) return _project\r\n _project = getProject('Theatric', _projectConfig ?? undefined)\r\n return _project\r\n}\r\n\r\nlet objAlreadySelected = false\r\n// When the user first opens the page, no object will be selected, which for users\r\n// unfamiliar with theatre can be confusing. Let's help the user by selecting the first object\r\n// that is created using `useControls()`.\r\nfunction selectObjectIfNecessary(obj: ISheetObject) {\r\n if (objAlreadySelected) return\r\n objAlreadySelected = true\r\n if (process.env.NODE_ENV === 'development') {\r\n if (studio.selection.length === 0) {\r\n studio.setSelection([obj])\r\n }\r\n }\r\n}\r\n", "/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n", "/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n", "import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n", "import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n", "import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n", "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n", "import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n", "/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n", "/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n", "import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n", "import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n", "import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n", "/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n", "import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n", "/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n", "import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n", "import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n", "import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n", "/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n", "import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n", "import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n", "import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n", "import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n", "/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n", "/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n", "import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n", "import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n", "import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n", "import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n", "import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n", "import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n", "import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n", "import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n", "/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n", "import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n", "import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n", "import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n", "import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n", "import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n", "import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n", "/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n", "import type {$IntentionalAny} from './types'\r\n\r\ntype PathToProp = Array<string | number>\r\n\r\nexport type PointerMeta = {\r\n root: {}\r\n path: (string | number)[]\r\n}\r\n\r\n/** We are using an empty object as a WeakMap key for storing pointer meta data */\r\ntype WeakPointerKey = {}\r\n\r\nexport type UnindexableTypesForPointer =\r\n | number\r\n | string\r\n | boolean\r\n | null\r\n | void\r\n | undefined\r\n | Function // eslint-disable-line @typescript-eslint/ban-types\r\n\r\nexport type UnindexablePointer = {\r\n [K in $IntentionalAny]: Pointer<undefined>\r\n}\r\n\r\nconst pointerMetaWeakMap = new WeakMap<WeakPointerKey, PointerMeta>()\r\nconst cachedSubPathPointersWeakMap = new WeakMap<\r\n WeakPointerKey,\r\n Map<string | number, Pointer<unknown>>\r\n>()\r\n\r\n/**\r\n * A wrapper type for the type a `Pointer` points to.\r\n */\r\nexport type PointerType<O> = {\r\n /**\r\n * Only accessible via the type system.\r\n * This is a helper for getting the underlying pointer type\r\n * via the type space.\r\n */\r\n $$__pointer_type: O\r\n}\r\n\r\n/**\r\n * The type of {@link Atom} pointers. See {@link pointer|pointer()} for an\r\n * explanation of pointers.\r\n *\r\n * @see Atom\r\n *\r\n * @remarks\r\n * The Pointer type is quite tricky because it doesn't play well with `any` and other inexact types.\r\n * Here is an example that one would expect to work, but currently doesn't:\r\n * ```ts\r\n * declare function expectAnyPointer(pointer: Pointer<any>): void\r\n *\r\n * expectAnyPointer(null as Pointer<{}>) // this shows as a type error because Pointer<{}> is not assignable to Pointer<any>, even though it should\r\n * ```\r\n *\r\n * The current solution is to just avoid using `any` with pointer-related code (or type-test it well).\r\n * But if you enjoy solving typescript puzzles, consider fixing this :)\r\n * Potentially, [TypeScript variance annotations in 4.7+](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7-beta/#optional-variance-annotations-for-type-parameters)\r\n * might be able to help us.\r\n */\r\nexport type Pointer<O> = PointerType<O> &\r\n // `Exclude<O, undefined>` will remove `undefined` from the first type\r\n // `undefined extends O ? undefined : never` will give us `undefined` if `O` is `... | undefined`\r\n PointerInner<Exclude<O, undefined>, undefined extends O ? undefined : never>\r\n\r\n// By separating the `O` (non-undefined) from the `undefined` or `never`, we\r\n// can properly use `O extends ...` to determine the kind of potential value\r\n// without actually discarding optionality information.\r\ntype PointerInner<O, Optional> = O extends UnindexableTypesForPointer\r\n ? UnindexablePointer\r\n : unknown extends O\r\n ? UnindexablePointer\r\n : O extends (infer T)[]\r\n ? Pointer<T>[]\r\n : O extends {}\r\n ? {\r\n [K in keyof O]-?: Pointer<O[K] | Optional>\r\n }\r\n : UnindexablePointer\r\n\r\nconst pointerMetaSymbol = Symbol('pointerMeta')\r\n\r\nconst proxyHandler = {\r\n get(\r\n pointerKey: WeakPointerKey,\r\n prop: string | typeof pointerMetaSymbol,\r\n ): $IntentionalAny {\r\n if (prop === pointerMetaSymbol) return pointerMetaWeakMap.get(pointerKey)!\r\n\r\n let subPathPointers = cachedSubPathPointersWeakMap.get(pointerKey)\r\n if (!subPathPointers) {\r\n subPathPointers = new Map()\r\n cachedSubPathPointersWeakMap.set(pointerKey, subPathPointers)\r\n }\r\n\r\n const existing = subPathPointers.get(prop)\r\n if (existing !== undefined) return existing\r\n\r\n const meta = pointerMetaWeakMap.get(pointerKey)!\r\n\r\n const subPointer = pointer({root: meta.root, path: [...meta.path, prop]})\r\n subPathPointers.set(prop, subPointer)\r\n return subPointer\r\n },\r\n}\r\n\r\n/**\r\n * Returns the metadata associated with the pointer. Usually the root object and\r\n * the path.\r\n *\r\n * @param p - The pointer.\r\n */\r\nexport const getPointerMeta = <_>(p: PointerType<_>): PointerMeta => {\r\n // @ts-ignore @todo\r\n const meta: PointerMeta = p[\r\n pointerMetaSymbol as unknown as $IntentionalAny\r\n ] as $IntentionalAny\r\n return meta\r\n}\r\n\r\n/**\r\n * Returns the root object and the path of the pointer.\r\n *\r\n * @example\r\n * ```ts\r\n * const {root, path} = getPointerParts(pointer)\r\n * ```\r\n *\r\n * @param p - The pointer.\r\n *\r\n * @returns An object with two properties: `root`-the root object or the pointer, and `path`-the path of the pointer. `path` is an array of the property-chain.\r\n */\r\nexport const getPointerParts = <_>(\r\n p: Pointer<_>,\r\n): {root: {}; path: PathToProp} => {\r\n const {root, path} = getPointerMeta(p)\r\n return {root, path}\r\n}\r\n\r\n/**\r\n * Creates a pointer to a (nested) property of an {@link Atom}.\r\n *\r\n * @remarks\r\n * Pointers are used to make prisms of properties or nested properties of\r\n * {@link Atom|Atoms}.\r\n *\r\n * Pointers also allow easy construction of new pointers pointing to nested members\r\n * of the root object, by simply using property chaining. E.g. `somePointer.a.b` will\r\n * create a new pointer that has `'a'` and `'b'` added to the path of `somePointer`.\r\n *\r\n * @example\r\n * ```ts\r\n * // Here, sum is a prism that updates whenever the a or b prop of someAtom does.\r\n * const sum = prism(() => {\r\n * return val(pointer({root: someAtom, path: ['a']})) + val(pointer({root: someAtom, path: ['b']}));\r\n * });\r\n *\r\n * // Note, atoms have a convenience Atom.pointer property that points to the root,\r\n * // which you would normally use in this situation.\r\n * const sum = prism(() => {\r\n * return val(someAtom.pointer.a) + val(someAtom.pointer.b);\r\n * });\r\n * ```\r\n *\r\n * @param args - The pointer parameters.\r\n *\r\n * @typeParam O - The type of the value being pointed to.\r\n */\r\nfunction pointer<O>(args: {root: {}; path?: Array<string | number>}) {\r\n const meta: PointerMeta = {\r\n root: args.root as $IntentionalAny,\r\n path: args.path ?? [],\r\n }\r\n const pointerKey: WeakPointerKey = {}\r\n pointerMetaWeakMap.set(pointerKey, meta)\r\n return new Proxy(pointerKey, proxyHandler) as Pointer<O>\r\n}\r\n\r\nexport default pointer\r\n\r\n/**\r\n * Returns whether `p` is a pointer.\r\n */\r\nexport const isPointer = (p: $IntentionalAny): p is Pointer<unknown> => {\r\n return p && !!getPointerMeta(p)\r\n}\r\n", "interface Node<Data> {\r\n next: undefined | Node<Data>\r\n data: Data\r\n}\r\n\r\n/**\r\n * Just a simple LinkedList\r\n */\r\nexport default class Stack<Data> {\r\n _head: undefined | Node<Data>\r\n\r\n constructor() {\r\n this._head = undefined\r\n }\r\n\r\n peek() {\r\n return this._head && this._head.data\r\n }\r\n\r\n pop() {\r\n const head = this._head\r\n if (!head) {\r\n return undefined\r\n }\r\n this._head = head.next\r\n return head.data\r\n }\r\n\r\n push(data: Data) {\r\n const node = {next: this._head, data}\r\n this._head = node\r\n }\r\n}\r\n", "import type {$IntentionalAny} from '../types'\r\nimport Stack from '../utils/Stack'\r\nimport type {Prism} from './Interface'\r\n\r\nfunction createMechanism() {\r\n const noop = () => {}\r\n\r\n const stack = new Stack<Collector>()\r\n const noopCollector: Collector = noop\r\n\r\n type Collector = (d: Prism<$IntentionalAny>) => void\r\n\r\n const pushCollector = (collector: Collector): void => {\r\n stack.push(collector)\r\n }\r\n\r\n const popCollector = (collector: Collector): void => {\r\n const existing = stack.peek()\r\n if (existing !== collector) {\r\n throw new Error(`Popped collector is not on top of the stack`)\r\n }\r\n stack.pop()\r\n }\r\n\r\n const startIgnoringDependencies = () => {\r\n stack.push(noopCollector)\r\n }\r\n\r\n const stopIgnoringDependencies = () => {\r\n if (stack.peek() !== noopCollector) {\r\n if (process.env.NODE_ENV === 'development') {\r\n console.warn('This should never happen')\r\n }\r\n } else {\r\n stack.pop()\r\n }\r\n }\r\n\r\n const reportResolutionStart = (d: Prism<$IntentionalAny>) => {\r\n const possibleCollector = stack.peek()\r\n if (possibleCollector) {\r\n possibleCollector(d)\r\n }\r\n\r\n stack.push(noopCollector)\r\n }\r\n\r\n const reportResolutionEnd = (_d: Prism<$IntentionalAny>) => {\r\n stack.pop()\r\n }\r\n\r\n return {\r\n type: 'Dataverse_discoveryMechanism' as 'Dataverse_discoveryMechanism',\r\n startIgnoringDependencies,\r\n stopIgnoringDependencies,\r\n reportResolutionStart,\r\n reportResolutionEnd,\r\n pushCollector,\r\n popCollector,\r\n }\r\n}\r\n\r\nfunction getSharedMechanism(): ReturnType<typeof createMechanism> {\r\n const varName = '__dataverse_discoveryMechanism_sharedStack'\r\n const root =\r\n typeof window !== 'undefined'\r\n ? window\r\n : typeof global !== 'undefined'\r\n ? global\r\n : {}\r\n if (root) {\r\n const existingMechanism: ReturnType<typeof createMechanism> | undefined =\r\n // @ts-ignore ignore\r\n root[varName]\r\n if (\r\n existingMechanism &&\r\n typeof existingMechanism === 'object' &&\r\n existingMechanism.type === 'Dataverse_discoveryMechanism'\r\n ) {\r\n return existingMechanism\r\n } else {\r\n const mechanism = createMechanism()\r\n // @ts-ignore ignore\r\n root[varName] = mechanism\r\n return mechanism\r\n }\r\n } else {\r\n return createMechanism()\r\n }\r\n}\r\n\r\nexport const {\r\n startIgnoringDependencies,\r\n stopIgnoringDependencies,\r\n reportResolutionEnd,\r\n reportResolutionStart,\r\n pushCollector,\r\n popCollector,\r\n} = getSharedMechanism()\r\n", "import type Ticker from '../Ticker'\r\nimport type {$IntentionalAny, VoidFn} from '../types'\r\nimport Stack from '../utils/Stack'\r\nimport type {Prism} from './Interface'\r\nimport {isPrism} from './Interface'\r\nimport {\r\n startIgnoringDependencies,\r\n stopIgnoringDependencies,\r\n pushCollector,\r\n popCollector,\r\n reportResolutionStart,\r\n reportResolutionEnd,\r\n} from './discoveryMechanism'\r\n\r\ntype IDependent = (msgComingFrom: Prism<$IntentionalAny>) => void\r\n\r\nconst voidFn = () => {}\r\n\r\nclass HotHandle<V> {\r\n private _didMarkDependentsAsStale: boolean = false\r\n private _isFresh: boolean = false\r\n protected _cacheOfDendencyValues: Map<Prism<unknown>, unknown> = new Map()\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _dependents: Set<IDependent> = new Set()\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _dependencies: Set<Prism<$IntentionalAny>> = new Set()\r\n\r\n protected _possiblyStaleDeps = new Set<Prism<unknown>>()\r\n\r\n private _scope: HotScope = new HotScope(\r\n this as $IntentionalAny as HotHandle<unknown>,\r\n )\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _lastValue: undefined | V = undefined\r\n\r\n /**\r\n * If true, the prism is stale even though its dependencies aren't\r\n * marked as such. This is used by `prism.source()` and `prism.state()`\r\n * to mark the prism as stale.\r\n */\r\n private _forciblySetToStale: boolean = false\r\n\r\n constructor(\r\n private readonly _fn: () => V,\r\n private readonly _prismInstance: PrismInstance<V>,\r\n ) {\r\n for (const d of this._dependencies) {\r\n d._addDependent(this._reactToDependencyGoingStale)\r\n }\r\n\r\n startIgnoringDependencies()\r\n this.getValue()\r\n stopIgnoringDependencies()\r\n }\r\n\r\n get hasDependents(): boolean {\r\n return this._dependents.size > 0\r\n }\r\n removeDependent(d: IDependent) {\r\n this._dependents.delete(d)\r\n }\r\n addDependent(d: IDependent) {\r\n this._dependents.add(d)\r\n }\r\n\r\n destroy() {\r\n for (const d of this._dependencies) {\r\n d._removeDependent(this._reactToDependencyGoingStale)\r\n }\r\n cleanupScopeStack(this._scope)\r\n }\r\n\r\n getValue(): V {\r\n if (!this._isFresh) {\r\n const newValue = this._recalculate()\r\n this._lastValue = newValue\r\n this._isFresh = true\r\n this._didMarkDependentsAsStale = false\r\n this._forciblySetToStale = false\r\n }\r\n return this._lastValue!\r\n }\r\n\r\n _recalculate() {\r\n let value: V\r\n\r\n if (!this._forciblySetToStale) {\r\n if (this._possiblyStaleDeps.size > 0) {\r\n let anActuallyStaleDepWasFound = false\r\n startIgnoringDependencies()\r\n for (const dep of this._possiblyStaleDeps) {\r\n if (this._cacheOfDendencyValues.get(dep) !== dep.getValue()) {\r\n anActuallyStaleDepWasFound = true\r\n break\r\n }\r\n }\r\n stopIgnoringDependencies()\r\n this._possiblyStaleDeps.clear()\r\n if (!anActuallyStaleDepWasFound) {\r\n return this._lastValue!\r\n }\r\n }\r\n }\r\n\r\n const newDeps: Set<Prism<unknown>> = new Set()\r\n this._cacheOfDendencyValues.clear()\r\n\r\n const collector = (observedDep: Prism<unknown>): void => {\r\n newDeps.add(observedDep)\r\n this._addDependency(observedDep)\r\n }\r\n\r\n pushCollector(collector)\r\n\r\n hookScopeStack.push(this._scope)\r\n try {\r\n value = this._fn()\r\n } catch (error) {\r\n console.error(error)\r\n } finally {\r\n const topOfTheStack = hookScopeStack.pop()\r\n if (topOfTheStack !== this._scope) {\r\n console.warn(\r\n // @todo guide the user to report the bug in an issue\r\n `The Prism hook stack has slipped. This is a bug.`,\r\n )\r\n }\r\n }\r\n\r\n popCollector(collector)\r\n\r\n for (const dep of this._dependencies) {\r\n if (!newDeps.has(dep)) {\r\n this._removeDependency(dep)\r\n }\r\n }\r\n\r\n this._dependencies = newDeps\r\n\r\n startIgnoringDependencies()\r\n for (const dep of newDeps) {\r\n this._cacheOfDendencyValues.set(dep, dep.getValue())\r\n }\r\n stopIgnoringDependencies()\r\n\r\n return value!\r\n }\r\n\r\n forceStale() {\r\n this._forciblySetToStale = true\r\n this._markAsStale()\r\n }\r\n\r\n protected _reactToDependencyGoingStale = (which: Prism<$IntentionalAny>) => {\r\n this._possiblyStaleDeps.add(which)\r\n\r\n this._markAsStale()\r\n }\r\n\r\n private _markAsStale() {\r\n if (this._didMarkDependentsAsStale) return\r\n\r\n this._didMarkDependentsAsStale = true\r\n this._isFresh = false\r\n\r\n for (const dependent of this._dependents) {\r\n dependent(this._prismInstance)\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _addDependency(d: Prism<$IntentionalAny>) {\r\n if (this._dependencies.has(d)) return\r\n this._dependencies.add(d)\r\n d._addDependent(this._reactToDependencyGoingStale)\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _removeDependency(d: Prism<$IntentionalAny>) {\r\n if (!this._dependencies.has(d)) return\r\n this._dependencies.delete(d)\r\n d._removeDependent(this._reactToDependencyGoingStale)\r\n }\r\n}\r\n\r\nconst emptyObject = {}\r\n\r\nclass PrismInstance<V> implements Prism<V> {\r\n /**\r\n * Whether the object is a prism.\r\n */\r\n readonly isPrism: true = true\r\n\r\n private _state:\r\n | {hot: false; handle: undefined}\r\n | {hot: true; handle: HotHandle<V>} = {\r\n hot: false,\r\n handle: undefined,\r\n }\r\n\r\n constructor(private readonly _fn: () => V) {}\r\n\r\n /**\r\n * Whether the prism is hot.\r\n */\r\n get isHot(): boolean {\r\n return this._state.hot\r\n }\r\n\r\n onChange(\r\n ticker: Ticker,\r\n listener: (v: V) => void,\r\n immediate: boolean = false,\r\n ): VoidFn {\r\n // the prism will call this function every time it goes from fresh to stale\r\n const dependent = () => {\r\n // schedule the listener to be called on the next tick, unless\r\n // we're already on a tick, in which case it'll be called on the current tick.\r\n ticker.onThisOrNextTick(refresh)\r\n }\r\n\r\n // let's cache the last value so we don't call the listener if the value hasn't changed\r\n let lastValue: V | typeof emptyObject =\r\n // use an empty object as the initial value so that the listener is called on the first tick.\r\n // if we were to use, say, undefined, and this.getValue() also returned undefined, the listener\r\n // would never be called.\r\n emptyObject\r\n\r\n // this function will be _scheduled_ to be called on the currently running, or next tick,\r\n // after the prism has gone from fresh to stale.\r\n const refresh = () => {\r\n const newValue = this.getValue()\r\n // if the value hasn't changed, don't call the listener\r\n if (newValue === lastValue) return\r\n\r\n // the value has changed - cache it\r\n lastValue = newValue\r\n\r\n // and let the listener know\r\n listener(newValue)\r\n }\r\n\r\n // add the dependent to the prism's list of dependents (which will make it go hot)\r\n this._addDependent(dependent)\r\n\r\n // if the caller wants the listener to be called immediately, call it now\r\n if (immediate) {\r\n lastValue = this.getValue()\r\n listener(lastValue as $IntentionalAny as V)\r\n }\r\n\r\n // the unsubscribe function\r\n const unsubscribe = () => {\r\n // remove the dependent from the prism's list of dependents (and if it was the last dependent, the prism will go cold)\r\n this._removeDependent(dependent)\r\n // in case we're scheduled for a tick, cancel that\r\n ticker.offThisOrNextTick(refresh)\r\n ticker.offNextTick(refresh)\r\n }\r\n\r\n return unsubscribe\r\n }\r\n\r\n /**\r\n * Calls `callback` every time the prism's state goes from `fresh-\\>stale.` Returns an `unsubscribe()` function.\r\n */\r\n onStale(callback: () => void): VoidFn {\r\n const untap = () => {\r\n this._removeDependent(fn)\r\n }\r\n const fn = () => callback()\r\n this._addDependent(fn)\r\n return untap\r\n }\r\n\r\n /**\r\n * Keep the prism hot, even if there are no tappers (subscribers).\r\n */\r\n keepHot() {\r\n return this.onStale(() => {})\r\n }\r\n\r\n /**\r\n * Add a prism as a dependent of this prism.\r\n *\r\n * @param d - The prism to be made a dependent of this prism.\r\n *\r\n * @see _removeDependent\r\n */\r\n _addDependent(d: IDependent) {\r\n if (!this._state.hot) {\r\n this._goHot()\r\n }\r\n this._state.handle!.addDependent(d)\r\n }\r\n\r\n private _goHot() {\r\n const hotHandle = new HotHandle(this._fn, this)\r\n this._state = {\r\n hot: true,\r\n handle: hotHandle,\r\n }\r\n }\r\n\r\n /**\r\n * Remove a prism as a dependent of this prism.\r\n *\r\n * @param d - The prism to be removed from as a dependent of this prism.\r\n *\r\n * @see _addDependent\r\n */\r\n _removeDependent(d: IDependent) {\r\n const state = this._state\r\n if (!state.hot) {\r\n return\r\n }\r\n const handle = state.handle\r\n handle.removeDependent(d)\r\n if (!handle.hasDependents) {\r\n this._state = {hot: false, handle: undefined}\r\n handle.destroy()\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current value of the prism. If the value is stale, it causes the prism to freshen.\r\n */\r\n getValue(): V {\r\n /**\r\n * TODO We should prevent (or warn about) a common mistake users make, which is reading the value of\r\n * a prism in the body of a react component (e.g. `der.getValue()` (often via `val()`) instead of `useVal()`\r\n * or `uesPrism()`).\r\n *\r\n * Although that's the most common example of this mistake, you can also find it outside of react components.\r\n * Basically the user runs `der.getValue()` assuming the read is detected by a wrapping prism when it's not.\r\n *\r\n * Sometiems the prism isn't even hot when the user assumes it is.\r\n *\r\n * We can fix this type of mistake by:\r\n * 1. Warning the user when they call `getValue()` on a cold prism.\r\n * 2. Warning the user about calling `getValue()` on a hot-but-stale prism\r\n * if `getValue()` isn't called by a known mechanism like a `PrismEmitter`.\r\n *\r\n * Design constraints:\r\n * - This fix should not have a perf-penalty in production. Perhaps use a global flag + `process.env.NODE_ENV !== 'production'`\r\n * to enable it.\r\n * - In the case of `onStale()`, we don't control when the user calls\r\n * `getValue()` (as opposed to `onChange()` which calls `getValue()` directly).\r\n * Perhaps we can disable the check in that case.\r\n * - Probably the best place to add this check is right here in this method plus some changes to `reportResulutionStart()`,\r\n * which would have to be changed to let the caller know if there is an actual collector (a prism)\r\n * present in its stack.\r\n */\r\n reportResolutionStart(this)\r\n\r\n const state = this._state\r\n\r\n let val: V\r\n if (state.hot) {\r\n val = state.handle.getValue()\r\n } else {\r\n val = calculateColdPrism(this._fn)\r\n }\r\n\r\n reportResolutionEnd(this)\r\n return val\r\n }\r\n}\r\n\r\ninterface PrismScope {\r\n effect(key: string, cb: () => () => void, deps?: unknown[]): void\r\n memo<T>(\r\n key: string,\r\n fn: () => T,\r\n deps: undefined | $IntentionalAny[] | ReadonlyArray<$IntentionalAny>,\r\n ): T\r\n state<T>(key: string, initialValue: T): [T, (val: T) => void]\r\n ref<T>(key: string, initialValue: T): IRef<T>\r\n sub(key: string): PrismScope\r\n source<V>(subscribe: (fn: (val: V) => void) => VoidFn, getValue: () => V): V\r\n}\r\n\r\nclass HotScope implements PrismScope {\r\n constructor(private readonly _hotHandle: HotHandle<unknown>) {}\r\n\r\n protected readonly _refs: Map<string, IRef<unknown>> = new Map()\r\n ref<T>(key: string, initialValue: T): IRef<T> {\r\n let ref = this._refs.get(key)\r\n if (ref !== undefined) {\r\n return ref as $IntentionalAny as IRef<T>\r\n } else {\r\n const ref = {\r\n current: initialValue,\r\n }\r\n this._refs.set(key, ref)\r\n return ref\r\n }\r\n }\r\n isPrismScope = true\r\n\r\n // NOTE probably not a great idea to eager-allocate all of these objects/maps for every scope,\r\n // especially because most wouldn't get used in the majority of cases. However, back when these\r\n // were stored on weakmaps, they were uncomfortable to inspect in the debugger.\r\n readonly subs: Record<string, HotScope> = {}\r\n readonly effects: Map<string, IEffect> = new Map()\r\n\r\n effect(key: string, cb: () => () => void, deps?: unknown[]): void {\r\n let effect = this.effects.get(key)\r\n if (effect === undefined) {\r\n effect = {\r\n cleanup: voidFn,\r\n deps: undefined,\r\n }\r\n this.effects.set(key, effect)\r\n }\r\n\r\n if (depsHaveChanged(effect.deps, deps)) {\r\n effect.cleanup()\r\n\r\n startIgnoringDependencies()\r\n effect.cleanup = safelyRun(cb, voidFn).value\r\n stopIgnoringDependencies()\r\n effect.deps = deps\r\n }\r\n /**\r\n * TODO: we should cleanup dangling effects too.\r\n * Example:\r\n * ```ts\r\n * let i = 0\r\n * prism(() => {\r\n * if (i === 0) prism.effect(\"this effect will only run once\", () => {}, [])\r\n * i++\r\n * })\r\n * ```\r\n */\r\n }\r\n\r\n readonly memos: Map<string, IMemo> = new Map()\r\n\r\n memo<T>(\r\n key: string,\r\n fn: () => T,\r\n deps: undefined | $IntentionalAny[] | ReadonlyArray<$IntentionalAny>,\r\n ): T {\r\n let memo = this.memos.get(key)\r\n if (memo === undefined) {\r\n memo = {\r\n cachedValue: null,\r\n // undefined will always indicate \"deps have changed\", so we set its initial value as such\r\n deps: undefined,\r\n }\r\n this.memos.set(key, memo)\r\n }\r\n\r\n if (depsHaveChanged(memo.deps, deps)) {\r\n startIgnoringDependencies()\r\n\r\n memo.cachedValue = safelyRun(fn, undefined).value\r\n stopIgnoringDependencies()\r\n memo.deps = deps\r\n }\r\n\r\n return memo.cachedValue as $IntentionalAny as T\r\n }\r\n\r\n state<T>(key: string, initialValue: T): [T, (val: T) => void] {\r\n const {value, setValue} = this.memo(\r\n 'state/' + key,\r\n () => {\r\n const value = {current: initialValue}\r\n const setValue = (newValue: T) => {\r\n value.current = newValue\r\n this._hotHandle.forceStale()\r\n }\r\n return {value, setValue}\r\n },\r\n [],\r\n )\r\n\r\n return [value.current, setValue]\r\n }\r\n\r\n sub(key: string): HotScope {\r\n if (!this.subs[key]) {\r\n this.subs[key] = new HotScope(this._hotHandle)\r\n }\r\n return this.subs[key]\r\n }\r\n\r\n cleanupEffects() {\r\n for (const effect of this.effects.values()) {\r\n safelyRun(effect.cleanup, undefined)\r\n }\r\n this.effects.clear()\r\n }\r\n\r\n source<V>(subscribe: (fn: (val: V) => void) => VoidFn, getValue: () => V): V {\r\n const sourceKey = '$$source/blah'\r\n this.effect(\r\n sourceKey,\r\n () => {\r\n const unsub = subscribe(() => {\r\n this._hotHandle.forceStale()\r\n })\r\n return unsub\r\n },\r\n [subscribe],\r\n )\r\n return getValue()\r\n }\r\n}\r\n\r\nfunction cleanupScopeStack(scope: HotScope) {\r\n for (const sub of Object.values(scope.subs)) {\r\n cleanupScopeStack(sub)\r\n }\r\n scope.cleanupEffects()\r\n}\r\n\r\nfunction safelyRun<T, U>(\r\n fn: () => T,\r\n returnValueInCaseOfError: U,\r\n): {ok: true; value: T} | {ok: false; value: U} {\r\n try {\r\n return {value: fn(), ok: true}\r\n } catch (error) {\r\n // Naming this function can allow the error reporter additional context to the user on where this error came from\r\n setTimeout(function PrismReportThrow() {\r\n // ensure that the error gets reported, but does not crash the current execution scope\r\n throw error\r\n })\r\n return {value: returnValueInCaseOfError, ok: false}\r\n }\r\n}\r\n\r\nconst hookScopeStack = new Stack<PrismScope>()\r\n\r\ntype IRef<T> = {\r\n current: T\r\n}\r\n\r\ntype IEffect = {\r\n deps: undefined | unknown[]\r\n cleanup: VoidFn\r\n}\r\n\r\ntype IMemo = {\r\n deps: undefined | unknown[] | ReadonlyArray<unknown>\r\n cachedValue: unknown\r\n}\r\n\r\n/**\r\n * Just like React's `useRef()`, `prism.ref()` allows us to create a prism that holds a reference to some value.\r\n * The only difference is that `prism.ref()` requires a key to be passed into it, whlie `useRef()` doesn't.\r\n * This means that we can call `prism.ref()` in any order, and we can call it multiple times with the same key.\r\n * @param key - The key for the ref. Should be unique inside of the prism.\r\n * @param initialValue - The initial value for the ref.\r\n * @returns `{current: V}` - The ref object.\r\n *\r\n * Note that the ref object will always return its initial value if the prism is cold. It'll only record\r\n * its current value if the prism is hot (and will forget again if the prism goes cold again).\r\n *\r\n * @example\r\n * ```ts\r\n * const pr = prism(() => {\r\n * const ref1 = prism.ref(\"ref1\", 0)\r\n * console.log(ref1.current) // will print 0, and if the prism is hot, it'll print the current value\r\n * ref1.current++ // changing the current value of the ref\r\n * })\r\n * ```\r\n */\r\nfunction ref<T>(key: string, initialValue: T): IRef<T> {\r\n const scope = hookScopeStack.peek()\r\n if (!scope) {\r\n throw new Error(`prism.ref() is called outside of a prism() call.`)\r\n }\r\n\r\n return scope.ref(key, initialValue)\r\n}\r\n\r\n/**\r\n * An effect hook, similar to React's `useEffect()`, but is not sensitive to call order by using `key`.\r\n *\r\n * @param key - the key for the effect. Should be uniqe inside of the prism.\r\n * @param cb - the callback function. Requires returning a cleanup function.\r\n * @param deps - the dependency array\r\n */\r\nfunction effect(key: string, cb: () => () => void, deps?: unknown[]): void {\r\n const scope = hookScopeStack.peek()\r\n if (!scope) {\r\n throw new Error(`prism.effect() is called outside of a prism() call.`)\r\n }\r\n\r\n return scope.effect(key, cb, deps)\r\n}\r\n\r\nfunction depsHaveChanged(\r\n oldDeps: undefined | unknown[] | ReadonlyArray<unknown>,\r\n newDeps: undefined | unknown[] | ReadonlyArray<unknown>,\r\n): boolean {\r\n if (oldDeps === undefined || newDeps === undefined) {\r\n return true\r\n }\r\n\r\n const len = oldDeps.length\r\n if (len !== newDeps.length) return true\r\n\r\n for (let i = 0; i < len; i++) {\r\n if (oldDeps[i] !== newDeps[i]) return true\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * `prism.memo()` works just like React's `useMemo()` hook. It's a way to cache the result of a function call.\r\n * The only difference is that `prism.memo()` requires a key to be passed into it, whlie `useMemo()` doesn't.\r\n * This means that we can call `prism.memo()` in any order, and we can call it multiple times with the same key.\r\n *\r\n * @param key - The key for the memo. Should be unique inside of the prism\r\n * @param fn - The function to memoize\r\n * @param deps - The dependency array. Provide `[]` if you want to the value to be memoized only once and never re-calculated.\r\n * @returns The result of the function call\r\n *\r\n * @example\r\n * ```ts\r\n * const pr = prism(() => {\r\n * const memoizedReturnValueOfExpensiveFn = prism.memo(\"memo1\", expensiveFn, [])\r\n * })\r\n * ```\r\n */\r\nfunction memo<T>(\r\n key: string,\r\n fn: () => T,\r\n deps: undefined | $IntentionalAny[] | ReadonlyArray<$IntentionalAny>,\r\n): T {\r\n const scope = hookScopeStack.peek()\r\n if (!scope) {\r\n throw new Error(`prism.memo() is called outside of a prism() call.`)\r\n }\r\n\r\n return scope.memo(key, fn, deps)\r\n}\r\n\r\n/**\r\n * A state hook, similar to react's `useState()`.\r\n *\r\n * @param key - the key for the state\r\n * @param initialValue - the initial value\r\n * @returns [currentState, setState]\r\n *\r\n * @example\r\n * ```ts\r\n * import {prism} from 'dataverse'\r\n *\r\n * // This prism holds the current mouse position and updates when the mouse moves\r\n * const mousePositionD = prism(() => {\r\n * const [pos, setPos] = prism.state<[x: number, y: number]>('pos', [0, 0])\r\n *\r\n * prism.effect(\r\n * 'setupListeners',\r\n * () => {\r\n * const handleMouseMove = (e: MouseEvent) => {\r\n * setPos([e.screenX, e.screenY])\r\n * }\r\n * document.addEventListener('mousemove', handleMouseMove)\r\n *\r\n * return () => {\r\n * document.removeEventListener('mousemove', handleMouseMove)\r\n * }\r\n * },\r\n * [],\r\n * )\r\n *\r\n * return pos\r\n * })\r\n * ```\r\n */\r\nfunction state<T>(key: string, initialValue: T): [T, (val: T) => void] {\r\n const scope = hookScopeStack.peek()\r\n if (!scope) {\r\n throw new Error(`prism.state() is called outside of a prism() call.`)\r\n }\r\n\r\n return scope.state(key, initialValue)\r\n}\r\n\r\n/**\r\n * This is useful to make sure your code is running inside a `prism()` call.\r\n *\r\n * @example\r\n * ```ts\r\n * import {prism} from '@tomorrowevening/theatre-dataverse'\r\n *\r\n * function onlyUsefulInAPrism() {\r\n * prism.ensurePrism()\r\n * }\r\n *\r\n * prism(() => {\r\n * onlyUsefulInAPrism() // will run fine\r\n * })\r\n *\r\n * setTimeout(() => {\r\n * onlyUsefulInAPrism() // throws an error\r\n * console.log('This will never get logged')\r\n * }, 0)\r\n * ```\r\n */\r\nfunction ensurePrism(): void {\r\n const scope = hookScopeStack.peek()\r\n if (!scope) {\r\n throw new Error(`The parent function is called outside of a prism() call.`)\r\n }\r\n}\r\n\r\nfunction scope<T>(key: string, fn: () => T): T {\r\n const parentScope = hookScopeStack.peek()\r\n if (!parentScope) {\r\n throw new Error(`prism.scope() is called outside of a prism() call.`)\r\n }\r\n const subScope = parentScope.sub(key)\r\n hookScopeStack.push(subScope)\r\n const ret = safelyRun(fn, undefined).value\r\n hookScopeStack.pop()\r\n return ret as $IntentionalAny as T\r\n}\r\n\r\n/**\r\n * Just an alias for `prism.memo(key, () => prism(fn), deps).getValue()`. It creates a new prism, memoizes it, and returns the value.\r\n * `prism.sub()` is useful when you want to divide your prism into smaller prisms, each of which\r\n * would _only_ recalculate when _certain_ dependencies change. In other words, it's an optimization tool.\r\n *\r\n * @param key - The key for the memo. Should be unique inside of the prism\r\n * @param fn - The function to run inside the prism\r\n * @param deps - The dependency array. Provide `[]` if you want to the value to be memoized only once and never re-calculated.\r\n * @returns The value of the inner prism\r\n */\r\nfunction sub<T>(\r\n key: string,\r\n fn: () => T,\r\n deps: undefined | $IntentionalAny[],\r\n): T {\r\n return memo(key, () => prism(fn), deps).getValue()\r\n}\r\n\r\n/**\r\n * @returns true if the current function is running inside a `prism()` call.\r\n */\r\nfunction inPrism(): boolean {\r\n return !!hookScopeStack.peek()\r\n}\r\n\r\nconst possiblePrismToValue = <P extends Prism<$IntentionalAny> | unknown>(\r\n input: P,\r\n): P extends Prism<infer T> ? T : P => {\r\n if (isPrism(input)) {\r\n return input.getValue() as $IntentionalAny\r\n } else {\r\n return input as $IntentionalAny\r\n }\r\n}\r\n\r\n/**\r\n * `prism.source()` allow a prism to react to changes in some external source (other than other prisms).\r\n * For example, `Atom.pointerToPrism()` uses `prism.source()` to create a prism that reacts to changes in the atom's value.\r\n \r\n * @param subscribe - The prism will call this function as soon as the prism goes hot. This function should return an unsubscribe function function which the prism will call when it goes cold.\r\n * @param getValue - A function that returns the current value of the external source.\r\n * @returns The current value of the source\r\n * \r\n * Example:\r\n * ```ts\r\n * function prismFromInputElement(input: HTMLInputElement): Prism<string> {\r\n * function listen(cb: (value: string) => void) {\r\n * const listener = () => {\r\n * cb(input.value)\r\n * }\r\n * input.addEventListener('input', listener)\r\n * return () => {\r\n * input.removeEventListener('input', listener)\r\n * }\r\n * }\r\n * \r\n * function get() {\r\n * return input.value\r\n * }\r\n * return prism(() => prism.source(listen, get))\r\n * }\r\n * ```\r\n */\r\nfunction source<V>(\r\n subscribe: (fn: (val: V) => void) => VoidFn,\r\n getValue: () => V,\r\n): V {\r\n const scope = hookScopeStack.peek()\r\n if (!scope) {\r\n throw new Error(`prism.source() is called outside of a prism() call.`)\r\n }\r\n\r\n return scope.source(subscribe, getValue)\r\n}\r\n\r\ntype IPrismFn = {\r\n <T>(fn: () => T): Prism<T>\r\n ref: typeof ref\r\n effect: typeof effect\r\n memo: typeof memo\r\n ensurePrism: typeof ensurePrism\r\n state: typeof state\r\n scope: typeof scope\r\n sub: typeof sub\r\n inPrism: typeof inPrism\r\n source: typeof source\r\n}\r\n\r\n/**\r\n * Creates a prism from the passed function that adds all prisms referenced\r\n * in it as dependencies, and reruns the function when these change.\r\n *\r\n * @param fn - The function to rerun when the prisms referenced in it change.\r\n */\r\nconst prism: IPrismFn = (fn) => {\r\n return new PrismInstance(fn)\r\n}\r\n\r\nclass ColdScope implements PrismScope {\r\n effect(key: string, cb: () => () => void, deps?: unknown[]): void {\r\n console.warn(`prism.effect() does not run in cold prisms`)\r\n }\r\n memo<T>(\r\n key: string,\r\n fn: () => T,\r\n deps: any[] | readonly any[] | undefined,\r\n ): T {\r\n return fn()\r\n }\r\n state<T>(key: string, initialValue: T): [T, (val: T) => void] {\r\n return [initialValue, () => {}]\r\n }\r\n ref<T>(key: string, initialValue: T): IRef<T> {\r\n return {current: initialValue}\r\n }\r\n sub(key: string): ColdScope {\r\n return new ColdScope()\r\n }\r\n source<V>(subscribe: (fn: (val: V) => void) => VoidFn, getValue: () => V): V {\r\n return getValue()\r\n }\r\n}\r\n\r\nfunction calculateColdPrism<V>(fn: () => V): V {\r\n const scope = new ColdScope()\r\n hookScopeStack.push(scope)\r\n let value: V\r\n try {\r\n value = fn()\r\n } catch (error) {\r\n console.error(error)\r\n } finally {\r\n const topOfTheStack = hookScopeStack.pop()\r\n if (topOfTheStack !== scope) {\r\n console.warn(\r\n // @todo guide the user to report the bug in an issue\r\n `The Prism hook stack has slipped. This is a bug.`,\r\n )\r\n }\r\n }\r\n return value!\r\n}\r\n\r\nprism.ref = ref\r\nprism.effect = effect\r\nprism.memo = memo\r\nprism.ensurePrism = ensurePrism\r\nprism.state = state\r\nprism.scope = scope\r\nprism.sub = sub\r\nprism.inPrism = inPrism\r\nprism.source = source\r\n\r\nexport default prism\r\n", "import get from 'lodash-es/get'\r\nimport isPlainObject from 'lodash-es/isPlainObject'\r\nimport last from 'lodash-es/last'\r\nimport type {Prism} from './prism/Interface'\r\nimport type {Pointer} from './pointer'\r\nimport {getPointerParts} from './pointer'\r\nimport {isPointer} from './pointer'\r\nimport pointer from './pointer'\r\nimport type {$FixMe, $IntentionalAny} from './types'\r\nimport updateDeep from './utils/updateDeep'\r\nimport prism from './prism/prism'\r\nimport type {PointerToPrismProvider} from './pointerToPrism'\r\n\r\ntype Listener = (newVal: unknown) => void\r\n\r\nenum ValueTypes {\r\n Dict,\r\n Array,\r\n Other,\r\n}\r\n\r\nconst getTypeOfValue = (v: unknown): ValueTypes => {\r\n if (Array.isArray(v)) return ValueTypes.Array\r\n if (isPlainObject(v)) return ValueTypes.Dict\r\n return ValueTypes.Other\r\n}\r\n\r\nconst getKeyOfValue = (\r\n v: unknown,\r\n key: string | number,\r\n vType: ValueTypes = getTypeOfValue(v),\r\n): unknown => {\r\n if (vType === ValueTypes.Dict && typeof key === 'string') {\r\n return (v as $IntentionalAny)[key]\r\n } else if (vType === ValueTypes.Array && isValidArrayIndex(key)) {\r\n return (v as $IntentionalAny)[key]\r\n } else {\r\n return undefined\r\n }\r\n}\r\n\r\nconst isValidArrayIndex = (key: string | number): boolean => {\r\n const inNumber = typeof key === 'number' ? key : parseInt(key, 10)\r\n return (\r\n !isNaN(inNumber) &&\r\n inNumber >= 0 &&\r\n inNumber < Infinity &&\r\n (inNumber | 0) === inNumber\r\n )\r\n}\r\n\r\nclass Scope {\r\n children: Map<string | number, Scope> = new Map()\r\n identityChangeListeners: Set<Listener> = new Set()\r\n constructor(\r\n readonly _parent: undefined | Scope,\r\n readonly _path: (string | number)[],\r\n ) {}\r\n\r\n addIdentityChangeListener(cb: Listener) {\r\n this.identityChangeListeners.add(cb)\r\n }\r\n\r\n removeIdentityChangeListener(cb: Listener) {\r\n this.identityChangeListeners.delete(cb)\r\n this._checkForGC()\r\n }\r\n\r\n removeChild(key: string | number) {\r\n this.children.delete(key)\r\n this._checkForGC()\r\n }\r\n\r\n getChild(key: string | number) {\r\n return this.children.get(key)\r\n }\r\n\r\n getOrCreateChild(key: string | number) {\r\n let child = this.children.get(key)\r\n if (!child) {\r\n child = child = new Scope(this, this._path.concat([key]))\r\n this.children.set(key, child)\r\n }\r\n return child\r\n }\r\n\r\n _checkForGC() {\r\n if (this.identityChangeListeners.size > 0) return\r\n if (this.children.size > 0) return\r\n\r\n if (this._parent) {\r\n this._parent.removeChild(last(this._path) as string | number)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Wraps an object whose (sub)properties can be individually tracked.\r\n */\r\nexport default class Atom<State> implements PointerToPrismProvider {\r\n private _currentState: State\r\n /**\r\n * @internal\r\n */\r\n readonly $$isPointerToPrismProvider = true\r\n private readonly _rootScope: Scope\r\n /**\r\n * Convenience property that gives you a pointer to the root of the atom.\r\n *\r\n * @remarks\r\n * Equivalent to `pointer({ root: thisAtom, path: [] })`.\r\n */\r\n readonly pointer: Pointer<State> = pointer({root: this as $FixMe, path: []})\r\n\r\n readonly prism: Prism<State> = this.pointerToPrism(\r\n this.pointer,\r\n ) as $IntentionalAny\r\n\r\n constructor(initialState: State) {\r\n this._currentState = initialState\r\n this._rootScope = new Scope(undefined, [])\r\n }\r\n\r\n /**\r\n * Sets the state of the atom.\r\n *\r\n * @param newState - The new state of the atom.\r\n */\r\n set(newState: State) {\r\n const oldState = this._currentState\r\n this._currentState = newState\r\n\r\n this._checkUpdates(this._rootScope, oldState, newState)\r\n }\r\n\r\n get(): State {\r\n return this._currentState\r\n }\r\n\r\n /**\r\n * Returns the value at the given pointer\r\n *\r\n * @param pointerOrFn - A pointer to the desired path. Could also be a function returning a pointer\r\n *\r\n * Example\r\n * ```ts\r\n * const atom = atom({ a: { b: 1 } })\r\n * atom.getByPointer(atom.pointer.a.b) // 1\r\n * atom.getByPointer((p) => p.a.b) // 1\r\n * ```\r\n */\r\n getByPointer<S>(\r\n pointerOrFn: Pointer<S> | ((p: Pointer<State>) => Pointer<S>),\r\n ): S {\r\n const pointer = isPointer(pointerOrFn)\r\n ? pointerOrFn\r\n : (pointerOrFn as $IntentionalAny)(this.pointer)\r\n\r\n const path = getPointerParts(pointer).path\r\n return this._getIn(path) as S\r\n }\r\n\r\n /**\r\n * Gets the state of the atom at `path`.\r\n */\r\n private _getIn(path: (string | number)[]): unknown {\r\n return path.length === 0 ? this.get() : get(this.get(), path)\r\n }\r\n\r\n reduce(fn: (state: State) => State) {\r\n this.set(fn(this.get()))\r\n }\r\n\r\n /**\r\n * Reduces the value at the given pointer\r\n *\r\n * @param pointerOrFn - A pointer to the desired path. Could also be a function returning a pointer\r\n *\r\n * Example\r\n * ```ts\r\n * const atom = atom({ a: { b: 1 } })\r\n * atom.reduceByPointer(atom.pointer.a.b, (b) => b + 1) // atom.get().a.b === 2\r\n * atom.reduceByPointer((p) => p.a.b, (b) => b + 1) // atom.get().a.b === 2\r\n * ```\r\n */\r\n reduceByPointer<S>(\r\n pointerOrFn: Pointer<S> | ((p: Pointer<State>) => Pointer<S>),\r\n reducer: (s: S) => S,\r\n ) {\r\n const pointer = isPointer(pointerOrFn)\r\n ? pointerOrFn\r\n : (pointerOrFn as $IntentionalAny)(this.pointer)\r\n\r\n const path = getPointerParts(pointer).path\r\n const newState = updateDeep(this.get(), path, reducer)\r\n this.set(newState)\r\n }\r\n\r\n /**\r\n * Sets the value at the given pointer\r\n *\r\n * @param pointerOrFn - A pointer to the desired path. Could also be a function returning a pointer\r\n *\r\n * Example\r\n * ```ts\r\n * const atom = atom({ a: { b: 1 } })\r\n * atom.setByPointer(atom.pointer.a.b, 2) // atom.get().a.b === 2\r\n * atom.setByPointer((p) => p.a.b, 2) // atom.get().a.b === 2\r\n * ```\r\n */\r\n setByPointer<S>(\r\n pointerOrFn: Pointer<S> | ((p: Pointer<State>) => Pointer<S>),\r\n val: S,\r\n ) {\r\n this.reduceByPointer(pointerOrFn, () => val)\r\n }\r\n\r\n private _checkUpdates(scope: Scope, oldState: unknown, newState: unknown) {\r\n if (oldState === newState) return\r\n for (const cb of scope.identityChangeListeners) {\r\n cb(newState)\r\n }\r\n\r\n if (scope.children.size === 0) return\r\n\r\n // @todo we can probably skip checking value types\r\n const oldValueType = getTypeOfValue(oldState)\r\n const newValueType = getTypeOfValue(newState)\r\n\r\n if (oldValueType === ValueTypes.Other && oldValueType === newValueType)\r\n return\r\n\r\n for (const [childKey, childScope] of scope.children) {\r\n const oldChildVal = getKeyOfValue(oldState, childKey, oldValueType)\r\n const newChildVal = getKeyOfValue(newState, childKey, newValueType)\r\n this._checkUpdates(childScope, oldChildVal, newChildVal)\r\n }\r\n }\r\n\r\n private _getOrCreateScopeForPath(path: (string | number)[]): Scope {\r\n let curScope = this._rootScope\r\n for (const pathEl of path) {\r\n curScope = curScope.getOrCreateChild(pathEl)\r\n }\r\n return curScope\r\n }\r\n\r\n private _onPointerValueChange = <P>(\r\n pointer: Pointer<P>,\r\n cb: (v: P) => void,\r\n ): (() => void) => {\r\n const {path} = getPointerParts(pointer)\r\n const scope = this._getOrCreateScopeForPath(path)\r\n scope.identityChangeListeners.add(cb as $IntentionalAny)\r\n const unsubscribe = () => {\r\n scope.identityChangeListeners.delete(cb as $IntentionalAny)\r\n }\r\n return unsubscribe\r\n }\r\n\r\n /**\r\n * Returns a new prism of the value at the provided path.\r\n *\r\n * @param pointer - The path to create the prism at.\r\n *\r\n * ```ts\r\n * const pr = atom({ a: { b: 1 } }).pointerToPrism(atom.pointer.a.b)\r\n * pr.getValue() // 1\r\n * ```\r\n */\r\n pointerToPrism<P>(pointer: Pointer<P>): Prism<P> {\r\n const {path} = getPointerParts(pointer)\r\n const subscribe = (listener: (val: unknown) => void) =>\r\n this._onPointerValueChange(pointer, listener)\r\n\r\n const getValue = () => this._getIn(path)\r\n\r\n return prism(() => {\r\n return prism.source(subscribe, getValue)\r\n }) as Prism<P>\r\n }\r\n}\r\n", "import type {Prism} from './prism/Interface'\r\nimport type {Pointer, PointerType} from './pointer'\r\nimport {getPointerMeta} from './pointer'\r\nimport type {$IntentionalAny} from './types'\r\n\r\nconst identifyPrismWeakMap = new WeakMap<{}, Prism<unknown>>()\r\n\r\n/**\r\n * Interface for objects that can provide a prism at a certain path.\r\n */\r\nexport interface PointerToPrismProvider {\r\n /**\r\n * @internal\r\n * Future: We could consider using a `Symbol.for(\"dataverse/PointerToPrismProvider\")` as a key here, similar to\r\n * how {@link Iterable} works for `of`.\r\n */\r\n readonly $$isPointerToPrismProvider: true\r\n /**\r\n * Returns a prism of the value at the provided pointer.\r\n */\r\n pointerToPrism<P>(pointer: Pointer<P>): Prism<P>\r\n}\r\n\r\nexport function isPointerToPrismProvider(\r\n val: unknown,\r\n): val is PointerToPrismProvider {\r\n return (\r\n typeof val === 'object' &&\r\n val !== null &&\r\n (val as $IntentionalAny)['$$isPointerToPrismProvider'] === true\r\n )\r\n}\r\n\r\n/**\r\n * Returns a prism of the value at the provided pointer. Prisms are\r\n * cached per pointer.\r\n *\r\n * @param pointer - The pointer to return the prism at.\r\n */\r\n\r\nexport const pointerToPrism = <P extends PointerType<$IntentionalAny>>(\r\n pointer: P,\r\n): Prism<P extends PointerType<infer T> ? T : void> => {\r\n const meta = getPointerMeta(pointer)\r\n\r\n let prismInstance = identifyPrismWeakMap.get(meta)\r\n if (!prismInstance) {\r\n const root = meta.root\r\n if (!isPointerToPrismProvider(root)) {\r\n throw new Error(\r\n `Cannot run pointerToPrism() on a pointer whose root is not an PointerToPrismProvider`,\r\n )\r\n }\r\n prismInstance = root.pointerToPrism(pointer as $IntentionalAny)\r\n identifyPrismWeakMap.set(meta, prismInstance)\r\n }\r\n return prismInstance as $IntentionalAny\r\n}\r\n", "type ICallback = (t: number) => void\r\n\r\n/**\r\n * The number of ticks that can pass without any scheduled callbacks before the Ticker goes dormant. This is to prevent\r\n * the Ticker from staying active forever, even if there are no scheduled callbacks.\r\n *\r\n * Perhaps counting ticks vs. time is not the best way to do this. But it's a start.\r\n */\r\nexport const EMPTY_TICKS_BEFORE_GOING_DORMANT = 60 /*fps*/ * 3 /*seconds*/ // on a 60fps screen, 3 seconds should pass before the ticker goes dormant\r\n\r\n/**\r\n * The Ticker class helps schedule callbacks. Scheduled callbacks are executed per tick. Ticks can be triggered by an\r\n * external scheduling strategy, e.g. a raf.\r\n */\r\nexport default class Ticker {\r\n private _scheduledForThisOrNextTick: Set<ICallback>\r\n private _scheduledForNextTick: Set<ICallback>\r\n private _timeAtCurrentTick: number\r\n private _ticking: boolean = false\r\n\r\n /**\r\n * Whether the Ticker is dormant\r\n */\r\n private _dormant: boolean = true\r\n\r\n private _numberOfDormantTicks = 0\r\n\r\n /**\r\n * Whether the Ticker is dormant\r\n */\r\n get dormant(): boolean {\r\n return this._dormant\r\n }\r\n /**\r\n * Counts up for every tick executed.\r\n * Internally, this is used to measure ticks per second.\r\n *\r\n * This is \"public\" to TypeScript, because it's a tool for performance measurements.\r\n * Consider this as experimental, and do not rely on it always being here in future releases.\r\n */\r\n public __ticks = 0\r\n\r\n constructor(\r\n private _conf?: {\r\n /**\r\n * This is called when the Ticker goes dormant.\r\n */\r\n onDormant?: () => void\r\n /**\r\n * This is called when the Ticker goes active.\r\n */\r\n onActive?: () => void\r\n },\r\n ) {\r\n this._scheduledForThisOrNextTick = new Set()\r\n this._scheduledForNextTick = new Set()\r\n this._timeAtCurrentTick = 0\r\n }\r\n\r\n /**\r\n * Registers for fn to be called either on this tick or the next tick.\r\n *\r\n * If `onThisOrNextTick()` is called while `Ticker.tick()` is running, the\r\n * side effect _will_ be called within the running tick. If you don't want this\r\n * behavior, you can use `onNextTick()`.\r\n *\r\n * Note that `fn` will be added to a `Set()`. Which means, if you call `onThisOrNextTick(fn)`\r\n * with the same fn twice in a single tick, it'll only run once.\r\n *\r\n * @param fn - The function to be registered.\r\n *\r\n * @see offThisOrNextTick\r\n */\r\n onThisOrNextTick(fn: ICallback) {\r\n this._scheduledForThisOrNextTick.add(fn)\r\n if (this._dormant) {\r\n this._goActive()\r\n }\r\n }\r\n\r\n /**\r\n * Registers a side effect to be called on the next tick.\r\n *\r\n * @param fn - The function to be registered.\r\n *\r\n * @see onThisOrNextTick\r\n * @see offNextTick\r\n */\r\n onNextTick(fn: ICallback) {\r\n this._scheduledForNextTick.add(fn)\r\n if (this._dormant) {\r\n this._goActive()\r\n }\r\n }\r\n\r\n /**\r\n * De-registers a fn to be called either on this tick or the next tick.\r\n *\r\n * @param fn - The function to be de-registered.\r\n *\r\n * @see onThisOrNextTick\r\n */\r\n offThisOrNextTick(fn: ICallback) {\r\n this._scheduledForThisOrNextTick.delete(fn)\r\n }\r\n\r\n /**\r\n * De-registers a fn to be called on the next tick.\r\n *\r\n * @param fn - The function to be de-registered.\r\n *\r\n * @see onNextTick\r\n */\r\n offNextTick(fn: ICallback) {\r\n this._scheduledForNextTick.delete(fn)\r\n }\r\n\r\n /**\r\n * The time at the start of the current tick if there is a tick in progress, otherwise defaults to\r\n * `performance.now()`.\r\n */\r\n get time() {\r\n if (this._ticking) {\r\n return this._timeAtCurrentTick\r\n } else return performance.now()\r\n }\r\n\r\n private _goActive() {\r\n if (!this._dormant) return\r\n this._dormant = false\r\n this._conf?.onActive?.()\r\n }\r\n\r\n private _goDormant() {\r\n if (this._dormant) return\r\n this._dormant = true\r\n this._numberOfDormantTicks = 0\r\n this._conf?.onDormant?.()\r\n }\r\n\r\n /**\r\n * Triggers a tick which starts executing the callbacks scheduled for this tick.\r\n *\r\n * @param t - The time at the tick.\r\n *\r\n * @see onThisOrNextTick\r\n * @see onNextTick\r\n */\r\n tick(t: number = performance.now()) {\r\n if (process.env.NODE_ENV === 'development') {\r\n if (!(this instanceof Ticker)) {\r\n throw new Error(\r\n 'ticker.tick must be called while bound to the ticker. As in, \"ticker.tick(time)\" or \"requestAnimationFrame((t) => ticker.tick(t))\" for performance.',\r\n )\r\n }\r\n }\r\n\r\n this.__ticks++\r\n\r\n if (!this._dormant) {\r\n if (\r\n this._scheduledForNextTick.size === 0 &&\r\n this._scheduledForThisOrNextTick.size === 0\r\n ) {\r\n this._numberOfDormantTicks++\r\n if (this._numberOfDormantTicks >= EMPTY_TICKS_BEFORE_GOING_DORMANT) {\r\n this._goDormant()\r\n return\r\n }\r\n }\r\n }\r\n\r\n this._ticking = true\r\n this._timeAtCurrentTick = t\r\n for (const v of this._scheduledForNextTick) {\r\n this._scheduledForThisOrNextTick.add(v)\r\n }\r\n\r\n this._scheduledForNextTick.clear()\r\n this._tick(0)\r\n this._ticking = false\r\n }\r\n\r\n private _tick(iterationNumber: number): void {\r\n const time = this.time\r\n\r\n if (iterationNumber > 10) {\r\n console.warn('_tick() recursing for 10 times')\r\n }\r\n\r\n if (iterationNumber > 100) {\r\n throw new Error(`Maximum recursion limit for _tick()`)\r\n }\r\n\r\n const oldSet = this._scheduledForThisOrNextTick\r\n this._scheduledForThisOrNextTick = new Set()\r\n for (const fn of oldSet) {\r\n fn(time)\r\n }\r\n\r\n if (this._scheduledForThisOrNextTick.size > 0) {\r\n return this._tick(iterationNumber + 1)\r\n }\r\n }\r\n}\r\n", "import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n", "/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n", "/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n", "/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n", "import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n", "import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n", "/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nexport default setCacheAdd;\n", "/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nexport default setCacheHas;\n", "import MapCache from './_MapCache.js';\nimport setCacheAdd from './_setCacheAdd.js';\nimport setCacheHas from './_setCacheHas.js';\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nexport default SetCache;\n", "/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nexport default arraySome;\n", "/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nexport default cacheHas;\n", "import SetCache from './_SetCache.js';\nimport arraySome from './_arraySome.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nexport default equalArrays;\n", "import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n", "/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nexport default mapToArray;\n", "/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nexport default setToArray;\n", "import Symbol from './_Symbol.js';\nimport Uint8Array from './_Uint8Array.js';\nimport eq from './eq.js';\nimport equalArrays from './_equalArrays.js';\nimport mapToArray from './_mapToArray.js';\nimport setToArray from './_setToArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nexport default equalByTag;\n", "/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nexport default arrayPush;\n", "import arrayPush from './_arrayPush.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nexport default baseGetAllKeys;\n", "/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nexport default arrayFilter;\n", "/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nexport default stubArray;\n", "import arrayFilter from './_arrayFilter.js';\nimport stubArray from './stubArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nexport default getSymbols;\n", "/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n", "import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n", "import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n", "/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n", "import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n", "/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n", "/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n", "import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n", "/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n", "import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n", "import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n", "import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n", "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n", "import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n", "import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeys;\n", "import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n", "import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeys from './_baseKeys.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nexport default keys;\n", "import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbols from './_getSymbols.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nexport default getAllKeys;\n", "import getAllKeys from './_getAllKeys.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nexport default equalObjects;\n", "import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n", "import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n", "import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n", "import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n", "import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nexport default getTag;\n", "import Stack from './_Stack.js';\nimport equalArrays from './_equalArrays.js';\nimport equalByTag from './_equalByTag.js';\nimport equalObjects from './_equalObjects.js';\nimport getTag from './_getTag.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nexport default baseIsEqualDeep;\n", "import baseIsEqualDeep from './_baseIsEqualDeep.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nexport default baseIsEqual;\n", "import baseIsEqual from './_baseIsEqual.js';\n\n/**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\nfunction isEqualWith(value, other, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n}\n\nexport default isEqualWith;\n", "import baseIsEqual from './_baseIsEqual.js';\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\nexport default isEqual;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// This file is read by tools that parse documentation comments conforming to the TSDoc standard.
|
|
2
|
+
// It should be published with your NPM package. It should not be tracked by Git.
|
|
3
|
+
{
|
|
4
|
+
"tsdocVersion": "0.12",
|
|
5
|
+
"toolPackages": [
|
|
6
|
+
{
|
|
7
|
+
"packageName": "@microsoft/api-extractor",
|
|
8
|
+
"packageVersion": "7.18.11"
|
|
9
|
+
}
|
|
10
|
+
]
|
|
11
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tomorrowevening/theatric",
|
|
3
|
+
"version": "1.0.8",
|
|
4
|
+
"license": "Apache-2.0",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Andrew Prifer",
|
|
7
|
+
"email": "andrew.prifer@gmail.com",
|
|
8
|
+
"url": "https://github.com/AndrewPrifer"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/tomorrowevening/theatre",
|
|
13
|
+
"directory": "packages/theatric"
|
|
14
|
+
},
|
|
15
|
+
"main": "dist/index.js",
|
|
16
|
+
"types": "dist/index.d.ts",
|
|
17
|
+
"files": [
|
|
18
|
+
"dist/**/*"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"prepack": "node ../../devEnv/ensurePublishing.js",
|
|
22
|
+
"typecheck": "yarn run build",
|
|
23
|
+
"build": "run-s build:ts build:js build:api-json",
|
|
24
|
+
"build:ts": "tsc --build ./tsconfig.json",
|
|
25
|
+
"build:js": "node -r esbuild-register ./devEnv/build.ts",
|
|
26
|
+
"build:api-json": "api-extractor run --local --config devEnv/api-extractor.json",
|
|
27
|
+
"prepublish": "node ../../devEnv/ensurePublishing.js",
|
|
28
|
+
"clean": "rm -rf ./dist && rm -f tsconfig.tsbuildinfo"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@microsoft/api-extractor": "^7.18.11",
|
|
32
|
+
"@tomorrowevening/theatre-dataverse": "workspace:*",
|
|
33
|
+
"@types/jest": "^26.0.23",
|
|
34
|
+
"@types/node": "^15.6.2",
|
|
35
|
+
"@types/react": "^18.2.18",
|
|
36
|
+
"esbuild": "^0.12.15",
|
|
37
|
+
"esbuild-register": "^2.5.0",
|
|
38
|
+
"lodash-es": "^4.17.21",
|
|
39
|
+
"npm-run-all": "^4.1.5",
|
|
40
|
+
"typescript": "5.1.6"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@tomorrowevening/theatre-core": "workspace:*",
|
|
44
|
+
"@tomorrowevening/theatre-react": "workspace:*",
|
|
45
|
+
"@tomorrowevening/theatre-studio": "workspace:*"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"react": "*"
|
|
49
|
+
}
|
|
50
|
+
}
|