@unseenco/theatre-gsap 0.4.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/attachTheatrePageScroll.d.ts +10 -0
- package/dist/attachTheatrePageScroll.d.ts.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/gsapScrollTriggerPlugin.d.ts +10 -0
- package/dist/gsapScrollTriggerPlugin.d.ts.map +1 -0
- package/dist/gsapScrollTriggerTypes.d.ts +23 -0
- package/dist/gsapScrollTriggerTypes.d.ts.map +1 -0
- package/dist/gsapTickerRafBridge.d.ts +23 -0
- package/dist/gsapTickerRafBridge.d.ts.map +1 -0
- package/dist/gsapTickerRafBridge.test.d.ts +2 -0
- package/dist/gsapTickerRafBridge.test.d.ts.map +1 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +598 -12
- package/dist/index.js.map +4 -4
- package/dist/index.mjs +597 -7
- package/dist/index.mjs.map +4 -4
- package/dist/registerAllGsapScrollTriggers.d.ts +11 -0
- package/dist/registerAllGsapScrollTriggers.d.ts.map +1 -0
- package/dist/registerGsapAnimation.d.ts +5 -2
- package/dist/registerGsapAnimation.d.ts.map +1 -1
- package/dist/registerGsapScrollTrigger.d.ts +21 -0
- package/dist/registerGsapScrollTrigger.d.ts.map +1 -0
- package/package.json +2 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/registerGsapAnimation.ts", "../../../theatre/shared/src/utils/errors.ts", "../../../theatre/shared/src/_logger/logger.ts", "../../../theatre/shared/src/logger.ts", "../../../theatre/shared/src/globalVariableNames.ts", "../../../theatre/shared/src/notify.ts", "../../../theatre/shared/src/utils/slashedPaths.ts", "../../../theatre/shared/src/gsap/buildGsapSheetObjectKey.ts", "../../../theatre/shared/src/gsap/introspectGsapTimelineChildren.ts", "../../../theatre/shared/src/gsap/gsapSheetObjectKey.ts", "../../../theatre/shared/src/gsap/syncGsapClipProgress.ts", "../../../theatre/shared/src/gsap/gsapClipBaseline.ts", "../../../theatre/shared/src/gsap/gsapObjectBinding.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/isSymbol.js", "../../../node_modules/lodash-es/_isKey.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/memoize.js", "../../../node_modules/lodash-es/_memoizeCapped.js", "../../../node_modules/lodash-es/_stringToPath.js", "../../../node_modules/lodash-es/_arrayMap.js", "../../../node_modules/lodash-es/_baseToString.js", "../../../node_modules/lodash-es/toString.js", "../../../node_modules/lodash-es/_castPath.js", "../../../node_modules/lodash-es/_toKey.js", "../../../node_modules/lodash-es/_baseGet.js", "../../../node_modules/lodash-es/get.js", "../../../node_modules/lodash-es/_overArg.js", "../../../node_modules/lodash-es/_getPrototype.js", "../../../node_modules/lodash-es/isPlainObject.js", "../../../node_modules/lodash-es/last.js", "../../dataverse/src/pointer.ts", "../../dataverse/src/utils/updateDeep.ts", "../../dataverse/src/utils/Stack.ts", "../../dataverse/src/prism/discoveryMechanism.ts", "../../dataverse/src/prism/prism.ts", "../../dataverse/src/Atom.ts", "../../../theatre/shared/src/gsap/gsapStudioRegistryRevision.ts", "../../../theatre/shared/src/gsap/gsapAnimationRegistry.ts", "../src/config.ts", "../src/animationRegistry.ts", "../../../theatre/shared/src/utils/outlineNamespaces.ts", "../src/attachGsapSequenceBridge.ts"],
|
|
4
|
-
"sourcesContent": ["import type {ISheet, ISheetObject} from '@unseenco/theatre-core'\r\nimport type {GsapTweenLike} from './gsapTypes'\r\nimport {privateAPI} from '@unseenco/theatre-core/privateAPIs'\r\nimport {buildGsapSheetObjectKey} from '@unseenco/theatre-shared/gsap/buildGsapSheetObjectKey'\r\nimport {getAnimationEntry} from '@unseenco/theatre-shared/gsap/gsapAnimationRegistry'\r\nimport {getTheatreGsapConfig} from './config'\r\nimport {registerAnimationInRegistry} from './animationRegistry'\r\nimport {formatOutlineNamespacePathKey} from '@unseenco/theatre-shared/utils/outlineNamespaces'\r\n\r\nexport type RegisterGsapAnimationOptions = {\r\n /** Theatre object label (shown after the `GSAP/` namespace). */\r\n label: string\r\n /** Override namespace from {@link configureTheatreGsap}. */\r\n namespace?: string\r\n /**\r\n * Stable id for this animation on the sheet object. When omitted, defaults to\r\n * the sanitised sheet object key (e.g. `GSAP / Panel show`).\r\n * Re-registering with the same id updates the registry entry in place.\r\n */\r\n id?: string\r\n /** Clip length when adding to the sequence (defaults to tween duration). */\r\n defaultDuration?: number\r\n /** Rebuild the timeline when native child timing edits fail. */\r\n onRebuildTimeline?: () => GsapTweenLike\r\n}\r\n\r\nexport type RegisterGsapAnimationResult = {\r\n id: string\r\n sheetObject: ISheetObject<{}>\r\n}\r\n\r\n/**\r\n * Registers a GSAP tween for Theatre sequence bridging and creates an outline\r\n * proxy object under `GSAP/<label>` (namespace configurable).\r\n *\r\n * The animation is paused immediately so Theatre can drive progress.\r\n */\r\nexport function registerGsapAnimation(\r\n animation: GsapTweenLike,\r\n sheet: ISheet,\r\n options: RegisterGsapAnimationOptions,\r\n): RegisterGsapAnimationResult {\r\n const config = getTheatreGsapConfig()\r\n const namespace = options.namespace ?? config.namespace ?? 'GSAP'\r\n const objectKey = buildGsapSheetObjectKey(namespace, options.label)\r\n const id = options.id ?? objectKey\r\n\r\n animation.pause()\r\n\r\n const sheetObjectPublic = sheet.object(objectKey, {}, {reconfigure: false})\r\n const sheetObjectInternal = privateAPI(sheetObjectPublic)\r\n\r\n const existing = getAnimationEntry(sheetObjectInternal, id)\r\n\r\n if (config.outlineNamespace && !existing) {\r\n privateAPI(sheet).template.setOutlineNamespaceConfig(\r\n formatOutlineNamespacePathKey([namespace]),\r\n config.outlineNamespace,\r\n )\r\n }\r\n\r\n registerAnimationInRegistry({\r\n id,\r\n label: options.label,\r\n animation,\r\n sheetObject: sheetObjectInternal,\r\n defaultDuration: options.defaultDuration,\r\n onRebuildTimeline: options.onRebuildTimeline,\r\n })\r\n\r\n return {id, sheetObject: sheetObjectPublic}\r\n}\r\n", "/**\r\n * All errors thrown to end-users should be an instance of this class.\r\n */\r\nexport class TheatreError extends Error {}\r\n\r\n/**\r\n * If an end-user provided an invalid argument to a public API, the error thrown\r\n * should be an instance of this class.\r\n */\r\nexport class InvalidArgumentError extends TheatreError {}\r\n", "/** @public configuration type */\r\nexport interface ITheatreLogger {\r\n error(level: ITheatreLogMeta, message: string, args?: Loggable): void\r\n warn(level: ITheatreLogMeta, message: string, args?: Loggable): void\r\n debug(level: ITheatreLogMeta, message: string, args?: Loggable): void\r\n trace(level: ITheatreLogMeta, message: string, args?: Loggable): void\r\n}\r\n\r\ntype ITheatreLogMeta = Readonly<{\r\n audience: 'public' | 'dev' | 'internal'\r\n category: 'general' | 'todo' | 'troubleshooting'\r\n level: TheatreLoggerLevel\r\n}>\r\n\r\n/** @public configuration type */\r\nexport interface ITheatreConsoleLogger {\r\n /** ERROR level logs */\r\n error(message: string, ...args: any[]): void\r\n /** WARN level logs */\r\n warn(message: string, ...args: any[]): void\r\n /** DEBUG level logs */\r\n info(message: string, ...args: any[]): void\r\n /** TRACE level logs */\r\n debug(message: string, ...args: any[]): void\r\n}\r\n\r\n/**\r\n * \"Downgraded\" {@link ILogger} for passing down to utility functions.\r\n *\r\n * A util logger is usually back by some specific {@link _Audience}.\r\n */\r\nexport interface IUtilLogger {\r\n /** Usually equivalent to `console.error`. */\r\n error(message: string, args?: object): void\r\n /** Usually equivalent to `console.warn`. */\r\n warn(message: string, args?: object): void\r\n /** Usually equivalent to `console.info`. */\r\n debug(message: string, args?: object): void\r\n /** Usually equivalent to `console.debug`. */\r\n trace(message: string, args?: object): void\r\n named(name: string, key?: string): IUtilLogger\r\n}\r\n\r\ntype Loggable = Record<string, any>\r\ntype LogFn = (message: string, args?: Loggable) => void\r\n/**\r\n * Allow for the arguments to only be computed if the level is included.\r\n * If the level is not included, then the fn will still be passed to the filtered\r\n * function.\r\n */\r\ntype LazyLogFn = (message: string, args: () => Loggable) => void\r\n\r\nfunction lazy(f: LogFn): LazyLogFn {\r\n return function lazyLogIncluded(m, lazyArg) {\r\n return f(m, lazyArg())\r\n }\r\n}\r\n\r\nexport type _LogFns = Readonly<\r\n {\r\n [P in keyof typeof LEVELS]: LogFn\r\n }\r\n>\r\n\r\nexport type _LazyLogFns = Readonly<\r\n {\r\n [P in keyof typeof LEVELS]: LazyLogFn\r\n }\r\n>\r\n\r\n/** Internal library logger\r\n * TODO document these fns\r\n */\r\nexport interface ILogger extends _LogFns {\r\n named(name: string, key?: string | number): ILogger\r\n lazy: _LazyLogFns\r\n readonly utilFor: {\r\n internal(): IUtilLogger\r\n dev(): IUtilLogger\r\n public(): IUtilLogger\r\n }\r\n}\r\n\r\nexport type ITheatreLoggerConfig =\r\n | /** default {@link console} */\r\n 'console'\r\n | {\r\n type: 'console'\r\n /** default `true` */\r\n style?: boolean\r\n /** default {@link console} */\r\n console?: ITheatreConsoleLogger\r\n }\r\n | {\r\n type: 'named'\r\n named(names: string[]): ITheatreLogger\r\n }\r\n | {\r\n type: 'keyed'\r\n keyed(\r\n nameAndKeys: {\r\n name: string\r\n key?: string | number\r\n }[],\r\n ): ITheatreLogger\r\n }\r\n\r\nexport type ITheatreLogSource = {names: {name: string; key?: number | string}[]}\r\n\r\nexport type ITheatreLogIncludes = {\r\n /**\r\n * General information max level.\r\n * e.g. `Project imported might be corrupted`\r\n */\r\n min?: TheatreLoggerLevel\r\n /**\r\n * Include logs meant for developers using Theatre.js\r\n * e.g. `Created new project 'Abc' with options {...}`\r\n *\r\n * defaults to `true` if `internal: true` or defaults to `false`.\r\n */\r\n dev?: boolean\r\n /**\r\n * Include logs meant for internal development of Theatre.js\r\n * e.g. `Migrated project 'Abc' { duration_ms: 34, from_version: 1, to_version: 3, imported_settings: false }`\r\n *\r\n * defaults to `false`\r\n */\r\n internal?: boolean\r\n}\r\n\r\nexport type ITheatreLoggingConfig = ITheatreLogIncludes & {\r\n include?: (source: ITheatreLogSource) => ITheatreLogIncludes\r\n consoleStyle?: boolean\r\n}\r\n\r\n/** @internal */\r\nenum _Category {\r\n GENERAL = 1 << 0,\r\n TODO = 1 << 1,\r\n TROUBLESHOOTING = 1 << 2,\r\n}\r\n\r\n/** @internal */\r\nenum _Audience {\r\n /** Logs for developers of Theatre.js */\r\n INTERNAL = 1 << 3,\r\n /** Logs for developers using Theatre.js */\r\n DEV = 1 << 4,\r\n /** Logs for users of the app using Theatre.js */\r\n PUBLIC = 1 << 5,\r\n}\r\n\r\nexport enum TheatreLoggerLevel {\r\n TRACE = 1 << 6,\r\n DEBUG = 1 << 7,\r\n WARN = 1 << 8,\r\n ERROR = 1 << 9,\r\n}\r\n\r\n/**\r\n * @internal Theatre.js internal \"dev\" levels are odd numbers\r\n *\r\n * You can check if a level is odd quickly by doing `level & 1 === 1`\r\n */\r\nexport enum _LoggerLevel {\r\n /** The highest logging level number. */\r\n ERROR_PUBLIC = TheatreLoggerLevel.ERROR |\r\n _Audience.PUBLIC |\r\n _Category.GENERAL,\r\n ERROR_DEV = TheatreLoggerLevel.ERROR | _Audience.DEV | _Category.GENERAL,\r\n /** @internal this was an unexpected event */\r\n _HMM = TheatreLoggerLevel.ERROR |\r\n _Audience.INTERNAL |\r\n _Category.TROUBLESHOOTING,\r\n _TODO = TheatreLoggerLevel.ERROR | _Audience.INTERNAL | _Category.TODO,\r\n _ERROR = TheatreLoggerLevel.ERROR | _Audience.INTERNAL | _Category.GENERAL,\r\n WARN_PUBLIC = TheatreLoggerLevel.WARN | _Audience.PUBLIC | _Category.GENERAL,\r\n WARN_DEV = TheatreLoggerLevel.WARN | _Audience.DEV | _Category.GENERAL,\r\n /** @internal surface this in this moment, but it probably shouldn't be left in the code after debugging. */\r\n _KAPOW = TheatreLoggerLevel.WARN |\r\n _Audience.INTERNAL |\r\n _Category.TROUBLESHOOTING,\r\n _WARN = TheatreLoggerLevel.WARN | _Audience.INTERNAL | _Category.GENERAL,\r\n DEBUG_DEV = TheatreLoggerLevel.DEBUG | _Audience.DEV | _Category.GENERAL,\r\n /** @internal debug logs for implementation details */\r\n _DEBUG = TheatreLoggerLevel.DEBUG | _Audience.INTERNAL | _Category.GENERAL,\r\n /** trace logs like when the project is saved */\r\n TRACE_DEV = TheatreLoggerLevel.TRACE | _Audience.DEV | _Category.GENERAL,\r\n /**\r\n * The lowest logging level number.\r\n * @internal trace logs for implementation details\r\n */\r\n _TRACE = TheatreLoggerLevel.TRACE | _Audience.INTERNAL | _Category.GENERAL,\r\n}\r\n\r\nconst LEVELS = {\r\n _hmm: getLogMeta(_LoggerLevel._HMM),\r\n _todo: getLogMeta(_LoggerLevel._TODO),\r\n _error: getLogMeta(_LoggerLevel._ERROR),\r\n errorDev: getLogMeta(_LoggerLevel.ERROR_DEV),\r\n errorPublic: getLogMeta(_LoggerLevel.ERROR_PUBLIC),\r\n _kapow: getLogMeta(_LoggerLevel._KAPOW),\r\n _warn: getLogMeta(_LoggerLevel._WARN),\r\n warnDev: getLogMeta(_LoggerLevel.WARN_DEV),\r\n warnPublic: getLogMeta(_LoggerLevel.WARN_PUBLIC),\r\n _debug: getLogMeta(_LoggerLevel._DEBUG),\r\n debugDev: getLogMeta(_LoggerLevel.DEBUG_DEV),\r\n _trace: getLogMeta(_LoggerLevel._TRACE),\r\n traceDev: getLogMeta(_LoggerLevel.TRACE_DEV),\r\n}\r\n\r\nfunction getLogMeta(level: _LoggerLevel): ITheatreLogMeta {\r\n return Object.freeze({\r\n audience: hasFlag(level, _Audience.INTERNAL)\r\n ? 'internal'\r\n : hasFlag(level, _Audience.DEV)\r\n ? 'dev'\r\n : 'public',\r\n category: hasFlag(level, _Category.TROUBLESHOOTING)\r\n ? 'troubleshooting'\r\n : hasFlag(level, _Category.TODO)\r\n ? 'todo'\r\n : 'general',\r\n level:\r\n // I think this is equivalent... but I'm not using it until we have tests.\r\n // this code won't really impact performance much anyway, since it's just computed once\r\n // up front.\r\n // level &\r\n // (TheatreLoggerLevel.TRACE |\r\n // TheatreLoggerLevel.DEBUG |\r\n // TheatreLoggerLevel.WARN |\r\n // TheatreLoggerLevel.ERROR),\r\n hasFlag(level, TheatreLoggerLevel.ERROR)\r\n ? TheatreLoggerLevel.ERROR\r\n : hasFlag(level, TheatreLoggerLevel.WARN)\r\n ? TheatreLoggerLevel.WARN\r\n : hasFlag(level, TheatreLoggerLevel.DEBUG)\r\n ? TheatreLoggerLevel.DEBUG\r\n : // no other option\r\n TheatreLoggerLevel.TRACE,\r\n })\r\n}\r\n\r\n/**\r\n * This is a helper function to determine whether the logger level has a bit flag set.\r\n *\r\n * Flags are interesting, because they give us an opportunity to very easily set up filtering\r\n * based on category and level. This is not available from public api, yet, but it's a good\r\n * start.\r\n */\r\nfunction hasFlag(level: _LoggerLevel, flag: number): boolean {\r\n return (level & flag) === flag\r\n}\r\n\r\n/**\r\n * @internal\r\n *\r\n * You'd think max, means number \"max\", but since we use this system of bit flags,\r\n * we actually need to go the other way, with comparisons being math less than.\r\n *\r\n * NOTE: Keep this in the same file as {@link _Audience} to ensure basic compilers\r\n * can inline the enum values.\r\n */\r\nfunction shouldLog(\r\n includes: Required<ITheatreLogIncludes>,\r\n level: _LoggerLevel,\r\n) {\r\n return (\r\n ((level & _Audience.PUBLIC) === _Audience.PUBLIC\r\n ? true\r\n : (level & _Audience.DEV) === _Audience.DEV\r\n ? includes.dev\r\n : (level & _Audience.INTERNAL) === _Audience.INTERNAL\r\n ? includes.internal\r\n : false) && includes.min <= level\r\n )\r\n}\r\n\r\nexport {shouldLog as _loggerShouldLog}\r\n\r\ntype InternalLoggerStyleRef = {\r\n italic?: RegExp\r\n bold?: RegExp\r\n color?: (name: string) => string\r\n collapseOnRE: RegExp\r\n cssMemo: Map<string, string>\r\n css(this: InternalLoggerStyleRef, name: string): string\r\n collapsed(this: InternalLoggerStyleRef, name: string): string\r\n}\r\n\r\ntype InternalLoggerRef = {\r\n loggingConsoleStyle: boolean\r\n loggerConsoleStyle: boolean\r\n includes: Required<ITheatreLogIncludes>\r\n filtered: (\r\n this: ITheatreLogSource,\r\n level: _LoggerLevel,\r\n message: string,\r\n args?: Loggable | (() => Loggable),\r\n ) => void\r\n include: (obj: ITheatreLogSource) => ITheatreLogIncludes\r\n create: (obj: ITheatreLogSource) => ILogger\r\n creatExt: (obj: ITheatreLogSource) => ITheatreLogger\r\n style: InternalLoggerStyleRef\r\n named(\r\n this: InternalLoggerRef,\r\n parent: ITheatreLogSource,\r\n name: string,\r\n key?: number | string,\r\n ): ILogger\r\n}\r\n\r\nconst DEFAULTS: InternalLoggerRef = {\r\n loggingConsoleStyle: true,\r\n loggerConsoleStyle: true,\r\n includes: Object.freeze({\r\n internal: false,\r\n dev: false,\r\n min: TheatreLoggerLevel.WARN,\r\n }),\r\n filtered: function defaultFiltered() {},\r\n include: function defaultInclude() {\r\n return {}\r\n },\r\n create: null!,\r\n creatExt: null!,\r\n named(this: InternalLoggerRef, parent, name, key) {\r\n return this.create({\r\n names: [...parent.names, {name, key}],\r\n })\r\n },\r\n style: {\r\n bold: undefined, // /Service$/\r\n italic: undefined, // /Model$/\r\n cssMemo: new Map<string, string>([\r\n // handle empty names so we don't have to check for\r\n // name.length > 0 during this.css('')\r\n ['', ''],\r\n // bring a specific override\r\n // [\"Marker\", \"color:#aea9ff;font-size:0.75em;text-transform:uppercase\"]\r\n ]),\r\n collapseOnRE: /[a-z- ]+/g,\r\n color: undefined,\r\n // create collapsed name\r\n // insert collapsed name into cssMemo with original's style\r\n collapsed(this, name) {\r\n if (name.length < 5) return name\r\n const collapsed = name.replace(this.collapseOnRE, '')\r\n if (!this.cssMemo.has(collapsed)) {\r\n this.cssMemo.set(collapsed, this.css(name))\r\n }\r\n return collapsed\r\n },\r\n css(this, name): string {\r\n const found = this.cssMemo.get(name)\r\n if (found) return found\r\n let css = `color:${\r\n this.color?.(name) ??\r\n `hsl(${\r\n (name.charCodeAt(0) + name.charCodeAt(name.length - 1)) % 360\r\n }, 100%, 60%)`\r\n }`\r\n if (this.bold?.test(name)) {\r\n css += ';font-weight:600'\r\n }\r\n if (this.italic?.test(name)) {\r\n css += ';font-style:italic'\r\n }\r\n this.cssMemo.set(name, css)\r\n return css\r\n },\r\n },\r\n}\r\n\r\n/** @internal */\r\nexport type ITheatreInternalLogger = {\r\n configureLogger(config: ITheatreLoggerConfig): void\r\n configureLogging(config: ITheatreLoggingConfig): void\r\n getLogger(): ILogger\r\n}\r\n\r\nexport type ITheatreInternalLoggerOptions = {\r\n _error?: (message: string, args?: object) => void\r\n _debug?: (message: string, args?: object) => void\r\n}\r\n\r\nexport function createTheatreInternalLogger(\r\n useConsole: ITheatreConsoleLogger = console,\r\n // Not yet, used, but good pattern to have in case we want to log something\r\n // or report something interesting.\r\n _options: ITheatreInternalLoggerOptions = {},\r\n): ITheatreInternalLogger {\r\n const ref: InternalLoggerRef = {...DEFAULTS, includes: {...DEFAULTS.includes}}\r\n const createConsole = {\r\n styled: createConsoleLoggerStyled.bind(ref, useConsole),\r\n noStyle: createConsoleLoggerNoStyle.bind(ref, useConsole),\r\n }\r\n const createExtBound = createExtLogger.bind(ref)\r\n function getConCreate() {\r\n return ref.loggingConsoleStyle && ref.loggerConsoleStyle\r\n ? createConsole.styled\r\n : createConsole.noStyle\r\n }\r\n ref.create = getConCreate()\r\n\r\n return {\r\n configureLogger(config) {\r\n if (config === 'console') {\r\n ref.loggerConsoleStyle = DEFAULTS.loggerConsoleStyle\r\n ref.create = getConCreate()\r\n } else if (config.type === 'console') {\r\n ref.loggerConsoleStyle = config.style ?? DEFAULTS.loggerConsoleStyle\r\n ref.create = getConCreate()\r\n } else if (config.type === 'keyed') {\r\n ref.creatExt = (source) => config.keyed(source.names)\r\n ref.create = createExtBound\r\n } else if (config.type === 'named') {\r\n ref.creatExt = configNamedToKeyed.bind(null, config.named)\r\n ref.create = createExtBound\r\n }\r\n },\r\n configureLogging(config) {\r\n ref.includes.dev = config.dev ?? DEFAULTS.includes.dev\r\n ref.includes.internal = config.internal ?? DEFAULTS.includes.internal\r\n ref.includes.min = config.min ?? DEFAULTS.includes.min\r\n ref.include = config.include ?? DEFAULTS.include\r\n ref.loggingConsoleStyle =\r\n config.consoleStyle ?? DEFAULTS.loggingConsoleStyle\r\n ref.create = getConCreate()\r\n },\r\n getLogger() {\r\n return ref.create({names: []})\r\n },\r\n }\r\n}\r\n\r\n/** used by `configureLogger` for `'named'` */\r\nfunction configNamedToKeyed(\r\n namedFn: (names: string[]) => ITheatreLogger,\r\n source: ITheatreLogSource,\r\n): ITheatreLogger {\r\n const names: string[] = []\r\n for (let {name, key} of source.names) {\r\n names.push(key == null ? name : `${name} (${key})`)\r\n }\r\n return namedFn(names)\r\n}\r\n\r\nfunction createExtLogger(\r\n this: InternalLoggerRef,\r\n source: ITheatreLogSource,\r\n): ILogger {\r\n const includes = {...this.includes, ...this.include(source)}\r\n const f = this.filtered\r\n const named = this.named.bind(this, source)\r\n const ext = this.creatExt(source)\r\n\r\n const _HMM = shouldLog(includes, _LoggerLevel._HMM)\r\n const _TODO = shouldLog(includes, _LoggerLevel._TODO)\r\n const _ERROR = shouldLog(includes, _LoggerLevel._ERROR)\r\n const ERROR_DEV = shouldLog(includes, _LoggerLevel.ERROR_DEV)\r\n const ERROR_PUBLIC = shouldLog(includes, _LoggerLevel.ERROR_PUBLIC)\r\n const _WARN = shouldLog(includes, _LoggerLevel._WARN)\r\n const _KAPOW = shouldLog(includes, _LoggerLevel._KAPOW)\r\n const WARN_DEV = shouldLog(includes, _LoggerLevel.WARN_DEV)\r\n const WARN_PUBLIC = shouldLog(includes, _LoggerLevel.WARN_PUBLIC)\r\n const _DEBUG = shouldLog(includes, _LoggerLevel._DEBUG)\r\n const DEBUG_DEV = shouldLog(includes, _LoggerLevel.DEBUG_DEV)\r\n const _TRACE = shouldLog(includes, _LoggerLevel._TRACE)\r\n const TRACE_DEV = shouldLog(includes, _LoggerLevel.TRACE_DEV)\r\n const _hmm = _HMM\r\n ? ext.error.bind(ext, LEVELS._hmm)\r\n : f.bind(source, _LoggerLevel._HMM)\r\n const _todo = _TODO\r\n ? ext.error.bind(ext, LEVELS._todo)\r\n : f.bind(source, _LoggerLevel._TODO)\r\n const _error = _ERROR\r\n ? ext.error.bind(ext, LEVELS._error)\r\n : f.bind(source, _LoggerLevel._ERROR)\r\n const errorDev = ERROR_DEV\r\n ? ext.error.bind(ext, LEVELS.errorDev)\r\n : f.bind(source, _LoggerLevel.ERROR_DEV)\r\n const errorPublic = ERROR_PUBLIC\r\n ? ext.error.bind(ext, LEVELS.errorPublic)\r\n : f.bind(source, _LoggerLevel.ERROR_PUBLIC)\r\n const _kapow = _KAPOW\r\n ? ext.warn.bind(ext, LEVELS._kapow)\r\n : f.bind(source, _LoggerLevel._KAPOW)\r\n const _warn = _WARN\r\n ? ext.warn.bind(ext, LEVELS._warn)\r\n : f.bind(source, _LoggerLevel._WARN)\r\n const warnDev = WARN_DEV\r\n ? ext.warn.bind(ext, LEVELS.warnDev)\r\n : f.bind(source, _LoggerLevel.WARN_DEV)\r\n const warnPublic = WARN_PUBLIC\r\n ? ext.warn.bind(ext, LEVELS.warnPublic)\r\n : f.bind(source, _LoggerLevel.WARN_DEV)\r\n const _debug = _DEBUG\r\n ? ext.debug.bind(ext, LEVELS._debug)\r\n : f.bind(source, _LoggerLevel._DEBUG)\r\n const debugDev = DEBUG_DEV\r\n ? ext.debug.bind(ext, LEVELS.debugDev)\r\n : f.bind(source, _LoggerLevel.DEBUG_DEV)\r\n const _trace = _TRACE\r\n ? ext.trace.bind(ext, LEVELS._trace)\r\n : f.bind(source, _LoggerLevel._TRACE)\r\n const traceDev = TRACE_DEV\r\n ? ext.trace.bind(ext, LEVELS.traceDev)\r\n : f.bind(source, _LoggerLevel.TRACE_DEV)\r\n const logger: ILogger = {\r\n _hmm,\r\n _todo,\r\n _error,\r\n errorDev,\r\n errorPublic,\r\n _kapow,\r\n _warn,\r\n warnDev,\r\n warnPublic,\r\n _debug,\r\n debugDev,\r\n _trace,\r\n traceDev,\r\n lazy: {\r\n _hmm: _HMM ? lazy(_hmm) : _hmm,\r\n _todo: _TODO ? lazy(_todo) : _todo,\r\n _error: _ERROR ? lazy(_error) : _error,\r\n errorDev: ERROR_DEV ? lazy(errorDev) : errorDev,\r\n errorPublic: ERROR_PUBLIC ? lazy(errorPublic) : errorPublic,\r\n _kapow: _KAPOW ? lazy(_kapow) : _kapow,\r\n _warn: _WARN ? lazy(_warn) : _warn,\r\n warnDev: WARN_DEV ? lazy(warnDev) : warnDev,\r\n warnPublic: WARN_PUBLIC ? lazy(warnPublic) : warnPublic,\r\n _debug: _DEBUG ? lazy(_debug) : _debug,\r\n debugDev: DEBUG_DEV ? lazy(debugDev) : debugDev,\r\n _trace: _TRACE ? lazy(_trace) : _trace,\r\n traceDev: TRACE_DEV ? lazy(traceDev) : traceDev,\r\n },\r\n //\r\n named,\r\n utilFor: {\r\n internal() {\r\n return {\r\n debug: logger._debug,\r\n error: logger._error,\r\n warn: logger._warn,\r\n trace: logger._trace,\r\n named(name, key) {\r\n return logger.named(name, key).utilFor.internal()\r\n },\r\n }\r\n },\r\n dev() {\r\n return {\r\n debug: logger.debugDev,\r\n error: logger.errorDev,\r\n warn: logger.warnDev,\r\n trace: logger.traceDev,\r\n named(name, key) {\r\n return logger.named(name, key).utilFor.dev()\r\n },\r\n }\r\n },\r\n public() {\r\n return {\r\n error: logger.errorPublic,\r\n warn: logger.warnPublic,\r\n debug(message, obj) {\r\n logger._warn(`(public \"debug\" filtered out) ${message}`, obj)\r\n },\r\n trace(message, obj) {\r\n logger._warn(`(public \"trace\" filtered out) ${message}`, obj)\r\n },\r\n named(name, key) {\r\n return logger.named(name, key).utilFor.public()\r\n },\r\n }\r\n },\r\n },\r\n }\r\n\r\n return logger\r\n}\r\n\r\nfunction createConsoleLoggerStyled(\r\n this: InternalLoggerRef,\r\n con: ITheatreConsoleLogger,\r\n source: ITheatreLogSource,\r\n): ILogger {\r\n const includes = {...this.includes, ...this.include(source)}\r\n\r\n const styleArgs: any[] = []\r\n let prefix = ''\r\n for (let i = 0; i < source.names.length; i++) {\r\n const {name, key} = source.names[i]\r\n prefix += ` %c${name}`\r\n styleArgs.push(this.style.css(name))\r\n if (key != null) {\r\n const keyStr = `%c#${key}`\r\n prefix += keyStr\r\n styleArgs.push(this.style.css(keyStr))\r\n }\r\n }\r\n\r\n const f = this.filtered\r\n const named = this.named.bind(this, source)\r\n const prefixArr = [prefix, ...styleArgs]\r\n return _createConsoleLogger(\r\n f,\r\n source,\r\n includes,\r\n con,\r\n prefixArr,\r\n styledKapowPrefix(prefixArr),\r\n named,\r\n )\r\n}\r\n\r\nfunction styledKapowPrefix(args: ReadonlyArray<string>): ReadonlyArray<string> {\r\n const start = args.slice(0)\r\n for (let i = 1; i < start.length; i++)\r\n // add big font to all part styles\r\n start[i] += ';background-color:#e0005a;padding:2px;color:white'\r\n return start\r\n}\r\n\r\nfunction createConsoleLoggerNoStyle(\r\n this: InternalLoggerRef,\r\n con: ITheatreConsoleLogger,\r\n source: ITheatreLogSource,\r\n): ILogger {\r\n const includes = {...this.includes, ...this.include(source)}\r\n\r\n let prefix = ''\r\n for (let i = 0; i < source.names.length; i++) {\r\n const {name, key} = source.names[i]\r\n prefix += ` ${name}`\r\n if (key != null) {\r\n prefix += `#${key}`\r\n }\r\n }\r\n\r\n const f = this.filtered\r\n const named = this.named.bind(this, source)\r\n const prefixArr = [prefix]\r\n return _createConsoleLogger(\r\n f,\r\n source,\r\n includes,\r\n con,\r\n prefixArr,\r\n prefixArr,\r\n named,\r\n )\r\n}\r\n\r\n/** Used by {@link createConsoleLoggerNoStyle} and {@link createConsoleLoggerStyled} */\r\nfunction _createConsoleLogger(\r\n f: (\r\n this: ITheatreLogSource,\r\n level: _LoggerLevel,\r\n message: string,\r\n args?: object | undefined,\r\n ) => void,\r\n source: ITheatreLogSource,\r\n includes: {min: TheatreLoggerLevel; dev: boolean; internal: boolean},\r\n con: ITheatreConsoleLogger,\r\n prefix: ReadonlyArray<any>,\r\n kapowPrefix: ReadonlyArray<any>,\r\n named: (name: string, key?: string | number | undefined) => ILogger,\r\n) {\r\n const _HMM = shouldLog(includes, _LoggerLevel._HMM)\r\n const _TODO = shouldLog(includes, _LoggerLevel._TODO)\r\n const _ERROR = shouldLog(includes, _LoggerLevel._ERROR)\r\n const ERROR_DEV = shouldLog(includes, _LoggerLevel.ERROR_DEV)\r\n const ERROR_PUBLIC = shouldLog(includes, _LoggerLevel.ERROR_PUBLIC)\r\n const _WARN = shouldLog(includes, _LoggerLevel._WARN)\r\n const _KAPOW = shouldLog(includes, _LoggerLevel._KAPOW)\r\n const WARN_DEV = shouldLog(includes, _LoggerLevel.WARN_DEV)\r\n const WARN_PUBLIC = shouldLog(includes, _LoggerLevel.WARN_PUBLIC)\r\n const _DEBUG = shouldLog(includes, _LoggerLevel._DEBUG)\r\n const DEBUG_DEV = shouldLog(includes, _LoggerLevel.DEBUG_DEV)\r\n const _TRACE = shouldLog(includes, _LoggerLevel._TRACE)\r\n const TRACE_DEV = shouldLog(includes, _LoggerLevel.TRACE_DEV)\r\n const _hmm = _HMM\r\n ? con.error.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel._HMM)\r\n const _todo = _TODO\r\n ? con.error.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel._TODO)\r\n const _error = _ERROR\r\n ? con.error.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel._ERROR)\r\n const errorDev = ERROR_DEV\r\n ? con.error.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel.ERROR_DEV)\r\n const errorPublic = ERROR_PUBLIC\r\n ? con.error.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel.ERROR_PUBLIC)\r\n const _kapow = _KAPOW\r\n ? con.warn.bind(con, ...kapowPrefix)\r\n : f.bind(source, _LoggerLevel._KAPOW)\r\n const _warn = _WARN\r\n ? con.warn.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel._WARN)\r\n const warnDev = WARN_DEV\r\n ? con.warn.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel.WARN_DEV)\r\n const warnPublic = WARN_PUBLIC\r\n ? con.warn.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel.WARN_DEV)\r\n const _debug = _DEBUG\r\n ? con.info.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel._DEBUG)\r\n const debugDev = DEBUG_DEV\r\n ? con.info.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel.DEBUG_DEV)\r\n const _trace = _TRACE\r\n ? con.debug.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel._TRACE)\r\n const traceDev = TRACE_DEV\r\n ? con.debug.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel.TRACE_DEV)\r\n const logger: ILogger = {\r\n _hmm,\r\n _todo,\r\n _error,\r\n errorDev,\r\n errorPublic,\r\n _kapow,\r\n _warn,\r\n warnDev,\r\n warnPublic,\r\n _debug,\r\n debugDev,\r\n _trace,\r\n traceDev,\r\n lazy: {\r\n _hmm: _HMM ? lazy(_hmm) : _hmm,\r\n _todo: _TODO ? lazy(_todo) : _todo,\r\n _error: _ERROR ? lazy(_error) : _error,\r\n errorDev: ERROR_DEV ? lazy(errorDev) : errorDev,\r\n errorPublic: ERROR_PUBLIC ? lazy(errorPublic) : errorPublic,\r\n _kapow: _KAPOW ? lazy(_kapow) : _kapow,\r\n _warn: _WARN ? lazy(_warn) : _warn,\r\n warnDev: WARN_DEV ? lazy(warnDev) : warnDev,\r\n warnPublic: WARN_PUBLIC ? lazy(warnPublic) : warnPublic,\r\n _debug: _DEBUG ? lazy(_debug) : _debug,\r\n debugDev: DEBUG_DEV ? lazy(debugDev) : debugDev,\r\n _trace: _TRACE ? lazy(_trace) : _trace,\r\n traceDev: TRACE_DEV ? lazy(traceDev) : traceDev,\r\n },\r\n //\r\n named,\r\n utilFor: {\r\n internal() {\r\n return {\r\n debug: logger._debug,\r\n error: logger._error,\r\n warn: logger._warn,\r\n trace: logger._trace,\r\n named(name, key) {\r\n return logger.named(name, key).utilFor.internal()\r\n },\r\n }\r\n },\r\n dev() {\r\n return {\r\n debug: logger.debugDev,\r\n error: logger.errorDev,\r\n warn: logger.warnDev,\r\n trace: logger.traceDev,\r\n named(name, key) {\r\n return logger.named(name, key).utilFor.dev()\r\n },\r\n }\r\n },\r\n public() {\r\n return {\r\n error: logger.errorPublic,\r\n warn: logger.warnPublic,\r\n debug(message, obj) {\r\n logger._warn(`(public \"debug\" filtered out) ${message}`, obj)\r\n },\r\n trace(message, obj) {\r\n logger._warn(`(public \"trace\" filtered out) ${message}`, obj)\r\n },\r\n named(name, key) {\r\n return logger.named(name, key).utilFor.public()\r\n },\r\n }\r\n },\r\n },\r\n }\r\n\r\n return logger\r\n}\r\n", "export type {\r\n ILogger,\r\n IUtilLogger,\r\n ITheatreConsoleLogger,\r\n ITheatreLogIncludes,\r\n ITheatreLogSource,\r\n ITheatreLoggerConfig,\r\n ITheatreLoggingConfig,\r\n ITheatreInternalLogger,\r\n} from './_logger/logger'\r\nimport {createTheatreInternalLogger, TheatreLoggerLevel} from './_logger/logger'\r\nimport type {IUtilLogger} from './_logger/logger'\r\nexport {TheatreLoggerLevel, createTheatreInternalLogger} from './_logger/logger'\r\n\r\n/**\r\n * Common object interface for the context to pass in to utility functions.\r\n *\r\n * Prefer to pass this into utility function rather than an {@link IUtilLogger}.\r\n */\r\nexport interface IUtilContext {\r\n readonly logger: IUtilLogger\r\n}\r\n\r\nconst internal = createTheatreInternalLogger(console, {\r\n _debug: function () {},\r\n _error: function () {},\r\n})\r\n\r\ninternal.configureLogging({\r\n dev: true,\r\n min: TheatreLoggerLevel.TRACE,\r\n})\r\n\r\nexport default internal\r\n .getLogger()\r\n .named('Theatre.js (default logger)')\r\n .utilFor.dev()\r\n", "/**\r\n * The names of the global variables that the core or studio bundle\r\n * use to store their references.\r\n */\r\nexport const studioBundle = '__TheatreJS_StudioBundle'\r\nexport const coreBundle = '__TheatreJS_CoreBundle'\r\nexport const notifications = '__TheatreJS_Notifications'\r\n", "import logger from './logger'\r\nimport * as globalVariableNames from './globalVariableNames'\r\n\r\nexport type Notification = {title: string; message: string}\r\nexport type NotificationType = 'info' | 'success' | 'warning' | 'error'\r\nexport type Notify = (\r\n /**\r\n * The title of the notification.\r\n */\r\n title: string,\r\n /**\r\n * The message of the notification.\r\n */\r\n message: string,\r\n /**\r\n * An array of doc pages to link to.\r\n */\r\n docs?: {url: string; title: string}[],\r\n /**\r\n * Whether duplicate notifications should be allowed.\r\n */\r\n allowDuplicates?: boolean,\r\n) => void\r\nexport type Notifiers = {\r\n /**\r\n * Show a success notification.\r\n */\r\n success: Notify\r\n /**\r\n * Show a warning notification.\r\n *\r\n * Say what happened in the title.\r\n * In the message, start with 1) a reassurance, then 2) explain why it happened, and 3) what the user can do about it.\r\n */\r\n warning: Notify\r\n /**\r\n * Show an info notification.\r\n */\r\n info: Notify\r\n /**\r\n * Show an error notification.\r\n */\r\n error: Notify\r\n}\r\n\r\nconst createHandler =\r\n (type: NotificationType): Notify =>\r\n (...args) => {\r\n switch (type) {\r\n case 'success': {\r\n logger.debug(args.slice(0, 2).join('\\n'))\r\n break\r\n }\r\n case 'info': {\r\n logger.debug(args.slice(0, 2).join('\\n'))\r\n break\r\n }\r\n case 'warning': {\r\n logger.warn(args.slice(0, 2).join('\\n'))\r\n break\r\n }\r\n case 'error': {\r\n // don't log errors, they're already logged by the browser\r\n }\r\n }\r\n\r\n return typeof window !== 'undefined'\r\n ? // @ts-ignore\r\n window[globalVariableNames.notifications]?.notify[type](...args)\r\n : undefined\r\n }\r\n\r\n/** User-facing notification helpers (success, warning, info, error) used by Theatre.js runtimes. */\r\nexport const notify: Notifiers = {\r\n warning: createHandler('warning'),\r\n success: createHandler('success'),\r\n info: createHandler('info'),\r\n error: createHandler('error'),\r\n}\r\n\r\nif (typeof window !== 'undefined') {\r\n window.addEventListener('error', (e) => {\r\n notify.error(\r\n `An error occurred`,\r\n `<pre>${e.message}</pre>\\n\\nSee **console** for details.`,\r\n )\r\n })\r\n\r\n window.addEventListener('unhandledrejection', (e) => {\r\n notify.error(\r\n `An error occurred`,\r\n `<pre>${e.reason}</pre>\\n\\nSee **console** for details.`,\r\n )\r\n })\r\n}\r\n", "import {InvalidArgumentError} from './errors'\r\nimport {notify} from '@unseenco/theatre-shared/notify'\r\n\r\n/**\r\n * Make the given string's \"path\" slashes normalized with preceding and trailing spaces.\r\n *\r\n * - It removes starting and trailing slashes: `/foo/bar/` becomes `foo / bar`\r\n * - It adds wraps each slash with a single space, so that `foo/bar` becomes `foo / bar`\r\n *\r\n */\r\nconst normalizeSlashedPath = (p: string): string =>\r\n p\r\n // remove starting slashes\r\n .replace(/^[\\s\\/]*/, '')\r\n // remove ending slashes\r\n .replace(/[\\s\\/]*$/, '')\r\n // make middle slashes consistent\r\n .replace(/\\s*\\/\\s*/g, ' / ')\r\n\r\nconst getValidationErrorsOfSlashedPath = (p: string): void | string => {\r\n if (typeof p !== 'string') return `it is not a string. (it is a ${typeof p})`\r\n\r\n const components = p.split(/\\//)\r\n if (components.length === 0) return `it is empty.`\r\n\r\n for (let i = 0; i < components.length; i++) {\r\n const component = components[i].trim()\r\n if (component.length === 0) return `the component #${i + 1} is empty.`\r\n if (component.length > 64)\r\n return `the component '${component}' must have 64 characters or less.`\r\n }\r\n}\r\n\r\n/**\r\n * Sanitizes a `path` and warns the user if the input doesn't match the sanitized output.\r\n *\r\n * See {@link normalizeSlashedPath} for examples of how we do sanitization.\r\n */\r\nexport function validateAndSanitiseSlashedPathOrThrow(\r\n unsanitisedPath: string,\r\n fnName: string,\r\n) {\r\n const sanitisedPath = normalizeSlashedPath(unsanitisedPath)\r\n if (process.env.NODE_ENV !== 'development') {\r\n return sanitisedPath\r\n }\r\n const validation = getValidationErrorsOfSlashedPath(sanitisedPath)\r\n if (validation) {\r\n throw new InvalidArgumentError(\r\n `The path in ${fnName}(${\r\n typeof unsanitisedPath === 'string' ? `\"${unsanitisedPath}\"` : ''\r\n }) is invalid because ${validation}`,\r\n )\r\n }\r\n if (unsanitisedPath !== sanitisedPath) {\r\n notify.warning(\r\n 'Invalid path provided to object',\r\n `The path in \\`${fnName}(\"${unsanitisedPath}\")\\` was sanitized to \\`\"${sanitisedPath}\"\\`.\\n\\n` +\r\n 'Please replace the path with the sanitized one, otherwise it will likely break in the future.',\r\n [\r\n {\r\n url: 'https://www.theatrejs.com/docs/latest/manual/objects#creating-sheet-objects',\r\n title: 'Sheet Objects',\r\n },\r\n {\r\n url: 'https://www.theatrejs.com/docs/latest/api/core#sheet.object',\r\n title: 'API',\r\n },\r\n ],\r\n )\r\n }\r\n return sanitisedPath\r\n}\r\n", "import {validateAndSanitiseSlashedPathOrThrow} from '@unseenco/theatre-shared/utils/slashedPaths'\r\n\r\n/**\r\n * Theatre sheet object key for a GSAP outline proxy (`Namespace / label`),\r\n * matching {@link ISheet.object} sanitisation.\r\n */\r\nexport function buildGsapSheetObjectKey(namespace: string, label: string): string {\r\n return validateAndSanitiseSlashedPathOrThrow(\r\n `${namespace} / ${label}`,\r\n 'buildGsapSheetObjectKey',\r\n )\r\n}\r\n", "import type {GsapTimelineChildClip} from '@unseenco/theatre-core/projects/store/types/SheetState_Historic'\r\n\r\nexport function isGsapTimeline(animation: unknown): boolean {\r\n const root = animation as {\r\n getChildren?: (\r\n nested: boolean,\r\n tweens: boolean,\r\n timelines: boolean,\r\n ) => unknown[]\r\n }\r\n const children = root.getChildren?.(false, true, false)\r\n return Array.isArray(children) && children.length > 0\r\n}\r\n\r\nfunction childLabel(child: unknown, index: number): string {\r\n const tween = child as {vars?: {id?: string}}\r\n const id = tween.vars?.id\r\n if (typeof id === 'string' && id.length > 0) return id\r\n return `Tween ${index + 1}`\r\n}\r\n\r\nfunction readChildLocalTiming(child: unknown): {\r\n localStart: number\r\n localDuration: number\r\n} {\r\n const tween = child as {\r\n startTime?: () => number\r\n duration?: () => number\r\n endTime?: () => number\r\n }\r\n const localStart =\r\n typeof tween.startTime === 'function' ? tween.startTime() : 0\r\n let localDuration =\r\n typeof tween.duration === 'function' ? tween.duration() : 0\r\n if (localDuration <= 0 && typeof tween.endTime === 'function') {\r\n localDuration = Math.max(tween.endTime() - localStart, 0.01)\r\n }\r\n return {\r\n localStart: Math.max(localStart, 0),\r\n localDuration: Math.max(localDuration, 0.01),\r\n }\r\n}\r\n\r\n/** Snapshots direct child tweens of a GSAP timeline (one nesting level). */\r\nexport function introspectGsapTimelineChildren(\r\n animation: unknown,\r\n): GsapTimelineChildClip[] {\r\n if (!isGsapTimeline(animation)) return []\r\n const root = animation as {\r\n getChildren: (\r\n nested: boolean,\r\n tweens: boolean,\r\n timelines: boolean,\r\n ) => unknown[]\r\n }\r\n const raw = root.getChildren(false, true, false)\r\n return raw.map((child, index) => {\r\n const {localStart, localDuration} = readChildLocalTiming(child)\r\n return {\r\n childId: `child_${index}`,\r\n label: childLabel(child, index),\r\n localStart,\r\n localDuration,\r\n }\r\n })\r\n}\r\n\r\n/** Rebuilds runtime childId \u2192 tween map aligned with introspected ids. */\r\nexport function linkGsapTimelineChildAnimations(\r\n animation: unknown,\r\n): Map<string, unknown> {\r\n const map = new Map<string, unknown>()\r\n if (!isGsapTimeline(animation)) return map\r\n const root = animation as {\r\n getChildren: (\r\n nested: boolean,\r\n tweens: boolean,\r\n timelines: boolean,\r\n ) => unknown[]\r\n }\r\n const raw = root.getChildren(false, true, false)\r\n raw.forEach((child, index) => {\r\n map.set(`child_${index}`, child)\r\n })\r\n return map\r\n}\r\n", "const GSAP_NAMESPACE_STORE_KEY = '__unseenco_theatre_gsap_configuredNamespace__'\r\n\r\n/** Default GSAP outline namespace segment (first path component). */\r\nexport const DEFAULT_GSAP_SHEET_OBJECT_NAMESPACE = 'GSAP'\r\n\r\nexport function setConfiguredGsapSheetObjectNamespace(namespace: string): void {\r\n const g = globalThis as typeof globalThis & {\r\n [GSAP_NAMESPACE_STORE_KEY]?: string\r\n }\r\n g[GSAP_NAMESPACE_STORE_KEY] = namespace.trim()\r\n}\r\n\r\nexport function getConfiguredGsapSheetObjectNamespace(): string {\r\n const g = globalThis as typeof globalThis & {\r\n [GSAP_NAMESPACE_STORE_KEY]?: string\r\n }\r\n return g[GSAP_NAMESPACE_STORE_KEY] ?? DEFAULT_GSAP_SHEET_OBJECT_NAMESPACE\r\n}\r\n\r\n/** First segment of a Theatre slashed object key (`foo / bar` \u2192 `foo`). */\r\nexport function firstSlashedPathSegment(objectKey: string): string {\r\n return objectKey.split(/\\s*\\/\\s*/g)[0]?.trim() ?? objectKey.trim()\r\n}\r\n\r\n/**\r\n * Whether a sheet object key belongs to the configured GSAP proxy namespace.\r\n * Keys are sanitised by Theatre as `Namespace / label`, not `Namespace/label`.\r\n */\r\nexport function isGsapSheetObjectKey(objectKey: string): boolean {\r\n const namespace = getConfiguredGsapSheetObjectNamespace()\r\n return firstSlashedPathSegment(objectKey) === namespace\r\n}\r\n", "import type {GsapTimelineChildClip} from '@unseenco/theatre-core/projects/store/types/SheetState_Historic'\r\nimport {gsapClipSyncProgress} from '@unseenco/theatre-shared/sequence/trackData'\r\nimport {applyTimelineChildTimingToGsap} from './applyTimelineChildTiming'\r\nimport {getAnimationEntryBySheetAddressKey} from './gsapAnimationRegistry'\r\nimport type {GsapAnimationRegistryEntry} from './gsapAnimationRegistry'\r\n\r\nexport type GsapClipTiming = {\r\n /** From {@link sheetObjectAddressKey} / {@link sheetObjectAddressKeyFromParts}. */\r\n sheetObjectAddressKey: string\r\n gsapAnimationId: string\r\n start: number\r\n duration: number\r\n timelineChildren?: ReadonlyArray<GsapTimelineChildClip>\r\n timelineSpan?: number\r\n}\r\n\r\ntype EnrichedClip = GsapClipTiming & {\r\n entry: GsapAnimationRegistryEntry\r\n targetKey: unknown\r\n}\r\n\r\nfunction getGsapAnimationTargetKey(\r\n animation: unknown,\r\n fallbackAnimationId: string,\r\n): unknown {\r\n const tween = animation as {targets?: () => unknown[]}\r\n const targets = tween.targets?.()\r\n if (targets && targets.length > 0) {\r\n return targets[0]\r\n }\r\n return fallbackAnimationId\r\n}\r\n\r\n/** Updates registered GSAP tween progress for each clip at `sequencePosition`. */\r\nexport function syncRegisteredGsapAnimationsForClips(\r\n sequencePosition: number,\r\n clips: ReadonlyArray<GsapClipTiming>,\r\n): void {\r\n const enriched: EnrichedClip[] = []\r\n for (const clip of clips) {\r\n const entry = getAnimationEntryBySheetAddressKey(\r\n clip.sheetObjectAddressKey,\r\n clip.gsapAnimationId,\r\n )\r\n if (!entry?.animation) continue\r\n enriched.push({\r\n ...clip,\r\n entry,\r\n targetKey: getGsapAnimationTargetKey(\r\n entry.animation,\r\n clip.gsapAnimationId,\r\n ),\r\n })\r\n }\r\n\r\n const byTarget = new Map<unknown, EnrichedClip[]>()\r\n for (const item of enriched) {\r\n const list = byTarget.get(item.targetKey) ?? []\r\n list.push(item)\r\n byTarget.set(item.targetKey, list)\r\n }\r\n\r\n for (const group of byTarget.values()) {\r\n const sorted = [...group].sort((a, b) => a.start - b.start)\r\n // Same-target clips often animate the same properties. Apply every clip's\r\n // progress in timeline order so a playhead jump cannot leave an earlier\r\n // tween at a stale partial progress that overrides a later clip.\r\n for (const clip of sorted) {\r\n const progress = gsapClipSyncProgress(sequencePosition, clip)\r\n const entry = clip.entry\r\n const animation = entry.animation as {\r\n progress?: (progress: number, suppressEvents?: boolean) => number\r\n time?: (time: number, suppressEvents?: boolean) => number\r\n }\r\n if (\r\n entry.kind === 'timeline' &&\r\n clip.timelineChildren &&\r\n clip.timelineChildren.length > 0\r\n ) {\r\n applyTimelineChildTimingToGsap(\r\n entry.animation,\r\n clip.timelineChildren,\r\n entry.timelineChildById,\r\n entry.onRebuildTimeline,\r\n )\r\n const span =\r\n clip.timelineSpan ?? readGsapTweenTimelineDuration(entry.animation)\r\n const t = progress * Math.max(span, 0.01)\r\n if (typeof animation.time === 'function') {\r\n animation.time(t, true)\r\n } else {\r\n animation.progress?.(progress, true)\r\n }\r\n } else {\r\n animation.progress?.(progress, true)\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function readGsapTweenTimelineDuration(animation: unknown): number {\r\n const tween = animation as {\r\n duration: () => number\r\n totalDuration?: () => number\r\n }\r\n const total = tween.totalDuration?.()\r\n if (typeof total === 'number' && total > 0) return total\r\n const d = tween.duration()\r\n return d > 0 ? d : 1\r\n}\r\n", "import type {\r\n GsapClipBaselineTiming,\r\n GsapClipTrack,\r\n GsapTimelineChildClip,\r\n} from '@unseenco/theatre-core/projects/store/types/SheetState_Historic'\r\nimport type {GsapAnimationRegistryEntry} from './gsapAnimationRegistry'\r\nimport {introspectGsapTimelineChildren} from './introspectGsapTimelineChildren'\r\nimport {readGsapTweenTimelineDuration} from './syncGsapClipProgress'\r\n\r\nfunction cloneTimelineChildren(\r\n children: GsapTimelineChildClip[],\r\n): GsapTimelineChildClip[] {\r\n return children.map((c) => ({...c}))\r\n}\r\n\r\nexport function buildGsapClipBaselineTiming(p: {\r\n duration: number\r\n timelineSpan?: number\r\n timelineChildren?: GsapTimelineChildClip[]\r\n}): GsapClipBaselineTiming {\r\n const duration = Math.max(p.duration, 0.01)\r\n const baseline: GsapClipBaselineTiming = {duration}\r\n if (p.timelineChildren && p.timelineChildren.length > 0) {\r\n baseline.timelineSpan = p.timelineSpan ?? duration\r\n baseline.timelineChildren = cloneTimelineChildren(p.timelineChildren)\r\n }\r\n return baseline\r\n}\r\n\r\nexport function baselineTimingFromRegistryEntry(\r\n entry: GsapAnimationRegistryEntry,\r\n): GsapClipBaselineTiming | undefined {\r\n if (entry.originalTiming) {\r\n return {\r\n duration: entry.originalTiming.duration,\r\n timelineSpan: entry.originalTiming.timelineSpan,\r\n timelineChildren: entry.originalTiming.timelineChildren\r\n ? cloneTimelineChildren(entry.originalTiming.timelineChildren)\r\n : undefined,\r\n }\r\n }\r\n if (!entry.animation) return undefined\r\n const duration =\r\n entry.defaultDuration ?? readGsapTweenTimelineDuration(entry.animation)\r\n const timelineChildren = introspectGsapTimelineChildren(entry.animation)\r\n if (timelineChildren.length > 0) {\r\n return buildGsapClipBaselineTiming({\r\n duration,\r\n timelineSpan: readGsapTweenTimelineDuration(entry.animation),\r\n timelineChildren,\r\n })\r\n }\r\n return buildGsapClipBaselineTiming({duration})\r\n}\r\n\r\nexport function resolveGsapClipBaselineTiming(\r\n track: GsapClipTrack,\r\n entry?: GsapAnimationRegistryEntry,\r\n): GsapClipBaselineTiming | undefined {\r\n if (track.baselineTiming) {\r\n return buildGsapClipBaselineTiming(track.baselineTiming)\r\n }\r\n if (entry) {\r\n return baselineTimingFromRegistryEntry(entry)\r\n }\r\n return undefined\r\n}\r\n\r\n/** Restores sequence clip timing from baseline; does not change {@link GsapClipTrack.start}. */\r\nexport function applyGsapClipBaselineToTrack(\r\n track: GsapClipTrack,\r\n baseline: GsapClipBaselineTiming,\r\n): void {\r\n track.duration = Math.max(baseline.duration, 0.01)\r\n if (baseline.timelineChildren && baseline.timelineChildren.length > 0) {\r\n track.timelineChildren = cloneTimelineChildren(baseline.timelineChildren)\r\n track.timelineSpan = Math.max(\r\n baseline.timelineSpan ?? baseline.duration,\r\n 0.01,\r\n )\r\n } else {\r\n delete track.timelineChildren\r\n delete track.timelineSpan\r\n }\r\n}\r\n\r\nfunction baselineDurationSeconds(duration: number): number {\r\n return Math.max(duration, 0.01)\r\n}\r\n\r\nfunction baselineTimelineSpanSeconds(baseline: GsapClipBaselineTiming): number {\r\n return Math.max(baseline.timelineSpan ?? baseline.duration, 0.01)\r\n}\r\n\r\nfunction trackTimelineSpanSeconds(track: GsapClipTrack): number {\r\n return Math.max(track.timelineSpan ?? track.duration, 0.01)\r\n}\r\n\r\nfunction timelineChildTimingMatches(\r\n trackChild: GsapTimelineChildClip,\r\n baselineChild: GsapTimelineChildClip,\r\n): boolean {\r\n return (\r\n trackChild.localStart === baselineChild.localStart &&\r\n trackChild.localDuration === baselineChild.localDuration\r\n )\r\n}\r\n\r\n/** True when clip duration / timeline span / child local timing differs from baseline. */\r\nexport function gsapClipTimingDeviatesFromBaseline(\r\n track: GsapClipTrack,\r\n baseline: GsapClipBaselineTiming,\r\n): boolean {\r\n if (\r\n track.duration !== baselineDurationSeconds(baseline.duration)\r\n ) {\r\n return true\r\n }\r\n\r\n const baselineChildren = baseline.timelineChildren\r\n const hasBaselineTimeline =\r\n baselineChildren !== undefined && baselineChildren.length > 0\r\n const trackChildren = track.timelineChildren\r\n const hasTrackTimeline =\r\n trackChildren !== undefined && trackChildren.length > 0\r\n\r\n if (hasBaselineTimeline !== hasTrackTimeline) {\r\n return true\r\n }\r\n\r\n if (!hasBaselineTimeline) {\r\n return false\r\n }\r\n\r\n if (trackTimelineSpanSeconds(track) !== baselineTimelineSpanSeconds(baseline)) {\r\n return true\r\n }\r\n\r\n for (const baselineChild of baselineChildren!) {\r\n const trackChild = trackChildren!.find(\r\n (c) => c.childId === baselineChild.childId,\r\n )\r\n if (!trackChild || !timelineChildTimingMatches(trackChild, baselineChild)) {\r\n return true\r\n }\r\n }\r\n\r\n return false\r\n}\r\n\r\n/** True when the given child's local timing differs from baseline for that child. */\r\nexport function gsapTimelineChildTimingDeviatesFromBaseline(\r\n track: GsapClipTrack,\r\n childId: string,\r\n baseline: GsapClipBaselineTiming,\r\n): boolean {\r\n const baselineChild = baseline.timelineChildren?.find(\r\n (c) => c.childId === childId,\r\n )\r\n const trackChild = track.timelineChildren?.find((c) => c.childId === childId)\r\n if (!baselineChild || !trackChild) {\r\n return false\r\n }\r\n return !timelineChildTimingMatches(trackChild, baselineChild)\r\n}\r\n\r\nexport function gsapClipDeviatesFromBaseline(\r\n track: GsapClipTrack,\r\n entry?: GsapAnimationRegistryEntry,\r\n): boolean {\r\n const baseline = resolveGsapClipBaselineTiming(track, entry)\r\n if (!baseline) return false\r\n return gsapClipTimingDeviatesFromBaseline(track, baseline)\r\n}\r\n\r\nexport function gsapTimelineChildDeviatesFromBaseline(\r\n track: GsapClipTrack,\r\n childId: string,\r\n entry?: GsapAnimationRegistryEntry,\r\n): boolean {\r\n const baseline = resolveGsapClipBaselineTiming(track, entry)\r\n if (!baseline) return false\r\n return gsapTimelineChildTimingDeviatesFromBaseline(track, childId, baseline)\r\n}\r\n\r\nexport function applyGsapTimelineChildBaselineToTrack(\r\n track: GsapClipTrack,\r\n childId: string,\r\n baseline: GsapClipBaselineTiming,\r\n): boolean {\r\n const baselineChild = baseline.timelineChildren?.find(\r\n (c) => c.childId === childId,\r\n )\r\n if (!baselineChild || !track.timelineChildren?.length) return false\r\n const child = track.timelineChildren.find((c) => c.childId === childId)\r\n if (!child) return false\r\n child.localStart = baselineChild.localStart\r\n child.localDuration = baselineChild.localDuration\r\n return true\r\n}\r\n", "import type SheetObject from '@unseenco/theatre-core/sheetObjects/SheetObject'\r\n\r\nexport type GsapObjectBinding = {\r\n gsapAnimationId: string\r\n defaultDuration: number\r\n}\r\n\r\nconst STORE_KEY = '__unseenco_theatre_gsap_objectBindings__'\r\n\r\nfunction addressKey(sheetObject: SheetObject): string {\r\n const a = sheetObject.address\r\n return `${a.projectId}|${a.sheetId}|${a.sheetInstanceId}|${a.objectKey}`\r\n}\r\n\r\nfunction getStore(): Map<string, GsapObjectBinding> {\r\n const g = globalThis as typeof globalThis & {\r\n [STORE_KEY]?: Map<string, GsapObjectBinding>\r\n }\r\n if (!g[STORE_KEY]) {\r\n g[STORE_KEY] = new Map()\r\n }\r\n return g[STORE_KEY]!\r\n}\r\n\r\nexport function registerGsapObjectBinding(\r\n sheetObject: SheetObject,\r\n binding: GsapObjectBinding,\r\n): void {\r\n getStore().set(addressKey(sheetObject), binding)\r\n}\r\n\r\nexport function getGsapObjectBinding(\r\n sheetObject: SheetObject,\r\n): GsapObjectBinding | undefined {\r\n return getStore().get(addressKey(sheetObject))\r\n}\r\n\r\nexport function clearGsapObjectBindingsForTests(): void {\r\n getStore().clear()\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", "import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or 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 a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n", "import isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nexport default isKey;\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", "import MapCache from './_MapCache.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nexport default memoize;\n", "import memoize from './memoize.js';\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nexport default memoizeCapped;\n", "import memoizeCapped from './_memoizeCapped.js';\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nexport default stringToPath;\n", "/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nexport default arrayMap;\n", "import Symbol from './_Symbol.js';\nimport arrayMap from './_arrayMap.js';\nimport isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default baseToString;\n", "import baseToString from './_baseToString.js';\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nexport default toString;\n", "import isArray from './isArray.js';\nimport isKey from './_isKey.js';\nimport stringToPath from './_stringToPath.js';\nimport toString from './toString.js';\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nexport default castPath;\n", "import isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default toKey;\n", "import castPath from './_castPath.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nexport default baseGet;\n", "import baseGet from './_baseGet.js';\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nexport default get;\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 overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n", "import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\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 infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n", "/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nexport default last;\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", "import type {$FixMe, $IntentionalAny} from '../types'\r\n\r\nexport default function updateDeep<S>(\r\n state: S,\r\n path: (string | number | undefined)[],\r\n reducer: (...args: $IntentionalAny[]) => $IntentionalAny,\r\n): S {\r\n if (path.length === 0) return reducer(state)\r\n return hoop(state, path as $IntentionalAny, reducer)\r\n}\r\n\r\nconst hoop = (\r\n s: $FixMe,\r\n path: (string | number)[],\r\n reducer: $FixMe,\r\n): $FixMe => {\r\n if (path.length === 0) {\r\n return reducer(s)\r\n }\r\n if (Array.isArray(s)) {\r\n let [index, ...restOfPath] = path\r\n index = parseInt(String(index), 10)\r\n if (isNaN(index)) index = 0\r\n const oldVal = s[index]\r\n const newVal = hoop(oldVal, restOfPath, reducer)\r\n if (oldVal === newVal) return s\r\n const newS = [...s]\r\n newS.splice(index, 1, newVal)\r\n return newS\r\n } else if (typeof s === 'object' && s !== null) {\r\n const [key, ...restOfPath] = path\r\n const oldVal = s[key]\r\n const newVal = hoop(oldVal, restOfPath, reducer)\r\n if (oldVal === newVal) return s\r\n const newS = {...s, [key]: newVal}\r\n return newS\r\n } else {\r\n const [key, ...restOfPath] = path\r\n\r\n return {[key]: hoop(undefined, restOfPath, reducer)}\r\n }\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 '@unseenco/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 {Atom} from '@unseenco/theatre-dataverse'\r\n\r\nconst revisionAtom = new Atom(0)\r\n\r\n/** Bumped when GSAP animations register so Studio UI can refresh menus. */\r\nexport function bumpGsapStudioRegistryRevision(): void {\r\n revisionAtom.set(revisionAtom.get() + 1)\r\n}\r\n\r\nexport const gsapStudioRegistryRevisionPointer = revisionAtom.pointer\r\n", "import type {GsapClipBaselineTiming} from '@unseenco/theatre-core/projects/store/types/SheetState_Historic'\r\nimport type SheetObject from '@unseenco/theatre-core/sheetObjects/SheetObject'\r\nimport type {\r\n ObjectAddressKey,\r\n ProjectId,\r\n SheetId,\r\n SheetInstanceId,\r\n} from '@unseenco/theatre-shared/utils/ids'\r\n\r\nconst DEFAULT_SHEET_INSTANCE_ID = 'default' as SheetInstanceId\r\nimport {buildGsapClipBaselineTiming} from './gsapClipBaseline'\r\nimport {registerGsapObjectBinding} from './gsapObjectBinding'\r\nimport {bumpGsapStudioRegistryRevision} from './gsapStudioRegistryRevision'\r\nimport {\r\n introspectGsapTimelineChildren,\r\n isGsapTimeline,\r\n linkGsapTimelineChildAnimations,\r\n} from './introspectGsapTimelineChildren'\r\nimport {readGsapTweenTimelineDuration} from './syncGsapClipProgress'\r\n\r\nconst REGISTRY_KEY = '__unseenco_theatre_gsap_animationRegistry__'\r\n\r\nexport type GsapAnimationRegistryEntry = {\r\n id: string\r\n label: string\r\n /** Runtime tween; typed in `@unseenco/theatre-gsap`. */\r\n animation?: unknown\r\n sheetObject?: SheetObject\r\n defaultDuration?: number\r\n kind?: 'tween' | 'timeline'\r\n timelineChildById?: Map<string, unknown>\r\n onRebuildTimeline?: () => unknown\r\n /** Introspected timing at registration; fallback when clip has no baselineTiming. */\r\n originalTiming?: GsapClipBaselineTiming\r\n}\r\n\r\ntype RegistryStore = {\r\n bySheetAddress: Map<string, Map<string, GsapAnimationRegistryEntry>>\r\n}\r\n\r\nexport type SheetObjectAddressKeyParts = {\r\n projectId: ProjectId\r\n sheetId: SheetId\r\n objectKey: ObjectAddressKey\r\n sheetInstanceId?: SheetInstanceId\r\n}\r\n\r\nexport function sheetObjectAddressKeyFromParts(\r\n address: SheetObjectAddressKeyParts,\r\n): string {\r\n const sheetInstanceId = address.sheetInstanceId ?? DEFAULT_SHEET_INSTANCE_ID\r\n return `${address.projectId}|${address.sheetId}|${sheetInstanceId}|${address.objectKey}`\r\n}\r\n\r\nexport function sheetObjectAddressKey(sheetObject: SheetObject): string {\r\n return sheetObjectAddressKeyFromParts(sheetObject.address)\r\n}\r\n\r\nfunction getStore(): RegistryStore {\r\n const g = globalThis as typeof globalThis & {\r\n [REGISTRY_KEY]?: RegistryStore\r\n }\r\n if (!g[REGISTRY_KEY]) {\r\n g[REGISTRY_KEY] = {\r\n bySheetAddress: new Map(),\r\n }\r\n }\r\n return g[REGISTRY_KEY]!\r\n}\r\n\r\nfunction getSheetEntryMap(\r\n sheetKey: string,\r\n): Map<string, GsapAnimationRegistryEntry> {\r\n const store = getStore()\r\n let map = store.bySheetAddress.get(sheetKey)\r\n if (!map) {\r\n map = new Map()\r\n store.bySheetAddress.set(sheetKey, map)\r\n }\r\n return map\r\n}\r\n\r\nexport function registerAnimationInRegistry(\r\n entry: GsapAnimationRegistryEntry,\r\n): void {\r\n const kind =\r\n entry.animation && isGsapTimeline(entry.animation) ? 'timeline' : 'tween'\r\n const timelineChildById =\r\n kind === 'timeline' && entry.animation\r\n ? linkGsapTimelineChildAnimations(entry.animation)\r\n : undefined\r\n const defaultDuration =\r\n entry.defaultDuration ?? readGsapTweenTimelineDuration(entry.animation)\r\n const timelineChildren =\r\n kind === 'timeline' && entry.animation\r\n ? introspectGsapTimelineChildren(entry.animation)\r\n : []\r\n const originalTiming =\r\n entry.originalTiming ??\r\n (entry.animation\r\n ? buildGsapClipBaselineTiming({\r\n duration: defaultDuration,\r\n ...(timelineChildren.length > 0\r\n ? {\r\n timelineSpan: readGsapTweenTimelineDuration(entry.animation),\r\n timelineChildren,\r\n }\r\n : {}),\r\n })\r\n : undefined)\r\n const normalized: GsapAnimationRegistryEntry = {\r\n ...entry,\r\n kind,\r\n timelineChildById,\r\n originalTiming,\r\n }\r\n\r\n if (entry.sheetObject) {\r\n const sheetKey = sheetObjectAddressKey(entry.sheetObject)\r\n getSheetEntryMap(sheetKey).set(entry.id, normalized)\r\n registerGsapObjectBinding(entry.sheetObject, {\r\n gsapAnimationId: entry.id,\r\n defaultDuration,\r\n })\r\n }\r\n\r\n bumpGsapStudioRegistryRevision()\r\n}\r\n\r\nexport function getAnimationEntryForAddress(\r\n address: SheetObjectAddressKeyParts,\r\n animationId?: string,\r\n): GsapAnimationRegistryEntry | undefined {\r\n const animId = animationId ?? address.objectKey\r\n const sheetKey = sheetObjectAddressKeyFromParts(address)\r\n return getStore().bySheetAddress.get(sheetKey)?.get(animId)\r\n}\r\n\r\nexport function getAnimationEntry(\r\n sheetObject: SheetObject,\r\n animationId?: string,\r\n): GsapAnimationRegistryEntry | undefined {\r\n return getAnimationEntryForAddress(\r\n sheetObject.address,\r\n animationId ?? sheetObject.address.objectKey,\r\n )\r\n}\r\n\r\n/** Default registry entry for a GSAP sheet object (id defaults to `objectKey`). */\r\nexport function getAnimationEntryForSheetObject(\r\n sheetObject: SheetObject,\r\n): GsapAnimationRegistryEntry | undefined {\r\n return getAnimationEntry(sheetObject)\r\n}\r\n\r\nexport function getAnimationEntryBySheetAddressKey(\r\n sheetObjectAddressKey: string,\r\n animationId: string,\r\n): GsapAnimationRegistryEntry | undefined {\r\n return getStore().bySheetAddress.get(sheetObjectAddressKey)?.get(animationId)\r\n}\r\n\r\n/** @internal Prefer sheet-scoped lookup; scans all sheets when id alone is known. */\r\nexport function getAnimationEntryById(\r\n id: string,\r\n): GsapAnimationRegistryEntry | undefined {\r\n for (const byAnim of getStore().bySheetAddress.values()) {\r\n const entry = byAnim.get(id)\r\n if (entry) return entry\r\n }\r\n return undefined\r\n}\r\n\r\nexport function listAnimationEntries(): GsapAnimationRegistryEntry[] {\r\n const entries: GsapAnimationRegistryEntry[] = []\r\n for (const byAnim of getStore().bySheetAddress.values()) {\r\n entries.push(...byAnim.values())\r\n }\r\n return entries\r\n}\r\n\r\nexport function clearAnimationRegistryForTests(): void {\r\n getStore().bySheetAddress.clear()\r\n}\r\n", "import type {OutlineNamespaceConfig} from '@unseenco/theatre-shared/utils/outlineNamespaces'\r\nimport {setConfiguredGsapSheetObjectNamespace} from '@unseenco/theatre-shared/gsap/gsapSheetObjectKey'\r\n\r\nexport type TheatreGsapConfig = {\r\n /** Outline namespace segment for GSAP proxy objects (default `GSAP`). */\r\n namespace?: string\r\n /** Applied to each sheet when the first GSAP object is registered on it. */\r\n outlineNamespace?: OutlineNamespaceConfig\r\n}\r\n\r\nlet activeConfig: TheatreGsapConfig = {\r\n namespace: 'GSAP',\r\n outlineNamespace: {defaultCollapsed: false},\r\n}\r\n\r\nsetConfiguredGsapSheetObjectNamespace(activeConfig.namespace!)\r\n\r\nexport function configureTheatreGsap(config: TheatreGsapConfig): {\r\n reset: () => void\r\n} {\r\n const prev = activeConfig\r\n activeConfig = {\r\n namespace: config.namespace ?? prev.namespace ?? 'GSAP',\r\n outlineNamespace: config.outlineNamespace ?? prev.outlineNamespace,\r\n }\r\n setConfiguredGsapSheetObjectNamespace(activeConfig.namespace ?? 'GSAP')\r\n return {\r\n reset() {\r\n activeConfig = prev\r\n },\r\n }\r\n}\r\n\r\nexport function getTheatreGsapConfig(): TheatreGsapConfig {\r\n return activeConfig\r\n}\r\n", "import type SheetObject from '@unseenco/theatre-core/sheetObjects/SheetObject'\r\nimport type {GsapTweenLike} from './gsapTypes'\r\nimport {\r\n clearAnimationRegistryForTests as clearSharedAnimationRegistryForTests,\r\n getAnimationEntry as getSharedAnimationEntry,\r\n getAnimationEntryForSheetObject as getSharedAnimationEntryForSheetObject,\r\n listAnimationEntries as listSharedAnimationEntries,\r\n registerAnimationInRegistry as registerSharedAnimationInRegistry,\r\n} from '@unseenco/theatre-shared/gsap/gsapAnimationRegistry'\r\nimport {readGsapTweenTimelineDuration} from '@unseenco/theatre-shared/gsap/syncGsapClipProgress'\r\n\r\nexport type GsapAnimationRegistryEntry = {\r\n id: string\r\n label: string\r\n animation: GsapTweenLike\r\n sheetObject?: SheetObject\r\n defaultDuration?: number\r\n onRebuildTimeline?: () => GsapTweenLike\r\n}\r\n\r\nexport function registerAnimationInRegistry(\r\n entry: GsapAnimationRegistryEntry,\r\n): void {\r\n registerSharedAnimationInRegistry({\r\n ...entry,\r\n animation: entry.animation,\r\n defaultDuration:\r\n entry.defaultDuration ??\r\n defaultClipDuration(entry.animation as GsapTweenLike),\r\n onRebuildTimeline: entry.onRebuildTimeline,\r\n })\r\n}\r\n\r\nfunction defaultClipDuration(animation: GsapTweenLike): number {\r\n return readGsapTweenTimelineDuration(animation)\r\n}\r\n\r\nfunction toPackageEntry(\r\n entry: ReturnType<typeof getSharedAnimationEntryForSheetObject>,\r\n): GsapAnimationRegistryEntry | undefined {\r\n if (!entry || !entry.animation) return undefined\r\n return {\r\n id: entry.id,\r\n label: entry.label,\r\n animation: entry.animation as GsapTweenLike,\r\n sheetObject: entry.sheetObject,\r\n defaultDuration: entry.defaultDuration,\r\n onRebuildTimeline: entry.onRebuildTimeline as\r\n | (() => GsapTweenLike)\r\n | undefined,\r\n }\r\n}\r\n\r\nexport function getAnimationEntry(\r\n sheetObject: SheetObject,\r\n animationId?: string,\r\n): GsapAnimationRegistryEntry | undefined {\r\n return toPackageEntry(getSharedAnimationEntry(sheetObject, animationId))\r\n}\r\n\r\nexport function getAnimationEntryById(\r\n id: string,\r\n): GsapAnimationRegistryEntry | undefined {\r\n return toPackageEntry(\r\n listSharedAnimationEntries().find((entry) => entry.id === id),\r\n )\r\n}\r\n\r\nexport function getAnimationEntryForSheetObject(\r\n sheetObject: SheetObject,\r\n): GsapAnimationRegistryEntry | undefined {\r\n return toPackageEntry(getSharedAnimationEntryForSheetObject(sheetObject))\r\n}\r\n\r\nexport function listAnimationEntries(): GsapAnimationRegistryEntry[] {\r\n return listSharedAnimationEntries()\r\n .filter((e): e is typeof e & {animation: GsapTweenLike} => !!e.animation)\r\n .map((entry) => ({\r\n id: entry.id,\r\n label: entry.label,\r\n animation: entry.animation as GsapTweenLike,\r\n sheetObject: entry.sheetObject,\r\n }))\r\n}\r\n\r\nexport function clearAnimationRegistryForTests(): void {\r\n clearSharedAnimationRegistryForTests()\r\n}\r\n", "import {validateAndSanitiseSlashedPathOrThrow} from '@unseenco/theatre-shared/utils/slashedPaths'\r\nimport type {SheetId} from '@unseenco/theatre-shared/utils/ids'\r\n\r\nexport type OutlineNamespaceConfig = {\r\n defaultCollapsed?: boolean\r\n collapsed?: boolean\r\n}\r\n\r\nexport function formatOutlineNamespacePathKey(pathSegments: string[]): string {\r\n return pathSegments.join(' / ')\r\n}\r\n\r\nexport function parseOutlineNamespacePath(\r\n namespacePath: string,\r\n fnName: string,\r\n): string[] {\r\n return validateAndSanitiseSlashedPathOrThrow(namespacePath, fnName).split(\r\n /\\s*\\/\\s*/g,\r\n )\r\n}\r\n\r\nexport function getOutlineNamespaceItemKey(\r\n sheetId: SheetId,\r\n pathSegments: string[],\r\n): string {\r\n return `namespace:${sheetId}:${pathSegments.join('/')}`\r\n}\r\n", "export {attachGsapSequenceBridge} from '@unseenco/theatre-core'\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["ref", "source", "root", "Symbol", "objectProto", "nativeObjectToString", "symToStringTag", "funcProto", "objectProto", "funcToString", "hasOwnProperty", "objectProto", "hasOwnProperty", "objectProto", "hasOwnProperty", "HASH_UNDEFINED", "Map", "INFINITY", "funcProto", "objectProto", "funcToString", "hasOwnProperty", "root", "state", "pushCollector", "popCollector", "startIgnoringDependencies", "stopIgnoringDependencies", "reportResolutionStart", "reportResolutionEnd", "root", "state", "ref", "effect", "memo", "value", "setValue", "getValue", "scope", "sub", "getValue", "scope", "pointer", "scope", "getValue", "getStore", "getStore", "registerAnimationInRegistry", "getAnimationEntry", "getAnimationEntryForSheetObject", "listAnimationEntries", "registerAnimationInRegistry"]
|
|
3
|
+
"sources": ["../src/registerGsapAnimation.ts", "../../../theatre/shared/src/utils/errors.ts", "../../../theatre/shared/src/_logger/logger.ts", "../../../theatre/shared/src/logger.ts", "../../../theatre/shared/src/globalVariableNames.ts", "../../../theatre/shared/src/notify.ts", "../../../theatre/shared/src/utils/slashedPaths.ts", "../../../theatre/shared/src/gsap/buildGsapSheetObjectKey.ts", "../../../theatre/shared/src/gsap/introspectGsapTimelineChildren.ts", "../../../theatre/shared/src/gsap/gsapAnimationLabel.ts", "../../../theatre/shared/src/gsap/gsapSheetObjectKey.ts", "../../../theatre/shared/src/gsap/syncGsapClipProgress.ts", "../../../theatre/shared/src/gsap/gsapClipBaseline.ts", "../../../theatre/shared/src/gsap/gsapObjectBinding.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/isSymbol.js", "../../../node_modules/lodash-es/_isKey.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/memoize.js", "../../../node_modules/lodash-es/_memoizeCapped.js", "../../../node_modules/lodash-es/_stringToPath.js", "../../../node_modules/lodash-es/_arrayMap.js", "../../../node_modules/lodash-es/_baseToString.js", "../../../node_modules/lodash-es/toString.js", "../../../node_modules/lodash-es/_castPath.js", "../../../node_modules/lodash-es/_toKey.js", "../../../node_modules/lodash-es/_baseGet.js", "../../../node_modules/lodash-es/get.js", "../../../node_modules/lodash-es/_overArg.js", "../../../node_modules/lodash-es/_getPrototype.js", "../../../node_modules/lodash-es/isPlainObject.js", "../../../node_modules/lodash-es/last.js", "../../dataverse/src/pointer.ts", "../../dataverse/src/utils/updateDeep.ts", "../../dataverse/src/utils/Stack.ts", "../../dataverse/src/prism/discoveryMechanism.ts", "../../dataverse/src/prism/prism.ts", "../../dataverse/src/Atom.ts", "../../../theatre/shared/src/gsap/gsapStudioRegistryRevision.ts", "../../../theatre/shared/src/gsap/gsapAnimationRegistry.ts", "../../../theatre/shared/src/sheets/pageScrollContext.ts", "../src/gsapScrollTriggerPlugin.ts", "../src/config.ts", "../src/animationRegistry.ts", "../../../theatre/shared/src/utils/outlineNamespaces.ts", "../src/gsapTickerRafBridge.ts", "../src/registerGsapScrollTrigger.ts", "../../../theatre/shared/src/gsap/scrollTriggerGuards.ts", "../../../theatre/shared/src/gsap/scrollTriggerLayout.ts", "../../../theatre/shared/src/sheets/remotePageScrollMetrics.ts", "../../../theatre/shared/src/gsap/extractScrollTriggerLayout.ts", "../../../theatre/shared/src/gsap/scrollTriggerRegistry.ts", "../src/attachTheatrePageScroll.ts", "../../../theatre/shared/src/gsap/scrollTriggerGlobal.ts", "../../../theatre/shared/src/gsap/refreshScrollTriggerLayoutsForSheet.ts", "../src/registerAllGsapScrollTriggers.ts", "../src/attachGsapSequenceBridge.ts"],
|
|
4
|
+
"sourcesContent": ["import type {ISheet, ISheetObject} from '@unseenco/theatre-core'\r\nimport type {GsapTweenLike} from './gsapTypes'\r\nimport {privateAPI} from '@unseenco/theatre-core/privateAPIs'\r\nimport {buildGsapSheetObjectKey} from '@unseenco/theatre-shared/gsap/buildGsapSheetObjectKey'\r\nimport {resolveGsapAnimationRegistrationLabel} from '@unseenco/theatre-shared/gsap/gsapAnimationLabel'\r\nimport {getAnimationEntry} from '@unseenco/theatre-shared/gsap/gsapAnimationRegistry'\r\nimport {getTheatreGsapConfig} from './config'\r\nimport {registerAnimationInRegistry} from './animationRegistry'\r\nimport {formatOutlineNamespacePathKey} from '@unseenco/theatre-shared/utils/outlineNamespaces'\r\nimport {scheduleGsapTickerRafWarningCheck} from './gsapTickerRafBridge'\r\n\r\nexport type RegisterGsapAnimationOptions = {\r\n /**\r\n * Theatre object label (shown after the `GSAP/` namespace). When omitted,\r\n * uses the tween/timeline `vars.id` if set.\r\n */\r\n label?: string\r\n /** Override namespace from {@link configureTheatreGsap}. */\r\n namespace?: string\r\n /**\r\n * Stable id for this animation on the sheet object. When omitted, defaults to\r\n * the sanitised sheet object key (e.g. `GSAP / Panel show`).\r\n * Re-registering with the same id updates the registry entry in place.\r\n */\r\n id?: string\r\n /** Clip length when adding to the sequence (defaults to tween duration). */\r\n defaultDuration?: number\r\n /** Rebuild the timeline when native child timing edits fail. */\r\n onRebuildTimeline?: () => GsapTweenLike\r\n}\r\n\r\nexport type RegisterGsapAnimationResult = {\r\n id: string\r\n sheetObject: ISheetObject<{}>\r\n}\r\n\r\n/**\r\n * Registers a GSAP tween for Theatre sequence bridging and creates an outline\r\n * proxy object under `GSAP/<label>` (namespace configurable).\r\n *\r\n * The animation is paused immediately so Theatre can drive progress.\r\n */\r\nexport function registerGsapAnimation(\r\n animation: GsapTweenLike,\r\n sheet: ISheet,\r\n options: RegisterGsapAnimationOptions,\r\n): RegisterGsapAnimationResult {\r\n const config = getTheatreGsapConfig()\r\n const namespace = options.namespace ?? config.namespace ?? 'GSAP'\r\n const label = resolveGsapAnimationRegistrationLabel(animation, options.label)\r\n const objectKey = buildGsapSheetObjectKey(namespace, label)\r\n const id = options.id ?? objectKey\r\n\r\n animation.pause()\r\n\r\n const sheetObjectPublic = sheet.object(objectKey, {}, {reconfigure: false})\r\n const sheetObjectInternal = privateAPI(sheetObjectPublic)\r\n\r\n const existing = getAnimationEntry(sheetObjectInternal, id)\r\n\r\n if (config.outlineNamespace && !existing) {\r\n privateAPI(sheet).template.setOutlineNamespaceConfig(\r\n formatOutlineNamespacePathKey([namespace]),\r\n config.outlineNamespace,\r\n )\r\n }\r\n\r\n registerAnimationInRegistry({\r\n id,\r\n label,\r\n animation,\r\n sheetObject: sheetObjectInternal,\r\n defaultDuration:\r\n options.defaultDuration ??\r\n (sheet.getSequenceMode() === 'page' ? 10 : undefined),\r\n onRebuildTimeline: options.onRebuildTimeline,\r\n })\r\n\r\n scheduleGsapTickerRafWarningCheck()\r\n\r\n return {id, sheetObject: sheetObjectPublic}\r\n}\r\n", "/**\r\n * All errors thrown to end-users should be an instance of this class.\r\n */\r\nexport class TheatreError extends Error {}\r\n\r\n/**\r\n * If an end-user provided an invalid argument to a public API, the error thrown\r\n * should be an instance of this class.\r\n */\r\nexport class InvalidArgumentError extends TheatreError {}\r\n", "/** @public configuration type */\r\nexport interface ITheatreLogger {\r\n error(level: ITheatreLogMeta, message: string, args?: Loggable): void\r\n warn(level: ITheatreLogMeta, message: string, args?: Loggable): void\r\n debug(level: ITheatreLogMeta, message: string, args?: Loggable): void\r\n trace(level: ITheatreLogMeta, message: string, args?: Loggable): void\r\n}\r\n\r\ntype ITheatreLogMeta = Readonly<{\r\n audience: 'public' | 'dev' | 'internal'\r\n category: 'general' | 'todo' | 'troubleshooting'\r\n level: TheatreLoggerLevel\r\n}>\r\n\r\n/** @public configuration type */\r\nexport interface ITheatreConsoleLogger {\r\n /** ERROR level logs */\r\n error(message: string, ...args: any[]): void\r\n /** WARN level logs */\r\n warn(message: string, ...args: any[]): void\r\n /** DEBUG level logs */\r\n info(message: string, ...args: any[]): void\r\n /** TRACE level logs */\r\n debug(message: string, ...args: any[]): void\r\n}\r\n\r\n/**\r\n * \"Downgraded\" {@link ILogger} for passing down to utility functions.\r\n *\r\n * A util logger is usually back by some specific {@link _Audience}.\r\n */\r\nexport interface IUtilLogger {\r\n /** Usually equivalent to `console.error`. */\r\n error(message: string, args?: object): void\r\n /** Usually equivalent to `console.warn`. */\r\n warn(message: string, args?: object): void\r\n /** Usually equivalent to `console.info`. */\r\n debug(message: string, args?: object): void\r\n /** Usually equivalent to `console.debug`. */\r\n trace(message: string, args?: object): void\r\n named(name: string, key?: string): IUtilLogger\r\n}\r\n\r\ntype Loggable = Record<string, any>\r\ntype LogFn = (message: string, args?: Loggable) => void\r\n/**\r\n * Allow for the arguments to only be computed if the level is included.\r\n * If the level is not included, then the fn will still be passed to the filtered\r\n * function.\r\n */\r\ntype LazyLogFn = (message: string, args: () => Loggable) => void\r\n\r\nfunction lazy(f: LogFn): LazyLogFn {\r\n return function lazyLogIncluded(m, lazyArg) {\r\n return f(m, lazyArg())\r\n }\r\n}\r\n\r\nexport type _LogFns = Readonly<\r\n {\r\n [P in keyof typeof LEVELS]: LogFn\r\n }\r\n>\r\n\r\nexport type _LazyLogFns = Readonly<\r\n {\r\n [P in keyof typeof LEVELS]: LazyLogFn\r\n }\r\n>\r\n\r\n/** Internal library logger\r\n * TODO document these fns\r\n */\r\nexport interface ILogger extends _LogFns {\r\n named(name: string, key?: string | number): ILogger\r\n lazy: _LazyLogFns\r\n readonly utilFor: {\r\n internal(): IUtilLogger\r\n dev(): IUtilLogger\r\n public(): IUtilLogger\r\n }\r\n}\r\n\r\nexport type ITheatreLoggerConfig =\r\n | /** default {@link console} */\r\n 'console'\r\n | {\r\n type: 'console'\r\n /** default `true` */\r\n style?: boolean\r\n /** default {@link console} */\r\n console?: ITheatreConsoleLogger\r\n }\r\n | {\r\n type: 'named'\r\n named(names: string[]): ITheatreLogger\r\n }\r\n | {\r\n type: 'keyed'\r\n keyed(\r\n nameAndKeys: {\r\n name: string\r\n key?: string | number\r\n }[],\r\n ): ITheatreLogger\r\n }\r\n\r\nexport type ITheatreLogSource = {names: {name: string; key?: number | string}[]}\r\n\r\nexport type ITheatreLogIncludes = {\r\n /**\r\n * General information max level.\r\n * e.g. `Project imported might be corrupted`\r\n */\r\n min?: TheatreLoggerLevel\r\n /**\r\n * Include logs meant for developers using Theatre.js\r\n * e.g. `Created new project 'Abc' with options {...}`\r\n *\r\n * defaults to `true` if `internal: true` or defaults to `false`.\r\n */\r\n dev?: boolean\r\n /**\r\n * Include logs meant for internal development of Theatre.js\r\n * e.g. `Migrated project 'Abc' { duration_ms: 34, from_version: 1, to_version: 3, imported_settings: false }`\r\n *\r\n * defaults to `false`\r\n */\r\n internal?: boolean\r\n}\r\n\r\nexport type ITheatreLoggingConfig = ITheatreLogIncludes & {\r\n include?: (source: ITheatreLogSource) => ITheatreLogIncludes\r\n consoleStyle?: boolean\r\n}\r\n\r\n/** @internal */\r\nenum _Category {\r\n GENERAL = 1 << 0,\r\n TODO = 1 << 1,\r\n TROUBLESHOOTING = 1 << 2,\r\n}\r\n\r\n/** @internal */\r\nenum _Audience {\r\n /** Logs for developers of Theatre.js */\r\n INTERNAL = 1 << 3,\r\n /** Logs for developers using Theatre.js */\r\n DEV = 1 << 4,\r\n /** Logs for users of the app using Theatre.js */\r\n PUBLIC = 1 << 5,\r\n}\r\n\r\nexport enum TheatreLoggerLevel {\r\n TRACE = 1 << 6,\r\n DEBUG = 1 << 7,\r\n WARN = 1 << 8,\r\n ERROR = 1 << 9,\r\n}\r\n\r\n/**\r\n * @internal Theatre.js internal \"dev\" levels are odd numbers\r\n *\r\n * You can check if a level is odd quickly by doing `level & 1 === 1`\r\n */\r\nexport enum _LoggerLevel {\r\n /** The highest logging level number. */\r\n ERROR_PUBLIC = TheatreLoggerLevel.ERROR |\r\n _Audience.PUBLIC |\r\n _Category.GENERAL,\r\n ERROR_DEV = TheatreLoggerLevel.ERROR | _Audience.DEV | _Category.GENERAL,\r\n /** @internal this was an unexpected event */\r\n _HMM = TheatreLoggerLevel.ERROR |\r\n _Audience.INTERNAL |\r\n _Category.TROUBLESHOOTING,\r\n _TODO = TheatreLoggerLevel.ERROR | _Audience.INTERNAL | _Category.TODO,\r\n _ERROR = TheatreLoggerLevel.ERROR | _Audience.INTERNAL | _Category.GENERAL,\r\n WARN_PUBLIC = TheatreLoggerLevel.WARN | _Audience.PUBLIC | _Category.GENERAL,\r\n WARN_DEV = TheatreLoggerLevel.WARN | _Audience.DEV | _Category.GENERAL,\r\n /** @internal surface this in this moment, but it probably shouldn't be left in the code after debugging. */\r\n _KAPOW = TheatreLoggerLevel.WARN |\r\n _Audience.INTERNAL |\r\n _Category.TROUBLESHOOTING,\r\n _WARN = TheatreLoggerLevel.WARN | _Audience.INTERNAL | _Category.GENERAL,\r\n DEBUG_DEV = TheatreLoggerLevel.DEBUG | _Audience.DEV | _Category.GENERAL,\r\n /** @internal debug logs for implementation details */\r\n _DEBUG = TheatreLoggerLevel.DEBUG | _Audience.INTERNAL | _Category.GENERAL,\r\n /** trace logs like when the project is saved */\r\n TRACE_DEV = TheatreLoggerLevel.TRACE | _Audience.DEV | _Category.GENERAL,\r\n /**\r\n * The lowest logging level number.\r\n * @internal trace logs for implementation details\r\n */\r\n _TRACE = TheatreLoggerLevel.TRACE | _Audience.INTERNAL | _Category.GENERAL,\r\n}\r\n\r\nconst LEVELS = {\r\n _hmm: getLogMeta(_LoggerLevel._HMM),\r\n _todo: getLogMeta(_LoggerLevel._TODO),\r\n _error: getLogMeta(_LoggerLevel._ERROR),\r\n errorDev: getLogMeta(_LoggerLevel.ERROR_DEV),\r\n errorPublic: getLogMeta(_LoggerLevel.ERROR_PUBLIC),\r\n _kapow: getLogMeta(_LoggerLevel._KAPOW),\r\n _warn: getLogMeta(_LoggerLevel._WARN),\r\n warnDev: getLogMeta(_LoggerLevel.WARN_DEV),\r\n warnPublic: getLogMeta(_LoggerLevel.WARN_PUBLIC),\r\n _debug: getLogMeta(_LoggerLevel._DEBUG),\r\n debugDev: getLogMeta(_LoggerLevel.DEBUG_DEV),\r\n _trace: getLogMeta(_LoggerLevel._TRACE),\r\n traceDev: getLogMeta(_LoggerLevel.TRACE_DEV),\r\n}\r\n\r\nfunction getLogMeta(level: _LoggerLevel): ITheatreLogMeta {\r\n return Object.freeze({\r\n audience: hasFlag(level, _Audience.INTERNAL)\r\n ? 'internal'\r\n : hasFlag(level, _Audience.DEV)\r\n ? 'dev'\r\n : 'public',\r\n category: hasFlag(level, _Category.TROUBLESHOOTING)\r\n ? 'troubleshooting'\r\n : hasFlag(level, _Category.TODO)\r\n ? 'todo'\r\n : 'general',\r\n level:\r\n // I think this is equivalent... but I'm not using it until we have tests.\r\n // this code won't really impact performance much anyway, since it's just computed once\r\n // up front.\r\n // level &\r\n // (TheatreLoggerLevel.TRACE |\r\n // TheatreLoggerLevel.DEBUG |\r\n // TheatreLoggerLevel.WARN |\r\n // TheatreLoggerLevel.ERROR),\r\n hasFlag(level, TheatreLoggerLevel.ERROR)\r\n ? TheatreLoggerLevel.ERROR\r\n : hasFlag(level, TheatreLoggerLevel.WARN)\r\n ? TheatreLoggerLevel.WARN\r\n : hasFlag(level, TheatreLoggerLevel.DEBUG)\r\n ? TheatreLoggerLevel.DEBUG\r\n : // no other option\r\n TheatreLoggerLevel.TRACE,\r\n })\r\n}\r\n\r\n/**\r\n * This is a helper function to determine whether the logger level has a bit flag set.\r\n *\r\n * Flags are interesting, because they give us an opportunity to very easily set up filtering\r\n * based on category and level. This is not available from public api, yet, but it's a good\r\n * start.\r\n */\r\nfunction hasFlag(level: _LoggerLevel, flag: number): boolean {\r\n return (level & flag) === flag\r\n}\r\n\r\n/**\r\n * @internal\r\n *\r\n * You'd think max, means number \"max\", but since we use this system of bit flags,\r\n * we actually need to go the other way, with comparisons being math less than.\r\n *\r\n * NOTE: Keep this in the same file as {@link _Audience} to ensure basic compilers\r\n * can inline the enum values.\r\n */\r\nfunction shouldLog(\r\n includes: Required<ITheatreLogIncludes>,\r\n level: _LoggerLevel,\r\n) {\r\n return (\r\n ((level & _Audience.PUBLIC) === _Audience.PUBLIC\r\n ? true\r\n : (level & _Audience.DEV) === _Audience.DEV\r\n ? includes.dev\r\n : (level & _Audience.INTERNAL) === _Audience.INTERNAL\r\n ? includes.internal\r\n : false) && includes.min <= level\r\n )\r\n}\r\n\r\nexport {shouldLog as _loggerShouldLog}\r\n\r\ntype InternalLoggerStyleRef = {\r\n italic?: RegExp\r\n bold?: RegExp\r\n color?: (name: string) => string\r\n collapseOnRE: RegExp\r\n cssMemo: Map<string, string>\r\n css(this: InternalLoggerStyleRef, name: string): string\r\n collapsed(this: InternalLoggerStyleRef, name: string): string\r\n}\r\n\r\ntype InternalLoggerRef = {\r\n loggingConsoleStyle: boolean\r\n loggerConsoleStyle: boolean\r\n includes: Required<ITheatreLogIncludes>\r\n filtered: (\r\n this: ITheatreLogSource,\r\n level: _LoggerLevel,\r\n message: string,\r\n args?: Loggable | (() => Loggable),\r\n ) => void\r\n include: (obj: ITheatreLogSource) => ITheatreLogIncludes\r\n create: (obj: ITheatreLogSource) => ILogger\r\n creatExt: (obj: ITheatreLogSource) => ITheatreLogger\r\n style: InternalLoggerStyleRef\r\n named(\r\n this: InternalLoggerRef,\r\n parent: ITheatreLogSource,\r\n name: string,\r\n key?: number | string,\r\n ): ILogger\r\n}\r\n\r\nconst DEFAULTS: InternalLoggerRef = {\r\n loggingConsoleStyle: true,\r\n loggerConsoleStyle: true,\r\n includes: Object.freeze({\r\n internal: false,\r\n dev: false,\r\n min: TheatreLoggerLevel.WARN,\r\n }),\r\n filtered: function defaultFiltered() {},\r\n include: function defaultInclude() {\r\n return {}\r\n },\r\n create: null!,\r\n creatExt: null!,\r\n named(this: InternalLoggerRef, parent, name, key) {\r\n return this.create({\r\n names: [...parent.names, {name, key}],\r\n })\r\n },\r\n style: {\r\n bold: undefined, // /Service$/\r\n italic: undefined, // /Model$/\r\n cssMemo: new Map<string, string>([\r\n // handle empty names so we don't have to check for\r\n // name.length > 0 during this.css('')\r\n ['', ''],\r\n // bring a specific override\r\n // [\"Marker\", \"color:#aea9ff;font-size:0.75em;text-transform:uppercase\"]\r\n ]),\r\n collapseOnRE: /[a-z- ]+/g,\r\n color: undefined,\r\n // create collapsed name\r\n // insert collapsed name into cssMemo with original's style\r\n collapsed(this, name) {\r\n if (name.length < 5) return name\r\n const collapsed = name.replace(this.collapseOnRE, '')\r\n if (!this.cssMemo.has(collapsed)) {\r\n this.cssMemo.set(collapsed, this.css(name))\r\n }\r\n return collapsed\r\n },\r\n css(this, name): string {\r\n const found = this.cssMemo.get(name)\r\n if (found) return found\r\n let css = `color:${\r\n this.color?.(name) ??\r\n `hsl(${\r\n (name.charCodeAt(0) + name.charCodeAt(name.length - 1)) % 360\r\n }, 100%, 60%)`\r\n }`\r\n if (this.bold?.test(name)) {\r\n css += ';font-weight:600'\r\n }\r\n if (this.italic?.test(name)) {\r\n css += ';font-style:italic'\r\n }\r\n this.cssMemo.set(name, css)\r\n return css\r\n },\r\n },\r\n}\r\n\r\n/** @internal */\r\nexport type ITheatreInternalLogger = {\r\n configureLogger(config: ITheatreLoggerConfig): void\r\n configureLogging(config: ITheatreLoggingConfig): void\r\n getLogger(): ILogger\r\n}\r\n\r\nexport type ITheatreInternalLoggerOptions = {\r\n _error?: (message: string, args?: object) => void\r\n _debug?: (message: string, args?: object) => void\r\n}\r\n\r\nexport function createTheatreInternalLogger(\r\n useConsole: ITheatreConsoleLogger = console,\r\n // Not yet, used, but good pattern to have in case we want to log something\r\n // or report something interesting.\r\n _options: ITheatreInternalLoggerOptions = {},\r\n): ITheatreInternalLogger {\r\n const ref: InternalLoggerRef = {...DEFAULTS, includes: {...DEFAULTS.includes}}\r\n const createConsole = {\r\n styled: createConsoleLoggerStyled.bind(ref, useConsole),\r\n noStyle: createConsoleLoggerNoStyle.bind(ref, useConsole),\r\n }\r\n const createExtBound = createExtLogger.bind(ref)\r\n function getConCreate() {\r\n return ref.loggingConsoleStyle && ref.loggerConsoleStyle\r\n ? createConsole.styled\r\n : createConsole.noStyle\r\n }\r\n ref.create = getConCreate()\r\n\r\n return {\r\n configureLogger(config) {\r\n if (config === 'console') {\r\n ref.loggerConsoleStyle = DEFAULTS.loggerConsoleStyle\r\n ref.create = getConCreate()\r\n } else if (config.type === 'console') {\r\n ref.loggerConsoleStyle = config.style ?? DEFAULTS.loggerConsoleStyle\r\n ref.create = getConCreate()\r\n } else if (config.type === 'keyed') {\r\n ref.creatExt = (source) => config.keyed(source.names)\r\n ref.create = createExtBound\r\n } else if (config.type === 'named') {\r\n ref.creatExt = configNamedToKeyed.bind(null, config.named)\r\n ref.create = createExtBound\r\n }\r\n },\r\n configureLogging(config) {\r\n ref.includes.dev = config.dev ?? DEFAULTS.includes.dev\r\n ref.includes.internal = config.internal ?? DEFAULTS.includes.internal\r\n ref.includes.min = config.min ?? DEFAULTS.includes.min\r\n ref.include = config.include ?? DEFAULTS.include\r\n ref.loggingConsoleStyle =\r\n config.consoleStyle ?? DEFAULTS.loggingConsoleStyle\r\n ref.create = getConCreate()\r\n },\r\n getLogger() {\r\n return ref.create({names: []})\r\n },\r\n }\r\n}\r\n\r\n/** used by `configureLogger` for `'named'` */\r\nfunction configNamedToKeyed(\r\n namedFn: (names: string[]) => ITheatreLogger,\r\n source: ITheatreLogSource,\r\n): ITheatreLogger {\r\n const names: string[] = []\r\n for (let {name, key} of source.names) {\r\n names.push(key == null ? name : `${name} (${key})`)\r\n }\r\n return namedFn(names)\r\n}\r\n\r\nfunction createExtLogger(\r\n this: InternalLoggerRef,\r\n source: ITheatreLogSource,\r\n): ILogger {\r\n const includes = {...this.includes, ...this.include(source)}\r\n const f = this.filtered\r\n const named = this.named.bind(this, source)\r\n const ext = this.creatExt(source)\r\n\r\n const _HMM = shouldLog(includes, _LoggerLevel._HMM)\r\n const _TODO = shouldLog(includes, _LoggerLevel._TODO)\r\n const _ERROR = shouldLog(includes, _LoggerLevel._ERROR)\r\n const ERROR_DEV = shouldLog(includes, _LoggerLevel.ERROR_DEV)\r\n const ERROR_PUBLIC = shouldLog(includes, _LoggerLevel.ERROR_PUBLIC)\r\n const _WARN = shouldLog(includes, _LoggerLevel._WARN)\r\n const _KAPOW = shouldLog(includes, _LoggerLevel._KAPOW)\r\n const WARN_DEV = shouldLog(includes, _LoggerLevel.WARN_DEV)\r\n const WARN_PUBLIC = shouldLog(includes, _LoggerLevel.WARN_PUBLIC)\r\n const _DEBUG = shouldLog(includes, _LoggerLevel._DEBUG)\r\n const DEBUG_DEV = shouldLog(includes, _LoggerLevel.DEBUG_DEV)\r\n const _TRACE = shouldLog(includes, _LoggerLevel._TRACE)\r\n const TRACE_DEV = shouldLog(includes, _LoggerLevel.TRACE_DEV)\r\n const _hmm = _HMM\r\n ? ext.error.bind(ext, LEVELS._hmm)\r\n : f.bind(source, _LoggerLevel._HMM)\r\n const _todo = _TODO\r\n ? ext.error.bind(ext, LEVELS._todo)\r\n : f.bind(source, _LoggerLevel._TODO)\r\n const _error = _ERROR\r\n ? ext.error.bind(ext, LEVELS._error)\r\n : f.bind(source, _LoggerLevel._ERROR)\r\n const errorDev = ERROR_DEV\r\n ? ext.error.bind(ext, LEVELS.errorDev)\r\n : f.bind(source, _LoggerLevel.ERROR_DEV)\r\n const errorPublic = ERROR_PUBLIC\r\n ? ext.error.bind(ext, LEVELS.errorPublic)\r\n : f.bind(source, _LoggerLevel.ERROR_PUBLIC)\r\n const _kapow = _KAPOW\r\n ? ext.warn.bind(ext, LEVELS._kapow)\r\n : f.bind(source, _LoggerLevel._KAPOW)\r\n const _warn = _WARN\r\n ? ext.warn.bind(ext, LEVELS._warn)\r\n : f.bind(source, _LoggerLevel._WARN)\r\n const warnDev = WARN_DEV\r\n ? ext.warn.bind(ext, LEVELS.warnDev)\r\n : f.bind(source, _LoggerLevel.WARN_DEV)\r\n const warnPublic = WARN_PUBLIC\r\n ? ext.warn.bind(ext, LEVELS.warnPublic)\r\n : f.bind(source, _LoggerLevel.WARN_DEV)\r\n const _debug = _DEBUG\r\n ? ext.debug.bind(ext, LEVELS._debug)\r\n : f.bind(source, _LoggerLevel._DEBUG)\r\n const debugDev = DEBUG_DEV\r\n ? ext.debug.bind(ext, LEVELS.debugDev)\r\n : f.bind(source, _LoggerLevel.DEBUG_DEV)\r\n const _trace = _TRACE\r\n ? ext.trace.bind(ext, LEVELS._trace)\r\n : f.bind(source, _LoggerLevel._TRACE)\r\n const traceDev = TRACE_DEV\r\n ? ext.trace.bind(ext, LEVELS.traceDev)\r\n : f.bind(source, _LoggerLevel.TRACE_DEV)\r\n const logger: ILogger = {\r\n _hmm,\r\n _todo,\r\n _error,\r\n errorDev,\r\n errorPublic,\r\n _kapow,\r\n _warn,\r\n warnDev,\r\n warnPublic,\r\n _debug,\r\n debugDev,\r\n _trace,\r\n traceDev,\r\n lazy: {\r\n _hmm: _HMM ? lazy(_hmm) : _hmm,\r\n _todo: _TODO ? lazy(_todo) : _todo,\r\n _error: _ERROR ? lazy(_error) : _error,\r\n errorDev: ERROR_DEV ? lazy(errorDev) : errorDev,\r\n errorPublic: ERROR_PUBLIC ? lazy(errorPublic) : errorPublic,\r\n _kapow: _KAPOW ? lazy(_kapow) : _kapow,\r\n _warn: _WARN ? lazy(_warn) : _warn,\r\n warnDev: WARN_DEV ? lazy(warnDev) : warnDev,\r\n warnPublic: WARN_PUBLIC ? lazy(warnPublic) : warnPublic,\r\n _debug: _DEBUG ? lazy(_debug) : _debug,\r\n debugDev: DEBUG_DEV ? lazy(debugDev) : debugDev,\r\n _trace: _TRACE ? lazy(_trace) : _trace,\r\n traceDev: TRACE_DEV ? lazy(traceDev) : traceDev,\r\n },\r\n //\r\n named,\r\n utilFor: {\r\n internal() {\r\n return {\r\n debug: logger._debug,\r\n error: logger._error,\r\n warn: logger._warn,\r\n trace: logger._trace,\r\n named(name, key) {\r\n return logger.named(name, key).utilFor.internal()\r\n },\r\n }\r\n },\r\n dev() {\r\n return {\r\n debug: logger.debugDev,\r\n error: logger.errorDev,\r\n warn: logger.warnDev,\r\n trace: logger.traceDev,\r\n named(name, key) {\r\n return logger.named(name, key).utilFor.dev()\r\n },\r\n }\r\n },\r\n public() {\r\n return {\r\n error: logger.errorPublic,\r\n warn: logger.warnPublic,\r\n debug(message, obj) {\r\n logger._warn(`(public \"debug\" filtered out) ${message}`, obj)\r\n },\r\n trace(message, obj) {\r\n logger._warn(`(public \"trace\" filtered out) ${message}`, obj)\r\n },\r\n named(name, key) {\r\n return logger.named(name, key).utilFor.public()\r\n },\r\n }\r\n },\r\n },\r\n }\r\n\r\n return logger\r\n}\r\n\r\nfunction createConsoleLoggerStyled(\r\n this: InternalLoggerRef,\r\n con: ITheatreConsoleLogger,\r\n source: ITheatreLogSource,\r\n): ILogger {\r\n const includes = {...this.includes, ...this.include(source)}\r\n\r\n const styleArgs: any[] = []\r\n let prefix = ''\r\n for (let i = 0; i < source.names.length; i++) {\r\n const {name, key} = source.names[i]\r\n prefix += ` %c${name}`\r\n styleArgs.push(this.style.css(name))\r\n if (key != null) {\r\n const keyStr = `%c#${key}`\r\n prefix += keyStr\r\n styleArgs.push(this.style.css(keyStr))\r\n }\r\n }\r\n\r\n const f = this.filtered\r\n const named = this.named.bind(this, source)\r\n const prefixArr = [prefix, ...styleArgs]\r\n return _createConsoleLogger(\r\n f,\r\n source,\r\n includes,\r\n con,\r\n prefixArr,\r\n styledKapowPrefix(prefixArr),\r\n named,\r\n )\r\n}\r\n\r\nfunction styledKapowPrefix(args: ReadonlyArray<string>): ReadonlyArray<string> {\r\n const start = args.slice(0)\r\n for (let i = 1; i < start.length; i++)\r\n // add big font to all part styles\r\n start[i] += ';background-color:#e0005a;padding:2px;color:white'\r\n return start\r\n}\r\n\r\nfunction createConsoleLoggerNoStyle(\r\n this: InternalLoggerRef,\r\n con: ITheatreConsoleLogger,\r\n source: ITheatreLogSource,\r\n): ILogger {\r\n const includes = {...this.includes, ...this.include(source)}\r\n\r\n let prefix = ''\r\n for (let i = 0; i < source.names.length; i++) {\r\n const {name, key} = source.names[i]\r\n prefix += ` ${name}`\r\n if (key != null) {\r\n prefix += `#${key}`\r\n }\r\n }\r\n\r\n const f = this.filtered\r\n const named = this.named.bind(this, source)\r\n const prefixArr = [prefix]\r\n return _createConsoleLogger(\r\n f,\r\n source,\r\n includes,\r\n con,\r\n prefixArr,\r\n prefixArr,\r\n named,\r\n )\r\n}\r\n\r\n/** Used by {@link createConsoleLoggerNoStyle} and {@link createConsoleLoggerStyled} */\r\nfunction _createConsoleLogger(\r\n f: (\r\n this: ITheatreLogSource,\r\n level: _LoggerLevel,\r\n message: string,\r\n args?: object | undefined,\r\n ) => void,\r\n source: ITheatreLogSource,\r\n includes: {min: TheatreLoggerLevel; dev: boolean; internal: boolean},\r\n con: ITheatreConsoleLogger,\r\n prefix: ReadonlyArray<any>,\r\n kapowPrefix: ReadonlyArray<any>,\r\n named: (name: string, key?: string | number | undefined) => ILogger,\r\n) {\r\n const _HMM = shouldLog(includes, _LoggerLevel._HMM)\r\n const _TODO = shouldLog(includes, _LoggerLevel._TODO)\r\n const _ERROR = shouldLog(includes, _LoggerLevel._ERROR)\r\n const ERROR_DEV = shouldLog(includes, _LoggerLevel.ERROR_DEV)\r\n const ERROR_PUBLIC = shouldLog(includes, _LoggerLevel.ERROR_PUBLIC)\r\n const _WARN = shouldLog(includes, _LoggerLevel._WARN)\r\n const _KAPOW = shouldLog(includes, _LoggerLevel._KAPOW)\r\n const WARN_DEV = shouldLog(includes, _LoggerLevel.WARN_DEV)\r\n const WARN_PUBLIC = shouldLog(includes, _LoggerLevel.WARN_PUBLIC)\r\n const _DEBUG = shouldLog(includes, _LoggerLevel._DEBUG)\r\n const DEBUG_DEV = shouldLog(includes, _LoggerLevel.DEBUG_DEV)\r\n const _TRACE = shouldLog(includes, _LoggerLevel._TRACE)\r\n const TRACE_DEV = shouldLog(includes, _LoggerLevel.TRACE_DEV)\r\n const _hmm = _HMM\r\n ? con.error.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel._HMM)\r\n const _todo = _TODO\r\n ? con.error.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel._TODO)\r\n const _error = _ERROR\r\n ? con.error.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel._ERROR)\r\n const errorDev = ERROR_DEV\r\n ? con.error.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel.ERROR_DEV)\r\n const errorPublic = ERROR_PUBLIC\r\n ? con.error.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel.ERROR_PUBLIC)\r\n const _kapow = _KAPOW\r\n ? con.warn.bind(con, ...kapowPrefix)\r\n : f.bind(source, _LoggerLevel._KAPOW)\r\n const _warn = _WARN\r\n ? con.warn.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel._WARN)\r\n const warnDev = WARN_DEV\r\n ? con.warn.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel.WARN_DEV)\r\n const warnPublic = WARN_PUBLIC\r\n ? con.warn.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel.WARN_DEV)\r\n const _debug = _DEBUG\r\n ? con.info.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel._DEBUG)\r\n const debugDev = DEBUG_DEV\r\n ? con.info.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel.DEBUG_DEV)\r\n const _trace = _TRACE\r\n ? con.debug.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel._TRACE)\r\n const traceDev = TRACE_DEV\r\n ? con.debug.bind(con, ...prefix)\r\n : f.bind(source, _LoggerLevel.TRACE_DEV)\r\n const logger: ILogger = {\r\n _hmm,\r\n _todo,\r\n _error,\r\n errorDev,\r\n errorPublic,\r\n _kapow,\r\n _warn,\r\n warnDev,\r\n warnPublic,\r\n _debug,\r\n debugDev,\r\n _trace,\r\n traceDev,\r\n lazy: {\r\n _hmm: _HMM ? lazy(_hmm) : _hmm,\r\n _todo: _TODO ? lazy(_todo) : _todo,\r\n _error: _ERROR ? lazy(_error) : _error,\r\n errorDev: ERROR_DEV ? lazy(errorDev) : errorDev,\r\n errorPublic: ERROR_PUBLIC ? lazy(errorPublic) : errorPublic,\r\n _kapow: _KAPOW ? lazy(_kapow) : _kapow,\r\n _warn: _WARN ? lazy(_warn) : _warn,\r\n warnDev: WARN_DEV ? lazy(warnDev) : warnDev,\r\n warnPublic: WARN_PUBLIC ? lazy(warnPublic) : warnPublic,\r\n _debug: _DEBUG ? lazy(_debug) : _debug,\r\n debugDev: DEBUG_DEV ? lazy(debugDev) : debugDev,\r\n _trace: _TRACE ? lazy(_trace) : _trace,\r\n traceDev: TRACE_DEV ? lazy(traceDev) : traceDev,\r\n },\r\n //\r\n named,\r\n utilFor: {\r\n internal() {\r\n return {\r\n debug: logger._debug,\r\n error: logger._error,\r\n warn: logger._warn,\r\n trace: logger._trace,\r\n named(name, key) {\r\n return logger.named(name, key).utilFor.internal()\r\n },\r\n }\r\n },\r\n dev() {\r\n return {\r\n debug: logger.debugDev,\r\n error: logger.errorDev,\r\n warn: logger.warnDev,\r\n trace: logger.traceDev,\r\n named(name, key) {\r\n return logger.named(name, key).utilFor.dev()\r\n },\r\n }\r\n },\r\n public() {\r\n return {\r\n error: logger.errorPublic,\r\n warn: logger.warnPublic,\r\n debug(message, obj) {\r\n logger._warn(`(public \"debug\" filtered out) ${message}`, obj)\r\n },\r\n trace(message, obj) {\r\n logger._warn(`(public \"trace\" filtered out) ${message}`, obj)\r\n },\r\n named(name, key) {\r\n return logger.named(name, key).utilFor.public()\r\n },\r\n }\r\n },\r\n },\r\n }\r\n\r\n return logger\r\n}\r\n", "export type {\r\n ILogger,\r\n IUtilLogger,\r\n ITheatreConsoleLogger,\r\n ITheatreLogIncludes,\r\n ITheatreLogSource,\r\n ITheatreLoggerConfig,\r\n ITheatreLoggingConfig,\r\n ITheatreInternalLogger,\r\n} from './_logger/logger'\r\nimport {createTheatreInternalLogger, TheatreLoggerLevel} from './_logger/logger'\r\nimport type {IUtilLogger} from './_logger/logger'\r\nexport {TheatreLoggerLevel, createTheatreInternalLogger} from './_logger/logger'\r\n\r\n/**\r\n * Common object interface for the context to pass in to utility functions.\r\n *\r\n * Prefer to pass this into utility function rather than an {@link IUtilLogger}.\r\n */\r\nexport interface IUtilContext {\r\n readonly logger: IUtilLogger\r\n}\r\n\r\nconst internal = createTheatreInternalLogger(console, {\r\n _debug: function () {},\r\n _error: function () {},\r\n})\r\n\r\ninternal.configureLogging({\r\n dev: true,\r\n min: TheatreLoggerLevel.TRACE,\r\n})\r\n\r\nexport default internal\r\n .getLogger()\r\n .named('Theatre.js (default logger)')\r\n .utilFor.dev()\r\n", "/**\r\n * The names of the global variables that the core or studio bundle\r\n * use to store their references.\r\n */\r\nexport const studioBundle = '__TheatreJS_StudioBundle'\r\nexport const coreBundle = '__TheatreJS_CoreBundle'\r\nexport const notifications = '__TheatreJS_Notifications'\r\n", "import logger from './logger'\r\nimport * as globalVariableNames from './globalVariableNames'\r\n\r\nexport type Notification = {title: string; message: string}\r\nexport type NotificationType = 'info' | 'success' | 'warning' | 'error'\r\nexport type Notify = (\r\n /**\r\n * The title of the notification.\r\n */\r\n title: string,\r\n /**\r\n * The message of the notification.\r\n */\r\n message: string,\r\n /**\r\n * An array of doc pages to link to.\r\n */\r\n docs?: {url: string; title: string}[],\r\n /**\r\n * Whether duplicate notifications should be allowed.\r\n */\r\n allowDuplicates?: boolean,\r\n) => void\r\nexport type Notifiers = {\r\n /**\r\n * Show a success notification.\r\n */\r\n success: Notify\r\n /**\r\n * Show a warning notification.\r\n *\r\n * Say what happened in the title.\r\n * In the message, start with 1) a reassurance, then 2) explain why it happened, and 3) what the user can do about it.\r\n */\r\n warning: Notify\r\n /**\r\n * Show an info notification.\r\n */\r\n info: Notify\r\n /**\r\n * Show an error notification.\r\n */\r\n error: Notify\r\n}\r\n\r\nconst createHandler =\r\n (type: NotificationType): Notify =>\r\n (...args) => {\r\n switch (type) {\r\n case 'success': {\r\n logger.debug(args.slice(0, 2).join('\\n'))\r\n break\r\n }\r\n case 'info': {\r\n logger.debug(args.slice(0, 2).join('\\n'))\r\n break\r\n }\r\n case 'warning': {\r\n logger.warn(args.slice(0, 2).join('\\n'))\r\n break\r\n }\r\n case 'error': {\r\n // don't log errors, they're already logged by the browser\r\n }\r\n }\r\n\r\n return typeof window !== 'undefined'\r\n ? // @ts-ignore\r\n window[globalVariableNames.notifications]?.notify[type](...args)\r\n : undefined\r\n }\r\n\r\n/** User-facing notification helpers (success, warning, info, error) used by Theatre.js runtimes. */\r\nexport const notify: Notifiers = {\r\n warning: createHandler('warning'),\r\n success: createHandler('success'),\r\n info: createHandler('info'),\r\n error: createHandler('error'),\r\n}\r\n\r\nif (typeof window !== 'undefined') {\r\n window.addEventListener('error', (e) => {\r\n notify.error(\r\n `An error occurred`,\r\n `<pre>${e.message}</pre>\\n\\nSee **console** for details.`,\r\n )\r\n })\r\n\r\n window.addEventListener('unhandledrejection', (e) => {\r\n notify.error(\r\n `An error occurred`,\r\n `<pre>${e.reason}</pre>\\n\\nSee **console** for details.`,\r\n )\r\n })\r\n}\r\n", "import {InvalidArgumentError} from './errors'\r\nimport {notify} from '@unseenco/theatre-shared/notify'\r\n\r\n/**\r\n * Make the given string's \"path\" slashes normalized with preceding and trailing spaces.\r\n *\r\n * - It removes starting and trailing slashes: `/foo/bar/` becomes `foo / bar`\r\n * - It adds wraps each slash with a single space, so that `foo/bar` becomes `foo / bar`\r\n *\r\n */\r\nconst normalizeSlashedPath = (p: string): string =>\r\n p\r\n // remove starting slashes\r\n .replace(/^[\\s\\/]*/, '')\r\n // remove ending slashes\r\n .replace(/[\\s\\/]*$/, '')\r\n // make middle slashes consistent\r\n .replace(/\\s*\\/\\s*/g, ' / ')\r\n\r\nconst getValidationErrorsOfSlashedPath = (p: string): void | string => {\r\n if (typeof p !== 'string') return `it is not a string. (it is a ${typeof p})`\r\n\r\n const components = p.split(/\\//)\r\n if (components.length === 0) return `it is empty.`\r\n\r\n for (let i = 0; i < components.length; i++) {\r\n const component = components[i].trim()\r\n if (component.length === 0) return `the component #${i + 1} is empty.`\r\n if (component.length > 64)\r\n return `the component '${component}' must have 64 characters or less.`\r\n }\r\n}\r\n\r\n/**\r\n * Sanitizes a `path` and warns the user if the input doesn't match the sanitized output.\r\n *\r\n * See {@link normalizeSlashedPath} for examples of how we do sanitization.\r\n */\r\nexport function validateAndSanitiseSlashedPathOrThrow(\r\n unsanitisedPath: string,\r\n fnName: string,\r\n) {\r\n const sanitisedPath = normalizeSlashedPath(unsanitisedPath)\r\n if (process.env.NODE_ENV !== 'development') {\r\n return sanitisedPath\r\n }\r\n const validation = getValidationErrorsOfSlashedPath(sanitisedPath)\r\n if (validation) {\r\n throw new InvalidArgumentError(\r\n `The path in ${fnName}(${\r\n typeof unsanitisedPath === 'string' ? `\"${unsanitisedPath}\"` : ''\r\n }) is invalid because ${validation}`,\r\n )\r\n }\r\n if (unsanitisedPath !== sanitisedPath) {\r\n notify.warning(\r\n 'Invalid path provided to object',\r\n `The path in \\`${fnName}(\"${unsanitisedPath}\")\\` was sanitized to \\`\"${sanitisedPath}\"\\`.\\n\\n` +\r\n 'Please replace the path with the sanitized one, otherwise it will likely break in the future.',\r\n [\r\n {\r\n url: 'https://unseen-theatre.netlify.app/docs/guide/manual/objects#creating-objects',\r\n title: 'Sheet Objects',\r\n },\r\n {\r\n url: 'https://unseen-theatre.netlify.app/docs/api/theatre-core#sheet.object',\r\n title: 'API',\r\n },\r\n ],\r\n )\r\n }\r\n return sanitisedPath\r\n}\r\n", "import {validateAndSanitiseSlashedPathOrThrow} from '@unseenco/theatre-shared/utils/slashedPaths'\r\n\r\n/**\r\n * Theatre sheet object key for a GSAP outline proxy (`Namespace / label`),\r\n * matching {@link ISheet.object} sanitisation.\r\n */\r\nexport function buildGsapSheetObjectKey(namespace: string, label: string): string {\r\n return validateAndSanitiseSlashedPathOrThrow(\r\n `${namespace} / ${label}`,\r\n 'buildGsapSheetObjectKey',\r\n )\r\n}\r\n", "import type {GsapTimelineChildClip} from '@unseenco/theatre-core/projects/store/types/SheetState_Historic'\r\n\r\nexport function isGsapTimeline(animation: unknown): boolean {\r\n const root = animation as {\r\n getChildren?: (\r\n nested: boolean,\r\n tweens: boolean,\r\n timelines: boolean,\r\n ) => unknown[]\r\n }\r\n const children = root.getChildren?.(false, true, false)\r\n return Array.isArray(children) && children.length > 0\r\n}\r\n\r\nfunction childLabel(child: unknown, index: number): string {\r\n const tween = child as {vars?: {id?: string}}\r\n const id = tween.vars?.id\r\n if (typeof id === 'string' && id.length > 0) return id\r\n return `Tween ${index + 1}`\r\n}\r\n\r\nfunction readChildLocalTiming(child: unknown): {\r\n localStart: number\r\n localDuration: number\r\n} {\r\n const tween = child as {\r\n startTime?: () => number\r\n duration?: () => number\r\n endTime?: () => number\r\n }\r\n const localStart =\r\n typeof tween.startTime === 'function' ? tween.startTime() : 0\r\n let localDuration =\r\n typeof tween.duration === 'function' ? tween.duration() : 0\r\n if (localDuration <= 0 && typeof tween.endTime === 'function') {\r\n localDuration = Math.max(tween.endTime() - localStart, 0.01)\r\n }\r\n return {\r\n localStart: Math.max(localStart, 0),\r\n localDuration: Math.max(localDuration, 0.01),\r\n }\r\n}\r\n\r\n/** Snapshots direct child tweens of a GSAP timeline (one nesting level). */\r\nexport function introspectGsapTimelineChildren(\r\n animation: unknown,\r\n): GsapTimelineChildClip[] {\r\n if (!isGsapTimeline(animation)) return []\r\n const root = animation as {\r\n getChildren: (\r\n nested: boolean,\r\n tweens: boolean,\r\n timelines: boolean,\r\n ) => unknown[]\r\n }\r\n const raw = root.getChildren(false, true, false)\r\n return raw.map((child, index) => {\r\n const {localStart, localDuration} = readChildLocalTiming(child)\r\n return {\r\n childId: `child_${index}`,\r\n label: childLabel(child, index),\r\n localStart,\r\n localDuration,\r\n }\r\n })\r\n}\r\n\r\n/** Rebuilds runtime childId \u2192 tween map aligned with introspected ids. */\r\nexport function linkGsapTimelineChildAnimations(\r\n animation: unknown,\r\n): Map<string, unknown> {\r\n const map = new Map<string, unknown>()\r\n if (!isGsapTimeline(animation)) return map\r\n const root = animation as {\r\n getChildren: (\r\n nested: boolean,\r\n tweens: boolean,\r\n timelines: boolean,\r\n ) => unknown[]\r\n }\r\n const raw = root.getChildren(false, true, false)\r\n raw.forEach((child, index) => {\r\n map.set(`child_${index}`, child)\r\n })\r\n return map\r\n}\r\n", "import type {GsapTimelineChildClip} from '@unseenco/theatre-core/projects/store/types/SheetState_Historic'\r\nimport {introspectGsapTimelineChildren} from './introspectGsapTimelineChildren'\r\n\r\n/** Reads GSAP tween/timeline `vars.id` when present. */\r\nexport function readGsapAnimationVarsId(\r\n animation: unknown,\r\n): string | undefined {\r\n const id = (animation as {vars?: {id?: string}}).vars?.id\r\n if (typeof id === 'string' && id.trim().length > 0) {\r\n return id.trim()\r\n }\r\n return undefined\r\n}\r\n\r\n/**\r\n * Outline / sequencer label for a registered GSAP animation:\r\n * explicit `options.label`, then `vars.id`, then fallback.\r\n */\r\nexport function resolveGsapAnimationRegistrationLabel(\r\n animation: unknown,\r\n optionsLabel: string | undefined,\r\n fallback = 'GSAP animation',\r\n): string {\r\n if (typeof optionsLabel === 'string' && optionsLabel.length > 0) {\r\n return optionsLabel\r\n }\r\n return readGsapAnimationVarsId(animation) ?? fallback\r\n}\r\n\r\n/** Sequencer label for a timeline child tween (prefers live `vars.id` from the animation). */\r\nexport function resolveGsapTimelineChildSequencerLabel(\r\n parentAnimation: unknown | undefined,\r\n childData: Pick<GsapTimelineChildClip, 'childId' | 'label'>,\r\n): string {\r\n if (parentAnimation) {\r\n const freshChildren = introspectGsapTimelineChildren(parentAnimation)\r\n const match = freshChildren.find((c) => c.childId === childData.childId)\r\n if (match) {\r\n return match.label\r\n }\r\n }\r\n return childData.label\r\n}\r\n", "const GSAP_NAMESPACE_STORE_KEY = '__unseenco_theatre_gsap_configuredNamespace__'\r\n\r\n/** Default GSAP outline namespace segment (first path component). */\r\nexport const DEFAULT_GSAP_SHEET_OBJECT_NAMESPACE = 'GSAP'\r\n\r\nexport function setConfiguredGsapSheetObjectNamespace(namespace: string): void {\r\n const g = globalThis as typeof globalThis & {\r\n [GSAP_NAMESPACE_STORE_KEY]?: string\r\n }\r\n g[GSAP_NAMESPACE_STORE_KEY] = namespace.trim()\r\n}\r\n\r\nexport function getConfiguredGsapSheetObjectNamespace(): string {\r\n const g = globalThis as typeof globalThis & {\r\n [GSAP_NAMESPACE_STORE_KEY]?: string\r\n }\r\n return g[GSAP_NAMESPACE_STORE_KEY] ?? DEFAULT_GSAP_SHEET_OBJECT_NAMESPACE\r\n}\r\n\r\n/** First segment of a Theatre slashed object key (`foo / bar` \u2192 `foo`). */\r\nexport function firstSlashedPathSegment(objectKey: string): string {\r\n return objectKey.split(/\\s*\\/\\s*/g)[0]?.trim() ?? objectKey.trim()\r\n}\r\n\r\n/**\r\n * Whether a sheet object key belongs to the configured GSAP proxy namespace.\r\n * Keys are sanitised by Theatre as `Namespace / label`, not `Namespace/label`.\r\n */\r\nexport function isGsapSheetObjectKey(objectKey: string): boolean {\r\n const namespace = getConfiguredGsapSheetObjectNamespace()\r\n return firstSlashedPathSegment(objectKey) === namespace\r\n}\r\n\r\n/** GSAP outline proxy for a registered ScrollTrigger (`GSAP / ScrollTriggers / \u2026`). */\r\nexport function isGsapScrollTriggerSheetObjectKey(objectKey: string): boolean {\r\n if (!isGsapSheetObjectKey(objectKey)) return false\r\n const segments = objectKey.split(/\\s*\\/\\s*/g).map((s) => s.trim())\r\n return segments[1] === 'ScrollTriggers'\r\n}\r\n", "import type {GsapTimelineChildClip} from '@unseenco/theatre-core/projects/store/types/SheetState_Historic'\r\nimport {gsapClipSyncProgress} from '@unseenco/theatre-shared/sequence/trackData'\r\nimport {applyTimelineChildTimingToGsap} from './applyTimelineChildTiming'\r\nimport {getAnimationEntryBySheetAddressKey} from './gsapAnimationRegistry'\r\nimport type {GsapAnimationRegistryEntry} from './gsapAnimationRegistry'\r\n\r\nexport type GsapClipTiming = {\r\n /** From {@link sheetObjectAddressKey} / {@link sheetObjectAddressKeyFromParts}. */\r\n sheetObjectAddressKey: string\r\n gsapAnimationId: string\r\n start: number\r\n duration: number\r\n timelineChildren?: ReadonlyArray<GsapTimelineChildClip>\r\n timelineSpan?: number\r\n}\r\n\r\ntype EnrichedClip = GsapClipTiming & {\r\n entry: GsapAnimationRegistryEntry\r\n targetKey: unknown\r\n}\r\n\r\nfunction getGsapAnimationTargetKey(\r\n animation: unknown,\r\n fallbackAnimationId: string,\r\n): unknown {\r\n const tween = animation as {targets?: () => unknown[]}\r\n const targets = tween.targets?.()\r\n if (targets && targets.length > 0) {\r\n return targets[0]\r\n }\r\n return fallbackAnimationId\r\n}\r\n\r\n/** Updates registered GSAP tween progress for each clip at `sequencePosition`. */\r\nexport function syncRegisteredGsapAnimationsForClips(\r\n sequencePosition: number,\r\n clips: ReadonlyArray<GsapClipTiming>,\r\n): void {\r\n const enriched: EnrichedClip[] = []\r\n for (const clip of clips) {\r\n const entry = getAnimationEntryBySheetAddressKey(\r\n clip.sheetObjectAddressKey,\r\n clip.gsapAnimationId,\r\n )\r\n if (!entry?.animation) continue\r\n enriched.push({\r\n ...clip,\r\n entry,\r\n targetKey: getGsapAnimationTargetKey(\r\n entry.animation,\r\n clip.gsapAnimationId,\r\n ),\r\n })\r\n }\r\n\r\n const byTarget = new Map<unknown, EnrichedClip[]>()\r\n for (const item of enriched) {\r\n const list = byTarget.get(item.targetKey) ?? []\r\n list.push(item)\r\n byTarget.set(item.targetKey, list)\r\n }\r\n\r\n for (const group of byTarget.values()) {\r\n const sorted = [...group].sort((a, b) => a.start - b.start)\r\n // Same-target clips often animate the same properties. Apply every clip's\r\n // progress in timeline order so a playhead jump cannot leave an earlier\r\n // tween at a stale partial progress that overrides a later clip.\r\n for (const clip of sorted) {\r\n const progress = gsapClipSyncProgress(sequencePosition, clip)\r\n const entry = clip.entry\r\n const animation = entry.animation as {\r\n progress?: (progress: number, suppressEvents?: boolean) => number\r\n time?: (time: number, suppressEvents?: boolean) => number\r\n }\r\n if (\r\n entry.kind === 'timeline' &&\r\n clip.timelineChildren &&\r\n clip.timelineChildren.length > 0\r\n ) {\r\n applyTimelineChildTimingToGsap(\r\n entry.animation,\r\n clip.timelineChildren,\r\n entry.timelineChildById,\r\n entry.onRebuildTimeline,\r\n )\r\n const span =\r\n clip.timelineSpan ?? readGsapTweenTimelineDuration(entry.animation)\r\n const t = progress * Math.max(span, 0.01)\r\n if (typeof animation.time === 'function') {\r\n animation.time(t, true)\r\n } else {\r\n animation.progress?.(progress, true)\r\n }\r\n } else {\r\n animation.progress?.(progress, true)\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function readGsapTweenTimelineDuration(animation: unknown): number {\r\n const tween = animation as {\r\n duration: () => number\r\n totalDuration?: () => number\r\n }\r\n const total = tween.totalDuration?.()\r\n if (typeof total === 'number' && total > 0) return total\r\n const d = tween.duration()\r\n return d > 0 ? d : 1\r\n}\r\n", "import type {\r\n GsapClipBaselineTiming,\r\n GsapClipTrack,\r\n GsapTimelineChildClip,\r\n} from '@unseenco/theatre-core/projects/store/types/SheetState_Historic'\r\nimport type {GsapAnimationRegistryEntry} from './gsapAnimationRegistry'\r\nimport {introspectGsapTimelineChildren} from './introspectGsapTimelineChildren'\r\nimport {readGsapTweenTimelineDuration} from './syncGsapClipProgress'\r\n\r\nfunction cloneTimelineChildren(\r\n children: GsapTimelineChildClip[],\r\n): GsapTimelineChildClip[] {\r\n return children.map((c) => ({...c}))\r\n}\r\n\r\nexport function buildGsapClipBaselineTiming(p: {\r\n duration: number\r\n timelineSpan?: number\r\n timelineChildren?: GsapTimelineChildClip[]\r\n}): GsapClipBaselineTiming {\r\n const duration = Math.max(p.duration, 0.01)\r\n const baseline: GsapClipBaselineTiming = {duration}\r\n if (p.timelineChildren && p.timelineChildren.length > 0) {\r\n baseline.timelineSpan = p.timelineSpan ?? duration\r\n baseline.timelineChildren = cloneTimelineChildren(p.timelineChildren)\r\n }\r\n return baseline\r\n}\r\n\r\nexport function baselineTimingFromRegistryEntry(\r\n entry: GsapAnimationRegistryEntry,\r\n): GsapClipBaselineTiming | undefined {\r\n if (entry.originalTiming) {\r\n return {\r\n duration: entry.originalTiming.duration,\r\n timelineSpan: entry.originalTiming.timelineSpan,\r\n timelineChildren: entry.originalTiming.timelineChildren\r\n ? cloneTimelineChildren(entry.originalTiming.timelineChildren)\r\n : undefined,\r\n }\r\n }\r\n if (!entry.animation) return undefined\r\n const duration =\r\n entry.defaultDuration ?? readGsapTweenTimelineDuration(entry.animation)\r\n const timelineChildren = introspectGsapTimelineChildren(entry.animation)\r\n if (timelineChildren.length > 0) {\r\n return buildGsapClipBaselineTiming({\r\n duration,\r\n timelineSpan: readGsapTweenTimelineDuration(entry.animation),\r\n timelineChildren,\r\n })\r\n }\r\n return buildGsapClipBaselineTiming({duration})\r\n}\r\n\r\nexport function resolveGsapClipBaselineTiming(\r\n track: GsapClipTrack,\r\n entry?: GsapAnimationRegistryEntry,\r\n): GsapClipBaselineTiming | undefined {\r\n if (track.baselineTiming) {\r\n return buildGsapClipBaselineTiming(track.baselineTiming)\r\n }\r\n if (entry) {\r\n return baselineTimingFromRegistryEntry(entry)\r\n }\r\n return undefined\r\n}\r\n\r\n/** Restores sequence clip timing from baseline; does not change {@link GsapClipTrack.start}. */\r\nexport function applyGsapClipBaselineToTrack(\r\n track: GsapClipTrack,\r\n baseline: GsapClipBaselineTiming,\r\n): void {\r\n track.duration = Math.max(baseline.duration, 0.01)\r\n if (baseline.timelineChildren && baseline.timelineChildren.length > 0) {\r\n track.timelineChildren = cloneTimelineChildren(baseline.timelineChildren)\r\n track.timelineSpan = Math.max(\r\n baseline.timelineSpan ?? baseline.duration,\r\n 0.01,\r\n )\r\n } else {\r\n delete track.timelineChildren\r\n delete track.timelineSpan\r\n }\r\n}\r\n\r\nfunction baselineDurationSeconds(duration: number): number {\r\n return Math.max(duration, 0.01)\r\n}\r\n\r\nfunction baselineTimelineSpanSeconds(baseline: GsapClipBaselineTiming): number {\r\n return Math.max(baseline.timelineSpan ?? baseline.duration, 0.01)\r\n}\r\n\r\nfunction trackTimelineSpanSeconds(track: GsapClipTrack): number {\r\n return Math.max(track.timelineSpan ?? track.duration, 0.01)\r\n}\r\n\r\nfunction timelineChildTimingMatches(\r\n trackChild: GsapTimelineChildClip,\r\n baselineChild: GsapTimelineChildClip,\r\n): boolean {\r\n return (\r\n trackChild.localStart === baselineChild.localStart &&\r\n trackChild.localDuration === baselineChild.localDuration\r\n )\r\n}\r\n\r\n/** True when clip duration / timeline span / child local timing differs from baseline. */\r\nexport function gsapClipTimingDeviatesFromBaseline(\r\n track: GsapClipTrack,\r\n baseline: GsapClipBaselineTiming,\r\n): boolean {\r\n if (\r\n track.duration !== baselineDurationSeconds(baseline.duration)\r\n ) {\r\n return true\r\n }\r\n\r\n const baselineChildren = baseline.timelineChildren\r\n const hasBaselineTimeline =\r\n baselineChildren !== undefined && baselineChildren.length > 0\r\n const trackChildren = track.timelineChildren\r\n const hasTrackTimeline =\r\n trackChildren !== undefined && trackChildren.length > 0\r\n\r\n if (hasBaselineTimeline !== hasTrackTimeline) {\r\n return true\r\n }\r\n\r\n if (!hasBaselineTimeline) {\r\n return false\r\n }\r\n\r\n if (trackTimelineSpanSeconds(track) !== baselineTimelineSpanSeconds(baseline)) {\r\n return true\r\n }\r\n\r\n for (const baselineChild of baselineChildren!) {\r\n const trackChild = trackChildren!.find(\r\n (c) => c.childId === baselineChild.childId,\r\n )\r\n if (!trackChild || !timelineChildTimingMatches(trackChild, baselineChild)) {\r\n return true\r\n }\r\n }\r\n\r\n return false\r\n}\r\n\r\n/** True when the given child's local timing differs from baseline for that child. */\r\nexport function gsapTimelineChildTimingDeviatesFromBaseline(\r\n track: GsapClipTrack,\r\n childId: string,\r\n baseline: GsapClipBaselineTiming,\r\n): boolean {\r\n const baselineChild = baseline.timelineChildren?.find(\r\n (c) => c.childId === childId,\r\n )\r\n const trackChild = track.timelineChildren?.find((c) => c.childId === childId)\r\n if (!baselineChild || !trackChild) {\r\n return false\r\n }\r\n return !timelineChildTimingMatches(trackChild, baselineChild)\r\n}\r\n\r\nexport function gsapClipDeviatesFromBaseline(\r\n track: GsapClipTrack,\r\n entry?: GsapAnimationRegistryEntry,\r\n): boolean {\r\n const baseline = resolveGsapClipBaselineTiming(track, entry)\r\n if (!baseline) return false\r\n return gsapClipTimingDeviatesFromBaseline(track, baseline)\r\n}\r\n\r\nexport function gsapTimelineChildDeviatesFromBaseline(\r\n track: GsapClipTrack,\r\n childId: string,\r\n entry?: GsapAnimationRegistryEntry,\r\n): boolean {\r\n const baseline = resolveGsapClipBaselineTiming(track, entry)\r\n if (!baseline) return false\r\n return gsapTimelineChildTimingDeviatesFromBaseline(track, childId, baseline)\r\n}\r\n\r\nexport function applyGsapTimelineChildBaselineToTrack(\r\n track: GsapClipTrack,\r\n childId: string,\r\n baseline: GsapClipBaselineTiming,\r\n): boolean {\r\n const baselineChild = baseline.timelineChildren?.find(\r\n (c) => c.childId === childId,\r\n )\r\n if (!baselineChild || !track.timelineChildren?.length) return false\r\n const child = track.timelineChildren.find((c) => c.childId === childId)\r\n if (!child) return false\r\n child.localStart = baselineChild.localStart\r\n child.localDuration = baselineChild.localDuration\r\n return true\r\n}\r\n", "import type SheetObject from '@unseenco/theatre-core/sheetObjects/SheetObject'\r\n\r\nexport type GsapObjectBinding = {\r\n gsapAnimationId: string\r\n defaultDuration: number\r\n}\r\n\r\nconst STORE_KEY = '__unseenco_theatre_gsap_objectBindings__'\r\n\r\nfunction addressKey(sheetObject: SheetObject): string {\r\n const a = sheetObject.address\r\n return `${a.projectId}|${a.sheetId}|${a.sheetInstanceId}|${a.objectKey}`\r\n}\r\n\r\nfunction getStore(): Map<string, GsapObjectBinding> {\r\n const g = globalThis as typeof globalThis & {\r\n [STORE_KEY]?: Map<string, GsapObjectBinding>\r\n }\r\n if (!g[STORE_KEY]) {\r\n g[STORE_KEY] = new Map()\r\n }\r\n return g[STORE_KEY]!\r\n}\r\n\r\nexport function registerGsapObjectBinding(\r\n sheetObject: SheetObject,\r\n binding: GsapObjectBinding,\r\n): void {\r\n getStore().set(addressKey(sheetObject), binding)\r\n}\r\n\r\nexport function getGsapObjectBinding(\r\n sheetObject: SheetObject,\r\n): GsapObjectBinding | undefined {\r\n return getStore().get(addressKey(sheetObject))\r\n}\r\n\r\nexport function clearGsapObjectBindingsForTests(): void {\r\n getStore().clear()\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", "import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or 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 a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n", "import isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nexport default isKey;\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", "import MapCache from './_MapCache.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nexport default memoize;\n", "import memoize from './memoize.js';\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nexport default memoizeCapped;\n", "import memoizeCapped from './_memoizeCapped.js';\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nexport default stringToPath;\n", "/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nexport default arrayMap;\n", "import Symbol from './_Symbol.js';\nimport arrayMap from './_arrayMap.js';\nimport isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default baseToString;\n", "import baseToString from './_baseToString.js';\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nexport default toString;\n", "import isArray from './isArray.js';\nimport isKey from './_isKey.js';\nimport stringToPath from './_stringToPath.js';\nimport toString from './toString.js';\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nexport default castPath;\n", "import isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default toKey;\n", "import castPath from './_castPath.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nexport default baseGet;\n", "import baseGet from './_baseGet.js';\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nexport default get;\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 overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n", "import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\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 infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n", "/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nexport default last;\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", "import type {$FixMe, $IntentionalAny} from '../types'\r\n\r\nexport default function updateDeep<S>(\r\n state: S,\r\n path: (string | number | undefined)[],\r\n reducer: (...args: $IntentionalAny[]) => $IntentionalAny,\r\n): S {\r\n if (path.length === 0) return reducer(state)\r\n return hoop(state, path as $IntentionalAny, reducer)\r\n}\r\n\r\nconst hoop = (\r\n s: $FixMe,\r\n path: (string | number)[],\r\n reducer: $FixMe,\r\n): $FixMe => {\r\n if (path.length === 0) {\r\n return reducer(s)\r\n }\r\n if (Array.isArray(s)) {\r\n let [index, ...restOfPath] = path\r\n index = parseInt(String(index), 10)\r\n if (isNaN(index)) index = 0\r\n const oldVal = s[index]\r\n const newVal = hoop(oldVal, restOfPath, reducer)\r\n if (oldVal === newVal) return s\r\n const newS = [...s]\r\n newS.splice(index, 1, newVal)\r\n return newS\r\n } else if (typeof s === 'object' && s !== null) {\r\n const [key, ...restOfPath] = path\r\n const oldVal = s[key]\r\n const newVal = hoop(oldVal, restOfPath, reducer)\r\n if (oldVal === newVal) return s\r\n const newS = {...s, [key]: newVal}\r\n return newS\r\n } else {\r\n const [key, ...restOfPath] = path\r\n\r\n return {[key]: hoop(undefined, restOfPath, reducer)}\r\n }\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 '@unseenco/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 {Atom} from '@unseenco/theatre-dataverse'\r\n\r\nconst revisionAtom = new Atom(0)\r\n\r\n/** Bumped when GSAP animations register so Studio UI can refresh menus. */\r\nexport function bumpGsapStudioRegistryRevision(): void {\r\n revisionAtom.set(revisionAtom.get() + 1)\r\n}\r\n\r\nexport const gsapStudioRegistryRevisionPointer = revisionAtom.pointer\r\n", "import type {GsapClipBaselineTiming} from '@unseenco/theatre-core/projects/store/types/SheetState_Historic'\r\nimport type SheetObject from '@unseenco/theatre-core/sheetObjects/SheetObject'\r\nimport type {\r\n ObjectAddressKey,\r\n ProjectId,\r\n SheetId,\r\n SheetInstanceId,\r\n} from '@unseenco/theatre-shared/utils/ids'\r\n\r\nconst DEFAULT_SHEET_INSTANCE_ID = 'default' as SheetInstanceId\r\nimport {buildGsapClipBaselineTiming} from './gsapClipBaseline'\r\nimport {registerGsapObjectBinding} from './gsapObjectBinding'\r\nimport {bumpGsapStudioRegistryRevision} from './gsapStudioRegistryRevision'\r\nimport {\r\n introspectGsapTimelineChildren,\r\n isGsapTimeline,\r\n linkGsapTimelineChildAnimations,\r\n} from './introspectGsapTimelineChildren'\r\nimport {readGsapTweenTimelineDuration} from './syncGsapClipProgress'\r\n\r\nconst REGISTRY_KEY = '__unseenco_theatre_gsap_animationRegistry__'\r\n\r\nexport type GsapAnimationRegistryEntry = {\r\n id: string\r\n label: string\r\n /** Runtime tween; typed in `@unseenco/theatre-gsap`. */\r\n animation?: unknown\r\n sheetObject?: SheetObject\r\n defaultDuration?: number\r\n kind?: 'tween' | 'timeline'\r\n timelineChildById?: Map<string, unknown>\r\n onRebuildTimeline?: () => unknown\r\n /** Introspected timing at registration; fallback when clip has no baselineTiming. */\r\n originalTiming?: GsapClipBaselineTiming\r\n}\r\n\r\ntype RegistryStore = {\r\n bySheetAddress: Map<string, Map<string, GsapAnimationRegistryEntry>>\r\n}\r\n\r\nexport type SheetObjectAddressKeyParts = {\r\n projectId: ProjectId\r\n sheetId: SheetId\r\n objectKey: ObjectAddressKey\r\n sheetInstanceId?: SheetInstanceId\r\n}\r\n\r\nexport function sheetObjectAddressKeyFromParts(\r\n address: SheetObjectAddressKeyParts,\r\n): string {\r\n const sheetInstanceId = address.sheetInstanceId ?? DEFAULT_SHEET_INSTANCE_ID\r\n return `${address.projectId}|${address.sheetId}|${sheetInstanceId}|${address.objectKey}`\r\n}\r\n\r\nexport function sheetObjectAddressKey(sheetObject: SheetObject): string {\r\n return sheetObjectAddressKeyFromParts(sheetObject.address)\r\n}\r\n\r\nfunction getStore(): RegistryStore {\r\n const g = globalThis as typeof globalThis & {\r\n [REGISTRY_KEY]?: RegistryStore\r\n }\r\n if (!g[REGISTRY_KEY]) {\r\n g[REGISTRY_KEY] = {\r\n bySheetAddress: new Map(),\r\n }\r\n }\r\n return g[REGISTRY_KEY]!\r\n}\r\n\r\nfunction getSheetEntryMap(\r\n sheetKey: string,\r\n): Map<string, GsapAnimationRegistryEntry> {\r\n const store = getStore()\r\n let map = store.bySheetAddress.get(sheetKey)\r\n if (!map) {\r\n map = new Map()\r\n store.bySheetAddress.set(sheetKey, map)\r\n }\r\n return map\r\n}\r\n\r\nexport function registerAnimationInRegistry(\r\n entry: GsapAnimationRegistryEntry,\r\n): void {\r\n const kind =\r\n entry.animation && isGsapTimeline(entry.animation) ? 'timeline' : 'tween'\r\n const timelineChildById =\r\n kind === 'timeline' && entry.animation\r\n ? linkGsapTimelineChildAnimations(entry.animation)\r\n : undefined\r\n const defaultDuration =\r\n entry.defaultDuration ?? readGsapTweenTimelineDuration(entry.animation)\r\n const timelineChildren =\r\n kind === 'timeline' && entry.animation\r\n ? introspectGsapTimelineChildren(entry.animation)\r\n : []\r\n const originalTiming =\r\n entry.originalTiming ??\r\n (entry.animation\r\n ? buildGsapClipBaselineTiming({\r\n duration: defaultDuration,\r\n ...(timelineChildren.length > 0\r\n ? {\r\n timelineSpan: readGsapTweenTimelineDuration(entry.animation),\r\n timelineChildren,\r\n }\r\n : {}),\r\n })\r\n : undefined)\r\n const normalized: GsapAnimationRegistryEntry = {\r\n ...entry,\r\n kind,\r\n timelineChildById,\r\n originalTiming,\r\n }\r\n\r\n if (entry.sheetObject) {\r\n const sheetKey = sheetObjectAddressKey(entry.sheetObject)\r\n getSheetEntryMap(sheetKey).set(entry.id, normalized)\r\n registerGsapObjectBinding(entry.sheetObject, {\r\n gsapAnimationId: entry.id,\r\n defaultDuration,\r\n })\r\n }\r\n\r\n bumpGsapStudioRegistryRevision()\r\n}\r\n\r\nexport function getAnimationEntryForAddress(\r\n address: SheetObjectAddressKeyParts,\r\n animationId?: string,\r\n): GsapAnimationRegistryEntry | undefined {\r\n const animId = animationId ?? address.objectKey\r\n const sheetKey = sheetObjectAddressKeyFromParts(address)\r\n return getStore().bySheetAddress.get(sheetKey)?.get(animId)\r\n}\r\n\r\nexport function getAnimationEntry(\r\n sheetObject: SheetObject,\r\n animationId?: string,\r\n): GsapAnimationRegistryEntry | undefined {\r\n return getAnimationEntryForAddress(\r\n sheetObject.address,\r\n animationId ?? sheetObject.address.objectKey,\r\n )\r\n}\r\n\r\n/** Default registry entry for a GSAP sheet object (id defaults to `objectKey`). */\r\nexport function getAnimationEntryForSheetObject(\r\n sheetObject: SheetObject,\r\n): GsapAnimationRegistryEntry | undefined {\r\n return getAnimationEntry(sheetObject)\r\n}\r\n\r\nexport function getAnimationEntryBySheetAddressKey(\r\n sheetObjectAddressKey: string,\r\n animationId: string,\r\n): GsapAnimationRegistryEntry | undefined {\r\n return getStore().bySheetAddress.get(sheetObjectAddressKey)?.get(animationId)\r\n}\r\n\r\n/** @internal Prefer sheet-scoped lookup; scans all sheets when id alone is known. */\r\nexport function getAnimationEntryById(\r\n id: string,\r\n): GsapAnimationRegistryEntry | undefined {\r\n for (const byAnim of getStore().bySheetAddress.values()) {\r\n const entry = byAnim.get(id)\r\n if (entry) return entry\r\n }\r\n return undefined\r\n}\r\n\r\nexport function listAnimationEntries(): GsapAnimationRegistryEntry[] {\r\n const entries: GsapAnimationRegistryEntry[] = []\r\n for (const byAnim of getStore().bySheetAddress.values()) {\r\n entries.push(...byAnim.values())\r\n }\r\n return entries\r\n}\r\n\r\nexport function clearAnimationRegistryForTests(): void {\r\n getStore().bySheetAddress.clear()\r\n}\r\n", "/** `null` = native document scroll (window / documentElement). */\r\nexport type PageScrollScroller = Window | Element | null\r\n\r\nexport type PageScrollAxis = 'vertical' | 'horizontal'\r\n\r\nexport type PageScrollContext = {\r\n scroller: PageScrollScroller\r\n /** Scroll axis for page mode and ScrollTrigger registration (default vertical). */\r\n axis?: PageScrollAxis\r\n}\r\n\r\nexport const defaultPageScrollContext: PageScrollContext = {\r\n scroller: null,\r\n axis: 'vertical',\r\n}\r\n\r\nlet activePageScrollContext: PageScrollContext = defaultPageScrollContext\r\n\r\nexport function setActivePageScrollContext(context: PageScrollContext): void {\r\n activePageScrollContext = {\r\n scroller: context.scroller,\r\n axis: context.axis ?? 'vertical',\r\n }\r\n}\r\n\r\nexport function getActivePageScrollContext(): PageScrollContext {\r\n return activePageScrollContext\r\n}\r\n\r\nexport function resolvePageScrollAxis(\r\n context: PageScrollContext = defaultPageScrollContext,\r\n): PageScrollAxis {\r\n return context.axis ?? 'vertical'\r\n}\r\n\r\nexport function resolvePageScrollScroller(\r\n st: unknown,\r\n defaultsScroller?: PageScrollScroller,\r\n): PageScrollScroller {\r\n const surface = st as {\r\n scroller?: unknown\r\n vars?: {scroller?: unknown}\r\n }\r\n const fromSt = surface.scroller ?? surface.vars?.scroller\r\n if (fromSt != null) {\r\n return fromSt as PageScrollScroller\r\n }\r\n if (defaultsScroller !== undefined) {\r\n return defaultsScroller\r\n }\r\n return null\r\n}\r\n\r\nfunction isWindowLike(value: unknown): boolean {\r\n return (\r\n typeof Window !== 'undefined' &&\r\n (value === window || value instanceof Window)\r\n )\r\n}\r\n\r\nexport function isNativeDocumentScroller(\r\n scroller: PageScrollScroller,\r\n): boolean {\r\n if (scroller == null) return true\r\n if (isWindowLike(scroller)) return true\r\n if (typeof document === 'undefined') return false\r\n return scroller === document.documentElement || scroller === document.body\r\n}\r\n\r\n/** Same scroller target for page-mode scroll registration (reference equality or both native doc). */\r\nexport function pageScrollScrollersMatch(\r\n a: PageScrollScroller,\r\n b: PageScrollScroller,\r\n): boolean {\r\n if (a === b) return true\r\n if (isNativeDocumentScroller(a) && isNativeDocumentScroller(b)) return true\r\n return false\r\n}\r\n\r\nexport function isScrollTriggerHorizontal(st: unknown): boolean {\r\n const surface = st as {horizontal?: boolean; vars?: {horizontal?: boolean}}\r\n return surface.horizontal === true || surface.vars?.horizontal === true\r\n}\r\n\r\n/** @deprecated Use {@link isPageScrollTrigger} with context axis. */\r\nexport function isVerticalScrollTrigger(st: unknown): boolean {\r\n return !isScrollTriggerHorizontal(st)\r\n}\r\n\r\n/**\r\n * True when ST scroller and horizontal flag match the configured page scroll context.\r\n */\r\nexport function isPageScrollTrigger(\r\n st: unknown,\r\n context: PageScrollContext = defaultPageScrollContext,\r\n): boolean {\r\n const axis = resolvePageScrollAxis(context)\r\n const stHorizontal = isScrollTriggerHorizontal(st)\r\n if (stHorizontal !== (axis === 'horizontal')) {\r\n return false\r\n }\r\n const stScroller = resolvePageScrollScroller(st, context.scroller)\r\n return pageScrollScrollersMatch(stScroller, context.scroller)\r\n}\r\n\r\nexport function isVerticalPageScrollTrigger(\r\n st: unknown,\r\n context: PageScrollContext = defaultPageScrollContext,\r\n): boolean {\r\n return isPageScrollTrigger(st, {\r\n scroller: context.scroller,\r\n axis: 'vertical',\r\n })\r\n}\r\n", "import {ScrollTrigger as scrollTriggerFromGsap} from 'gsap/ScrollTrigger'\r\nimport type {GsapScrollTriggerStaticLike} from './gsapScrollTriggerTypes'\r\n\r\nlet boundScrollTrigger: GsapScrollTriggerStaticLike | undefined\r\n\r\n/**\r\n * Optional: bind the ScrollTrigger plugin instance your app registered with GSAP.\r\n * When omitted, Theatre resolves ScrollTrigger from `gsap/ScrollTrigger` (ESM) or `globalThis.ScrollTrigger`.\r\n */\r\nexport function bindGsapScrollTriggerPlugin(\r\n scrollTrigger: GsapScrollTriggerStaticLike,\r\n): void {\r\n boundScrollTrigger = scrollTrigger\r\n}\r\n\r\nexport function getGsapScrollTriggerPlugin():\r\n | GsapScrollTriggerStaticLike\r\n | undefined {\r\n if (boundScrollTrigger) {\r\n return boundScrollTrigger\r\n }\r\n const g = globalThis as typeof globalThis & {\r\n ScrollTrigger?: GsapScrollTriggerStaticLike\r\n }\r\n return (\r\n g.ScrollTrigger ??\r\n (scrollTriggerFromGsap as unknown as GsapScrollTriggerStaticLike)\r\n )\r\n}\r\n\r\nexport function requireGsapScrollTriggerPlugin(): GsapScrollTriggerStaticLike {\r\n const plugin = getGsapScrollTriggerPlugin()\r\n if (!plugin) {\r\n throw new Error(\r\n 'ScrollTrigger is not available. Import ScrollTrigger from \"gsap/ScrollTrigger\", call gsap.registerPlugin(ScrollTrigger), and optionally bindGsapScrollTriggerPlugin(ScrollTrigger) before registering scroll triggers with Theatre.',\r\n )\r\n }\r\n return plugin\r\n}\r\n\r\nexport function refreshGsapScrollTriggers(): void {\r\n getGsapScrollTriggerPlugin()?.refresh()\r\n}\r\n", "import type {OutlineNamespaceConfig} from '@unseenco/theatre-shared/utils/outlineNamespaces'\r\nimport type {\r\n PageScrollAxis,\r\n PageScrollScroller,\r\n} from '@unseenco/theatre-shared/sheets/pageScrollContext'\r\nimport {\r\n defaultPageScrollContext,\r\n setActivePageScrollContext,\r\n} from '@unseenco/theatre-shared/sheets/pageScrollContext'\r\nimport {setConfiguredGsapSheetObjectNamespace} from '@unseenco/theatre-shared/gsap/gsapSheetObjectKey'\r\nimport {getGsapScrollTriggerPlugin} from './gsapScrollTriggerPlugin'\r\n\r\nexport type TheatreGsapPageScrollConfig = {\r\n /** Default scroller for ScrollTrigger layout and guards; `null` = native document. */\r\n scroller?: PageScrollScroller\r\n /** Page scroll axis (default vertical). */\r\n axis?: PageScrollAxis\r\n /**\r\n * @deprecated ScrollTrigger.defaults is applied automatically when `pageScroll` is configured.\r\n */\r\n applyScrollTriggerDefaults?: boolean\r\n}\r\n\r\nexport type TheatreGsapConfig = {\r\n /** Outline namespace segment for GSAP proxy objects (default `GSAP`). */\r\n namespace?: string\r\n /** Applied to each sheet when the first GSAP object is registered on it. */\r\n outlineNamespace?: OutlineNamespaceConfig\r\n /** When true, skips the one-time gsap.ticker / core rAF integration warning. */\r\n suppressGsapTickerRafWarning?: boolean\r\n pageScroll?: TheatreGsapPageScrollConfig\r\n}\r\n\r\nlet activeConfig: TheatreGsapConfig = {\r\n namespace: 'GSAP',\r\n outlineNamespace: {defaultCollapsed: false},\r\n}\r\n\r\nsetConfiguredGsapSheetObjectNamespace(activeConfig.namespace!)\r\n\r\nfunction pageScrollContextFromConfig(pageScroll: TheatreGsapPageScrollConfig): {\r\n scroller: PageScrollScroller\r\n axis: PageScrollAxis\r\n} {\r\n return {\r\n scroller: pageScroll.scroller ?? defaultPageScrollContext.scroller,\r\n axis: pageScroll.axis ?? defaultPageScrollContext.axis ?? 'vertical',\r\n }\r\n}\r\n\r\nfunction applyScrollTriggerDefaultsForPageScroll(\r\n pageScroll: TheatreGsapPageScrollConfig,\r\n): void {\r\n const ScrollTrigger = getGsapScrollTriggerPlugin()\r\n const {scroller, axis} = pageScrollContextFromConfig(pageScroll)\r\n ScrollTrigger?.defaults?.({\r\n scroller: scroller ?? undefined,\r\n ...(axis === 'horizontal' ? {horizontal: true} : {}),\r\n })\r\n}\r\n\r\nexport function configureTheatreGsap(config: TheatreGsapConfig): {\r\n reset: () => void\r\n} {\r\n const prev = activeConfig\r\n activeConfig = {\r\n namespace: config.namespace ?? prev.namespace ?? 'GSAP',\r\n outlineNamespace: config.outlineNamespace ?? prev.outlineNamespace,\r\n suppressGsapTickerRafWarning:\r\n config.suppressGsapTickerRafWarning ?? prev.suppressGsapTickerRafWarning,\r\n pageScroll: config.pageScroll ?? prev.pageScroll,\r\n }\r\n setConfiguredGsapSheetObjectNamespace(activeConfig.namespace ?? 'GSAP')\r\n\r\n if (config.pageScroll !== undefined) {\r\n const ctx = pageScrollContextFromConfig(config.pageScroll)\r\n setActivePageScrollContext(ctx)\r\n applyScrollTriggerDefaultsForPageScroll(config.pageScroll)\r\n }\r\n\r\n return {\r\n reset() {\r\n activeConfig = prev\r\n setConfiguredGsapSheetObjectNamespace(prev.namespace ?? 'GSAP')\r\n if (prev.pageScroll !== undefined) {\r\n const ctx = pageScrollContextFromConfig(prev.pageScroll)\r\n setActivePageScrollContext(ctx)\r\n applyScrollTriggerDefaultsForPageScroll(prev.pageScroll)\r\n } else {\r\n setActivePageScrollContext(defaultPageScrollContext)\r\n }\r\n },\r\n }\r\n}\r\n\r\nexport function getTheatreGsapConfig(): TheatreGsapConfig {\r\n return activeConfig\r\n}\r\n", "import type SheetObject from '@unseenco/theatre-core/sheetObjects/SheetObject'\r\nimport type {GsapTweenLike} from './gsapTypes'\r\nimport {\r\n clearAnimationRegistryForTests as clearSharedAnimationRegistryForTests,\r\n getAnimationEntry as getSharedAnimationEntry,\r\n getAnimationEntryForSheetObject as getSharedAnimationEntryForSheetObject,\r\n listAnimationEntries as listSharedAnimationEntries,\r\n registerAnimationInRegistry as registerSharedAnimationInRegistry,\r\n} from '@unseenco/theatre-shared/gsap/gsapAnimationRegistry'\r\nimport {readGsapTweenTimelineDuration} from '@unseenco/theatre-shared/gsap/syncGsapClipProgress'\r\n\r\nexport type GsapAnimationRegistryEntry = {\r\n id: string\r\n label: string\r\n animation: GsapTweenLike\r\n sheetObject?: SheetObject\r\n defaultDuration?: number\r\n onRebuildTimeline?: () => GsapTweenLike\r\n}\r\n\r\nexport function registerAnimationInRegistry(\r\n entry: GsapAnimationRegistryEntry,\r\n): void {\r\n registerSharedAnimationInRegistry({\r\n ...entry,\r\n animation: entry.animation,\r\n defaultDuration:\r\n entry.defaultDuration ??\r\n defaultClipDuration(entry.animation as GsapTweenLike),\r\n onRebuildTimeline: entry.onRebuildTimeline,\r\n })\r\n}\r\n\r\nfunction defaultClipDuration(animation: GsapTweenLike): number {\r\n return readGsapTweenTimelineDuration(animation)\r\n}\r\n\r\nfunction toPackageEntry(\r\n entry: ReturnType<typeof getSharedAnimationEntryForSheetObject>,\r\n): GsapAnimationRegistryEntry | undefined {\r\n if (!entry || !entry.animation) return undefined\r\n return {\r\n id: entry.id,\r\n label: entry.label,\r\n animation: entry.animation as GsapTweenLike,\r\n sheetObject: entry.sheetObject,\r\n defaultDuration: entry.defaultDuration,\r\n onRebuildTimeline: entry.onRebuildTimeline as\r\n | (() => GsapTweenLike)\r\n | undefined,\r\n }\r\n}\r\n\r\nexport function getAnimationEntry(\r\n sheetObject: SheetObject,\r\n animationId?: string,\r\n): GsapAnimationRegistryEntry | undefined {\r\n return toPackageEntry(getSharedAnimationEntry(sheetObject, animationId))\r\n}\r\n\r\nexport function getAnimationEntryById(\r\n id: string,\r\n): GsapAnimationRegistryEntry | undefined {\r\n return toPackageEntry(\r\n listSharedAnimationEntries().find((entry) => entry.id === id),\r\n )\r\n}\r\n\r\nexport function getAnimationEntryForSheetObject(\r\n sheetObject: SheetObject,\r\n): GsapAnimationRegistryEntry | undefined {\r\n return toPackageEntry(getSharedAnimationEntryForSheetObject(sheetObject))\r\n}\r\n\r\nexport function listAnimationEntries(): GsapAnimationRegistryEntry[] {\r\n return listSharedAnimationEntries()\r\n .filter((e): e is typeof e & {animation: GsapTweenLike} => !!e.animation)\r\n .map((entry) => ({\r\n id: entry.id,\r\n label: entry.label,\r\n animation: entry.animation as GsapTweenLike,\r\n sheetObject: entry.sheetObject,\r\n }))\r\n}\r\n\r\nexport function clearAnimationRegistryForTests(): void {\r\n clearSharedAnimationRegistryForTests()\r\n}\r\n", "import {validateAndSanitiseSlashedPathOrThrow} from '@unseenco/theatre-shared/utils/slashedPaths'\r\nimport type {SheetId} from '@unseenco/theatre-shared/utils/ids'\r\n\r\nexport type OutlineNamespaceConfig = {\r\n defaultCollapsed?: boolean\r\n collapsed?: boolean\r\n}\r\n\r\nexport function formatOutlineNamespacePathKey(pathSegments: string[]): string {\r\n return pathSegments.join(' / ')\r\n}\r\n\r\nexport function parseOutlineNamespacePath(\r\n namespacePath: string,\r\n fnName: string,\r\n): string[] {\r\n return validateAndSanitiseSlashedPathOrThrow(namespacePath, fnName).split(\r\n /\\s*\\/\\s*/g,\r\n )\r\n}\r\n\r\nexport function getOutlineNamespaceItemKey(\r\n sheetId: SheetId,\r\n pathSegments: string[],\r\n): string {\r\n return `namespace:${sheetId}:${pathSegments.join('/')}`\r\n}\r\n", "import type {IRafDriver} from '@unseenco/theatre-core'\r\nimport {getTheatreCoreRafDriver} from '@unseenco/theatre-core/privateAPIs'\r\nimport {getTheatreGsapConfig} from './config'\r\n\r\nconst gsapTickerDrivenDriverIds = new Set<number>()\r\n\r\nexport type GsapTickerLike = {\r\n ticker: {\r\n add(fn: (time: number) => void): unknown\r\n remove(fn: (time: number) => void): unknown\r\n }\r\n}\r\n\r\n/**\r\n * Drives a Theatre `rafDriver` from `gsap.ticker` (GSAP time in seconds \u2192 Theatre ms).\r\n * Returns a cleanup that removes the ticker listener and unmarks the driver.\r\n */\r\nexport function bindGsapTickerToRafDriver(\r\n rafDriver: IRafDriver,\r\n gsap: GsapTickerLike,\r\n): () => void {\r\n const onTick = (time: number) => {\r\n rafDriver.tick(time * 1000)\r\n }\r\n gsapTickerDrivenDriverIds.add(rafDriver.id)\r\n gsap.ticker.add(onTick)\r\n return () => {\r\n gsap.ticker.remove(onTick)\r\n gsapTickerDrivenDriverIds.delete(rafDriver.id)\r\n }\r\n}\r\n\r\nexport function isRafDriverDrivenByGsapTicker(rafDriver: IRafDriver): boolean {\r\n return gsapTickerDrivenDriverIds.has(rafDriver.id)\r\n}\r\n\r\nlet hasWarnedGsapTickerRaf = false\r\nlet gsapTickerRafWarningMicrotaskQueued = false\r\n\r\n/**\r\n * Schedules a deferred check so same-turn `setCoreRafDriver` \u2192 `bindGsapTickerToRafDriver`\r\n * \u2192 `registerGsapAnimation` does not warn before the bind runs.\r\n */\r\nexport function scheduleGsapTickerRafWarningCheck(): void {\r\n if (gsapTickerRafWarningMicrotaskQueued) return\r\n gsapTickerRafWarningMicrotaskQueued = true\r\n queueMicrotask(() => {\r\n gsapTickerRafWarningMicrotaskQueued = false\r\n warnIfGsapTickerNotDrivingTheatreRaf()\r\n })\r\n}\r\n\r\n/**\r\n * Warns once per page load when Theatre's core rAF is not driven by `gsap.ticker`.\r\n */\r\nexport function warnIfGsapTickerNotDrivingTheatreRaf(): void {\r\n if (typeof window === 'undefined') return\r\n if (getTheatreGsapConfig().suppressGsapTickerRafWarning) return\r\n if (hasWarnedGsapTickerRaf) return\r\n\r\n const coreDriver = getTheatreCoreRafDriver()\r\n if (!isRafDriverDrivenByGsapTicker(coreDriver)) {\r\n hasWarnedGsapTickerRaf = true\r\n console.warn(\r\n '[theatre-gsap] Theatre is not driven by gsap.ticker. After setCoreRafDriver(), call bindGsapTickerToRafDriver(rafDriver, gsap) so GSAP and Theatre share one clock. See the GSAP extension guide.',\r\n )\r\n }\r\n}\r\n\r\n/** @internal test-only */\r\nexport function resetGsapTickerRafBridgeForTests(): void {\r\n gsapTickerDrivenDriverIds.clear()\r\n hasWarnedGsapTickerRaf = false\r\n gsapTickerRafWarningMicrotaskQueued = false\r\n}\r\n", "import type {ISheet} from '@unseenco/theatre-core'\r\nimport {privateAPI} from '@unseenco/theatre-core/privateAPIs'\r\nimport {buildGsapSheetObjectKey} from '@unseenco/theatre-shared/gsap/buildGsapSheetObjectKey'\r\nimport {extractScrollTriggerLayout} from '@unseenco/theatre-shared/gsap/extractScrollTriggerLayout'\r\nimport {\r\n findScrollTriggerEntryByInstance,\r\n registerScrollTriggerInRegistry,\r\n sheetAddressKey,\r\n} from '@unseenco/theatre-shared/gsap/scrollTriggerRegistry'\r\nimport type {GsapScrollTriggerRegistryEntry} from '@unseenco/theatre-shared/gsap/scrollTriggerRegistry'\r\nimport {formatOutlineNamespacePathKey} from '@unseenco/theatre-shared/utils/outlineNamespaces'\r\nimport {getTheatreGsapConfig} from './config'\r\nimport {getTheatrePageScrollContext} from './attachTheatrePageScroll'\r\nimport type {GsapScrollTriggerLike} from './gsapScrollTriggerTypes'\r\nimport {\r\n refreshGsapScrollTriggers,\r\n requireGsapScrollTriggerPlugin,\r\n} from './gsapScrollTriggerPlugin'\r\nimport {refreshScrollTriggerLayoutsForSheet} from '@unseenco/theatre-shared/gsap/refreshScrollTriggerLayoutsForSheet'\r\nimport {scheduleGsapTickerRafWarningCheck} from './gsapTickerRafBridge'\r\n\r\nexport type RegisterGsapScrollTriggerOptions = {\r\n label: string\r\n namespace?: string\r\n id?: string\r\n}\r\n\r\nexport type RegisterGsapScrollTriggerResult = {\r\n id: string\r\n sheetObject: ReturnType<ISheet['object']>\r\n}\r\n\r\nfunction assertPageMode(sheet: ISheet): void {\r\n if (sheet.getSequenceMode() !== 'page') {\r\n throw new Error(\r\n 'registerGsapScrollTrigger() requires the sheet to use sequenceMode \"page\".',\r\n )\r\n }\r\n}\r\n\r\nfunction sequenceLengthForSheet(sheet: ISheet): number {\r\n return privateAPI(sheet).getSequence().length\r\n}\r\n\r\nfunction scrollTriggerObjectKey(namespace: string, label: string): string {\r\n return buildGsapSheetObjectKey(namespace, `ScrollTriggers / ${label}`)\r\n}\r\n\r\nexport function registerOneGsapScrollTriggerOnSheet(\r\n sheet: ISheet,\r\n st: GsapScrollTriggerLike,\r\n options: RegisterGsapScrollTriggerOptions,\r\n fallbackIndex: number,\r\n): RegisterGsapScrollTriggerResult | null {\r\n const config = getTheatreGsapConfig()\r\n const namespace = options.namespace ?? config.namespace ?? 'GSAP'\r\n const sheetInternal = privateAPI(sheet)\r\n const sheetKey = sheetAddressKey(sheetInternal.address)\r\n const sequenceLength = sequenceLengthForSheet(sheet)\r\n\r\n const existingByInstance = findScrollTriggerEntryByInstance(sheetKey, st)\r\n if (existingByInstance?.sheetObject) {\r\n console.warn(\r\n `[theatre-gsap] ScrollTrigger \"${options.label}\" is already registered for this sheet (id \"${existingByInstance.id}\"). Skipping duplicate registration.`,\r\n )\r\n return {\r\n id: existingByInstance.id,\r\n sheetObject: existingByInstance.sheetObject.publicApi,\r\n }\r\n }\r\n\r\n refreshGsapScrollTriggers()\r\n\r\n const pageScrollContext = getTheatrePageScrollContext()\r\n\r\n const extracted = extractScrollTriggerLayout(st, {\r\n sequenceLength,\r\n id: options.id,\r\n label: options.label,\r\n fallbackIndex,\r\n pageScrollContext,\r\n })\r\n\r\n if (!extracted.ok) {\r\n if (extracted.reason === 'unsupported_scroller') {\r\n console.warn(\r\n `[theatre-gsap] Skipped ScrollTrigger \"${options.label}\": scroller or scroll axis does not match configured page scroll (see configureTheatreGsap pageScroll scroller and axis).`,\r\n )\r\n } else {\r\n console.warn(\r\n `[theatre-gsap] Skipped ScrollTrigger \"${options.label}\": no linked tween or timeline found.`,\r\n )\r\n }\r\n return null\r\n }\r\n\r\n const {value} = extracted\r\n const objectKey = scrollTriggerObjectKey(namespace, value.label)\r\n const id = options.id ?? value.id\r\n\r\n const sheetObjectPublic = sheet.object(objectKey, {}, {reconfigure: false})\r\n const sheetObjectInternal = privateAPI(sheetObjectPublic)\r\n\r\n if (config.outlineNamespace) {\r\n privateAPI(sheet).template.setOutlineNamespaceConfig(\r\n formatOutlineNamespacePathKey([namespace]),\r\n config.outlineNamespace,\r\n )\r\n }\r\n\r\n const entry: GsapScrollTriggerRegistryEntry = {\r\n id,\r\n label: value.label,\r\n scrollTrigger: st,\r\n sheetObject: sheetObjectInternal,\r\n layout: value.layout,\r\n kind: value.kind,\r\n animationSpanSeconds: value.animationSpanSeconds,\r\n timelineChildren: value.timelineChildren,\r\n }\r\n\r\n registerScrollTriggerInRegistry(sheetKey, entry)\r\n\r\n return {id, sheetObject: sheetObjectPublic}\r\n}\r\n\r\n/**\r\n * Registers a GSAP ScrollTrigger for read-only visualization on the page-mode sequencer.\r\n */\r\nexport function registerGsapScrollTrigger(\r\n scrollTrigger: GsapScrollTriggerLike,\r\n sheet: ISheet,\r\n options: RegisterGsapScrollTriggerOptions,\r\n): RegisterGsapScrollTriggerResult {\r\n assertPageMode(sheet)\r\n requireGsapScrollTriggerPlugin()\r\n\r\n const result = registerOneGsapScrollTriggerOnSheet(\r\n sheet,\r\n scrollTrigger,\r\n options,\r\n 0,\r\n )\r\n if (!result) {\r\n throw new Error(\r\n `Could not register ScrollTrigger \"${options.label}\". See console warnings for details.`,\r\n )\r\n }\r\n scheduleGsapTickerRafWarningCheck()\r\n return result\r\n}\r\n\r\n/**\r\n * Re-reads layout for all scroll triggers registered on this sheet (after ST refresh / resize).\r\n */\r\nexport function refreshRegisteredGsapScrollTriggerLayouts(sheet: ISheet): void {\r\n if (sheet.getSequenceMode() !== 'page') return\r\n const sheetInternal = privateAPI(sheet)\r\n const sheetKey = sheetAddressKey(sheetInternal.address)\r\n refreshScrollTriggerLayoutsForSheet(\r\n sheetKey,\r\n sequenceLengthForSheet(sheet),\r\n getTheatrePageScrollContext(),\r\n )\r\n}\r\n", "import {readGsapTweenTimelineDuration} from './syncGsapClipProgress'\r\nimport {\r\n defaultPageScrollContext,\r\n isVerticalPageScrollTrigger,\r\n} from '@unseenco/theatre-shared/sheets/pageScrollContext'\r\n\r\nexport type GsapScrollTriggerSurface = {\r\n start: number\r\n end: number\r\n horizontal?: boolean\r\n scroller?: unknown\r\n trigger?: unknown\r\n animation?: unknown\r\n vars?: {\r\n id?: string\r\n animation?: unknown\r\n horizontal?: boolean\r\n scroller?: unknown\r\n }\r\n}\r\n\r\nfunction isWindowLike(value: unknown): boolean {\r\n return (\r\n typeof Window !== 'undefined' &&\r\n (value === window || value instanceof Window)\r\n )\r\n}\r\n\r\n/** @internal */\r\nexport function isDocumentScroller(value: unknown): boolean {\r\n if (value == null) return true\r\n if (isWindowLike(value)) return true\r\n if (typeof document === 'undefined') return false\r\n return value === document.documentElement || value === document.body\r\n}\r\n\r\n/** True when ST uses default document vertical scroll (page-mode sync target). */\r\nexport function isDocumentVerticalScrollTrigger(st: unknown): boolean {\r\n return isVerticalPageScrollTrigger(st, defaultPageScrollContext)\r\n}\r\n\r\nexport function resolveScrollTriggerAnimation(\r\n st: unknown,\r\n): unknown | undefined {\r\n const surface = st as GsapScrollTriggerSurface\r\n if (surface.animation != null) return surface.animation\r\n if (surface.vars?.animation != null) return surface.vars.animation\r\n return undefined\r\n}\r\n\r\nexport function defaultScrollTriggerLabel(\r\n st: unknown,\r\n fallbackIndex: number,\r\n): string {\r\n const surface = st as GsapScrollTriggerSurface\r\n const id = surface.vars?.id\r\n if (typeof id === 'string' && id.length > 0) return id\r\n const trigger = surface.trigger\r\n if (trigger && typeof trigger === 'object' && 'id' in trigger) {\r\n const elementId = (trigger as {id?: string}).id\r\n if (typeof elementId === 'string' && elementId.length > 0) {\r\n return elementId\r\n }\r\n }\r\n return `ScrollTrigger ${fallbackIndex + 1}`\r\n}\r\n\r\nexport function readAnimationSpanSeconds(animation: unknown): number {\r\n return Math.max(readGsapTweenTimelineDuration(animation), MIN_ANIMATION_SPAN)\r\n}\r\n\r\nconst MIN_ANIMATION_SPAN = 0.01\r\n", "import type {\r\n PageScrollAxis,\r\n PageScrollScroller,\r\n} from '@unseenco/theatre-shared/sheets/pageScrollContext'\r\nimport {isNativeDocumentScroller} from '@unseenco/theatre-shared/sheets/pageScrollContext'\r\n\r\n/** Minimum clip duration in sequence units (page mode uses 0\u2013100). */\r\nconst MIN_SEQUENCE_DURATION = 0.01\r\n\r\n/**\r\n * Maps resolved ScrollTrigger scroll positions (px on the document scroller)\r\n * to Theatre sequence units.\r\n */\r\nexport function scrollPixelsToPageUnits(\r\n startPx: number,\r\n endPx: number,\r\n maxScrollPx: number,\r\n sequenceLength: number,\r\n): {start: number; duration: number} {\r\n const length = Math.max(sequenceLength, MIN_SEQUENCE_DURATION)\r\n\r\n if (maxScrollPx <= 0) {\r\n return {start: 0, duration: length}\r\n }\r\n\r\n const startProgress = Math.max(0, Math.min(1, startPx / maxScrollPx))\r\n const endProgress = Math.max(0, Math.min(1, endPx / maxScrollPx))\r\n const lo = Math.min(startProgress, endProgress)\r\n const hi = Math.max(startProgress, endProgress)\r\n\r\n let start = lo * length\r\n let duration = Math.max((hi - lo) * length, MIN_SEQUENCE_DURATION)\r\n\r\n if (start + duration > length) {\r\n start = Math.max(0, length - duration)\r\n }\r\n if (start < 0) start = 0\r\n\r\n return {start, duration}\r\n}\r\n\r\n/** Matches {@link createNativeDocumentScrollDriver} max scroll. */\r\nexport function getNativeDocumentMaxScroll(\r\n axis: PageScrollAxis = 'vertical',\r\n): number {\r\n if (typeof document === 'undefined' || typeof window === 'undefined') {\r\n return 0\r\n }\r\n const el = document.documentElement\r\n if (axis === 'horizontal') {\r\n const scrolling = (document.scrollingElement ?? el) as HTMLElement\r\n return Math.max(0, scrolling.scrollWidth - scrolling.clientWidth)\r\n }\r\n return Math.max(0, el.scrollHeight - window.innerHeight)\r\n}\r\n\r\nexport function getMaxScrollForScroller(\r\n scroller: PageScrollScroller,\r\n axis: PageScrollAxis = 'vertical',\r\n): number {\r\n if (typeof document === 'undefined' || typeof window === 'undefined') {\r\n return 0\r\n }\r\n if (isNativeDocumentScroller(scroller)) {\r\n return getNativeDocumentMaxScroll(axis)\r\n }\r\n const el = scroller as HTMLElement\r\n if (axis === 'horizontal') {\r\n return Math.max(0, el.scrollWidth - el.clientWidth)\r\n }\r\n return Math.max(0, el.scrollHeight - el.clientHeight)\r\n}\r\n\r\nexport function getMaxScrollForPageScrollContext(\r\n scroller: PageScrollScroller,\r\n axis: PageScrollAxis = 'vertical',\r\n): number {\r\n return getMaxScrollForScroller(scroller, axis)\r\n}\r\n", "import type {PageScrollAxis} from './pageScrollContext'\r\n\r\nexport type RemotePageScrollMetrics = {\r\n maxScroll: number\r\n axis: PageScrollAxis\r\n}\r\n\r\nlet remoteMetrics: RemotePageScrollMetrics | undefined\r\n\r\nconst listeners = new Set<() => void>()\r\n\r\nexport function setRemotePageScrollMetrics(\r\n metrics: RemotePageScrollMetrics | undefined,\r\n): void {\r\n const prev = remoteMetrics\r\n remoteMetrics = metrics\r\n if (\r\n prev?.maxScroll !== metrics?.maxScroll ||\r\n prev?.axis !== metrics?.axis\r\n ) {\r\n for (const listener of listeners) {\r\n listener()\r\n }\r\n }\r\n}\r\n\r\nexport function getRemotePageScrollMetrics(): RemotePageScrollMetrics | undefined {\r\n return remoteMetrics\r\n}\r\n\r\nexport function onRemotePageScrollMetricsChange(\r\n listener: () => void,\r\n): () => void {\r\n listeners.add(listener)\r\n return () => {\r\n listeners.delete(listener)\r\n }\r\n}\r\n\r\n/**\r\n * When the local document has no scroll range (e.g. remote editor with hidden\r\n * demo), use metrics broadcast from the main preview window.\r\n */\r\nexport function resolveMaxScrollPxForPageLayout(\r\n localMaxScrollPx: number,\r\n axis: PageScrollAxis,\r\n): number {\r\n if (localMaxScrollPx > 0) {\r\n return localMaxScrollPx\r\n }\r\n const remote = remoteMetrics\r\n if (remote && remote.axis === axis && remote.maxScroll > 0) {\r\n return remote.maxScroll\r\n }\r\n return localMaxScrollPx\r\n}\r\n", "import type {GsapTimelineChildClip} from '@unseenco/theatre-core/projects/store/types/SheetState_Historic'\r\nimport {\r\n introspectGsapTimelineChildren,\r\n isGsapTimeline,\r\n} from './introspectGsapTimelineChildren'\r\nimport type {GsapScrollTriggerSurface} from './scrollTriggerGuards'\r\nimport {\r\n defaultScrollTriggerLabel,\r\n readAnimationSpanSeconds,\r\n resolveScrollTriggerAnimation,\r\n} from './scrollTriggerGuards'\r\nimport {\r\n defaultPageScrollContext,\r\n isPageScrollTrigger,\r\n resolvePageScrollAxis,\r\n} from '@unseenco/theatre-shared/sheets/pageScrollContext'\r\nimport type {PageScrollContext} from '@unseenco/theatre-shared/sheets/pageScrollContext'\r\nimport {\r\n getMaxScrollForPageScrollContext,\r\n scrollPixelsToPageUnits,\r\n} from './scrollTriggerLayout'\r\nimport {resolveMaxScrollPxForPageLayout} from '@unseenco/theatre-shared/sheets/remotePageScrollMetrics'\r\n\r\nexport type {\r\n PageScrollContext,\r\n PageScrollScroller,\r\n} from '@unseenco/theatre-shared/sheets/pageScrollContext'\r\nexport {\r\n defaultPageScrollContext,\r\n isPageScrollTrigger,\r\n isVerticalPageScrollTrigger,\r\n pageScrollScrollersMatch,\r\n resolvePageScrollScroller,\r\n} from '@unseenco/theatre-shared/sheets/pageScrollContext'\r\n\r\nexport type ExtractedScrollTriggerLayout = {\r\n id: string\r\n label: string\r\n layout: {start: number; duration: number}\r\n kind: 'tween' | 'timeline'\r\n animationSpanSeconds: number\r\n timelineChildren: GsapTimelineChildClip[]\r\n}\r\n\r\nexport type ExtractScrollTriggerLayoutOptions = {\r\n sequenceLength: number\r\n /** Stable id override from registration. */\r\n id?: string\r\n label?: string\r\n fallbackIndex?: number\r\n pageScrollContext?: PageScrollContext\r\n}\r\n\r\nexport type ExtractScrollTriggerLayoutResult =\r\n | {ok: true; value: ExtractedScrollTriggerLayout}\r\n | {ok: false; reason: 'unsupported_scroller' | 'missing_animation'}\r\n\r\n/**\r\n * Reads resolved ST start/end and maps to sequence units for page-mode visualization.\r\n */\r\nexport function extractScrollTriggerLayout(\r\n st: unknown,\r\n options: ExtractScrollTriggerLayoutOptions,\r\n): ExtractScrollTriggerLayoutResult {\r\n const pageScrollContext =\r\n options.pageScrollContext ?? defaultPageScrollContext\r\n if (!isPageScrollTrigger(st, pageScrollContext)) {\r\n return {ok: false, reason: 'unsupported_scroller'}\r\n }\r\n\r\n const surface = st as GsapScrollTriggerSurface\r\n const animation = resolveScrollTriggerAnimation(st)\r\n if (!animation) {\r\n return {ok: false, reason: 'missing_animation'}\r\n }\r\n\r\n const axis = resolvePageScrollAxis(pageScrollContext)\r\n const localMaxScroll = getMaxScrollForPageScrollContext(\r\n pageScrollContext.scroller,\r\n axis,\r\n )\r\n const maxScroll = resolveMaxScrollPxForPageLayout(localMaxScroll, axis)\r\n const layout = scrollPixelsToPageUnits(\r\n surface.start,\r\n surface.end,\r\n maxScroll,\r\n options.sequenceLength,\r\n )\r\n\r\n const fallbackIndex = options.fallbackIndex ?? 0\r\n const label = options.label ?? defaultScrollTriggerLabel(st, fallbackIndex)\r\n const id =\r\n options.id ??\r\n (typeof surface.vars?.id === 'string' && surface.vars.id.length > 0\r\n ? surface.vars.id\r\n : `st_${label.replace(/\\s+/g, '_')}_${fallbackIndex}`)\r\n\r\n const kind = isGsapTimeline(animation) ? 'timeline' : 'tween'\r\n const animationSpanSeconds = readAnimationSpanSeconds(animation)\r\n const timelineChildren =\r\n kind === 'timeline' ? introspectGsapTimelineChildren(animation) : []\r\n\r\n return {\r\n ok: true,\r\n value: {\r\n id,\r\n label,\r\n layout,\r\n kind,\r\n animationSpanSeconds,\r\n timelineChildren,\r\n },\r\n }\r\n}\r\n\r\n/** Maps timeline child local times into sequence space inside a scroll-trigger span. */\r\nexport function scrollTriggerChildInSequenceSpace(\r\n parentStart: number,\r\n parentDuration: number,\r\n animationSpanSeconds: number,\r\n child: Pick<GsapTimelineChildClip, 'localStart' | 'localDuration'>,\r\n): {start: number; duration: number} {\r\n const span = Math.max(animationSpanSeconds, 0.01)\r\n const start = parentStart + (child.localStart / span) * parentDuration\r\n const duration = Math.max((child.localDuration / span) * parentDuration, 0.01)\r\n return {start, duration}\r\n}\r\n\r\n/** Single tween child: spans the full scroll-trigger bar (scrub maps 0\u20131). */\r\nexport function scrollTriggerTweenChildInSequenceSpace(\r\n parentStart: number,\r\n parentDuration: number,\r\n tweenDurationSeconds: number,\r\n): {start: number; duration: number} {\r\n void tweenDurationSeconds\r\n return {start: parentStart, duration: parentDuration}\r\n}\r\n", "import type SheetObject from '@unseenco/theatre-core/sheetObjects/SheetObject'\r\nimport type {GsapTimelineChildClip} from '@unseenco/theatre-core/projects/store/types/SheetState_Historic'\r\nimport type {SheetAddress} from '@unseenco/theatre-shared/utils/addresses'\r\nimport type {SheetInstanceId} from '@unseenco/theatre-shared/utils/ids'\r\nimport {isGsapScrollTriggerSheetObjectKey} from './gsapSheetObjectKey'\r\nimport {bumpGsapStudioRegistryRevision} from './gsapStudioRegistryRevision'\r\n\r\nconst DEFAULT_SHEET_INSTANCE_ID = 'default' as SheetInstanceId\r\nconst REGISTRY_KEY = '__unseenco_theatre_gsap_scrollTriggerRegistry__'\r\n\r\nexport type GsapScrollTriggerLayout = {\r\n start: number\r\n duration: number\r\n}\r\n\r\nexport type GsapScrollTriggerRegistryEntry = {\r\n id: string\r\n label: string\r\n scrollTrigger: unknown\r\n sheetObject?: SheetObject\r\n layout: GsapScrollTriggerLayout\r\n kind: 'tween' | 'timeline'\r\n animationSpanSeconds: number\r\n timelineChildren: GsapTimelineChildClip[]\r\n}\r\n\r\ntype RegistryStore = {\r\n bySheetAddress: Map<string, Map<string, GsapScrollTriggerRegistryEntry>>\r\n}\r\n\r\nexport function sheetAddressKey(address: SheetAddress): string {\r\n const sheetInstanceId = address.sheetInstanceId ?? DEFAULT_SHEET_INSTANCE_ID\r\n return `${address.projectId}|${address.sheetId}|${sheetInstanceId}`\r\n}\r\n\r\nfunction getStore(): RegistryStore {\r\n const g = globalThis as typeof globalThis & {\r\n [REGISTRY_KEY]?: RegistryStore\r\n }\r\n if (!g[REGISTRY_KEY]) {\r\n g[REGISTRY_KEY] = {bySheetAddress: new Map()}\r\n }\r\n return g[REGISTRY_KEY]!\r\n}\r\n\r\nfunction getSheetMap(key: string): Map<string, GsapScrollTriggerRegistryEntry> {\r\n const store = getStore()\r\n let map = store.bySheetAddress.get(key)\r\n if (!map) {\r\n map = new Map()\r\n store.bySheetAddress.set(key, map)\r\n }\r\n return map\r\n}\r\n\r\nexport function registerScrollTriggerInRegistry(\r\n sheetKey: string,\r\n entry: GsapScrollTriggerRegistryEntry,\r\n): 'registered' | 'duplicate' {\r\n const map = getSheetMap(sheetKey)\r\n for (const existing of map.values()) {\r\n if (existing.scrollTrigger === entry.scrollTrigger) {\r\n return 'duplicate'\r\n }\r\n if (existing.id === entry.id) {\r\n return 'duplicate'\r\n }\r\n }\r\n map.set(entry.id, entry)\r\n bumpGsapStudioRegistryRevision()\r\n return 'registered'\r\n}\r\n\r\nexport function findScrollTriggerEntryByInstance(\r\n sheetKey: string,\r\n scrollTrigger: unknown,\r\n): GsapScrollTriggerRegistryEntry | undefined {\r\n const map = getStore().bySheetAddress.get(sheetKey)\r\n if (!map) return undefined\r\n for (const entry of map.values()) {\r\n if (entry.scrollTrigger === scrollTrigger) {\r\n return entry\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nexport function updateScrollTriggerLayoutInRegistry(\r\n sheetKey: string,\r\n id: string,\r\n patch: Pick<\r\n GsapScrollTriggerRegistryEntry,\r\n 'layout' | 'timelineChildren' | 'animationSpanSeconds' | 'kind'\r\n >,\r\n): void {\r\n const existing = getSheetMap(sheetKey).get(id)\r\n if (!existing) return\r\n getSheetMap(sheetKey).set(id, {...existing, ...patch})\r\n bumpGsapStudioRegistryRevision()\r\n}\r\n\r\nexport function listScrollTriggerEntriesForSheet(\r\n sheetKey: string,\r\n): GsapScrollTriggerRegistryEntry[] {\r\n const map = getStore().bySheetAddress.get(sheetKey)\r\n if (!map) return []\r\n return [...map.values()].sort((a, b) => a.layout.start - b.layout.start)\r\n}\r\n\r\n/** Whether this GSAP ScrollTrigger proxy should appear in the page-mode sequencer. */\r\nexport function isRegisteredScrollTriggerSheetObject(\r\n sheetObject: Pick<SheetObject, 'address'>,\r\n): boolean {\r\n if (!isGsapScrollTriggerSheetObjectKey(sheetObject.address.objectKey)) {\r\n return false\r\n }\r\n const key = sheetAddressKey(sheetObject.address)\r\n return listScrollTriggerEntriesForSheet(key).some(\r\n (entry) =>\r\n entry.sheetObject?.address.objectKey === sheetObject.address.objectKey,\r\n )\r\n}\r\n\r\nexport function getScrollTriggerEntry(\r\n sheetKey: string,\r\n id: string,\r\n): GsapScrollTriggerRegistryEntry | undefined {\r\n return getStore().bySheetAddress.get(sheetKey)?.get(id)\r\n}\r\n\r\nexport function clearScrollTriggerRegistryForTests(): void {\r\n getStore().bySheetAddress.clear()\r\n}\r\n", "import type {\r\n AttachTheatrePageScrollOptions,\r\n ISheet,\r\n PageScrollContext,\r\n PageScrollScroller,\r\n ScrollDriver,\r\n} from '@unseenco/theatre-core'\r\nimport {\r\n attachTheatrePageScroll as attachTheatrePageScrollCore,\r\n createDefaultPageScrollDriver as createDefaultPageScrollDriverCore,\r\n getTheatrePageScrollContext as getTheatrePageScrollContextCore,\r\n} from '@unseenco/theatre-core'\r\nimport {\r\n defaultPageScrollContext,\r\n resolvePageScrollAxis,\r\n setActivePageScrollContext,\r\n} from '@unseenco/theatre-shared/sheets/pageScrollContext'\r\nimport {getTheatreGsapConfig} from './config'\r\nimport {getGsapScrollTriggerPlugin} from './gsapScrollTriggerPlugin'\r\n\r\nfunction applyScrollTriggerDefaultsFromGsapConfig(): void {\r\n const {pageScroll} = getTheatreGsapConfig()\r\n if (!pageScroll) return\r\n const ScrollTrigger = getGsapScrollTriggerPlugin()\r\n if (!ScrollTrigger?.defaults) return\r\n const axis = pageScroll.axis ?? defaultPageScrollContext.axis ?? 'vertical'\r\n ScrollTrigger.defaults({\r\n scroller: pageScroll.scroller ?? undefined,\r\n ...(axis === 'horizontal' ? {horizontal: true} : {}),\r\n })\r\n}\r\n\r\nexport function getTheatrePageScrollContext(): PageScrollContext {\r\n applyScrollTriggerDefaultsFromGsapConfig()\r\n const pageScroll = getTheatreGsapConfig().pageScroll\r\n if (pageScroll) {\r\n const ctx = {\r\n scroller: pageScroll.scroller ?? defaultPageScrollContext.scroller,\r\n axis: pageScroll.axis ?? defaultPageScrollContext.axis,\r\n }\r\n setActivePageScrollContext(ctx)\r\n return ctx\r\n }\r\n return getTheatrePageScrollContextCore()\r\n}\r\n\r\nexport function createDefaultPageScrollDriver(\r\n scroller: PageScrollScroller = getTheatrePageScrollContext().scroller,\r\n): ScrollDriver {\r\n const ctx = getTheatrePageScrollContext()\r\n return createDefaultPageScrollDriverCore(scroller, resolvePageScrollAxis(ctx))\r\n}\r\n\r\nexport type {AttachTheatrePageScrollOptions}\r\n\r\n/**\r\n * @deprecated Import from `@unseenco/theatre-core` for page scroll without GSAP.\r\n * This wrapper applies ScrollTrigger defaults when `configureTheatreGsap({ pageScroll })` is used.\r\n */\r\nexport function attachTheatrePageScroll(\r\n sheet: ISheet,\r\n options: AttachTheatrePageScrollOptions = {},\r\n): () => void {\r\n applyScrollTriggerDefaultsFromGsapConfig()\r\n return attachTheatrePageScrollCore(sheet, options)\r\n}\r\n", "export function refreshGsapScrollTriggersFromGlobal(): void {\r\n const ScrollTrigger = (\r\n globalThis as typeof globalThis & {\r\n ScrollTrigger?: {refresh?: () => void}\r\n }\r\n ).ScrollTrigger\r\n ScrollTrigger?.refresh?.()\r\n}\r\n", "import {extractScrollTriggerLayout} from './extractScrollTriggerLayout'\r\nimport {defaultPageScrollContext} from '@unseenco/theatre-shared/sheets/pageScrollContext'\r\nimport type {PageScrollContext} from '@unseenco/theatre-shared/sheets/pageScrollContext'\r\nimport {refreshGsapScrollTriggersFromGlobal} from './scrollTriggerGlobal'\r\nimport {\r\n listScrollTriggerEntriesForSheet,\r\n updateScrollTriggerLayoutInRegistry,\r\n} from './scrollTriggerRegistry'\r\n\r\n/** Re-measures all registered ScrollTriggers on a sheet (after ST refresh / resize). */\r\nexport function refreshScrollTriggerLayoutsForSheet(\r\n sheetKey: string,\r\n sequenceLength: number,\r\n pageScrollContext: PageScrollContext = defaultPageScrollContext,\r\n): void {\r\n refreshGsapScrollTriggersFromGlobal()\r\n\r\n for (const entry of listScrollTriggerEntriesForSheet(sheetKey)) {\r\n const extracted = extractScrollTriggerLayout(entry.scrollTrigger, {\r\n sequenceLength,\r\n id: entry.id,\r\n label: entry.label,\r\n pageScrollContext,\r\n })\r\n if (!extracted.ok) continue\r\n updateScrollTriggerLayoutInRegistry(sheetKey, entry.id, {\r\n layout: extracted.value.layout,\r\n kind: extracted.value.kind,\r\n animationSpanSeconds: extracted.value.animationSpanSeconds,\r\n timelineChildren: extracted.value.timelineChildren,\r\n })\r\n }\r\n}\r\n", "import type {ISheet} from '@unseenco/theatre-core'\r\nimport {privateAPI} from '@unseenco/theatre-core/privateAPIs'\r\nimport {defaultScrollTriggerLabel} from '@unseenco/theatre-shared/gsap/scrollTriggerGuards'\r\nimport {registerOneGsapScrollTriggerOnSheet} from './registerGsapScrollTrigger'\r\nimport type {RegisterGsapScrollTriggerResult} from './registerGsapScrollTrigger'\r\nimport type {GsapScrollTriggerLike} from './gsapScrollTriggerTypes'\r\nimport {\r\n findScrollTriggerEntryByInstance,\r\n sheetAddressKey,\r\n} from '@unseenco/theatre-shared/gsap/scrollTriggerRegistry'\r\nimport {\r\n refreshGsapScrollTriggers,\r\n requireGsapScrollTriggerPlugin,\r\n} from './gsapScrollTriggerPlugin'\r\nimport {scheduleGsapTickerRafWarningCheck} from './gsapTickerRafBridge'\r\n\r\nexport type RegisterAllGsapScrollTriggersResult = {\r\n registered: RegisterGsapScrollTriggerResult[]\r\n skipped: number\r\n}\r\n\r\n/**\r\n * Registers every document-vertical ScrollTrigger from `ScrollTrigger.getAll()`.\r\n */\r\nexport function registerAllGsapScrollTriggers(\r\n sheet: ISheet,\r\n): RegisterAllGsapScrollTriggersResult {\r\n if (sheet.getSequenceMode() !== 'page') {\r\n throw new Error(\r\n 'registerAllGsapScrollTriggers() requires the sheet to use sequenceMode \"page\".',\r\n )\r\n }\r\n\r\n const ScrollTrigger = requireGsapScrollTriggerPlugin()\r\n refreshGsapScrollTriggers()\r\n const all = ScrollTrigger.getAll()\r\n const sheetKey = sheetAddressKey(privateAPI(sheet).address)\r\n\r\n const registered: RegisterGsapScrollTriggerResult[] = []\r\n let skipped = 0\r\n\r\n all.forEach((st, index) => {\r\n const already = findScrollTriggerEntryByInstance(sheetKey, st)\r\n const label = defaultScrollTriggerLabel(st, index)\r\n const id =\r\n typeof st.vars?.id === 'string' && st.vars.id.length > 0\r\n ? st.vars.id\r\n : undefined\r\n const result = registerOneGsapScrollTriggerOnSheet(\r\n sheet,\r\n st as GsapScrollTriggerLike,\r\n {label, id},\r\n index,\r\n )\r\n if (!result) {\r\n skipped += 1\r\n } else if (already) {\r\n skipped += 1\r\n } else {\r\n registered.push(result)\r\n }\r\n })\r\n\r\n scheduleGsapTickerRafWarningCheck()\r\n\r\n return {registered, skipped}\r\n}\r\n", "export {attachGsapSequenceBridge} from '@unseenco/theatre-core'\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ref", "source", "root", "Symbol", "objectProto", "nativeObjectToString", "symToStringTag", "funcProto", "objectProto", "funcToString", "hasOwnProperty", "objectProto", "hasOwnProperty", "objectProto", "hasOwnProperty", "HASH_UNDEFINED", "Map", "INFINITY", "funcProto", "objectProto", "funcToString", "hasOwnProperty", "root", "state", "pushCollector", "popCollector", "startIgnoringDependencies", "stopIgnoringDependencies", "reportResolutionStart", "reportResolutionEnd", "root", "state", "ref", "effect", "memo", "value", "setValue", "getValue", "scope", "sub", "getValue", "scope", "pointer", "scope", "getValue", "getStore", "getStore", "registerAnimationInRegistry", "getAnimationEntry", "getAnimationEntryForSheetObject", "listAnimationEntries", "registerAnimationInRegistry", "privateAPI", "DEFAULT_SHEET_INSTANCE_ID", "REGISTRY_KEY", "getStore", "privateAPI", "privateAPI", "privateAPI"]
|
|
7
7
|
}
|