@player-ui/markdown-plugin 0.10.0-next.3 → 0.10.0-next.5
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/ts-nested-error@1.2.1/node_modules/ts-nested-error/src/nested-error.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/timm@1.7.1/node_modules/timm/lib/timm.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/p-defer@3.0.0/node_modules/p-defer/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/queue-microtask@1.2.3/node_modules/queue-microtask/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/sorted-array@2.0.4/node_modules/sorted-array/sorted-array.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/index.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/tapable-ts@0.2.4/node_modules/tapable-ts/src/utils.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/tapable-ts@0.2.4/node_modules/tapable-ts/src/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/binding/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/binding/resolver.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/dlv@1.1.3/node_modules/dlv/index.js","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/data/local-model.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/expressions/evaluator.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/string-resolver/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/validator/validation-middleware.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/resolver/index.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/dequal@2.0.3/node_modules/dequal/dist/index.mjs","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/parser/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/string-resolver.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/applicability.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/player.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/flow/flow.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/validation/controller.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/view/controller.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/partial-match-registry/src/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/partial-match-registry/src/deep-partial-matcher.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/binding-grammar/ast.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/binding-grammar/custom/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/binding/utils.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/binding/binding.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/data/dependency-tracker.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/data/noop-model.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/data/model.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/expressions/types.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/expressions/parser.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/expressions/evaluator-functions.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/expressions/utils.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/logger/tapableLogger.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/logger/proxyLogger.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/schema/schema.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/validator/binding-map-splice.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/validator/registry.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/parser/types.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/parser/utils.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/resolver/utils.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/view.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/template.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/switch.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/multi-node.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/asset.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/flow/controller.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/utils/replaceParams.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/validation/binding-tracker.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/view/store.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/view/asset-transform.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/data/utils.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/data/controller.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/constants/utils.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/constants/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/plugins/flow-exp-plugin.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/plugins/default-exp-plugin.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/types.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/plugins/default-view-plugin.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/mdast-util-to-string@4.0.0/node_modules/mdast-util-to-string/lib/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/character-entities@2.0.2/node_modules/character-entities/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/decode-named-character-reference@1.0.2/node_modules/decode-named-character-reference/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-chunked@2.0.0/node_modules/micromark-util-chunked/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-combine-extensions@2.0.0/node_modules/micromark-util-combine-extensions/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-decode-numeric-character-reference@2.0.1/node_modules/micromark-util-decode-numeric-character-reference/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-normalize-identifier@2.0.0/node_modules/micromark-util-normalize-identifier/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-character@2.1.0/node_modules/micromark-util-character/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-factory-space@2.0.0/node_modules/micromark-factory-space/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/initialize/content.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/initialize/document.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-classify-character@2.0.0/node_modules/micromark-util-classify-character/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-resolve-all@2.0.0/node_modules/micromark-util-resolve-all/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/attention.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/autolink.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/blank-line.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/block-quote.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/character-escape.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/character-reference.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/code-fenced.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/code-indented.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/code-text.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-subtokenize@2.0.1/node_modules/micromark-util-subtokenize/lib/splice-buffer.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-subtokenize@2.0.1/node_modules/micromark-util-subtokenize/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/content.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-factory-destination@2.0.0/node_modules/micromark-factory-destination/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-factory-label@2.0.0/node_modules/micromark-factory-label/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-factory-title@2.0.0/node_modules/micromark-factory-title/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-factory-whitespace@2.0.0/node_modules/micromark-factory-whitespace/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/definition.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/hard-break-escape.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/heading-atx.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-html-tag-name@2.0.0/node_modules/micromark-util-html-tag-name/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/html-flow.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/html-text.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/label-end.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/label-start-image.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/label-start-link.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/line-ending.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/thematic-break.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/list.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/setext-underline.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/initialize/flow.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/initialize/text.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/create-tokenizer.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/constructs.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/parse.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/postprocess.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/preprocess.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-decode-string@2.0.0/node_modules/micromark-util-decode-string/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/unist-util-stringify-position@4.0.0/node_modules/unist-util-stringify-position/lib/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/mdast-util-from-markdown@2.0.0/node_modules/mdast-util-from-markdown/lib/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/utils/transformers.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/utils/markdownParser.ts"],"names":["NestedError","clone","addLast","removeAt","set","setIn","omit","hasOwnProperty","deferred","SortedArray","index","t","import_ts_nested_error","obj","key","def","p","undef","split","length","import_timm","import_p_defer","node","normalized","__export","SyncWaterfallHook","SyncBailHook","SyncHook","parse","NodeType","value","children","update","resolver","flow","defer","all","queueMicrotask","dequal","_Player","list","extension","previous","point","constructs","text","attentionMarkers","effects","ok","nok","start","furtherStart","content","titleBefore","definition","exit","from","document","string","head","own","blockQuote","codeText","thematicBreak","listItem","data","transformers","transformer"],"mappings":"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","sourcesContent":["/**\n * Subclass of standard `Error` that eagerly collects the callstack of the error\n * that caused it. This way you can investigate the core problem that happened\n * by looking at the callstack from up to bottom (from higher level errors to\n * lower level).\n */\nexport class NestedError extends Error {\n /**\n * Combined callstack of this error and the errors that it wraps.\n * If the JavaScript runtime doesn't support `Error::stack` property\n * this will contain only the concatenated messages.\n */\n readonly stack: string;\n\n /**\n * The list of lower-level errors wrapped by this error.\n */\n readonly innerErrors: Error[];\n\n /**\n * Provides the first `Error` of the `innerErrors` (if it exists);\n * otherwise, `null`.\n *\n * @deprecated Please shift to using the `innerErrors` (with an 's') property.\n */\n get innerError(): Error | null {\n return this.innerErrors.length === 0\n ? null\n : this.innerErrors[0];\n }\n\n private static readonly getErrorReport = typeof new Error().stack === 'string'\n ? (err: Error) => err.stack!\n : (err: Error) => `${err.name}: ${err.message}`;\n\n /**\n * Returns the function that accepts any value that was thrown as the first argument and\n * throws it wrapped into `NestedError` or class derived from `NestedError` (provided\n * this method was called directly in the context of that dervied class constructor)\n * with the given `message`.\n * Returned function will pass accepted `Error` object directly to `NestedError`\n * as `innerErrors` by invoking `toError(err)` on it.\n *\n * You'll most likely want to use this method with promises:\n *\n * ```ts\n * userService.getPage().then(\n * data => console.log(`Hooray! data: ${data}`),\n * NestedError.rethrow('failed to fetch users page')\n * );\n * ```\n *\n * @param message Message to attach `NestedError` created by the returned function.\n */\n static rethrow(message: string) {\n return (...errs: unknown[]) => { throw new this(message, ...errs); };\n }\n\n /**\n * Allocates an instance of `NestedError` with the given error `message` and\n * optional `innerError` (which will be automatically coerced using `toError()`).\n *\n * @param message Laconic error message to attach to the created `NestedError`.\n * @param innerErrors Optional errors that will be wrapped by this higher level\n * error. This value will be automatically coerced using `toError()`.\n */\n constructor(message?: string, ...innerErrors: unknown[]) {\n super(message);\n const thisErrorReport = NestedError.getErrorReport(this);\n if (innerErrors.length === 1) {\n const innerError = toError(innerErrors[0]);\n this.innerErrors = [innerError];\n const errReport = NestedError.getErrorReport(innerError);\n this.stack = `${thisErrorReport}\\n\\n======= INNER ERROR =======\\n\\n${errReport}`;\n return;\n }\n this.innerErrors = innerErrors.map(err => toError(err));\n const innerErrorReports = this.innerErrors\n .map((error, idx) => {\n const errReport = NestedError.getErrorReport(error);\n return `======= INNER ERROR (${idx + 1} of ${innerErrors.length}) =======\\n\\n${errReport}`;\n })\n .join(\"\\n\\n\");\n this.stack = `${thisErrorReport}\\n\\n${innerErrorReports}`;\n }\n}\n\nNestedError.prototype.name = nameof(NestedError);\n\n/**\n * @deprecated You should not call this function on an object of statically assumed `Error` type,\n * because it is intended to be used in a dynamic context where the type of thrown value\n * is not known ahead of time (during the compile time).\n */\nexport function toError(err: Error): Error;\n\n/**\n * Returns `err` itself if `err instanceof Error === true`, otherwise attemts to\n * stringify it and wrap into `Error` object to be returned.\n *\n * **This function is guaranteed never to throw.**\n *\n * @param err Possbile `instanceof Error` to return or value of any type that will\n * be wrapped into a fully-fledged `Error` object.\n */\nexport function toError(err: unknown): Error;\n\nexport function toError(err: unknown) {\n try {\n return err instanceof Error\n ? err\n : new Error(`Value that is not an instance of Error was thrown: ${err}`);\n } catch {\n return new Error(\n \"Failed to stringify non-instance of Error that was thrown.\" +\n \"This is possibly due to the fact that toString() method of the value\" +\n \"doesn't return a primitive value.\"\n );\n }\n}\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.clone = clone;\nexports.addLast = addLast;\nexports.addFirst = addFirst;\nexports.removeLast = removeLast;\nexports.removeFirst = removeFirst;\nexports.insert = insert;\nexports.removeAt = removeAt;\nexports.replaceAt = replaceAt;\nexports.getIn = getIn;\nexports.set = set;\nexports.setIn = setIn;\nexports.update = update;\nexports.updateIn = updateIn;\nexports.merge = merge;\nexports.mergeDeep = mergeDeep;\nexports.mergeIn = mergeIn;\nexports.omit = omit;\nexports.addDefaults = addDefaults;\nexports.default = void 0;\n\n/* eslint-disable @typescript-eslint/ban-types */\n\n/*!\n * Timm\n *\n * Immutability helpers with fast reads and acceptable writes.\n *\n * @copyright Guillermo Grau Panea 2016\n * @license MIT\n */\nconst INVALID_ARGS = 'INVALID_ARGS';\nconst IS_DEV = process.env.NODE_ENV !== 'production';\n\n// ===============================================\n// ### Helpers\n// ===============================================\nfunction throwStr(msg) {\n throw new Error(msg);\n}\n\nfunction getKeysAndSymbols(obj) {\n const keys = Object.keys(obj);\n\n if (Object.getOwnPropertySymbols) {\n // @ts-ignore\n return keys.concat(Object.getOwnPropertySymbols(obj));\n }\n\n return keys;\n}\n\nconst hasOwnProperty = {}.hasOwnProperty;\n\nfunction clone(obj0) {\n // As array\n if (Array.isArray(obj0)) return obj0.slice(); // As object\n\n const obj = obj0;\n const keys = getKeysAndSymbols(obj);\n const out = {};\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n out[key] = obj[key];\n } // @ts-ignore (see type tests)\n\n\n return out;\n} // Custom guard\n\n\nfunction isObject(o) {\n return o != null && typeof o === 'object';\n} // _deepFreeze = (obj) ->\n// Object.freeze obj\n// for key in Object.getOwnPropertyNames obj\n// val = obj[key]\n// if isObject(val) and not Object.isFrozen val\n// _deepFreeze val\n// obj\n// ===============================================\n// -- ### Arrays\n// ===============================================\n// -- #### addLast()\n// -- Returns a new array with an appended item or items.\n// --\n// -- Usage: `addLast(array, val)`\n// --\n// -- ```js\n// -- arr = ['a', 'b']\n// -- arr2 = addLast(arr, 'c')\n// -- // ['a', 'b', 'c']\n// -- arr2 === arr\n// -- // false\n// -- arr3 = addLast(arr, ['c', 'd'])\n// -- // ['a', 'b', 'c', 'd']\n// -- ```\n// `array.concat(val)` also handles the scalar case,\n// but is apparently very slow\n\n\nfunction addLast(array, val) {\n if (Array.isArray(val)) return array.concat(val);\n return array.concat([val]);\n} // -- #### addFirst()\n// -- Returns a new array with a prepended item or items.\n// --\n// -- Usage: `addFirst(array, val)`\n// --\n// -- ```js\n// -- arr = ['a', 'b']\n// -- arr2 = addFirst(arr, 'c')\n// -- // ['c', 'a', 'b']\n// -- arr2 === arr\n// -- // false\n// -- arr3 = addFirst(arr, ['c', 'd'])\n// -- // ['c', 'd', 'a', 'b']\n// -- ```\n\n\nfunction addFirst(array, val) {\n if (Array.isArray(val)) return val.concat(array);\n return [val].concat(array);\n} // -- #### removeLast()\n// -- Returns a new array removing the last item.\n// --\n// -- Usage: `removeLast(array)`\n// --\n// -- ```js\n// -- arr = ['a', 'b']\n// -- arr2 = removeLast(arr)\n// -- // ['a']\n// -- arr2 === arr\n// -- // false\n// --\n// -- // The same array is returned if there are no changes:\n// -- arr3 = []\n// -- removeLast(arr3) === arr3\n// -- // true\n// -- ```\n\n\nfunction removeLast(array) {\n if (!array.length) return array;\n return array.slice(0, array.length - 1);\n} // -- #### removeFirst()\n// -- Returns a new array removing the first item.\n// --\n// -- Usage: `removeFirst(array)`\n// --\n// -- ```js\n// -- arr = ['a', 'b']\n// -- arr2 = removeFirst(arr)\n// -- // ['b']\n// -- arr2 === arr\n// -- // false\n// --\n// -- // The same array is returned if there are no changes:\n// -- arr3 = []\n// -- removeFirst(arr3) === arr3\n// -- // true\n// -- ```\n\n\nfunction removeFirst(array) {\n if (!array.length) return array;\n return array.slice(1);\n} // -- #### insert()\n// -- Returns a new array obtained by inserting an item or items\n// -- at a specified index.\n// --\n// -- Usage: `insert(array, idx, val)`\n// --\n// -- ```js\n// -- arr = ['a', 'b', 'c']\n// -- arr2 = insert(arr, 1, 'd')\n// -- // ['a', 'd', 'b', 'c']\n// -- arr2 === arr\n// -- // false\n// -- insert(arr, 1, ['d', 'e'])\n// -- // ['a', 'd', 'e', 'b', 'c']\n// -- ```\n\n\nfunction insert(array, idx, val) {\n return array.slice(0, idx).concat(Array.isArray(val) ? val : [val]).concat(array.slice(idx));\n} // -- #### removeAt()\n// -- Returns a new array obtained by removing an item at\n// -- a specified index.\n// --\n// -- Usage: `removeAt(array, idx)`\n// --\n// -- ```js\n// -- arr = ['a', 'b', 'c']\n// -- arr2 = removeAt(arr, 1)\n// -- // ['a', 'c']\n// -- arr2 === arr\n// -- // false\n// --\n// -- // The same array is returned if there are no changes:\n// -- removeAt(arr, 4) === arr\n// -- // true\n// -- ```\n\n\nfunction removeAt(array, idx) {\n if (idx >= array.length || idx < 0) return array;\n return array.slice(0, idx).concat(array.slice(idx + 1));\n} // -- #### replaceAt()\n// -- Returns a new array obtained by replacing an item at\n// -- a specified index. If the provided item is the same as\n// -- (*referentially equal to*) the previous item at that position,\n// -- the original array is returned.\n// --\n// -- Usage: `replaceAt(array, idx, newItem)`\n// --\n// -- ```js\n// -- arr = ['a', 'b', 'c']\n// -- arr2 = replaceAt(arr, 1, 'd')\n// -- // ['a', 'd', 'c']\n// -- arr2 === arr\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- replaceAt(arr, 1, 'b') === arr\n// -- // true\n// -- ```\n\n\nfunction replaceAt(array, idx, newItem) {\n if (array[idx] === newItem) return array;\n const len = array.length;\n const result = Array(len);\n\n for (let i = 0; i < len; i++) {\n result[i] = array[i];\n }\n\n result[idx] = newItem;\n return result;\n} // ===============================================\n// -- ### Collections (objects and arrays)\n// ===============================================\n// -- #### getIn()\n// -- Returns a value from an object at a given path. Works with\n// -- nested arrays and objects. If the path does not exist, it returns\n// -- `undefined`.\n// --\n// -- Usage: `getIn(obj, path)`\n// --\n// -- ```js\n// -- obj = { a: 1, b: 2, d: { d1: 3, d2: 4 }, e: ['a', 'b', 'c'] }\n// -- getIn(obj, ['d', 'd1'])\n// -- // 3\n// -- getIn(obj, ['e', 1])\n// -- // 'b'\n// -- ```\n\n\nfunction getIn(obj, path) {\n if (!Array.isArray(path)) {\n throwStr(IS_DEV ? 'A path array should be provided when calling getIn()' : INVALID_ARGS);\n }\n\n if (obj == null) return undefined;\n let ptr = obj;\n\n for (let i = 0; i < path.length; i++) {\n const key = path[i];\n ptr = ptr != null ? ptr[key] : undefined;\n if (ptr === undefined) return ptr;\n }\n\n return ptr;\n} // -- #### set()\n// -- Returns a new object with a modified attribute.\n// -- If the provided value is the same as (*referentially equal to*)\n// -- the previous value, the original object is returned.\n// --\n// -- Usage: `set(obj, key, val)`\n// --\n// -- ```js\n// -- obj = { a: 1, b: 2, c: 3 }\n// -- obj2 = set(obj, 'b', 5)\n// -- // { a: 1, b: 5, c: 3 }\n// -- obj2 === obj\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- set(obj, 'b', 2) === obj\n// -- // true\n// -- ```\n// When called with an undefined/null `obj`, `set()` returns either\n// a single-element array, or a single-key object\n\n\n// Implementation\nfunction set(obj0, key, val) {\n let obj = obj0;\n if (obj == null) obj = typeof key === 'number' ? [] : {};\n if (obj[key] === val) return obj;\n const obj2 = clone(obj);\n obj2[key] = val;\n return obj2;\n} // -- #### setIn()\n// -- Returns a new object with a modified **nested** attribute.\n// --\n// -- Notes:\n// --\n// -- * If the provided value is the same as (*referentially equal to*)\n// -- the previous value, the original object is returned.\n// -- * If the path does not exist, it will be created before setting\n// -- the new value.\n// --\n// -- Usage: `setIn(obj, path, val)`\n// --\n// -- ```js\n// -- obj = { a: 1, b: 2, d: { d1: 3, d2: 4 }, e: { e1: 'foo', e2: 'bar' } }\n// -- obj2 = setIn(obj, ['d', 'd1'], 4)\n// -- // { a: 1, b: 2, d: { d1: 4, d2: 4 }, e: { e1: 'foo', e2: 'bar' } }\n// -- obj2 === obj\n// -- // false\n// -- obj2.d === obj.d\n// -- // false\n// -- obj2.e === obj.e\n// -- // true\n// --\n// -- // The same object is returned if there are no changes:\n// -- obj3 = setIn(obj, ['d', 'd1'], 3)\n// -- // { a: 1, b: 2, d: { d1: 3, d2: 4 }, e: { e1: 'foo', e2: 'bar' } }\n// -- obj3 === obj\n// -- // true\n// -- obj3.d === obj.d\n// -- // true\n// -- obj3.e === obj.e\n// -- // true\n// --\n// -- // ... unknown paths create intermediate keys. Numeric segments are treated as array indices:\n// -- setIn({ a: 3 }, ['unknown', 0, 'path'], 4)\n// -- // { a: 3, unknown: [{ path: 4 }] }\n// -- ```\n\n\nfunction setIn(obj, path, val) {\n if (!path.length) return val;\n return doSetIn(obj, path, val, 0);\n}\n\nfunction doSetIn(obj, path, val, idx) {\n let newValue;\n const key = path[idx];\n\n if (idx === path.length - 1) {\n newValue = val;\n } else {\n const nestedObj = isObject(obj) && isObject(obj[key]) ? obj[key] : typeof path[idx + 1] === 'number' ? [] : {};\n newValue = doSetIn(nestedObj, path, val, idx + 1);\n }\n\n return set(obj, key, newValue);\n} // -- #### update()\n// -- Returns a new object with a modified attribute,\n// -- calculated via a user-provided callback based on the current value.\n// -- If the calculated value is the same as (*referentially equal to*)\n// -- the previous value, the original object is returned.\n// --\n// -- Usage: `update(obj, key, fnUpdate)`\n// --\n// -- ```js\n// -- obj = { a: 1, b: 2, c: 3 }\n// -- obj2 = update(obj, 'b', (val) => val + 1)\n// -- // { a: 1, b: 3, c: 3 }\n// -- obj2 === obj\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- update(obj, 'b', (val) => val) === obj\n// -- // true\n// -- ```\n\n\nfunction update(obj, key, fnUpdate) {\n const prevVal = obj == null ? undefined : obj[key];\n const nextVal = fnUpdate(prevVal);\n return set(obj, key, nextVal);\n} // -- #### updateIn()\n// -- Returns a new object with a modified **nested** attribute,\n// -- calculated via a user-provided callback based on the current value.\n// -- If the calculated value is the same as (*referentially equal to*)\n// -- the previous value, the original object is returned.\n// --\n// -- Usage: `updateIn<T: ArrayOrObject>(obj: T, path: Array<Key>,\n// -- fnUpdate: (prevValue: any) => any): T`\n// --\n// -- ```js\n// -- obj = { a: 1, d: { d1: 3, d2: 4 } }\n// -- obj2 = updateIn(obj, ['d', 'd1'], (val) => val + 1)\n// -- // { a: 1, d: { d1: 4, d2: 4 } }\n// -- obj2 === obj\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- obj3 = updateIn(obj, ['d', 'd1'], (val) => val)\n// -- // { a: 1, d: { d1: 3, d2: 4 } }\n// -- obj3 === obj\n// -- // true\n// -- ```\n\n\nfunction updateIn(obj, path, fnUpdate) {\n const prevVal = getIn(obj, path);\n const nextVal = fnUpdate(prevVal);\n return setIn(obj, path, nextVal);\n} // -- #### merge()\n// -- Returns a new object built as follows: the overlapping keys from the\n// -- second one overwrite the corresponding entries from the first one.\n// -- Similar to `Object.assign()`, but immutable.\n// --\n// -- Usage:\n// --\n// -- * `merge(obj1, obj2)`\n// -- * `merge(obj1, ...objects)`\n// --\n// -- The unmodified `obj1` is returned if `obj2` does not *provide something\n// -- new to* `obj1`, i.e. if either of the following\n// -- conditions are true:\n// --\n// -- * `obj2` is `null` or `undefined`\n// -- * `obj2` is an object, but it is empty\n// -- * All attributes of `obj2` are `undefined`\n// -- * All attributes of `obj2` are referentially equal to the\n// -- corresponding attributes of `obj1`\n// --\n// -- Note that `undefined` attributes in `obj2` do not modify the\n// -- corresponding attributes in `obj1`.\n// --\n// -- ```js\n// -- obj1 = { a: 1, b: 2, c: 3 }\n// -- obj2 = { c: 4, d: 5 }\n// -- obj3 = merge(obj1, obj2)\n// -- // { a: 1, b: 2, c: 4, d: 5 }\n// -- obj3 === obj1\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- merge(obj1, { c: 3 }) === obj1\n// -- // true\n// -- ```\n// Signatures:\n// - 1 arg\n\n\n// Implementation\nfunction merge(a, b, c, d, e, f, ...rest) {\n return rest.length ? doMerge.call(null, false, false, a, b, c, d, e, f, ...rest) : doMerge(false, false, a, b, c, d, e, f);\n} // -- #### mergeDeep()\n// -- Returns a new object built as follows: the overlapping keys from the\n// -- second one overwrite the corresponding entries from the first one.\n// -- If both the first and second entries are objects they are merged recursively.\n// -- Similar to `Object.assign()`, but immutable, and deeply merging.\n// --\n// -- Usage:\n// --\n// -- * `mergeDeep(obj1, obj2)`\n// -- * `mergeDeep(obj1, ...objects)`\n// --\n// -- The unmodified `obj1` is returned if `obj2` does not *provide something\n// -- new to* `obj1`, i.e. if either of the following\n// -- conditions are true:\n// --\n// -- * `obj2` is `null` or `undefined`\n// -- * `obj2` is an object, but it is empty\n// -- * All attributes of `obj2` are `undefined`\n// -- * All attributes of `obj2` are referentially equal to the\n// -- corresponding attributes of `obj1`\n// --\n// -- Note that `undefined` attributes in `obj2` do not modify the\n// -- corresponding attributes in `obj1`.\n// --\n// -- ```js\n// -- obj1 = { a: 1, b: 2, c: { a: 1 } }\n// -- obj2 = { b: 3, c: { b: 2 } }\n// -- obj3 = mergeDeep(obj1, obj2)\n// -- // { a: 1, b: 3, c: { a: 1, b: 2 } }\n// -- obj3 === obj1\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- mergeDeep(obj1, { c: { a: 1 } }) === obj1\n// -- // true\n// -- ```\n\n\nfunction mergeDeep(a, b, c, d, e, f, ...rest) {\n return rest.length ? doMerge.call(null, false, true, a, b, c, d, e, f, ...rest) : doMerge(false, true, a, b, c, d, e, f);\n} // -- #### mergeIn()\n// -- Similar to `merge()`, but merging the value at a given nested path.\n// --\n// -- Usage examples:\n// --\n// -- * `mergeIn(obj1, path, obj2)`\n// -- * `mergeIn(obj1, path, ...objects)`\n// --\n// -- ```js\n// -- obj1 = { a: 1, d: { b: { d1: 3, d2: 4 } } }\n// -- obj2 = { d3: 5 }\n// -- obj3 = mergeIn(obj1, ['d', 'b'], obj2)\n// -- // { a: 1, d: { b: { d1: 3, d2: 4, d3: 5 } } }\n// -- obj3 === obj1\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- mergeIn(obj1, ['d', 'b'], { d2: 4 }) === obj1\n// -- // true\n// -- ```\n\n\nfunction mergeIn(a, path, b, c, d, e, f, ...rest) {\n let prevVal = getIn(a, path);\n if (prevVal == null) prevVal = {};\n let nextVal;\n\n if (rest.length) {\n nextVal = doMerge.call(null, false, false, prevVal, b, c, d, e, f, ...rest);\n } else {\n nextVal = doMerge(false, false, prevVal, b, c, d, e, f);\n }\n\n return setIn(a, path, nextVal);\n} // -- #### omit()\n// -- Returns an object excluding one or several attributes.\n// --\n// -- Usage: `omit(obj, attrs)`\n//\n// -- ```js\n// -- obj = { a: 1, b: 2, c: 3, d: 4 }\n// -- omit(obj, 'a')\n// -- // { b: 2, c: 3, d: 4 }\n// -- omit(obj, ['b', 'c'])\n// -- // { a: 1, d: 4 }\n// --\n// -- // The same object is returned if there are no changes:\n// -- omit(obj, 'z') === obj1\n// -- // true\n// -- ```\n\n\nfunction omit(obj, attrs) {\n const omitList = Array.isArray(attrs) ? attrs : [attrs];\n let fDoSomething = false;\n\n for (let i = 0; i < omitList.length; i++) {\n if (hasOwnProperty.call(obj, omitList[i])) {\n fDoSomething = true;\n break;\n }\n }\n\n if (!fDoSomething) return obj;\n const out = {};\n const keys = getKeysAndSymbols(obj);\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (omitList.indexOf(key) >= 0) continue;\n out[key] = obj[key];\n }\n\n return out;\n} // -- #### addDefaults()\n// -- Returns a new object built as follows: `undefined` keys in the first one\n// -- are filled in with the corresponding values from the second one\n// -- (even if they are `null`).\n// --\n// -- Usage:\n// --\n// -- * `addDefaults(obj, defaults)`\n// -- * `addDefaults(obj, ...defaultObjects)`\n// --\n// -- ```js\n// -- obj1 = { a: 1, b: 2, c: 3 }\n// -- obj2 = { c: 4, d: 5, e: null }\n// -- obj3 = addDefaults(obj1, obj2)\n// -- // { a: 1, b: 2, c: 3, d: 5, e: null }\n// -- obj3 === obj1\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- addDefaults(obj1, { c: 4 }) === obj1\n// -- // true\n// -- ```\n// Signatures:\n// - 2 args\n\n\n// Implementation and catch-all\nfunction addDefaults(a, b, c, d, e, f, ...rest) {\n return rest.length ? doMerge.call(null, true, false, a, b, c, d, e, f, ...rest) : doMerge(true, false, a, b, c, d, e, f);\n}\n\nfunction doMerge(fAddDefaults, fDeep, first, ...rest) {\n let out = first;\n\n if (!(out != null)) {\n throwStr(IS_DEV ? 'At least one object should be provided to merge()' : INVALID_ARGS);\n }\n\n let fChanged = false;\n\n for (let idx = 0; idx < rest.length; idx++) {\n const obj = rest[idx];\n if (obj == null) continue;\n const keys = getKeysAndSymbols(obj);\n if (!keys.length) continue;\n\n for (let j = 0; j <= keys.length; j++) {\n const key = keys[j];\n if (fAddDefaults && out[key] !== undefined) continue;\n let nextVal = obj[key];\n\n if (fDeep && isObject(out[key]) && isObject(nextVal)) {\n nextVal = doMerge(fAddDefaults, fDeep, out[key], nextVal);\n }\n\n if (nextVal === undefined || nextVal === out[key]) continue;\n\n if (!fChanged) {\n fChanged = true;\n out = clone(out);\n }\n\n out[key] = nextVal;\n }\n }\n\n return out;\n} // ===============================================\n// ### Public API\n// ===============================================\n\n\nconst timm = {\n clone,\n addLast,\n addFirst,\n removeLast,\n removeFirst,\n insert,\n removeAt,\n replaceAt,\n getIn,\n set,\n setIn,\n update,\n updateIn,\n merge,\n mergeDeep,\n mergeIn,\n omit,\n addDefaults\n};\nvar _default = timm;\nexports.default = _default;","'use strict';\n\nconst pDefer = () => {\n\tconst deferred = {};\n\n\tdeferred.promise = new Promise((resolve, reject) => {\n\t\tdeferred.resolve = resolve;\n\t\tdeferred.reject = reject;\n\t});\n\n\treturn deferred;\n};\n\nmodule.exports = pDefer;\n","/*! queue-microtask. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\nlet promise\n\nmodule.exports = typeof queueMicrotask === 'function'\n ? queueMicrotask.bind(typeof window !== 'undefined' ? window : global)\n // reuse resolved promise, and allocate it lazily\n : cb => (promise || (promise = Promise.resolve()))\n .then(cb)\n .catch(err => setTimeout(() => { throw err }, 0))\n","var SortedArray = (function () {\n var SortedArray = defclass({\n\n constructor: function (array, compare) {\n this.array = [];\n this.compare = compare || compareDefault;\n var length = array.length,\n index = 0;\n while (index < length) this.insert(array[index++]);\n },\n insert: function (element) {\n var array = this.array,\n compare = this.compare,\n high = array.length-1,\n low = 0,\n pos = -1,\n index,\n ordering;\n\n // The array is sorted. You must find the position of new element in O(log(n)), not O(n).\n while (high >= low) {\n index = (high + low) / 2 >>> 0;\n ordering = compare(array[index], element); \n if (ordering < 0) low = index + 1;\n else if (ordering > 0) high = index - 1;\n else {\n pos = index;\n break;\n };\n }\n\n if (pos === -1) {\n // if element was not found, high < low.\n pos = high;\n }\n // This assures that equal elements inserted after will be in a higher position in array.\n // They can be equal for comparison purposes, but different objects with different data.\n // Respecting the chronological order can be important for many applications.\n pos++;\n high = array.length-1;\n while ((pos < high) && (compare(element, array[pos]) === 0)){\n pos++;\n }\n index = array.length;\n // Just to increase array size.\n array.push(element); \n // Much faster. No need to elements swap.\n while (index > pos) {\n array[index] = array[--index];\n }\n // Set the new element on its correct position.\n array[pos] = element;\n\n return this;\n },\n search: function (element) {\n var array = this.array,\n compare = this.compare,\n high = array.length-1,\n low = 0,\n // In most languages, inner variable declaration makes the code slower.\n index,\n ordering;\n\n while (high >= low) {\n index = (high + low) / 2 >>> 0;\n ordering = compare(array[index], element);\n\n if (ordering < 0) low = index + 1;\n else if (ordering > 0) high = index - 1;\n else return index;\n }\n\n return -1;\n },\n remove: function (element) {\n var index = this.search(element);\n if (index >= 0) this.array.splice(index, 1);\n return this;\n }\n });\n\n SortedArray.comparing = function (property, array) {\n return new SortedArray(array, function (a, b) {\n // This should be faster than calling functions.\n // Besides, this way it is not needed to create useless function to return property value.\n return compareDefault(a[property], b[property]);\n });\n };\n\n return SortedArray;\n\n function defclass(prototype) {\n var constructor = prototype.constructor;\n constructor.prototype = prototype;\n return constructor;\n }\n\n function compareDefault(a, b) {\n // Equality has a very low chance to happen. It should be the last option.\n if (a < b)\n return -1;\n else if (a > b)\n return 1;\n else\n return 0;\n }\n}());\n\nif (typeof module === \"object\") module.exports = SortedArray;\nif (typeof define === \"function\" && define.amd)\n define(function () { return SortedArray; });\n","import type { Player, PlayerPlugin } from \"@player-ui/player\";\nimport { resolveDataRefsInString, NodeType } from \"@player-ui/player\";\nimport type { Mappers } from \"./types\";\nimport { parseAssetMarkdownContent } from \"./utils\";\n\nexport * from \"./types\";\n\n/**\n * A plugin that parses markdown written into text assets using the given converters for markdown features into existing assets.\n */\nexport class MarkdownPlugin implements PlayerPlugin {\n name = \"MarkdownPlugin\";\n\n private mappers: Mappers;\n\n constructor(mappers: Mappers) {\n this.mappers = mappers;\n }\n\n apply(player: Player) {\n player.hooks.view.tap(this.name, (view) => {\n view.hooks.resolver.tap(this.name, (resolver) => {\n resolver.hooks.beforeResolve.tap(this.name, (node, options) => {\n if (node?.type === NodeType.Asset && node.value.type === \"markdown\") {\n const resolvedContent = resolveDataRefsInString(\n node.value.value as string,\n {\n evaluate: options.evaluate,\n model: options.data.model,\n },\n );\n\n const parsed = parseAssetMarkdownContent({\n asset: {\n ...node.value,\n value: resolvedContent,\n },\n mappers: this.mappers,\n parser: options.parseNode,\n });\n\n return parsed;\n }\n\n return node;\n });\n });\n });\n }\n}\n","/**\n * Checks if `value` is equal to `check` if `check` is a string or in `check` if check is an Array\n *\n * @param value - the value being searched for\n * @param check - the values to check against\n * @returns `boolean`\n */\nexport function equalToOrIn(value: string, check: string | Array<string>) {\n if (Array.isArray(check)) {\n return check.includes(value);\n }\n\n return check === value;\n}\n","import { equalToOrIn } from \"./utils\";\n\nexport type Interceptor<Args extends any[], ReturnType, ContextType> = {\n /** An optional name for the interceptor */\n name?: string;\n /** Callback for each loop when used by the hook */\n loop?: (...args: Args) => void;\n /** Callback when an error occurs during the hook's call */\n error?: (err: Error) => void;\n /** Callback when a result is found for a hook's invocation */\n result?: (\n r: ReturnType extends Promise<infer AwaitedValue>\n ? AwaitedValue\n : ReturnType\n ) => void;\n /** Callback when a hook's call is complete */\n done?: () => void;\n /** Callback when a hook is tapped */\n tap?: (tap: Tap<Args, ReturnType, ContextType>) => void;\n} & (\n | {\n /** If context should be omitted from the 'call'. This is the default */\n context?: false;\n /** Callback when the hook is tapped without context */\n call?: (...args: Args) => void;\n }\n | {\n /** If context should be included in the 'call' */\n context: true;\n /** Callback when the hook is tapped with context */\n call?: (context: ContextType, ...args: Args) => void;\n }\n);\n\nexport type Tap<Args extends any[], ReturnType, ContextType = unknown> = {\n key: symbol;\n name: string;\n before?: string | Array<string>;\n} & (\n | {\n context: false;\n callback: (...args: Args) => ReturnType;\n }\n | {\n context: true;\n callback: (context: ContextType, ...args: Args) => ReturnType;\n }\n);\n\ntype BasicTap<Args extends any[], ReturnType, ContextType> = (\n name: string,\n callback: (...args: Args) => ReturnType,\n before?: string | Array<string>\n) => Tap<Args, ReturnType, ContextType>;\n\ntype TapWithContext<Args extends any[], ReturnType, ContextType> =\n | ((\n options: {\n name: string;\n context?: false;\n before?: string | Array<string>;\n },\n callback: (...args: Args) => ReturnType\n ) => Tap<Args, ReturnType>)\n | ((\n options: {\n name: string;\n context: true;\n before?: string | Array<string>;\n },\n callback: (context: ContextType, ...args: Args) => ReturnType\n ) => Tap<Args, ReturnType>);\n\ninterface SyncBaseHookType<Args extends any[], ReturnType, ContextType> {\n tap:\n | BasicTap<Args, ReturnType, ContextType>\n | TapWithContext<Args, ReturnType, ContextType>;\n call(...args: Args): void;\n untap(key: Tap<Args, ReturnType>): void;\n isUsed(): boolean;\n intercept(int: Interceptor<Args, ReturnType, ContextType>): void;\n}\n\nfunction callTap<Args extends any[], ReturnType, ContextType>(\n tap: Tap<Args, ReturnType, ContextType>,\n args: Args,\n ctx: ContextType\n) {\n if (tap.context) {\n return tap.callback(ctx, ...args);\n }\n\n return tap.callback(...args);\n}\n\n/** A manager for all intercepts inside of a tap */\nclass InterceptionManager<\n Args extends any[],\n ReturnType,\n ContextType = Record<string, any>\n> {\n protected interceptions: Array<Interceptor<Args, ReturnType, ContextType>>;\n private interceptionKeySet: Set<\n keyof Interceptor<Args, ReturnType, ContextType>\n >;\n\n constructor() {\n this.interceptions = [];\n this.interceptionKeySet = new Set();\n }\n\n isUsed() {\n return this.interceptions.length > 0;\n }\n\n intercept(int: Interceptor<Args, ReturnType, ContextType>): void {\n this.interceptions.push(int);\n Object.keys(int).forEach((s) => {\n this.interceptionKeySet.add(s as any);\n });\n }\n\n tap(tap: Tap<Args, ReturnType, ContextType>): void {\n if (this.interceptionKeySet.has(\"tap\")) {\n this.interceptions.forEach((i) => {\n i.tap?.(tap);\n });\n }\n }\n\n call(ctx: ContextType, ...args: Args): void {\n if (this.interceptionKeySet.has(\"call\")) {\n this.interceptions.forEach((i) => {\n if (i.context) {\n i.call?.(ctx, ...args);\n } else {\n i.call?.(...args);\n }\n });\n }\n }\n\n loop(...args: Args): void {\n if (this.interceptionKeySet.has(\"loop\")) {\n this.interceptions.forEach((i) => {\n i.loop?.(...args);\n });\n }\n }\n\n error(err: unknown): void {\n if (this.interceptionKeySet.has(\"error\")) {\n if (err instanceof Error) {\n const asError: Error = err;\n this.interceptions.forEach((i) => {\n i.error?.(asError);\n });\n }\n }\n }\n\n result(\n r: ReturnType extends Promise<infer AwaitedValue>\n ? AwaitedValue\n : ReturnType\n ): void {\n if (this.interceptionKeySet.has(\"result\")) {\n this.interceptions.forEach((i) => {\n i.result?.(r);\n });\n }\n }\n\n done(): void {\n if (this.interceptionKeySet.has(\"done\")) {\n this.interceptions.forEach((i) => {\n i.done?.();\n });\n }\n }\n}\n\nabstract class Hook<\n Args extends any[],\n ReturnType,\n ContextType = Record<string, any>\n> implements SyncBaseHookType<Args, ReturnType, ContextType>\n{\n protected taps: Array<Tap<Args, ReturnType, ContextType>>;\n protected interceptions: InterceptionManager<Args, ReturnType, ContextType>;\n\n constructor() {\n this.taps = [];\n this.interceptions = new InterceptionManager<\n Args,\n ReturnType,\n ContextType\n >();\n }\n\n public tap(\n options: { name: string; context?: false; before?: string | Array<string> },\n callback: (...args: Args) => ReturnType\n ): Tap<Args, ReturnType, ContextType>;\n\n public tap(\n options: { name: string; context: true; before?: string | Array<string> },\n callback: (ctx: ContextType, ...args: Args) => ReturnType\n ): Tap<Args, ReturnType, ContextType>;\n\n public tap(\n name: string,\n callback: (...args: Args) => ReturnType\n ): Tap<Args, ReturnType, ContextType>;\n\n public tap(options: any, callback: any): Tap<Args, ReturnType, ContextType> {\n const resolvedOptions =\n typeof options === \"string\"\n ? {\n name: options,\n context: false,\n }\n : {\n context: false,\n ...options,\n };\n\n const key = Symbol(resolvedOptions.name);\n const tap: Tap<Args, ReturnType, ContextType> = {\n key,\n ...resolvedOptions,\n callback,\n };\n\n if (tap.before) {\n let insertionIndex = this.taps.length;\n const beforeSet = new Set(\n Array.isArray(tap.before) ? tap.before : [tap.before]\n );\n for (\n insertionIndex;\n insertionIndex > 0 && beforeSet.size > 0;\n insertionIndex--\n ) {\n const t = this.taps[insertionIndex - 1];\n if (beforeSet.has(t.name)) {\n beforeSet.delete(t.name);\n }\n\n if (t.before && equalToOrIn(tap.name, t.before)) {\n break;\n }\n }\n\n this.taps.splice(insertionIndex, 0, tap);\n } else {\n this.taps.push(tap);\n }\n\n this.interceptions.tap(tap);\n\n return tap;\n }\n\n abstract call(...args: Args): ReturnType;\n\n public untap(tap: Tap<Args, ReturnType, ContextType>) {\n this.taps = this.taps.filter((t) => t.key !== tap.key);\n }\n\n public isUsed() {\n return this.taps.length > 0 || this.interceptions.isUsed();\n }\n\n public intercept(int: Interceptor<Args, ReturnType, ContextType>): void {\n this.interceptions.intercept(int);\n }\n}\n\nexport class SyncHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, void, ContextType> {\n public call(...args: Args) {\n if (!this.isUsed()) {\n return;\n }\n\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n this.taps.forEach((t) => {\n callTap(t, args, ctx);\n });\n } catch (err: unknown) {\n this.interceptions.error(err);\n\n throw err;\n }\n\n this.interceptions.done();\n }\n}\n\nexport class SyncBailHook<\n Args extends any[],\n ReturnType,\n ContextType = Record<string, any>\n> extends Hook<Args, ReturnType | undefined | null, ContextType> {\n public call(...args: Args): ReturnType | undefined | null {\n if (!this.isUsed()) {\n return;\n }\n\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n const rtn = callTap(this.taps[tapIndex], args, ctx);\n if (rtn !== undefined) {\n this.interceptions.result(rtn as any);\n return rtn;\n }\n }\n\n this.interceptions.done();\n }\n}\n\nexport class SyncWaterfallHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, Args[0], ContextType> {\n public call(...args: Args): Args[0] {\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n // eslint-disable-next-line prefer-const\n let [rtn, ...rest] = args;\n\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n const tapValue = callTap(this.taps[tapIndex], [rtn, ...rest] as any, ctx);\n if (tapValue !== undefined) {\n rtn = tapValue;\n }\n }\n\n this.interceptions.result(rtn);\n\n return rtn;\n }\n}\n\nexport class SyncLoopHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, void, ContextType> {\n public call(...args: Args) {\n let finished = false;\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n while (finished !== true) {\n finished = true;\n this.interceptions.loop(...args);\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n const rtn = callTap(this.taps[tapIndex], args, ctx);\n\n if (rtn !== undefined) {\n finished = false;\n break;\n }\n }\n }\n } catch (e: unknown) {\n this.interceptions.error(e);\n throw e;\n }\n\n this.interceptions.done();\n }\n}\n\nexport class AsyncParallelHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, Promise<void>, ContextType> {\n public async call(...args: Args): Promise<void> {\n const ctx: ContextType = {} as any;\n this.interceptions.call(ctx, ...args);\n\n await Promise.allSettled(this.taps.map((tap) => callTap(tap, args, ctx)));\n this.interceptions.done();\n }\n}\n\nexport class AsyncParallelBailHook<\n Args extends any[],\n ReturnType,\n ContextType = Record<string, any>\n> extends Hook<Args, Promise<ReturnType>, ContextType> {\n public async call(...args: Args): Promise<ReturnType> {\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n const rtn = await Promise.race(\n this.taps.map((tap) => callTap(tap, args, ctx))\n );\n\n this.interceptions.result(rtn as any);\n return rtn;\n } catch (e: unknown) {\n this.interceptions.error(e);\n throw e;\n }\n }\n}\n\nexport class AsyncSeriesHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, Promise<void>, ContextType> {\n public async call(...args: Args): Promise<void> {\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n await callTap(this.taps[tapIndex], args, ctx);\n }\n } catch (e: unknown) {\n this.interceptions.error(e);\n throw e;\n }\n\n this.interceptions.done();\n }\n}\n\nexport class AsyncSeriesBailHook<\n Args extends any[],\n ReturnType,\n ContextType = Record<string, any>\n> extends Hook<Args, Promise<ReturnType | undefined | null>, ContextType> {\n public async call(...args: Args): Promise<ReturnType | undefined | null> {\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n const rtn = await callTap(this.taps[tapIndex], args, ctx);\n if (rtn !== undefined) {\n this.interceptions.result(rtn);\n return rtn;\n }\n }\n } catch (e: unknown) {\n this.interceptions.error(e);\n throw e;\n }\n\n this.interceptions.done();\n }\n}\n\nexport class AsyncSeriesWaterfallHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, Promise<Args[0]>, ContextType> {\n public async call(...args: Args): Promise<Args[0]> {\n // eslint-disable-next-line prefer-const\n let [rtn, ...rest] = args;\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n const tapValue = await callTap(\n this.taps[tapIndex],\n [rtn, ...rest] as any,\n ctx\n );\n if (tapValue !== undefined) {\n rtn = tapValue;\n }\n }\n } catch (e: unknown) {\n this.interceptions.error(e);\n throw e;\n }\n\n this.interceptions.result(rtn);\n\n return rtn;\n }\n}\n\nexport class AsyncSeriesLoopHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, Promise<void>, ContextType> {\n public async call(...args: Args): Promise<void> {\n let finished = false;\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n while (finished !== true) {\n finished = true;\n this.interceptions.loop(...args);\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n const rtn = await callTap(this.taps[tapIndex], args, ctx);\n\n if (rtn !== undefined) {\n finished = false;\n break;\n }\n }\n }\n } catch (e: unknown) {\n this.interceptions.error(e);\n throw e;\n }\n\n this.interceptions.done();\n }\n}\n","import { SyncBailHook, SyncWaterfallHook } from \"tapable-ts\";\nimport { NestedError } from \"ts-nested-error\";\nimport type { ParserResult, AnyNode } from \"../binding-grammar/index\";\nimport {\n // We can swap this with whichever parser we want to use\n parseCustom as parseBinding,\n} from \"../binding-grammar\";\nimport type { BindingParserOptions, BindingLike } from \"./binding\";\nimport { BindingInstance } from \"./binding\";\nimport { isBinding } from \"./utils\";\nimport type { NormalizedResult, ResolveBindingASTOptions } from \"./resolver\";\nimport { resolveBindingAST } from \"./resolver\";\n\nexport * from \"./utils\";\nexport * from \"./binding\";\n\nexport const SIMPLE_BINDING_REGEX = /^[\\w\\-@]+(\\.[\\w\\-@]+)*$/;\nexport const BINDING_BRACKETS_REGEX = /[\\s()*=`{}'\"[\\]]/;\nconst LAZY_BINDING_REGEX = /^[^.]+(\\..+)*$/;\n\nconst DEFAULT_OPTIONS: BindingParserOptions = {\n get: () => {\n throw new Error(\"Not Implemented\");\n },\n set: () => {\n throw new Error(\"Not Implemented\");\n },\n evaluate: () => {\n throw new Error(\"Not Implemented\");\n },\n};\n\ntype BeforeResolveNodeContext = Required<NormalizedResult> &\n ResolveBindingASTOptions;\n\n/** A parser for creating bindings from a string */\nexport class BindingParser {\n private cache: Record<string, BindingInstance>;\n private parseCache: Record<string, ParserResult>;\n private parserOptions: BindingParserOptions;\n\n public hooks = {\n skipOptimization: new SyncBailHook<[string], boolean>(),\n beforeResolveNode: new SyncWaterfallHook<\n [AnyNode, BeforeResolveNodeContext]\n >(),\n };\n\n constructor(options?: Partial<BindingParserOptions>) {\n this.parserOptions = { ...DEFAULT_OPTIONS, ...options };\n this.cache = {};\n this.parseCache = {};\n this.parse = this.parse.bind(this);\n }\n\n /**\n * Takes a binding path, parses it, and returns an equivalent, normalized\n * representation of that path.\n */\n private normalizePath(\n path: string,\n resolveOptions: ResolveBindingASTOptions,\n ) {\n /**\n * Ensure no binding characters exist in path and the characters remaining\n * look like a binding format.\n */\n if (\n !BINDING_BRACKETS_REGEX.test(path) &&\n LAZY_BINDING_REGEX.test(path) &&\n this.hooks.skipOptimization.call(path) !== true\n ) {\n return { path: path.split(\".\"), updates: undefined } as NormalizedResult;\n }\n\n const ast = this.parseCache[path] ?? parseBinding(path);\n this.parseCache[path] = ast;\n\n if (typeof ast !== \"object\" || !ast?.status) {\n throw new TypeError(\n `Cannot normalize path \"${path}\": ${ast?.error ?? \"Unknown Error.\"}`,\n );\n }\n\n try {\n return resolveBindingAST(ast.path, resolveOptions, this.hooks);\n } catch (e: any) {\n throw new NestedError(`Cannot resolve binding: ${path}`, e);\n }\n }\n\n private getBindingForNormalizedResult(\n normalized: NormalizedResult,\n ): BindingInstance {\n const normalizedStr = normalized.path.join(\".\");\n\n if (this.cache[normalizedStr]) {\n return this.cache[normalizedStr];\n }\n\n const created = new BindingInstance(\n normalizedStr === \"\" ? [] : normalized.path,\n this.parse,\n );\n this.cache[normalizedStr] = created;\n\n return created;\n }\n\n public parse(\n rawBinding: BindingLike,\n overrides: Partial<BindingParserOptions> = {},\n ): BindingInstance {\n if (isBinding(rawBinding)) {\n return rawBinding;\n }\n\n const options = {\n ...this.parserOptions,\n ...overrides,\n };\n\n let updates: Record<string, any> = {};\n\n const joined = Array.isArray(rawBinding)\n ? rawBinding.join(\".\")\n : String(rawBinding);\n\n const normalizeConfig: ResolveBindingASTOptions = {\n getValue: (path: Array<string | number>) => {\n const normalized = this.normalizePath(path.join(\".\"), normalizeConfig);\n\n return options.get(this.getBindingForNormalizedResult(normalized));\n },\n evaluate: (exp) => {\n return options.evaluate(exp);\n },\n convertToPath: (path: any) => {\n if (path === undefined) {\n throw new Error(\n \"Attempted to convert undefined value to binding path\",\n );\n }\n\n if (\n typeof path !== \"string\" &&\n typeof path !== \"number\" &&\n typeof path !== \"boolean\"\n ) {\n throw new Error(\n `Attempting to convert ${typeof path} to a binding path.`,\n );\n }\n\n const normalized = this.normalizePath(String(path), normalizeConfig);\n\n if (normalized.updates) {\n updates = {\n ...updates,\n ...normalized.updates,\n };\n }\n\n const joinedNormalizedPath = normalized.path.join(\".\");\n\n if (joinedNormalizedPath === \"\") {\n throw new Error(\"Nested path resolved to an empty path\");\n }\n\n return joinedNormalizedPath;\n },\n };\n\n const normalized = this.normalizePath(joined, normalizeConfig);\n\n if (normalized.updates) {\n updates = {\n ...updates,\n ...normalized.updates,\n };\n }\n\n const updateKeys = Object.keys(updates);\n\n if (!options.readOnly && updateKeys.length > 0) {\n const updateTransaction = updateKeys.map<[BindingInstance, any]>(\n (updatedBinding) => [\n this.parse(updatedBinding),\n updates[updatedBinding],\n ],\n );\n\n options.set(updateTransaction);\n }\n\n return this.getBindingForNormalizedResult(normalized);\n }\n}\n","import { NestedError } from \"ts-nested-error\";\nimport type { SyncWaterfallHook } from \"tapable-ts\";\nimport type { PathNode, AnyNode } from \"../binding-grammar\";\nimport { findInArray, maybeConvertToNum } from \"./utils\";\n\nexport interface NormalizedResult {\n /** The normalized path */\n path: Array<string | number>;\n\n /** Any new updates that need to happen for this binding to be resolved */\n updates?: Record<string, any>;\n}\n\nexport interface ResolveBindingASTOptions {\n /** Get the value of the model at the given path */\n getValue: (path: Array<string | number>) => any;\n\n /** Convert the value into valid path segments */\n convertToPath: (value: any) => string;\n\n /** Convert the value into valid path segments */\n evaluate: (exp: string) => any;\n}\n\nexport interface ResolveBindingASTHooks {\n /** A hook for transforming a node before fully resolving it */\n beforeResolveNode: SyncWaterfallHook<\n [AnyNode, Required<NormalizedResult> & ResolveBindingASTOptions]\n >;\n}\n\n/** Given a binding AST, resolve it */\nexport function resolveBindingAST(\n bindingPathNode: PathNode,\n options: ResolveBindingASTOptions,\n hooks?: ResolveBindingASTHooks,\n): NormalizedResult {\n const context: Required<NormalizedResult> = {\n updates: {},\n path: [],\n };\n\n // let updates: Record<string, any> = {};\n // const path: Array<string | number> = [];\n\n /** Get the value for any child node */\n function getValueForNode(node: AnyNode): any {\n if (node.name === \"Value\") {\n return node.value;\n }\n\n if (node.name === \"PathNode\") {\n const nestedResolvedValue = resolveBindingAST(node, options);\n\n if (nestedResolvedValue.updates) {\n context.updates = {\n ...context.updates,\n ...nestedResolvedValue.updates,\n };\n }\n\n try {\n return options.convertToPath(\n options.getValue(nestedResolvedValue.path),\n );\n } catch (e: any) {\n throw new NestedError(\n `Unable to resolve path segment: ${nestedResolvedValue.path}`,\n e,\n );\n }\n }\n\n if (node.name === \"Expression\") {\n try {\n const actualValue = options.evaluate(node.value);\n\n return options.convertToPath(actualValue);\n } catch (e: any) {\n throw new NestedError(`Unable to resolve path: ${node.value}`, e);\n }\n }\n\n throw new Error(`Unable to resolve value for node: ${node.name}`);\n }\n\n /** Handle when path segments are binding paths (foo.bar) or single segments (foo) */\n function appendPathSegments(segment: string | number) {\n if (typeof segment === \"string\" && segment.indexOf(\".\") > -1) {\n segment.split(\".\").forEach((i) => {\n context.path.push(maybeConvertToNum(i));\n });\n } else {\n context.path.push(segment);\n }\n }\n\n /** Compute the _actual_ binding val from the AST */\n function resolveNode(_node: AnyNode) {\n const resolvedNode =\n hooks?.beforeResolveNode.call(_node, { ...context, ...options }) ?? _node;\n\n switch (resolvedNode.name) {\n case \"Expression\":\n case \"PathNode\":\n appendPathSegments(getValueForNode(resolvedNode));\n break;\n\n case \"Value\":\n appendPathSegments(resolvedNode.value);\n break;\n\n case \"Query\": {\n // Look for an object at the path with the given key/val criteria\n const objToQuery: Record<string, any>[] =\n options.getValue(context.path) ?? [];\n\n const { key, value } = resolvedNode;\n\n const resolvedKey = getValueForNode(key);\n const resolvedValue = value && getValueForNode(value);\n\n const index = findInArray(objToQuery, resolvedKey, resolvedValue);\n\n if (index === undefined || index === -1) {\n context.updates[\n [...context.path, objToQuery.length, resolvedKey].join(\".\")\n ] = resolvedValue;\n context.path.push(objToQuery.length);\n } else {\n context.path.push(index);\n }\n\n break;\n }\n\n case \"Concatenated\":\n context.path.push(resolvedNode.value.map(getValueForNode).join(\"\"));\n break;\n\n default:\n throw new Error(`Unsupported node type: ${(resolvedNode as any).name}`);\n }\n }\n\n bindingPathNode.path.forEach(resolveNode);\n\n return {\n path: context.path,\n updates:\n Object.keys(context.updates ?? {}).length > 0\n ? context.updates\n : undefined,\n };\n}\n","export default function dlv(obj, key, def, p, undef) {\n\tkey = key.split ? key.split('.') : key;\n\tfor (p = 0; p < key.length; p++) {\n\t\tobj = obj ? obj[key[p]] : undef;\n\t}\n\treturn obj === undef ? def : obj;\n}\n","import get from \"dlv\";\nimport { setIn, omit, removeAt } from \"timm\";\nimport type { BindingInstance } from \"../binding\";\nimport type { BatchSetTransaction, DataModelImpl, Updates } from \"./model\";\n\n/**\n * A data model that stores data in an in-memory JS object\n */\nexport class LocalModel implements DataModelImpl {\n public model: {\n [key: string]: any;\n };\n\n constructor(model = {}) {\n this.model = model;\n this.get = this.get.bind(this);\n this.set = this.set.bind(this);\n }\n\n public reset(model = {}) {\n this.model = model;\n }\n\n public get(binding?: BindingInstance) {\n if (!binding || !binding.asString()) {\n return this.model;\n }\n\n return get(this.model, binding.asArray() as string[]);\n }\n\n public set(transaction: BatchSetTransaction) {\n const effectiveOperations: Updates = [];\n transaction.forEach(([binding, value]) => {\n const oldValue = this.get(binding);\n this.model = setIn(this.model, binding.asArray(), value) as any;\n effectiveOperations.push({ binding, oldValue, newValue: value });\n });\n return effectiveOperations;\n }\n\n public delete(binding: BindingInstance) {\n const parentBinding = binding.parent();\n\n if (parentBinding) {\n const parentValue = this.get(parentBinding);\n\n if (parentValue !== undefined) {\n if (Array.isArray(parentValue)) {\n this.model = setIn(\n this.model,\n parentBinding.asArray(),\n removeAt(parentValue, binding.key() as number),\n ) as any;\n } else {\n this.model = setIn(\n this.model,\n parentBinding.asArray(),\n omit(parentValue, binding.key() as string),\n ) as any;\n }\n }\n }\n }\n}\n","import { SyncWaterfallHook, SyncBailHook } from \"tapable-ts\";\nimport { NestedError } from \"ts-nested-error\";\nimport { parseExpression } from \"./parser\";\nimport * as DEFAULT_EXPRESSION_HANDLERS from \"./evaluator-functions\";\nimport { isExpressionNode } from \"./types\";\nimport { isObjectExpression } from \"./utils\";\nimport type {\n ExpressionNode,\n BinaryOperator,\n UnaryOperator,\n ExpressionType,\n ExpressionContext,\n ExpressionHandler,\n} from \"./types\";\n\n/** a && b -- but handles short cutting if the first value is false */\nconst andandOperator: BinaryOperator = (ctx, a, b) => {\n return ctx.evaluate(a) && ctx.evaluate(b);\n};\n\nandandOperator.resolveParams = false;\n\n/** a || b -- but with short cutting if first value is true */\nconst ororOperator: BinaryOperator = (ctx, a, b) => {\n return ctx.evaluate(a) || ctx.evaluate(b);\n};\n\nororOperator.resolveParams = false;\n\nconst DEFAULT_BINARY_OPERATORS: Record<string, BinaryOperator> = {\n // TODO: A lot of these functions used to do type coercion. Not sure if we want to keep that behavior or not.\n \"+\": (a: any, b: any) => a + b,\n \"-\": (a: any, b: any) => a - b,\n \"*\": (a: any, b: any) => a * b,\n \"/\": (a: any, b: any) => a / b,\n \"%\": (a: any, b: any) => a % b,\n\n // eslint-disable-next-line\n \"==\": (a: any, b: any) => a == b,\n\n // eslint-disable-next-line\n \"!=\": (a: any, b: any) => a != b,\n \">\": (a: any, b: any) => a > b,\n \">=\": (a: any, b: any) => a >= b,\n \"<\": (a: any, b: any) => a < b,\n \"<=\": (a: any, b: any) => a <= b,\n \"&&\": andandOperator,\n \"||\": ororOperator,\n \"!==\": (a: any, b: any) => a !== b,\n \"===\": (a: any, b: any) => a === b,\n\n // eslint-disable-next-line\n \"|\": (a: any, b: any) => a | b,\n\n // eslint-disable-next-line\n \"&\": (a: any, b: any) => a & b,\n \"+=\": (a: any, b: any) => a + b,\n \"-=\": (a: any, b: any) => a - b,\n\n // eslint-disable-next-line\n \"&=\": (a: any, b: any) => a & b,\n\n // eslint-disable-next-line\n \"|=\": (a: any, b: any) => a | b,\n};\n\nconst DEFAULT_UNARY_OPERATORS: Record<string, UnaryOperator> = {\n \"-\": (a: any) => -a,\n \"+\": (a: any) => Number(a),\n \"!\": (a: any) => !a,\n};\n\nexport interface HookOptions extends ExpressionContext {\n /** Given an expression node */\n resolveNode: (node: ExpressionNode) => any;\n\n /** Enabling this flag skips calling the onError hook, and just throws errors back to the caller.\n * The caller is responsible for handling the error.\n */\n throwErrors?: boolean;\n\n /** Whether expressions should be parsed strictly or not */\n strict?: boolean;\n}\n\nexport type ExpressionEvaluatorOptions = Omit<\n HookOptions,\n \"resolveNode\" | \"evaluate\"\n>;\n\nexport type ExpressionEvaluatorFunction = (\n exp: ExpressionType,\n options?: ExpressionEvaluatorOptions,\n) => any;\n\n/**\n * The expression evaluator is responsible for parsing and executing anything in the custom expression language\n * */\nexport class ExpressionEvaluator {\n private readonly vars: Record<string, any> = {};\n public readonly hooks = {\n /** Resolve an AST node for an expression to a value */\n resolve: new SyncWaterfallHook<[any, ExpressionNode, HookOptions]>(),\n\n /** Gets the options that will be passed in calls to the resolve hook */\n resolveOptions: new SyncWaterfallHook<[HookOptions]>(),\n\n /** Allows users to change the expression to be evaluated before processing */\n beforeEvaluate: new SyncWaterfallHook<[ExpressionType, HookOptions]>(),\n\n /**\n * An optional means of handling an error in the expression execution\n * Return true if handled, to stop propagation of the error\n */\n onError: new SyncBailHook<[Error], true>(),\n };\n\n private readonly expressionsCache: Map<string, ExpressionNode> = new Map();\n\n private readonly defaultHookOptions: HookOptions;\n\n public readonly operators = {\n binary: new Map(Object.entries(DEFAULT_BINARY_OPERATORS)),\n unary: new Map(Object.entries(DEFAULT_UNARY_OPERATORS)),\n expressions: new Map<string, ExpressionHandler<any, any>>(\n Object.entries(DEFAULT_EXPRESSION_HANDLERS),\n ),\n };\n\n public reset(): void {\n this.expressionsCache.clear();\n }\n\n constructor(defaultOptions: ExpressionEvaluatorOptions) {\n this.defaultHookOptions = {\n ...defaultOptions,\n evaluate: (expr) => this.evaluate(expr, this.defaultHookOptions),\n resolveNode: (node: ExpressionNode) =>\n this._execAST(node, this.defaultHookOptions),\n };\n\n this.hooks.resolve.tap(\"ExpressionEvaluator\", this._resolveNode.bind(this));\n this.evaluate = this.evaluate.bind(this);\n }\n\n public evaluate(\n expr: ExpressionType,\n options?: ExpressionEvaluatorOptions,\n ): any {\n const resolvedOpts = this.hooks.resolveOptions.call({\n ...this.defaultHookOptions,\n ...options,\n resolveNode: (node: ExpressionNode) => this._execAST(node, resolvedOpts),\n });\n\n let expression = this.hooks.beforeEvaluate.call(expr, resolvedOpts) ?? expr;\n\n // Unwrap any returned expression type\n // Since this could also be an object type, we need to recurse through it until we find the end\n while (isObjectExpression(expression)) {\n expression = expression.value;\n }\n\n // Check for literals\n if (\n typeof expression === \"number\" ||\n typeof expression === \"boolean\" ||\n expression === undefined ||\n expression === null\n ) {\n return expression;\n }\n\n // Skip doing anything with objects that are _actually_ just parsed expression nodes\n if (isExpressionNode(expression)) {\n return this._execAST(expression, resolvedOpts);\n }\n\n if (Array.isArray(expression)) {\n return expression.reduce(\n (_nothing, exp) => this.evaluate(exp, options),\n null,\n );\n }\n\n return this._execString(String(expression), resolvedOpts);\n }\n\n public addExpressionFunction<T extends readonly unknown[], R>(\n name: string,\n handler: ExpressionHandler<T, R>,\n ): void {\n this.operators.expressions.set(name, handler);\n }\n\n public addBinaryOperator(operator: string, handler: BinaryOperator) {\n this.operators.binary.set(operator, handler);\n }\n\n public addUnaryOperator(operator: string, handler: UnaryOperator) {\n this.operators.unary.set(operator, handler);\n }\n\n public setExpressionVariable(name: string, value: unknown) {\n this.vars[name] = value;\n }\n\n public getExpressionVariable(name: string): unknown {\n return this.vars[name];\n }\n\n private _execAST(node: ExpressionNode, options: HookOptions): any {\n return this.hooks.resolve.call(undefined, node, options);\n }\n\n private _execString(exp: string, options: HookOptions) {\n if (exp === \"\") {\n return exp;\n }\n\n const matches = exp.match(/^@\\[(.*)\\]@$/);\n let matchedExp = exp;\n\n if (matches) {\n [, matchedExp] = Array.from(matches); // In case the expression was surrounded by @[ ]@\n }\n\n let storedAST: ExpressionNode;\n\n try {\n storedAST =\n this.expressionsCache.get(matchedExp) ??\n parseExpression(matchedExp, { strict: options.strict });\n this.expressionsCache.set(matchedExp, storedAST);\n } catch (e: any) {\n if (options.throwErrors || !this.hooks.onError.call(e)) {\n // Only throw the error if it's not handled by the hook, or throwErrors is true\n throw new NestedError(`Error parsing expression: ${exp}`, e);\n }\n\n return;\n }\n\n try {\n return this._execAST(storedAST, options);\n } catch (e: any) {\n if (options.throwErrors || !this.hooks.onError.call(e)) {\n // Only throw the error if it's not handled by the hook, or throwErrors is true\n throw new NestedError(`Error evaluating expression: ${exp}`, e);\n }\n }\n }\n\n private _resolveNode(\n _currentValue: any,\n node: ExpressionNode,\n options: HookOptions,\n ) {\n const { resolveNode, model } = options;\n\n const expressionContext: ExpressionContext = {\n ...options,\n evaluate: (expr) => this.evaluate(expr, options),\n };\n\n if (node.type === \"Literal\") {\n return node.value;\n }\n\n if (node.type === \"Identifier\") {\n return this.vars[node.name];\n }\n\n if (node.type === \"Compound\" || node.type === \"ThisExpression\") {\n throw new Error(`Expression type: ${node.type} is not supported`);\n }\n\n if (node.type === \"BinaryExpression\" || node.type === \"LogicalExpression\") {\n const operator = this.operators.binary.get(node.operator);\n\n if (operator) {\n if (\"resolveParams\" in operator) {\n if (operator.resolveParams === false) {\n return operator(expressionContext, node.left, node.right);\n }\n\n return operator(\n expressionContext,\n resolveNode(node.left),\n resolveNode(node.right),\n );\n }\n\n return operator(resolveNode(node.left), resolveNode(node.right));\n }\n\n return;\n }\n\n if (node.type === \"UnaryExpression\") {\n const operator = this.operators.unary.get(node.operator);\n\n if (operator) {\n if (\"resolveParams\" in operator) {\n return operator(\n expressionContext,\n operator.resolveParams === false\n ? node.argument\n : resolveNode(node.argument),\n );\n }\n\n return operator(resolveNode(node.argument));\n }\n\n return;\n }\n\n if (node.type === \"Object\") {\n const { attributes } = node;\n const resolvedAttributes: any = {};\n\n attributes.forEach((attr) => {\n const key = resolveNode(attr.key);\n const value = resolveNode(attr.value);\n resolvedAttributes[key] = value;\n });\n\n return resolvedAttributes;\n }\n\n if (node.type === \"CallExpression\") {\n const expressionName = node.callTarget.name;\n\n const operator = this.operators.expressions.get(expressionName);\n\n if (!operator) {\n throw new Error(`Unknown expression function: ${expressionName}`);\n }\n\n if (\"resolveParams\" in operator && operator.resolveParams === false) {\n return operator(expressionContext, ...node.args);\n }\n\n const args = node.args.map((n) => resolveNode(n));\n\n return operator(expressionContext, ...args);\n }\n\n if (node.type === \"ModelRef\") {\n return model.get(node.ref, { context: { model: options.model } });\n }\n\n if (node.type === \"MemberExpression\") {\n const obj = resolveNode(node.object);\n const prop = resolveNode(node.property);\n\n return obj[prop];\n }\n\n if (node.type === \"Assignment\") {\n if (node.left.type === \"ModelRef\") {\n const value = resolveNode(node.right);\n model.set([[node.left.ref, value]]);\n\n return value;\n }\n\n if (node.left.type === \"Identifier\") {\n const value = resolveNode(node.right);\n this.vars[node.left.name] = value;\n return value;\n }\n\n return;\n }\n\n if (node.type === \"ConditionalExpression\") {\n const result = resolveNode(node.test) ? node.consequent : node.alternate;\n\n return resolveNode(result);\n }\n\n if (node.type === \"ArrayExpression\") {\n return node.elements.map((ele) => resolveNode(ele));\n }\n\n if (node.type === \"Modification\") {\n const operation = this.operators.binary.get(node.operator);\n\n if (operation) {\n let newValue;\n\n if (\"resolveParams\" in operation) {\n if (operation.resolveParams === false) {\n newValue = operation(expressionContext, node.left, node.right);\n } else {\n newValue = operation(\n expressionContext,\n resolveNode(node.left),\n resolveNode(node.right),\n );\n }\n } else {\n newValue = operation(resolveNode(node.left), resolveNode(node.right));\n }\n\n if (node.left.type === \"ModelRef\") {\n model.set([[node.left.ref, newValue]]);\n } else if (node.left.type === \"Identifier\") {\n this.vars[node.left.name] = newValue;\n }\n\n return newValue;\n }\n\n return resolveNode(node.left);\n }\n }\n}\n","import { setIn } from \"timm\";\nimport type { Expression } from \"@player-ui/types\";\nimport type { DataModelWithParser } from \"../data\";\n\nconst DOUBLE_OPEN_CURLY = \"{{\";\nconst DOUBLE_CLOSE_CURLY = \"}}\";\n\nexport interface Options {\n /**\n * The model to use when resolving refs\n * Passing `false` will skip trying to resolve any direct model refs ({{foo}})\n */\n model: false | DataModelWithParser;\n\n /**\n * A function to evaluate an expression\n * Passing `false` will skip trying to evaluate any expressions (@[ foo() ]@)\n */\n evaluate: false | ((exp: Expression) => any);\n\n /**\n * Optionaly resolve binding without formatting in case Type format applies\n */\n formatted?: boolean;\n}\n\n/** Search the given string for the coordinates of the next expression to resolve */\nexport function findNextExp(str: string) {\n const expStart = str.indexOf(DOUBLE_OPEN_CURLY);\n\n if (expStart === -1) {\n return undefined;\n }\n\n let count = 1;\n let offset = expStart + DOUBLE_OPEN_CURLY.length;\n let workingString = str.substring(expStart + DOUBLE_OPEN_CURLY.length);\n\n while (count > 0 && workingString.length > 0) {\n // Find the next open or close curly\n const nextCloseCurly = workingString.indexOf(DOUBLE_CLOSE_CURLY);\n\n // We can't close anything, so there's no point in going on with life.\n if (nextCloseCurly === -1) {\n break;\n }\n\n const nextOpenCurly = workingString.indexOf(DOUBLE_OPEN_CURLY);\n\n if (nextOpenCurly !== -1 && nextOpenCurly < nextCloseCurly) {\n // We've hit another open bracket before closing out the one we want\n // Move everything over and bump our close count by 1\n count++;\n workingString = workingString.substring(\n nextOpenCurly + DOUBLE_OPEN_CURLY.length,\n );\n offset += nextOpenCurly + DOUBLE_OPEN_CURLY.length;\n } else {\n // We've hit another closing bracket\n // Decrement our count and updates offsets\n count--;\n workingString = workingString.substring(\n nextCloseCurly + DOUBLE_CLOSE_CURLY.length,\n );\n offset += nextCloseCurly + DOUBLE_CLOSE_CURLY.length;\n }\n }\n\n if (count !== 0) {\n throw new Error(`Unbalanced {{ and }} in exp: ${str}`);\n }\n\n return {\n start: expStart,\n end: offset,\n };\n}\n\n/** Finds any subset of the string wrapped in @[]@ and evaluates it as an expression */\nexport function resolveExpressionsInString(\n val: string,\n { evaluate }: Options,\n): string {\n if (!evaluate) {\n return val;\n }\n\n const expMatch = /@\\[.*?\\]@/;\n let newVal = val;\n let match = newVal.match(expMatch);\n\n while (match !== null) {\n const expStrWithBrackets = match[0];\n const matchStart = newVal.indexOf(expStrWithBrackets);\n\n const expString = expStrWithBrackets.substr(\n \"@[\".length,\n expStrWithBrackets.length - \"@[\".length - \"]@\".length,\n );\n const expValue = evaluate(expString);\n\n // The string is only the expression, return the raw value.\n if (\n matchStart === 0 &&\n expStrWithBrackets === val &&\n typeof expValue !== \"string\"\n ) {\n return expValue;\n }\n\n newVal =\n newVal.substr(0, matchStart) +\n expValue +\n newVal.substr(matchStart + expStrWithBrackets.length);\n // remove the surrounding @[]@ to get the expression\n match = newVal.match(expMatch);\n }\n\n return newVal;\n}\n\n/** Return a string with all data model references resolved */\nexport function resolveDataRefsInString(val: string, options: Options): string {\n const { model, formatted = true } = options;\n let workingString = resolveExpressionsInString(val, options);\n\n if (\n !model ||\n typeof workingString !== \"string\" ||\n workingString.indexOf(DOUBLE_OPEN_CURLY) === -1\n ) {\n return workingString;\n }\n\n while (workingString.indexOf(DOUBLE_OPEN_CURLY) !== -1) {\n const expLocation = findNextExp(workingString);\n\n if (!expLocation) {\n return workingString;\n }\n\n const { start, end } = expLocation;\n\n // Strip out the wrapping curlies from {{binding}} before passing to the model\n const binding = workingString\n .substring(\n start + DOUBLE_OPEN_CURLY.length,\n end - DOUBLE_OPEN_CURLY.length,\n )\n .trim();\n\n const evaledVal = model.get(binding, { formatted });\n\n // Exit early if the string is _just_ a model lookup\n // If the result is a string, we may need further processing for nested bindings\n if (\n start === 0 &&\n end === workingString.length &&\n typeof evaledVal !== \"string\"\n ) {\n return evaledVal;\n }\n\n workingString =\n workingString.substr(0, start) + evaledVal + workingString.substr(end);\n }\n\n return workingString;\n}\n\n/** Traverse the thing and replace any model refs */\nfunction traverseObject<T>(val: T, options: Options): T {\n switch (typeof val) {\n case \"string\": {\n return resolveDataRefsInString(val as string, options) as unknown as T;\n }\n\n case \"object\": {\n if (!val) return val;\n // TODO: Do we care refs in keys?\n const keys = Object.keys(val);\n let newVal = val;\n\n if (keys.length > 0) {\n keys.forEach((key) => {\n newVal = setIn(\n newVal as any,\n [key],\n traverseObject((val as any)[key], options),\n ) as any;\n });\n }\n\n return newVal;\n }\n\n default:\n return val;\n }\n}\n\n/** Recursively resolve all model refs in whatever you pass in */\nexport function resolveDataRefs<T>(val: T, options: Options): T {\n return traverseObject(val, options);\n}\n","import { setIn } from \"timm\";\nimport type { BindingInstance } from \"../binding\";\nimport type {\n BatchSetTransaction,\n DataModelImpl,\n DataModelOptions,\n DataModelMiddleware,\n Updates,\n} from \"../data\";\nimport { toModel } from \"../data\";\nimport type { Logger } from \"../logger\";\n\nimport type { ValidationResponse } from \"./types\";\nimport { removeBindingAndChildrenFromMap } from \"./binding-map-splice\";\n\n/**\n * A BindingInstance with an indicator of whether or not it's a strong binding\n */\nexport type StrongOrWeakBinding = {\n /** BindingInstance in question */\n binding: BindingInstance;\n /** Boolean indicating whether the relevant BindingInstance is a strong binding */\n isStrong: boolean;\n};\n\n/**\n * Returns a validation object if the data is invalid or an set of BindingsInstances if the binding itself is a weak ref of another invalid validation\n */\nexport type MiddlewareChecker = (\n binding: BindingInstance,\n model: DataModelImpl,\n) => ValidationResponse | Set<StrongOrWeakBinding> | undefined;\n\n/**\n * Middleware for the data-model that caches the results of invalid data\n */\nexport class ValidationMiddleware implements DataModelMiddleware {\n public validator: MiddlewareChecker;\n public shadowModelPaths: Map<BindingInstance, any>;\n private logger?: Logger;\n private shouldIncludeInvalid?: (options?: DataModelOptions) => boolean;\n\n constructor(\n validator: MiddlewareChecker,\n options?: {\n /** A logger instance */\n logger?: Logger;\n /** Optional function to include data staged in shadowModel */\n shouldIncludeInvalid?: (options?: DataModelOptions) => boolean;\n },\n ) {\n this.validator = validator;\n this.shadowModelPaths = new Map();\n this.logger = options?.logger;\n this.shouldIncludeInvalid = options?.shouldIncludeInvalid;\n }\n\n public set(\n transaction: BatchSetTransaction,\n options?: DataModelOptions,\n next?: DataModelImpl,\n ): Updates {\n const asModel = toModel(this, { ...options, includeInvalid: true }, next);\n const nextTransaction: BatchSetTransaction = [];\n\n const includedBindings = new Set<BindingInstance>();\n\n transaction.forEach(([binding, value]) => {\n this.shadowModelPaths.set(binding, value);\n includedBindings.add(binding);\n });\n\n const invalidBindings: Array<BindingInstance> = [];\n\n this.shadowModelPaths.forEach((value, binding) => {\n const validations = this.validator(binding, asModel);\n\n if (validations === undefined) {\n nextTransaction.push([binding, value]);\n } else if (validations instanceof Set) {\n validations.forEach((validation) => {\n invalidBindings.push(validation.binding);\n if (\n !validation.isStrong &&\n validation.binding.asString() === binding.asString()\n ) {\n nextTransaction.push([validation.binding, value]);\n }\n });\n } else if (includedBindings.has(binding)) {\n invalidBindings.push(binding);\n this.logger?.debug(\n `Invalid value for path: ${binding.asString()} - ${\n validations.severity\n } - ${validations.message}`,\n );\n }\n });\n\n let validResults: Updates = [];\n\n if (next && nextTransaction.length > 0) {\n // defer clearing the shadow model to prevent validations that are run twice due to weak binding refs still needing the data\n nextTransaction.forEach(([binding]) =>\n this.shadowModelPaths.delete(binding),\n );\n const result = next.set(nextTransaction, options);\n if (invalidBindings.length === 0) {\n return result;\n }\n\n validResults = result;\n }\n\n const invalidResults = invalidBindings.map((binding) => {\n return {\n binding,\n oldValue: asModel.get(binding),\n newValue: asModel.get(binding),\n force: true,\n };\n });\n\n return [...validResults, ...invalidResults];\n }\n\n public get(\n binding: BindingInstance,\n options?: DataModelOptions,\n next?: DataModelImpl,\n ) {\n let val = next?.get(binding, options);\n\n if (\n this.shouldIncludeInvalid?.(options) ??\n options?.includeInvalid === true\n ) {\n this.shadowModelPaths.forEach((shadowValue, shadowBinding) => {\n if (shadowBinding === binding) {\n val = shadowValue;\n\n return;\n }\n\n if (binding.contains(shadowBinding)) {\n val = setIn(val, shadowBinding.relative(binding), shadowValue);\n }\n });\n }\n\n return val;\n }\n\n public delete(\n binding: BindingInstance,\n options?: DataModelOptions,\n next?: DataModelImpl,\n ) {\n this.shadowModelPaths = removeBindingAndChildrenFromMap(\n this.shadowModelPaths,\n binding,\n );\n\n return next?.delete(binding, options);\n }\n}\n","import { SyncWaterfallHook, SyncHook } from \"tapable-ts\";\nimport { setIn, addLast, clone } from \"timm\";\nimport dlv from \"dlv\";\nimport { dequal } from \"dequal\";\nimport type { BindingInstance, BindingLike } from \"../../binding\";\nimport type {\n DataModelOptions,\n DataModelWithParser,\n Updates,\n} from \"../../data\";\nimport { DependencyModel, withParser } from \"../../data\";\nimport type { Logger } from \"../../logger\";\nimport type { Node } from \"../parser\";\nimport { NodeType } from \"../parser\";\nimport { caresAboutDataChanges, toNodeResolveOptions } from \"./utils\";\nimport type { Resolve } from \"./types\";\nimport { getNodeID } from \"../parser/utils\";\n\nexport * from \"./types\";\nexport * from \"./utils\";\n\ninterface NodeUpdate extends Resolve.ResolvedNode {\n /** A flag to track if a node has changed since the last resolution */\n updated: boolean;\n}\n\n/** Add model context to the data model */\nconst withContext = (model: DataModelWithParser): DataModelWithParser => {\n return {\n get: (binding: BindingLike, options?: DataModelOptions): any => {\n return model.get(binding, {\n context: { model },\n ...options,\n });\n },\n\n set: (\n transaction: [BindingLike, any][],\n options?: DataModelOptions,\n ): Updates => {\n return model.set(transaction, {\n context: { model },\n ...options,\n });\n },\n\n delete: (binding: BindingLike, options?: DataModelOptions): void => {\n return model.delete(binding, {\n context: { model },\n ...options,\n });\n },\n };\n};\n\n/**\n * The Resolver is the way to take a parsed AST graph of a view and resolve it to a concrete representation of the current user state\n * It combines the ability to mutate ast nodes before resolving, as well as the mutating the resolved objects while parsing\n */\nexport class Resolver {\n public readonly hooks = {\n /** A hook to allow skipping of the resolution tree for a specific node */\n skipResolve: new SyncWaterfallHook<\n [boolean, Node.Node, Resolve.NodeResolveOptions]\n >(),\n\n /** An event emitted before calculating the next update */\n beforeUpdate: new SyncHook<[Set<BindingInstance> | undefined]>(),\n\n /** An event emitted after calculating the next update */\n afterUpdate: new SyncHook<[any]>(),\n\n /** The options passed to a node to resolve it to an object */\n resolveOptions: new SyncWaterfallHook<\n [Resolve.NodeResolveOptions, Node.Node]\n >(),\n\n /** A hook to transform the AST node into a new AST node before resolving it */\n beforeResolve: new SyncWaterfallHook<\n [Node.Node | null, Resolve.NodeResolveOptions]\n >(),\n\n /**\n * A hook to transform an AST node into it's resolved value.\n * This runs _before_ any children are resolved\n */\n resolve: new SyncWaterfallHook<\n [any, Node.Node, Resolve.NodeResolveOptions]\n >(),\n\n /**\n * A hook to transform the resolved value of an AST node.\n * This runs _after_ all children nodes are resolved\n */\n afterResolve: new SyncWaterfallHook<\n [any, Node.Node, Resolve.NodeResolveOptions]\n >(),\n\n /** Called at the very end of a node's tree being updated */\n afterNodeUpdate: new SyncHook<\n [Node.Node, Node.Node | undefined, NodeUpdate]\n >(),\n };\n\n /**\n * The AST tree after beforeResolve is ran mapped to the AST before beforeResolve is ran\n */\n private readonly ASTMap: Map<Node.Node, Node.Node>;\n /**\n * The root node in the AST tree we want to resolve\n */\n public readonly root: Node.Node;\n\n /**\n * The cache of the last resolved values when walking the tree.\n * This gets recycled every update to avoid stale data if a node is unused in an update\n */\n private resolveCache: Map<Node.Node, Resolve.ResolvedNode>;\n\n /**\n * Cache of node IDs that have been processed to track if nodes have duplicate IDs\n */\n private idCache: Set<string>;\n\n /**\n * The parameters required to resolve AST nodes\n */\n private readonly options: Resolve.ResolverOptions;\n\n /**\n * Tapable logger for logging errors encountered during view resolution\n */\n private logger?: Logger;\n\n constructor(root: Node.Node, options: Resolve.ResolverOptions) {\n this.root = root;\n this.options = options;\n this.resolveCache = new Map();\n this.ASTMap = new Map();\n this.logger = options.logger;\n this.idCache = new Set();\n }\n\n public getSourceNode(convertedAST: Node.Node) {\n return this.ASTMap.get(convertedAST);\n }\n\n public update(changes?: Set<BindingInstance>): any {\n this.hooks.beforeUpdate.call(changes);\n const resolveCache = new Map<Node.Node, Resolve.ResolvedNode>();\n this.idCache.clear();\n const prevASTMap = new Map(this.ASTMap);\n this.ASTMap.clear();\n\n const updated = this.computeTree(\n this.root,\n undefined,\n changes,\n resolveCache,\n toNodeResolveOptions(this.options),\n undefined,\n prevASTMap,\n );\n this.resolveCache = resolveCache;\n this.hooks.afterUpdate.call(updated.value);\n\n return updated.value;\n }\n\n public getResolveCache() {\n return new Map(this.resolveCache);\n }\n\n private getPreviousResult(node: Node.Node): Resolve.ResolvedNode | undefined {\n if (!node) {\n return;\n }\n\n const isFirstUpdate = this.resolveCache.size === 0;\n const id = getNodeID(node);\n\n if (id) {\n if (this.idCache.has(id)) {\n // Only log this conflict once to cut down on noise\n // May want to swap this to logging when we first see the id -- which may not be the first render\n if (isFirstUpdate) {\n if (node.type === NodeType.Asset || node.type === NodeType.View) {\n this.logger?.error(\n `Cache conflict: Found Asset/View nodes that have conflicting ids: ${id}, may cause cache issues.`,\n );\n } else if (node.type === NodeType.Value) {\n this.logger?.info(\n `Cache conflict: Found Value nodes that have conflicting ids: ${id}, may cause cache issues. To improve performance make value node IDs globally unique.`,\n );\n }\n }\n\n // Don't use anything from a prev result if there's a duplicate id detected\n return;\n }\n\n this.idCache.add(id);\n }\n\n return this.resolveCache.get(node);\n }\n\n private cloneNode(node: any) {\n const clonedNode = clone(node);\n\n Object.keys(clonedNode).forEach((key) => {\n if (key === \"parent\") return;\n\n const value = clonedNode[key];\n if (typeof value === \"object\" && value !== null) {\n clonedNode[key] = Array.isArray(value) ? [...value] : { ...value };\n }\n });\n\n return clonedNode;\n }\n\n private computeTree(\n node: Node.Node,\n rawParent: Node.Node | undefined,\n dataChanges: Set<BindingInstance> | undefined,\n cacheUpdate: Map<Node.Node, Resolve.ResolvedNode>,\n options: Resolve.NodeResolveOptions,\n partiallyResolvedParent: Node.Node | undefined,\n prevASTMap: Map<Node.Node, Node.Node>,\n ): NodeUpdate {\n const dependencyModel = new DependencyModel(options.data.model);\n\n dependencyModel.trackSubset(\"core\");\n const depModelWithParser = withContext(\n withParser(dependencyModel, this.options.parseBinding),\n );\n\n const resolveOptions = this.hooks.resolveOptions.call(\n {\n ...options,\n data: {\n ...options.data,\n model: depModelWithParser,\n },\n evaluate: (exp) =>\n this.options.evaluator.evaluate(exp, { model: depModelWithParser }),\n node,\n },\n node,\n );\n\n const previousResult = this.getPreviousResult(node);\n const previousDeps = previousResult?.dependencies;\n\n const dataChanged = caresAboutDataChanges(dataChanges, previousDeps);\n const shouldUseLastValue = this.hooks.skipResolve.call(\n !dataChanged,\n node,\n resolveOptions,\n );\n\n // Shallow clone the node so that changes to it during the resolve steps don't impact the original.\n // We are trusting that this becomes a deep clone once the whole node tree has been traversed.\n const clonedNode = {\n ...this.cloneNode(node),\n parent: partiallyResolvedParent,\n };\n const resolvedAST = this.hooks.beforeResolve.call(\n clonedNode,\n resolveOptions,\n ) ?? {\n type: NodeType.Empty,\n };\n\n const isNestedMultiNode =\n resolvedAST.type === NodeType.MultiNode &&\n partiallyResolvedParent?.parent?.type === NodeType.MultiNode &&\n partiallyResolvedParent.type === NodeType.Value;\n\n if (previousResult && shouldUseLastValue) {\n const update = {\n ...previousResult,\n updated: false,\n };\n\n /** Recursively repopulate the AST map given some AST Node and it's resolved AST representation */\n const repopulateASTMapFromCache = (\n resolvedNode: Resolve.ResolvedNode,\n AST: Node.Node,\n ASTParent: Node.Node | undefined,\n ) => {\n const { node: resolvedASTLocal } = resolvedNode;\n this.ASTMap.set(resolvedASTLocal, AST);\n const resolvedUpdate = {\n ...resolvedNode,\n updated: false,\n };\n cacheUpdate.set(AST, resolvedUpdate);\n\n /** Helper function for recursing over child node */\n const handleChildNode = (childNode: Node.Node) => {\n // In order to get the correct results, we need to use the node references from the last update.\n const originalChildNode = prevASTMap.get(childNode) ?? childNode;\n const previousChildResult = this.getPreviousResult(originalChildNode);\n if (!previousChildResult) return;\n\n repopulateASTMapFromCache(\n previousChildResult,\n originalChildNode,\n AST,\n );\n };\n\n if (\"children\" in resolvedASTLocal) {\n resolvedASTLocal.children?.forEach(({ value: childAST }) =>\n handleChildNode(childAST),\n );\n } else if (resolvedASTLocal.type === NodeType.MultiNode) {\n resolvedASTLocal.values.forEach(handleChildNode);\n }\n\n this.hooks.afterNodeUpdate.call(AST, ASTParent, resolvedUpdate);\n };\n\n // Point the root of the cached node to the new resolved node.\n previousResult.node.parent = partiallyResolvedParent;\n\n repopulateASTMapFromCache(previousResult, node, rawParent);\n\n return update;\n }\n\n resolvedAST.parent = partiallyResolvedParent;\n\n resolveOptions.node = resolvedAST;\n\n this.ASTMap.set(resolvedAST, node);\n\n let resolved = this.hooks.resolve.call(\n undefined,\n resolvedAST,\n resolveOptions,\n );\n\n let updated = !dequal(previousResult?.value, resolved);\n\n if (previousResult && !updated) {\n resolved = previousResult?.value;\n }\n\n const childDependencies = new Set<BindingInstance>();\n dependencyModel.trackSubset(\"children\");\n\n if (\"children\" in resolvedAST) {\n const newChildren = resolvedAST.children?.map((child) => {\n const computedChildTree = this.computeTree(\n child.value,\n node,\n dataChanges,\n cacheUpdate,\n resolveOptions,\n resolvedAST,\n prevASTMap,\n );\n const {\n dependencies: childTreeDeps,\n node: childNode,\n updated: childUpdated,\n value: childValue,\n } = computedChildTree;\n\n childTreeDeps.forEach((binding) => childDependencies.add(binding));\n\n if (childValue) {\n if (childNode.type === NodeType.MultiNode && !childNode.override) {\n const arr = addLast(\n dlv(resolved, child.path as any[], []),\n childValue,\n );\n resolved = setIn(resolved, child.path, arr);\n } else {\n resolved = setIn(resolved, child.path, childValue);\n }\n }\n\n updated = updated || childUpdated;\n\n return { ...child, value: childNode };\n });\n\n resolvedAST.children = newChildren;\n } else if (resolvedAST.type === NodeType.MultiNode) {\n const childValue: any = [];\n const rawParentToPassIn = isNestedMultiNode\n ? partiallyResolvedParent?.parent\n : node;\n\n const newValues = resolvedAST.values.map((mValue) => {\n const mTree = this.computeTree(\n mValue,\n rawParentToPassIn,\n dataChanges,\n cacheUpdate,\n resolveOptions,\n resolvedAST,\n prevASTMap,\n );\n\n if (mTree.value !== undefined && mTree.value !== null) {\n childValue.push(mTree.value);\n }\n\n mTree.dependencies.forEach((bindingDep) =>\n childDependencies.add(bindingDep),\n );\n\n updated = updated || mTree.updated;\n\n return mTree.node;\n });\n\n resolvedAST.values = newValues;\n resolved = childValue;\n }\n\n childDependencies.forEach((bindingDep) =>\n dependencyModel.addChildReadDep(bindingDep),\n );\n\n dependencyModel.trackSubset(\"core\");\n if (previousResult && !updated) {\n resolved = previousResult?.value;\n }\n\n resolved = this.hooks.afterResolve.call(resolved, resolvedAST, {\n ...resolveOptions,\n getDependencies: (scope?: \"core\" | \"children\") =>\n dependencyModel.getDependencies(scope),\n });\n\n const update: NodeUpdate = {\n node: resolvedAST,\n updated,\n value: resolved,\n dependencies: new Set([\n ...dependencyModel.getDependencies(),\n ...childDependencies,\n ]),\n };\n\n this.hooks.afterNodeUpdate.call(\n node,\n isNestedMultiNode ? partiallyResolvedParent?.parent : rawParent,\n update,\n );\n cacheUpdate.set(node, update);\n\n return update;\n }\n}\n","var has = Object.prototype.hasOwnProperty;\n\nfunction find(iter, tar, key) {\n\tfor (key of iter.keys()) {\n\t\tif (dequal(key, tar)) return key;\n\t}\n}\n\nexport function dequal(foo, bar) {\n\tvar ctor, len, tmp;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (ctor === Set) {\n\t\t\tif (foo.size !== bar.size) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (len of foo) {\n\t\t\t\ttmp = len;\n\t\t\t\tif (tmp && typeof tmp === 'object') {\n\t\t\t\t\ttmp = find(bar, tmp);\n\t\t\t\t\tif (!tmp) return false;\n\t\t\t\t}\n\t\t\t\tif (!bar.has(tmp)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ctor === Map) {\n\t\t\tif (foo.size !== bar.size) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (len of foo) {\n\t\t\t\ttmp = len[0];\n\t\t\t\tif (tmp && typeof tmp === 'object') {\n\t\t\t\t\ttmp = find(bar, tmp);\n\t\t\t\t\tif (!tmp) return false;\n\t\t\t\t}\n\t\t\t\tif (!dequal(len[1], bar.get(tmp))) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ctor === ArrayBuffer) {\n\t\t\tfoo = new Uint8Array(foo);\n\t\t\tbar = new Uint8Array(bar);\n\t\t} else if (ctor === DataView) {\n\t\t\tif ((len=foo.byteLength) === bar.byteLength) {\n\t\t\t\twhile (len-- && foo.getInt8(len) === bar.getInt8(len));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (ArrayBuffer.isView(foo)) {\n\t\t\tif ((len=foo.byteLength) === bar.byteLength) {\n\t\t\t\twhile (len-- && foo[len] === bar[len]);\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import { setIn } from \"timm\";\nimport { SyncBailHook, SyncWaterfallHook } from \"tapable-ts\";\nimport type { AnyAssetType, Node } from \"./types\";\nimport { NodeType } from \"./types\";\n\nexport * from \"./types\";\nexport * from \"./utils\";\n\nexport const EMPTY_NODE: Node.Empty = {\n type: NodeType.Empty,\n};\n\nexport interface ParseObjectOptions {\n /** how nested the templated is */\n templateDepth?: number;\n}\n\nexport interface ParseObjectChildOptions {\n key: string;\n path: Node.PathSegment[];\n parentObj: object;\n}\n\ninterface NestedObj {\n /** The values of a nested local object */\n children: Node.Child[];\n\n value: any;\n}\n/**\n * The Parser is the way to take an incoming view from the user and parse it into an AST.\n * It provides a few ways to interact with the parsing, including mutating an object before and after creation of an AST node\n */\nexport class Parser {\n public readonly hooks = {\n /**\n * A hook to interact with an object _before_ parsing it into an AST\n *\n * @param value - The object we're are about to parse\n * @returns - A new value to parse.\n * If undefined, the original value is used.\n * If null, we stop parsing this node.\n */\n onParseObject: new SyncWaterfallHook<[object, NodeType]>(),\n\n /**\n * A callback to interact with an AST _after_ we parse it into the AST\n *\n * @param value - The object we parsed\n * @param node - The AST node we generated\n * @returns - A new AST node to use\n * If undefined, the original value is used.\n * If null, we ignore this node all together\n */\n onCreateASTNode: new SyncWaterfallHook<\n [Node.Node | undefined | null, object]\n >(),\n\n parseNode: new SyncBailHook<\n [\n obj: object,\n nodeType: Node.ChildrenTypes,\n parseOptions: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ],\n Node.Node | Node.Child[]\n >(),\n };\n\n public parseView(value: AnyAssetType): Node.View {\n const viewNode = this.parseObject(value, NodeType.View);\n\n if (!viewNode) {\n throw new Error(\"Unable to parse object into a view\");\n }\n\n return viewNode as Node.View;\n }\n\n public createASTNode(node: Node.Node | null, value: any): Node.Node | null {\n const tapped = this.hooks.onCreateASTNode.call(node, value);\n\n if (tapped === undefined) {\n return node;\n }\n\n return tapped;\n }\n\n public parseObject(\n obj: object,\n type: Node.ChildrenTypes = NodeType.Value,\n options: ParseObjectOptions = { templateDepth: 0 },\n ): Node.Node | null {\n const parsedNode = this.hooks.parseNode.call(\n obj,\n type,\n options,\n ) as Node.Node | null;\n\n if (parsedNode || parsedNode === null) {\n return parsedNode;\n }\n\n const parseLocalObject = (\n currentValue: any,\n objToParse: unknown,\n path: string[] = [],\n ): NestedObj => {\n if (typeof objToParse !== \"object\" || objToParse === null) {\n return { value: objToParse, children: [] };\n }\n\n const localObj = this.hooks.onParseObject.call(objToParse, type);\n\n if (!localObj) {\n return currentValue;\n }\n\n const objEntries = Array.isArray(localObj)\n ? localObj.map((v, i) => [i, v])\n : [\n ...Object.entries(localObj),\n ...Object.getOwnPropertySymbols(localObj).map((s) => [\n s,\n (localObj as any)[s],\n ]),\n ];\n\n const defaultValue: NestedObj = {\n children: [],\n value: currentValue,\n };\n\n const newValue = objEntries.reduce((accumulation, current): NestedObj => {\n let { value } = accumulation;\n const { children } = accumulation;\n const [localKey, localValue] = current;\n\n const newChildren = this.hooks.parseNode.call(\n localValue,\n NodeType.Value,\n options,\n {\n path,\n key: localKey,\n parentObj: localObj,\n },\n ) as Node.Child[];\n\n if (newChildren) {\n children.push(...newChildren);\n } else if (localValue && typeof localValue === \"object\") {\n const result = parseLocalObject(accumulation.value, localValue, [\n ...path,\n localKey,\n ]);\n\n value = result.value;\n children.push(...result.children);\n } else {\n value = setIn(accumulation.value, [...path, localKey], localValue);\n }\n\n return {\n value,\n children,\n };\n }, defaultValue);\n\n return newValue;\n };\n\n const { value, children } = parseLocalObject(undefined, obj);\n\n const baseAst =\n value === undefined && !children.length\n ? undefined\n : {\n type,\n value,\n };\n\n if (baseAst && children.length) {\n const parent: Node.BaseWithChildren<any> = baseAst;\n parent.children = children;\n children.forEach((child) => {\n child.value.parent = parent;\n });\n }\n\n return this.hooks.onCreateASTNode.call(baseAst, obj) ?? null;\n }\n}\n","import { set } from \"timm\";\nimport { resolveDataRefs } from \"../../string-resolver\";\nimport type { Options } from \"./options\";\nimport type { Node } from \"../parser\";\nimport { NodeType } from \"../parser\";\nimport type { Resolver } from \"../resolver\";\nimport { ViewInstance, ViewPlugin } from \"../view\";\n\n/** Create a function that checks for a start/end sequence in a string */\nconst createPatternMatcher = (start: string, end: string) => {\n return (testStr: string) => {\n const startLocation = testStr.indexOf(start);\n\n if (startLocation === -1) {\n return false;\n }\n\n const endLocation = testStr.indexOf(end);\n\n if (endLocation === -1) {\n return false;\n }\n\n return startLocation < endLocation;\n };\n};\n\nconst bindingResolveLookup = createPatternMatcher(\"{{\", \"}}\");\nconst expressionResolveLookup = createPatternMatcher(\"@[\", \"]@\");\n\n/** Check to see if a string contains a reference to dynamic content */\nfunction hasSomethingToResolve(str: string) {\n return bindingResolveLookup(str) || expressionResolveLookup(str);\n}\n\n/** Resolve data refs in a string if necessary. */\nfunction resolveString(str: string, resolveOptions: Options) {\n return hasSomethingToResolve(str)\n ? resolveDataRefs(str, {\n model: resolveOptions.data.model,\n evaluate: resolveOptions.evaluate,\n })\n : str;\n}\n\n/** Recursively resolve all string references in an object or array */\nexport function resolveAllRefs(\n node: any,\n resolveOptions: Options,\n propertiesToSkip: Set<string | number>,\n): any {\n if (\n node === null ||\n node === undefined ||\n (typeof node !== \"object\" && typeof node !== \"string\")\n ) {\n return node;\n }\n\n if (typeof node === \"string\") {\n return resolveString(node, resolveOptions);\n }\n\n let newNode = node;\n\n Object.keys(node).forEach((key: string | number) => {\n if (propertiesToSkip.has(key)) {\n return;\n }\n\n const val = node[key];\n\n let newVal = val;\n\n if (typeof val === \"object\") {\n newVal = resolveAllRefs(val, resolveOptions, propertiesToSkip);\n } else if (typeof val === \"string\") {\n newVal = resolveString(val, resolveOptions);\n }\n\n if (newVal !== val) {\n newNode = set(newNode, key as any, newVal);\n }\n });\n\n return newNode;\n}\n\n/** Traverse up the node tree finding the first available 'path' */\nconst findBasePath = (\n node: Node.Node,\n resolver: Resolver,\n): Node.PathSegment[] => {\n const parentNode = node.parent;\n if (!parentNode) {\n return [];\n }\n\n if (\"children\" in parentNode) {\n const original = resolver.getSourceNode(node);\n return (\n parentNode.children?.find((child) => child.value === original)?.path ?? []\n );\n }\n\n if (parentNode.type !== NodeType.MultiNode) {\n return [];\n }\n\n return findBasePath(parentNode, resolver);\n};\n\n/** A plugin that resolves all string references for each node */\nexport default class StringResolverPlugin implements ViewPlugin {\n private propertiesToSkipCache: Map<string, Set<string>>;\n\n constructor() {\n this.propertiesToSkipCache = new Map();\n }\n\n applyResolver(resolver: Resolver) {\n resolver.hooks.resolve.tap(\"string-resolver\", (value, node, options) => {\n if (node.type === NodeType.Empty || node.type === NodeType.Unknown) {\n return null;\n }\n\n if (\n node.type === NodeType.Value ||\n node.type === NodeType.Asset ||\n node.type === NodeType.View\n ) {\n /** Use specified properties to skip during string resolution, or default */\n let propsToSkip: Set<string>;\n if (node.type === NodeType.Asset || node.type === NodeType.View) {\n propsToSkip = new Set(\n node.plugins?.stringResolver?.propertiesToSkip ?? [\"exp\"],\n );\n if (node.value?.id) {\n this.propertiesToSkipCache.set(node.value.id, propsToSkip);\n }\n } else if (\n node.parent?.type === NodeType.MultiNode &&\n (node.parent?.parent?.type === NodeType.Asset ||\n node.parent?.parent?.type === NodeType.View) &&\n node.parent.parent.value?.id &&\n this.propertiesToSkipCache.has(node.parent.parent.value.id)\n ) {\n propsToSkip = this.propertiesToSkipCache.get(\n node.parent.parent.value.id,\n ) as Set<string>;\n } else {\n propsToSkip = new Set([\"exp\"]);\n }\n\n const nodePath = findBasePath(node, resolver);\n\n /** If the path includes something that is supposed to be skipped, this node should be skipped too. */\n if (\n nodePath.length > 0 &&\n nodePath.some((segment) => propsToSkip.has(segment.toString()))\n ) {\n return node.value;\n }\n\n return resolveAllRefs(node.value, options, propsToSkip);\n }\n\n return value;\n });\n }\n\n apply(view: ViewInstance) {\n view.hooks.resolver.tap(\"string-resolver\", this.applyResolver.bind(this));\n }\n}\n","import { omit } from \"timm\";\nimport type { Options } from \"./options\";\nimport type { Resolver } from \"../resolver\";\nimport type {\n Node,\n ParseObjectOptions,\n ParseObjectChildOptions,\n Parser,\n} from \"../parser\";\nimport { NodeType } from \"../parser\";\nimport { ViewInstance, ViewPlugin } from \"../view\";\n\n/** A view plugin to remove inapplicable assets from the tree */\nexport default class ApplicabilityPlugin implements ViewPlugin {\n private isApplicability(obj: any) {\n return obj && Object.prototype.hasOwnProperty.call(obj, \"applicability\");\n }\n\n applyResolver(resolver: Resolver) {\n resolver.hooks.beforeResolve.tap(\n \"applicability\",\n (node: Node.Node | null, options: Options) => {\n let newNode = node;\n\n if (node?.type === NodeType.Applicability) {\n const isApplicable = options.evaluate(node.expression);\n\n if (isApplicable === false) {\n return null;\n }\n\n newNode = node.value;\n }\n\n return newNode;\n },\n );\n }\n\n applyParser(parser: Parser) {\n parser.hooks.parseNode.tap(\n \"applicability\",\n (\n obj: any,\n nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ) => {\n if (this.isApplicability(obj)) {\n const parsedApplicability = parser.parseObject(\n omit(obj, \"applicability\"),\n nodeType,\n options,\n );\n\n if (!parsedApplicability) {\n return childOptions ? [] : null;\n }\n\n const applicabilityNode = parser.createASTNode(\n {\n type: NodeType.Applicability,\n expression: (obj as any).applicability,\n value: parsedApplicability,\n },\n obj,\n );\n\n if (!applicabilityNode) {\n return childOptions ? [] : null;\n }\n\n if (applicabilityNode.type === NodeType.Applicability) {\n applicabilityNode.value.parent = applicabilityNode;\n }\n\n return childOptions\n ? [\n {\n path: [...childOptions.path, childOptions.key],\n value: applicabilityNode,\n },\n ]\n : applicabilityNode;\n }\n },\n );\n }\n\n apply(view: ViewInstance) {\n view.hooks.resolver.tap(\"applicability\", this.applyResolver.bind(this));\n view.hooks.parser.tap(\"applicability\", this.applyParser.bind(this));\n }\n}\n","import { setIn } from \"timm\";\nimport deferred from \"p-defer\";\nimport type { Flow as FlowType, FlowResult } from \"@player-ui/types\";\n\nimport { SyncHook, SyncWaterfallHook } from \"tapable-ts\";\nimport type { Logger } from \"./logger\";\nimport { TapableLogger } from \"./logger\";\nimport type { ExpressionType } from \"./expressions\";\nimport { ExpressionEvaluator } from \"./expressions\";\nimport { SchemaController } from \"./schema\";\nimport { BindingParser } from \"./binding\";\nimport type { ViewInstance } from \"./view\";\nimport { resolveDataRefs } from \"./string-resolver\";\nimport type { FlowInstance } from \"./controllers\";\nimport {\n ConstantsController,\n ViewController,\n DataController,\n ValidationController,\n FlowController,\n} from \"./controllers\";\nimport { FlowExpPlugin } from \"./plugins/flow-exp-plugin\";\nimport { DefaultExpPlugin } from \"./plugins/default-exp-plugin\";\nimport type {\n PlayerFlowState,\n InProgressState,\n CompletedState,\n ErrorState,\n} from \"./types\";\nimport { NOT_STARTED_STATE } from \"./types\";\nimport { DefaultViewPlugin } from \"./plugins/default-view-plugin\";\n\n// Variables injected at build time\nconst PLAYER_VERSION = \"__VERSION__\";\nconst COMMIT = \"__GIT_COMMIT__\";\n\nexport interface PlayerPlugin {\n /**\n * Unique identifier of the plugin.\n * Enables the plugin to be retrievable from Player.\n */\n symbol?: symbol;\n\n /** The name of the plugin */\n name: string;\n\n /**\n * Use this to tap into Player hooks\n */\n apply: (player: Player) => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ExtendedPlayerPlugin<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Assets = void,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Views = void,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Expressions = void,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n DataTypes = void,\n> {}\n\nexport interface PlayerConfigOptions {\n /** A set of plugins to load */\n plugins?: PlayerPlugin[];\n\n /** A logger to use */\n logger?: Logger;\n}\n\nexport interface PlayerInfo {\n /** Version of the running player */\n version: string;\n\n /** Hash of the HEAD commit used to build the current version */\n commit: string;\n}\n\n/**\n * This is it.\n */\nexport class Player {\n public static readonly info: PlayerInfo = {\n version: PLAYER_VERSION,\n commit: COMMIT,\n };\n\n public readonly logger = new TapableLogger();\n public readonly constantsController = new ConstantsController();\n private config: PlayerConfigOptions;\n private state: PlayerFlowState = NOT_STARTED_STATE;\n\n public readonly hooks = {\n /** The hook that fires every time we create a new flowController (a new Content blob is passed in) */\n flowController: new SyncHook<[FlowController]>(),\n\n /** The hook that updates/handles views */\n viewController: new SyncHook<[ViewController]>(),\n\n /** A hook called every-time there's a new view. This is equivalent to the view hook on the view-controller */\n view: new SyncHook<[ViewInstance]>(),\n\n /** Called when an expression evaluator was created */\n expressionEvaluator: new SyncHook<[ExpressionEvaluator]>(),\n\n /** The hook that creates and manages data */\n dataController: new SyncHook<[DataController]>(),\n\n /** Called after the schema is created for a flow */\n schema: new SyncHook<[SchemaController]>(),\n\n /** Manages validations (schema and x-field ) */\n validationController: new SyncHook<[ValidationController]>(),\n\n /** Manages parsing binding */\n bindingParser: new SyncHook<[BindingParser]>(),\n\n /** A that's called for state changes in the flow execution */\n state: new SyncHook<[PlayerFlowState]>(),\n\n /** A hook to access the current flow */\n onStart: new SyncHook<[FlowType]>(),\n\n /** A hook for when the flow ends either in success or failure */\n onEnd: new SyncHook<[]>(),\n /** Mutate the Content flow before starting */\n resolveFlowContent: new SyncWaterfallHook<[FlowType]>(),\n };\n\n constructor(config?: PlayerConfigOptions) {\n if (config?.logger) {\n this.logger.addHandler(config.logger);\n }\n\n this.config = config || {};\n this.config.plugins = [\n new DefaultExpPlugin(),\n new DefaultViewPlugin(),\n ...(this.config.plugins || []),\n new FlowExpPlugin(),\n ];\n this.config.plugins?.forEach((plugin) => {\n plugin.apply(this);\n });\n }\n\n /** Returns currently registered plugins */\n public getPlugins(): PlayerPlugin[] {\n return this.config.plugins ?? [];\n }\n\n /** Find instance of [Plugin] that has been registered to Player */\n public findPlugin<Plugin extends PlayerPlugin>(\n symbol: symbol,\n ): Plugin | undefined {\n return this.config.plugins?.find((el) => el.symbol === symbol) as Plugin;\n }\n\n /** Retrieve an instance of [Plugin] and conditionally invoke [apply] if it exists */\n public applyTo<Plugin extends PlayerPlugin>(\n symbol: symbol,\n apply: (plugin: Plugin) => void,\n ): void {\n const plugin = this.findPlugin<Plugin>(symbol);\n\n if (plugin) {\n apply(plugin);\n }\n }\n\n /** Register and apply [Plugin] if one with the same symbol is not already registered. */\n public registerPlugin(plugin: PlayerPlugin) {\n plugin.apply(this);\n this.config.plugins?.push(plugin);\n }\n\n /** Returns the current version of the running player */\n public getVersion(): string {\n return Player.info.version;\n }\n\n /** Returns the git commit used to build Player version */\n public getCommit(): string {\n return Player.info.commit;\n }\n\n /**\n * Fetch the current state of Player.\n * It will return either `not-started`, `in-progress`, `completed`\n * with some extra data in each\n */\n public getState(): PlayerFlowState {\n return this.state;\n }\n\n /**\n * A private means of setting the state of Player\n * Calls the hooks for subscribers to listen for this event\n */\n private setState(state: PlayerFlowState) {\n this.state = state;\n this.hooks.state.call(state);\n }\n\n /** Start Player with the given flow */\n private setupFlow(userContent: FlowType): {\n /** a callback to _actually_ start the flow */\n start: () => void;\n\n /** the state object to kick if off */\n state: Omit<InProgressState, \"ref\">;\n } {\n const userFlow = this.hooks.resolveFlowContent.call(userContent);\n\n const flowController = new FlowController(userFlow.navigation, {\n logger: this.logger,\n });\n\n this.hooks.onStart.call(userFlow);\n\n this.hooks.flowController.call(flowController);\n\n // eslint-disable-next-line prefer-const\n let expressionEvaluator: ExpressionEvaluator;\n // eslint-disable-next-line prefer-const\n let dataController: DataController;\n\n const pathResolver = new BindingParser({\n get: (binding) => {\n return dataController.get(binding);\n },\n set: (transaction) => {\n return dataController.set(transaction);\n },\n evaluate: (expression) => {\n return expressionEvaluator.evaluate(expression);\n },\n });\n\n this.hooks.bindingParser.call(pathResolver);\n const parseBinding = pathResolver.parse;\n const flowResultDeferred = deferred<FlowResult>();\n\n const schema = new SchemaController(userFlow.schema);\n this.hooks.schema.call(schema);\n\n const validationController = new ValidationController(schema);\n\n this.hooks.validationController.call(validationController);\n\n dataController = new DataController(userFlow.data, {\n pathResolver,\n middleware: validationController.getDataMiddleware(),\n logger: this.logger,\n });\n\n dataController.hooks.format.tap(\"player\", (value, binding) => {\n const formatter = schema.getFormatter(binding);\n\n return formatter ? formatter.format(value) : value;\n });\n\n dataController.hooks.deformat.tap(\"player\", (value, binding) => {\n const formatter = schema.getFormatter(binding);\n\n return formatter ? formatter.deformat(value) : value;\n });\n\n dataController.hooks.resolveDefaultValue.tap(\n \"player\",\n (binding) => schema.getApparentType(binding)?.default,\n );\n\n // eslint-disable-next-line prefer-const\n let viewController: ViewController;\n\n expressionEvaluator = new ExpressionEvaluator({\n model: dataController,\n logger: this.logger,\n });\n\n this.hooks.expressionEvaluator.call(expressionEvaluator);\n\n expressionEvaluator.hooks.onError.tap(\"player\", (e) => {\n flowResultDeferred.reject(e);\n\n return true;\n });\n\n /** Resolve any data references in a string */\n function resolveStrings<T>(val: T, formatted?: boolean) {\n return resolveDataRefs(val, {\n model: dataController,\n evaluate: expressionEvaluator.evaluate,\n formatted,\n });\n }\n\n flowController.hooks.flow.tap(\"player\", (flow: FlowInstance) => {\n flow.hooks.beforeTransition.tap(\"player\", (state, transitionVal) => {\n /** Checks to see if there are any transitions for a specific transition state (i.e. next, back). If not, it will default to * */\n const computedTransitionVal = state.transitions[transitionVal]\n ? transitionVal\n : \"*\";\n if (state.onEnd && state.transitions[computedTransitionVal]) {\n if (typeof state.onEnd === \"object\" && \"exp\" in state.onEnd) {\n expressionEvaluator?.evaluate(state.onEnd.exp);\n } else {\n expressionEvaluator?.evaluate(state.onEnd as ExpressionType);\n }\n }\n\n /** If the transition does not exist, then do not resolve any expressions */\n if (\n !(\"transitions\" in state) ||\n !state.transitions[computedTransitionVal]\n ) {\n return state;\n }\n\n /** resolves and sets the transition to the computed exp */\n return setIn(\n state,\n [\"transitions\", computedTransitionVal],\n resolveStrings(state.transitions[computedTransitionVal]),\n ) as any;\n });\n\n flow.hooks.skipTransition.tap(\"validation\", (currentState) => {\n if (currentState?.value.state_type === \"VIEW\") {\n const { canTransition, validations } =\n validationController.validateView(\"navigation\");\n\n if (!canTransition && validations) {\n const bindings = new Set(validations.keys());\n viewController?.currentView?.update(bindings);\n\n return true;\n }\n }\n\n return undefined;\n });\n\n flow.hooks.resolveTransitionNode.tap(\"player\", (state) => {\n let newState = state;\n\n if (\"ref\" in state) {\n newState = setIn(state, [\"ref\"], resolveStrings(state.ref)) as any;\n }\n\n if (\"param\" in state) {\n newState = setIn(\n state,\n [\"param\"],\n resolveStrings(state.param, false),\n ) as any;\n }\n\n return newState;\n });\n\n flow.hooks.transition.tap(\"player\", (_oldState, newState) => {\n if (newState.value.state_type !== \"VIEW\") {\n validationController.reset();\n }\n });\n\n flow.hooks.afterTransition.tap(\"player\", (flowInstance) => {\n const value = flowInstance.currentState?.value;\n if (value && value.state_type === \"ACTION\") {\n const { exp } = value;\n flowController?.transition(\n String(expressionEvaluator?.evaluate(exp)),\n );\n }\n\n expressionEvaluator.reset();\n });\n });\n\n this.hooks.dataController.call(dataController);\n\n validationController.setOptions({\n parseBinding,\n model: dataController,\n logger: this.logger,\n evaluate: expressionEvaluator.evaluate,\n constants: this.constantsController,\n });\n\n viewController = new ViewController(userFlow.views || [], {\n evaluator: expressionEvaluator,\n parseBinding,\n transition: flowController.transition,\n model: dataController,\n utils: {\n findPlugin: <Plugin = unknown>(pluginSymbol: symbol) => {\n return this.findPlugin(pluginSymbol) as unknown as Plugin;\n },\n },\n logger: this.logger,\n flowController,\n schema,\n format: (binding, value) => {\n const formatter = schema.getFormatter(binding);\n\n return formatter?.format ? formatter.format(value) : value;\n },\n formatValue: (ref, value) => {\n const formatter = schema.getFormatterForType(ref);\n\n return formatter?.format ? formatter.format(value) : value;\n },\n validation: {\n ...validationController.forView(parseBinding),\n type: (b) => schema.getType(parseBinding(b)),\n },\n constants: this.constantsController,\n });\n viewController.hooks.view.tap(\"player\", (view) => {\n validationController.onView(view);\n this.hooks.view.call(view);\n });\n this.hooks.viewController.call(viewController);\n\n return {\n start: () => {\n flowController\n .start()\n .then((endState) => {\n const flowResult: FlowResult = {\n endState: resolveStrings(endState, false),\n data: dataController.serialize(),\n };\n\n return flowResult;\n })\n .then(flowResultDeferred.resolve)\n .catch((e) => {\n this.logger.error(`Something went wrong: ${e.message}`);\n throw e;\n })\n .catch(flowResultDeferred.reject)\n .finally(() => this.hooks.onEnd.call());\n },\n state: {\n status: \"in-progress\",\n flowResult: flowResultDeferred.promise,\n controllers: {\n data: dataController,\n view: viewController,\n flow: flowController,\n schema,\n expression: expressionEvaluator,\n binding: pathResolver,\n validation: validationController,\n },\n fail: flowResultDeferred.reject,\n flow: userFlow,\n logger: this.logger,\n },\n };\n }\n\n public async start(payload: FlowType): Promise<CompletedState> {\n const ref = Symbol(payload?.id ?? \"payload\");\n\n /** A check to avoid updating the state for a flow that's not the current one */\n const maybeUpdateState = <T extends PlayerFlowState>(newState: T) => {\n if (this.state.ref !== ref) {\n this.logger.warn(\n `Received update for a flow that's not the current one`,\n );\n\n return newState;\n }\n\n this.setState(newState);\n\n return newState;\n };\n\n this.setState({\n status: \"not-started\",\n ref,\n });\n\n try {\n const { state, start } = this.setupFlow(payload);\n this.setState({\n ref,\n ...state,\n });\n\n start();\n\n // common data for the end state\n // make sure to use the same ref as the starting one\n const endProps = {\n ref,\n status: \"completed\",\n flow: state.flow,\n controllers: {\n data: state.controllers.data.makeReadOnly(),\n },\n } as const;\n\n return maybeUpdateState({\n ...(await state.flowResult),\n ...endProps,\n });\n } catch (error: any) {\n const errorState: ErrorState = {\n status: \"error\",\n ref,\n flow: payload,\n error,\n };\n\n maybeUpdateState(errorState);\n\n throw error;\n }\n }\n}\n","import { SyncBailHook, SyncHook, SyncWaterfallHook } from \"tapable-ts\";\nimport type { DeferredPromise } from \"p-defer\";\nimport defer from \"p-defer\";\nimport type {\n NavigationFlow,\n NavigationFlowState,\n NavigationFlowEndState,\n} from \"@player-ui/types\";\nimport type { Logger } from \"../../logger\";\n\nexport interface NamedState {\n /** The name of the navigation node */\n name: string;\n\n /** The nav node */\n value: NavigationFlowState;\n}\n\nexport interface TransitionOptions {\n /** Ignore any validations or other signals preventing the transition from taking place */\n force?: boolean;\n}\nexport type TransitionFunction = (\n name: string,\n options?: TransitionOptions,\n) => void;\n\n/** The Content navigation state machine */\nexport class FlowInstance {\n private flow: NavigationFlow;\n private log?: Logger;\n private history: string[];\n private isTransitioning = false;\n private flowPromise?: DeferredPromise<NavigationFlowEndState>;\n public readonly id: string;\n public currentState?: NamedState;\n public readonly hooks = {\n beforeStart: new SyncBailHook<[NavigationFlow], NavigationFlow>(),\n\n /** A callback when the onStart node was present */\n onStart: new SyncHook<[any]>(),\n\n /** A callback when the onEnd node was present */\n onEnd: new SyncHook<[any]>(),\n\n /** A hook to intercept and block a transition */\n skipTransition: new SyncBailHook<\n [NamedState | undefined],\n boolean | undefined\n >(),\n\n /** A chance to manipulate the flow-node used to calculate the given transition used */\n beforeTransition: new SyncWaterfallHook<\n [Exclude<NavigationFlowState, NavigationFlowEndState>, string]\n >(),\n\n /** A chance to manipulate the flow-node calculated after a transition */\n resolveTransitionNode: new SyncWaterfallHook<[NavigationFlowState]>(),\n\n /** A callback when a transition from 1 state to another was made */\n transition: new SyncHook<[NamedState | undefined, NamedState]>(),\n\n /** A callback to run actions after a transition occurs */\n afterTransition: new SyncHook<[FlowInstance]>(),\n };\n\n constructor(\n id: string,\n flow: NavigationFlow,\n options?: {\n /** Logger instance to use */\n logger?: Logger;\n },\n ) {\n this.id = id;\n this.flow = flow;\n this.log = options?.logger;\n this.history = [];\n\n this.hooks.transition.tap(\n \"startPromise\",\n async (_oldState, nextState: NamedState) => {\n const newState = nextState.value;\n\n if (this.flowPromise && newState.state_type === \"END\") {\n this.flowPromise.resolve(newState);\n }\n },\n );\n }\n\n /** Start the state machine */\n public async start(): Promise<NavigationFlowEndState> {\n if (this.flowPromise) {\n this.log?.warn(\"Already called start for flow\");\n\n return this.flowPromise.promise;\n }\n\n this.flow = this.hooks.beforeStart.call(this.flow) || this.flow;\n\n if (this.flow.onStart) {\n this.hooks.onStart.call(this.flow.onStart);\n }\n\n const initialState = this.flow.startState;\n\n if (!initialState) {\n return Promise.reject(new Error(\"No 'startState' defined for flow\"));\n }\n\n this.flowPromise = defer();\n this.pushHistory(initialState);\n\n return this.flowPromise.promise;\n }\n\n public transition(transitionValue: string, options?: TransitionOptions) {\n if (this.isTransitioning) {\n throw new Error(\n `Transitioning while ongoing transition from ${this.currentState?.name} is in progress is not supported`,\n );\n }\n\n if (this.currentState?.value.state_type === \"END\") {\n this.log?.warn(\n `Skipping transition using ${transitionValue}. Already at and END state`,\n );\n\n return;\n }\n\n if (this.currentState === undefined) {\n throw new Error(\"Cannot transition when there's no current state\");\n }\n\n if (options?.force) {\n this.log?.debug(`Forced transition. Skipping validation checks`);\n } else {\n const skipTransition = this.hooks.skipTransition.call(this.currentState);\n\n if (skipTransition) {\n this.log?.debug(\n `Skipping transition from ${this.currentState.name} b/c hook told us to`,\n );\n return;\n }\n }\n\n const state = this.hooks.beforeTransition.call(\n this.currentState.value,\n transitionValue,\n );\n\n if (!(\"transitions\" in state)) {\n throw new Error(`No transitions defined for ${this.currentState.value}`);\n }\n\n const { transitions } = state;\n const nextState = transitions[transitionValue] || transitions[\"*\"];\n\n if (nextState === undefined) {\n this.log?.warn(\n `No transition from ${this.currentState.name} using ${transitionValue} or *`,\n );\n\n return;\n }\n\n this.log?.debug(\n `Transitioning from ${this.currentState.name} to ${nextState} using ${transitionValue} `,\n );\n\n return this.pushHistory(nextState, options);\n }\n\n private pushHistory(stateName: string, options?: TransitionOptions) {\n if (!Object.prototype.hasOwnProperty.call(this.flow, stateName)) {\n throw new Error(`No flow definition for: ${stateName} was found.`);\n }\n\n let nextState = this.flow[stateName];\n\n if (\n !this.flow[stateName] ||\n typeof nextState !== \"object\" ||\n !(\"state_type\" in nextState)\n ) {\n this.log?.error(`Flow doesn't contain any states named: ${stateName}`);\n\n return;\n }\n\n const prevState = this.currentState;\n\n this.isTransitioning = true;\n nextState = this.hooks.resolveTransitionNode.call(nextState);\n\n const newCurrentState = {\n name: stateName,\n value: nextState,\n } as NamedState;\n this.currentState = newCurrentState;\n this.history.push(stateName);\n\n // If the new state is an END state call the `onEnd` if it exists\n\n if (newCurrentState.value.state_type === \"END\" && this.flow.onEnd) {\n this.hooks.onEnd.call(this.flow.onEnd);\n }\n\n this.hooks.transition.call(prevState, {\n ...newCurrentState,\n });\n\n this.isTransitioning = false;\n\n this.hooks.afterTransition.call(this);\n }\n}\n","import type { Validation } from \"@player-ui/types\";\nimport { SyncHook, SyncWaterfallHook } from \"tapable-ts\";\nimport { setIn } from \"timm\";\n\nimport type { BindingInstance, BindingFactory } from \"../../binding\";\nimport { isBinding } from \"../../binding\";\nimport type { DataModelWithParser, DataModelMiddleware } from \"../../data\";\nimport type { SchemaController } from \"../../schema\";\nimport type {\n ErrorValidationResponse,\n ValidationObject,\n ValidationObjectWithHandler,\n ValidatorContext,\n ValidationProvider,\n ValidationResponse,\n WarningValidationResponse,\n StrongOrWeakBinding,\n} from \"../../validator\";\nimport {\n ValidationMiddleware,\n ValidatorRegistry,\n removeBindingAndChildrenFromMap,\n} from \"../../validator\";\nimport type { Logger } from \"../../logger\";\nimport { ProxyLogger } from \"../../logger\";\nimport type { Resolve, ViewInstance } from \"../../view\";\nimport { caresAboutDataChanges } from \"../../view\";\nimport { replaceParams } from \"../../utils\";\nimport { resolveDataRefs } from \"../../string-resolver\";\nimport type {\n ExpressionEvaluatorOptions,\n ExpressionType,\n} from \"../../expressions\";\nimport type { BindingTracker } from \"./binding-tracker\";\nimport { ValidationBindingTrackerViewPlugin } from \"./binding-tracker\";\n\nexport const SCHEMA_VALIDATION_PROVIDER_NAME = \"schema\";\nexport const VIEW_VALIDATION_PROVIDER_NAME = \"view\";\n\nexport const VALIDATION_PROVIDER_NAME_SYMBOL: unique symbol = Symbol.for(\n \"validation-provider-name\",\n);\n\nexport type ValidationObjectWithSource = ValidationObjectWithHandler & {\n /** The name of the validation */\n [VALIDATION_PROVIDER_NAME_SYMBOL]: string;\n};\n\ntype SimpleValidatorContext = Omit<\n ValidatorContext,\n \"validation\" | \"schemaType\"\n>;\n\ninterface BaseActiveValidation<T> {\n /** The validation is being actively shown */\n state: \"active\";\n\n /** The validation response */\n response: T;\n}\n\ntype ActiveWarning = BaseActiveValidation<WarningValidationResponse> & {\n /** Warnings track if they can be dismissed automatically (by navigating) */\n dismissable: boolean;\n};\ntype ActiveError = BaseActiveValidation<ErrorValidationResponse>;\n\n/**\n * warnings that keep track of their active state\n */\ntype StatefulWarning = {\n /** A common key to differentiate between errors and warnings */\n type: \"warning\";\n\n /** The underlying validation this tracks */\n value: ValidationObjectWithSource;\n\n /** If this is currently preventing navigation from continuing */\n isBlockingNavigation: boolean;\n} & (\n | {\n /** warnings start with no state, but can active or dismissed */\n state: \"none\" | \"dismissed\";\n }\n | ActiveWarning\n);\n\n/** Errors that keep track of their state */\ntype StatefulError = {\n /** A common key to differentiate between errors and warnings */\n type: \"error\";\n\n /** The underlying validation this tracks */\n value: ValidationObjectWithSource;\n\n /** If this is currently preventing navigation from continuing */\n isBlockingNavigation: boolean;\n} & (\n | {\n /** Errors start with no state an can be activated */\n state: \"none\";\n }\n | ActiveError\n);\n\nexport type StatefulValidationObject = StatefulWarning | StatefulError;\n\n/** Helper function to determin if the subset is within the containingSet */\nfunction isSubset<T>(subset: Set<T>, containingSet: Set<T>): boolean {\n if (subset.size > containingSet.size) return false;\n for (const entry of subset) if (!containingSet.has(entry)) return false;\n return true;\n}\n\n/** Helper for initializing a validation object that tracks state */\nfunction createStatefulValidationObject(\n obj: ValidationObjectWithSource,\n): StatefulValidationObject {\n return {\n value: obj,\n type: obj.severity,\n state: \"none\",\n isBlockingNavigation: false,\n };\n}\n\ntype ValidationRunner = (obj: ValidationObjectWithHandler) =>\n | {\n /** A validation message */\n message: string;\n }\n | undefined;\n\n/** A class that manages validating bindings across phases */\nclass ValidatedBinding {\n public currentPhase?: Validation.Trigger;\n private applicableValidations: Array<StatefulValidationObject> = [];\n private validationsByState: Record<\n Validation.Trigger,\n Array<StatefulValidationObject>\n > = {\n load: [],\n change: [],\n navigation: [],\n };\n\n public get allValidations(): Array<StatefulValidationObject> {\n return Object.values(this.validationsByState).flat();\n }\n\n public weakBindings: Set<BindingInstance>;\n\n private onDismiss?: () => void;\n\n constructor(\n possibleValidations: Array<ValidationObjectWithSource>,\n onDismiss?: () => void,\n log?: Logger,\n weakBindings?: Set<BindingInstance>,\n ) {\n this.onDismiss = onDismiss;\n possibleValidations.forEach((vObj) => {\n const { trigger } = vObj;\n\n if (this.validationsByState[trigger]) {\n const statefulValidationObject = createStatefulValidationObject(vObj);\n this.validationsByState[trigger].push(statefulValidationObject);\n } else {\n log?.warn(`Unknown validation trigger: ${trigger}`);\n }\n });\n this.weakBindings = weakBindings ?? new Set();\n }\n\n private checkIfBlocking(statefulObj: StatefulValidationObject) {\n if (statefulObj.state === \"active\") {\n const { isBlockingNavigation } = statefulObj;\n return isBlockingNavigation;\n }\n\n return false;\n }\n\n public getAll(): Array<ValidationResponse> {\n return this.applicableValidations.reduce((all, statefulObj) => {\n if (statefulObj.state === \"active\" && statefulObj.response) {\n all.push({\n ...statefulObj.response,\n blocking: this.checkIfBlocking(statefulObj),\n });\n }\n\n return all;\n }, [] as Array<ValidationResponse>);\n }\n\n public get(): ValidationResponse | undefined {\n const firstInvalid = this.applicableValidations.find((statefulObj) => {\n return statefulObj.state === \"active\" && statefulObj.response;\n });\n\n if (firstInvalid?.state === \"active\") {\n return {\n ...firstInvalid.response,\n blocking: this.checkIfBlocking(firstInvalid),\n };\n }\n }\n\n private runApplicableValidations(\n runner: ValidationRunner,\n canDismiss: boolean,\n phase: Validation.Trigger,\n ) {\n // If the currentState is not load, skip those\n this.applicableValidations = this.applicableValidations.map(\n (originalValue) => {\n if (originalValue.state === \"dismissed\") {\n // Don't rerun any dismissed warnings\n return originalValue;\n }\n\n // treat all warnings the same and block it once (unless blocking is true)\n const blocking =\n originalValue.value.blocking ??\n ((originalValue.value.severity === \"warning\" && \"once\") || true);\n\n const obj = setIn(\n originalValue,\n [\"value\", \"blocking\"],\n blocking,\n ) as StatefulValidationObject;\n\n const isBlockingNavigation =\n blocking === true || (blocking === \"once\" && !canDismiss);\n\n if (\n phase === \"navigation\" &&\n obj.state === \"active\" &&\n obj.value.blocking !== true\n ) {\n if (obj.value.severity === \"warning\") {\n const warn = obj as ActiveWarning;\n if (\n warn.dismissable &&\n warn.response.dismiss &&\n (warn.response.blocking !== \"once\" || !warn.response.blocking)\n ) {\n warn.response.dismiss();\n } else {\n if (warn?.response.blocking === \"once\") {\n warn.response.blocking = false;\n }\n\n warn.dismissable = true;\n }\n\n return warn as StatefulValidationObject;\n }\n }\n\n const response = runner(obj.value);\n\n const newState = {\n type: obj.type,\n value: obj.value,\n state: response ? \"active\" : \"none\",\n isBlockingNavigation,\n dismissable:\n obj.value.severity === \"warning\" && phase === \"navigation\",\n response: response\n ? {\n ...obj.value,\n message: response.message ?? \"Something is broken\",\n severity: obj.value.severity,\n displayTarget: obj.value.displayTarget ?? \"field\",\n }\n : undefined,\n } as StatefulValidationObject;\n\n if (newState.state === \"active\" && obj.value.severity === \"warning\") {\n (newState.response as WarningValidationResponse).dismiss = () => {\n (newState as StatefulWarning).state = \"dismissed\";\n this.onDismiss?.();\n };\n }\n\n return newState;\n },\n );\n }\n\n public update(\n phase: Validation.Trigger,\n canDismiss: boolean,\n runner: ValidationRunner,\n ) {\n const newApplicableValidations: StatefulValidationObject[] = [];\n\n if (phase === \"load\" && this.currentPhase !== undefined) {\n // Tried to run the 'load' phase twice. Aborting\n return;\n }\n\n if (this.currentPhase === \"navigation\" || phase === this.currentPhase) {\n // Already added all the types. No need to continue adding new validations\n this.runApplicableValidations(runner, canDismiss, phase);\n return;\n }\n\n if (phase === \"load\") {\n this.currentPhase = \"load\";\n this.applicableValidations = [...this.validationsByState.load];\n } else if (phase === \"change\" && this.currentPhase === \"load\") {\n this.currentPhase = \"change\";\n // The transition to the 'change' type can only come from a 'load' type\n this.applicableValidations = [\n ...this.applicableValidations,\n ...this.validationsByState.change,\n ];\n } else if (\n phase === \"navigation\" &&\n (this.currentPhase === \"load\" || this.currentPhase === \"change\")\n ) {\n // Can transition to a nav state from a change or load\n\n // if there is an non-blocking error that is active then remove the error from applicable validations so it can no longer be shown\n // which is needed if there are additional warnings to become active for that binding after the error is shown\n this.applicableValidations.forEach((element) => {\n if (\n !(\n element.type === \"error\" &&\n element.state === \"active\" &&\n element.isBlockingNavigation === false\n )\n ) {\n newApplicableValidations.push(element);\n }\n });\n\n this.applicableValidations = [\n ...newApplicableValidations,\n ...this.validationsByState.navigation,\n ...(this.currentPhase === \"load\" ? this.validationsByState.change : []),\n ];\n this.currentPhase = \"navigation\";\n }\n\n this.runApplicableValidations(runner, canDismiss, phase);\n }\n}\n\n/**\n * A controller for orchestrating validation within a running player\n *\n * The current validation flow is as follows:\n *\n * - When a binding is first seen, gather all of the possible validations for it from the providers\n * - Schema and Crossfield (view) are both providers of possible validations\n * - Run all of the applicable validations for that binding for the `load` trigger\n *\n * - When a change occurs, set the phase of the binding to `change`.\n * - Run all of the `change` triggered validations for that binding.\n *\n * - When a navigation event occurs, set the phase of the binding to `navigate`.\n * - Run all `change` and `navigate` validations for each tracked binding.\n * - For any warnings, also keep a state of `shown` or `dismissed`.\n * - Set all non-dismissed warnings to `shown`.\n * - Set all `shown` warnings to `dismissed`.\n * - Allow navigation forward if there are no non-dismissed warnings and no valid errors.\n */\nexport class ValidationController implements BindingTracker {\n public readonly hooks = {\n /** A hook called to tap into the validator registry for adding more validators */\n createValidatorRegistry: new SyncHook<[ValidatorRegistry]>(),\n\n /** A callback/event when a new validation is added to the view */\n onAddValidation: new SyncWaterfallHook<\n [ValidationResponse, BindingInstance]\n >(),\n\n /** The inverse of onAddValidation, this is called when a validation is removed from the list */\n onRemoveValidation: new SyncWaterfallHook<\n [ValidationResponse, BindingInstance]\n >(),\n\n resolveValidationProviders: new SyncWaterfallHook<\n [\n Array<{\n /** The name of the provider */\n source: string;\n /** The provider itself */\n provider: ValidationProvider;\n }>,\n ],\n {\n /** The view this is triggered for */\n view?: ViewInstance;\n }\n >(),\n\n /** A hook called when a binding is added to the tracker */\n onTrackBinding: new SyncHook<[BindingInstance]>(),\n };\n\n private tracker: BindingTracker | undefined;\n private validations = new Map<BindingInstance, ValidatedBinding>();\n private validatorRegistry?: ValidatorRegistry;\n private schema: SchemaController;\n\n private providers:\n | Array<{\n /** The name of the provider */\n source: string;\n /** The provider itself */\n provider: ValidationProvider;\n }>\n | undefined;\n\n private viewValidationProvider?: ValidationProvider;\n private options?: SimpleValidatorContext;\n private weakBindingTracker = new Set<BindingInstance>();\n\n constructor(schema: SchemaController, options?: SimpleValidatorContext) {\n this.schema = schema;\n this.options = options;\n this.reset();\n }\n\n setOptions(options: SimpleValidatorContext) {\n this.options = options;\n }\n\n /** Return the middleware for the data-model to stop propagation of invalid data */\n public getDataMiddleware(): Array<DataModelMiddleware> {\n return [\n {\n set: (transaction, options, next) => {\n return next?.set(transaction, options) ?? [];\n },\n get: (binding, options, next) => {\n return next?.get(binding, options);\n },\n delete: (binding, options, next) => {\n this.validations = removeBindingAndChildrenFromMap(\n this.validations,\n binding,\n );\n\n return next?.delete(binding, options);\n },\n },\n new ValidationMiddleware(\n (binding) => {\n if (!this.options) {\n return;\n }\n\n this.updateValidationsForBinding(binding, \"change\", this.options);\n const strongValidation = this.getValidationForBinding(binding);\n\n // return validation issues directly on bindings first\n if (strongValidation?.get()?.severity === \"error\") {\n return strongValidation.get();\n }\n\n // if none, check to see any validations this binding may be a weak ref of and return\n const newInvalidBindings: Set<StrongOrWeakBinding> = new Set();\n this.validations.forEach((weakValidation, strongBinding) => {\n if (\n caresAboutDataChanges(\n new Set([binding]),\n weakValidation.weakBindings,\n ) &&\n weakValidation?.get()?.severity === \"error\"\n ) {\n weakValidation?.weakBindings.forEach((weakBinding) => {\n if (weakBinding === strongBinding) {\n newInvalidBindings.add({\n binding: weakBinding,\n isStrong: true,\n });\n } else {\n newInvalidBindings.add({\n binding: weakBinding,\n isStrong: false,\n });\n }\n });\n }\n });\n\n if (newInvalidBindings.size > 0) {\n return newInvalidBindings;\n }\n },\n { logger: new ProxyLogger(() => this.options?.logger) },\n ),\n ];\n }\n\n private getValidationProviders() {\n if (this.providers) {\n return this.providers;\n }\n\n this.providers = this.hooks.resolveValidationProviders.call([\n {\n source: SCHEMA_VALIDATION_PROVIDER_NAME,\n provider: this.schema,\n },\n {\n source: VIEW_VALIDATION_PROVIDER_NAME,\n provider: {\n getValidationsForBinding: (\n binding: BindingInstance,\n ): Array<ValidationObject> | undefined => {\n return this.viewValidationProvider?.getValidationsForBinding?.(\n binding,\n );\n },\n\n getValidationsForView: (): Array<ValidationObject> | undefined => {\n return this.viewValidationProvider?.getValidationsForView?.();\n },\n },\n },\n ]);\n\n return this.providers;\n }\n\n public reset() {\n this.validations.clear();\n this.tracker = undefined;\n }\n\n public onView(view: ViewInstance): void {\n this.validations.clear();\n if (!this.options) {\n return;\n }\n\n const bindingTrackerPlugin = new ValidationBindingTrackerViewPlugin({\n ...this.options,\n callbacks: {\n onAdd: (binding) => {\n if (\n !this.options ||\n this.getValidationForBinding(binding) !== undefined\n ) {\n return;\n }\n\n // Set the default value for the binding if we need to\n const originalValue = this.options.model.get(binding);\n const withoutDefault = this.options.model.get(binding, {\n ignoreDefaultValue: true,\n });\n\n if (originalValue !== withoutDefault) {\n // Don't trigger updates when setting the default value\n this.options.model.set([[binding, originalValue]], {\n silent: true,\n });\n }\n\n this.updateValidationsForBinding(\n binding,\n \"load\",\n this.options,\n () => {\n view.update(new Set([binding]));\n },\n );\n\n this.hooks.onTrackBinding.call(binding);\n },\n },\n });\n\n this.tracker = bindingTrackerPlugin;\n this.viewValidationProvider = view;\n\n bindingTrackerPlugin.apply(view);\n }\n\n updateValidationsForBinding(\n binding: BindingInstance,\n trigger: Validation.Trigger,\n validationContext?: SimpleValidatorContext,\n onDismiss?: () => void,\n ): void {\n const context = validationContext ?? this.options;\n\n if (!context) {\n throw new Error(`Context is required for executing validations`);\n }\n\n if (trigger === \"load\") {\n // Get all of the validations from each provider\n const possibleValidations = this.getValidationProviders().reduce<\n Array<ValidationObjectWithSource>\n >((vals, provider) => {\n vals.push(\n ...(provider.provider\n .getValidationsForBinding?.(binding)\n ?.map((valObj) => ({\n ...valObj,\n [VALIDATION_PROVIDER_NAME_SYMBOL]: provider.source,\n })) ?? []),\n );\n\n return vals;\n }, []);\n\n if (possibleValidations.length === 0) {\n return;\n }\n\n this.validations.set(\n binding,\n new ValidatedBinding(\n possibleValidations,\n onDismiss,\n this.options?.logger,\n ),\n );\n }\n\n const trackedValidations = this.validations.get(binding);\n trackedValidations?.update(trigger, true, (validationObj) => {\n const response = this.validationRunner(validationObj, binding, context);\n\n if (this.weakBindingTracker.size > 0) {\n const t = this.validations.get(binding) as ValidatedBinding;\n this.weakBindingTracker.forEach((b) => t.weakBindings.add(b));\n }\n\n return response ? { message: response.message } : undefined;\n });\n\n // Also run any validations that binding or sub-binding is a weak binding of\n if (trigger !== \"load\") {\n this.validations.forEach((validation, vBinding) => {\n if (\n vBinding !== binding &&\n caresAboutDataChanges(new Set([binding]), validation.weakBindings)\n ) {\n validation.update(trigger, true, (validationObj) => {\n const response = this.validationRunner(\n validationObj,\n vBinding,\n context,\n );\n return response ? { message: response.message } : undefined;\n });\n }\n });\n }\n }\n\n validationRunner(\n validationObj: ValidationObjectWithHandler,\n binding: BindingInstance,\n context: SimpleValidatorContext | undefined = this.options,\n ) {\n if (!context) {\n throw new Error(\"No context provided to validation runner\");\n }\n\n const handler =\n validationObj.handler ?? this.getValidator(validationObj.type);\n\n const weakBindings = new Set<BindingInstance>();\n\n // For any data-gets in the validation runner, default to using the _invalid_ value (since that's what we're testing against)\n const model: DataModelWithParser = {\n get(b, options) {\n weakBindings.add(isBinding(b) ? binding : context.parseBinding(b));\n return context.model.get(b, { ...options, includeInvalid: true });\n },\n set: context.model.set,\n delete: context.model.delete,\n };\n\n const result = handler?.(\n {\n ...context,\n evaluate: (\n exp: ExpressionType,\n options: ExpressionEvaluatorOptions = { model },\n ) => context.evaluate(exp, options),\n model,\n validation: validationObj,\n schemaType: this.schema.getType(binding),\n },\n context.model.get(binding, {\n includeInvalid: true,\n formatted: validationObj.dataTarget === \"formatted\",\n }),\n validationObj,\n );\n\n this.weakBindingTracker = weakBindings;\n\n if (result) {\n let { message } = result;\n const { parameters } = result;\n\n if (validationObj.message) {\n message = resolveDataRefs(validationObj.message, {\n model,\n evaluate: context.evaluate,\n });\n if (parameters) {\n message = replaceParams(message, parameters);\n }\n }\n\n return {\n message,\n };\n }\n }\n\n private updateValidationsForView(trigger: Validation.Trigger): void {\n const isNavigationTrigger = trigger === \"navigation\";\n const lastActiveBindings = this.activeBindings;\n\n /** Run validations for all bindings in view */\n const updateValidations = (dismissValidations: boolean) => {\n this.getBindings().forEach((binding) => {\n this.validations\n .get(binding)\n ?.update(trigger, dismissValidations, (obj) => {\n if (!this.options) {\n return;\n }\n\n return this.validationRunner(obj, binding, this.options);\n });\n });\n };\n\n // Should dismiss for non-navigation triggers.\n updateValidations(!isNavigationTrigger);\n\n if (isNavigationTrigger) {\n // If validations didn't change since last update, dismiss all dismissible validations.\n const { activeBindings } = this;\n if (isSubset(activeBindings, lastActiveBindings)) {\n updateValidations(true);\n }\n }\n }\n\n private get activeBindings(): Set<BindingInstance> {\n return new Set(\n Array.from(this.getBindings()).filter(\n (b) => this.validations.get(b)?.get() !== undefined,\n ),\n );\n }\n\n public getValidator(type: string) {\n if (this.validatorRegistry) {\n return this.validatorRegistry.get(type);\n }\n\n const registry = new ValidatorRegistry();\n this.hooks.createValidatorRegistry.call(registry);\n this.validatorRegistry = registry;\n\n return registry.get(type);\n }\n\n getBindings(): Set<BindingInstance> {\n return this.tracker?.getBindings() ?? new Set();\n }\n\n trackBinding(binding: BindingInstance): void {\n this.tracker?.trackBinding(binding);\n }\n\n /** Executes all known validations for the tracked bindings using the given model */\n validateView(trigger: Validation.Trigger = \"navigation\"): {\n /** Indicating if the view can proceed without error */\n canTransition: boolean;\n\n /** the validations that are preventing the view from continuing */\n validations?: Map<BindingInstance, ValidationResponse>;\n } {\n this.updateValidationsForView(trigger);\n\n const validations = new Map<BindingInstance, ValidationResponse>();\n\n let canTransition = true;\n\n this.getBindings().forEach((b) => {\n const allValidations = this.getValidationForBinding(b)?.getAll();\n\n allValidations?.forEach((v) => {\n if (trigger === \"navigation\" && v.blocking) {\n this.options?.logger.debug(\n `Validation on binding: ${b.asString()} is preventing navigation. ${JSON.stringify(\n v,\n )}`,\n );\n\n canTransition = false;\n }\n\n if (!validations.has(b)) {\n validations.set(b, v);\n }\n });\n });\n\n return {\n canTransition,\n validations: validations.size ? validations : undefined,\n };\n }\n\n /** Get the current tracked validation for the given binding */\n public getValidationForBinding(\n binding: BindingInstance,\n ): ValidatedBinding | undefined {\n return this.validations.get(binding);\n }\n\n forView(parser: BindingFactory): Resolve.Validation {\n return {\n _getValidationForBinding: (binding) => {\n return this.getValidationForBinding(\n isBinding(binding) ? binding : parser(binding),\n );\n },\n getAll: () => {\n const bindings = this.getBindings();\n if (bindings.size === 0) {\n return undefined;\n }\n\n const validationMapping = new Map<\n BindingInstance,\n ValidationResponse\n >();\n\n bindings.forEach((b) => {\n const validation = this.getValidationForBinding(b)?.get();\n\n if (validation) {\n validationMapping.set(b, validation);\n }\n });\n\n return validationMapping.size === 0 ? undefined : validationMapping;\n },\n get() {\n throw new Error(\"Error Access be provided by the view plugin\");\n },\n getValidationsForBinding() {\n throw new Error(\"Error rollup should be provided by the view plugin\");\n },\n getChildren() {\n throw new Error(\"Error rollup should be provided by the view plugin\");\n },\n getValidationsForSection() {\n throw new Error(\"Error rollup should be provided by the view plugin\");\n },\n track: () => {\n throw new Error(\"Tracking should be provided by the view plugin\");\n },\n register: () => {\n throw new Error(\n \"Section functionality should be provided by the view plugin\",\n );\n },\n type: (binding) =>\n this.schema.getType(isBinding(binding) ? binding : parser(binding)),\n };\n }\n}\n","import { SyncHook, SyncWaterfallHook } from \"tapable-ts\";\nimport queueMicrotask from \"queue-microtask\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type { View, NavigationFlowViewState } from \"@player-ui/types\";\n\nimport { resolveDataRefsInString } from \"../../string-resolver\";\nimport type { Resolve } from \"../../view\";\nimport { ViewInstance } from \"../../view\";\nimport type { Logger } from \"../../logger\";\nimport type { FlowInstance, FlowController } from \"../flow\";\nimport type { DataController } from \"../data/controller\";\nimport { AssetTransformCorePlugin } from \"./asset-transform\";\nimport type { TransformRegistry } from \"./types\";\nimport type { BindingInstance } from \"../../binding\";\n\nexport interface ViewControllerOptions {\n /** Where to get data from */\n model: DataController;\n\n /** Where to log data */\n logger?: Logger;\n\n /** A flow-controller instance to listen for view changes */\n flowController: FlowController;\n}\n\n/** A controller to manage updating/switching views */\nexport class ViewController {\n public readonly hooks = {\n /** Do any processing before the `View` instance is created */\n resolveView: new SyncWaterfallHook<\n [View | undefined, string, NavigationFlowViewState]\n >(),\n\n // The hook right before the View starts resolving. Attach anything custom here\n view: new SyncHook<[ViewInstance]>(),\n };\n\n private readonly viewMap: Record<string, View>;\n private readonly viewOptions: Resolve.ResolverOptions & ViewControllerOptions;\n private pendingUpdate?: {\n /** pending data binding changes */\n changedBindings?: Set<BindingInstance>;\n /** Whether we have a microtask queued to handle this pending update */\n scheduled?: boolean;\n };\n\n public currentView?: ViewInstance;\n public transformRegistry: TransformRegistry = new Registry();\n public optimizeUpdates = true;\n\n constructor(\n initialViews: View[],\n options: Resolve.ResolverOptions & ViewControllerOptions,\n ) {\n this.viewOptions = options;\n this.viewMap = initialViews.reduce<Record<string, View>>(\n (viewMap, view) => {\n // eslint-disable-next-line no-param-reassign\n viewMap[view.id] = view;\n return viewMap;\n },\n {},\n );\n\n new AssetTransformCorePlugin(this.transformRegistry).apply(this);\n\n options.flowController.hooks.flow.tap(\n \"viewController\",\n (flow: FlowInstance) => {\n flow.hooks.transition.tap(\"viewController\", (_oldState, newState) => {\n if (newState.value.state_type === \"VIEW\") {\n this.onView(newState.value);\n } else {\n this.currentView = undefined;\n }\n });\n },\n );\n\n /** Trigger a view update */\n const update = (updates: Set<BindingInstance>, silent = false) => {\n if (this.currentView) {\n if (this.optimizeUpdates) {\n this.queueUpdate(updates, silent);\n } else {\n this.currentView.update();\n }\n }\n };\n\n options.model.hooks.onUpdate.tap(\n \"viewController\",\n (updates, updateOptions) => {\n update(\n new Set(updates.map((t) => t.binding)),\n updateOptions?.silent ?? false,\n );\n },\n );\n\n options.model.hooks.onDelete.tap(\"viewController\", (binding) => {\n const parentBinding = binding.parent();\n const property = binding.key();\n\n // Deleting an array item will trigger an update for the entire array\n if (typeof property === \"number\" && parentBinding) {\n update(new Set([parentBinding]));\n } else {\n update(new Set([binding]));\n }\n });\n }\n\n private queueUpdate(bindings: Set<BindingInstance>, silent = false) {\n if (this.pendingUpdate?.changedBindings) {\n // If there's already a pending update, just add to it don't worry about silent updates here yet\n this.pendingUpdate.changedBindings = new Set([\n ...this.pendingUpdate.changedBindings,\n ...bindings,\n ]);\n } else {\n this.pendingUpdate = { changedBindings: bindings, scheduled: false };\n }\n\n // If there's no pending update, schedule one only if this one isn't silent\n // otherwise if this is silent, we'll just wait for the next non-silent update and make sure our bindings are included\n if (!this.pendingUpdate.scheduled && !silent) {\n this.pendingUpdate.scheduled = true;\n queueMicrotask(() => {\n const updates = this.pendingUpdate?.changedBindings;\n this.pendingUpdate = undefined;\n this.currentView?.update(updates);\n });\n }\n }\n\n private getViewForRef(viewRef: string): View | undefined {\n // First look for a 1:1 viewRef -> id mapping (this is most common)\n if (this.viewMap[viewRef]) {\n return this.viewMap[viewRef];\n }\n\n // The view ids saved may also contain model refs, resolve those and try again\n const matchingViewId = Object.keys(this.viewMap).find(\n (possibleViewIdMatch) =>\n viewRef ===\n resolveDataRefsInString(possibleViewIdMatch, {\n model: this.viewOptions.model,\n evaluate: this.viewOptions.evaluator.evaluate,\n }),\n );\n\n if (matchingViewId && this.viewMap[matchingViewId]) {\n return this.viewMap[matchingViewId];\n }\n }\n\n public onView(state: NavigationFlowViewState) {\n const viewId = state.ref;\n\n const source = this.hooks.resolveView.call(\n this.getViewForRef(viewId),\n viewId,\n state,\n );\n\n if (!source) {\n throw new Error(`No view with id ${viewId}`);\n }\n\n const view = new ViewInstance(source, this.viewOptions);\n this.currentView = view;\n\n // Give people a chance to attach their\n // own listeners to the view before we resolve it\n this.hooks.view.call(view);\n view.update();\n }\n}\n","import SortedArray from \"sorted-array\";\nimport type { Matcher } from \"./deep-partial-matcher\";\nimport createObjectMatcher from \"./deep-partial-matcher\";\n\nexport { default as createObjectMatcher } from \"./deep-partial-matcher\";\n\n/** create a matcher function that matches exactly */\nfunction createBasicMatcher(seed: any): Matcher {\n /** a simple matcher function that only matches itself */\n const matcher = (match: any) => seed === match;\n matcher.count = 1;\n\n return matcher;\n}\n\ninterface RegistryIndex<V> {\n /** The original object we wanted to match on */\n key: object;\n\n /** The value to return */\n value: V;\n\n /** The matcher function for this entry */\n matcher: Matcher;\n}\n\n/** create an empty sorted array using the matcher count */\nconst createSortedArray = <V>() =>\n new SortedArray<RegistryIndex<V>>([], (c) => c.matcher.count);\n\n/**\n * A partial match registry is a map that uses an object to \"match\" against keys.\n * More specific matches take precedence over less specific ones.\n */\nexport class Registry<V> {\n private store = createSortedArray<V>();\n\n constructor(initialSet?: Array<[any, V]>) {\n initialSet?.forEach(([match, value]) => {\n this.set(match, value);\n });\n }\n\n /** Add match -> value mapping to the registry */\n set(match: any, value: V) {\n const matcher =\n typeof match === \"object\"\n ? createObjectMatcher(match)\n : createBasicMatcher(match);\n\n this.store.insert({\n key: match,\n value,\n matcher,\n });\n }\n\n /** Fetch the best match in the registry */\n get(query: any): V | undefined {\n for (const entry of this.store.array) {\n if (entry.matcher(query)) {\n return entry.value;\n }\n }\n }\n\n /** Loop over all entries and run callback */\n forEach(callbackfn: (value: RegistryIndex<V>) => void): void {\n for (const entry of this.store.array) {\n callbackfn(entry);\n }\n }\n\n /** Reset the items in the registry */\n clear() {\n this.store = createSortedArray<V>();\n }\n\n /** Check if the registry is empty*/\n isRegistryEmpty() {\n return this.store.array.length === 0;\n }\n}\n","import dlv from \"dlv\";\n\n/** A function that checks overlapping properties against a reference value */\nexport type Matcher = ((searchObj: object) => boolean) & {\n /** The count represents the specificity of this matcher */\n count: number;\n};\n\n/** Traverse an object and collect any key/value pairs including nested keys */\nfunction traverseObj(\n object: Record<any, any>,\n path: string[] = [],\n pairs: Map<string[], any> = new Map(),\n): Map<string[], any> {\n for (const key of Object.keys(object)) {\n const val: any = object[key];\n const nestedPath = [...path, key];\n (\"\");\n\n if (typeof val === \"object\") {\n traverseObj(val, nestedPath, pairs);\n } else {\n pairs.set(nestedPath, val);\n }\n }\n\n return pairs;\n}\n\n/** Given an object, create a function that compares any set key/value pairs in the given object against a new value */\nexport default function createMatcher(partialObj: object): Matcher {\n // Convert the partial object into a list of [key, value] pairs;\n const pairs = traverseObj(partialObj);\n\n /** Generate a function to match against all of the properties we care about */\n const matchFunction = (searchObj: object) => {\n for (const entry of Array.from(pairs)) {\n const [path, value] = entry;\n\n if (dlv(searchObj, path) !== value) {\n return false;\n }\n }\n\n return true;\n };\n\n // Keep track of the specificity of the comparator\n matchFunction.count = pairs.size;\n\n return matchFunction;\n}\n","export interface Node<T extends string> {\n /** The basic node type */\n name: T;\n}\n\n/**\n * An AST node that represents a nested path in the model\n * foo.{{bar}}.baz (this is {{bar}})\n */\nexport interface PathNode extends Node<\"PathNode\"> {\n /** The path in the model that this node represents */\n path: Array<AnyNode>;\n}\n\n/**\n * A segment representing a query\n * [foo=bar]\n */\nexport interface QueryNode extends Node<\"Query\"> {\n /** The key to query */\n key: AnyNode;\n\n /** The target value */\n value?: AnyNode;\n}\n\n/** A simple segment */\nexport interface ValueNode extends Node<\"Value\"> {\n /** The segment value */\n value: string | number;\n}\n\n/** A nested expression */\nexport interface ExpressionNode extends Node<\"Expression\"> {\n /** The expression */\n value: string;\n}\n\n/** Helper to create a value node */\nexport const toValue = (value: string | number): ValueNode => ({\n name: \"Value\",\n value,\n});\n\n/** Helper to create an expression node */\nexport const toExpression = (value: string): ExpressionNode => ({\n name: \"Expression\",\n value,\n});\n\n/** Helper to create a nested path node */\nexport const toPath = (path: Array<AnyNode>): PathNode => ({\n name: \"PathNode\",\n path,\n});\n\n/** Helper to create a query node */\nexport const toQuery = (key: AnyNode, value?: AnyNode): QueryNode => ({\n name: \"Query\",\n key,\n value,\n});\n\n/** Create a concat node */\nexport const toConcatenatedNode = (\n values: Array<PathNode | ValueNode | ExpressionNode>,\n): PathNode | ValueNode | ConcatenatedNode | ExpressionNode => {\n if (values.length === 1) {\n return values[0];\n }\n\n return {\n name: \"Concatenated\",\n value: values,\n };\n};\n\n/**\n * A binding segment that's multiple smaller ones\n * {{foo}}_bar_{{baz}}\n */\nexport interface ConcatenatedNode extends Node<\"Concatenated\"> {\n /** A list of nested paths, or value nodes to concat together to form a segment */\n value: Array<PathNode | ValueNode | ExpressionNode>;\n}\n\nexport type AnyNode =\n | PathNode\n | QueryNode\n | ValueNode\n | ConcatenatedNode\n | ExpressionNode;\nexport type Path = Array<AnyNode>;\n\nexport interface ParserSuccessResult {\n /** A successful parse result */\n status: true;\n\n /** The path the binding represents */\n path: PathNode;\n}\n\nexport interface ParserFailureResult {\n /** A failed parse result */\n status: false;\n\n /** The message representing the reason the parse result failed */\n error: string;\n}\n\nexport type ParserResult = ParserSuccessResult | ParserFailureResult;\n\nexport type Parser = (raw: string) => ParserResult;\n","import type {\n Parser,\n AnyNode,\n PathNode,\n ConcatenatedNode,\n ValueNode,\n QueryNode,\n ExpressionNode,\n} from \"../ast\";\nimport {\n toValue,\n toPath,\n toConcatenatedNode,\n toQuery,\n toExpression,\n} from \"../ast\";\n\nconst SEGMENT_SEPARATOR = \".\";\nconst OPEN_CURL = \"{\";\nconst CLOSE_CURL = \"}\";\nconst OPEN_BRACKET = \"[\";\nconst CLOSE_BRACKET = \"]\";\nconst EQUALS = \"=\";\nconst SINGLE_QUOTE = \"'\";\nconst DOUBLE_QUOTE = '\"';\nconst BACK_TICK = \"`\";\n// const IDENTIFIER_REGEX = /[\\w\\-@]+/;\n\n/** A _faster_ way to match chars instead of a regex. */\nconst isIdentifierChar = (char?: string): boolean => {\n if (!char) {\n return false;\n }\n\n const charCode = char.charCodeAt(0);\n\n const matches =\n charCode === 32 || // ' '\n charCode === 34 || // \"\n charCode === 39 || // '\n charCode === 40 || // (\n charCode === 41 || // )\n charCode === 42 || // *\n charCode === 46 || // .\n charCode === 61 || // =\n charCode === 91 || // [\n charCode === 93 || // ]\n charCode === 96 || // `\n charCode === 123 || // {\n charCode === 125; // }\n\n return !matches;\n};\n\n/** Parse out a binding AST from a path */\nexport const parse: Parser = (path) => {\n let index = 1;\n let ch = path.charAt(0);\n\n /** get the next char in the string */\n const next = (expected?: string) => {\n if (expected && ch !== expected) {\n throw new Error(`Expected char: ${expected} but got: ${ch}`);\n }\n\n ch = path.charAt(index);\n index += 1;\n return ch;\n };\n\n /** gobble all whitespace */\n const whitespace = () => {\n /* eslint-disable no-unmodified-loop-condition */\n while (ch === \" \") {\n next();\n }\n };\n\n /** get an identifier if you can */\n const identifier = (): ValueNode | undefined => {\n if (!isIdentifierChar(ch)) {\n return;\n }\n\n let value = ch;\n\n while (next()) {\n if (!isIdentifierChar(ch)) {\n break;\n }\n\n value += ch;\n }\n\n if (value) {\n return toValue(value);\n }\n };\n\n /** get an expression node if you can */\n const expression = (): ExpressionNode | undefined => {\n if (ch === BACK_TICK) {\n next(BACK_TICK);\n\n let exp = ch;\n\n while (next()) {\n if (ch === BACK_TICK) {\n break;\n }\n\n exp += ch;\n }\n\n next(BACK_TICK);\n\n if (exp) {\n return toExpression(exp);\n }\n }\n };\n\n /** Grab a value using a regex */\n const regex = (match: RegExp): ValueNode | undefined => {\n if (!ch?.match(match)) {\n return;\n }\n\n let value = ch;\n\n while (next()) {\n if (!ch?.match(match)) {\n break;\n }\n\n value += ch;\n }\n\n if (value) {\n return toValue(value);\n }\n };\n\n /** parse out a nestedPath if you can */\n const nestedPath = (): PathNode | undefined => {\n if (ch === OPEN_CURL) {\n next(OPEN_CURL);\n next(OPEN_CURL);\n\n /* eslint-disable-next-line @typescript-eslint/no-use-before-define */\n const modelRef = parsePath();\n next(CLOSE_CURL);\n next(CLOSE_CURL);\n return modelRef;\n }\n };\n\n /** get a simple segment node */\n const simpleSegment = () => nestedPath() ?? expression() ?? identifier();\n\n /** Parse a segment */\n const segment = ():\n | ConcatenatedNode\n | PathNode\n | ValueNode\n | ExpressionNode\n | undefined => {\n // Either a string, modelRef, or concatenated version (both)\n const segments: Array<ValueNode | PathNode | ExpressionNode> = [];\n let nextSegment = simpleSegment();\n\n while (nextSegment !== undefined) {\n segments.push(nextSegment);\n nextSegment = simpleSegment();\n }\n\n if (segments.length === 0) {\n return undefined;\n }\n\n return toConcatenatedNode(segments);\n };\n\n /** get an optionally quoted block */\n const optionallyQuotedSegment = ():\n | ValueNode\n | PathNode\n | ExpressionNode\n | undefined => {\n whitespace();\n\n // see if we have a quote\n\n if (ch === SINGLE_QUOTE || ch === DOUBLE_QUOTE) {\n const singleQuote = ch === SINGLE_QUOTE;\n next(singleQuote ? SINGLE_QUOTE : DOUBLE_QUOTE);\n const id = regex(/[^'\"]+/);\n next(singleQuote ? SINGLE_QUOTE : DOUBLE_QUOTE);\n return id;\n }\n\n return simpleSegment();\n };\n\n /** eat equals signs */\n const equals = (): boolean => {\n if (ch !== EQUALS) {\n return false;\n }\n\n while (ch === EQUALS) {\n next();\n }\n\n return true;\n };\n\n /** Parse out a bracket */\n const parseBracket = ():\n | ValueNode\n | QueryNode\n | PathNode\n | ExpressionNode\n | undefined => {\n if (ch === OPEN_BRACKET) {\n next(OPEN_BRACKET);\n whitespace();\n let value: ValueNode | QueryNode | PathNode | ExpressionNode | undefined =\n optionallyQuotedSegment();\n if (value) {\n whitespace();\n if (equals()) {\n whitespace();\n const second = optionallyQuotedSegment();\n value = toQuery(value, second);\n whitespace();\n }\n } else {\n throw new Error(`Expected identifier`);\n }\n\n if (value) {\n next(CLOSE_BRACKET);\n }\n\n return value;\n }\n };\n\n /** Parse a segment and any number of brackets following it */\n const parseSegmentAndBrackets = (): Array<AnyNode> => {\n // try to parse a segment first\n\n const parsed: Array<AnyNode> = [];\n\n const firstSegment = segment();\n\n if (firstSegment) {\n parsed.push(firstSegment);\n\n let bracketSegment = parseBracket();\n\n while (bracketSegment !== undefined) {\n parsed.push(bracketSegment);\n bracketSegment = parseBracket();\n }\n }\n\n return parsed;\n };\n\n /** Parse out a path segment */\n const parsePath = (): PathNode => {\n const parts: AnyNode[] = [];\n\n let nextSegment = parseSegmentAndBrackets();\n\n while (nextSegment !== undefined) {\n parts.push(...nextSegment);\n\n if (!ch || ch === CLOSE_CURL) {\n break;\n }\n\n if (nextSegment.length === 0 && ch) {\n throw new Error(`Unexpected character: ${ch}`);\n }\n\n next(SEGMENT_SEPARATOR);\n nextSegment = parseSegmentAndBrackets();\n }\n\n return toPath(parts);\n };\n\n try {\n const result = parsePath();\n\n return {\n status: true,\n path: result,\n };\n } catch (e: any) {\n return {\n status: false,\n error: e.message,\n };\n }\n};\n","import type { BindingLike, BindingInstance } from \"./binding\";\n\n/** Check if the parameter representing a binding is already of the Binding class */\nexport function isBinding(binding: BindingLike): binding is BindingInstance {\n return !(typeof binding === \"string\" || Array.isArray(binding));\n}\n\n/** Convert the string to an int if you can, otherwise just return the original string */\nexport function maybeConvertToNum(i: string): string | number {\n const asInt = parseInt(i, 10);\n\n if (isNaN(asInt)) {\n return i;\n }\n\n return asInt;\n}\n\n/**\n * utility to convert binding into binding segments.\n */\nexport function getBindingSegments(\n binding: BindingLike,\n): Array<string | number> {\n if (Array.isArray(binding)) {\n return binding;\n }\n\n if (typeof binding === \"string\") {\n return binding.split(\".\");\n }\n\n return binding.asArray();\n}\n\n/** Like _.findIndex, but ignores types */\nexport function findInArray<T extends Record<string | number, object>>(\n array: Array<T>,\n key: string | number,\n value: T,\n): number | undefined {\n return array.findIndex((obj) => {\n if (obj && typeof obj === \"object\") {\n // Intentional double-equals because we want '4' to be coerced to 4\n // eslint-disable-next-line eqeqeq\n return obj[key] == value;\n }\n\n return false;\n });\n}\n","import { getBindingSegments } from \"./utils\";\n\nexport interface BindingParserOptions {\n /** Get the value for a specific binding */\n get: (binding: BindingInstance) => any;\n\n /**\n * Set the values for bindings.\n * This is used when the query syntax needs to modify an object\n */\n set: (transaction: Array<[BindingInstance, any]>) => void;\n\n /**\n * Get the result of evaluating an expression\n */\n evaluate: (exp: string) => any;\n\n /**\n * Without readOnly, if a binding such as this is used: arr[key='does not exist'],\n * then an object with that key will be created.\n * This is done to make assignment such as arr[key='abc'].val = 'foo' work smoothly.\n * Setting readOnly to true will prevent this behavior, avoiding unintended data changes.\n */\n readOnly?: boolean;\n}\n\nexport type Getter = (path: BindingInstance) => any;\n\nexport type RawBindingSegment = number | string;\nexport type RawBinding = string | RawBindingSegment[];\nexport type BindingLike = RawBinding | BindingInstance;\nexport type BindingFactory = (\n raw: RawBinding,\n options?: Partial<BindingParserOptions>,\n) => BindingInstance;\n\n/**\n * A path in the data model\n */\nexport class BindingInstance {\n private split: RawBindingSegment[];\n private joined: string;\n private factory: BindingFactory;\n\n constructor(\n raw: RawBinding,\n factory = (rawBinding: RawBinding) => new BindingInstance(rawBinding),\n ) {\n const split = Array.isArray(raw) ? raw : raw.split(\".\");\n this.split = split.map((segment) => {\n if (typeof segment === \"number\") {\n return segment;\n }\n\n const tryNum = Number(segment);\n return isNaN(tryNum) ? segment : tryNum;\n });\n Object.freeze(this.split);\n this.joined = this.split.join(\".\");\n this.factory = factory;\n }\n\n asArray(): RawBindingSegment[] {\n return this.split;\n }\n\n asString(): string {\n return this.joined;\n }\n\n /**\n * Check to see if the given binding is a sub-path of the current one\n */\n contains(binding: BindingInstance): boolean {\n // need to account for partial key matches\n // [foo, bar] !== [foo, ba]\n const bindingAsArray = binding.asArray();\n\n if (bindingAsArray.length < this.split.length) {\n return false;\n }\n\n // Check every overlapping index to make sure they're the same\n // Intentionally use a for loop for speeeed\n for (let i = 0; i < this.split.length; i++) {\n if (this.split[i] !== bindingAsArray[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n relative(binding: BindingInstance): RawBindingSegment[] {\n return this.asArray().slice(binding.asArray().length);\n }\n\n parent(): BindingInstance {\n return this.factory(this.split.slice(0, -1));\n }\n\n key(): RawBindingSegment {\n return this.split[this.split.length - 1];\n }\n\n /**\n * This is a utility method to get a binding that is a descendent of this binding\n *\n * @param relative - The relative path to descend to\n */\n descendent(relative: BindingLike): BindingInstance {\n const descendentSegments = getBindingSegments(relative);\n\n return this.factory(this.split.concat(descendentSegments));\n }\n}\n","import type { BindingInstance } from \"../binding\";\nimport type {\n BatchSetTransaction,\n DataModelImpl,\n DataModelMiddleware,\n DataModelOptions,\n Updates,\n} from \"./model\";\n\nexport type DependencySets = \"core\" | \"children\";\n\n/** A class to track usage of read/writes to/from a data model */\nexport class DependencyTracker {\n protected readDeps: Set<BindingInstance>;\n protected writeDeps: Set<BindingInstance>;\n protected namedSet: DependencySets;\n\n private namedDependencySets: Partial<\n Record<\n DependencySets,\n {\n /** readDeps */\n readDeps: Set<BindingInstance>;\n /** writeDeps */\n writeDeps: Set<BindingInstance>;\n }\n >\n >;\n\n constructor() {\n this.readDeps = new Set();\n this.writeDeps = new Set();\n this.namedDependencySets = {};\n this.namedSet = \"core\";\n\n this.createSubset(\"core\");\n this.createSubset(\"children\");\n }\n\n protected createSubset(name: DependencySets, force = false): void {\n if (force || !this.namedDependencySets[name]) {\n this.namedDependencySets[name] = {\n readDeps: new Set(),\n writeDeps: new Set(),\n };\n }\n }\n\n /** Grab all of the bindings that this depended on */\n public getDependencies(name?: DependencySets): Set<BindingInstance> {\n if (name !== undefined) {\n return this.namedDependencySets?.[name]?.readDeps ?? new Set();\n }\n\n return this.readDeps;\n }\n\n public trackSubset(name: DependencySets) {\n this.createSubset(name);\n this.namedSet = name;\n }\n\n public trackDefault() {\n this.namedSet = \"core\";\n }\n\n /** Grab all of the bindings this wrote to */\n public getModified(name?: DependencySets): Set<BindingInstance> {\n if (name !== undefined) {\n return this.namedDependencySets?.[name]?.writeDeps ?? new Set();\n }\n\n return this.writeDeps;\n }\n\n /**\n * Check to see if the dataModel has read the value at the given binding\n *\n * @param binding - The binding you want to check for\n */\n public readsBinding(binding: BindingInstance): boolean {\n return this.readDeps.has(binding);\n }\n\n /**\n * Check to see if the dataModel has written to the binding\n */\n public writesBinding(binding: BindingInstance): boolean {\n return this.writeDeps.has(binding);\n }\n\n /** Reset all tracking of dependencies */\n public reset() {\n this.readDeps = new Set();\n this.writeDeps = new Set();\n this.namedDependencySets = {};\n this.namedSet = \"core\";\n\n this.createSubset(\"core\", true);\n this.createSubset(\"children\", true);\n }\n\n protected addReadDep(\n binding: BindingInstance,\n namedSet = this.namedSet,\n ): void {\n if (namedSet) {\n this.namedDependencySets?.[namedSet]?.readDeps.add(binding);\n }\n\n this.readDeps.add(binding);\n }\n\n protected addWriteDep(\n binding: BindingInstance,\n namedSet = this.namedSet,\n ): void {\n if (namedSet) {\n this.namedDependencySets?.[namedSet]?.writeDeps.add(binding);\n }\n\n this.writeDeps.add(binding);\n }\n\n public addChildReadDep(binding: BindingInstance): void {\n this.addReadDep(binding, \"children\");\n }\n}\n\n/** Middleware that tracks dependencies of read/written data */\nexport class DependencyMiddleware\n extends DependencyTracker\n implements DataModelMiddleware\n{\n constructor() {\n super();\n this.get = this.get.bind(this);\n this.set = this.set.bind(this);\n }\n\n public set(\n transaction: BatchSetTransaction,\n options?: DataModelOptions,\n next?: DataModelImpl | undefined,\n ): Updates {\n transaction.forEach(([binding]) => this.addWriteDep(binding));\n\n return next?.set(transaction, options) ?? [];\n }\n\n public get(\n binding: BindingInstance,\n options?: DataModelOptions,\n next?: DataModelImpl | undefined,\n ) {\n this.addReadDep(binding);\n\n return next?.get(binding, options);\n }\n\n public delete(\n binding: BindingInstance,\n options?: DataModelOptions,\n next?: DataModelImpl | undefined,\n ) {\n this.addWriteDep(binding);\n return next?.delete(binding, options);\n }\n}\n\n/** A data-model that tracks dependencies of read/written data */\nexport class DependencyModel<Options = DataModelOptions>\n extends DependencyTracker\n implements DataModelImpl<Options>\n{\n private readonly rootModel: DataModelImpl<Options>;\n\n constructor(rootModel: DataModelImpl<Options>) {\n super();\n this.rootModel = rootModel;\n this.set = this.set.bind(this);\n this.get = this.get.bind(this);\n }\n\n public set(transaction: BatchSetTransaction, options?: Options): Updates {\n transaction.forEach(([binding]) => this.addWriteDep(binding));\n\n return this.rootModel.set(transaction, options);\n }\n\n public get(binding: BindingInstance, options?: Options) {\n this.addReadDep(binding);\n\n return this.rootModel.get(binding, options);\n }\n\n public delete(binding: BindingInstance, options?: Options) {\n this.addWriteDep(binding);\n return this.rootModel.delete(binding, options);\n }\n}\n","import type { DataModelImpl } from \"./model\";\n\n/**\n * A model that does nothing\n * Helpful for testing and other default DataModel applications\n */\nexport class NOOPDataModel implements DataModelImpl {\n get() {\n return undefined;\n }\n\n set() {\n return [];\n }\n\n delete() {}\n}\n\n/** You only really need 1 instance of the NOOP model */\nexport const NOOP_MODEL = new NOOPDataModel();\n","import { SyncHook } from \"tapable-ts\";\nimport type { BindingLike, BindingFactory } from \"../binding\";\nimport { BindingInstance, isBinding } from \"../binding\";\nimport { NOOP_MODEL } from \"./noop-model\";\n\nexport const ROOT_BINDING = new BindingInstance([]);\nexport type BatchSetTransaction = [BindingInstance, any][];\n\nexport type Updates = Array<{\n /** The updated binding */\n binding: BindingInstance;\n\n /** The old value */\n oldValue: any;\n\n /** The new value */\n newValue: any;\n\n /** Force the Update to be included even if no data changed */\n force?: boolean;\n}>;\n\n/** Options to use when getting or setting data */\nexport interface DataModelOptions {\n /**\n * The data (either to set or get) should represent a formatted value\n * For setting data, the data will be de-formatted before continuing in the pipeline\n * For getting data, the data will be formatted before returning\n */\n formatted?: boolean;\n\n /**\n * By default, fetching data will ignore any invalid data.\n * You can choose to grab the queued invalid data if you'd like\n * This is usually the case for user-inputs\n */\n includeInvalid?: boolean;\n\n /**\n * A flag to set to ignore any default value in the schema, and just use the raw value\n */\n ignoreDefaultValue?: boolean;\n\n /**\n * A flag to indicate that this update should happen silently\n */\n silent?: boolean;\n\n /** Other context associated with this request */\n context?: {\n /** The data model to use when getting other data from the context of this request */\n model: DataModelWithParser;\n };\n}\n\nexport interface DataModelWithParser<Options = DataModelOptions> {\n get(binding: BindingLike, options?: Options): any;\n set(transaction: [BindingLike, any][], options?: Options): Updates;\n delete(binding: BindingLike, options?: Options): void;\n}\n\nexport interface DataModelImpl<Options = DataModelOptions> {\n get(binding: BindingInstance, options?: Options): any;\n set(transaction: BatchSetTransaction, options?: Options): Updates;\n delete(binding: BindingInstance, options?: Options): void;\n}\n\nexport interface DataModelMiddleware {\n /** The name of the middleware */\n name?: string;\n\n set(\n transaction: BatchSetTransaction,\n options?: DataModelOptions,\n next?: DataModelImpl,\n ): Updates;\n\n get(\n binding: BindingInstance,\n options?: DataModelOptions,\n next?: DataModelImpl,\n ): any;\n\n delete?(\n binding: BindingInstance,\n options?: DataModelOptions,\n next?: DataModelImpl,\n ): void;\n\n reset?(): void;\n}\n\n/** Wrap the inputs of the DataModel with calls to parse raw binding inputs */\nexport function withParser<Options = unknown>(\n model: DataModelImpl<Options>,\n parseBinding: BindingFactory,\n): DataModelWithParser<Options> {\n /** Parse something into a binding if it requires it */\n function maybeParse(\n binding: BindingLike,\n readOnly: boolean,\n ): BindingInstance {\n const parsed = isBinding(binding)\n ? binding\n : parseBinding(binding, {\n get: model.get,\n set: model.set,\n readOnly,\n });\n\n if (!parsed) {\n throw new Error(\"Unable to parse binding\");\n }\n\n return parsed;\n }\n\n return {\n get(binding, options?: Options) {\n return model.get(maybeParse(binding, true), options);\n },\n set(transaction, options?: Options) {\n return model.set(\n transaction.map(([key, val]) => [maybeParse(key, false), val]),\n options,\n );\n },\n delete(binding, options?: Options) {\n return model.delete(maybeParse(binding, false), options);\n },\n };\n}\n\n/** Wrap a middleware instance in a DataModel compliant API */\nexport function toModel(\n middleware: DataModelMiddleware,\n defaultOptions?: DataModelOptions,\n next?: DataModelImpl,\n): DataModelImpl {\n if (!next) {\n return middleware as DataModelImpl;\n }\n\n return {\n get: (binding: BindingInstance, options?: DataModelOptions) => {\n const resolvedOptions = options ?? defaultOptions;\n\n if (middleware.get) {\n return middleware.get(binding, resolvedOptions, next);\n }\n\n return next?.get(binding, resolvedOptions);\n },\n set: (transaction: BatchSetTransaction, options?: DataModelOptions) => {\n const resolvedOptions = options ?? defaultOptions;\n\n if (middleware.set) {\n return middleware.set(transaction, resolvedOptions, next);\n }\n\n return next?.set(transaction, resolvedOptions);\n },\n delete: (binding: BindingInstance, options?: DataModelOptions) => {\n const resolvedOptions = options ?? defaultOptions;\n\n if (middleware.delete) {\n return middleware.delete(binding, resolvedOptions, next);\n }\n\n return next?.delete(binding, resolvedOptions);\n },\n };\n}\n\nexport type DataPipeline = Array<DataModelMiddleware | DataModelImpl>;\n\n/**\n * Given a set of steps in a pipeline, create the effective data-model\n */\nexport function constructModelForPipeline(\n pipeline: DataPipeline,\n): DataModelImpl {\n if (pipeline.length === 0) {\n return NOOP_MODEL;\n }\n\n if (pipeline.length === 1) {\n return toModel(pipeline[0]);\n }\n\n /** Default and propagate the options into the nested calls */\n function createModelWithOptions(options?: DataModelOptions) {\n const model: DataModelImpl =\n pipeline.reduce<DataModelImpl | undefined>(\n (nextModel, middleware) => toModel(middleware, options, nextModel),\n undefined,\n ) ?? NOOP_MODEL;\n\n return model;\n }\n\n return {\n get: (binding: BindingInstance, options?: DataModelOptions) => {\n return createModelWithOptions(options)?.get(binding, options);\n },\n set: (transaction, options) => {\n return createModelWithOptions(options)?.set(transaction, options);\n },\n delete: (binding, options) => {\n return createModelWithOptions(options)?.delete(binding, options);\n },\n };\n}\n\n/** A DataModel that manages middleware data handlers */\nexport class PipelinedDataModel implements DataModelImpl {\n private pipeline: DataPipeline;\n private effectiveDataModel: DataModelImpl;\n\n public readonly hooks = {\n onSet: new SyncHook<[BatchSetTransaction]>(),\n };\n\n constructor(pipeline: DataPipeline = []) {\n this.pipeline = pipeline;\n this.effectiveDataModel = constructModelForPipeline(this.pipeline);\n }\n\n public setMiddleware(handlers: DataPipeline) {\n this.pipeline = handlers;\n this.effectiveDataModel = constructModelForPipeline(handlers);\n }\n\n public addMiddleware(handler: DataModelMiddleware) {\n this.pipeline = [...this.pipeline, handler];\n this.effectiveDataModel = constructModelForPipeline(this.pipeline);\n }\n\n public reset(model = {}) {\n this.pipeline.forEach((middleware) => {\n if (\"reset\" in middleware) {\n middleware.reset?.();\n }\n });\n\n this.set([[ROOT_BINDING, model]]);\n }\n\n public set(\n transaction: BatchSetTransaction,\n options?: DataModelOptions,\n ): Updates {\n const appliedTransaction = this.effectiveDataModel.set(\n transaction,\n options,\n );\n this.hooks.onSet.call(transaction);\n return appliedTransaction;\n }\n\n public get(binding: BindingInstance, options?: DataModelOptions): any {\n return this.effectiveDataModel.get(binding, options);\n }\n\n public delete(binding: BindingInstance, options?: DataModelOptions): void {\n return this.effectiveDataModel.delete(binding, options);\n }\n}\n","import type { DataModelWithParser } from \"../data\";\nimport type { Logger } from \"../logger\";\n\nexport type ExpressionObjectType = {\n /** The expression to eval */\n value: BasicExpressionTypes;\n};\n\nexport type ExpressionLiteralType =\n | string\n | number\n | boolean\n | undefined\n | null;\n\nexport type BasicExpressionTypes =\n | ExpressionLiteralType\n | ExpressionObjectType\n | Array<ExpressionLiteralType | ExpressionObjectType>;\n\nexport type ExpressionType = BasicExpressionTypes | ExpressionNode;\n\nexport interface OperatorProcessingOptions {\n /**\n * When set to a falsy value, the arguments passed to the handler will be raw AST Nodes\n * This enables lazy evaluation of arguments\n */\n resolveParams: boolean;\n}\n\nexport type BinaryOperatorBasic = (left: any, right: any) => unknown;\nexport type BinaryOperatorAdvanced = OperatorProcessingOptions &\n ((ctx: ExpressionContext, left: any, right: any) => unknown);\n\nexport type BinaryOperator = BinaryOperatorAdvanced | BinaryOperatorBasic;\n\nexport type UnaryOperator =\n | ((arg: any) => unknown)\n | (((ctx: ExpressionContext, arg: any) => unknown) &\n OperatorProcessingOptions);\n\nexport interface ExpressionContext {\n /** A means of executing an expression */\n evaluate: (expr: ExpressionType) => unknown;\n\n /** The data model that expression handlers can use when fetching data */\n model: DataModelWithParser;\n\n /** A logger to use */\n logger?: Logger;\n}\n\nexport type ExpressionHandler<\n T extends readonly unknown[] = unknown[],\n R = void,\n> = ((context: ExpressionContext, ...args: T) => R) &\n Partial<OperatorProcessingOptions>;\n\nexport const ExpNodeOpaqueIdentifier = Symbol(\"Expression Node ID\");\n\n/** Checks if the input is an already processed Expression node */\nexport function isExpressionNode(x: any): x is ExpressionNode {\n return (\n typeof x === \"object\" &&\n x !== null &&\n !Array.isArray(x) &&\n x.__id === ExpNodeOpaqueIdentifier\n );\n}\n\nexport interface NodePosition {\n /** The character location */\n character: number;\n}\n\nexport interface NodeLocation {\n // We only care about the character offset, not the line/column for now\n // But making these objects allows us to add more (like line number) later\n\n /** The start of the node */\n start: NodePosition;\n\n /** The end of the node */\n end: NodePosition;\n}\n\nexport interface BaseNode<T> {\n /** The thing to discriminate the AST type on */\n type: T;\n\n /** How to tell this apart from other objects */\n __id: typeof ExpNodeOpaqueIdentifier;\n\n /** The location of the node in the source expression string */\n location?: NodeLocation;\n\n /**\n * The error that occurred while parsing this node\n * This is only set if the parsing mode is set to non-strict\n */\n error?: Error;\n}\n\n/** A helper interface for nodes that container left and right children */\nexport interface DirectionalNode {\n /** The left node. Often for the left hand side of an expression */\n left: ExpressionNode;\n\n /** The right child. Often for the right hand side of an expression */\n right: ExpressionNode;\n}\n\nexport interface LiteralNode extends BaseNode<\"Literal\"> {\n /** A node that holds a literal value */\n value: string | number;\n\n /** The unprocessed value */\n raw?: any;\n}\n\nexport interface BinaryNode\n extends BaseNode<\"BinaryExpression\">,\n DirectionalNode {\n /** The operation to perform on the nodes */\n operator: string;\n}\n\nexport interface LogicalNode\n extends BaseNode<\"LogicalExpression\">,\n DirectionalNode {\n /** The logical operation to perform on the nodes */\n operator: string;\n}\n\nexport interface UnaryNode extends BaseNode<\"UnaryExpression\"> {\n /** The operation to perform on the node */\n operator: string;\n\n /** The single argument that the operation should be performed on */\n argument: ExpressionNode;\n}\n\nexport type ThisNode = BaseNode<\"ThisExpression\">;\n\nexport interface ModelRefNode extends BaseNode<\"ModelRef\"> {\n /** The binding that the model reference points to */\n ref: string;\n}\n\nexport interface ObjectNode extends BaseNode<\"Object\"> {\n /** */\n attributes: Array<{\n /** The property name of the object */\n key: ExpressionNode;\n\n /** the associated value */\n value: ExpressionNode;\n }>;\n}\n\nexport interface MemberExpressionNode extends BaseNode<\"MemberExpression\"> {\n /** The object to be introspected */\n object: ExpressionNode;\n\n /** If the property uses . or open-bracket */\n computed: boolean;\n\n /** The property to access on the object */\n property: ExpressionNode;\n}\n\nexport interface ConditionalExpressionNode\n extends BaseNode<\"ConditionalExpression\"> {\n /** The test for the ternary */\n test: ExpressionNode;\n\n /** The truthy case for the ternary */\n consequent: ExpressionNode;\n\n /** The falsy case for the ternary */\n alternate: ExpressionNode;\n}\n\nexport interface CompoundNode extends BaseNode<\"Compound\"> {\n /** The contents of the compound expression */\n body: ExpressionNode[];\n}\n\nexport interface CallExpressionNode extends BaseNode<\"CallExpression\"> {\n /** The arguments to the function */\n args: ExpressionNode[];\n\n /** The function name */\n callTarget: IdentifierNode;\n}\n\nexport interface ArrayExpressionNode extends BaseNode<\"ArrayExpression\"> {\n /** The items in an array */\n elements: ExpressionNode[];\n}\n\nexport interface IdentifierNode extends BaseNode<\"Identifier\"> {\n /** The variable name */\n name: string;\n}\n\nexport type AssignmentNode = BaseNode<\"Assignment\"> & DirectionalNode;\n\nexport interface ModificationNode\n extends BaseNode<\"Modification\">,\n DirectionalNode {\n /** The operator for the modification */\n operator: string;\n}\n\nexport type ExpressionNode =\n | LiteralNode\n | BinaryNode\n | LogicalNode\n | UnaryNode\n | ThisNode\n | ModelRefNode\n | MemberExpressionNode\n | ConditionalExpressionNode\n | CompoundNode\n | CallExpressionNode\n | ArrayExpressionNode\n | IdentifierNode\n | AssignmentNode\n | ModificationNode\n | ObjectNode;\n\nexport type ExpressionNodeType = ExpressionNode[\"type\"];\n\nexport interface ErrorWithLocation extends Error {\n /** The place in the string where the error occurs */\n index: number;\n\n /** a helpful description */\n description: string;\n}\n","/* eslint @typescript-eslint/no-use-before-define: 0 */\n/**\n * An expression to AST parser based on JSEP: http://jsep.from.so/\n */\nimport type {\n ErrorWithLocation,\n ExpressionNode,\n ExpressionNodeType,\n NodeLocation,\n} from \"./types\";\nimport { ExpNodeOpaqueIdentifier } from \"./types\";\n\nconst PERIOD_CODE = 46; // '.'\nconst COMMA_CODE = 44; // ','\nconst SQUOTE_CODE = 39; // Single quote\nconst DQUOTE_CODE = 34; // Double quotes\nconst OPAREN_CODE = 40; // (\nconst CPAREN_CODE = 41; // )\nconst OBRACK_CODE = 91; // [\nconst CBRACK_CODE = 93; // ]\nconst QUMARK_CODE = 63; // ?\nconst SEMCOL_CODE = 59; // ;\nconst COLON_CODE = 58; // :\nconst OCURL_CODE = 123; // {\nconst CCURL_CODE = 125; // }\n\n// Operations\n// ----------\n\n// Set `t` to `true` to save space (when minified, not gzipped)\nconst t = true;\n\n// Use a quickly-accessible map to store all of the unary operators\n// Values are set to `true` (it really doesn't matter)\nconst unaryOps = { \"-\": t, \"!\": t, \"~\": t, \"+\": t };\n\n// Also use a map for the binary operations but set their values to their\n// binary precedence for quick reference:\n// see [Operator precedence](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)\nconst binaryOps: Record<string, number> = {\n \"=\": 3,\n \"+=\": 3,\n \"-=\": 3,\n \"&=\": 3,\n \"|=\": 3,\n // Conditional: 4,\n \"||\": 5,\n \"&&\": 6,\n \"|\": 7,\n \"^\": 8,\n \"&\": 9,\n \"==\": 10,\n \"!=\": 10,\n \"===\": 10,\n \"!==\": 10,\n \"<\": 11,\n \">\": 11,\n \"<=\": 11,\n \">=\": 11,\n \"<<\": 12,\n \">>\": 12,\n \">>>\": 12,\n \"+\": 13,\n \"-\": 13,\n \"*\": 14,\n \"/\": 14,\n \"%\": 14,\n};\n\n/** Wrap the message and index in an error and throw it */\nfunction throwError(message: string, index: number): ErrorWithLocation {\n const err = new Error(`${message} at character ${index}`);\n\n (err as ErrorWithLocation).index = index;\n (err as ErrorWithLocation).description = message;\n\n throw err;\n}\n\n/** Create a new location marker that spans both nodes */\nfunction createSpanningLocation(start?: NodeLocation, end?: NodeLocation) {\n if (!start || !end) {\n return;\n }\n\n return {\n start: start.start,\n end: end.end,\n };\n}\n\n/** Get return the longest key length of any object */\nfunction getMaxKeyLen(obj: object): number {\n let maxLen = 0;\n\n Object.keys(obj).forEach((key) => {\n if (key.length > maxLen && Object.prototype.hasOwnProperty.call(obj, key)) {\n maxLen = key.length;\n }\n });\n\n return maxLen;\n}\n\nconst maxUnopLen = getMaxKeyLen(unaryOps);\nconst maxBinopLen = getMaxKeyLen(binaryOps);\n\n// Literals\n// ----------\n// Store the values to return for the various literals we may encounter\nconst literals = {\n true: true,\n false: false,\n null: null,\n undefined,\n} as const;\n\n// Except for `this`, which is special. This could be changed to something like `'self'` as well\nconst thisStr = \"this\";\n\n/** Returns the precedence of a binary operator or `0` if it isn't a binary operator */\nfunction binaryPrecedence(opVal: string): number {\n return binaryOps[opVal] || 0;\n}\n\n/**\n * Utility function (gets called from multiple places)\n * Also note that `a && b` and `a || b` are *logical* expressions, not binary expressions\n */\nfunction createBinaryExpression(\n operator: string | boolean,\n left: string,\n right: string,\n location?: NodeLocation,\n) {\n let type: ExpressionNodeType;\n\n if (operator === \"||\" || operator === \"&&\") {\n type = \"LogicalExpression\";\n } else if (operator === \"=\") {\n type = \"Assignment\";\n } else if (\n operator === \"+=\" ||\n operator === \"-=\" ||\n operator === \"&=\" ||\n operator === \"|=\"\n ) {\n type = \"Modification\";\n } else {\n type = \"BinaryExpression\";\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type,\n operator,\n left,\n right,\n location,\n };\n}\n\n/** `ch` is a character code in the next three functions */\nfunction isDecimalDigit(ch: number) {\n return ch >= 48 && ch <= 57; // 0...9\n}\n\n/** Check if the char is the character code for the start of an identifier */\nfunction isIdentifierStart(ch: number) {\n return (\n ch === 36 ||\n ch === 95 || // `$` and `_`\n (ch >= 65 && ch <= 90) || // A...Z\n (ch >= 97 && ch <= 122)\n ); // A...z\n}\n\n/** Check if the char code is still a valid identifier portion */\nfunction isIdentifierPart(ch: number) {\n return (\n ch === 36 ||\n ch === 95 || // `$` and `_`\n (ch >= 65 && ch <= 90) || // A...Z\n (ch >= 97 && ch <= 122) || // A...z\n (ch >= 48 && ch <= 57)\n ); // 0...9\n}\n\n/** Check if the 2 chars are the start of a model reference */\nfunction isModelRefStart(ch0: number, ch1: number) {\n return ch0 === OCURL_CODE && ch1 === OCURL_CODE; // '{{'\n}\n\n/** Parse out an expression from the string */\nexport function parseExpression(\n expr: string,\n options?: {\n /** If true (the default), will throw on invalid expressions */\n strict?: boolean;\n },\n): ExpressionNode {\n const strictMode = options?.strict ?? true;\n\n // `index` stores the character number we are currently at while `length` is a constant\n // All of the gobbles below will modify `index` as we move along\n const charAtFunc = expr.charAt;\n const charCodeAtFunc = expr.charCodeAt;\n const { length } = expr;\n\n let index = 0;\n\n /** Create a location object */\n const getLocation = (startChar: number) => {\n return {\n start: {\n character: startChar,\n },\n end: {\n character: index,\n },\n };\n };\n\n /** Grab the char at the index from the expression */\n function exprI(i: number) {\n return charAtFunc.call(expr, i);\n }\n\n /** Grab the unicode char at the index in the expression */\n function exprICode(i: number) {\n return charCodeAtFunc.call(expr, i);\n }\n\n /**\n * Gobble an object and store the object in an attributes array\n */\n function gobbleObjects() {\n const attributes: Array<{\n /** The property name of the object */\n key: any;\n\n /** the associated value */\n value: any;\n }> = [];\n let closed = false;\n\n let shouldDefineKey = true;\n let key;\n let value;\n let chCode;\n const startCharIndex = index;\n\n // get rid of OCURL_CODE\n ++index;\n\n while (index < length) {\n gobbleSpaces();\n chCode = exprICode(index);\n // check for end\n if (chCode === CCURL_CODE) {\n // if we are at the end but a key was defined\n if (key) {\n throwError(\"A key was defined but a value was not\", index);\n }\n\n index++;\n closed = true;\n break;\n } else if (shouldDefineKey) {\n // check for key\n if (chCode !== SQUOTE_CODE && chCode !== DQUOTE_CODE) {\n throwError(\"An object must start wtih a key\", index);\n }\n\n // get key\n key = gobbleStringLiteral();\n // remove spaces\n gobbleSpaces();\n // remove colon\n if (exprICode(index) === COLON_CODE) {\n index++;\n shouldDefineKey = false;\n } else {\n throwError(\"A colon must follow an object key\", index);\n }\n } else {\n value = gobbleExpression();\n\n attributes.push({ key, value });\n gobbleSpaces();\n chCode = exprICode(index);\n if (chCode === COMMA_CODE) {\n index++;\n } else if (chCode !== CCURL_CODE) {\n throwError(\"Please add a comma to add another key\", index);\n }\n\n shouldDefineKey = true;\n key = undefined;\n value = undefined;\n }\n\n chCode = exprICode(index);\n }\n\n // throw error if object is not closed\n if (!closed) {\n throwError(`Unclosed brace in object`, index);\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Object\",\n attributes,\n location: getLocation(startCharIndex),\n };\n }\n\n /**\n * Push `index` up to the next non-space character\n */\n function gobbleSpaces() {\n let ch = exprICode(index);\n // Space or tab\n while (ch === 32 || ch === 9) {\n ch = exprICode(++index);\n }\n }\n\n /**\n * The main parsing function. Much of this code is dedicated to ternary expressions\n */\n function gobbleExpression(): ExpressionNode {\n const test = gobbleBinaryExpression();\n gobbleSpaces();\n const startCharIndex = index;\n\n if (index < length && exprICode(index) === QUMARK_CODE) {\n // Ternary expression: test ? consequent : alternate\n index++;\n const consequent = gobbleExpression();\n\n if (!consequent) {\n throwError(\"Expected expression\", index);\n }\n\n gobbleSpaces();\n\n if (exprICode(index) === COLON_CODE) {\n index++;\n const alternate = gobbleExpression();\n\n if (!alternate) {\n throwError(\"Expected expression\", index);\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"ConditionalExpression\",\n test,\n consequent,\n alternate,\n location: getLocation(startCharIndex),\n };\n }\n\n throwError(\"Expected :\", index);\n }\n\n return test;\n }\n\n /**\n * Search for the operation portion of the string (e.g. `+`, `===`)\n * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)\n * and move down from 3 to 2 to 1 character until a matching binary operation is found\n * then, return that binary operation\n */\n function gobbleBinaryOp() {\n gobbleSpaces();\n\n let toCheck = expr.substr(index, maxBinopLen);\n let tcLen = toCheck.length;\n\n while (tcLen > 0) {\n if (Object.prototype.hasOwnProperty.call(binaryOps, toCheck)) {\n index += tcLen;\n return toCheck;\n }\n\n toCheck = toCheck.substr(0, --tcLen);\n }\n\n return false;\n }\n\n /**\n * This function is responsible for gobbling an individual expression,\n * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`\n */\n function gobbleBinaryExpression() {\n let node;\n let prec;\n let i;\n\n // First, try to get the leftmost thing\n // Then, check to see if there's a binary operator operating on that leftmost thing\n let left = gobbleToken();\n let biop = gobbleBinaryOp();\n\n // If there wasn't a binary operator, just return the leftmost node\n if (!biop) {\n return left;\n }\n\n // Otherwise, we need to start a stack to properly place the binary operations in their\n // precedence structure\n let biopInfo = { value: biop, prec: binaryPrecedence(biop) };\n let right = gobbleToken();\n\n if (!right) {\n throwError(`Expected expression after ${biop}`, index);\n }\n\n const stack = [left, biopInfo, right];\n\n // Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)\n biop = gobbleBinaryOp();\n while (biop) {\n prec = binaryPrecedence(biop);\n\n if (prec === 0) {\n break;\n }\n\n biopInfo = { value: biop, prec };\n\n // Reduce: make a binary expression from the three topmost entries.\n while (stack.length > 2 && prec <= stack[stack.length - 2].prec) {\n right = stack.pop();\n biop = stack.pop().value;\n left = stack.pop();\n node = createBinaryExpression(\n biop,\n left,\n right,\n createSpanningLocation(left.location, right.location),\n );\n stack.push(node);\n }\n\n node = gobbleToken();\n\n if (!node) {\n throwError(`Expected expression after ${biop}`, index);\n }\n\n stack.push(biopInfo, node);\n biop = gobbleBinaryOp();\n }\n\n i = stack.length - 1;\n node = stack[i];\n\n while (i > 1) {\n node = createBinaryExpression(\n stack[i - 1].value,\n stack[i - 2],\n node,\n createSpanningLocation(stack[i - 2].location, node.location),\n );\n i -= 2;\n }\n\n return node;\n }\n\n /**\n * An individual part of a binary expression:\n * e.g. `foo.bar(baz)`, `1`, `\"abc\"`, `(a % 2)` (because it's in parenthesis)\n */\n function gobbleToken(): any {\n gobbleSpaces();\n const ch = exprICode(index);\n const startCharIndex = index;\n\n if (isDecimalDigit(ch) || ch === PERIOD_CODE) {\n // Char code 46 is a dot `.` which can start off a numeric literal\n return gobbleNumericLiteral();\n }\n\n if (ch === SQUOTE_CODE || ch === DQUOTE_CODE) {\n // Single or double quotes\n return gobbleStringLiteral();\n }\n\n if (isIdentifierStart(ch) || ch === OPAREN_CODE) {\n // Open parenthesis\n // `foo`, `bar.baz`\n return gobbleVariable();\n }\n\n if (ch === OBRACK_CODE) {\n return gobbleArray();\n }\n\n if (isModelRefStart(ch, exprICode(index + 1))) {\n return gobbleModelRef();\n }\n\n // not a double bracket: {{}} but if its a single {}\n if (ch === OCURL_CODE) {\n return gobbleObjects();\n }\n\n let toCheck = expr.substr(index, maxUnopLen);\n let tcLen = toCheck.length;\n\n while (tcLen > 0) {\n if (Object.prototype.hasOwnProperty.call(unaryOps, toCheck)) {\n index += tcLen;\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"UnaryExpression\",\n operator: toCheck,\n argument: gobbleToken(),\n prefix: true,\n location: getLocation(startCharIndex),\n };\n }\n\n toCheck = toCheck.substr(0, --tcLen);\n }\n\n return false;\n }\n\n /**\n * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to\n * keep track of everything in the numeric literal and then calling `parseFloat` on that string\n */\n function gobbleNumericLiteral() {\n let num = \"\";\n const startCharIndex = index;\n\n while (isDecimalDigit(exprICode(index))) {\n num += exprI(index++);\n }\n\n if (exprICode(index) === PERIOD_CODE) {\n // Can start with a decimal marker\n num += exprI(index++);\n\n while (isDecimalDigit(exprICode(index))) {\n num += exprI(index++);\n }\n }\n\n let ch = exprI(index);\n if (ch === \"e\" || ch === \"E\") {\n // Exponent marker\n num += exprI(index++);\n ch = exprI(index);\n\n if (ch === \"+\" || ch === \"-\") {\n // Exponent sign\n num += exprI(index++);\n }\n\n while (isDecimalDigit(exprICode(index))) {\n // Exponent itself\n num += exprI(index++);\n }\n\n if (!isDecimalDigit(exprICode(index - 1))) {\n throwError(`Expected exponent (${num}${exprI(index)})`, index);\n }\n }\n\n const chCode = exprICode(index);\n // Check to make sure this isn't a variable name that start with a number (123abc)\n if (isIdentifierStart(chCode)) {\n throwError(\n `Variable names cannot start with a number (${num}${exprI(index)})`,\n index,\n );\n } else if (chCode === PERIOD_CODE) {\n throwError(\"Unexpected period\", index);\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Literal\",\n value: parseFloat(num),\n raw: num,\n location: getLocation(startCharIndex),\n };\n }\n\n /**\n * Parses a string literal, staring with single or double quotes with basic support for escape codes\n * e.g. `\"hello world\"`, `'this is\\nJSEP'`\n */\n function gobbleStringLiteral() {\n const quote = exprI(index++);\n let str = \"\";\n let closed = false;\n const startCharIndex = index;\n\n while (index < length) {\n let ch = exprI(index++);\n\n if (ch === quote) {\n closed = true;\n break;\n }\n\n if (ch !== \"\\\\\") {\n str += ch;\n continue;\n }\n\n // Check for all of the common escape codes\n ch = exprI(index++);\n\n switch (ch) {\n case \"n\":\n str += \"\\n\";\n break;\n case \"r\":\n str += \"\\r\";\n break;\n case \"t\":\n str += \"\\t\";\n break;\n case \"b\":\n str += \"\\b\";\n break;\n case \"f\":\n str += \"\\f\";\n break;\n case \"v\":\n str += \"\\u000B\";\n break;\n default:\n }\n }\n\n if (!closed) {\n throwError(`Unclosed quote after \"${str}\"`, index);\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Literal\",\n value: str,\n raw: `${quote}${str}${quote}`,\n location: getLocation(startCharIndex),\n };\n }\n\n /**\n * Model refs are bindings wrapped in 2 sets of double curlys\n * e.g. {{foo.bar.ref}}\n */\n function gobbleModelRef() {\n let str = \"\";\n let closed = false;\n let openBraceCount = 1;\n const startCharIndex = index;\n\n index += 2; // Skip the {{\n while (index < length) {\n const ch = exprI(index++);\n\n if (ch === \"}\" && exprICode(index) === CCURL_CODE) {\n index++;\n openBraceCount--;\n\n if (openBraceCount === 0) {\n closed = true;\n break;\n }\n\n str += \"}}\";\n } else if (ch === \"{\" && exprICode(index) === OCURL_CODE) {\n openBraceCount++;\n str += \"{{\";\n index++;\n } else {\n str += ch;\n }\n }\n\n if (!closed) {\n throwError(`Unclosed brace after \"${str}\"`, index);\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"ModelRef\",\n ref: str,\n location: getLocation(startCharIndex),\n };\n }\n\n /**\n * Gobbles only identifiers\n * e.g.: `foo`, `_value`, `$x1`\n * Also, this function checks if that identifier is a literal:\n * (e.g. `true`, `false`, `null`) or `this`\n */\n function gobbleIdentifier() {\n const start = index;\n let ch = exprICode(start);\n\n if (isIdentifierStart(ch)) {\n index++;\n } else {\n throwError(`Unexpected ${exprI(index)}`, index);\n }\n\n while (index < length) {\n ch = exprICode(index);\n if (isIdentifierPart(ch)) {\n index++;\n } else {\n break;\n }\n }\n\n const identifier = expr.slice(start, index);\n\n if (Object.prototype.hasOwnProperty.call(literals, identifier)) {\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Literal\",\n value: (literals as any)[identifier],\n raw: identifier,\n location: getLocation(start),\n };\n }\n\n if (identifier === thisStr) {\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"ThisExpression\",\n location: getLocation(start),\n };\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Identifier\",\n name: identifier,\n location: getLocation(start),\n };\n }\n\n /**\n * Gobbles a list of arguments within the context of a function call\n * or array literal. This function also assumes that the opening character\n * `(` or `[` has already been gobbled, and gobbles expressions and commas\n * until the terminator character `)` or `]` is encountered.\n * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`\n */\n function gobbleArguments(termination: number) {\n const args = [];\n let charIndex;\n let node;\n\n while (index < length) {\n gobbleSpaces();\n charIndex = exprICode(index);\n\n if (charIndex === termination) {\n // Done parsing\n index++;\n break;\n }\n\n if (charIndex === COMMA_CODE) {\n // Between expressions\n index++;\n continue;\n }\n\n node = gobbleExpression();\n\n if (!node || node.type === \"Compound\") {\n throwError(\"Expected comma\", index);\n }\n\n args.push(node);\n }\n\n if (strictMode && charIndex !== termination) {\n throwError(`Expected ${String.fromCharCode(termination)}`, index);\n }\n\n return args;\n }\n\n /**\n * Gobble a non-literal variable name. This variable name may include properties\n * e.g. `foo`, `bar.baz`, `foo['bar'].baz`\n * It also gobbles function calls:\n * e.g. `Math.acos(obj.angle)`\n */\n function gobbleVariable(): ExpressionNode {\n let charIndex = exprICode(index);\n let node: any =\n charIndex === OPAREN_CODE ? gobbleGroup() : gobbleIdentifier();\n const startCharIndex = index;\n gobbleSpaces();\n charIndex = exprICode(index);\n\n while (\n charIndex === PERIOD_CODE ||\n charIndex === OBRACK_CODE ||\n charIndex === OPAREN_CODE\n ) {\n index++;\n\n if (charIndex === PERIOD_CODE) {\n gobbleSpaces();\n\n node = {\n __id: ExpNodeOpaqueIdentifier,\n type: \"MemberExpression\",\n computed: false,\n object: node,\n property: gobbleIdentifier(),\n location: getLocation(startCharIndex),\n };\n } else if (charIndex === OBRACK_CODE) {\n node = {\n __id: ExpNodeOpaqueIdentifier,\n type: \"MemberExpression\",\n computed: true,\n object: node,\n property: gobbleExpression(),\n location: getLocation(startCharIndex),\n };\n\n gobbleSpaces();\n charIndex = exprICode(index);\n\n if (charIndex !== CBRACK_CODE) {\n throwError(\"Unclosed [\", index);\n }\n\n index++;\n } else if (charIndex === OPAREN_CODE) {\n // A function call is being made; gobble all the arguments\n node = {\n __id: ExpNodeOpaqueIdentifier,\n type: \"CallExpression\",\n args: gobbleArguments(CPAREN_CODE),\n callTarget: node,\n location: getLocation(startCharIndex),\n };\n }\n\n gobbleSpaces();\n charIndex = exprICode(index);\n }\n\n return node;\n }\n\n /**\n * Responsible for parsing a group of things within parentheses `()`\n * This function assumes that it needs to gobble the opening parenthesis\n * and then tries to gobble everything within that parenthesis, assuming\n * that the next thing it should see is the close parenthesis. If not,\n * then the expression probably doesn't have a `)`\n */\n function gobbleGroup() {\n index++;\n const node = gobbleExpression();\n gobbleSpaces();\n\n if (exprICode(index) === CPAREN_CODE) {\n index++;\n return node;\n }\n\n throwError(\"Unclosed (\", index);\n }\n\n /**\n * Responsible for parsing Array literals `[1, 2, 3]`\n * This function assumes that it needs to gobble the opening bracket\n * and then tries to gobble the expressions as arguments.\n */\n function gobbleArray() {\n const startCharIndex = index;\n index++;\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"ArrayExpression\",\n elements: gobbleArguments(CBRACK_CODE),\n location: getLocation(startCharIndex),\n };\n }\n\n const nodes = [];\n\n try {\n while (index < length) {\n const chIndex = exprICode(index);\n\n // Expressions can be separated by semicolons, commas, or just inferred without any\n // separators\n if (chIndex === SEMCOL_CODE || chIndex === COMMA_CODE) {\n index++; // ignore separators\n continue;\n }\n\n const node = gobbleExpression();\n\n // Try to gobble each expression individually\n if (node) {\n nodes.push(node);\n // If we weren't able to find a binary expression and are out of room, then\n // the expression passed in probably has too much\n } else if (strictMode && index < length) {\n throwError(`Unexpected \"${exprI(index)}\"`, index);\n }\n }\n\n // If there's only one expression just try returning the expression\n if (nodes.length === 1) {\n return nodes[0];\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Compound\",\n body: nodes,\n location: getLocation(0),\n };\n } catch (e) {\n if (strictMode || !(e instanceof Error)) {\n throw e;\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Compound\",\n body: nodes,\n location: getLocation(0),\n error: e,\n };\n }\n}\n","import type { Binding } from \"@player-ui/types\";\n\nimport type { BindingLike } from \"../binding\";\nimport type {\n ExpressionHandler,\n ExpressionContext,\n ExpressionNode,\n} from \"./types\";\n\n/** Sets a value to the data-model */\nexport const setDataVal: ExpressionHandler<[Binding, any], any> = (\n _context: ExpressionContext,\n binding,\n value,\n) => {\n _context.model.set([[binding as BindingLike, value]]);\n};\n\n/** Fetches a valid from the data-model */\nexport const getDataVal: ExpressionHandler<[Binding], unknown> = (\n _context: ExpressionContext,\n binding,\n) => {\n return _context.model.get(binding as BindingLike);\n};\n\n/** Deletes a value from the model */\nexport const deleteDataVal: ExpressionHandler<[Binding], void> = (\n _context: ExpressionContext,\n binding,\n) => {\n return _context.model.delete(binding);\n};\n\n/** Conditional expression handler */\nexport const conditional: ExpressionHandler<\n [ExpressionNode, ExpressionNode, ExpressionNode?]\n> = (ctx, condition, ifTrue, ifFalse) => {\n const resolution = ctx.evaluate(condition);\n if (resolution) {\n return ctx.evaluate(ifTrue);\n }\n\n if (ifFalse) {\n return ctx.evaluate(ifFalse);\n }\n\n return null;\n};\n\nconditional.resolveParams = false;\n","import { isExpressionNode } from \"./types\";\nimport type {\n ErrorWithLocation,\n ExpressionHandler,\n ExpressionNode,\n ExpressionObjectType,\n ExpressionType,\n NodeLocation,\n NodePosition,\n} from \"./types\";\n\n/** Generates a function by removing the first context argument */\nexport function withoutContext<T extends unknown[], Return>(\n fn: (...args: T) => Return,\n): ExpressionHandler<T, Return> {\n return (_context, ...args) => fn(...args);\n}\n\n/** Checks if the location includes the target position */\nfunction isInRange(position: NodePosition, location: NodeLocation) {\n return (\n position.character >= location.start.character &&\n position.character <= location.end.character\n );\n}\n\n/** Get the node in the expression that's closest to the desired position */\nexport function findClosestNodeAtPosition(\n node: ExpressionNode,\n position: NodePosition,\n): ExpressionNode | undefined {\n // This is just mapping recursively over nodes in the tree\n\n // eslint-disable-next-line default-case\n switch (node.type) {\n case \"Modification\":\n case \"Assignment\":\n case \"LogicalExpression\":\n case \"BinaryExpression\": {\n const check =\n findClosestNodeAtPosition(node.left, position) ??\n findClosestNodeAtPosition(node.right, position);\n if (check) {\n return check;\n }\n\n break;\n }\n\n case \"UnaryExpression\": {\n const checkArg = findClosestNodeAtPosition(node.argument, position);\n if (checkArg) {\n return checkArg;\n }\n\n break;\n }\n\n case \"MemberExpression\": {\n const checkObject =\n findClosestNodeAtPosition(node.object, position) ??\n findClosestNodeAtPosition(node.property, position);\n if (checkObject) {\n return checkObject;\n }\n\n break;\n }\n\n case \"ConditionalExpression\": {\n const checkObject =\n findClosestNodeAtPosition(node.test, position) ??\n findClosestNodeAtPosition(node.consequent, position) ??\n findClosestNodeAtPosition(node.alternate, position);\n if (checkObject) {\n return checkObject;\n }\n\n break;\n }\n\n case \"ArrayExpression\":\n case \"Compound\": {\n const elements =\n node.type === \"ArrayExpression\" ? node.elements : node.body;\n\n const anyElements = elements.find((e) =>\n findClosestNodeAtPosition(e, position),\n );\n\n if (anyElements) {\n return anyElements;\n }\n\n break;\n }\n\n case \"Object\": {\n const checkObject = node.attributes.reduce<ExpressionNode | undefined>(\n (found, next) => {\n return (\n found ??\n findClosestNodeAtPosition(next.key, position) ??\n findClosestNodeAtPosition(next.value, position)\n );\n },\n undefined,\n );\n\n if (checkObject) {\n return checkObject;\n }\n\n break;\n }\n\n case \"CallExpression\": {\n const anyArgs =\n node.args.find((arg) => {\n return findClosestNodeAtPosition(arg, position);\n }) ?? findClosestNodeAtPosition(node.callTarget, position);\n\n if (anyArgs) {\n return anyArgs;\n }\n\n break;\n }\n }\n\n // Lastly check for yourself\n if (node.location && isInRange(position, node.location)) {\n return node;\n }\n}\n\n/** Checks if the expression is a simple type */\nexport function isObjectExpression(\n expr: ExpressionType,\n): expr is ExpressionObjectType {\n if (isExpressionNode(expr)) {\n return false;\n }\n\n return (\n typeof expr === \"object\" &&\n expr !== null &&\n !Array.isArray(expr) &&\n \"value\" in expr\n );\n}\n\n/**\n * Type guard for ErrorWithLocation\n */\nexport function isErrorWithLocation(error: Error): error is ErrorWithLocation {\n return (\n (error as ErrorWithLocation).index !== undefined &&\n (error as ErrorWithLocation).description !== undefined\n );\n}\n","import { SyncHook } from \"tapable-ts\";\nimport type { Logger, Severity } from \"./types\";\n\n/** A logger that has a tapable subscriptions to callbacks */\nexport default class TapableLogger implements Logger {\n public readonly hooks = {\n trace: new SyncHook<[Array<any>]>(),\n debug: new SyncHook<[Array<any>]>(),\n info: new SyncHook<[Array<any>]>(),\n warn: new SyncHook<[Array<any>]>(),\n error: new SyncHook<[Array<any>]>(),\n log: new SyncHook<[Severity, Array<any>]>(),\n };\n\n private logHandlers: Set<Logger> = new Set();\n\n private createHandler(severity: Severity): (...args: any[]) => void {\n return (...args: any[]) => {\n this.hooks[severity].call(args);\n this.hooks.log.call(severity, args);\n this.logHandlers.forEach((logger) => logger[severity](...args));\n };\n }\n\n public addHandler(logHandler: Logger) {\n this.logHandlers.add(logHandler);\n }\n\n public removeHandler(logHandler: Logger) {\n this.logHandlers.delete(logHandler);\n }\n\n public readonly trace = this.createHandler(\"trace\");\n public readonly debug = this.createHandler(\"debug\");\n public readonly info = this.createHandler(\"info\");\n public readonly warn = this.createHandler(\"warn\");\n public readonly error = this.createHandler(\"error\");\n}\n","import type { Logger, Severity, LoggerProvider } from \"./types\";\n\n/**\n * The ProxyLogger allows a user to log to another Logger instance that may not exist yet\n */\nexport default class ProxyLogger implements Logger {\n private proxiedLoggerProvider: LoggerProvider;\n\n constructor(loggerProvider: LoggerProvider) {\n this.proxiedLoggerProvider = loggerProvider;\n }\n\n private createHandler(severity: Severity): (...args: any[]) => void {\n return (...args: any[]) => {\n const logger = this.proxiedLoggerProvider();\n logger?.[severity](...args);\n };\n }\n\n public readonly trace = this.createHandler(\"trace\");\n public readonly debug = this.createHandler(\"debug\");\n public readonly info = this.createHandler(\"info\");\n public readonly warn = this.createHandler(\"warn\");\n public readonly error = this.createHandler(\"error\");\n}\n","import { SyncWaterfallHook } from \"tapable-ts\";\nimport type { Schema as SchemaType, Formatting } from \"@player-ui/types\";\n\nimport type { BindingInstance } from \"../binding\";\nimport type { ValidationProvider, ValidationObject } from \"../validator\";\nimport type { FormatDefinition, FormatOptions, FormatType } from \"./types\";\n\n/** A function that returns itself */\nconst identify = (val: any) => val;\n\n/** Expand the authored schema into a set of paths -> DataTypes */\nexport function parse(\n schema: SchemaType.Schema,\n): Map<string, SchemaType.DataTypes> {\n const expandedPaths = new Map<string, SchemaType.DataTypes>();\n\n if (!schema.ROOT) {\n return expandedPaths;\n }\n\n const parseQueue: Array<{\n /** The node to process */\n node: SchemaType.Node;\n\n /** The path in the data-model this node represents */\n path: Array<string>;\n\n /** A set of visited DataTypes to prevent loops */\n visited: Set<string>;\n }> = [{ node: schema.ROOT, path: [], visited: new Set() }];\n\n while (parseQueue.length > 0) {\n const next = parseQueue.shift();\n\n if (!next) {\n break;\n }\n\n const { node, path, visited } = next;\n\n Object.entries(node).forEach(([prop, type]) => {\n const nestedPath = [...path, prop];\n\n const nestedPathStr = nestedPath.join(\".\");\n\n if (expandedPaths.has(nestedPathStr)) {\n // We've gone in a loop. Panic\n throw new Error(\n \"Path has already been processed. There's either a loop somewhere or a bug\",\n );\n }\n\n if (visited.has(type.type)) {\n throw new Error(\n `Path already contained type: ${type.type}. This likely indicates a loop in the schema`,\n );\n }\n\n expandedPaths.set(nestedPathStr, type);\n\n if (type.isArray) {\n nestedPath.push(\"[]\");\n }\n\n if (type.isRecord) {\n nestedPath.push(\"{}\");\n }\n\n if (type.type && schema[type.type]) {\n parseQueue.push({\n path: nestedPath,\n node: schema[type.type],\n visited: new Set([...visited, type.type]),\n });\n }\n });\n }\n\n return expandedPaths;\n}\n\n/**\n * The Schema is the central hub for all data invariants, and metaData associated with the data-model itself\n * Outside of the types defined in the JSON payload, it doesn't manage or keep any state.\n * It simply servers as an orchestrator for other modules to interface w/ the schema.\n */\nexport class SchemaController implements ValidationProvider {\n private formatters: Map<string, FormatType<any, any, FormatOptions>> =\n new Map();\n\n private types: Map<string, SchemaType.DataType<any>> = new Map();\n public readonly schema: Map<string, SchemaType.DataTypes> = new Map();\n\n private bindingSchemaNormalizedCache: Map<BindingInstance, string> =\n new Map();\n\n public readonly hooks = {\n resolveTypeForBinding: new SyncWaterfallHook<\n [SchemaType.DataTypes | undefined, BindingInstance]\n >(),\n };\n\n constructor(schema?: SchemaType.Schema) {\n this.schema = schema ? parse(schema) : new Map();\n }\n\n public addFormatters(fns: Array<FormatType<any, any, FormatOptions>>) {\n fns.forEach((def) => {\n this.formatters.set(def.name, def);\n });\n }\n\n public addDataTypes(types: Array<SchemaType.DataType<any>>) {\n types.forEach((t) => {\n this.types.set(t.type, t);\n });\n }\n\n getValidationsForBinding(\n binding: BindingInstance,\n ): Array<ValidationObject> | undefined {\n const typeDef = this.getApparentType(binding);\n\n if (!typeDef?.validation?.length) {\n return undefined;\n }\n\n // Set the defaults for schema-level validations\n return typeDef.validation.map((vRef) => ({\n severity: \"error\",\n trigger: \"change\",\n ...vRef,\n }));\n }\n\n private normalizeBinding(binding: BindingInstance): string {\n const cached = this.bindingSchemaNormalizedCache.get(binding);\n if (cached) {\n return cached;\n }\n\n let bindingArray = binding.asArray();\n let normalized = bindingArray\n .map((p) => (typeof p === \"number\" ? \"[]\" : p))\n .join(\".\");\n\n if (normalized) {\n this.bindingSchemaNormalizedCache.set(binding, normalized);\n bindingArray = normalized.split(\".\");\n }\n\n bindingArray.forEach((item) => {\n const recordBinding = bindingArray\n .map((p) => (p === item ? \"{}\" : p))\n .join(\".\");\n\n if (this.schema.get(recordBinding)) {\n this.bindingSchemaNormalizedCache.set(binding, recordBinding);\n bindingArray = recordBinding.split(\".\");\n normalized = recordBinding;\n }\n });\n\n return normalized;\n }\n\n public getType(binding: BindingInstance): SchemaType.DataTypes | undefined {\n return this.hooks.resolveTypeForBinding.call(\n this.schema.get(this.normalizeBinding(binding)),\n binding,\n );\n }\n\n public getApparentType(\n binding: BindingInstance,\n ): SchemaType.DataTypes | undefined {\n const schemaType = this.getType(binding);\n\n if (schemaType === undefined) {\n return undefined;\n }\n\n const baseType = this.getTypeDefinition(schemaType?.type);\n\n if (baseType === undefined) {\n return schemaType;\n }\n\n return {\n ...baseType,\n ...schemaType,\n validation: [\n ...(schemaType.validation ?? []),\n ...(baseType.validation ?? []),\n ],\n };\n }\n\n public getTypeDefinition(dataType: string) {\n return this.types.get(dataType);\n }\n\n public getFormatterForType(\n formatReference: Formatting.Reference,\n ): FormatDefinition<unknown, unknown> | undefined {\n const { type: formatType, ...options } = formatReference;\n\n const formatter = this.formatters.get(formatType);\n\n if (!formatter) {\n return;\n }\n\n return {\n format: formatter.format\n ? (val) => formatter.format?.(val, options)\n : identify,\n deformat: formatter.deformat\n ? (val) => formatter.deformat?.(val, options)\n : identify,\n };\n }\n\n /**\n * Given a binding, fetch a function that's responsible for formatting, and/or de-formatting the data\n * If no formatter is registered, it will return undefined\n */\n public getFormatter(\n binding: BindingInstance,\n ): FormatDefinition<unknown, unknown> | undefined {\n const type = this.getApparentType(binding);\n\n if (!type?.format) {\n return undefined;\n }\n\n return this.getFormatterForType(type.format);\n }\n}\n","import type { BindingInstance } from \"../binding\";\n\n/**\n * Remove a binding, and any children from from the map\n * If the binding is an array-item, then it will be spliced from the array and the others will be shifted down\n *\n * @param sourceMap - A map of bindings to values\n * @param binding - The binding to remove from the map\n */\nexport function removeBindingAndChildrenFromMap<T>(\n sourceMap: Map<BindingInstance, T>,\n binding: BindingInstance,\n): Map<BindingInstance, T> {\n const targetMap = new Map(sourceMap);\n\n const parentBinding = binding.parent();\n const property = binding.key();\n\n // Clear out any that are sub-bindings of this binding\n\n targetMap.forEach((_value, trackedBinding) => {\n if (binding === trackedBinding || binding.contains(trackedBinding)) {\n targetMap.delete(trackedBinding);\n }\n });\n\n if (typeof property === \"number\") {\n // Splice out this index from the rest\n\n // Order matters here b/c we are shifting items in the array\n // Start with the smallest index and work our way down\n const bindingsToRewrite = Array.from(sourceMap.keys())\n .filter((b) => {\n if (parentBinding.contains(b)) {\n const [childIndex] = b.relative(parentBinding);\n return typeof childIndex === \"number\" && childIndex > property;\n }\n\n return false;\n })\n .sort();\n\n bindingsToRewrite.forEach((trackedBinding) => {\n // If the tracked binding is a sub-binding of the parent binding, then we need to\n // update the path to reflect the new index\n\n const [childIndex, ...childPath] = trackedBinding.relative(parentBinding);\n\n if (typeof childIndex === \"number\") {\n const newSegments = [childIndex - 1, ...childPath];\n const newChildBinding = parentBinding.descendent(newSegments);\n targetMap.set(newChildBinding, targetMap.get(trackedBinding) as T);\n targetMap.delete(trackedBinding);\n }\n });\n }\n\n return targetMap;\n}\n","import type { ValidatorFunction } from \"./types\";\n\n/** A registry that tracks validators */\nexport class ValidatorRegistry {\n private registry: Map<string, ValidatorFunction<any>>;\n\n constructor() {\n this.registry = new Map();\n }\n\n /** Use the given validator name to fetch the handler */\n public get(name: string): ValidatorFunction | undefined {\n return this.registry.get(name);\n }\n\n /** Register a new validator */\n public register<T>(name: string, handler: ValidatorFunction<T>) {\n this.registry.set(name, handler);\n }\n}\n","import type { Asset as AssetType, Expression, Binding } from \"@player-ui/types\";\n\nexport type AnyAssetType = AssetType<string>;\nexport enum NodeType {\n Asset = \"asset\",\n View = \"view\",\n Applicability = \"applicability\",\n Template = \"template\",\n Value = \"value\",\n MultiNode = \"multi-node\",\n Switch = \"switch\",\n Async = \"async\",\n Unknown = \"unknown\",\n Empty = \"empty\",\n}\nexport declare namespace Node {\n export type ChildrenTypes = NodeType.Asset | NodeType.Value | NodeType.View;\n\n export interface Base<T extends NodeType> {\n /** Every node contains a type to distinguish it from other nodes */\n type: T;\n\n /** Every node (outside of the root) contains a reference to it's parent */\n parent?: Node;\n }\n\n export type PathSegment = string | number;\n\n export interface Child {\n /** The path of the child relative to the parent */\n path: PathSegment[];\n\n /** If true, the path points to an array, and the value will be appended to it result */\n array?: boolean;\n\n /** The child node */\n value: Node;\n }\n\n export interface BaseWithChildren<T extends NodeType> extends Base<T> {\n /** Any node that contains a list of children underneath it */\n children?: Child[];\n }\n\n export interface Asset<T extends AnyAssetType = AnyAssetType>\n extends BaseWithChildren<NodeType.Asset>,\n PluginOptions {\n /** Any asset nested within a view */\n value: T;\n }\n\n export interface View<T extends AnyAssetType = AnyAssetType>\n extends BaseWithChildren<NodeType.View>,\n PluginOptions {\n /** The root of the parsed view */\n value: T;\n }\n\n export interface Applicability extends Base<NodeType.Applicability> {\n /** The expression to execute that determines applicability of the target node */\n expression: Expression;\n\n /** The node to use if the expression is truthy */\n value: Node;\n }\n\n export interface Template extends Base<NodeType.Template> {\n /** The location of an array in the model */\n data: Binding;\n\n /** The template to use when mapping over the data */\n template: unknown;\n\n /** The number of nested templates so far */\n depth: number;\n\n /** should the template recomputed when data changes */\n dynamic?: boolean;\n }\n\n export interface Value\n extends BaseWithChildren<NodeType.Value>,\n PluginOptions {\n /** A simple node representing a value */\n value: any;\n }\n\n export interface MultiNode extends Base<NodeType.MultiNode> {\n /**\n * Should this list override the target node if they overlap?\n * If not amend the existing list\n */\n override?: boolean;\n\n /** A list of values that comprise this node */\n values: Array<Node>;\n }\n\n export interface Switch extends Base<NodeType.Switch> {\n /** Should this list be re-computed when data changes */\n dynamic?: boolean;\n\n /** A list of cases to evaluate in order */\n cases: SwitchCase[];\n }\n\n export interface SwitchCase {\n /** The expression to evaluate for a single case statement */\n case: Expression | true;\n /** The value to use if this case is true */\n value: Value;\n }\n\n export interface Async extends Base<NodeType.Async> {\n /** The unique id of the node */\n id: string;\n /** The value representing the node */\n value: Node;\n }\n\n export interface PluginOptions {\n /** A list of plugins */\n plugins?: {\n /** StringResolverPlugin options */\n stringResolver?: {\n /**\n * An optional array of node properties to skip during string resolution\n * Specified in the AssetTransformPlugin\n */\n propertiesToSkip?: string[];\n };\n };\n }\n\n export type Unknown = Base<NodeType.Unknown>;\n export type Empty = Base<NodeType.Empty>;\n export type ViewOrAsset = View | Asset;\n\n export type Node =\n | Asset\n | Applicability\n | Template\n | Value\n | View\n | MultiNode\n | Switch\n | Async\n | Unknown\n | Empty;\n}\n","import type { Node } from \"./types\";\n\n/**\n * Checks if there are templated values in the object\n *\n * @param obj - The Parsed Object to check to see if we have a template array type for\n * @param localKey - The key being checked\n */\nexport function hasTemplateValues(obj: any, localKey: string) {\n return (\n Object.hasOwnProperty.call(obj, \"template\") &&\n Array.isArray(obj?.template) &&\n obj.template.length &&\n obj.template.find((tmpl: any) => tmpl.output === localKey)\n );\n}\n\n/** Check to see if the string is a valid switch key */\nexport function hasSwitchKey(localKey: string) {\n return localKey === \"staticSwitch\" || localKey === \"dynamicSwitch\";\n}\n\n/** Check to see if the string is a valid template key */\nexport function hasTemplateKey(localKey: string) {\n return localKey === \"template\";\n}\n\n/** Get the ID of the Node if there is one */\nexport function getNodeID(node?: Node.Node | null): string | undefined {\n if (!node) {\n return;\n }\n\n if (\n \"value\" in node &&\n typeof node.value === \"object\" &&\n typeof node.value?.id === \"string\"\n ) {\n return node.value.id;\n }\n}\n","import type { BindingInstance, BindingLike } from \"../../binding\";\nimport { isBinding } from \"../../binding\";\nimport type { ExpressionType } from \"../../expressions\";\nimport type { Resolve } from \"./types\";\n\n/** Check to see if and of the data-changes affect the given dependencies */\nexport function caresAboutDataChanges(\n dataChanges?: Set<BindingInstance>,\n dependencies?: Set<BindingInstance>,\n) {\n if (!dataChanges || !dependencies) {\n return true;\n }\n\n const depArray = Array.from(dependencies.values());\n const dataChangeArray = Array.from(dataChanges.values());\n\n return (\n depArray.find(\n (dep) =>\n !!dataChangeArray.find(\n (change) =>\n change === dep || change.contains(dep) || dep.contains(change),\n ),\n ) !== undefined\n );\n}\n\n/** Convert the options object for a resolver to one for a node */\nexport function toNodeResolveOptions(\n resolverOptions: Resolve.ResolverOptions,\n): Resolve.NodeResolveOptions {\n return {\n ...resolverOptions,\n data: {\n model: resolverOptions.model,\n formatValue: (ref, value) => {\n if (resolverOptions.formatValue) {\n return resolverOptions.formatValue(ref, value);\n }\n\n return value;\n },\n format: (bindingLike: BindingLike, value: any) =>\n resolverOptions.format\n ? resolverOptions.format(\n isBinding(bindingLike)\n ? bindingLike\n : resolverOptions.parseBinding(bindingLike),\n value,\n )\n : value,\n },\n evaluate: (exp: ExpressionType) =>\n resolverOptions.evaluator.evaluate(exp, resolverOptions),\n };\n}\n\n/**\n * helper function to flatten a potential nested array and combine with initial array\n */\nexport function unpackAndPush(item: any | any[], initial: any[]) {\n if (Array.isArray(item)) {\n item.forEach((i) => {\n unpackAndPush(i, initial);\n });\n } else {\n initial.push(item);\n }\n}\n","import { SyncHook } from \"tapable-ts\";\nimport type { View as ViewType } from \"@player-ui/types\";\nimport type { BindingInstance, BindingFactory } from \"../binding\";\nimport type { ValidationProvider, ValidationObject } from \"../validator\";\nimport type { Logger } from \"../logger\";\nimport type { Resolve } from \"./resolver\";\nimport { Resolver } from \"./resolver\";\nimport type { Node } from \"./parser\";\nimport { Parser } from \"./parser\";\nimport { TemplatePlugin } from \"./plugins\";\n\n/**\n * Manages the view level validations\n */\nclass CrossfieldProvider implements ValidationProvider {\n private allValidations = new Set<ValidationObject>();\n private byBinding = new Map<BindingInstance, Array<ValidationObject>>();\n private logger?: Logger;\n\n constructor(initialView: ViewType, parser: BindingFactory, logger?: Logger) {\n this.logger = logger;\n this.parse(initialView, parser);\n }\n\n private parse(contentView: ViewType, parser: BindingFactory) {\n const xfieldRefs = contentView.validation;\n\n if (xfieldRefs === undefined) {\n return;\n }\n\n if (!Array.isArray(xfieldRefs)) {\n this.logger?.warn(\n `Unable to register view validations for id: ${contentView.id}. 'validation' property must be an Array.`,\n );\n\n return;\n }\n\n // Grab the validations from the view (as authored) and parse out the ones that have a _ref_ (to a binding)\n // Group them all by binding to make it easier to return than later\n\n xfieldRefs.forEach((vRef) => {\n // x-field validations by default are triggered by navigating away from the page\n // the reference can also override that _or_ the severity\n const withDefaults: ValidationObject = {\n trigger: \"navigation\",\n severity: \"error\",\n ...vRef,\n };\n\n this.allValidations.add(withDefaults);\n\n // The validation reference contains a _ref_ (a binding)\n const { ref } = vRef;\n\n if (ref) {\n /** Group together validations by binding */\n const parsed = parser(ref);\n\n if (this.byBinding.has(parsed)) {\n this.byBinding.get(parsed)?.push(withDefaults);\n } else {\n this.byBinding.set(parsed, [withDefaults]);\n }\n }\n });\n }\n\n getValidationsForBinding(binding: BindingInstance) {\n return this.byBinding.get(binding);\n }\n}\n\n/** A stateful view instance from an content */\nexport class ViewInstance implements ValidationProvider {\n public hooks = {\n onUpdate: new SyncHook<[ViewType]>(),\n parser: new SyncHook<[Parser]>(),\n resolver: new SyncHook<[Resolver]>(),\n onTemplatePluginCreated: new SyncHook<[TemplatePlugin]>(),\n templatePlugin: new SyncHook<[TemplatePlugin]>(),\n };\n\n private resolver?: Resolver;\n public readonly initialView: ViewType;\n public readonly resolverOptions: Resolve.ResolverOptions;\n private rootNode?: Node.Node;\n\n private validationProvider?: CrossfieldProvider;\n\n private templatePlugin: TemplatePlugin | undefined;\n\n // TODO might want to add a version/timestamp to this to compare updates\n public lastUpdate: Record<string, any> | undefined;\n\n constructor(initialView: ViewType, resolverOptions: Resolve.ResolverOptions) {\n this.initialView = initialView;\n this.resolverOptions = resolverOptions;\n this.hooks.onTemplatePluginCreated.tap(\"view\", (templatePlugin) => {\n this.templatePlugin = templatePlugin;\n });\n }\n\n public updateAsync() {\n const update = this.resolver?.update();\n this.lastUpdate = update;\n this.hooks.onUpdate.call(update);\n }\n\n public update(changes?: Set<BindingInstance>) {\n if (this.rootNode === undefined) {\n /** On initialization of the view, also create a validation parser */\n this.validationProvider = new CrossfieldProvider(\n this.initialView,\n this.resolverOptions.parseBinding,\n this.resolverOptions.logger,\n );\n\n if (this.templatePlugin) {\n this.hooks.templatePlugin.call(this.templatePlugin);\n } else {\n this.resolverOptions.logger?.warn(\n \"templatePlugin not set for View, legacy templates may not work\",\n );\n }\n\n const parser = new Parser();\n this.hooks.parser.call(parser);\n this.rootNode = parser.parseView(this.initialView);\n\n this.resolver = new Resolver(this.rootNode, {\n ...this.resolverOptions,\n parseNode: parser.parseObject.bind(parser),\n });\n this.hooks.resolver.call(this.resolver);\n }\n\n const update = this.resolver?.update(changes);\n\n if (this.lastUpdate === update) {\n return this.lastUpdate;\n }\n\n this.lastUpdate = update;\n this.hooks.onUpdate.call(update);\n\n return update;\n }\n\n getValidationsForBinding(binding: BindingInstance) {\n return this.validationProvider?.getValidationsForBinding(binding);\n }\n}\n\n/** A plugin for a view */\nexport interface ViewPlugin {\n /** Called with a view instance */\n apply(view: ViewInstance): void;\n}\n","import { SyncWaterfallHook } from \"tapable-ts\";\nimport type { Template } from \"@player-ui/types\";\nimport type {\n Node,\n ParseObjectOptions,\n ParseObjectChildOptions,\n Parser,\n} from \"../parser\";\nimport { NodeType } from \"../parser\";\nimport { ViewInstance, ViewPlugin } from \"../view\";\nimport type { Options } from \"./options\";\nimport type { Resolver } from \"../resolver\";\nimport { hasTemplateKey } from \"../parser/utils\";\n\nexport interface TemplateItemInfo {\n /** The index of the data for the current iteration of the template */\n index: number;\n /** The data for the current iteration of the template */\n data: any;\n /** The depth of the template node */\n depth: number;\n}\n\nexport interface TemplateSubstitution {\n /** Regular expression to find and replace. The global flag will be always be added to this expression. */\n expression: string | RegExp;\n /** The value to replace matches with. */\n value: string;\n}\n\nexport type TemplateSubstitutionsFunc = (\n baseSubstitutions: TemplateSubstitution[],\n templateItemInfo: TemplateItemInfo,\n) => TemplateSubstitution[];\n\n/** A view plugin to resolve/manage templates */\nexport default class TemplatePlugin implements ViewPlugin {\n private readonly options: Options;\n\n hooks = {\n resolveTemplateSubstitutions: new SyncWaterfallHook<\n [TemplateSubstitution[], TemplateItemInfo]\n >(),\n };\n\n constructor(options: Options) {\n this.options = options;\n }\n\n private parseTemplate(\n parseObject: any,\n node: Node.Template,\n options: Options,\n ): Node.Node | null {\n const { template, depth } = node;\n const data = options.data.model.get(node.data);\n\n if (!data) {\n return null;\n }\n\n if (!Array.isArray(data)) {\n throw new Error(`Template using '${node.data}' but is not an array`);\n }\n\n const values: Array<Node.Node> = [];\n\n data.forEach((dataItem, index) => {\n const templateSubstitutions =\n this.hooks.resolveTemplateSubstitutions.call(\n [\n {\n expression: new RegExp(`_index${depth || \"\"}_`),\n value: String(index),\n },\n ],\n {\n depth,\n data: dataItem,\n index,\n },\n );\n let templateStr = JSON.stringify(template);\n\n for (const { expression, value } of templateSubstitutions) {\n let flags = \"g\";\n if (typeof expression === \"object\") {\n flags = `${expression.flags}${expression.global ? \"\" : \"g\"}`;\n }\n\n templateStr = templateStr.replace(new RegExp(expression, flags), value);\n }\n\n const parsed = parseObject(JSON.parse(templateStr), NodeType.Value, {\n templateDepth: node.depth + 1,\n });\n\n if (parsed) {\n values.push(parsed);\n }\n });\n\n const result: Node.MultiNode = {\n type: NodeType.MultiNode,\n override: false,\n values,\n };\n\n return result;\n }\n\n applyParser(parser: Parser) {\n parser.hooks.onCreateASTNode.tap(\"template\", (node) => {\n if (node && node.type === NodeType.Template && !node.dynamic) {\n return this.parseTemplate(\n parser.parseObject.bind(parser),\n node,\n this.options,\n );\n }\n\n return node;\n });\n\n parser.hooks.parseNode.tap(\n \"template\",\n (\n obj: any,\n _nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ) => {\n if (childOptions && hasTemplateKey(childOptions.key)) {\n return obj\n .map((template: Template) => {\n const templateAST = parser.createASTNode(\n {\n type: NodeType.Template,\n depth: options.templateDepth ?? 0,\n data: template.data,\n template: template.value,\n dynamic: template.dynamic ?? false,\n },\n template,\n );\n\n if (!templateAST) return;\n\n if (templateAST.type === NodeType.MultiNode) {\n templateAST.values.forEach((v) => {\n v.parent = templateAST;\n });\n }\n\n return {\n path: [...childOptions.path, template.output],\n value: templateAST,\n };\n })\n .filter(Boolean);\n }\n },\n );\n }\n\n applyResolverHooks(resolver: Resolver) {\n resolver.hooks.beforeResolve.tap(\"template\", (node, options) => {\n if (node && node.type === NodeType.Template && node.dynamic) {\n return this.parseTemplate(options.parseNode, node, options);\n }\n\n return node;\n });\n }\n\n apply(view: ViewInstance) {\n view.hooks.parser.tap(\"template\", this.applyParser.bind(this));\n view.hooks.resolver.tap(\"template\", this.applyResolverHooks.bind(this));\n }\n}\n","import { ViewInstance, ViewPlugin } from \"../view\";\nimport type { Options } from \"./options\";\nimport type {\n Parser,\n Node,\n ParseObjectOptions,\n ParseObjectChildOptions,\n} from \"../parser\";\nimport { EMPTY_NODE, NodeType } from \"../parser\";\nimport type { Resolver } from \"../resolver\";\nimport { hasSwitchKey } from \"../parser/utils\";\n\n/** A view plugin to resolve switches */\nexport default class SwitchPlugin implements ViewPlugin {\n private readonly options: Options;\n\n constructor(options: Options) {\n this.options = options;\n }\n\n private resolveSwitch(node: Node.Switch, options: Options): Node.Node {\n for (const switchCase of node.cases) {\n const isApplicable = options.evaluate(switchCase.case);\n if (isApplicable) {\n return switchCase.value;\n }\n }\n\n return EMPTY_NODE;\n }\n\n private isSwitch(obj: any) {\n return (\n obj &&\n (Object.prototype.hasOwnProperty.call(obj, \"dynamicSwitch\") ||\n Object.prototype.hasOwnProperty.call(obj, \"staticSwitch\"))\n );\n }\n\n applyParser(parser: Parser) {\n /** Switches resolved during the parsing phase are static */\n parser.hooks.onCreateASTNode.tap(\"switch\", (node) => {\n if (node && node.type === NodeType.Switch && !node.dynamic) {\n return this.resolveSwitch(node, this.options);\n }\n\n return node;\n });\n\n parser.hooks.parseNode.tap(\n \"switch\",\n (\n obj: any,\n _nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ) => {\n if (\n this.isSwitch(obj) ||\n (childOptions && hasSwitchKey(childOptions.key))\n ) {\n const objToParse =\n childOptions && hasSwitchKey(childOptions.key)\n ? { [childOptions.key]: obj }\n : obj;\n const dynamic = \"dynamicSwitch\" in objToParse;\n const switchContent = dynamic\n ? objToParse.dynamicSwitch\n : objToParse.staticSwitch;\n\n const cases: Node.SwitchCase[] = switchContent\n .map(\n (switchCase: {\n [x: string]: any;\n /**\n *\n */\n case: any;\n }) => {\n const { case: switchCaseExpr, ...switchBody } = switchCase;\n const value = parser.parseObject(\n switchBody,\n NodeType.Value,\n options,\n );\n\n if (value) {\n return {\n case: switchCaseExpr,\n value: value as Node.Value,\n };\n }\n\n return;\n },\n )\n .filter(Boolean);\n\n const switchAST = parser.createASTNode(\n {\n type: NodeType.Switch,\n dynamic,\n cases,\n },\n objToParse,\n );\n\n if (!switchAST || switchAST.type === NodeType.Empty) {\n return childOptions ? [] : null;\n }\n\n if (switchAST.type === NodeType.Switch) {\n switchAST.cases.forEach((sCase) => {\n sCase.value.parent = switchAST;\n });\n }\n\n if (childOptions) {\n let path = [...childOptions.path, childOptions.key];\n let value: any = switchAST;\n\n if (\n switchAST.type === NodeType.Value &&\n switchAST.children?.length === 1 &&\n switchAST.value === undefined\n ) {\n const firstChild = switchAST.children[0];\n path = [...path, ...firstChild.path];\n value = firstChild.value;\n }\n\n return [{ path, value }];\n }\n\n return switchAST;\n }\n },\n );\n }\n\n applyResolver(resolver: Resolver) {\n /** Switches resolved during the parsing phase are dynamic */\n resolver.hooks.beforeResolve.tap(\"switch\", (node, options) => {\n if (node && node.type === NodeType.Switch && node.dynamic) {\n return this.resolveSwitch(node, options);\n }\n\n return node;\n });\n }\n\n apply(view: ViewInstance) {\n view.hooks.parser.tap(\"switch\", this.applyParser.bind(this));\n view.hooks.resolver.tap(\"switch\", this.applyResolver.bind(this));\n }\n}\n","import { ViewInstance, ViewPlugin } from \"../view\";\nimport type {\n Parser,\n Node,\n ParseObjectOptions,\n ParseObjectChildOptions,\n} from \"../parser\";\nimport { NodeType } from \"../parser\";\nimport { hasTemplateValues, hasTemplateKey } from \"../parser/utils\";\n\n/** A view plugin to resolve multi nodes */\nexport default class MultiNodePlugin implements ViewPlugin {\n applyParser(parser: Parser) {\n parser.hooks.parseNode.tap(\n \"multi-node\",\n (\n obj: any,\n nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ) => {\n if (\n childOptions &&\n !hasTemplateKey(childOptions.key) &&\n Array.isArray(obj)\n ) {\n const values = obj\n .map((childVal) =>\n parser.parseObject(childVal, NodeType.Value, options),\n )\n .filter((child): child is Node.Node => !!child);\n\n if (!values.length) {\n return [];\n }\n\n const multiNode = parser.createASTNode(\n {\n type: NodeType.MultiNode,\n override: !hasTemplateValues(\n childOptions.parentObj,\n childOptions.key,\n ),\n values,\n },\n obj,\n );\n\n if (!multiNode) {\n return [];\n }\n\n if (multiNode.type === NodeType.MultiNode) {\n multiNode.values.forEach((v) => {\n v.parent = multiNode;\n });\n }\n\n return [\n {\n path: [...childOptions.path, childOptions.key],\n value: multiNode,\n },\n ];\n }\n },\n );\n }\n\n apply(view: ViewInstance) {\n view.hooks.parser.tap(\"multi-node\", this.applyParser.bind(this));\n }\n}\n","import { ViewInstance, ViewPlugin } from \"../view\";\nimport type {\n Parser,\n Node,\n ParseObjectOptions,\n ParseObjectChildOptions,\n} from \"../parser\";\nimport { NodeType } from \"../parser\";\n\n/** A view plugin to resolve assets */\nexport default class AssetPlugin implements ViewPlugin {\n applyParser(parser: Parser) {\n parser.hooks.parseNode.tap(\n \"asset\",\n (\n obj: any,\n nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ) => {\n if (childOptions?.key === \"asset\" && typeof obj === \"object\") {\n const assetAST = parser.parseObject(obj, NodeType.Asset, options);\n\n if (!assetAST) {\n return [];\n }\n\n return [\n {\n path: [...childOptions.path, childOptions.key],\n value: assetAST,\n },\n ];\n }\n },\n );\n }\n\n apply(view: ViewInstance) {\n view.hooks.parser.tap(\"asset\", this.applyParser.bind(this));\n }\n}\n","import { SyncHook } from \"tapable-ts\";\nimport type { Navigation, NavigationFlowEndState } from \"@player-ui/types\";\nimport type { Logger } from \"../../logger\";\nimport type { TransitionOptions } from \"./flow\";\nimport { FlowInstance } from \"./flow\";\n\n/** A manager for the navigation section of a Content blob */\nexport class FlowController {\n public readonly hooks = {\n flow: new SyncHook<[FlowInstance]>(),\n };\n\n private readonly log?: Logger;\n private navigation: Navigation;\n private navStack: FlowInstance[];\n public current?: FlowInstance;\n\n constructor(\n navigation: Navigation,\n options?: {\n /** A logger instance to use */\n logger?: Logger;\n },\n ) {\n this.navigation = navigation;\n this.navStack = [];\n this.log = options?.logger;\n\n this.start = this.start.bind(this);\n this.run = this.run.bind(this);\n this.transition = this.transition.bind(this);\n this.addNewFlow = this.addNewFlow.bind(this);\n }\n\n /** Navigate to another state in the state-machine */\n public transition(stateTransition: string, options?: TransitionOptions) {\n if (this.current === undefined) {\n throw new Error(\"Not currently in a flow. Cannot transition.\");\n }\n\n this.current.transition(stateTransition, options);\n }\n\n private addNewFlow(flow: FlowInstance) {\n this.navStack.push(flow);\n this.current = flow;\n this.hooks.flow.call(flow);\n }\n\n private async run(startState: string): Promise<NavigationFlowEndState> {\n if (!Object.prototype.hasOwnProperty.call(this.navigation, startState)) {\n return Promise.reject(new Error(`No flow defined for: ${startState}`));\n }\n\n const startFlow = this.navigation[startState];\n\n if (startFlow === null || typeof startFlow !== \"object\") {\n return Promise.reject(\n new Error(`Flow: ${startState} needs to be an object`),\n );\n }\n\n this.log?.debug(`Starting flow: ${startState}`);\n\n const flow = new FlowInstance(startState, startFlow, { logger: this.log });\n this.addNewFlow(flow);\n\n flow.hooks.afterTransition.tap(\"flow-controller\", (flowInstance) => {\n if (flowInstance.currentState?.value.state_type === \"FLOW\") {\n const subflowId = flowInstance.currentState?.value.ref;\n this.log?.debug(`Loading subflow ${subflowId}`);\n this.run(subflowId).then((subFlowEndState) => {\n this.log?.debug(\n `Subflow ended. Using outcome: ${subFlowEndState.outcome}`,\n );\n flowInstance.transition(subFlowEndState?.outcome);\n });\n }\n });\n\n const end = await flow.start();\n this.navStack.pop();\n\n if (this.navStack.length > 0) {\n const firstItem = 0;\n this.current = this.navStack[firstItem];\n }\n\n return end;\n }\n\n public async start(): Promise<NavigationFlowEndState> {\n if (!this.navigation.BEGIN) {\n return Promise.reject(new Error(\"Must supply a BEGIN state\"));\n }\n\n return this.run(this.navigation.BEGIN);\n }\n}\n","const ANY_CHAR_REGEX = /%([a-zA-Z]+)/g;\n\n/**\n * Replaces %num in message with the provided parameters in order.\n *\n * @param message - Parameterized string like \"This is a %1\"\n * @param params - Parameters to replace in message E.g. ['tax2021.amount']\n * @returns A message with the parameters replaced.\n */\nexport function replaceParams(\n message: string,\n params: Record<string, any>,\n): string {\n return message\n .slice()\n .replace(ANY_CHAR_REGEX, (keyExpr) => params[keyExpr.slice(1)] || keyExpr);\n}\n","import type { Validation } from \"@player-ui/types\";\nimport type { ViewPlugin, Resolver, Node, ViewInstance } from \"../../view\";\nimport { NodeType } from \"../../view\";\nimport type {\n BindingInstance,\n BindingLike,\n BindingFactory,\n} from \"../../binding\";\nimport { isBinding } from \"../../binding\";\nimport type { ValidationResponse } from \"../../validator\";\n\nconst CONTEXT = \"validation-binding-tracker\";\n\nexport interface BindingTracker {\n /** Get the bindings currently being tracked for validation */\n getBindings(): Set<BindingInstance>;\n\n /** Add a binding to the tracked set */\n trackBinding(binding: BindingInstance): void;\n}\ninterface Options {\n /** Parse a binding from a view */\n parseBinding: BindingFactory;\n\n /** Callbacks when events happen */\n callbacks?: {\n /** Called when a binding is encountered for the first time in a view */\n onAdd?: (binding: BindingInstance) => void;\n };\n}\n\n/** A view plugin that manages bindings tracked across updates */\nexport class ValidationBindingTrackerViewPlugin\n implements ViewPlugin, BindingTracker\n{\n private options: Options;\n\n private trackedBindings = new Set<BindingInstance>();\n\n constructor(options: Options) {\n this.options = options;\n }\n\n /** Fetch the tracked bindings in the current view */\n getBindings(): Set<BindingInstance> {\n return this.trackedBindings;\n }\n\n /** Add a binding to the tracked set */\n trackBinding(binding: BindingInstance) {\n if (this.trackedBindings.has(binding)) {\n return;\n }\n\n this.trackedBindings.add(binding);\n this.options.callbacks?.onAdd?.(binding);\n }\n\n /** Attach hooks to the given resolver */\n applyResolver(resolver: Resolver) {\n this.trackedBindings.clear();\n\n /** Each node maps to a set of bindings that it directly tracks */\n const tracked = new Map<Node.Node, Set<BindingInstance>>();\n\n /** Each Node is a registered section or page that maps to a set of nodes in its section */\n const sections = new Map<Node.Node, Set<Node.Node>>();\n\n let lastViewUpdateChangeSet: Set<BindingInstance> | undefined;\n\n /** Map of node to all bindings in children */\n const lastComputedBindingTree = new Map<Node.Node, Set<BindingInstance>>();\n let currentBindingTree = new Map<Node.Node, Set<BindingInstance>>();\n\n /** Map of registered section nodes to bindings */\n const lastSectionBindingTree = new Map<Node.Node, Set<BindingInstance>>();\n\n /** Map of resolved nodes to their original nodes. */\n const resolvedNodeMap: Map<Node.Node, Node.Node> = new Map();\n\n resolver.hooks.beforeUpdate.tap(CONTEXT, (changes) => {\n lastViewUpdateChangeSet = changes;\n });\n\n resolver.hooks.skipResolve.tap(CONTEXT, (shouldSkip, node) => {\n const trackedBindingsForNode = lastComputedBindingTree.get(node);\n\n if (!shouldSkip || !lastViewUpdateChangeSet || !trackedBindingsForNode) {\n return shouldSkip;\n }\n\n const intersection = new Set(\n [...lastViewUpdateChangeSet].filter((b) =>\n trackedBindingsForNode.has(b),\n ),\n );\n\n return intersection.size === 0;\n });\n\n resolver.hooks.resolveOptions.tap(CONTEXT, (options, node) => {\n if (options.validation === undefined) {\n return options;\n }\n\n // Clear out any old tracked bindings for this node since we're re-compiling it\n tracked.delete(node);\n\n /** Validation callback to track a binding */\n const track = (binding: BindingLike) => {\n const parsed = isBinding(binding)\n ? binding\n : this.options.parseBinding(binding);\n\n if (tracked.has(node)) {\n tracked.get(node)?.add(parsed);\n } else {\n tracked.set(node, new Set([parsed]));\n }\n\n /** find first parent registered as section and add self to its list */\n let { parent } = node;\n\n while (parent) {\n if (sections.has(parent)) {\n sections.get(parent)?.add(node);\n break;\n } else {\n parent = parent.parent;\n }\n }\n\n this.trackedBindings.add(parsed);\n this.options.callbacks?.onAdd?.(parsed);\n };\n\n return {\n ...options,\n validation: {\n ...options.validation,\n get: (binding, getOptions) => {\n if (getOptions?.track) {\n track(binding);\n }\n\n const eows = options.validation\n ?._getValidationForBinding(binding)\n ?.getAll(getOptions);\n\n const firstFieldEOW = eows?.find(\n (eow) =>\n eow.displayTarget === \"field\" ||\n eow.displayTarget === undefined,\n );\n\n return firstFieldEOW;\n },\n getValidationsForBinding(binding, getOptions) {\n if (getOptions?.track) {\n track(binding);\n }\n\n return (\n options.validation\n ?._getValidationForBinding(binding)\n ?.getAll(getOptions) ?? []\n );\n },\n getChildren: (type?: Validation.DisplayTarget) => {\n const validations = new Array<ValidationResponse>();\n lastComputedBindingTree.get(node)?.forEach((binding) => {\n const eow = options.validation\n ?._getValidationForBinding(binding)\n ?.get();\n\n if (eow && (type === undefined || type === eow.displayTarget)) {\n validations.push(eow);\n }\n });\n\n return validations;\n },\n getValidationsForSection: () => {\n const validations = new Array<ValidationResponse>();\n lastSectionBindingTree.get(node)?.forEach((binding) => {\n const eow = options.validation\n ?._getValidationForBinding(binding)\n ?.get();\n\n if (eow && eow.displayTarget === \"section\") {\n validations.push(eow);\n }\n });\n\n return validations;\n },\n register: (registerOptions) => {\n if (registerOptions?.type === \"section\") {\n if (!sections.has(node)) {\n sections.set(node, new Set());\n }\n }\n },\n track,\n },\n };\n });\n\n resolver.hooks.afterNodeUpdate.tap(\n CONTEXT,\n (originalNode, parent, update) => {\n // Compute the new tree for this node\n // If it's not-updated, use the last known value\n\n const { updated, node: resolvedNode } = update;\n resolvedNodeMap.set(resolvedNode, originalNode);\n\n if (updated) {\n const newlyComputed = new Set(tracked.get(originalNode));\n if (resolvedNode.type === NodeType.MultiNode) {\n resolvedNode.values.forEach((value) =>\n currentBindingTree\n .get(value)\n ?.forEach((b) => newlyComputed.add(b)),\n );\n }\n\n if (\"children\" in resolvedNode && resolvedNode.children) {\n resolvedNode.children.forEach((child) => {\n currentBindingTree\n .get(child.value)\n ?.forEach((b) => newlyComputed.add(b));\n });\n }\n\n currentBindingTree.set(resolvedNode, newlyComputed);\n } else {\n currentBindingTree.set(\n resolvedNode,\n lastComputedBindingTree.get(originalNode) ?? new Set(),\n );\n }\n\n if (originalNode === resolver.root) {\n this.trackedBindings = new Set(currentBindingTree.get(resolvedNode));\n lastComputedBindingTree.clear();\n currentBindingTree.forEach((value, key) => {\n const node = resolvedNodeMap.get(key);\n if (node) {\n lastComputedBindingTree.set(node, value);\n }\n });\n\n lastSectionBindingTree.clear();\n sections.forEach((nodeSet, sectionNode) => {\n const temp = new Set<BindingInstance>();\n nodeSet.forEach((n) => {\n tracked.get(n)?.forEach(temp.add, temp);\n });\n lastSectionBindingTree.set(sectionNode, temp);\n });\n\n tracked.clear();\n sections.clear();\n currentBindingTree = new Map();\n }\n },\n );\n }\n\n apply(view: ViewInstance) {\n view.hooks.resolver.tap(CONTEXT, this.applyResolver.bind(this));\n }\n}\n","export interface Store {\n useLocalState<T>(initialState: T): readonly [T, (value: T) => void];\n useSharedState<T>(\n key: string | symbol,\n ): (initialState: T) => readonly [T, (value: T) => void];\n}\n\ninterface SharedStore {\n getLocalStateFunction<T>(\n key: string | symbol,\n countKey: symbol,\n ): (initialState: T) => readonly [T, (value: T) => void];\n useSharedState<T>(\n key: string | symbol,\n ): (initialState: T) => readonly [T, (value: T) => void];\n}\n\n/** A store that holds on to state for a transform */\nexport class LocalStateStore implements SharedStore {\n private state: Map<string | symbol, any>;\n\n private updateCallback?: () => void;\n\n constructor(onUpdate?: () => void) {\n this.updateCallback = onUpdate;\n\n this.state = new Map();\n }\n\n public removeKey(key: symbol | string) {\n this.state.delete(key);\n }\n\n public reset() {\n this.state.clear();\n }\n\n useSharedState<T>(key: string | symbol) {\n return (initialState: T) => {\n if (!this.state.has(key)) {\n this.state.set(key, initialState);\n }\n\n return [\n this.state.get(key) as T,\n (newState: T) => {\n const current = this.state.get(key) as T;\n\n this.state.set(key, newState);\n\n if (current !== newState) {\n this.updateCallback?.();\n }\n },\n ] as const;\n };\n }\n\n getLocalStateFunction<T>(key: symbol, countKey: symbol) {\n return (initialState: T) => {\n // initialize if not already created\n if (!this.state.has(key)) {\n this.state.set(key, []);\n }\n\n if (!this.state.has(countKey)) {\n this.state.set(countKey, 0);\n }\n\n const localState = this.state.get(key);\n const oldCount = this.state.get(countKey);\n\n this.state.set(countKey, oldCount + 1);\n\n if (localState.length <= oldCount) {\n localState.push(initialState);\n }\n\n const value = localState[oldCount] as T;\n\n return [\n value,\n (newState: T) => {\n const oldValue = localState[oldCount] as T;\n localState[oldCount] = newState;\n\n if (oldValue !== newState) {\n this.updateCallback?.();\n }\n },\n ] as const;\n };\n }\n}\n","import type { Node } from \"../../view\";\nimport { NodeType } from \"../../view\";\nimport { LocalStateStore } from \"./store\";\nimport type { TransformRegistry } from \"./types\";\nimport type { ViewController } from \"./controller\";\n\n/** Traverse up the nodes until the target is found */\nfunction findUp(node: Node.Node, target: Node.Node): boolean {\n if (node === target) {\n return true;\n }\n\n if (node.parent) {\n return findUp(node.parent, target);\n }\n\n return false;\n}\n\n/**\n * A plugin to register custom transforms on certain asset types\n * This allows users to embed stateful data into transforms.\n */\nexport class AssetTransformCorePlugin {\n public readonly stateStore: Map<Node.Node, LocalStateStore>;\n private readonly registry: TransformRegistry;\n private beforeResolveSymbol: symbol;\n private resolveSymbol: symbol;\n private beforeResolveCountSymbol: symbol;\n private resolveCountSymbol: symbol;\n\n constructor(registry: TransformRegistry) {\n this.registry = registry;\n this.stateStore = new Map();\n this.beforeResolveSymbol = Symbol(\"before resolve\");\n this.resolveSymbol = Symbol(\"resolve\");\n this.beforeResolveCountSymbol = Symbol(\"before resolve count\");\n this.resolveCountSymbol = Symbol(\"resolve count\");\n }\n\n apply(viewController: ViewController) {\n viewController.hooks.view.tap(\"asset-transform\", (view) => {\n // Clear out everything when we create a new view\n this.stateStore.clear();\n\n view.hooks.resolver.tap(\"asset-transform\", (resolver) => {\n let lastUpdatedNode: Node.Node | undefined;\n\n /** A function to update the state and trigger a view re-compute */\n const updateState = (node: Node.Node) => {\n lastUpdatedNode = node;\n view.update(new Set());\n };\n\n /** Given a node and a transform step, fetch a local store */\n const getStore = (node: Node.Node, stepKey: symbol) => {\n let store: LocalStateStore;\n const countKey =\n stepKey === this.resolveSymbol\n ? this.resolveCountSymbol\n : this.beforeResolveCountSymbol;\n\n const storedState = this.stateStore.get(node);\n\n if (storedState) {\n store = storedState;\n store.removeKey(countKey);\n } else {\n store = new LocalStateStore(() => {\n updateState(node);\n });\n this.stateStore.set(node, store);\n }\n\n return {\n useSharedState: (\n key: string | symbol,\n ): (<T>(initialState: T) => readonly [T, (value: T) => void]) => {\n return store.useSharedState(key);\n },\n useLocalState: <T>(initialState: T) => {\n return store.getLocalStateFunction<T>(\n stepKey,\n countKey,\n )(initialState);\n },\n };\n };\n\n resolver.hooks.beforeResolve.tap(\"asset-transform\", (node, options) => {\n if (node && (node.type === \"asset\" || node.type === \"view\")) {\n const transform = this.registry.get(node.value);\n\n if (transform?.beforeResolve) {\n const store = getStore(\n options.node ?? node,\n this.beforeResolveSymbol,\n );\n\n return transform.beforeResolve(node, options, store);\n }\n }\n\n return node;\n });\n\n resolver.hooks.afterUpdate.tap(\"asset-transform\", () => {\n lastUpdatedNode = undefined;\n });\n\n resolver.hooks.skipResolve.tap(\"asset-transform\", (skip, node) => {\n if (!skip || !lastUpdatedNode) {\n return skip;\n }\n\n const isParentOfUpdated = findUp(lastUpdatedNode, node);\n const isChildOfUpdated = findUp(node, lastUpdatedNode);\n\n return !isParentOfUpdated && !isChildOfUpdated;\n });\n\n resolver.hooks.afterResolve.tap(\n \"asset-transform\",\n (value, node, options) => {\n if (node.type !== NodeType.Asset && node.type !== NodeType.View) {\n return value;\n }\n\n const originalNode = resolver.getSourceNode(node);\n\n if (!originalNode) {\n return value;\n }\n\n const transform = this.registry.get(value);\n\n if (transform?.resolve) {\n const store = getStore(originalNode, this.resolveSymbol);\n\n return transform?.resolve(value, options, store);\n }\n\n return value;\n },\n );\n });\n });\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type { DataController } from \".\";\nimport type { Logger } from \"../../logger\";\nimport type { BindingLike } from \"../../binding\";\nimport type {\n DataModelWithParser,\n DataModelOptions,\n Updates,\n} from \"../../data\";\n\n/** Wrapper for the Data Controller Class that prevents writes */\nexport class ReadOnlyDataController\n implements DataModelWithParser<DataModelOptions>\n{\n private controller: DataController;\n private logger?: Logger;\n\n constructor(controller: DataController, logger?: Logger) {\n this.controller = controller;\n this.logger = logger;\n }\n\n get(binding: BindingLike, options?: DataModelOptions | undefined) {\n return this.controller.get(binding, options);\n }\n\n set(\n transaction: [BindingLike, any][],\n options?: DataModelOptions | undefined,\n ): Updates {\n this.logger?.error(\n \"Error: Tried to set in a read only instance of the DataController\",\n );\n return [];\n }\n\n delete(binding: BindingLike, options?: DataModelOptions | undefined): void {\n this.logger?.error(\n \"Error: Tried to delete in a read only instance of the DataController\",\n );\n }\n}\n","import { SyncHook, SyncWaterfallHook, SyncBailHook } from \"tapable-ts\";\nimport { dequal } from \"dequal\";\nimport type { Logger } from \"../../logger\";\nimport type { BindingParser, BindingLike } from \"../../binding\";\nimport { BindingInstance } from \"../../binding\";\nimport type {\n BatchSetTransaction,\n Updates,\n DataModelOptions,\n DataModelWithParser,\n DataPipeline,\n DataModelMiddleware,\n} from \"../../data\";\nimport { PipelinedDataModel, LocalModel } from \"../../data\";\nimport type { RawSetTransaction } from \"../../types\";\nimport { ReadOnlyDataController } from \"./utils\";\n\n/** The orchestrator for player data */\nexport class DataController implements DataModelWithParser<DataModelOptions> {\n public hooks = {\n resolve: new SyncWaterfallHook(),\n resolveDataStages: new SyncWaterfallHook<[DataPipeline]>(),\n\n // On any set or get of an undefined value, redirect the value to be the default\n resolveDefaultValue: new SyncBailHook<[BindingInstance], any>(),\n\n onDelete: new SyncHook<[any]>(),\n\n onSet: new SyncHook<[BatchSetTransaction]>(),\n\n onGet: new SyncHook<[any, any]>(),\n\n onUpdate: new SyncHook<[Updates, DataModelOptions | undefined]>(),\n\n format: new SyncWaterfallHook<[any, BindingInstance]>(),\n\n deformat: new SyncWaterfallHook<[any, BindingInstance]>(),\n\n serialize: new SyncWaterfallHook<[any]>(),\n };\n\n private model?: PipelinedDataModel;\n private trash: Set<BindingInstance>;\n private pathResolver: BindingParser;\n private baseMiddleware: Array<DataModelMiddleware>;\n private logger?: Logger;\n\n constructor(\n model: Record<any, unknown> | undefined,\n options: {\n /** A means of parsing a raw binding to a Binding object */\n pathResolver: BindingParser;\n\n /** middleware to use. typically for validation */\n middleware?: Array<DataModelMiddleware>;\n\n /** A logger to use */\n logger?: Logger;\n },\n ) {\n this.logger = options.logger;\n const middleware = options.middleware || [];\n this.baseMiddleware = [new LocalModel(model), ...middleware];\n\n this.trash = new Set();\n this.pathResolver = options.pathResolver;\n }\n\n public getModel(): PipelinedDataModel {\n if (!this.model) {\n const stages = this.hooks.resolveDataStages.call(this.baseMiddleware);\n const model = new PipelinedDataModel();\n model.setMiddleware(stages);\n this.model = model;\n }\n\n return this.model;\n }\n\n private resolveDataValue(\n binding: BindingInstance,\n value: any,\n deformat: boolean,\n ) {\n if (deformat) {\n return this.hooks.deformat.call(value, binding);\n }\n\n return value;\n }\n\n public set(\n transaction: RawSetTransaction,\n options?: DataModelOptions,\n ): Updates {\n let normalizedTransaction: BatchSetTransaction = [];\n\n if (Array.isArray(transaction)) {\n normalizedTransaction = transaction.map(([binding, value]) => {\n const parsed = this.pathResolver.parse(binding);\n\n return [\n parsed,\n this.resolveDataValue(parsed, value, Boolean(options?.formatted)),\n ];\n }) as BatchSetTransaction;\n } else {\n normalizedTransaction = Object.keys(transaction).map(\n (binding: string) => {\n const parsed = this.pathResolver.parse(binding);\n const val = transaction[binding];\n\n return [\n parsed,\n this.resolveDataValue(parsed, val, Boolean(options?.formatted)),\n ];\n },\n ) as BatchSetTransaction;\n }\n\n // Figure out what the base changes being applied are\n const setUpdates = normalizedTransaction.reduce<Updates>(\n (updates, [binding, newVal]) => {\n const oldVal = this.get(binding, { includeInvalid: true });\n\n const update = {\n binding,\n newValue: newVal,\n oldValue: oldVal,\n };\n\n if (dequal(oldVal, newVal)) {\n this.logger?.debug(\n `Skipping update for path: ${binding.asString()}. Value was unchanged: ${oldVal}`,\n );\n } else {\n updates.push(update);\n\n this.logger?.debug(\n `Setting path: ${binding.asString()} from: ${oldVal} to: ${newVal}`,\n );\n }\n\n return updates;\n },\n [],\n );\n\n // Get the applied update\n const result = this.getModel().set(normalizedTransaction, options);\n\n // Add any extra bindings that were effected\n const setUpdateBindings = new Set(setUpdates.map((su) => su.binding));\n result.forEach((tr) => {\n if (\n !setUpdateBindings.has(tr.binding) &&\n (tr.force === true || !dequal(tr.oldValue, tr.newValue))\n ) {\n this.logger?.debug(\n `Path: ${tr.binding.asString()} was changed from: ${\n tr.oldValue\n } to: ${tr.newValue}`,\n );\n setUpdates.push(tr);\n }\n });\n\n this.hooks.onSet.call(normalizedTransaction);\n\n if (setUpdates.length > 0) {\n this.hooks.onUpdate.call(setUpdates, options);\n }\n\n return result;\n }\n\n private resolve(binding: BindingLike, readOnly: boolean): BindingInstance {\n return Array.isArray(binding) || typeof binding === \"string\"\n ? this.pathResolver.parse(binding, { readOnly })\n : binding;\n }\n\n public get(binding: BindingLike, options?: DataModelOptions) {\n const resolved =\n binding instanceof BindingInstance\n ? binding\n : this.resolve(binding, true);\n let result = this.getModel().get(resolved, options);\n\n if (result === undefined && !options?.ignoreDefaultValue) {\n const defaultVal = this.hooks.resolveDefaultValue.call(resolved);\n\n if (defaultVal !== result) {\n result = defaultVal;\n }\n }\n\n if (options?.formatted) {\n result = this.hooks.format.call(result, resolved);\n } else if (options?.formatted === false) {\n result = this.hooks.deformat.call(result, resolved);\n }\n\n this.hooks.onGet.call(binding, result);\n\n return result;\n }\n\n public delete(binding: BindingLike, options?: DataModelOptions) {\n if (\n typeof binding !== \"string\" &&\n !Array.isArray(binding) &&\n !(binding instanceof BindingInstance)\n ) {\n throw new Error(\"Invalid arguments: delete expects a data path (string)\");\n }\n\n const resolved =\n binding instanceof BindingInstance\n ? binding\n : this.resolve(binding, false);\n\n const parentBinding = resolved.parent();\n const property = resolved.key();\n const parentValue = this.get(parentBinding);\n\n const existedBeforeDelete =\n typeof parentValue === \"object\" &&\n parentValue !== null &&\n Object.prototype.hasOwnProperty.call(parentValue, property);\n\n this.getModel().delete(resolved, options);\n\n if (existedBeforeDelete && !this.get(resolved)) {\n this.trash.add(resolved);\n }\n\n this.hooks.onDelete.call(resolved);\n }\n\n public serialize(): object {\n return this.hooks.serialize.call(this.get(\"\"));\n }\n\n public makeReadOnly(): ReadOnlyDataController {\n return new ReadOnlyDataController(this, this.logger);\n }\n}\n","import { BindingInstance } from \"../../binding\";\n\n/** Recursively flattens a nested object to be an object of depth 1 with keys being the full path in the orginal object */\nexport function flatten(obj: any, roots: [string][] = [], sep = \".\"): any {\n return (\n Object\n // find props of given object\n .keys(obj)\n // return an object by iterating props\n .reduce(\n (memo, prop) => ({\n // create a new object\n\n // include previously returned object\n ...memo,\n ...(Object.prototype.toString.call(obj[prop]) === \"[object Object]\"\n ? // keep working if value is an object\n flatten(obj[prop], roots.concat([prop]))\n : // include current prop and value and prefix prop with the roots\n { [roots.concat([prop]).join(sep)]: obj[prop] }),\n }),\n {},\n )\n );\n}\n\n/** Converts an object into a list of binding/value tuples to use with a LocalModel object */\nexport function objectToBatchSet(obj: any): [BindingInstance, any][] {\n const flattenedObj = flatten(obj);\n const batchTxn: [BindingInstance, any][] = [];\n\n Object.keys(flattenedObj).forEach((key) => {\n batchTxn.push([new BindingInstance(key), flattenedObj[key]]);\n });\n\n return batchTxn;\n}\n","import { LocalModel } from \"../../data\";\nimport { BindingInstance } from \"../../binding\";\nimport { objectToBatchSet } from \"./utils\";\n\nexport interface ConstantsProvider {\n /**\n * Function to add constants to the providers store\n * - @param data values to add to the constants store\n */\n addConstants(data: Record<string, any>, namespace: string): void;\n\n /**\n * Function to retrieve constants from the providers store\n * - @param key Key used for the store access\n * - @param namespace namespace values were loaded under (defined in the plugin)\n * - @param fallback Optional - if key doesn't exist in namespace what to return (will return unknown if not provided)\n */\n getConstants(key: any, namespace: string, fallback?: any): any;\n\n /**\n * Function to set values to temporarily override certain keys in the perminant store\n * - @param data values to override store with\n * - @param namespace namespace to override\n */\n setTemporaryValues(data: any, namespace: string): void;\n\n /**\n * Clears any temporary values that were previously set\n */\n clearTemporaryValues(): void;\n}\n\n/**\n * Key/Value store for constants and context for Player\n */\nexport class ConstantsController implements ConstantsProvider {\n /**\n * Data store is basically a map of namespaces to DataModels to provide some data isolation\n */\n private store: Map<string, LocalModel>;\n\n /**\n * Separate store for temporary flow specific overrides.\n * They are kept in a separate data model to make clearing it easier between flows\n * and so there is no confusion on what is static and what is temporary\n */\n private tempStore: Map<string, LocalModel>;\n\n constructor() {\n this.store = new Map();\n this.tempStore = new Map();\n }\n\n addConstants(data: any, namespace: string): void {\n if (this.store.has(namespace)) {\n this.store.get(namespace)?.set(objectToBatchSet(data));\n } else {\n this.store.set(namespace, new LocalModel(data));\n }\n }\n\n getConstants(key: string, namespace: string, fallback?: any): any {\n const path = new BindingInstance(key);\n\n return (\n this.tempStore.get(namespace)?.get(path) ??\n this.store.get(namespace)?.get(path) ??\n fallback\n );\n }\n\n setTemporaryValues(data: any, namespace: string): void {\n if (this.tempStore.has(namespace)) {\n this.tempStore.get(namespace)?.set(objectToBatchSet(data));\n } else {\n this.tempStore.set(namespace, new LocalModel(data));\n }\n }\n\n clearTemporaryValues(namespace?: string): void {\n if (namespace) {\n this.tempStore.get(namespace)?.reset();\n } else {\n this.tempStore.forEach((value: LocalModel) => {\n value.reset();\n });\n }\n }\n}\n","import type {\n Expression,\n ExpressionObject,\n NavigationFlowState,\n} from \"@player-ui/types\";\nimport type { ExpressionEvaluator, ExpressionType } from \"../expressions\";\nimport type { FlowInstance } from \"../controllers\";\nimport type { Player, PlayerPlugin } from \"../player\";\n\n/**\n * A plugin that taps into the flow controller to evaluate available expressions\n * Expressions can be exposed via lifecycle \"hooks\" in flow/state nodes\n * e.g: onStart, onEnd\n */\nexport class FlowExpPlugin implements PlayerPlugin {\n name = \"flow-exp-plugin\";\n\n apply(player: Player) {\n let expressionEvaluator: ExpressionEvaluator | undefined;\n\n /**\n * Eval Helper\n *\n * @param exp - an expression to be evaluated\n */\n const handleEval = (exp: Expression | ExpressionObject) => {\n if (exp) {\n if (typeof exp === \"object\" && \"exp\" in exp) {\n expressionEvaluator?.evaluate(exp.exp);\n } else {\n expressionEvaluator?.evaluate(exp as ExpressionType);\n }\n }\n };\n\n player.hooks.expressionEvaluator.tap(this.name, (evaluator) => {\n expressionEvaluator = evaluator;\n });\n\n player.hooks.flowController.tap(this.name, (fc) => {\n fc.hooks.flow.tap(this.name, (flow: FlowInstance) => {\n // Eval flow nodes\n flow.hooks.onStart.tap(this.name, (exp) => handleEval(exp));\n\n flow.hooks.onEnd.tap(this.name, (exp) => handleEval(exp));\n // Eval state nodes\n flow.hooks.resolveTransitionNode.intercept({\n call: (nextState: NavigationFlowState) => {\n if (nextState?.onStart) {\n handleEval(nextState.onStart);\n }\n },\n });\n });\n });\n }\n}\n","import type { ExpressionHandler, ExpressionType } from \"../expressions\";\nimport type { SchemaController } from \"../schema\";\nimport type { Player, PlayerPlugin } from \"../player\";\n\n/** Gets formatter for given formatName and formats value if found, returns value otherwise */\nconst createFormatFunction = (schema: SchemaController) => {\n /**\n * The generated handler for the given schema\n */\n const handler: ExpressionHandler<[unknown, string], any> = (\n ctx,\n value,\n formatName,\n ) => {\n return (\n schema.getFormatterForType({ type: formatName })?.format(value) ?? value\n );\n };\n\n return handler;\n};\n\n/**\n * A plugin that provides the out-of-the-box expressions for player\n */\nexport class DefaultExpPlugin implements PlayerPlugin {\n name = \"flow-exp-plugin\";\n\n apply(player: Player) {\n let formatFunction: ExpressionHandler<[unknown, string]> | undefined;\n\n player.hooks.schema.tap(this.name, (schemaController) => {\n formatFunction = createFormatFunction(schemaController);\n });\n\n player.hooks.expressionEvaluator.tap(this.name, (expEvaluator) => {\n if (formatFunction) {\n expEvaluator.addExpressionFunction(\"format\", formatFunction);\n }\n\n expEvaluator.addExpressionFunction(\"log\", (ctx, ...args) => {\n player.logger.info(...args);\n });\n\n expEvaluator.addExpressionFunction(\"debug\", (ctx, ...args) => {\n player.logger.debug(...args);\n });\n\n expEvaluator.addExpressionFunction(\n \"eval\",\n (ctx, ...args: [ExpressionType]) => {\n return ctx.evaluate(...args);\n },\n );\n });\n }\n}\n","import type { Flow, FlowResult } from \"@player-ui/types\";\nimport type { BindingParser, BindingLike } from \"./binding\";\nimport type { SchemaController } from \"./schema\";\nimport type { ExpressionEvaluator } from \"./expressions\";\nimport type { Logger } from \"./logger\";\nimport type {\n ViewController,\n DataController,\n ValidationController,\n FlowController,\n} from \"./controllers\";\nimport type { ReadOnlyDataController } from \"./controllers/data/utils\";\n\n/** The status for a flow's execution state */\nexport type PlayerFlowStatus =\n | \"not-started\"\n | \"in-progress\"\n | \"completed\"\n | \"error\";\n\n/** Common interface for the state of Player's flow execution */\nexport interface BaseFlowState<T extends PlayerFlowStatus> {\n /** A unique reference for the life-cycle of a flow */\n ref: symbol;\n\n /** The status of the given flow */\n status: T;\n}\n\n/** The beginning state of Player, before it's seen a flow */\nexport type NotStartedState = BaseFlowState<\"not-started\">;\n\nexport const NOT_STARTED_STATE: NotStartedState = {\n ref: Symbol(\"not-started\"),\n status: \"not-started\",\n};\n\n/** Shared properties for a flow in any state of execution (in-progress, completed successfully, or errored out) */\nexport interface PlayerFlowExecutionData {\n /** The currently executing flow */\n flow: Flow;\n}\n\nexport interface ControllerState {\n /** The manager for data for a flow */\n data: DataController;\n\n /** The view manager for a flow */\n view: ViewController;\n\n /** The schema manager for a flow */\n schema: SchemaController;\n\n /** The validation manager for a flow */\n validation: ValidationController;\n\n /** The expression evaluator for a flow */\n expression: ExpressionEvaluator;\n\n /** The manager for parsing and resolving bindings */\n binding: BindingParser;\n\n /** the manager for the flow state machine */\n flow: FlowController;\n}\n\n/** A flow is currently executing */\nexport type InProgressState = BaseFlowState<\"in-progress\"> &\n PlayerFlowExecutionData & {\n /** A promise that resolves when the flow is completed */\n flowResult: Promise<FlowResult>;\n\n /** The underlying state controllers for the current flow */\n controllers: ControllerState;\n\n /** Allow other platforms to abort the current flow with an error */\n fail: (error: Error) => void;\n\n /**\n * The Logger for the current player instance\n */\n logger: Logger;\n };\n\n/** The flow completed properly */\nexport type CompletedState = BaseFlowState<\"completed\"> &\n PlayerFlowExecutionData &\n FlowResult & {\n /** Readonly Player controllers to provide Player functionality after the flow has ended */\n controllers: {\n /** A read only instance of the Data Controller */\n data: ReadOnlyDataController;\n };\n };\n\n/** The flow finished but not successfully */\nexport type ErrorState = BaseFlowState<\"error\"> & {\n /** The currently executing flow */\n flow: Flow;\n\n /** The error associated with the failed flow */\n error: Error;\n};\n\n/** Any Player state */\nexport type PlayerFlowState =\n | NotStartedState\n | InProgressState\n | CompletedState\n | ErrorState;\n\n// Model\n\nexport type RawSetType = [BindingLike, any];\nexport type RawSetTransaction = Record<string, any> | RawSetType[];\n","import type { Player, PlayerPlugin } from \"../player\";\nimport {\n ApplicabilityPlugin,\n AssetPlugin,\n MultiNodePlugin,\n StringResolverPlugin,\n SwitchPlugin,\n TemplatePlugin,\n toNodeResolveOptions,\n} from \"../view\";\n\n/**\n * A plugin that provides the out-of-the-box expressions for player\n */\nexport class DefaultViewPlugin implements PlayerPlugin {\n name = \"default-view-plugin\";\n\n apply(player: Player) {\n player.hooks.viewController.tap(this.name, (viewController) => {\n viewController.hooks.view.tap(this.name, (view) => {\n const pluginOptions = toNodeResolveOptions(view.resolverOptions);\n new AssetPlugin().apply(view);\n new SwitchPlugin(pluginOptions).apply(view);\n new ApplicabilityPlugin().apply(view);\n new StringResolverPlugin().apply(view);\n const templatePlugin = new TemplatePlugin(pluginOptions);\n templatePlugin.apply(view);\n view.hooks.onTemplatePluginCreated.call(templatePlugin);\n new MultiNodePlugin().apply(view);\n });\n });\n }\n}\n","/**\n * @typedef {import('mdast').Nodes} Nodes\n *\n * @typedef Options\n * Configuration (optional).\n * @property {boolean | null | undefined} [includeImageAlt=true]\n * Whether to use `alt` for `image`s (default: `true`).\n * @property {boolean | null | undefined} [includeHtml=true]\n * Whether to use `value` of HTML (default: `true`).\n */\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Get the text content of a node or list of nodes.\n *\n * Prefers the node’s plain-text fields, otherwise serializes its children,\n * and if the given value is an array, serialize the nodes in it.\n *\n * @param {unknown} [value]\n * Thing to serialize, typically `Node`.\n * @param {Options | null | undefined} [options]\n * Configuration (optional).\n * @returns {string}\n * Serialized `value`.\n */\nexport function toString(value, options) {\n const settings = options || emptyOptions\n const includeImageAlt =\n typeof settings.includeImageAlt === 'boolean'\n ? settings.includeImageAlt\n : true\n const includeHtml =\n typeof settings.includeHtml === 'boolean' ? settings.includeHtml : true\n\n return one(value, includeImageAlt, includeHtml)\n}\n\n/**\n * One node or several nodes.\n *\n * @param {unknown} value\n * Thing to serialize.\n * @param {boolean} includeImageAlt\n * Include image `alt`s.\n * @param {boolean} includeHtml\n * Include HTML.\n * @returns {string}\n * Serialized node.\n */\nfunction one(value, includeImageAlt, includeHtml) {\n if (node(value)) {\n if ('value' in value) {\n return value.type === 'html' && !includeHtml ? '' : value.value\n }\n\n if (includeImageAlt && 'alt' in value && value.alt) {\n return value.alt\n }\n\n if ('children' in value) {\n return all(value.children, includeImageAlt, includeHtml)\n }\n }\n\n if (Array.isArray(value)) {\n return all(value, includeImageAlt, includeHtml)\n }\n\n return ''\n}\n\n/**\n * Serialize a list of nodes.\n *\n * @param {Array<unknown>} values\n * Thing to serialize.\n * @param {boolean} includeImageAlt\n * Include image `alt`s.\n * @param {boolean} includeHtml\n * Include HTML.\n * @returns {string}\n * Serialized nodes.\n */\nfunction all(values, includeImageAlt, includeHtml) {\n /** @type {Array<string>} */\n const result = []\n let index = -1\n\n while (++index < values.length) {\n result[index] = one(values[index], includeImageAlt, includeHtml)\n }\n\n return result.join('')\n}\n\n/**\n * Check if `value` looks like a node.\n *\n * @param {unknown} value\n * Thing.\n * @returns {value is Nodes}\n * Whether `value` is a node.\n */\nfunction node(value) {\n return Boolean(value && typeof value === 'object')\n}\n","/**\n * Map of named character references.\n *\n * @type {Record<string, string>}\n */\nexport const characterEntities = {\n AElig: 'Æ',\n AMP: '&',\n Aacute: 'Á',\n Abreve: 'Ă',\n Acirc: 'Â',\n Acy: 'А',\n Afr: '𝔄',\n Agrave: 'À',\n Alpha: 'Α',\n Amacr: 'Ā',\n And: '⩓',\n Aogon: 'Ą',\n Aopf: '𝔸',\n ApplyFunction: '',\n Aring: 'Å',\n Ascr: '𝒜',\n Assign: '≔',\n Atilde: 'Ã',\n Auml: 'Ä',\n Backslash: '∖',\n Barv: '⫧',\n Barwed: '⌆',\n Bcy: 'Б',\n Because: '∵',\n Bernoullis: 'ℬ',\n Beta: 'Β',\n Bfr: '𝔅',\n Bopf: '𝔹',\n Breve: '˘',\n Bscr: 'ℬ',\n Bumpeq: '≎',\n CHcy: 'Ч',\n COPY: '©',\n Cacute: 'Ć',\n Cap: '⋒',\n CapitalDifferentialD: 'ⅅ',\n Cayleys: 'ℭ',\n Ccaron: 'Č',\n Ccedil: 'Ç',\n Ccirc: 'Ĉ',\n Cconint: '∰',\n Cdot: 'Ċ',\n Cedilla: '¸',\n CenterDot: '·',\n Cfr: 'ℭ',\n Chi: 'Χ',\n CircleDot: '⊙',\n CircleMinus: '⊖',\n CirclePlus: '⊕',\n CircleTimes: '⊗',\n ClockwiseContourIntegral: '∲',\n CloseCurlyDoubleQuote: '”',\n CloseCurlyQuote: '’',\n Colon: '∷',\n Colone: '⩴',\n Congruent: '≡',\n Conint: '∯',\n ContourIntegral: '∮',\n Copf: 'ℂ',\n Coproduct: '∐',\n CounterClockwiseContourIntegral: '∳',\n Cross: '⨯',\n Cscr: '𝒞',\n Cup: '⋓',\n CupCap: '≍',\n DD: 'ⅅ',\n DDotrahd: '⤑',\n DJcy: 'Ђ',\n DScy: 'Ѕ',\n DZcy: 'Џ',\n Dagger: '‡',\n Darr: '↡',\n Dashv: '⫤',\n Dcaron: 'Ď',\n Dcy: 'Д',\n Del: '∇',\n Delta: 'Δ',\n Dfr: '𝔇',\n DiacriticalAcute: '´',\n DiacriticalDot: '˙',\n DiacriticalDoubleAcute: '˝',\n DiacriticalGrave: '`',\n DiacriticalTilde: '˜',\n Diamond: '⋄',\n DifferentialD: 'ⅆ',\n Dopf: '𝔻',\n Dot: '¨',\n DotDot: '⃜',\n DotEqual: '≐',\n DoubleContourIntegral: '∯',\n DoubleDot: '¨',\n DoubleDownArrow: '⇓',\n DoubleLeftArrow: '⇐',\n DoubleLeftRightArrow: '⇔',\n DoubleLeftTee: '⫤',\n DoubleLongLeftArrow: '⟸',\n DoubleLongLeftRightArrow: '⟺',\n DoubleLongRightArrow: '⟹',\n DoubleRightArrow: '⇒',\n DoubleRightTee: '⊨',\n DoubleUpArrow: '⇑',\n DoubleUpDownArrow: '⇕',\n DoubleVerticalBar: '∥',\n DownArrow: '↓',\n DownArrowBar: '⤓',\n DownArrowUpArrow: '⇵',\n DownBreve: '̑',\n DownLeftRightVector: '⥐',\n DownLeftTeeVector: '⥞',\n DownLeftVector: '↽',\n DownLeftVectorBar: '⥖',\n DownRightTeeVector: '⥟',\n DownRightVector: '⇁',\n DownRightVectorBar: '⥗',\n DownTee: '⊤',\n DownTeeArrow: '↧',\n Downarrow: '⇓',\n Dscr: '𝒟',\n Dstrok: 'Đ',\n ENG: 'Ŋ',\n ETH: 'Ð',\n Eacute: 'É',\n Ecaron: 'Ě',\n Ecirc: 'Ê',\n Ecy: 'Э',\n Edot: 'Ė',\n Efr: '𝔈',\n Egrave: 'È',\n Element: '∈',\n Emacr: 'Ē',\n EmptySmallSquare: '◻',\n EmptyVerySmallSquare: '▫',\n Eogon: 'Ę',\n Eopf: '𝔼',\n Epsilon: 'Ε',\n Equal: '⩵',\n EqualTilde: '≂',\n Equilibrium: '⇌',\n Escr: 'ℰ',\n Esim: '⩳',\n Eta: 'Η',\n Euml: 'Ë',\n Exists: '∃',\n ExponentialE: 'ⅇ',\n Fcy: 'Ф',\n Ffr: '𝔉',\n FilledSmallSquare: '◼',\n FilledVerySmallSquare: '▪',\n Fopf: '𝔽',\n ForAll: '∀',\n Fouriertrf: 'ℱ',\n Fscr: 'ℱ',\n GJcy: 'Ѓ',\n GT: '>',\n Gamma: 'Γ',\n Gammad: 'Ϝ',\n Gbreve: 'Ğ',\n Gcedil: 'Ģ',\n Gcirc: 'Ĝ',\n Gcy: 'Г',\n Gdot: 'Ġ',\n Gfr: '𝔊',\n Gg: '⋙',\n Gopf: '𝔾',\n GreaterEqual: '≥',\n GreaterEqualLess: '⋛',\n GreaterFullEqual: '≧',\n GreaterGreater: '⪢',\n GreaterLess: '≷',\n GreaterSlantEqual: '⩾',\n GreaterTilde: '≳',\n Gscr: '𝒢',\n Gt: '≫',\n HARDcy: 'Ъ',\n Hacek: 'ˇ',\n Hat: '^',\n Hcirc: 'Ĥ',\n Hfr: 'ℌ',\n HilbertSpace: 'ℋ',\n Hopf: 'ℍ',\n HorizontalLine: '─',\n Hscr: 'ℋ',\n Hstrok: 'Ħ',\n HumpDownHump: '≎',\n HumpEqual: '≏',\n IEcy: 'Е',\n IJlig: 'IJ',\n IOcy: 'Ё',\n Iacute: 'Í',\n Icirc: 'Î',\n Icy: 'И',\n Idot: 'İ',\n Ifr: 'ℑ',\n Igrave: 'Ì',\n Im: 'ℑ',\n Imacr: 'Ī',\n ImaginaryI: 'ⅈ',\n Implies: '⇒',\n Int: '∬',\n Integral: '∫',\n Intersection: '⋂',\n InvisibleComma: '',\n InvisibleTimes: '',\n Iogon: 'Į',\n Iopf: '𝕀',\n Iota: 'Ι',\n Iscr: 'ℐ',\n Itilde: 'Ĩ',\n Iukcy: 'І',\n Iuml: 'Ï',\n Jcirc: 'Ĵ',\n Jcy: 'Й',\n Jfr: '𝔍',\n Jopf: '𝕁',\n Jscr: '𝒥',\n Jsercy: 'Ј',\n Jukcy: 'Є',\n KHcy: 'Х',\n KJcy: 'Ќ',\n Kappa: 'Κ',\n Kcedil: 'Ķ',\n Kcy: 'К',\n Kfr: '𝔎',\n Kopf: '𝕂',\n Kscr: '𝒦',\n LJcy: 'Љ',\n LT: '<',\n Lacute: 'Ĺ',\n Lambda: 'Λ',\n Lang: '⟪',\n Laplacetrf: 'ℒ',\n Larr: '↞',\n Lcaron: 'Ľ',\n Lcedil: 'Ļ',\n Lcy: 'Л',\n LeftAngleBracket: '⟨',\n LeftArrow: '←',\n LeftArrowBar: '⇤',\n LeftArrowRightArrow: '⇆',\n LeftCeiling: '⌈',\n LeftDoubleBracket: '⟦',\n LeftDownTeeVector: '⥡',\n LeftDownVector: '⇃',\n LeftDownVectorBar: '⥙',\n LeftFloor: '⌊',\n LeftRightArrow: '↔',\n LeftRightVector: '⥎',\n LeftTee: '⊣',\n LeftTeeArrow: '↤',\n LeftTeeVector: '⥚',\n LeftTriangle: '⊲',\n LeftTriangleBar: '⧏',\n LeftTriangleEqual: '⊴',\n LeftUpDownVector: '⥑',\n LeftUpTeeVector: '⥠',\n LeftUpVector: '↿',\n LeftUpVectorBar: '⥘',\n LeftVector: '↼',\n LeftVectorBar: '⥒',\n Leftarrow: '⇐',\n Leftrightarrow: '⇔',\n LessEqualGreater: '⋚',\n LessFullEqual: '≦',\n LessGreater: '≶',\n LessLess: '⪡',\n LessSlantEqual: '⩽',\n LessTilde: '≲',\n Lfr: '𝔏',\n Ll: '⋘',\n Lleftarrow: '⇚',\n Lmidot: 'Ŀ',\n LongLeftArrow: '⟵',\n LongLeftRightArrow: '⟷',\n LongRightArrow: '⟶',\n Longleftarrow: '⟸',\n Longleftrightarrow: '⟺',\n Longrightarrow: '⟹',\n Lopf: '𝕃',\n LowerLeftArrow: '↙',\n LowerRightArrow: '↘',\n Lscr: 'ℒ',\n Lsh: '↰',\n Lstrok: 'Ł',\n Lt: '≪',\n Map: '⤅',\n Mcy: 'М',\n MediumSpace: ' ',\n Mellintrf: 'ℳ',\n Mfr: '𝔐',\n MinusPlus: '∓',\n Mopf: '𝕄',\n Mscr: 'ℳ',\n Mu: 'Μ',\n NJcy: 'Њ',\n Nacute: 'Ń',\n Ncaron: 'Ň',\n Ncedil: 'Ņ',\n Ncy: 'Н',\n NegativeMediumSpace: '',\n NegativeThickSpace: '',\n NegativeThinSpace: '',\n NegativeVeryThinSpace: '',\n NestedGreaterGreater: '≫',\n NestedLessLess: '≪',\n NewLine: '\\n',\n Nfr: '𝔑',\n NoBreak: '',\n NonBreakingSpace: ' ',\n Nopf: 'ℕ',\n Not: '⫬',\n NotCongruent: '≢',\n NotCupCap: '≭',\n NotDoubleVerticalBar: '∦',\n NotElement: '∉',\n NotEqual: '≠',\n NotEqualTilde: '≂̸',\n NotExists: '∄',\n NotGreater: '≯',\n NotGreaterEqual: '≱',\n NotGreaterFullEqual: '≧̸',\n NotGreaterGreater: '≫̸',\n NotGreaterLess: '≹',\n NotGreaterSlantEqual: '⩾̸',\n NotGreaterTilde: '≵',\n NotHumpDownHump: '≎̸',\n NotHumpEqual: '≏̸',\n NotLeftTriangle: '⋪',\n NotLeftTriangleBar: '⧏̸',\n NotLeftTriangleEqual: '⋬',\n NotLess: '≮',\n NotLessEqual: '≰',\n NotLessGreater: '≸',\n NotLessLess: '≪̸',\n NotLessSlantEqual: '⩽̸',\n NotLessTilde: '≴',\n NotNestedGreaterGreater: '⪢̸',\n NotNestedLessLess: '⪡̸',\n NotPrecedes: '⊀',\n NotPrecedesEqual: '⪯̸',\n NotPrecedesSlantEqual: '⋠',\n NotReverseElement: '∌',\n NotRightTriangle: '⋫',\n NotRightTriangleBar: '⧐̸',\n NotRightTriangleEqual: '⋭',\n NotSquareSubset: '⊏̸',\n NotSquareSubsetEqual: '⋢',\n NotSquareSuperset: '⊐̸',\n NotSquareSupersetEqual: '⋣',\n NotSubset: '⊂⃒',\n NotSubsetEqual: '⊈',\n NotSucceeds: '⊁',\n NotSucceedsEqual: '⪰̸',\n NotSucceedsSlantEqual: '⋡',\n NotSucceedsTilde: '≿̸',\n NotSuperset: '⊃⃒',\n NotSupersetEqual: '⊉',\n NotTilde: '≁',\n NotTildeEqual: '≄',\n NotTildeFullEqual: '≇',\n NotTildeTilde: '≉',\n NotVerticalBar: '∤',\n Nscr: '𝒩',\n Ntilde: 'Ñ',\n Nu: 'Ν',\n OElig: 'Œ',\n Oacute: 'Ó',\n Ocirc: 'Ô',\n Ocy: 'О',\n Odblac: 'Ő',\n Ofr: '𝔒',\n Ograve: 'Ò',\n Omacr: 'Ō',\n Omega: 'Ω',\n Omicron: 'Ο',\n Oopf: '𝕆',\n OpenCurlyDoubleQuote: '“',\n OpenCurlyQuote: '‘',\n Or: '⩔',\n Oscr: '𝒪',\n Oslash: 'Ø',\n Otilde: 'Õ',\n Otimes: '⨷',\n Ouml: 'Ö',\n OverBar: '‾',\n OverBrace: '⏞',\n OverBracket: '⎴',\n OverParenthesis: '⏜',\n PartialD: '∂',\n Pcy: 'П',\n Pfr: '𝔓',\n Phi: 'Φ',\n Pi: 'Π',\n PlusMinus: '±',\n Poincareplane: 'ℌ',\n Popf: 'ℙ',\n Pr: '⪻',\n Precedes: '≺',\n PrecedesEqual: '⪯',\n PrecedesSlantEqual: '≼',\n PrecedesTilde: '≾',\n Prime: '″',\n Product: '∏',\n Proportion: '∷',\n Proportional: '∝',\n Pscr: '𝒫',\n Psi: 'Ψ',\n QUOT: '\"',\n Qfr: '𝔔',\n Qopf: 'ℚ',\n Qscr: '𝒬',\n RBarr: '⤐',\n REG: '®',\n Racute: 'Ŕ',\n Rang: '⟫',\n Rarr: '↠',\n Rarrtl: '⤖',\n Rcaron: 'Ř',\n Rcedil: 'Ŗ',\n Rcy: 'Р',\n Re: 'ℜ',\n ReverseElement: '∋',\n ReverseEquilibrium: '⇋',\n ReverseUpEquilibrium: '⥯',\n Rfr: 'ℜ',\n Rho: 'Ρ',\n RightAngleBracket: '⟩',\n RightArrow: '→',\n RightArrowBar: '⇥',\n RightArrowLeftArrow: '⇄',\n RightCeiling: '⌉',\n RightDoubleBracket: '⟧',\n RightDownTeeVector: '⥝',\n RightDownVector: '⇂',\n RightDownVectorBar: '⥕',\n RightFloor: '⌋',\n RightTee: '⊢',\n RightTeeArrow: '↦',\n RightTeeVector: '⥛',\n RightTriangle: '⊳',\n RightTriangleBar: '⧐',\n RightTriangleEqual: '⊵',\n RightUpDownVector: '⥏',\n RightUpTeeVector: '⥜',\n RightUpVector: '↾',\n RightUpVectorBar: '⥔',\n RightVector: '⇀',\n RightVectorBar: '⥓',\n Rightarrow: '⇒',\n Ropf: 'ℝ',\n RoundImplies: '⥰',\n Rrightarrow: '⇛',\n Rscr: 'ℛ',\n Rsh: '↱',\n RuleDelayed: '⧴',\n SHCHcy: 'Щ',\n SHcy: 'Ш',\n SOFTcy: 'Ь',\n Sacute: 'Ś',\n Sc: '⪼',\n Scaron: 'Š',\n Scedil: 'Ş',\n Scirc: 'Ŝ',\n Scy: 'С',\n Sfr: '𝔖',\n ShortDownArrow: '↓',\n ShortLeftArrow: '←',\n ShortRightArrow: '→',\n ShortUpArrow: '↑',\n Sigma: 'Σ',\n SmallCircle: '∘',\n Sopf: '𝕊',\n Sqrt: '√',\n Square: '□',\n SquareIntersection: '⊓',\n SquareSubset: '⊏',\n SquareSubsetEqual: '⊑',\n SquareSuperset: '⊐',\n SquareSupersetEqual: '⊒',\n SquareUnion: '⊔',\n Sscr: '𝒮',\n Star: '⋆',\n Sub: '⋐',\n Subset: '⋐',\n SubsetEqual: '⊆',\n Succeeds: '≻',\n SucceedsEqual: '⪰',\n SucceedsSlantEqual: '≽',\n SucceedsTilde: '≿',\n SuchThat: '∋',\n Sum: '∑',\n Sup: '⋑',\n Superset: '⊃',\n SupersetEqual: '⊇',\n Supset: '⋑',\n THORN: 'Þ',\n TRADE: '™',\n TSHcy: 'Ћ',\n TScy: 'Ц',\n Tab: '\\t',\n Tau: 'Τ',\n Tcaron: 'Ť',\n Tcedil: 'Ţ',\n Tcy: 'Т',\n Tfr: '𝔗',\n Therefore: '∴',\n Theta: 'Θ',\n ThickSpace: ' ',\n ThinSpace: ' ',\n Tilde: '∼',\n TildeEqual: '≃',\n TildeFullEqual: '≅',\n TildeTilde: '≈',\n Topf: '𝕋',\n TripleDot: '⃛',\n Tscr: '𝒯',\n Tstrok: 'Ŧ',\n Uacute: 'Ú',\n Uarr: '↟',\n Uarrocir: '⥉',\n Ubrcy: 'Ў',\n Ubreve: 'Ŭ',\n Ucirc: 'Û',\n Ucy: 'У',\n Udblac: 'Ű',\n Ufr: '𝔘',\n Ugrave: 'Ù',\n Umacr: 'Ū',\n UnderBar: '_',\n UnderBrace: '⏟',\n UnderBracket: '⎵',\n UnderParenthesis: '⏝',\n Union: '⋃',\n UnionPlus: '⊎',\n Uogon: 'Ų',\n Uopf: '𝕌',\n UpArrow: '↑',\n UpArrowBar: '⤒',\n UpArrowDownArrow: '⇅',\n UpDownArrow: '↕',\n UpEquilibrium: '⥮',\n UpTee: '⊥',\n UpTeeArrow: '↥',\n Uparrow: '⇑',\n Updownarrow: '⇕',\n UpperLeftArrow: '↖',\n UpperRightArrow: '↗',\n Upsi: 'ϒ',\n Upsilon: 'Υ',\n Uring: 'Ů',\n Uscr: '𝒰',\n Utilde: 'Ũ',\n Uuml: 'Ü',\n VDash: '⊫',\n Vbar: '⫫',\n Vcy: 'В',\n Vdash: '⊩',\n Vdashl: '⫦',\n Vee: '⋁',\n Verbar: '‖',\n Vert: '‖',\n VerticalBar: '∣',\n VerticalLine: '|',\n VerticalSeparator: '❘',\n VerticalTilde: '≀',\n VeryThinSpace: ' ',\n Vfr: '𝔙',\n Vopf: '𝕍',\n Vscr: '𝒱',\n Vvdash: '⊪',\n Wcirc: 'Ŵ',\n Wedge: '⋀',\n Wfr: '𝔚',\n Wopf: '𝕎',\n Wscr: '𝒲',\n Xfr: '𝔛',\n Xi: 'Ξ',\n Xopf: '𝕏',\n Xscr: '𝒳',\n YAcy: 'Я',\n YIcy: 'Ї',\n YUcy: 'Ю',\n Yacute: 'Ý',\n Ycirc: 'Ŷ',\n Ycy: 'Ы',\n Yfr: '𝔜',\n Yopf: '𝕐',\n Yscr: '𝒴',\n Yuml: 'Ÿ',\n ZHcy: 'Ж',\n Zacute: 'Ź',\n Zcaron: 'Ž',\n Zcy: 'З',\n Zdot: 'Ż',\n ZeroWidthSpace: '',\n Zeta: 'Ζ',\n Zfr: 'ℨ',\n Zopf: 'ℤ',\n Zscr: '𝒵',\n aacute: 'á',\n abreve: 'ă',\n ac: '∾',\n acE: '∾̳',\n acd: '∿',\n acirc: 'â',\n acute: '´',\n acy: 'а',\n aelig: 'æ',\n af: '',\n afr: '𝔞',\n agrave: 'à',\n alefsym: 'ℵ',\n aleph: 'ℵ',\n alpha: 'α',\n amacr: 'ā',\n amalg: '⨿',\n amp: '&',\n and: '∧',\n andand: '⩕',\n andd: '⩜',\n andslope: '⩘',\n andv: '⩚',\n ang: '∠',\n ange: '⦤',\n angle: '∠',\n angmsd: '∡',\n angmsdaa: '⦨',\n angmsdab: '⦩',\n angmsdac: '⦪',\n angmsdad: '⦫',\n angmsdae: '⦬',\n angmsdaf: '⦭',\n angmsdag: '⦮',\n angmsdah: '⦯',\n angrt: '∟',\n angrtvb: '⊾',\n angrtvbd: '⦝',\n angsph: '∢',\n angst: 'Å',\n angzarr: '⍼',\n aogon: 'ą',\n aopf: '𝕒',\n ap: '≈',\n apE: '⩰',\n apacir: '⩯',\n ape: '≊',\n apid: '≋',\n apos: \"'\",\n approx: '≈',\n approxeq: '≊',\n aring: 'å',\n ascr: '𝒶',\n ast: '*',\n asymp: '≈',\n asympeq: '≍',\n atilde: 'ã',\n auml: 'ä',\n awconint: '∳',\n awint: '⨑',\n bNot: '⫭',\n backcong: '≌',\n backepsilon: '϶',\n backprime: '‵',\n backsim: '∽',\n backsimeq: '⋍',\n barvee: '⊽',\n barwed: '⌅',\n barwedge: '⌅',\n bbrk: '⎵',\n bbrktbrk: '⎶',\n bcong: '≌',\n bcy: 'б',\n bdquo: '„',\n becaus: '∵',\n because: '∵',\n bemptyv: '⦰',\n bepsi: '϶',\n bernou: 'ℬ',\n beta: 'β',\n beth: 'ℶ',\n between: '≬',\n bfr: '𝔟',\n bigcap: '⋂',\n bigcirc: '◯',\n bigcup: '⋃',\n bigodot: '⨀',\n bigoplus: '⨁',\n bigotimes: '⨂',\n bigsqcup: '⨆',\n bigstar: '★',\n bigtriangledown: '▽',\n bigtriangleup: '△',\n biguplus: '⨄',\n bigvee: '⋁',\n bigwedge: '⋀',\n bkarow: '⤍',\n blacklozenge: '⧫',\n blacksquare: '▪',\n blacktriangle: '▴',\n blacktriangledown: '▾',\n blacktriangleleft: '◂',\n blacktriangleright: '▸',\n blank: '␣',\n blk12: '▒',\n blk14: '░',\n blk34: '▓',\n block: '█',\n bne: '=⃥',\n bnequiv: '≡⃥',\n bnot: '⌐',\n bopf: '𝕓',\n bot: '⊥',\n bottom: '⊥',\n bowtie: '⋈',\n boxDL: '╗',\n boxDR: '╔',\n boxDl: '╖',\n boxDr: '╓',\n boxH: '═',\n boxHD: '╦',\n boxHU: '╩',\n boxHd: '╤',\n boxHu: '╧',\n boxUL: '╝',\n boxUR: '╚',\n boxUl: '╜',\n boxUr: '╙',\n boxV: '║',\n boxVH: '╬',\n boxVL: '╣',\n boxVR: '╠',\n boxVh: '╫',\n boxVl: '╢',\n boxVr: '╟',\n boxbox: '⧉',\n boxdL: '╕',\n boxdR: '╒',\n boxdl: '┐',\n boxdr: '┌',\n boxh: '─',\n boxhD: '╥',\n boxhU: '╨',\n boxhd: '┬',\n boxhu: '┴',\n boxminus: '⊟',\n boxplus: '⊞',\n boxtimes: '⊠',\n boxuL: '╛',\n boxuR: '╘',\n boxul: '┘',\n boxur: '└',\n boxv: '│',\n boxvH: '╪',\n boxvL: '╡',\n boxvR: '╞',\n boxvh: '┼',\n boxvl: '┤',\n boxvr: '├',\n bprime: '‵',\n breve: '˘',\n brvbar: '¦',\n bscr: '𝒷',\n bsemi: '⁏',\n bsim: '∽',\n bsime: '⋍',\n bsol: '\\\\',\n bsolb: '⧅',\n bsolhsub: '⟈',\n bull: '•',\n bullet: '•',\n bump: '≎',\n bumpE: '⪮',\n bumpe: '≏',\n bumpeq: '≏',\n cacute: 'ć',\n cap: '∩',\n capand: '⩄',\n capbrcup: '⩉',\n capcap: '⩋',\n capcup: '⩇',\n capdot: '⩀',\n caps: '∩︀',\n caret: '⁁',\n caron: 'ˇ',\n ccaps: '⩍',\n ccaron: 'č',\n ccedil: 'ç',\n ccirc: 'ĉ',\n ccups: '⩌',\n ccupssm: '⩐',\n cdot: 'ċ',\n cedil: '¸',\n cemptyv: '⦲',\n cent: '¢',\n centerdot: '·',\n cfr: '𝔠',\n chcy: 'ч',\n check: '✓',\n checkmark: '✓',\n chi: 'χ',\n cir: '○',\n cirE: '⧃',\n circ: 'ˆ',\n circeq: '≗',\n circlearrowleft: '↺',\n circlearrowright: '↻',\n circledR: '®',\n circledS: 'Ⓢ',\n circledast: '⊛',\n circledcirc: '⊚',\n circleddash: '⊝',\n cire: '≗',\n cirfnint: '⨐',\n cirmid: '⫯',\n cirscir: '⧂',\n clubs: '♣',\n clubsuit: '♣',\n colon: ':',\n colone: '≔',\n coloneq: '≔',\n comma: ',',\n commat: '@',\n comp: '∁',\n compfn: '∘',\n complement: '∁',\n complexes: 'ℂ',\n cong: '≅',\n congdot: '⩭',\n conint: '∮',\n copf: '𝕔',\n coprod: '∐',\n copy: '©',\n copysr: '℗',\n crarr: '↵',\n cross: '✗',\n cscr: '𝒸',\n csub: '⫏',\n csube: '⫑',\n csup: '⫐',\n csupe: '⫒',\n ctdot: '⋯',\n cudarrl: '⤸',\n cudarrr: '⤵',\n cuepr: '⋞',\n cuesc: '⋟',\n cularr: '↶',\n cularrp: '⤽',\n cup: '∪',\n cupbrcap: '⩈',\n cupcap: '⩆',\n cupcup: '⩊',\n cupdot: '⊍',\n cupor: '⩅',\n cups: '∪︀',\n curarr: '↷',\n curarrm: '⤼',\n curlyeqprec: '⋞',\n curlyeqsucc: '⋟',\n curlyvee: '⋎',\n curlywedge: '⋏',\n curren: '¤',\n curvearrowleft: '↶',\n curvearrowright: '↷',\n cuvee: '⋎',\n cuwed: '⋏',\n cwconint: '∲',\n cwint: '∱',\n cylcty: '⌭',\n dArr: '⇓',\n dHar: '⥥',\n dagger: '†',\n daleth: 'ℸ',\n darr: '↓',\n dash: '‐',\n dashv: '⊣',\n dbkarow: '⤏',\n dblac: '˝',\n dcaron: 'ď',\n dcy: 'д',\n dd: 'ⅆ',\n ddagger: '‡',\n ddarr: '⇊',\n ddotseq: '⩷',\n deg: '°',\n delta: 'δ',\n demptyv: '⦱',\n dfisht: '⥿',\n dfr: '𝔡',\n dharl: '⇃',\n dharr: '⇂',\n diam: '⋄',\n diamond: '⋄',\n diamondsuit: '♦',\n diams: '♦',\n die: '¨',\n digamma: 'ϝ',\n disin: '⋲',\n div: '÷',\n divide: '÷',\n divideontimes: '⋇',\n divonx: '⋇',\n djcy: 'ђ',\n dlcorn: '⌞',\n dlcrop: '⌍',\n dollar: '$',\n dopf: '𝕕',\n dot: '˙',\n doteq: '≐',\n doteqdot: '≑',\n dotminus: '∸',\n dotplus: '∔',\n dotsquare: '⊡',\n doublebarwedge: '⌆',\n downarrow: '↓',\n downdownarrows: '⇊',\n downharpoonleft: '⇃',\n downharpoonright: '⇂',\n drbkarow: '⤐',\n drcorn: '⌟',\n drcrop: '⌌',\n dscr: '𝒹',\n dscy: 'ѕ',\n dsol: '⧶',\n dstrok: 'đ',\n dtdot: '⋱',\n dtri: '▿',\n dtrif: '▾',\n duarr: '⇵',\n duhar: '⥯',\n dwangle: '⦦',\n dzcy: 'џ',\n dzigrarr: '⟿',\n eDDot: '⩷',\n eDot: '≑',\n eacute: 'é',\n easter: '⩮',\n ecaron: 'ě',\n ecir: '≖',\n ecirc: 'ê',\n ecolon: '≕',\n ecy: 'э',\n edot: 'ė',\n ee: 'ⅇ',\n efDot: '≒',\n efr: '𝔢',\n eg: '⪚',\n egrave: 'è',\n egs: '⪖',\n egsdot: '⪘',\n el: '⪙',\n elinters: '⏧',\n ell: 'ℓ',\n els: '⪕',\n elsdot: '⪗',\n emacr: 'ē',\n empty: '∅',\n emptyset: '∅',\n emptyv: '∅',\n emsp13: ' ',\n emsp14: ' ',\n emsp: ' ',\n eng: 'ŋ',\n ensp: ' ',\n eogon: 'ę',\n eopf: '𝕖',\n epar: '⋕',\n eparsl: '⧣',\n eplus: '⩱',\n epsi: 'ε',\n epsilon: 'ε',\n epsiv: 'ϵ',\n eqcirc: '≖',\n eqcolon: '≕',\n eqsim: '≂',\n eqslantgtr: '⪖',\n eqslantless: '⪕',\n equals: '=',\n equest: '≟',\n equiv: '≡',\n equivDD: '⩸',\n eqvparsl: '⧥',\n erDot: '≓',\n erarr: '⥱',\n escr: 'ℯ',\n esdot: '≐',\n esim: '≂',\n eta: 'η',\n eth: 'ð',\n euml: 'ë',\n euro: '€',\n excl: '!',\n exist: '∃',\n expectation: 'ℰ',\n exponentiale: 'ⅇ',\n fallingdotseq: '≒',\n fcy: 'ф',\n female: '♀',\n ffilig: 'ffi',\n fflig: 'ff',\n ffllig: 'ffl',\n ffr: '𝔣',\n filig: 'fi',\n fjlig: 'fj',\n flat: '♭',\n fllig: 'fl',\n fltns: '▱',\n fnof: 'ƒ',\n fopf: '𝕗',\n forall: '∀',\n fork: '⋔',\n forkv: '⫙',\n fpartint: '⨍',\n frac12: '½',\n frac13: '⅓',\n frac14: '¼',\n frac15: '⅕',\n frac16: '⅙',\n frac18: '⅛',\n frac23: '⅔',\n frac25: '⅖',\n frac34: '¾',\n frac35: '⅗',\n frac38: '⅜',\n frac45: '⅘',\n frac56: '⅚',\n frac58: '⅝',\n frac78: '⅞',\n frasl: '⁄',\n frown: '⌢',\n fscr: '𝒻',\n gE: '≧',\n gEl: '⪌',\n gacute: 'ǵ',\n gamma: 'γ',\n gammad: 'ϝ',\n gap: '⪆',\n gbreve: 'ğ',\n gcirc: 'ĝ',\n gcy: 'г',\n gdot: 'ġ',\n ge: '≥',\n gel: '⋛',\n geq: '≥',\n geqq: '≧',\n geqslant: '⩾',\n ges: '⩾',\n gescc: '⪩',\n gesdot: '⪀',\n gesdoto: '⪂',\n gesdotol: '⪄',\n gesl: '⋛︀',\n gesles: '⪔',\n gfr: '𝔤',\n gg: '≫',\n ggg: '⋙',\n gimel: 'ℷ',\n gjcy: 'ѓ',\n gl: '≷',\n glE: '⪒',\n gla: '⪥',\n glj: '⪤',\n gnE: '≩',\n gnap: '⪊',\n gnapprox: '⪊',\n gne: '⪈',\n gneq: '⪈',\n gneqq: '≩',\n gnsim: '⋧',\n gopf: '𝕘',\n grave: '`',\n gscr: 'ℊ',\n gsim: '≳',\n gsime: '⪎',\n gsiml: '⪐',\n gt: '>',\n gtcc: '⪧',\n gtcir: '⩺',\n gtdot: '⋗',\n gtlPar: '⦕',\n gtquest: '⩼',\n gtrapprox: '⪆',\n gtrarr: '⥸',\n gtrdot: '⋗',\n gtreqless: '⋛',\n gtreqqless: '⪌',\n gtrless: '≷',\n gtrsim: '≳',\n gvertneqq: '≩︀',\n gvnE: '≩︀',\n hArr: '⇔',\n hairsp: ' ',\n half: '½',\n hamilt: 'ℋ',\n hardcy: 'ъ',\n harr: '↔',\n harrcir: '⥈',\n harrw: '↭',\n hbar: 'ℏ',\n hcirc: 'ĥ',\n hearts: '♥',\n heartsuit: '♥',\n hellip: '…',\n hercon: '⊹',\n hfr: '𝔥',\n hksearow: '⤥',\n hkswarow: '⤦',\n hoarr: '⇿',\n homtht: '∻',\n hookleftarrow: '↩',\n hookrightarrow: '↪',\n hopf: '𝕙',\n horbar: '―',\n hscr: '𝒽',\n hslash: 'ℏ',\n hstrok: 'ħ',\n hybull: '⁃',\n hyphen: '‐',\n iacute: 'í',\n ic: '',\n icirc: 'î',\n icy: 'и',\n iecy: 'е',\n iexcl: '¡',\n iff: '⇔',\n ifr: '𝔦',\n igrave: 'ì',\n ii: 'ⅈ',\n iiiint: '⨌',\n iiint: '∭',\n iinfin: '⧜',\n iiota: '℩',\n ijlig: 'ij',\n imacr: 'ī',\n image: 'ℑ',\n imagline: 'ℐ',\n imagpart: 'ℑ',\n imath: 'ı',\n imof: '⊷',\n imped: 'Ƶ',\n in: '∈',\n incare: '℅',\n infin: '∞',\n infintie: '⧝',\n inodot: 'ı',\n int: '∫',\n intcal: '⊺',\n integers: 'ℤ',\n intercal: '⊺',\n intlarhk: '⨗',\n intprod: '⨼',\n iocy: 'ё',\n iogon: 'į',\n iopf: '𝕚',\n iota: 'ι',\n iprod: '⨼',\n iquest: '¿',\n iscr: '𝒾',\n isin: '∈',\n isinE: '⋹',\n isindot: '⋵',\n isins: '⋴',\n isinsv: '⋳',\n isinv: '∈',\n it: '',\n itilde: 'ĩ',\n iukcy: 'і',\n iuml: 'ï',\n jcirc: 'ĵ',\n jcy: 'й',\n jfr: '𝔧',\n jmath: 'ȷ',\n jopf: '𝕛',\n jscr: '𝒿',\n jsercy: 'ј',\n jukcy: 'є',\n kappa: 'κ',\n kappav: 'ϰ',\n kcedil: 'ķ',\n kcy: 'к',\n kfr: '𝔨',\n kgreen: 'ĸ',\n khcy: 'х',\n kjcy: 'ќ',\n kopf: '𝕜',\n kscr: '𝓀',\n lAarr: '⇚',\n lArr: '⇐',\n lAtail: '⤛',\n lBarr: '⤎',\n lE: '≦',\n lEg: '⪋',\n lHar: '⥢',\n lacute: 'ĺ',\n laemptyv: '⦴',\n lagran: 'ℒ',\n lambda: 'λ',\n lang: '⟨',\n langd: '⦑',\n langle: '⟨',\n lap: '⪅',\n laquo: '«',\n larr: '←',\n larrb: '⇤',\n larrbfs: '⤟',\n larrfs: '⤝',\n larrhk: '↩',\n larrlp: '↫',\n larrpl: '⤹',\n larrsim: '⥳',\n larrtl: '↢',\n lat: '⪫',\n latail: '⤙',\n late: '⪭',\n lates: '⪭︀',\n lbarr: '⤌',\n lbbrk: '❲',\n lbrace: '{',\n lbrack: '[',\n lbrke: '⦋',\n lbrksld: '⦏',\n lbrkslu: '⦍',\n lcaron: 'ľ',\n lcedil: 'ļ',\n lceil: '⌈',\n lcub: '{',\n lcy: 'л',\n ldca: '⤶',\n ldquo: '“',\n ldquor: '„',\n ldrdhar: '⥧',\n ldrushar: '⥋',\n ldsh: '↲',\n le: '≤',\n leftarrow: '←',\n leftarrowtail: '↢',\n leftharpoondown: '↽',\n leftharpoonup: '↼',\n leftleftarrows: '⇇',\n leftrightarrow: '↔',\n leftrightarrows: '⇆',\n leftrightharpoons: '⇋',\n leftrightsquigarrow: '↭',\n leftthreetimes: '⋋',\n leg: '⋚',\n leq: '≤',\n leqq: '≦',\n leqslant: '⩽',\n les: '⩽',\n lescc: '⪨',\n lesdot: '⩿',\n lesdoto: '⪁',\n lesdotor: '⪃',\n lesg: '⋚︀',\n lesges: '⪓',\n lessapprox: '⪅',\n lessdot: '⋖',\n lesseqgtr: '⋚',\n lesseqqgtr: '⪋',\n lessgtr: '≶',\n lesssim: '≲',\n lfisht: '⥼',\n lfloor: '⌊',\n lfr: '𝔩',\n lg: '≶',\n lgE: '⪑',\n lhard: '↽',\n lharu: '↼',\n lharul: '⥪',\n lhblk: '▄',\n ljcy: 'љ',\n ll: '≪',\n llarr: '⇇',\n llcorner: '⌞',\n llhard: '⥫',\n lltri: '◺',\n lmidot: 'ŀ',\n lmoust: '⎰',\n lmoustache: '⎰',\n lnE: '≨',\n lnap: '⪉',\n lnapprox: '⪉',\n lne: '⪇',\n lneq: '⪇',\n lneqq: '≨',\n lnsim: '⋦',\n loang: '⟬',\n loarr: '⇽',\n lobrk: '⟦',\n longleftarrow: '⟵',\n longleftrightarrow: '⟷',\n longmapsto: '⟼',\n longrightarrow: '⟶',\n looparrowleft: '↫',\n looparrowright: '↬',\n lopar: '⦅',\n lopf: '𝕝',\n loplus: '⨭',\n lotimes: '⨴',\n lowast: '∗',\n lowbar: '_',\n loz: '◊',\n lozenge: '◊',\n lozf: '⧫',\n lpar: '(',\n lparlt: '⦓',\n lrarr: '⇆',\n lrcorner: '⌟',\n lrhar: '⇋',\n lrhard: '⥭',\n lrm: '',\n lrtri: '⊿',\n lsaquo: '‹',\n lscr: '𝓁',\n lsh: '↰',\n lsim: '≲',\n lsime: '⪍',\n lsimg: '⪏',\n lsqb: '[',\n lsquo: '‘',\n lsquor: '‚',\n lstrok: 'ł',\n lt: '<',\n ltcc: '⪦',\n ltcir: '⩹',\n ltdot: '⋖',\n lthree: '⋋',\n ltimes: '⋉',\n ltlarr: '⥶',\n ltquest: '⩻',\n ltrPar: '⦖',\n ltri: '◃',\n ltrie: '⊴',\n ltrif: '◂',\n lurdshar: '⥊',\n luruhar: '⥦',\n lvertneqq: '≨︀',\n lvnE: '≨︀',\n mDDot: '∺',\n macr: '¯',\n male: '♂',\n malt: '✠',\n maltese: '✠',\n map: '↦',\n mapsto: '↦',\n mapstodown: '↧',\n mapstoleft: '↤',\n mapstoup: '↥',\n marker: '▮',\n mcomma: '⨩',\n mcy: 'м',\n mdash: '—',\n measuredangle: '∡',\n mfr: '𝔪',\n mho: '℧',\n micro: 'µ',\n mid: '∣',\n midast: '*',\n midcir: '⫰',\n middot: '·',\n minus: '−',\n minusb: '⊟',\n minusd: '∸',\n minusdu: '⨪',\n mlcp: '⫛',\n mldr: '…',\n mnplus: '∓',\n models: '⊧',\n mopf: '𝕞',\n mp: '∓',\n mscr: '𝓂',\n mstpos: '∾',\n mu: 'μ',\n multimap: '⊸',\n mumap: '⊸',\n nGg: '⋙̸',\n nGt: '≫⃒',\n nGtv: '≫̸',\n nLeftarrow: '⇍',\n nLeftrightarrow: '⇎',\n nLl: '⋘̸',\n nLt: '≪⃒',\n nLtv: '≪̸',\n nRightarrow: '⇏',\n nVDash: '⊯',\n nVdash: '⊮',\n nabla: '∇',\n nacute: 'ń',\n nang: '∠⃒',\n nap: '≉',\n napE: '⩰̸',\n napid: '≋̸',\n napos: 'ʼn',\n napprox: '≉',\n natur: '♮',\n natural: '♮',\n naturals: 'ℕ',\n nbsp: ' ',\n nbump: '≎̸',\n nbumpe: '≏̸',\n ncap: '⩃',\n ncaron: 'ň',\n ncedil: 'ņ',\n ncong: '≇',\n ncongdot: '⩭̸',\n ncup: '⩂',\n ncy: 'н',\n ndash: '–',\n ne: '≠',\n neArr: '⇗',\n nearhk: '⤤',\n nearr: '↗',\n nearrow: '↗',\n nedot: '≐̸',\n nequiv: '≢',\n nesear: '⤨',\n nesim: '≂̸',\n nexist: '∄',\n nexists: '∄',\n nfr: '𝔫',\n ngE: '≧̸',\n nge: '≱',\n ngeq: '≱',\n ngeqq: '≧̸',\n ngeqslant: '⩾̸',\n nges: '⩾̸',\n ngsim: '≵',\n ngt: '≯',\n ngtr: '≯',\n nhArr: '⇎',\n nharr: '↮',\n nhpar: '⫲',\n ni: '∋',\n nis: '⋼',\n nisd: '⋺',\n niv: '∋',\n njcy: 'њ',\n nlArr: '⇍',\n nlE: '≦̸',\n nlarr: '↚',\n nldr: '‥',\n nle: '≰',\n nleftarrow: '↚',\n nleftrightarrow: '↮',\n nleq: '≰',\n nleqq: '≦̸',\n nleqslant: '⩽̸',\n nles: '⩽̸',\n nless: '≮',\n nlsim: '≴',\n nlt: '≮',\n nltri: '⋪',\n nltrie: '⋬',\n nmid: '∤',\n nopf: '𝕟',\n not: '¬',\n notin: '∉',\n notinE: '⋹̸',\n notindot: '⋵̸',\n notinva: '∉',\n notinvb: '⋷',\n notinvc: '⋶',\n notni: '∌',\n notniva: '∌',\n notnivb: '⋾',\n notnivc: '⋽',\n npar: '∦',\n nparallel: '∦',\n nparsl: '⫽⃥',\n npart: '∂̸',\n npolint: '⨔',\n npr: '⊀',\n nprcue: '⋠',\n npre: '⪯̸',\n nprec: '⊀',\n npreceq: '⪯̸',\n nrArr: '⇏',\n nrarr: '↛',\n nrarrc: '⤳̸',\n nrarrw: '↝̸',\n nrightarrow: '↛',\n nrtri: '⋫',\n nrtrie: '⋭',\n nsc: '⊁',\n nsccue: '⋡',\n nsce: '⪰̸',\n nscr: '𝓃',\n nshortmid: '∤',\n nshortparallel: '∦',\n nsim: '≁',\n nsime: '≄',\n nsimeq: '≄',\n nsmid: '∤',\n nspar: '∦',\n nsqsube: '⋢',\n nsqsupe: '⋣',\n nsub: '⊄',\n nsubE: '⫅̸',\n nsube: '⊈',\n nsubset: '⊂⃒',\n nsubseteq: '⊈',\n nsubseteqq: '⫅̸',\n nsucc: '⊁',\n nsucceq: '⪰̸',\n nsup: '⊅',\n nsupE: '⫆̸',\n nsupe: '⊉',\n nsupset: '⊃⃒',\n nsupseteq: '⊉',\n nsupseteqq: '⫆̸',\n ntgl: '≹',\n ntilde: 'ñ',\n ntlg: '≸',\n ntriangleleft: '⋪',\n ntrianglelefteq: '⋬',\n ntriangleright: '⋫',\n ntrianglerighteq: '⋭',\n nu: 'ν',\n num: '#',\n numero: '№',\n numsp: ' ',\n nvDash: '⊭',\n nvHarr: '⤄',\n nvap: '≍⃒',\n nvdash: '⊬',\n nvge: '≥⃒',\n nvgt: '>⃒',\n nvinfin: '⧞',\n nvlArr: '⤂',\n nvle: '≤⃒',\n nvlt: '<⃒',\n nvltrie: '⊴⃒',\n nvrArr: '⤃',\n nvrtrie: '⊵⃒',\n nvsim: '∼⃒',\n nwArr: '⇖',\n nwarhk: '⤣',\n nwarr: '↖',\n nwarrow: '↖',\n nwnear: '⤧',\n oS: 'Ⓢ',\n oacute: 'ó',\n oast: '⊛',\n ocir: '⊚',\n ocirc: 'ô',\n ocy: 'о',\n odash: '⊝',\n odblac: 'ő',\n odiv: '⨸',\n odot: '⊙',\n odsold: '⦼',\n oelig: 'œ',\n ofcir: '⦿',\n ofr: '𝔬',\n ogon: '˛',\n ograve: 'ò',\n ogt: '⧁',\n ohbar: '⦵',\n ohm: 'Ω',\n oint: '∮',\n olarr: '↺',\n olcir: '⦾',\n olcross: '⦻',\n oline: '‾',\n olt: '⧀',\n omacr: 'ō',\n omega: 'ω',\n omicron: 'ο',\n omid: '⦶',\n ominus: '⊖',\n oopf: '𝕠',\n opar: '⦷',\n operp: '⦹',\n oplus: '⊕',\n or: '∨',\n orarr: '↻',\n ord: '⩝',\n order: 'ℴ',\n orderof: 'ℴ',\n ordf: 'ª',\n ordm: 'º',\n origof: '⊶',\n oror: '⩖',\n orslope: '⩗',\n orv: '⩛',\n oscr: 'ℴ',\n oslash: 'ø',\n osol: '⊘',\n otilde: 'õ',\n otimes: '⊗',\n otimesas: '⨶',\n ouml: 'ö',\n ovbar: '⌽',\n par: '∥',\n para: '¶',\n parallel: '∥',\n parsim: '⫳',\n parsl: '⫽',\n part: '∂',\n pcy: 'п',\n percnt: '%',\n period: '.',\n permil: '‰',\n perp: '⊥',\n pertenk: '‱',\n pfr: '𝔭',\n phi: 'φ',\n phiv: 'ϕ',\n phmmat: 'ℳ',\n phone: '☎',\n pi: 'π',\n pitchfork: '⋔',\n piv: 'ϖ',\n planck: 'ℏ',\n planckh: 'ℎ',\n plankv: 'ℏ',\n plus: '+',\n plusacir: '⨣',\n plusb: '⊞',\n pluscir: '⨢',\n plusdo: '∔',\n plusdu: '⨥',\n pluse: '⩲',\n plusmn: '±',\n plussim: '⨦',\n plustwo: '⨧',\n pm: '±',\n pointint: '⨕',\n popf: '𝕡',\n pound: '£',\n pr: '≺',\n prE: '⪳',\n prap: '⪷',\n prcue: '≼',\n pre: '⪯',\n prec: '≺',\n precapprox: '⪷',\n preccurlyeq: '≼',\n preceq: '⪯',\n precnapprox: '⪹',\n precneqq: '⪵',\n precnsim: '⋨',\n precsim: '≾',\n prime: '′',\n primes: 'ℙ',\n prnE: '⪵',\n prnap: '⪹',\n prnsim: '⋨',\n prod: '∏',\n profalar: '⌮',\n profline: '⌒',\n profsurf: '⌓',\n prop: '∝',\n propto: '∝',\n prsim: '≾',\n prurel: '⊰',\n pscr: '𝓅',\n psi: 'ψ',\n puncsp: ' ',\n qfr: '𝔮',\n qint: '⨌',\n qopf: '𝕢',\n qprime: '⁗',\n qscr: '𝓆',\n quaternions: 'ℍ',\n quatint: '⨖',\n quest: '?',\n questeq: '≟',\n quot: '\"',\n rAarr: '⇛',\n rArr: '⇒',\n rAtail: '⤜',\n rBarr: '⤏',\n rHar: '⥤',\n race: '∽̱',\n racute: 'ŕ',\n radic: '√',\n raemptyv: '⦳',\n rang: '⟩',\n rangd: '⦒',\n range: '⦥',\n rangle: '⟩',\n raquo: '»',\n rarr: '→',\n rarrap: '⥵',\n rarrb: '⇥',\n rarrbfs: '⤠',\n rarrc: '⤳',\n rarrfs: '⤞',\n rarrhk: '↪',\n rarrlp: '↬',\n rarrpl: '⥅',\n rarrsim: '⥴',\n rarrtl: '↣',\n rarrw: '↝',\n ratail: '⤚',\n ratio: '∶',\n rationals: 'ℚ',\n rbarr: '⤍',\n rbbrk: '❳',\n rbrace: '}',\n rbrack: ']',\n rbrke: '⦌',\n rbrksld: '⦎',\n rbrkslu: '⦐',\n rcaron: 'ř',\n rcedil: 'ŗ',\n rceil: '⌉',\n rcub: '}',\n rcy: 'р',\n rdca: '⤷',\n rdldhar: '⥩',\n rdquo: '”',\n rdquor: '”',\n rdsh: '↳',\n real: 'ℜ',\n realine: 'ℛ',\n realpart: 'ℜ',\n reals: 'ℝ',\n rect: '▭',\n reg: '®',\n rfisht: '⥽',\n rfloor: '⌋',\n rfr: '𝔯',\n rhard: '⇁',\n rharu: '⇀',\n rharul: '⥬',\n rho: 'ρ',\n rhov: 'ϱ',\n rightarrow: '→',\n rightarrowtail: '↣',\n rightharpoondown: '⇁',\n rightharpoonup: '⇀',\n rightleftarrows: '⇄',\n rightleftharpoons: '⇌',\n rightrightarrows: '⇉',\n rightsquigarrow: '↝',\n rightthreetimes: '⋌',\n ring: '˚',\n risingdotseq: '≓',\n rlarr: '⇄',\n rlhar: '⇌',\n rlm: '',\n rmoust: '⎱',\n rmoustache: '⎱',\n rnmid: '⫮',\n roang: '⟭',\n roarr: '⇾',\n robrk: '⟧',\n ropar: '⦆',\n ropf: '𝕣',\n roplus: '⨮',\n rotimes: '⨵',\n rpar: ')',\n rpargt: '⦔',\n rppolint: '⨒',\n rrarr: '⇉',\n rsaquo: '›',\n rscr: '𝓇',\n rsh: '↱',\n rsqb: ']',\n rsquo: '’',\n rsquor: '’',\n rthree: '⋌',\n rtimes: '⋊',\n rtri: '▹',\n rtrie: '⊵',\n rtrif: '▸',\n rtriltri: '⧎',\n ruluhar: '⥨',\n rx: '℞',\n sacute: 'ś',\n sbquo: '‚',\n sc: '≻',\n scE: '⪴',\n scap: '⪸',\n scaron: 'š',\n sccue: '≽',\n sce: '⪰',\n scedil: 'ş',\n scirc: 'ŝ',\n scnE: '⪶',\n scnap: '⪺',\n scnsim: '⋩',\n scpolint: '⨓',\n scsim: '≿',\n scy: 'с',\n sdot: '⋅',\n sdotb: '⊡',\n sdote: '⩦',\n seArr: '⇘',\n searhk: '⤥',\n searr: '↘',\n searrow: '↘',\n sect: '§',\n semi: ';',\n seswar: '⤩',\n setminus: '∖',\n setmn: '∖',\n sext: '✶',\n sfr: '𝔰',\n sfrown: '⌢',\n sharp: '♯',\n shchcy: 'щ',\n shcy: 'ш',\n shortmid: '∣',\n shortparallel: '∥',\n shy: '',\n sigma: 'σ',\n sigmaf: 'ς',\n sigmav: 'ς',\n sim: '∼',\n simdot: '⩪',\n sime: '≃',\n simeq: '≃',\n simg: '⪞',\n simgE: '⪠',\n siml: '⪝',\n simlE: '⪟',\n simne: '≆',\n simplus: '⨤',\n simrarr: '⥲',\n slarr: '←',\n smallsetminus: '∖',\n smashp: '⨳',\n smeparsl: '⧤',\n smid: '∣',\n smile: '⌣',\n smt: '⪪',\n smte: '⪬',\n smtes: '⪬︀',\n softcy: 'ь',\n sol: '/',\n solb: '⧄',\n solbar: '⌿',\n sopf: '𝕤',\n spades: '♠',\n spadesuit: '♠',\n spar: '∥',\n sqcap: '⊓',\n sqcaps: '⊓︀',\n sqcup: '⊔',\n sqcups: '⊔︀',\n sqsub: '⊏',\n sqsube: '⊑',\n sqsubset: '⊏',\n sqsubseteq: '⊑',\n sqsup: '⊐',\n sqsupe: '⊒',\n sqsupset: '⊐',\n sqsupseteq: '⊒',\n squ: '□',\n square: '□',\n squarf: '▪',\n squf: '▪',\n srarr: '→',\n sscr: '𝓈',\n ssetmn: '∖',\n ssmile: '⌣',\n sstarf: '⋆',\n star: '☆',\n starf: '★',\n straightepsilon: 'ϵ',\n straightphi: 'ϕ',\n strns: '¯',\n sub: '⊂',\n subE: '⫅',\n subdot: '⪽',\n sube: '⊆',\n subedot: '⫃',\n submult: '⫁',\n subnE: '⫋',\n subne: '⊊',\n subplus: '⪿',\n subrarr: '⥹',\n subset: '⊂',\n subseteq: '⊆',\n subseteqq: '⫅',\n subsetneq: '⊊',\n subsetneqq: '⫋',\n subsim: '⫇',\n subsub: '⫕',\n subsup: '⫓',\n succ: '≻',\n succapprox: '⪸',\n succcurlyeq: '≽',\n succeq: '⪰',\n succnapprox: '⪺',\n succneqq: '⪶',\n succnsim: '⋩',\n succsim: '≿',\n sum: '∑',\n sung: '♪',\n sup1: '¹',\n sup2: '²',\n sup3: '³',\n sup: '⊃',\n supE: '⫆',\n supdot: '⪾',\n supdsub: '⫘',\n supe: '⊇',\n supedot: '⫄',\n suphsol: '⟉',\n suphsub: '⫗',\n suplarr: '⥻',\n supmult: '⫂',\n supnE: '⫌',\n supne: '⊋',\n supplus: '⫀',\n supset: '⊃',\n supseteq: '⊇',\n supseteqq: '⫆',\n supsetneq: '⊋',\n supsetneqq: '⫌',\n supsim: '⫈',\n supsub: '⫔',\n supsup: '⫖',\n swArr: '⇙',\n swarhk: '⤦',\n swarr: '↙',\n swarrow: '↙',\n swnwar: '⤪',\n szlig: 'ß',\n target: '⌖',\n tau: 'τ',\n tbrk: '⎴',\n tcaron: 'ť',\n tcedil: 'ţ',\n tcy: 'т',\n tdot: '⃛',\n telrec: '⌕',\n tfr: '𝔱',\n there4: '∴',\n therefore: '∴',\n theta: 'θ',\n thetasym: 'ϑ',\n thetav: 'ϑ',\n thickapprox: '≈',\n thicksim: '∼',\n thinsp: ' ',\n thkap: '≈',\n thksim: '∼',\n thorn: 'þ',\n tilde: '˜',\n times: '×',\n timesb: '⊠',\n timesbar: '⨱',\n timesd: '⨰',\n tint: '∭',\n toea: '⤨',\n top: '⊤',\n topbot: '⌶',\n topcir: '⫱',\n topf: '𝕥',\n topfork: '⫚',\n tosa: '⤩',\n tprime: '‴',\n trade: '™',\n triangle: '▵',\n triangledown: '▿',\n triangleleft: '◃',\n trianglelefteq: '⊴',\n triangleq: '≜',\n triangleright: '▹',\n trianglerighteq: '⊵',\n tridot: '◬',\n trie: '≜',\n triminus: '⨺',\n triplus: '⨹',\n trisb: '⧍',\n tritime: '⨻',\n trpezium: '⏢',\n tscr: '𝓉',\n tscy: 'ц',\n tshcy: 'ћ',\n tstrok: 'ŧ',\n twixt: '≬',\n twoheadleftarrow: '↞',\n twoheadrightarrow: '↠',\n uArr: '⇑',\n uHar: '⥣',\n uacute: 'ú',\n uarr: '↑',\n ubrcy: 'ў',\n ubreve: 'ŭ',\n ucirc: 'û',\n ucy: 'у',\n udarr: '⇅',\n udblac: 'ű',\n udhar: '⥮',\n ufisht: '⥾',\n ufr: '𝔲',\n ugrave: 'ù',\n uharl: '↿',\n uharr: '↾',\n uhblk: '▀',\n ulcorn: '⌜',\n ulcorner: '⌜',\n ulcrop: '⌏',\n ultri: '◸',\n umacr: 'ū',\n uml: '¨',\n uogon: 'ų',\n uopf: '𝕦',\n uparrow: '↑',\n updownarrow: '↕',\n upharpoonleft: '↿',\n upharpoonright: '↾',\n uplus: '⊎',\n upsi: 'υ',\n upsih: 'ϒ',\n upsilon: 'υ',\n upuparrows: '⇈',\n urcorn: '⌝',\n urcorner: '⌝',\n urcrop: '⌎',\n uring: 'ů',\n urtri: '◹',\n uscr: '𝓊',\n utdot: '⋰',\n utilde: 'ũ',\n utri: '▵',\n utrif: '▴',\n uuarr: '⇈',\n uuml: 'ü',\n uwangle: '⦧',\n vArr: '⇕',\n vBar: '⫨',\n vBarv: '⫩',\n vDash: '⊨',\n vangrt: '⦜',\n varepsilon: 'ϵ',\n varkappa: 'ϰ',\n varnothing: '∅',\n varphi: 'ϕ',\n varpi: 'ϖ',\n varpropto: '∝',\n varr: '↕',\n varrho: 'ϱ',\n varsigma: 'ς',\n varsubsetneq: '⊊︀',\n varsubsetneqq: '⫋︀',\n varsupsetneq: '⊋︀',\n varsupsetneqq: '⫌︀',\n vartheta: 'ϑ',\n vartriangleleft: '⊲',\n vartriangleright: '⊳',\n vcy: 'в',\n vdash: '⊢',\n vee: '∨',\n veebar: '⊻',\n veeeq: '≚',\n vellip: '⋮',\n verbar: '|',\n vert: '|',\n vfr: '𝔳',\n vltri: '⊲',\n vnsub: '⊂⃒',\n vnsup: '⊃⃒',\n vopf: '𝕧',\n vprop: '∝',\n vrtri: '⊳',\n vscr: '𝓋',\n vsubnE: '⫋︀',\n vsubne: '⊊︀',\n vsupnE: '⫌︀',\n vsupne: '⊋︀',\n vzigzag: '⦚',\n wcirc: 'ŵ',\n wedbar: '⩟',\n wedge: '∧',\n wedgeq: '≙',\n weierp: '℘',\n wfr: '𝔴',\n wopf: '𝕨',\n wp: '℘',\n wr: '≀',\n wreath: '≀',\n wscr: '𝓌',\n xcap: '⋂',\n xcirc: '◯',\n xcup: '⋃',\n xdtri: '▽',\n xfr: '𝔵',\n xhArr: '⟺',\n xharr: '⟷',\n xi: 'ξ',\n xlArr: '⟸',\n xlarr: '⟵',\n xmap: '⟼',\n xnis: '⋻',\n xodot: '⨀',\n xopf: '𝕩',\n xoplus: '⨁',\n xotime: '⨂',\n xrArr: '⟹',\n xrarr: '⟶',\n xscr: '𝓍',\n xsqcup: '⨆',\n xuplus: '⨄',\n xutri: '△',\n xvee: '⋁',\n xwedge: '⋀',\n yacute: 'ý',\n yacy: 'я',\n ycirc: 'ŷ',\n ycy: 'ы',\n yen: '¥',\n yfr: '𝔶',\n yicy: 'ї',\n yopf: '𝕪',\n yscr: '𝓎',\n yucy: 'ю',\n yuml: 'ÿ',\n zacute: 'ź',\n zcaron: 'ž',\n zcy: 'з',\n zdot: 'ż',\n zeetrf: 'ℨ',\n zeta: 'ζ',\n zfr: '𝔷',\n zhcy: 'ж',\n zigrarr: '⇝',\n zopf: '𝕫',\n zscr: '𝓏',\n zwj: '',\n zwnj: ''\n}\n","import {characterEntities} from 'character-entities'\n\nconst own = {}.hasOwnProperty\n\n/**\n * Decode a single character reference (without the `&` or `;`).\n * You probably only need this when you’re building parsers yourself that follow\n * different rules compared to HTML.\n * This is optimized to be tiny in browsers.\n *\n * @param {string} value\n * `notin` (named), `#123` (deci), `#x123` (hexa).\n * @returns {string|false}\n * Decoded reference.\n */\nexport function decodeNamedCharacterReference(value) {\n return own.call(characterEntities, value) ? characterEntities[value] : false\n}\n","/**\n * Like `Array#splice`, but smarter for giant arrays.\n *\n * `Array#splice` takes all items to be inserted as individual argument which\n * causes a stack overflow in V8 when trying to insert 100k items for instance.\n *\n * Otherwise, this does not return the removed items, and takes `items` as an\n * array instead of rest parameters.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {number} start\n * Index to remove/insert at (can be negative).\n * @param {number} remove\n * Number of items to remove.\n * @param {Array<T>} items\n * Items to inject into `list`.\n * @returns {undefined}\n * Nothing.\n */\nexport function splice(list, start, remove, items) {\n const end = list.length\n let chunkStart = 0\n /** @type {Array<unknown>} */\n let parameters\n\n // Make start between zero and `end` (included).\n if (start < 0) {\n start = -start > end ? 0 : end + start\n } else {\n start = start > end ? end : start\n }\n remove = remove > 0 ? remove : 0\n\n // No need to chunk the items if there’s only a couple (10k) items.\n if (items.length < 10000) {\n parameters = Array.from(items)\n parameters.unshift(start, remove)\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters)\n } else {\n // Delete `remove` items starting from `start`\n if (remove) list.splice(start, remove)\n\n // Insert the items in chunks to not cause stack overflows.\n while (chunkStart < items.length) {\n parameters = items.slice(chunkStart, chunkStart + 10000)\n parameters.unshift(start, 0)\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters)\n chunkStart += 10000\n start += 10000\n }\n }\n}\n\n/**\n * Append `items` (an array) at the end of `list` (another array).\n * When `list` was empty, returns `items` instead.\n *\n * This prevents a potentially expensive operation when `list` is empty,\n * and adds items in batches to prevent V8 from hanging.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {Array<T>} items\n * Items to add to `list`.\n * @returns {Array<T>}\n * Either `list` or `items`.\n */\nexport function push(list, items) {\n if (list.length > 0) {\n splice(list, list.length, 0, items)\n return list\n }\n return items\n}\n","/**\n * @typedef {import('micromark-util-types').Extension} Extension\n * @typedef {import('micromark-util-types').Handles} Handles\n * @typedef {import('micromark-util-types').HtmlExtension} HtmlExtension\n * @typedef {import('micromark-util-types').NormalizedExtension} NormalizedExtension\n */\n\nimport {splice} from 'micromark-util-chunked'\n\nconst hasOwnProperty = {}.hasOwnProperty\n\n/**\n * Combine multiple syntax extensions into one.\n *\n * @param {Array<Extension>} extensions\n * List of syntax extensions.\n * @returns {NormalizedExtension}\n * A single combined extension.\n */\nexport function combineExtensions(extensions) {\n /** @type {NormalizedExtension} */\n const all = {}\n let index = -1\n\n while (++index < extensions.length) {\n syntaxExtension(all, extensions[index])\n }\n\n return all\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {NormalizedExtension} all\n * Extension to merge into.\n * @param {Extension} extension\n * Extension to merge.\n * @returns {undefined}\n */\nfunction syntaxExtension(all, extension) {\n /** @type {keyof Extension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n /** @type {Record<string, unknown>} */\n const left = maybe || (all[hook] = {})\n /** @type {Record<string, unknown> | undefined} */\n const right = extension[hook]\n /** @type {string} */\n let code\n\n if (right) {\n for (code in right) {\n if (!hasOwnProperty.call(left, code)) left[code] = []\n const value = right[code]\n constructs(\n // @ts-expect-error Looks like a list.\n left[code],\n Array.isArray(value) ? value : value ? [value] : []\n )\n }\n }\n }\n}\n\n/**\n * Merge `list` into `existing` (both lists of constructs).\n * Mutates `existing`.\n *\n * @param {Array<unknown>} existing\n * @param {Array<unknown>} list\n * @returns {undefined}\n */\nfunction constructs(existing, list) {\n let index = -1\n /** @type {Array<unknown>} */\n const before = []\n\n while (++index < list.length) {\n // @ts-expect-error Looks like an object.\n ;(list[index].add === 'after' ? existing : before).push(list[index])\n }\n\n splice(existing, 0, 0, before)\n}\n\n/**\n * Combine multiple HTML extensions into one.\n *\n * @param {Array<HtmlExtension>} htmlExtensions\n * List of HTML extensions.\n * @returns {HtmlExtension}\n * A single combined HTML extension.\n */\nexport function combineHtmlExtensions(htmlExtensions) {\n /** @type {HtmlExtension} */\n const handlers = {}\n let index = -1\n\n while (++index < htmlExtensions.length) {\n htmlExtension(handlers, htmlExtensions[index])\n }\n\n return handlers\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {HtmlExtension} all\n * Extension to merge into.\n * @param {HtmlExtension} extension\n * Extension to merge.\n * @returns {undefined}\n */\nfunction htmlExtension(all, extension) {\n /** @type {keyof HtmlExtension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n const left = maybe || (all[hook] = {})\n const right = extension[hook]\n /** @type {keyof Handles} */\n let type\n\n if (right) {\n for (type in right) {\n // @ts-expect-error assume document vs regular handler are managed correctly.\n left[type] = right[type]\n }\n }\n }\n}\n","/**\n * Turn the number (in string form as either hexa- or plain decimal) coming from\n * a numeric character reference into a character.\n *\n * Sort of like `String.fromCodePoint(Number.parseInt(value, base))`, but makes\n * non-characters and control characters safe.\n *\n * @param {string} value\n * Value to decode.\n * @param {number} base\n * Numeric base.\n * @returns {string}\n * Character.\n */\nexport function decodeNumericCharacterReference(value, base) {\n const code = Number.parseInt(value, base);\n if (\n // C0 except for HT, LF, FF, CR, space.\n code < 9 || code === 11 || code > 13 && code < 32 ||\n // Control character (DEL) of C0, and C1 controls.\n code > 126 && code < 160 ||\n // Lone high surrogates and low surrogates.\n code > 55_295 && code < 57_344 ||\n // Noncharacters.\n code > 64_975 && code < 65_008 || /* eslint-disable no-bitwise */\n (code & 65_535) === 65_535 || (code & 65_535) === 65_534 || /* eslint-enable no-bitwise */\n // Out of range\n code > 1_114_111) {\n return \"\\uFFFD\";\n }\n return String.fromCodePoint(code);\n}","/**\n * Normalize an identifier (as found in references, definitions).\n *\n * Collapses markdown whitespace, trim, and then lower- and uppercase.\n *\n * Some characters are considered “uppercase”, such as U+03F4 (`ϴ`), but if their\n * lowercase counterpart (U+03B8 (`θ`)) is uppercased will result in a different\n * uppercase character (U+0398 (`Θ`)).\n * So, to get a canonical form, we perform both lower- and uppercase.\n *\n * Using uppercase last makes sure keys will never interact with default\n * prototypal values (such as `constructor`): nothing in the prototype of\n * `Object` is uppercase.\n *\n * @param {string} value\n * Identifier to normalize.\n * @returns {string}\n * Normalized identifier.\n */\nexport function normalizeIdentifier(value) {\n return (\n value\n // Collapse markdown whitespace.\n .replace(/[\\t\\n\\r ]+/g, ' ')\n // Trim.\n .replace(/^ | $/g, '')\n // Some characters are considered “uppercase”, but if their lowercase\n // counterpart is uppercased will result in a different uppercase\n // character.\n // Hence, to get that form, we perform both lower- and uppercase.\n // Upper case makes sure keys will not interact with default prototypal\n // methods: no method is uppercase.\n .toLowerCase()\n .toUpperCase()\n )\n}\n","/**\n * @typedef {import('micromark-util-types').Code} Code\n */\n\n/**\n * Check whether the character code represents an ASCII alpha (`a` through `z`,\n * case insensitive).\n *\n * An **ASCII alpha** is an ASCII upper alpha or ASCII lower alpha.\n *\n * An **ASCII upper alpha** is a character in the inclusive range U+0041 (`A`)\n * to U+005A (`Z`).\n *\n * An **ASCII lower alpha** is a character in the inclusive range U+0061 (`a`)\n * to U+007A (`z`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiAlpha = regexCheck(/[A-Za-z]/);\n\n/**\n * Check whether the character code represents an ASCII alphanumeric (`a`\n * through `z`, case insensitive, or `0` through `9`).\n *\n * An **ASCII alphanumeric** is an ASCII digit (see `asciiDigit`) or ASCII alpha\n * (see `asciiAlpha`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiAlphanumeric = regexCheck(/[\\dA-Za-z]/);\n\n/**\n * Check whether the character code represents an ASCII atext.\n *\n * atext is an ASCII alphanumeric (see `asciiAlphanumeric`), or a character in\n * the inclusive ranges U+0023 NUMBER SIGN (`#`) to U+0027 APOSTROPHE (`'`),\n * U+002A ASTERISK (`*`), U+002B PLUS SIGN (`+`), U+002D DASH (`-`), U+002F\n * SLASH (`/`), U+003D EQUALS TO (`=`), U+003F QUESTION MARK (`?`), U+005E\n * CARET (`^`) to U+0060 GRAVE ACCENT (`` ` ``), or U+007B LEFT CURLY BRACE\n * (`{`) to U+007E TILDE (`~`).\n *\n * See:\n * **\\[RFC5322]**:\n * [Internet Message Format](https://tools.ietf.org/html/rfc5322).\n * P. Resnick.\n * IETF.\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiAtext = regexCheck(/[#-'*+\\--9=?A-Z^-~]/);\n\n/**\n * Check whether a character code is an ASCII control character.\n *\n * An **ASCII control** is a character in the inclusive range U+0000 NULL (NUL)\n * to U+001F (US), or U+007F (DEL).\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function asciiControl(code) {\n return (\n // Special whitespace codes (which have negative values), C0 and Control\n // character DEL\n code !== null && (code < 32 || code === 127)\n );\n}\n\n/**\n * Check whether the character code represents an ASCII digit (`0` through `9`).\n *\n * An **ASCII digit** is a character in the inclusive range U+0030 (`0`) to\n * U+0039 (`9`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiDigit = regexCheck(/\\d/);\n\n/**\n * Check whether the character code represents an ASCII hex digit (`a` through\n * `f`, case insensitive, or `0` through `9`).\n *\n * An **ASCII hex digit** is an ASCII digit (see `asciiDigit`), ASCII upper hex\n * digit, or an ASCII lower hex digit.\n *\n * An **ASCII upper hex digit** is a character in the inclusive range U+0041\n * (`A`) to U+0046 (`F`).\n *\n * An **ASCII lower hex digit** is a character in the inclusive range U+0061\n * (`a`) to U+0066 (`f`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiHexDigit = regexCheck(/[\\dA-Fa-f]/);\n\n/**\n * Check whether the character code represents ASCII punctuation.\n *\n * An **ASCII punctuation** is a character in the inclusive ranges U+0021\n * EXCLAMATION MARK (`!`) to U+002F SLASH (`/`), U+003A COLON (`:`) to U+0040 AT\n * SIGN (`@`), U+005B LEFT SQUARE BRACKET (`[`) to U+0060 GRAVE ACCENT\n * (`` ` ``), or U+007B LEFT CURLY BRACE (`{`) to U+007E TILDE (`~`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiPunctuation = regexCheck(/[!-/:-@[-`{-~]/);\n\n/**\n * Check whether a character code is a markdown line ending.\n *\n * A **markdown line ending** is the virtual characters M-0003 CARRIAGE RETURN\n * LINE FEED (CRLF), M-0004 LINE FEED (LF) and M-0005 CARRIAGE RETURN (CR).\n *\n * In micromark, the actual character U+000A LINE FEED (LF) and U+000D CARRIAGE\n * RETURN (CR) are replaced by these virtual characters depending on whether\n * they occurred together.\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function markdownLineEnding(code) {\n return code !== null && code < -2;\n}\n\n/**\n * Check whether a character code is a markdown line ending (see\n * `markdownLineEnding`) or markdown space (see `markdownSpace`).\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function markdownLineEndingOrSpace(code) {\n return code !== null && (code < 0 || code === 32);\n}\n\n/**\n * Check whether a character code is a markdown space.\n *\n * A **markdown space** is the concrete character U+0020 SPACE (SP) and the\n * virtual characters M-0001 VIRTUAL SPACE (VS) and M-0002 HORIZONTAL TAB (HT).\n *\n * In micromark, the actual character U+0009 CHARACTER TABULATION (HT) is\n * replaced by one M-0002 HORIZONTAL TAB (HT) and between 0 and 3 M-0001 VIRTUAL\n * SPACE (VS) characters, depending on the column at which the tab occurred.\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function markdownSpace(code) {\n return code === -2 || code === -1 || code === 32;\n}\n\n// Size note: removing ASCII from the regex and using `asciiPunctuation` here\n// In fact adds to the bundle size.\n/**\n * Check whether the character code represents Unicode punctuation.\n *\n * A **Unicode punctuation** is a character in the Unicode `Pc` (Punctuation,\n * Connector), `Pd` (Punctuation, Dash), `Pe` (Punctuation, Close), `Pf`\n * (Punctuation, Final quote), `Pi` (Punctuation, Initial quote), `Po`\n * (Punctuation, Other), or `Ps` (Punctuation, Open) categories, or an ASCII\n * punctuation (see `asciiPunctuation`).\n *\n * See:\n * **\\[UNICODE]**:\n * [The Unicode Standard](https://www.unicode.org/versions/).\n * Unicode Consortium.\n *\n * @param code\n * Code.\n * @returns\n * Whether it matches.\n */\nexport const unicodePunctuation = regexCheck(/\\p{P}|\\p{S}/u);\n\n/**\n * Check whether the character code represents Unicode whitespace.\n *\n * Note that this does handle micromark specific markdown whitespace characters.\n * See `markdownLineEndingOrSpace` to check that.\n *\n * A **Unicode whitespace** is a character in the Unicode `Zs` (Separator,\n * Space) category, or U+0009 CHARACTER TABULATION (HT), U+000A LINE FEED (LF),\n * U+000C (FF), or U+000D CARRIAGE RETURN (CR) (**\\[UNICODE]**).\n *\n * See:\n * **\\[UNICODE]**:\n * [The Unicode Standard](https://www.unicode.org/versions/).\n * Unicode Consortium.\n *\n * @param code\n * Code.\n * @returns\n * Whether it matches.\n */\nexport const unicodeWhitespace = regexCheck(/\\s/);\n\n/**\n * Create a code check from a regex.\n *\n * @param {RegExp} regex\n * @returns {(code: Code) => boolean}\n */\nfunction regexCheck(regex) {\n return check;\n\n /**\n * Check whether a code matches the bound regex.\n *\n * @param {Code} code\n * Character code.\n * @returns {boolean}\n * Whether the character code matches the bound regex.\n */\n function check(code) {\n return code !== null && code > -1 && regex.test(String.fromCharCode(code));\n }\n}","/**\n * @typedef {import('micromark-util-types').Effects} Effects\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenType} TokenType\n */\n\nimport {markdownSpace} from 'micromark-util-character'\n\n// To do: implement `spaceOrTab`, `spaceOrTabMinMax`, `spaceOrTabWithOptions`.\n\n/**\n * Parse spaces and tabs.\n *\n * There is no `nok` parameter:\n *\n * * spaces in markdown are often optional, in which case this factory can be\n * used and `ok` will be switched to whether spaces were found or not\n * * one line ending or space can be detected with `markdownSpace(code)` right\n * before using `factorySpace`\n *\n * ###### Examples\n *\n * Where `␉` represents a tab (plus how much it expands) and `␠` represents a\n * single space.\n *\n * ```markdown\n * ␉\n * ␠␠␠␠\n * ␉␠\n * ```\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {TokenType} type\n * Type (`' \\t'`).\n * @param {number | undefined} [max=Infinity]\n * Max (exclusive).\n * @returns {State}\n * Start state.\n */\nexport function factorySpace(effects, ok, type, max) {\n const limit = max ? max - 1 : Number.POSITIVE_INFINITY\n let size = 0\n return start\n\n /** @type {State} */\n function start(code) {\n if (markdownSpace(code)) {\n effects.enter(type)\n return prefix(code)\n }\n return ok(code)\n }\n\n /** @type {State} */\n function prefix(code) {\n if (markdownSpace(code) && size++ < limit) {\n effects.consume(code)\n return prefix\n }\n effects.exit(type)\n return ok(code)\n }\n}\n","/**\n * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct\n * @typedef {import('micromark-util-types').Initializer} Initializer\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n */\n\nimport {factorySpace} from 'micromark-factory-space'\nimport {markdownLineEnding} from 'micromark-util-character'\n/** @type {InitialConstruct} */\nexport const content = {\n tokenize: initializeContent\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Initializer}\n */\nfunction initializeContent(effects) {\n const contentStart = effects.attempt(\n this.parser.constructs.contentInitial,\n afterContentStartConstruct,\n paragraphInitial\n )\n /** @type {Token} */\n let previous\n return contentStart\n\n /** @type {State} */\n function afterContentStartConstruct(code) {\n if (code === null) {\n effects.consume(code)\n return\n }\n effects.enter('lineEnding')\n effects.consume(code)\n effects.exit('lineEnding')\n return factorySpace(effects, contentStart, 'linePrefix')\n }\n\n /** @type {State} */\n function paragraphInitial(code) {\n effects.enter('paragraph')\n return lineStart(code)\n }\n\n /** @type {State} */\n function lineStart(code) {\n const token = effects.enter('chunkText', {\n contentType: 'text',\n previous\n })\n if (previous) {\n previous.next = token\n }\n previous = token\n return data(code)\n }\n\n /** @type {State} */\n function data(code) {\n if (code === null) {\n effects.exit('chunkText')\n effects.exit('paragraph')\n effects.consume(code)\n return\n }\n if (markdownLineEnding(code)) {\n effects.consume(code)\n effects.exit('chunkText')\n return lineStart\n }\n\n // Data.\n effects.consume(code)\n return data\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').ContainerState} ContainerState\n * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct\n * @typedef {import('micromark-util-types').Initializer} Initializer\n * @typedef {import('micromark-util-types').Point} Point\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\n/**\n * @typedef {[Construct, ContainerState]} StackItem\n */\n\nimport {factorySpace} from 'micromark-factory-space'\nimport {markdownLineEnding} from 'micromark-util-character'\nimport {splice} from 'micromark-util-chunked'\n/** @type {InitialConstruct} */\nexport const document = {\n tokenize: initializeDocument\n}\n\n/** @type {Construct} */\nconst containerConstruct = {\n tokenize: tokenizeContainer\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Initializer}\n */\nfunction initializeDocument(effects) {\n const self = this\n /** @type {Array<StackItem>} */\n const stack = []\n let continued = 0\n /** @type {TokenizeContext | undefined} */\n let childFlow\n /** @type {Token | undefined} */\n let childToken\n /** @type {number} */\n let lineStartOffset\n return start\n\n /** @type {State} */\n function start(code) {\n // First we iterate through the open blocks, starting with the root\n // document, and descending through last children down to the last open\n // block.\n // Each block imposes a condition that the line must satisfy if the block is\n // to remain open.\n // For example, a block quote requires a `>` character.\n // A paragraph requires a non-blank line.\n // In this phase we may match all or just some of the open blocks.\n // But we cannot close unmatched blocks yet, because we may have a lazy\n // continuation line.\n if (continued < stack.length) {\n const item = stack[continued]\n self.containerState = item[1]\n return effects.attempt(\n item[0].continuation,\n documentContinue,\n checkNewContainers\n )(code)\n }\n\n // Done.\n return checkNewContainers(code)\n }\n\n /** @type {State} */\n function documentContinue(code) {\n continued++\n\n // Note: this field is called `_closeFlow` but it also closes containers.\n // Perhaps a good idea to rename it but it’s already used in the wild by\n // extensions.\n if (self.containerState._closeFlow) {\n self.containerState._closeFlow = undefined\n if (childFlow) {\n closeFlow()\n }\n\n // Note: this algorithm for moving events around is similar to the\n // algorithm when dealing with lazy lines in `writeToChild`.\n const indexBeforeExits = self.events.length\n let indexBeforeFlow = indexBeforeExits\n /** @type {Point | undefined} */\n let point\n\n // Find the flow chunk.\n while (indexBeforeFlow--) {\n if (\n self.events[indexBeforeFlow][0] === 'exit' &&\n self.events[indexBeforeFlow][1].type === 'chunkFlow'\n ) {\n point = self.events[indexBeforeFlow][1].end\n break\n }\n }\n exitContainers(continued)\n\n // Fix positions.\n let index = indexBeforeExits\n while (index < self.events.length) {\n self.events[index][1].end = Object.assign({}, point)\n index++\n }\n\n // Inject the exits earlier (they’re still also at the end).\n splice(\n self.events,\n indexBeforeFlow + 1,\n 0,\n self.events.slice(indexBeforeExits)\n )\n\n // Discard the duplicate exits.\n self.events.length = index\n return checkNewContainers(code)\n }\n return start(code)\n }\n\n /** @type {State} */\n function checkNewContainers(code) {\n // Next, after consuming the continuation markers for existing blocks, we\n // look for new block starts (e.g. `>` for a block quote).\n // If we encounter a new block start, we close any blocks unmatched in\n // step 1 before creating the new block as a child of the last matched\n // block.\n if (continued === stack.length) {\n // No need to `check` whether there’s a container, of `exitContainers`\n // would be moot.\n // We can instead immediately `attempt` to parse one.\n if (!childFlow) {\n return documentContinued(code)\n }\n\n // If we have concrete content, such as block HTML or fenced code,\n // we can’t have containers “pierce” into them, so we can immediately\n // start.\n if (childFlow.currentConstruct && childFlow.currentConstruct.concrete) {\n return flowStart(code)\n }\n\n // If we do have flow, it could still be a blank line,\n // but we’d be interrupting it w/ a new container if there’s a current\n // construct.\n // To do: next major: remove `_gfmTableDynamicInterruptHack` (no longer\n // needed in micromark-extension-gfm-table@1.0.6).\n self.interrupt = Boolean(\n childFlow.currentConstruct && !childFlow._gfmTableDynamicInterruptHack\n )\n }\n\n // Check if there is a new container.\n self.containerState = {}\n return effects.check(\n containerConstruct,\n thereIsANewContainer,\n thereIsNoNewContainer\n )(code)\n }\n\n /** @type {State} */\n function thereIsANewContainer(code) {\n if (childFlow) closeFlow()\n exitContainers(continued)\n return documentContinued(code)\n }\n\n /** @type {State} */\n function thereIsNoNewContainer(code) {\n self.parser.lazy[self.now().line] = continued !== stack.length\n lineStartOffset = self.now().offset\n return flowStart(code)\n }\n\n /** @type {State} */\n function documentContinued(code) {\n // Try new containers.\n self.containerState = {}\n return effects.attempt(\n containerConstruct,\n containerContinue,\n flowStart\n )(code)\n }\n\n /** @type {State} */\n function containerContinue(code) {\n continued++\n stack.push([self.currentConstruct, self.containerState])\n // Try another.\n return documentContinued(code)\n }\n\n /** @type {State} */\n function flowStart(code) {\n if (code === null) {\n if (childFlow) closeFlow()\n exitContainers(0)\n effects.consume(code)\n return\n }\n childFlow = childFlow || self.parser.flow(self.now())\n effects.enter('chunkFlow', {\n contentType: 'flow',\n previous: childToken,\n _tokenizer: childFlow\n })\n return flowContinue(code)\n }\n\n /** @type {State} */\n function flowContinue(code) {\n if (code === null) {\n writeToChild(effects.exit('chunkFlow'), true)\n exitContainers(0)\n effects.consume(code)\n return\n }\n if (markdownLineEnding(code)) {\n effects.consume(code)\n writeToChild(effects.exit('chunkFlow'))\n // Get ready for the next line.\n continued = 0\n self.interrupt = undefined\n return start\n }\n effects.consume(code)\n return flowContinue\n }\n\n /**\n * @param {Token} token\n * @param {boolean | undefined} [eof]\n * @returns {undefined}\n */\n function writeToChild(token, eof) {\n const stream = self.sliceStream(token)\n if (eof) stream.push(null)\n token.previous = childToken\n if (childToken) childToken.next = token\n childToken = token\n childFlow.defineSkip(token.start)\n childFlow.write(stream)\n\n // Alright, so we just added a lazy line:\n //\n // ```markdown\n // > a\n // b.\n //\n // Or:\n //\n // > ~~~c\n // d\n //\n // Or:\n //\n // > | e |\n // f\n // ```\n //\n // The construct in the second example (fenced code) does not accept lazy\n // lines, so it marked itself as done at the end of its first line, and\n // then the content construct parses `d`.\n // Most constructs in markdown match on the first line: if the first line\n // forms a construct, a non-lazy line can’t “unmake” it.\n //\n // The construct in the third example is potentially a GFM table, and\n // those are *weird*.\n // It *could* be a table, from the first line, if the following line\n // matches a condition.\n // In this case, that second line is lazy, which “unmakes” the first line\n // and turns the whole into one content block.\n //\n // We’ve now parsed the non-lazy and the lazy line, and can figure out\n // whether the lazy line started a new flow block.\n // If it did, we exit the current containers between the two flow blocks.\n if (self.parser.lazy[token.start.line]) {\n let index = childFlow.events.length\n while (index--) {\n if (\n // The token starts before the line ending…\n childFlow.events[index][1].start.offset < lineStartOffset &&\n // …and either is not ended yet…\n (!childFlow.events[index][1].end ||\n // …or ends after it.\n childFlow.events[index][1].end.offset > lineStartOffset)\n ) {\n // Exit: there’s still something open, which means it’s a lazy line\n // part of something.\n return\n }\n }\n\n // Note: this algorithm for moving events around is similar to the\n // algorithm when closing flow in `documentContinue`.\n const indexBeforeExits = self.events.length\n let indexBeforeFlow = indexBeforeExits\n /** @type {boolean | undefined} */\n let seen\n /** @type {Point | undefined} */\n let point\n\n // Find the previous chunk (the one before the lazy line).\n while (indexBeforeFlow--) {\n if (\n self.events[indexBeforeFlow][0] === 'exit' &&\n self.events[indexBeforeFlow][1].type === 'chunkFlow'\n ) {\n if (seen) {\n point = self.events[indexBeforeFlow][1].end\n break\n }\n seen = true\n }\n }\n exitContainers(continued)\n\n // Fix positions.\n index = indexBeforeExits\n while (index < self.events.length) {\n self.events[index][1].end = Object.assign({}, point)\n index++\n }\n\n // Inject the exits earlier (they’re still also at the end).\n splice(\n self.events,\n indexBeforeFlow + 1,\n 0,\n self.events.slice(indexBeforeExits)\n )\n\n // Discard the duplicate exits.\n self.events.length = index\n }\n }\n\n /**\n * @param {number} size\n * @returns {undefined}\n */\n function exitContainers(size) {\n let index = stack.length\n\n // Exit open containers.\n while (index-- > size) {\n const entry = stack[index]\n self.containerState = entry[1]\n entry[0].exit.call(self, effects)\n }\n stack.length = size\n }\n function closeFlow() {\n childFlow.write([null])\n childToken = undefined\n childFlow = undefined\n self.containerState._closeFlow = undefined\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeContainer(effects, ok, nok) {\n // Always populated by defaults.\n\n return factorySpace(\n effects,\n effects.attempt(this.parser.constructs.document, ok, nok),\n 'linePrefix',\n this.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4\n )\n}\n","/**\n * @typedef {import('micromark-util-types').Code} Code\n */\n\nimport {\n markdownLineEndingOrSpace,\n unicodePunctuation,\n unicodeWhitespace\n} from 'micromark-util-character'\n/**\n * Classify whether a code represents whitespace, punctuation, or something\n * else.\n *\n * Used for attention (emphasis, strong), whose sequences can open or close\n * based on the class of surrounding characters.\n *\n * > 👉 **Note**: eof (`null`) is seen as whitespace.\n *\n * @param {Code} code\n * Code.\n * @returns {typeof constants.characterGroupWhitespace | typeof constants.characterGroupPunctuation | undefined}\n * Group.\n */\nexport function classifyCharacter(code) {\n if (\n code === null ||\n markdownLineEndingOrSpace(code) ||\n unicodeWhitespace(code)\n ) {\n return 1\n }\n if (unicodePunctuation(code)) {\n return 2\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Event} Event\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n */\n\n/**\n * Call all `resolveAll`s.\n *\n * @param {Array<{resolveAll?: Resolver | undefined}>} constructs\n * List of constructs, optionally with `resolveAll`s.\n * @param {Array<Event>} events\n * List of events.\n * @param {TokenizeContext} context\n * Context used by `tokenize`.\n * @returns {Array<Event>}\n * Changed events.\n */\nexport function resolveAll(constructs, events, context) {\n /** @type {Array<Resolver>} */\n const called = []\n let index = -1\n\n while (++index < constructs.length) {\n const resolve = constructs[index].resolveAll\n\n if (resolve && !called.includes(resolve)) {\n events = resolve(events, context)\n called.push(resolve)\n }\n }\n\n return events\n}\n","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Event} Event\n * @typedef {import('micromark-util-types').Point} Point\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { push, splice } from 'micromark-util-chunked';\nimport { classifyCharacter } from 'micromark-util-classify-character';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/** @type {Construct} */\nexport const attention = {\n name: 'attention',\n tokenize: tokenizeAttention,\n resolveAll: resolveAllAttention\n};\n\n/**\n * Take all events and resolve attention to emphasis or strong.\n *\n * @type {Resolver}\n */\n// eslint-disable-next-line complexity\nfunction resolveAllAttention(events, context) {\n let index = -1;\n /** @type {number} */\n let open;\n /** @type {Token} */\n let group;\n /** @type {Token} */\n let text;\n /** @type {Token} */\n let openingSequence;\n /** @type {Token} */\n let closingSequence;\n /** @type {number} */\n let use;\n /** @type {Array<Event>} */\n let nextEvents;\n /** @type {number} */\n let offset;\n\n // Walk through all events.\n //\n // Note: performance of this is fine on an mb of normal markdown, but it’s\n // a bottleneck for malicious stuff.\n while (++index < events.length) {\n // Find a token that can close.\n if (events[index][0] === 'enter' && events[index][1].type === 'attentionSequence' && events[index][1]._close) {\n open = index;\n\n // Now walk back to find an opener.\n while (open--) {\n // Find a token that can open the closer.\n if (events[open][0] === 'exit' && events[open][1].type === 'attentionSequence' && events[open][1]._open &&\n // If the markers are the same:\n context.sliceSerialize(events[open][1]).charCodeAt(0) === context.sliceSerialize(events[index][1]).charCodeAt(0)) {\n // If the opening can close or the closing can open,\n // and the close size *is not* a multiple of three,\n // but the sum of the opening and closing size *is* multiple of three,\n // then don’t match.\n if ((events[open][1]._close || events[index][1]._open) && (events[index][1].end.offset - events[index][1].start.offset) % 3 && !((events[open][1].end.offset - events[open][1].start.offset + events[index][1].end.offset - events[index][1].start.offset) % 3)) {\n continue;\n }\n\n // Number of markers to use from the sequence.\n use = events[open][1].end.offset - events[open][1].start.offset > 1 && events[index][1].end.offset - events[index][1].start.offset > 1 ? 2 : 1;\n const start = Object.assign({}, events[open][1].end);\n const end = Object.assign({}, events[index][1].start);\n movePoint(start, -use);\n movePoint(end, use);\n openingSequence = {\n type: use > 1 ? \"strongSequence\" : \"emphasisSequence\",\n start,\n end: Object.assign({}, events[open][1].end)\n };\n closingSequence = {\n type: use > 1 ? \"strongSequence\" : \"emphasisSequence\",\n start: Object.assign({}, events[index][1].start),\n end\n };\n text = {\n type: use > 1 ? \"strongText\" : \"emphasisText\",\n start: Object.assign({}, events[open][1].end),\n end: Object.assign({}, events[index][1].start)\n };\n group = {\n type: use > 1 ? \"strong\" : \"emphasis\",\n start: Object.assign({}, openingSequence.start),\n end: Object.assign({}, closingSequence.end)\n };\n events[open][1].end = Object.assign({}, openingSequence.start);\n events[index][1].start = Object.assign({}, closingSequence.end);\n nextEvents = [];\n\n // If there are more markers in the opening, add them before.\n if (events[open][1].end.offset - events[open][1].start.offset) {\n nextEvents = push(nextEvents, [['enter', events[open][1], context], ['exit', events[open][1], context]]);\n }\n\n // Opening.\n nextEvents = push(nextEvents, [['enter', group, context], ['enter', openingSequence, context], ['exit', openingSequence, context], ['enter', text, context]]);\n\n // Always populated by defaults.\n\n // Between.\n nextEvents = push(nextEvents, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + 1, index), context));\n\n // Closing.\n nextEvents = push(nextEvents, [['exit', text, context], ['enter', closingSequence, context], ['exit', closingSequence, context], ['exit', group, context]]);\n\n // If there are more markers in the closing, add them after.\n if (events[index][1].end.offset - events[index][1].start.offset) {\n offset = 2;\n nextEvents = push(nextEvents, [['enter', events[index][1], context], ['exit', events[index][1], context]]);\n } else {\n offset = 0;\n }\n splice(events, open - 1, index - open + 3, nextEvents);\n index = open + nextEvents.length - offset - 2;\n break;\n }\n }\n }\n }\n\n // Remove remaining sequences.\n index = -1;\n while (++index < events.length) {\n if (events[index][1].type === 'attentionSequence') {\n events[index][1].type = 'data';\n }\n }\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeAttention(effects, ok) {\n const attentionMarkers = this.parser.constructs.attentionMarkers.null;\n const previous = this.previous;\n const before = classifyCharacter(previous);\n\n /** @type {NonNullable<Code>} */\n let marker;\n return start;\n\n /**\n * Before a sequence.\n *\n * ```markdown\n * > | **\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n marker = code;\n effects.enter('attentionSequence');\n return inside(code);\n }\n\n /**\n * In a sequence.\n *\n * ```markdown\n * > | **\n * ^^\n * ```\n *\n * @type {State}\n */\n function inside(code) {\n if (code === marker) {\n effects.consume(code);\n return inside;\n }\n const token = effects.exit('attentionSequence');\n\n // To do: next major: move this to resolver, just like `markdown-rs`.\n const after = classifyCharacter(code);\n\n // Always populated by defaults.\n\n const open = !after || after === 2 && before || attentionMarkers.includes(code);\n const close = !before || before === 2 && after || attentionMarkers.includes(previous);\n token._open = Boolean(marker === 42 ? open : open && (before || !close));\n token._close = Boolean(marker === 42 ? close : close && (after || !open));\n return ok(code);\n }\n}\n\n/**\n * Move a point a bit.\n *\n * Note: `move` only works inside lines! It’s not possible to move past other\n * chunks (replacement characters, tabs, or line endings).\n *\n * @param {Point} point\n * @param {number} offset\n * @returns {undefined}\n */\nfunction movePoint(point, offset) {\n point.column += offset;\n point.offset += offset;\n point._bufferIndex += offset;\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { asciiAlpha, asciiAlphanumeric, asciiAtext, asciiControl } from 'micromark-util-character';\n/** @type {Construct} */\nexport const autolink = {\n name: 'autolink',\n tokenize: tokenizeAutolink\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeAutolink(effects, ok, nok) {\n let size = 0;\n return start;\n\n /**\n * Start of an autolink.\n *\n * ```markdown\n * > | a<https://example.com>b\n * ^\n * > | a<user@example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"autolink\");\n effects.enter(\"autolinkMarker\");\n effects.consume(code);\n effects.exit(\"autolinkMarker\");\n effects.enter(\"autolinkProtocol\");\n return open;\n }\n\n /**\n * After `<`, at protocol or atext.\n *\n * ```markdown\n * > | a<https://example.com>b\n * ^\n * > | a<user@example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (asciiAlpha(code)) {\n effects.consume(code);\n return schemeOrEmailAtext;\n }\n if (code === 64) {\n return nok(code);\n }\n return emailAtext(code);\n }\n\n /**\n * At second byte of protocol or atext.\n *\n * ```markdown\n * > | a<https://example.com>b\n * ^\n * > | a<user@example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function schemeOrEmailAtext(code) {\n // ASCII alphanumeric and `+`, `-`, and `.`.\n if (code === 43 || code === 45 || code === 46 || asciiAlphanumeric(code)) {\n // Count the previous alphabetical from `open` too.\n size = 1;\n return schemeInsideOrEmailAtext(code);\n }\n return emailAtext(code);\n }\n\n /**\n * In ambiguous protocol or atext.\n *\n * ```markdown\n * > | a<https://example.com>b\n * ^\n * > | a<user@example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function schemeInsideOrEmailAtext(code) {\n if (code === 58) {\n effects.consume(code);\n size = 0;\n return urlInside;\n }\n\n // ASCII alphanumeric and `+`, `-`, and `.`.\n if ((code === 43 || code === 45 || code === 46 || asciiAlphanumeric(code)) && size++ < 32) {\n effects.consume(code);\n return schemeInsideOrEmailAtext;\n }\n size = 0;\n return emailAtext(code);\n }\n\n /**\n * After protocol, in URL.\n *\n * ```markdown\n * > | a<https://example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function urlInside(code) {\n if (code === 62) {\n effects.exit(\"autolinkProtocol\");\n effects.enter(\"autolinkMarker\");\n effects.consume(code);\n effects.exit(\"autolinkMarker\");\n effects.exit(\"autolink\");\n return ok;\n }\n\n // ASCII control, space, or `<`.\n if (code === null || code === 32 || code === 60 || asciiControl(code)) {\n return nok(code);\n }\n effects.consume(code);\n return urlInside;\n }\n\n /**\n * In email atext.\n *\n * ```markdown\n * > | a<user.name@example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function emailAtext(code) {\n if (code === 64) {\n effects.consume(code);\n return emailAtSignOrDot;\n }\n if (asciiAtext(code)) {\n effects.consume(code);\n return emailAtext;\n }\n return nok(code);\n }\n\n /**\n * In label, after at-sign or dot.\n *\n * ```markdown\n * > | a<user.name@example.com>b\n * ^ ^\n * ```\n *\n * @type {State}\n */\n function emailAtSignOrDot(code) {\n return asciiAlphanumeric(code) ? emailLabel(code) : nok(code);\n }\n\n /**\n * In label, where `.` and `>` are allowed.\n *\n * ```markdown\n * > | a<user.name@example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function emailLabel(code) {\n if (code === 46) {\n effects.consume(code);\n size = 0;\n return emailAtSignOrDot;\n }\n if (code === 62) {\n // Exit, then change the token type.\n effects.exit(\"autolinkProtocol\").type = \"autolinkEmail\";\n effects.enter(\"autolinkMarker\");\n effects.consume(code);\n effects.exit(\"autolinkMarker\");\n effects.exit(\"autolink\");\n return ok;\n }\n return emailValue(code);\n }\n\n /**\n * In label, where `.` and `>` are *not* allowed.\n *\n * Though, this is also used in `emailLabel` to parse other values.\n *\n * ```markdown\n * > | a<user.name@ex-ample.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function emailValue(code) {\n // ASCII alphanumeric or `-`.\n if ((code === 45 || asciiAlphanumeric(code)) && size++ < 63) {\n const next = code === 45 ? emailValue : emailLabel;\n effects.consume(code);\n return next;\n }\n return nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blankLine = {\n tokenize: tokenizeBlankLine,\n partial: true\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLine(effects, ok, nok) {\n return start;\n\n /**\n * Start of blank line.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n return markdownSpace(code) ? factorySpace(effects, after, \"linePrefix\")(code) : after(code);\n }\n\n /**\n * At eof/eol, after optional whitespace.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Exiter} Exiter\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blockQuote = {\n name: 'blockQuote',\n tokenize: tokenizeBlockQuoteStart,\n continuation: {\n tokenize: tokenizeBlockQuoteContinuation\n },\n exit\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeBlockQuoteStart(effects, ok, nok) {\n const self = this;\n return start;\n\n /**\n * Start of block quote.\n *\n * ```markdown\n * > | > a\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n if (code === 62) {\n const state = self.containerState;\n if (!state.open) {\n effects.enter(\"blockQuote\", {\n _container: true\n });\n state.open = true;\n }\n effects.enter(\"blockQuotePrefix\");\n effects.enter(\"blockQuoteMarker\");\n effects.consume(code);\n effects.exit(\"blockQuoteMarker\");\n return after;\n }\n return nok(code);\n }\n\n /**\n * After `>`, before optional whitespace.\n *\n * ```markdown\n * > | > a\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n if (markdownSpace(code)) {\n effects.enter(\"blockQuotePrefixWhitespace\");\n effects.consume(code);\n effects.exit(\"blockQuotePrefixWhitespace\");\n effects.exit(\"blockQuotePrefix\");\n return ok;\n }\n effects.exit(\"blockQuotePrefix\");\n return ok(code);\n }\n}\n\n/**\n * Start of block quote continuation.\n *\n * ```markdown\n * | > a\n * > | > b\n * ^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeBlockQuoteContinuation(effects, ok, nok) {\n const self = this;\n return contStart;\n\n /**\n * Start of block quote continuation.\n *\n * Also used to parse the first block quote opening.\n *\n * ```markdown\n * | > a\n * > | > b\n * ^\n * ```\n *\n * @type {State}\n */\n function contStart(code) {\n if (markdownSpace(code)) {\n // Always populated by defaults.\n\n return factorySpace(effects, contBefore, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code);\n }\n return contBefore(code);\n }\n\n /**\n * At `>`, after optional whitespace.\n *\n * Also used to parse the first block quote opening.\n *\n * ```markdown\n * | > a\n * > | > b\n * ^\n * ```\n *\n * @type {State}\n */\n function contBefore(code) {\n return effects.attempt(blockQuote, ok, nok)(code);\n }\n}\n\n/** @type {Exiter} */\nfunction exit(effects) {\n effects.exit(\"blockQuote\");\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { asciiPunctuation } from 'micromark-util-character';\n/** @type {Construct} */\nexport const characterEscape = {\n name: 'characterEscape',\n tokenize: tokenizeCharacterEscape\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeCharacterEscape(effects, ok, nok) {\n return start;\n\n /**\n * Start of character escape.\n *\n * ```markdown\n * > | a\\*b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"characterEscape\");\n effects.enter(\"escapeMarker\");\n effects.consume(code);\n effects.exit(\"escapeMarker\");\n return inside;\n }\n\n /**\n * After `\\`, at punctuation.\n *\n * ```markdown\n * > | a\\*b\n * ^\n * ```\n *\n * @type {State}\n */\n function inside(code) {\n // ASCII punctuation.\n if (asciiPunctuation(code)) {\n effects.enter(\"characterEscapeValue\");\n effects.consume(code);\n effects.exit(\"characterEscapeValue\");\n effects.exit(\"characterEscape\");\n return ok;\n }\n return nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { decodeNamedCharacterReference } from 'decode-named-character-reference';\nimport { asciiAlphanumeric, asciiDigit, asciiHexDigit } from 'micromark-util-character';\n/** @type {Construct} */\nexport const characterReference = {\n name: 'characterReference',\n tokenize: tokenizeCharacterReference\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeCharacterReference(effects, ok, nok) {\n const self = this;\n let size = 0;\n /** @type {number} */\n let max;\n /** @type {(code: Code) => boolean} */\n let test;\n return start;\n\n /**\n * Start of character reference.\n *\n * ```markdown\n * > | a&b\n * ^\n * > | a{b\n * ^\n * > | a	b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"characterReference\");\n effects.enter(\"characterReferenceMarker\");\n effects.consume(code);\n effects.exit(\"characterReferenceMarker\");\n return open;\n }\n\n /**\n * After `&`, at `#` for numeric references or alphanumeric for named\n * references.\n *\n * ```markdown\n * > | a&b\n * ^\n * > | a{b\n * ^\n * > | a	b\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (code === 35) {\n effects.enter(\"characterReferenceMarkerNumeric\");\n effects.consume(code);\n effects.exit(\"characterReferenceMarkerNumeric\");\n return numeric;\n }\n effects.enter(\"characterReferenceValue\");\n max = 31;\n test = asciiAlphanumeric;\n return value(code);\n }\n\n /**\n * After `#`, at `x` for hexadecimals or digit for decimals.\n *\n * ```markdown\n * > | a{b\n * ^\n * > | a	b\n * ^\n * ```\n *\n * @type {State}\n */\n function numeric(code) {\n if (code === 88 || code === 120) {\n effects.enter(\"characterReferenceMarkerHexadecimal\");\n effects.consume(code);\n effects.exit(\"characterReferenceMarkerHexadecimal\");\n effects.enter(\"characterReferenceValue\");\n max = 6;\n test = asciiHexDigit;\n return value;\n }\n effects.enter(\"characterReferenceValue\");\n max = 7;\n test = asciiDigit;\n return value(code);\n }\n\n /**\n * After markers (`&#x`, `&#`, or `&`), in value, before `;`.\n *\n * The character reference kind defines what and how many characters are\n * allowed.\n *\n * ```markdown\n * > | a&b\n * ^^^\n * > | a{b\n * ^^^\n * > | a	b\n * ^\n * ```\n *\n * @type {State}\n */\n function value(code) {\n if (code === 59 && size) {\n const token = effects.exit(\"characterReferenceValue\");\n if (test === asciiAlphanumeric && !decodeNamedCharacterReference(self.sliceSerialize(token))) {\n return nok(code);\n }\n\n // To do: `markdown-rs` uses a different name:\n // `CharacterReferenceMarkerSemi`.\n effects.enter(\"characterReferenceMarker\");\n effects.consume(code);\n effects.exit(\"characterReferenceMarker\");\n effects.exit(\"characterReference\");\n return ok;\n }\n if (test(code) && size++ < max) {\n effects.consume(code);\n return value;\n }\n return nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nconst nonLazyContinuation = {\n tokenize: tokenizeNonLazyContinuation,\n partial: true\n};\n\n/** @type {Construct} */\nexport const codeFenced = {\n name: 'codeFenced',\n tokenize: tokenizeCodeFenced,\n concrete: true\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeCodeFenced(effects, ok, nok) {\n const self = this;\n /** @type {Construct} */\n const closeStart = {\n tokenize: tokenizeCloseStart,\n partial: true\n };\n let initialPrefix = 0;\n let sizeOpen = 0;\n /** @type {NonNullable<Code>} */\n let marker;\n return start;\n\n /**\n * Start of code.\n *\n * ```markdown\n * > | ~~~js\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // To do: parse whitespace like `markdown-rs`.\n return beforeSequenceOpen(code);\n }\n\n /**\n * In opening fence, after prefix, at sequence.\n *\n * ```markdown\n * > | ~~~js\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function beforeSequenceOpen(code) {\n const tail = self.events[self.events.length - 1];\n initialPrefix = tail && tail[1].type === \"linePrefix\" ? tail[2].sliceSerialize(tail[1], true).length : 0;\n marker = code;\n effects.enter(\"codeFenced\");\n effects.enter(\"codeFencedFence\");\n effects.enter(\"codeFencedFenceSequence\");\n return sequenceOpen(code);\n }\n\n /**\n * In opening fence sequence.\n *\n * ```markdown\n * > | ~~~js\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function sequenceOpen(code) {\n if (code === marker) {\n sizeOpen++;\n effects.consume(code);\n return sequenceOpen;\n }\n if (sizeOpen < 3) {\n return nok(code);\n }\n effects.exit(\"codeFencedFenceSequence\");\n return markdownSpace(code) ? factorySpace(effects, infoBefore, \"whitespace\")(code) : infoBefore(code);\n }\n\n /**\n * In opening fence, after the sequence (and optional whitespace), before info.\n *\n * ```markdown\n * > | ~~~js\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function infoBefore(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"codeFencedFence\");\n return self.interrupt ? ok(code) : effects.check(nonLazyContinuation, atNonLazyBreak, after)(code);\n }\n effects.enter(\"codeFencedFenceInfo\");\n effects.enter(\"chunkString\", {\n contentType: \"string\"\n });\n return info(code);\n }\n\n /**\n * In info.\n *\n * ```markdown\n * > | ~~~js\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function info(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"chunkString\");\n effects.exit(\"codeFencedFenceInfo\");\n return infoBefore(code);\n }\n if (markdownSpace(code)) {\n effects.exit(\"chunkString\");\n effects.exit(\"codeFencedFenceInfo\");\n return factorySpace(effects, metaBefore, \"whitespace\")(code);\n }\n if (code === 96 && code === marker) {\n return nok(code);\n }\n effects.consume(code);\n return info;\n }\n\n /**\n * In opening fence, after info and whitespace, before meta.\n *\n * ```markdown\n * > | ~~~js eval\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function metaBefore(code) {\n if (code === null || markdownLineEnding(code)) {\n return infoBefore(code);\n }\n effects.enter(\"codeFencedFenceMeta\");\n effects.enter(\"chunkString\", {\n contentType: \"string\"\n });\n return meta(code);\n }\n\n /**\n * In meta.\n *\n * ```markdown\n * > | ~~~js eval\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function meta(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"chunkString\");\n effects.exit(\"codeFencedFenceMeta\");\n return infoBefore(code);\n }\n if (code === 96 && code === marker) {\n return nok(code);\n }\n effects.consume(code);\n return meta;\n }\n\n /**\n * At eol/eof in code, before a non-lazy closing fence or content.\n *\n * ```markdown\n * > | ~~~js\n * ^\n * > | alert(1)\n * ^\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function atNonLazyBreak(code) {\n return effects.attempt(closeStart, after, contentBefore)(code);\n }\n\n /**\n * Before code content, not a closing fence, at eol.\n *\n * ```markdown\n * | ~~~js\n * > | alert(1)\n * ^\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function contentBefore(code) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return contentStart;\n }\n\n /**\n * Before code content, not a closing fence.\n *\n * ```markdown\n * | ~~~js\n * > | alert(1)\n * ^\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function contentStart(code) {\n return initialPrefix > 0 && markdownSpace(code) ? factorySpace(effects, beforeContentChunk, \"linePrefix\", initialPrefix + 1)(code) : beforeContentChunk(code);\n }\n\n /**\n * Before code content, after optional prefix.\n *\n * ```markdown\n * | ~~~js\n * > | alert(1)\n * ^\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function beforeContentChunk(code) {\n if (code === null || markdownLineEnding(code)) {\n return effects.check(nonLazyContinuation, atNonLazyBreak, after)(code);\n }\n effects.enter(\"codeFlowValue\");\n return contentChunk(code);\n }\n\n /**\n * In code content.\n *\n * ```markdown\n * | ~~~js\n * > | alert(1)\n * ^^^^^^^^\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function contentChunk(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"codeFlowValue\");\n return beforeContentChunk(code);\n }\n effects.consume(code);\n return contentChunk;\n }\n\n /**\n * After code.\n *\n * ```markdown\n * | ~~~js\n * | alert(1)\n * > | ~~~\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n effects.exit(\"codeFenced\");\n return ok(code);\n }\n\n /**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\n function tokenizeCloseStart(effects, ok, nok) {\n let size = 0;\n return startBefore;\n\n /**\n *\n *\n * @type {State}\n */\n function startBefore(code) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return start;\n }\n\n /**\n * Before closing fence, at optional whitespace.\n *\n * ```markdown\n * | ~~~js\n * | alert(1)\n * > | ~~~\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // Always populated by defaults.\n\n // To do: `enter` here or in next state?\n effects.enter(\"codeFencedFence\");\n return markdownSpace(code) ? factorySpace(effects, beforeSequenceClose, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code) : beforeSequenceClose(code);\n }\n\n /**\n * In closing fence, after optional whitespace, at sequence.\n *\n * ```markdown\n * | ~~~js\n * | alert(1)\n * > | ~~~\n * ^\n * ```\n *\n * @type {State}\n */\n function beforeSequenceClose(code) {\n if (code === marker) {\n effects.enter(\"codeFencedFenceSequence\");\n return sequenceClose(code);\n }\n return nok(code);\n }\n\n /**\n * In closing fence sequence.\n *\n * ```markdown\n * | ~~~js\n * | alert(1)\n * > | ~~~\n * ^\n * ```\n *\n * @type {State}\n */\n function sequenceClose(code) {\n if (code === marker) {\n size++;\n effects.consume(code);\n return sequenceClose;\n }\n if (size >= sizeOpen) {\n effects.exit(\"codeFencedFenceSequence\");\n return markdownSpace(code) ? factorySpace(effects, sequenceCloseAfter, \"whitespace\")(code) : sequenceCloseAfter(code);\n }\n return nok(code);\n }\n\n /**\n * After closing fence sequence, after optional whitespace.\n *\n * ```markdown\n * | ~~~js\n * | alert(1)\n * > | ~~~\n * ^\n * ```\n *\n * @type {State}\n */\n function sequenceCloseAfter(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"codeFencedFence\");\n return ok(code);\n }\n return nok(code);\n }\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeNonLazyContinuation(effects, ok, nok) {\n const self = this;\n return start;\n\n /**\n *\n *\n * @type {State}\n */\n function start(code) {\n if (code === null) {\n return nok(code);\n }\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return lineStart;\n }\n\n /**\n *\n *\n * @type {State}\n */\n function lineStart(code) {\n return self.parser.lazy[self.now().line] ? nok(code) : ok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const codeIndented = {\n name: 'codeIndented',\n tokenize: tokenizeCodeIndented\n};\n\n/** @type {Construct} */\nconst furtherStart = {\n tokenize: tokenizeFurtherStart,\n partial: true\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeCodeIndented(effects, ok, nok) {\n const self = this;\n return start;\n\n /**\n * Start of code (indented).\n *\n * > **Parsing note**: it is not needed to check if this first line is a\n * > filled line (that it has a non-whitespace character), because blank lines\n * > are parsed already, so we never run into that.\n *\n * ```markdown\n * > | aaa\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // To do: manually check if interrupting like `markdown-rs`.\n\n effects.enter(\"codeIndented\");\n // To do: use an improved `space_or_tab` function like `markdown-rs`,\n // so that we can drop the next state.\n return factorySpace(effects, afterPrefix, \"linePrefix\", 4 + 1)(code);\n }\n\n /**\n * At start, after 1 or 4 spaces.\n *\n * ```markdown\n * > | aaa\n * ^\n * ```\n *\n * @type {State}\n */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return tail && tail[1].type === \"linePrefix\" && tail[2].sliceSerialize(tail[1], true).length >= 4 ? atBreak(code) : nok(code);\n }\n\n /**\n * At a break.\n *\n * ```markdown\n * > | aaa\n * ^ ^\n * ```\n *\n * @type {State}\n */\n function atBreak(code) {\n if (code === null) {\n return after(code);\n }\n if (markdownLineEnding(code)) {\n return effects.attempt(furtherStart, atBreak, after)(code);\n }\n effects.enter(\"codeFlowValue\");\n return inside(code);\n }\n\n /**\n * In code content.\n *\n * ```markdown\n * > | aaa\n * ^^^^\n * ```\n *\n * @type {State}\n */\n function inside(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"codeFlowValue\");\n return atBreak(code);\n }\n effects.consume(code);\n return inside;\n }\n\n /** @type {State} */\n function after(code) {\n effects.exit(\"codeIndented\");\n // To do: allow interrupting like `markdown-rs`.\n // Feel free to interrupt.\n // tokenizer.interrupt = false\n return ok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeFurtherStart(effects, ok, nok) {\n const self = this;\n return furtherStart;\n\n /**\n * At eol, trying to parse another indent.\n *\n * ```markdown\n * > | aaa\n * ^\n * | bbb\n * ```\n *\n * @type {State}\n */\n function furtherStart(code) {\n // To do: improve `lazy` / `pierce` handling.\n // If this is a lazy line, it can’t be code.\n if (self.parser.lazy[self.now().line]) {\n return nok(code);\n }\n if (markdownLineEnding(code)) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return furtherStart;\n }\n\n // To do: the code here in `micromark-js` is a bit different from\n // `markdown-rs` because there it can attempt spaces.\n // We can’t yet.\n //\n // To do: use an improved `space_or_tab` function like `markdown-rs`,\n // so that we can drop the next state.\n return factorySpace(effects, afterPrefix, \"linePrefix\", 4 + 1)(code);\n }\n\n /**\n * At start, after 1 or 4 spaces.\n *\n * ```markdown\n * > | aaa\n * ^\n * ```\n *\n * @type {State}\n */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return tail && tail[1].type === \"linePrefix\" && tail[2].sliceSerialize(tail[1], true).length >= 4 ? ok(code) : markdownLineEnding(code) ? furtherStart(code) : nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Previous} Previous\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { markdownLineEnding } from 'micromark-util-character';\n/** @type {Construct} */\nexport const codeText = {\n name: 'codeText',\n tokenize: tokenizeCodeText,\n resolve: resolveCodeText,\n previous\n};\n\n// To do: next major: don’t resolve, like `markdown-rs`.\n/** @type {Resolver} */\nfunction resolveCodeText(events) {\n let tailExitIndex = events.length - 4;\n let headEnterIndex = 3;\n /** @type {number} */\n let index;\n /** @type {number | undefined} */\n let enter;\n\n // If we start and end with an EOL or a space.\n if ((events[headEnterIndex][1].type === \"lineEnding\" || events[headEnterIndex][1].type === 'space') && (events[tailExitIndex][1].type === \"lineEnding\" || events[tailExitIndex][1].type === 'space')) {\n index = headEnterIndex;\n\n // And we have data.\n while (++index < tailExitIndex) {\n if (events[index][1].type === \"codeTextData\") {\n // Then we have padding.\n events[headEnterIndex][1].type = \"codeTextPadding\";\n events[tailExitIndex][1].type = \"codeTextPadding\";\n headEnterIndex += 2;\n tailExitIndex -= 2;\n break;\n }\n }\n }\n\n // Merge adjacent spaces and data.\n index = headEnterIndex - 1;\n tailExitIndex++;\n while (++index <= tailExitIndex) {\n if (enter === undefined) {\n if (index !== tailExitIndex && events[index][1].type !== \"lineEnding\") {\n enter = index;\n }\n } else if (index === tailExitIndex || events[index][1].type === \"lineEnding\") {\n events[enter][1].type = \"codeTextData\";\n if (index !== enter + 2) {\n events[enter][1].end = events[index - 1][1].end;\n events.splice(enter + 2, index - enter - 2);\n tailExitIndex -= index - enter - 2;\n index = enter + 2;\n }\n enter = undefined;\n }\n }\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Previous}\n */\nfunction previous(code) {\n // If there is a previous code, there will always be a tail.\n return code !== 96 || this.events[this.events.length - 1][1].type === \"characterEscape\";\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeCodeText(effects, ok, nok) {\n const self = this;\n let sizeOpen = 0;\n /** @type {number} */\n let size;\n /** @type {Token} */\n let token;\n return start;\n\n /**\n * Start of code (text).\n *\n * ```markdown\n * > | `a`\n * ^\n * > | \\`a`\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"codeText\");\n effects.enter(\"codeTextSequence\");\n return sequenceOpen(code);\n }\n\n /**\n * In opening sequence.\n *\n * ```markdown\n * > | `a`\n * ^\n * ```\n *\n * @type {State}\n */\n function sequenceOpen(code) {\n if (code === 96) {\n effects.consume(code);\n sizeOpen++;\n return sequenceOpen;\n }\n effects.exit(\"codeTextSequence\");\n return between(code);\n }\n\n /**\n * Between something and something else.\n *\n * ```markdown\n * > | `a`\n * ^^\n * ```\n *\n * @type {State}\n */\n function between(code) {\n // EOF.\n if (code === null) {\n return nok(code);\n }\n\n // To do: next major: don’t do spaces in resolve, but when compiling,\n // like `markdown-rs`.\n // Tabs don’t work, and virtual spaces don’t make sense.\n if (code === 32) {\n effects.enter('space');\n effects.consume(code);\n effects.exit('space');\n return between;\n }\n\n // Closing fence? Could also be data.\n if (code === 96) {\n token = effects.enter(\"codeTextSequence\");\n size = 0;\n return sequenceClose(code);\n }\n if (markdownLineEnding(code)) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return between;\n }\n\n // Data.\n effects.enter(\"codeTextData\");\n return data(code);\n }\n\n /**\n * In data.\n *\n * ```markdown\n * > | `a`\n * ^\n * ```\n *\n * @type {State}\n */\n function data(code) {\n if (code === null || code === 32 || code === 96 || markdownLineEnding(code)) {\n effects.exit(\"codeTextData\");\n return between(code);\n }\n effects.consume(code);\n return data;\n }\n\n /**\n * In closing sequence.\n *\n * ```markdown\n * > | `a`\n * ^\n * ```\n *\n * @type {State}\n */\n function sequenceClose(code) {\n // More.\n if (code === 96) {\n effects.consume(code);\n size++;\n return sequenceClose;\n }\n\n // Done!\n if (size === sizeOpen) {\n effects.exit(\"codeTextSequence\");\n effects.exit(\"codeText\");\n return ok(code);\n }\n\n // More or less accents: mark as data.\n token.type = \"codeTextData\";\n return data(code);\n }\n}","/**\n * Some of the internal operations of micromark do lots of editing\n * operations on very large arrays. This runs into problems with two\n * properties of most circa-2020 JavaScript interpreters:\n *\n * - Array-length modifications at the high end of an array (push/pop) are\n * expected to be common and are implemented in (amortized) time\n * proportional to the number of elements added or removed, whereas\n * other operations (shift/unshift and splice) are much less efficient.\n * - Function arguments are passed on the stack, so adding tens of thousands\n * of elements to an array with `arr.push[...newElements]` will frequently\n * cause stack overflows. (see <https://stackoverflow.com/questions/22123769/rangeerror-maximum-call-stack-size-exceeded-why>)\n *\n * SpliceBuffers are an implementation of gap buffers, which are a\n * generalization of the \"queue made of two stacks\" idea. The splice buffer\n * maintains a cursor, and moving the cursor has cost proportional to the\n * distance the cursor moves, but inserting, deleting, or splicing in\n * new information at the cursor is as efficient as the push/pop operation.\n * This allows for an efficient sequence of splices (or pushes, pops, shifts,\n * or unshifts) as long such edits happen at the same part of the array or\n * generally sweep through the array from the beginning to the end.\n *\n * The interface for splice buffers also supports large numbers of inputs by\n * passing a single array argument rather passing multiple arguments on the\n * function call stack.\n *\n * @template T\n * Item type.\n */\nexport class SpliceBuffer {\n /**\n * @param {ReadonlyArray<T> | null | undefined} [initial]\n * Initial items (optional).\n * @returns\n * Splice buffer.\n */\n constructor(initial) {\n /** @type {Array<T>} */\n this.left = initial ? [...initial] : [];\n /** @type {Array<T>} */\n this.right = [];\n }\n\n /**\n * Array access;\n * does not move the cursor.\n *\n * @param {number} index\n * Index.\n * @return {T}\n * Item.\n */\n get(index) {\n if (index < 0 || index >= this.left.length + this.right.length) {\n throw new RangeError('Cannot access index `' + index + '` in a splice buffer of size `' + (this.left.length + this.right.length) + '`');\n }\n if (index < this.left.length) return this.left[index];\n return this.right[this.right.length - index + this.left.length - 1];\n }\n\n /**\n * The length of the splice buffer, one greater than the largest index in the\n * array.\n */\n get length() {\n return this.left.length + this.right.length;\n }\n\n /**\n * Remove and return `list[0]`;\n * moves the cursor to `0`.\n *\n * @returns {T | undefined}\n * Item, optional.\n */\n shift() {\n this.setCursor(0);\n return this.right.pop();\n }\n\n /**\n * Slice the buffer to get an array;\n * does not move the cursor.\n *\n * @param {number} start\n * Start.\n * @param {number | null | undefined} [end]\n * End (optional).\n * @returns {Array<T>}\n * Array of items.\n */\n slice(start, end) {\n /** @type {number} */\n const stop = end === null || end === undefined ? Number.POSITIVE_INFINITY : end;\n if (stop < this.left.length) {\n return this.left.slice(start, stop);\n }\n if (start > this.left.length) {\n return this.right.slice(this.right.length - stop + this.left.length, this.right.length - start + this.left.length).reverse();\n }\n return this.left.slice(start).concat(this.right.slice(this.right.length - stop + this.left.length).reverse());\n }\n\n /**\n * Mimics the behavior of Array.prototype.splice() except for the change of\n * interface necessary to avoid segfaults when patching in very large arrays.\n *\n * This operation moves cursor is moved to `start` and results in the cursor\n * placed after any inserted items.\n *\n * @param {number} start\n * Start;\n * zero-based index at which to start changing the array;\n * negative numbers count backwards from the end of the array and values\n * that are out-of bounds are clamped to the appropriate end of the array.\n * @param {number | null | undefined} [deleteCount=0]\n * Delete count (default: `0`);\n * maximum number of elements to delete, starting from start.\n * @param {Array<T> | null | undefined} [items=[]]\n * Items to include in place of the deleted items (default: `[]`).\n * @return {Array<T>}\n * Any removed items.\n */\n splice(start, deleteCount, items) {\n /** @type {number} */\n const count = deleteCount || 0;\n this.setCursor(Math.trunc(start));\n const removed = this.right.splice(this.right.length - count, Number.POSITIVE_INFINITY);\n if (items) chunkedPush(this.left, items);\n return removed.reverse();\n }\n\n /**\n * Remove and return the highest-numbered item in the array, so\n * `list[list.length - 1]`;\n * Moves the cursor to `length`.\n *\n * @returns {T | undefined}\n * Item, optional.\n */\n pop() {\n this.setCursor(Number.POSITIVE_INFINITY);\n return this.left.pop();\n }\n\n /**\n * Inserts a single item to the high-numbered side of the array;\n * moves the cursor to `length`.\n *\n * @param {T} item\n * Item.\n * @returns {undefined}\n * Nothing.\n */\n push(item) {\n this.setCursor(Number.POSITIVE_INFINITY);\n this.left.push(item);\n }\n\n /**\n * Inserts many items to the high-numbered side of the array.\n * Moves the cursor to `length`.\n *\n * @param {Array<T>} items\n * Items.\n * @returns {undefined}\n * Nothing.\n */\n pushMany(items) {\n this.setCursor(Number.POSITIVE_INFINITY);\n chunkedPush(this.left, items);\n }\n\n /**\n * Inserts a single item to the low-numbered side of the array;\n * Moves the cursor to `0`.\n *\n * @param {T} item\n * Item.\n * @returns {undefined}\n * Nothing.\n */\n unshift(item) {\n this.setCursor(0);\n this.right.push(item);\n }\n\n /**\n * Inserts many items to the low-numbered side of the array;\n * moves the cursor to `0`.\n *\n * @param {Array<T>} items\n * Items.\n * @returns {undefined}\n * Nothing.\n */\n unshiftMany(items) {\n this.setCursor(0);\n chunkedPush(this.right, items.reverse());\n }\n\n /**\n * Move the cursor to a specific position in the array. Requires\n * time proportional to the distance moved.\n *\n * If `n < 0`, the cursor will end up at the beginning.\n * If `n > length`, the cursor will end up at the end.\n *\n * @param {number} n\n * Position.\n * @return {undefined}\n * Nothing.\n */\n setCursor(n) {\n if (n === this.left.length || n > this.left.length && this.right.length === 0 || n < 0 && this.left.length === 0) return;\n if (n < this.left.length) {\n // Move cursor to the this.left\n const removed = this.left.splice(n, Number.POSITIVE_INFINITY);\n chunkedPush(this.right, removed.reverse());\n } else {\n // Move cursor to the this.right\n const removed = this.right.splice(this.left.length + this.right.length - n, Number.POSITIVE_INFINITY);\n chunkedPush(this.left, removed.reverse());\n }\n }\n}\n\n/**\n * Avoid stack overflow by pushing items onto the stack in segments\n *\n * @template T\n * Item type.\n * @param {Array<T>} list\n * List to inject into.\n * @param {ReadonlyArray<T>} right\n * Items to inject.\n * @return {undefined}\n * Nothing.\n */\nfunction chunkedPush(list, right) {\n /** @type {number} */\n let chunkStart = 0;\n if (right.length < 10000) {\n list.push(...right);\n } else {\n while (chunkStart < right.length) {\n list.push(...right.slice(chunkStart, chunkStart + 10000));\n chunkStart += 10000;\n }\n }\n}","/**\n * @typedef {import('micromark-util-types').Chunk} Chunk\n * @typedef {import('micromark-util-types').Event} Event\n * @typedef {import('micromark-util-types').Token} Token\n */\n\nimport { splice } from 'micromark-util-chunked';\nimport { SpliceBuffer } from './lib/splice-buffer.js';\n\n// Hidden API exposed for testing.\nexport { SpliceBuffer } from './lib/splice-buffer.js';\n\n/**\n * Tokenize subcontent.\n *\n * @param {Array<Event>} eventsArray\n * List of events.\n * @returns {boolean}\n * Whether subtokens were found.\n */\n// eslint-disable-next-line complexity\nexport function subtokenize(eventsArray) {\n /** @type {Record<string, number>} */\n const jumps = {};\n let index = -1;\n /** @type {Event} */\n let event;\n /** @type {number | undefined} */\n let lineIndex;\n /** @type {number} */\n let otherIndex;\n /** @type {Event} */\n let otherEvent;\n /** @type {Array<Event>} */\n let parameters;\n /** @type {Array<Event>} */\n let subevents;\n /** @type {boolean | undefined} */\n let more;\n const events = new SpliceBuffer(eventsArray);\n while (++index < events.length) {\n while (index in jumps) {\n index = jumps[index];\n }\n event = events.get(index);\n\n // Add a hook for the GFM tasklist extension, which needs to know if text\n // is in the first content of a list item.\n if (index && event[1].type === \"chunkFlow\" && events.get(index - 1)[1].type === \"listItemPrefix\") {\n subevents = event[1]._tokenizer.events;\n otherIndex = 0;\n if (otherIndex < subevents.length && subevents[otherIndex][1].type === \"lineEndingBlank\") {\n otherIndex += 2;\n }\n if (otherIndex < subevents.length && subevents[otherIndex][1].type === \"content\") {\n while (++otherIndex < subevents.length) {\n if (subevents[otherIndex][1].type === \"content\") {\n break;\n }\n if (subevents[otherIndex][1].type === \"chunkText\") {\n subevents[otherIndex][1]._isInFirstContentOfListItem = true;\n otherIndex++;\n }\n }\n }\n }\n\n // Enter.\n if (event[0] === 'enter') {\n if (event[1].contentType) {\n Object.assign(jumps, subcontent(events, index));\n index = jumps[index];\n more = true;\n }\n }\n // Exit.\n else if (event[1]._container) {\n otherIndex = index;\n lineIndex = undefined;\n while (otherIndex--) {\n otherEvent = events.get(otherIndex);\n if (otherEvent[1].type === \"lineEnding\" || otherEvent[1].type === \"lineEndingBlank\") {\n if (otherEvent[0] === 'enter') {\n if (lineIndex) {\n events.get(lineIndex)[1].type = \"lineEndingBlank\";\n }\n otherEvent[1].type = \"lineEnding\";\n lineIndex = otherIndex;\n }\n } else {\n break;\n }\n }\n if (lineIndex) {\n // Fix position.\n event[1].end = Object.assign({}, events.get(lineIndex)[1].start);\n\n // Switch container exit w/ line endings.\n parameters = events.slice(lineIndex, index);\n parameters.unshift(event);\n events.splice(lineIndex, index - lineIndex + 1, parameters);\n }\n }\n }\n\n // The changes to the `events` buffer must be copied back into the eventsArray\n splice(eventsArray, 0, Number.POSITIVE_INFINITY, events.slice(0));\n return !more;\n}\n\n/**\n * Tokenize embedded tokens.\n *\n * @param {SpliceBuffer<Event>} events\n * @param {number} eventIndex\n * @returns {Record<string, number>}\n */\nfunction subcontent(events, eventIndex) {\n const token = events.get(eventIndex)[1];\n const context = events.get(eventIndex)[2];\n let startPosition = eventIndex - 1;\n /** @type {Array<number>} */\n const startPositions = [];\n const tokenizer = token._tokenizer || context.parser[token.contentType](token.start);\n const childEvents = tokenizer.events;\n /** @type {Array<[number, number]>} */\n const jumps = [];\n /** @type {Record<string, number>} */\n const gaps = {};\n /** @type {Array<Chunk>} */\n let stream;\n /** @type {Token | undefined} */\n let previous;\n let index = -1;\n /** @type {Token | undefined} */\n let current = token;\n let adjust = 0;\n let start = 0;\n const breaks = [start];\n\n // Loop forward through the linked tokens to pass them in order to the\n // subtokenizer.\n while (current) {\n // Find the position of the event for this token.\n while (events.get(++startPosition)[1] !== current) {\n // Empty.\n }\n startPositions.push(startPosition);\n if (!current._tokenizer) {\n stream = context.sliceStream(current);\n if (!current.next) {\n stream.push(null);\n }\n if (previous) {\n tokenizer.defineSkip(current.start);\n }\n if (current._isInFirstContentOfListItem) {\n tokenizer._gfmTasklistFirstContentOfListItem = true;\n }\n tokenizer.write(stream);\n if (current._isInFirstContentOfListItem) {\n tokenizer._gfmTasklistFirstContentOfListItem = undefined;\n }\n }\n\n // Unravel the next token.\n previous = current;\n current = current.next;\n }\n\n // Now, loop back through all events (and linked tokens), to figure out which\n // parts belong where.\n current = token;\n while (++index < childEvents.length) {\n if (\n // Find a void token that includes a break.\n childEvents[index][0] === 'exit' && childEvents[index - 1][0] === 'enter' && childEvents[index][1].type === childEvents[index - 1][1].type && childEvents[index][1].start.line !== childEvents[index][1].end.line) {\n start = index + 1;\n breaks.push(start);\n // Help GC.\n current._tokenizer = undefined;\n current.previous = undefined;\n current = current.next;\n }\n }\n\n // Help GC.\n tokenizer.events = [];\n\n // If there’s one more token (which is the cases for lines that end in an\n // EOF), that’s perfect: the last point we found starts it.\n // If there isn’t then make sure any remaining content is added to it.\n if (current) {\n // Help GC.\n current._tokenizer = undefined;\n current.previous = undefined;\n } else {\n breaks.pop();\n }\n\n // Now splice the events from the subtokenizer into the current events,\n // moving back to front so that splice indices aren’t affected.\n index = breaks.length;\n while (index--) {\n const slice = childEvents.slice(breaks[index], breaks[index + 1]);\n const start = startPositions.pop();\n jumps.push([start, start + slice.length - 1]);\n events.splice(start, 2, slice);\n }\n jumps.reverse();\n index = -1;\n while (++index < jumps.length) {\n gaps[adjust + jumps[index][0]] = adjust + jumps[index][1];\n adjust += jumps[index][1] - jumps[index][0] - 1;\n }\n return gaps;\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding } from 'micromark-util-character';\nimport { subtokenize } from 'micromark-util-subtokenize';\n/**\n * No name because it must not be turned off.\n * @type {Construct}\n */\nexport const content = {\n tokenize: tokenizeContent,\n resolve: resolveContent\n};\n\n/** @type {Construct} */\nconst continuationConstruct = {\n tokenize: tokenizeContinuation,\n partial: true\n};\n\n/**\n * Content is transparent: it’s parsed right now. That way, definitions are also\n * parsed right now: before text in paragraphs (specifically, media) are parsed.\n *\n * @type {Resolver}\n */\nfunction resolveContent(events) {\n subtokenize(events);\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeContent(effects, ok) {\n /** @type {Token | undefined} */\n let previous;\n return chunkStart;\n\n /**\n * Before a content chunk.\n *\n * ```markdown\n * > | abc\n * ^\n * ```\n *\n * @type {State}\n */\n function chunkStart(code) {\n effects.enter(\"content\");\n previous = effects.enter(\"chunkContent\", {\n contentType: \"content\"\n });\n return chunkInside(code);\n }\n\n /**\n * In a content chunk.\n *\n * ```markdown\n * > | abc\n * ^^^\n * ```\n *\n * @type {State}\n */\n function chunkInside(code) {\n if (code === null) {\n return contentEnd(code);\n }\n\n // To do: in `markdown-rs`, each line is parsed on its own, and everything\n // is stitched together resolving.\n if (markdownLineEnding(code)) {\n return effects.check(continuationConstruct, contentContinue, contentEnd)(code);\n }\n\n // Data.\n effects.consume(code);\n return chunkInside;\n }\n\n /**\n *\n *\n * @type {State}\n */\n function contentEnd(code) {\n effects.exit(\"chunkContent\");\n effects.exit(\"content\");\n return ok(code);\n }\n\n /**\n *\n *\n * @type {State}\n */\n function contentContinue(code) {\n effects.consume(code);\n effects.exit(\"chunkContent\");\n previous.next = effects.enter(\"chunkContent\", {\n contentType: \"content\",\n previous\n });\n previous = previous.next;\n return chunkInside;\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeContinuation(effects, ok, nok) {\n const self = this;\n return startLookahead;\n\n /**\n *\n *\n * @type {State}\n */\n function startLookahead(code) {\n effects.exit(\"chunkContent\");\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return factorySpace(effects, prefixed, \"linePrefix\");\n }\n\n /**\n *\n *\n * @type {State}\n */\n function prefixed(code) {\n if (code === null || markdownLineEnding(code)) {\n return nok(code);\n }\n\n // Always populated by defaults.\n\n const tail = self.events[self.events.length - 1];\n if (!self.parser.constructs.disable.null.includes('codeIndented') && tail && tail[1].type === \"linePrefix\" && tail[2].sliceSerialize(tail[1], true).length >= 4) {\n return ok(code);\n }\n return effects.interrupt(self.parser.constructs.flow, nok, ok)(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Effects} Effects\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenType} TokenType\n */\n\nimport {\n asciiControl,\n markdownLineEndingOrSpace,\n markdownLineEnding\n} from 'micromark-util-character'\n/**\n * Parse destinations.\n *\n * ###### Examples\n *\n * ```markdown\n * <a>\n * <a\\>b>\n * <a b>\n * <a)>\n * a\n * a\\)b\n * a(b)c\n * a(b)\n * ```\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {State} nok\n * State switched to when unsuccessful.\n * @param {TokenType} type\n * Type for whole (`<a>` or `b`).\n * @param {TokenType} literalType\n * Type when enclosed (`<a>`).\n * @param {TokenType} literalMarkerType\n * Type for enclosing (`<` and `>`).\n * @param {TokenType} rawType\n * Type when not enclosed (`b`).\n * @param {TokenType} stringType\n * Type for the value (`a` or `b`).\n * @param {number | undefined} [max=Infinity]\n * Depth of nested parens (inclusive).\n * @returns {State}\n * Start state.\n */ // eslint-disable-next-line max-params\nexport function factoryDestination(\n effects,\n ok,\n nok,\n type,\n literalType,\n literalMarkerType,\n rawType,\n stringType,\n max\n) {\n const limit = max || Number.POSITIVE_INFINITY\n let balance = 0\n return start\n\n /**\n * Start of destination.\n *\n * ```markdown\n * > | <aa>\n * ^\n * > | aa\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n if (code === 60) {\n effects.enter(type)\n effects.enter(literalType)\n effects.enter(literalMarkerType)\n effects.consume(code)\n effects.exit(literalMarkerType)\n return enclosedBefore\n }\n\n // ASCII control, space, closing paren.\n if (code === null || code === 32 || code === 41 || asciiControl(code)) {\n return nok(code)\n }\n effects.enter(type)\n effects.enter(rawType)\n effects.enter(stringType)\n effects.enter('chunkString', {\n contentType: 'string'\n })\n return raw(code)\n }\n\n /**\n * After `<`, at an enclosed destination.\n *\n * ```markdown\n * > | <aa>\n * ^\n * ```\n *\n * @type {State}\n */\n function enclosedBefore(code) {\n if (code === 62) {\n effects.enter(literalMarkerType)\n effects.consume(code)\n effects.exit(literalMarkerType)\n effects.exit(literalType)\n effects.exit(type)\n return ok\n }\n effects.enter(stringType)\n effects.enter('chunkString', {\n contentType: 'string'\n })\n return enclosed(code)\n }\n\n /**\n * In enclosed destination.\n *\n * ```markdown\n * > | <aa>\n * ^\n * ```\n *\n * @type {State}\n */\n function enclosed(code) {\n if (code === 62) {\n effects.exit('chunkString')\n effects.exit(stringType)\n return enclosedBefore(code)\n }\n if (code === null || code === 60 || markdownLineEnding(code)) {\n return nok(code)\n }\n effects.consume(code)\n return code === 92 ? enclosedEscape : enclosed\n }\n\n /**\n * After `\\`, at a special character.\n *\n * ```markdown\n * > | <a\\*a>\n * ^\n * ```\n *\n * @type {State}\n */\n function enclosedEscape(code) {\n if (code === 60 || code === 62 || code === 92) {\n effects.consume(code)\n return enclosed\n }\n return enclosed(code)\n }\n\n /**\n * In raw destination.\n *\n * ```markdown\n * > | aa\n * ^\n * ```\n *\n * @type {State}\n */\n function raw(code) {\n if (\n !balance &&\n (code === null || code === 41 || markdownLineEndingOrSpace(code))\n ) {\n effects.exit('chunkString')\n effects.exit(stringType)\n effects.exit(rawType)\n effects.exit(type)\n return ok(code)\n }\n if (balance < limit && code === 40) {\n effects.consume(code)\n balance++\n return raw\n }\n if (code === 41) {\n effects.consume(code)\n balance--\n return raw\n }\n\n // ASCII control (but *not* `\\0`) and space and `(`.\n // Note: in `markdown-rs`, `\\0` exists in codes, in `micromark-js` it\n // doesn’t.\n if (code === null || code === 32 || code === 40 || asciiControl(code)) {\n return nok(code)\n }\n effects.consume(code)\n return code === 92 ? rawEscape : raw\n }\n\n /**\n * After `\\`, at special character.\n *\n * ```markdown\n * > | a\\*a\n * ^\n * ```\n *\n * @type {State}\n */\n function rawEscape(code) {\n if (code === 40 || code === 41 || code === 92) {\n effects.consume(code)\n return raw\n }\n return raw(code)\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Effects} Effects\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').TokenType} TokenType\n */\n\nimport {markdownLineEnding, markdownSpace} from 'micromark-util-character'\n/**\n * Parse labels.\n *\n * > 👉 **Note**: labels in markdown are capped at 999 characters in the string.\n *\n * ###### Examples\n *\n * ```markdown\n * [a]\n * [a\n * b]\n * [a\\]b]\n * ```\n *\n * @this {TokenizeContext}\n * Tokenize context.\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {State} nok\n * State switched to when unsuccessful.\n * @param {TokenType} type\n * Type of the whole label (`[a]`).\n * @param {TokenType} markerType\n * Type for the markers (`[` and `]`).\n * @param {TokenType} stringType\n * Type for the identifier (`a`).\n * @returns {State}\n * Start state.\n */ // eslint-disable-next-line max-params\nexport function factoryLabel(effects, ok, nok, type, markerType, stringType) {\n const self = this\n let size = 0\n /** @type {boolean} */\n let seen\n return start\n\n /**\n * Start of label.\n *\n * ```markdown\n * > | [a]\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(type)\n effects.enter(markerType)\n effects.consume(code)\n effects.exit(markerType)\n effects.enter(stringType)\n return atBreak\n }\n\n /**\n * In label, at something, before something else.\n *\n * ```markdown\n * > | [a]\n * ^\n * ```\n *\n * @type {State}\n */\n function atBreak(code) {\n if (\n size > 999 ||\n code === null ||\n code === 91 ||\n (code === 93 && !seen) ||\n // To do: remove in the future once we’ve switched from\n // `micromark-extension-footnote` to `micromark-extension-gfm-footnote`,\n // which doesn’t need this.\n // Hidden footnotes hook.\n /* c8 ignore next 3 */\n (code === 94 &&\n !size &&\n '_hiddenFootnoteSupport' in self.parser.constructs)\n ) {\n return nok(code)\n }\n if (code === 93) {\n effects.exit(stringType)\n effects.enter(markerType)\n effects.consume(code)\n effects.exit(markerType)\n effects.exit(type)\n return ok\n }\n\n // To do: indent? Link chunks and EOLs together?\n if (markdownLineEnding(code)) {\n effects.enter('lineEnding')\n effects.consume(code)\n effects.exit('lineEnding')\n return atBreak\n }\n effects.enter('chunkString', {\n contentType: 'string'\n })\n return labelInside(code)\n }\n\n /**\n * In label, in text.\n *\n * ```markdown\n * > | [a]\n * ^\n * ```\n *\n * @type {State}\n */\n function labelInside(code) {\n if (\n code === null ||\n code === 91 ||\n code === 93 ||\n markdownLineEnding(code) ||\n size++ > 999\n ) {\n effects.exit('chunkString')\n return atBreak(code)\n }\n effects.consume(code)\n if (!seen) seen = !markdownSpace(code)\n return code === 92 ? labelEscape : labelInside\n }\n\n /**\n * After `\\`, at a special character.\n *\n * ```markdown\n * > | [a\\*a]\n * ^\n * ```\n *\n * @type {State}\n */\n function labelEscape(code) {\n if (code === 91 || code === 92 || code === 93) {\n effects.consume(code)\n size++\n return labelInside\n }\n return labelInside(code)\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Effects} Effects\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenType} TokenType\n */\n\nimport {factorySpace} from 'micromark-factory-space'\nimport {markdownLineEnding} from 'micromark-util-character'\n/**\n * Parse titles.\n *\n * ###### Examples\n *\n * ```markdown\n * \"a\"\n * 'b'\n * (c)\n * \"a\n * b\"\n * 'a\n * b'\n * (a\\)b)\n * ```\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {State} nok\n * State switched to when unsuccessful.\n * @param {TokenType} type\n * Type of the whole title (`\"a\"`, `'b'`, `(c)`).\n * @param {TokenType} markerType\n * Type for the markers (`\"`, `'`, `(`, and `)`).\n * @param {TokenType} stringType\n * Type for the value (`a`).\n * @returns {State}\n * Start state.\n */ // eslint-disable-next-line max-params\nexport function factoryTitle(effects, ok, nok, type, markerType, stringType) {\n /** @type {NonNullable<Code>} */\n let marker\n return start\n\n /**\n * Start of title.\n *\n * ```markdown\n * > | \"a\"\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n if (code === 34 || code === 39 || code === 40) {\n effects.enter(type)\n effects.enter(markerType)\n effects.consume(code)\n effects.exit(markerType)\n marker = code === 40 ? 41 : code\n return begin\n }\n return nok(code)\n }\n\n /**\n * After opening marker.\n *\n * This is also used at the closing marker.\n *\n * ```markdown\n * > | \"a\"\n * ^\n * ```\n *\n * @type {State}\n */\n function begin(code) {\n if (code === marker) {\n effects.enter(markerType)\n effects.consume(code)\n effects.exit(markerType)\n effects.exit(type)\n return ok\n }\n effects.enter(stringType)\n return atBreak(code)\n }\n\n /**\n * At something, before something else.\n *\n * ```markdown\n * > | \"a\"\n * ^\n * ```\n *\n * @type {State}\n */\n function atBreak(code) {\n if (code === marker) {\n effects.exit(stringType)\n return begin(marker)\n }\n if (code === null) {\n return nok(code)\n }\n\n // Note: blank lines can’t exist in content.\n if (markdownLineEnding(code)) {\n // To do: use `space_or_tab_eol_with_options`, connect.\n effects.enter('lineEnding')\n effects.consume(code)\n effects.exit('lineEnding')\n return factorySpace(effects, atBreak, 'linePrefix')\n }\n effects.enter('chunkString', {\n contentType: 'string'\n })\n return inside(code)\n }\n\n /**\n *\n *\n * @type {State}\n */\n function inside(code) {\n if (code === marker || code === null || markdownLineEnding(code)) {\n effects.exit('chunkString')\n return atBreak(code)\n }\n effects.consume(code)\n return code === 92 ? escape : inside\n }\n\n /**\n * After `\\`, at a special character.\n *\n * ```markdown\n * > | \"a\\*b\"\n * ^\n * ```\n *\n * @type {State}\n */\n function escape(code) {\n if (code === marker || code === 92) {\n effects.consume(code)\n return inside\n }\n return inside(code)\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Effects} Effects\n * @typedef {import('micromark-util-types').State} State\n */\n\nimport {factorySpace} from 'micromark-factory-space'\nimport {markdownLineEnding, markdownSpace} from 'micromark-util-character'\n/**\n * Parse spaces and tabs.\n *\n * There is no `nok` parameter:\n *\n * * line endings or spaces in markdown are often optional, in which case this\n * factory can be used and `ok` will be switched to whether spaces were found\n * or not\n * * one line ending or space can be detected with\n * `markdownLineEndingOrSpace(code)` right before using `factoryWhitespace`\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @returns {State}\n * Start state.\n */\nexport function factoryWhitespace(effects, ok) {\n /** @type {boolean} */\n let seen\n return start\n\n /** @type {State} */\n function start(code) {\n if (markdownLineEnding(code)) {\n effects.enter('lineEnding')\n effects.consume(code)\n effects.exit('lineEnding')\n seen = true\n return start\n }\n if (markdownSpace(code)) {\n return factorySpace(\n effects,\n start,\n seen ? 'linePrefix' : 'lineSuffix'\n )(code)\n }\n return ok(code)\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factoryDestination } from 'micromark-factory-destination';\nimport { factoryLabel } from 'micromark-factory-label';\nimport { factorySpace } from 'micromark-factory-space';\nimport { factoryTitle } from 'micromark-factory-title';\nimport { factoryWhitespace } from 'micromark-factory-whitespace';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\n/** @type {Construct} */\nexport const definition = {\n name: 'definition',\n tokenize: tokenizeDefinition\n};\n\n/** @type {Construct} */\nconst titleBefore = {\n tokenize: tokenizeTitleBefore,\n partial: true\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinition(effects, ok, nok) {\n const self = this;\n /** @type {string} */\n let identifier;\n return start;\n\n /**\n * At start of a definition.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // Do not interrupt paragraphs (but do follow definitions).\n // To do: do `interrupt` the way `markdown-rs` does.\n // To do: parse whitespace the way `markdown-rs` does.\n effects.enter(\"definition\");\n return before(code);\n }\n\n /**\n * After optional whitespace, at `[`.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function before(code) {\n // To do: parse whitespace the way `markdown-rs` does.\n\n return factoryLabel.call(self, effects, labelAfter,\n // Note: we don’t need to reset the way `markdown-rs` does.\n nok, \"definitionLabel\", \"definitionLabelMarker\", \"definitionLabelString\")(code);\n }\n\n /**\n * After label.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function labelAfter(code) {\n identifier = normalizeIdentifier(self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1));\n if (code === 58) {\n effects.enter(\"definitionMarker\");\n effects.consume(code);\n effects.exit(\"definitionMarker\");\n return markerAfter;\n }\n return nok(code);\n }\n\n /**\n * After marker.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function markerAfter(code) {\n // Note: whitespace is optional.\n return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, destinationBefore)(code) : destinationBefore(code);\n }\n\n /**\n * Before destination.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function destinationBefore(code) {\n return factoryDestination(effects, destinationAfter,\n // Note: we don’t need to reset the way `markdown-rs` does.\n nok, \"definitionDestination\", \"definitionDestinationLiteral\", \"definitionDestinationLiteralMarker\", \"definitionDestinationRaw\", \"definitionDestinationString\")(code);\n }\n\n /**\n * After destination.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function destinationAfter(code) {\n return effects.attempt(titleBefore, after, after)(code);\n }\n\n /**\n * After definition.\n *\n * ```markdown\n * > | [a]: b\n * ^\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n return markdownSpace(code) ? factorySpace(effects, afterWhitespace, \"whitespace\")(code) : afterWhitespace(code);\n }\n\n /**\n * After definition, after optional whitespace.\n *\n * ```markdown\n * > | [a]: b\n * ^\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function afterWhitespace(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"definition\");\n\n // Note: we don’t care about uniqueness.\n // It’s likely that that doesn’t happen very frequently.\n // It is more likely that it wastes precious time.\n self.parser.defined.push(identifier);\n\n // To do: `markdown-rs` interrupt.\n // // You’d be interrupting.\n // tokenizer.interrupt = true\n return ok(code);\n }\n return nok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTitleBefore(effects, ok, nok) {\n return titleBefore;\n\n /**\n * After destination, at whitespace.\n *\n * ```markdown\n * > | [a]: b\n * ^\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function titleBefore(code) {\n return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, beforeMarker)(code) : nok(code);\n }\n\n /**\n * At title.\n *\n * ```markdown\n * | [a]: b\n * > | \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function beforeMarker(code) {\n return factoryTitle(effects, titleAfter, nok, \"definitionTitle\", \"definitionTitleMarker\", \"definitionTitleString\")(code);\n }\n\n /**\n * After title.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function titleAfter(code) {\n return markdownSpace(code) ? factorySpace(effects, titleAfterOptionalWhitespace, \"whitespace\")(code) : titleAfterOptionalWhitespace(code);\n }\n\n /**\n * After title, after optional whitespace.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function titleAfterOptionalWhitespace(code) {\n return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { markdownLineEnding } from 'micromark-util-character';\n/** @type {Construct} */\nexport const hardBreakEscape = {\n name: 'hardBreakEscape',\n tokenize: tokenizeHardBreakEscape\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeHardBreakEscape(effects, ok, nok) {\n return start;\n\n /**\n * Start of a hard break (escape).\n *\n * ```markdown\n * > | a\\\n * ^\n * | b\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"hardBreakEscape\");\n effects.consume(code);\n return after;\n }\n\n /**\n * After `\\`, at eol.\n *\n * ```markdown\n * > | a\\\n * ^\n * | b\n * ```\n *\n * @type {State}\n */\n function after(code) {\n if (markdownLineEnding(code)) {\n effects.exit(\"hardBreakEscape\");\n return ok(code);\n }\n return nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nimport { splice } from 'micromark-util-chunked';\n/** @type {Construct} */\nexport const headingAtx = {\n name: 'headingAtx',\n tokenize: tokenizeHeadingAtx,\n resolve: resolveHeadingAtx\n};\n\n/** @type {Resolver} */\nfunction resolveHeadingAtx(events, context) {\n let contentEnd = events.length - 2;\n let contentStart = 3;\n /** @type {Token} */\n let content;\n /** @type {Token} */\n let text;\n\n // Prefix whitespace, part of the opening.\n if (events[contentStart][1].type === \"whitespace\") {\n contentStart += 2;\n }\n\n // Suffix whitespace, part of the closing.\n if (contentEnd - 2 > contentStart && events[contentEnd][1].type === \"whitespace\") {\n contentEnd -= 2;\n }\n if (events[contentEnd][1].type === \"atxHeadingSequence\" && (contentStart === contentEnd - 1 || contentEnd - 4 > contentStart && events[contentEnd - 2][1].type === \"whitespace\")) {\n contentEnd -= contentStart + 1 === contentEnd ? 2 : 4;\n }\n if (contentEnd > contentStart) {\n content = {\n type: \"atxHeadingText\",\n start: events[contentStart][1].start,\n end: events[contentEnd][1].end\n };\n text = {\n type: \"chunkText\",\n start: events[contentStart][1].start,\n end: events[contentEnd][1].end,\n contentType: \"text\"\n };\n splice(events, contentStart, contentEnd - contentStart + 1, [['enter', content, context], ['enter', text, context], ['exit', text, context], ['exit', content, context]]);\n }\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeHeadingAtx(effects, ok, nok) {\n let size = 0;\n return start;\n\n /**\n * Start of a heading (atx).\n *\n * ```markdown\n * > | ## aa\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // To do: parse indent like `markdown-rs`.\n effects.enter(\"atxHeading\");\n return before(code);\n }\n\n /**\n * After optional whitespace, at `#`.\n *\n * ```markdown\n * > | ## aa\n * ^\n * ```\n *\n * @type {State}\n */\n function before(code) {\n effects.enter(\"atxHeadingSequence\");\n return sequenceOpen(code);\n }\n\n /**\n * In opening sequence.\n *\n * ```markdown\n * > | ## aa\n * ^\n * ```\n *\n * @type {State}\n */\n function sequenceOpen(code) {\n if (code === 35 && size++ < 6) {\n effects.consume(code);\n return sequenceOpen;\n }\n\n // Always at least one `#`.\n if (code === null || markdownLineEndingOrSpace(code)) {\n effects.exit(\"atxHeadingSequence\");\n return atBreak(code);\n }\n return nok(code);\n }\n\n /**\n * After something, before something else.\n *\n * ```markdown\n * > | ## aa\n * ^\n * ```\n *\n * @type {State}\n */\n function atBreak(code) {\n if (code === 35) {\n effects.enter(\"atxHeadingSequence\");\n return sequenceFurther(code);\n }\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"atxHeading\");\n // To do: interrupt like `markdown-rs`.\n // // Feel free to interrupt.\n // tokenizer.interrupt = false\n return ok(code);\n }\n if (markdownSpace(code)) {\n return factorySpace(effects, atBreak, \"whitespace\")(code);\n }\n\n // To do: generate `data` tokens, add the `text` token later.\n // Needs edit map, see: `markdown.rs`.\n effects.enter(\"atxHeadingText\");\n return data(code);\n }\n\n /**\n * In further sequence (after whitespace).\n *\n * Could be normal “visible” hashes in the heading or a final sequence.\n *\n * ```markdown\n * > | ## aa ##\n * ^\n * ```\n *\n * @type {State}\n */\n function sequenceFurther(code) {\n if (code === 35) {\n effects.consume(code);\n return sequenceFurther;\n }\n effects.exit(\"atxHeadingSequence\");\n return atBreak(code);\n }\n\n /**\n * In text.\n *\n * ```markdown\n * > | ## aa\n * ^\n * ```\n *\n * @type {State}\n */\n function data(code) {\n if (code === null || code === 35 || markdownLineEndingOrSpace(code)) {\n effects.exit(\"atxHeadingText\");\n return atBreak(code);\n }\n effects.consume(code);\n return data;\n }\n}","/**\n * List of lowercase HTML “block” tag names.\n *\n * The list, when parsing HTML (flow), results in more relaxed rules (condition\n * 6).\n * Because they are known blocks, the HTML-like syntax doesn’t have to be\n * strictly parsed.\n * For tag names not in this list, a more strict algorithm (condition 7) is used\n * to detect whether the HTML-like syntax is seen as HTML (flow) or not.\n *\n * This is copied from:\n * <https://spec.commonmark.org/0.30/#html-blocks>.\n *\n * > 👉 **Note**: `search` was added in `CommonMark@0.31`.\n */\nexport const htmlBlockNames = [\n 'address',\n 'article',\n 'aside',\n 'base',\n 'basefont',\n 'blockquote',\n 'body',\n 'caption',\n 'center',\n 'col',\n 'colgroup',\n 'dd',\n 'details',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'frame',\n 'frameset',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hr',\n 'html',\n 'iframe',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'menu',\n 'menuitem',\n 'nav',\n 'noframes',\n 'ol',\n 'optgroup',\n 'option',\n 'p',\n 'param',\n 'search',\n 'section',\n 'summary',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'title',\n 'tr',\n 'track',\n 'ul'\n]\n\n/**\n * List of lowercase HTML “raw” tag names.\n *\n * The list, when parsing HTML (flow), results in HTML that can include lines\n * without exiting, until a closing tag also in this list is found (condition\n * 1).\n *\n * This module is copied from:\n * <https://spec.commonmark.org/0.30/#html-blocks>.\n *\n * > 👉 **Note**: `textarea` was added in `CommonMark@0.30`.\n */\nexport const htmlRawNames = ['pre', 'script', 'style', 'textarea']\n","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { asciiAlpha, asciiAlphanumeric, markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nimport { htmlBlockNames, htmlRawNames } from 'micromark-util-html-tag-name';\nimport { blankLine } from './blank-line.js';\n\n/** @type {Construct} */\nexport const htmlFlow = {\n name: 'htmlFlow',\n tokenize: tokenizeHtmlFlow,\n resolveTo: resolveToHtmlFlow,\n concrete: true\n};\n\n/** @type {Construct} */\nconst blankLineBefore = {\n tokenize: tokenizeBlankLineBefore,\n partial: true\n};\nconst nonLazyContinuationStart = {\n tokenize: tokenizeNonLazyContinuationStart,\n partial: true\n};\n\n/** @type {Resolver} */\nfunction resolveToHtmlFlow(events) {\n let index = events.length;\n while (index--) {\n if (events[index][0] === 'enter' && events[index][1].type === \"htmlFlow\") {\n break;\n }\n }\n if (index > 1 && events[index - 2][1].type === \"linePrefix\") {\n // Add the prefix start to the HTML token.\n events[index][1].start = events[index - 2][1].start;\n // Add the prefix start to the HTML line token.\n events[index + 1][1].start = events[index - 2][1].start;\n // Remove the line prefix.\n events.splice(index - 2, 2);\n }\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeHtmlFlow(effects, ok, nok) {\n const self = this;\n /** @type {number} */\n let marker;\n /** @type {boolean} */\n let closingTag;\n /** @type {string} */\n let buffer;\n /** @type {number} */\n let index;\n /** @type {Code} */\n let markerB;\n return start;\n\n /**\n * Start of HTML (flow).\n *\n * ```markdown\n * > | <x />\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // To do: parse indent like `markdown-rs`.\n return before(code);\n }\n\n /**\n * At `<`, after optional whitespace.\n *\n * ```markdown\n * > | <x />\n * ^\n * ```\n *\n * @type {State}\n */\n function before(code) {\n effects.enter(\"htmlFlow\");\n effects.enter(\"htmlFlowData\");\n effects.consume(code);\n return open;\n }\n\n /**\n * After `<`, at tag name or other stuff.\n *\n * ```markdown\n * > | <x />\n * ^\n * > | <!doctype>\n * ^\n * > | <!--xxx-->\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (code === 33) {\n effects.consume(code);\n return declarationOpen;\n }\n if (code === 47) {\n effects.consume(code);\n closingTag = true;\n return tagCloseStart;\n }\n if (code === 63) {\n effects.consume(code);\n marker = 3;\n // To do:\n // tokenizer.concrete = true\n // To do: use `markdown-rs` style interrupt.\n // While we’re in an instruction instead of a declaration, we’re on a `?`\n // right now, so we do need to search for `>`, similar to declarations.\n return self.interrupt ? ok : continuationDeclarationInside;\n }\n\n // ASCII alphabetical.\n if (asciiAlpha(code)) {\n effects.consume(code);\n // @ts-expect-error: not null.\n buffer = String.fromCharCode(code);\n return tagName;\n }\n return nok(code);\n }\n\n /**\n * After `<!`, at declaration, comment, or CDATA.\n *\n * ```markdown\n * > | <!doctype>\n * ^\n * > | <!--xxx-->\n * ^\n * > | <![CDATA[>&<]]>\n * ^\n * ```\n *\n * @type {State}\n */\n function declarationOpen(code) {\n if (code === 45) {\n effects.consume(code);\n marker = 2;\n return commentOpenInside;\n }\n if (code === 91) {\n effects.consume(code);\n marker = 5;\n index = 0;\n return cdataOpenInside;\n }\n\n // ASCII alphabetical.\n if (asciiAlpha(code)) {\n effects.consume(code);\n marker = 4;\n // // Do not form containers.\n // tokenizer.concrete = true\n return self.interrupt ? ok : continuationDeclarationInside;\n }\n return nok(code);\n }\n\n /**\n * After `<!-`, inside a comment, at another `-`.\n *\n * ```markdown\n * > | <!--xxx-->\n * ^\n * ```\n *\n * @type {State}\n */\n function commentOpenInside(code) {\n if (code === 45) {\n effects.consume(code);\n // // Do not form containers.\n // tokenizer.concrete = true\n return self.interrupt ? ok : continuationDeclarationInside;\n }\n return nok(code);\n }\n\n /**\n * After `<![`, inside CDATA, expecting `CDATA[`.\n *\n * ```markdown\n * > | <![CDATA[>&<]]>\n * ^^^^^^\n * ```\n *\n * @type {State}\n */\n function cdataOpenInside(code) {\n const value = \"CDATA[\";\n if (code === value.charCodeAt(index++)) {\n effects.consume(code);\n if (index === value.length) {\n // // Do not form containers.\n // tokenizer.concrete = true\n return self.interrupt ? ok : continuation;\n }\n return cdataOpenInside;\n }\n return nok(code);\n }\n\n /**\n * After `</`, in closing tag, at tag name.\n *\n * ```markdown\n * > | </x>\n * ^\n * ```\n *\n * @type {State}\n */\n function tagCloseStart(code) {\n if (asciiAlpha(code)) {\n effects.consume(code);\n // @ts-expect-error: not null.\n buffer = String.fromCharCode(code);\n return tagName;\n }\n return nok(code);\n }\n\n /**\n * In tag name.\n *\n * ```markdown\n * > | <ab>\n * ^^\n * > | </ab>\n * ^^\n * ```\n *\n * @type {State}\n */\n function tagName(code) {\n if (code === null || code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {\n const slash = code === 47;\n const name = buffer.toLowerCase();\n if (!slash && !closingTag && htmlRawNames.includes(name)) {\n marker = 1;\n // // Do not form containers.\n // tokenizer.concrete = true\n return self.interrupt ? ok(code) : continuation(code);\n }\n if (htmlBlockNames.includes(buffer.toLowerCase())) {\n marker = 6;\n if (slash) {\n effects.consume(code);\n return basicSelfClosing;\n }\n\n // // Do not form containers.\n // tokenizer.concrete = true\n return self.interrupt ? ok(code) : continuation(code);\n }\n marker = 7;\n // Do not support complete HTML when interrupting.\n return self.interrupt && !self.parser.lazy[self.now().line] ? nok(code) : closingTag ? completeClosingTagAfter(code) : completeAttributeNameBefore(code);\n }\n\n // ASCII alphanumerical and `-`.\n if (code === 45 || asciiAlphanumeric(code)) {\n effects.consume(code);\n buffer += String.fromCharCode(code);\n return tagName;\n }\n return nok(code);\n }\n\n /**\n * After closing slash of a basic tag name.\n *\n * ```markdown\n * > | <div/>\n * ^\n * ```\n *\n * @type {State}\n */\n function basicSelfClosing(code) {\n if (code === 62) {\n effects.consume(code);\n // // Do not form containers.\n // tokenizer.concrete = true\n return self.interrupt ? ok : continuation;\n }\n return nok(code);\n }\n\n /**\n * After closing slash of a complete tag name.\n *\n * ```markdown\n * > | <x/>\n * ^\n * ```\n *\n * @type {State}\n */\n function completeClosingTagAfter(code) {\n if (markdownSpace(code)) {\n effects.consume(code);\n return completeClosingTagAfter;\n }\n return completeEnd(code);\n }\n\n /**\n * At an attribute name.\n *\n * At first, this state is used after a complete tag name, after whitespace,\n * where it expects optional attributes or the end of the tag.\n * It is also reused after attributes, when expecting more optional\n * attributes.\n *\n * ```markdown\n * > | <a />\n * ^\n * > | <a :b>\n * ^\n * > | <a _b>\n * ^\n * > | <a b>\n * ^\n * > | <a >\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeNameBefore(code) {\n if (code === 47) {\n effects.consume(code);\n return completeEnd;\n }\n\n // ASCII alphanumerical and `:` and `_`.\n if (code === 58 || code === 95 || asciiAlpha(code)) {\n effects.consume(code);\n return completeAttributeName;\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return completeAttributeNameBefore;\n }\n return completeEnd(code);\n }\n\n /**\n * In attribute name.\n *\n * ```markdown\n * > | <a :b>\n * ^\n * > | <a _b>\n * ^\n * > | <a b>\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeName(code) {\n // ASCII alphanumerical and `-`, `.`, `:`, and `_`.\n if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) {\n effects.consume(code);\n return completeAttributeName;\n }\n return completeAttributeNameAfter(code);\n }\n\n /**\n * After attribute name, at an optional initializer, the end of the tag, or\n * whitespace.\n *\n * ```markdown\n * > | <a b>\n * ^\n * > | <a b=c>\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeNameAfter(code) {\n if (code === 61) {\n effects.consume(code);\n return completeAttributeValueBefore;\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return completeAttributeNameAfter;\n }\n return completeAttributeNameBefore(code);\n }\n\n /**\n * Before unquoted, double quoted, or single quoted attribute value, allowing\n * whitespace.\n *\n * ```markdown\n * > | <a b=c>\n * ^\n * > | <a b=\"c\">\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeValueBefore(code) {\n if (code === null || code === 60 || code === 61 || code === 62 || code === 96) {\n return nok(code);\n }\n if (code === 34 || code === 39) {\n effects.consume(code);\n markerB = code;\n return completeAttributeValueQuoted;\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return completeAttributeValueBefore;\n }\n return completeAttributeValueUnquoted(code);\n }\n\n /**\n * In double or single quoted attribute value.\n *\n * ```markdown\n * > | <a b=\"c\">\n * ^\n * > | <a b='c'>\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeValueQuoted(code) {\n if (code === markerB) {\n effects.consume(code);\n markerB = null;\n return completeAttributeValueQuotedAfter;\n }\n if (code === null || markdownLineEnding(code)) {\n return nok(code);\n }\n effects.consume(code);\n return completeAttributeValueQuoted;\n }\n\n /**\n * In unquoted attribute value.\n *\n * ```markdown\n * > | <a b=c>\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeValueUnquoted(code) {\n if (code === null || code === 34 || code === 39 || code === 47 || code === 60 || code === 61 || code === 62 || code === 96 || markdownLineEndingOrSpace(code)) {\n return completeAttributeNameAfter(code);\n }\n effects.consume(code);\n return completeAttributeValueUnquoted;\n }\n\n /**\n * After double or single quoted attribute value, before whitespace or the\n * end of the tag.\n *\n * ```markdown\n * > | <a b=\"c\">\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeValueQuotedAfter(code) {\n if (code === 47 || code === 62 || markdownSpace(code)) {\n return completeAttributeNameBefore(code);\n }\n return nok(code);\n }\n\n /**\n * In certain circumstances of a complete tag where only an `>` is allowed.\n *\n * ```markdown\n * > | <a b=\"c\">\n * ^\n * ```\n *\n * @type {State}\n */\n function completeEnd(code) {\n if (code === 62) {\n effects.consume(code);\n return completeAfter;\n }\n return nok(code);\n }\n\n /**\n * After `>` in a complete tag.\n *\n * ```markdown\n * > | <x>\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAfter(code) {\n if (code === null || markdownLineEnding(code)) {\n // // Do not form containers.\n // tokenizer.concrete = true\n return continuation(code);\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return completeAfter;\n }\n return nok(code);\n }\n\n /**\n * In continuation of any HTML kind.\n *\n * ```markdown\n * > | <!--xxx-->\n * ^\n * ```\n *\n * @type {State}\n */\n function continuation(code) {\n if (code === 45 && marker === 2) {\n effects.consume(code);\n return continuationCommentInside;\n }\n if (code === 60 && marker === 1) {\n effects.consume(code);\n return continuationRawTagOpen;\n }\n if (code === 62 && marker === 4) {\n effects.consume(code);\n return continuationClose;\n }\n if (code === 63 && marker === 3) {\n effects.consume(code);\n return continuationDeclarationInside;\n }\n if (code === 93 && marker === 5) {\n effects.consume(code);\n return continuationCdataInside;\n }\n if (markdownLineEnding(code) && (marker === 6 || marker === 7)) {\n effects.exit(\"htmlFlowData\");\n return effects.check(blankLineBefore, continuationAfter, continuationStart)(code);\n }\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"htmlFlowData\");\n return continuationStart(code);\n }\n effects.consume(code);\n return continuation;\n }\n\n /**\n * In continuation, at eol.\n *\n * ```markdown\n * > | <x>\n * ^\n * | asd\n * ```\n *\n * @type {State}\n */\n function continuationStart(code) {\n return effects.check(nonLazyContinuationStart, continuationStartNonLazy, continuationAfter)(code);\n }\n\n /**\n * In continuation, at eol, before non-lazy content.\n *\n * ```markdown\n * > | <x>\n * ^\n * | asd\n * ```\n *\n * @type {State}\n */\n function continuationStartNonLazy(code) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return continuationBefore;\n }\n\n /**\n * In continuation, before non-lazy content.\n *\n * ```markdown\n * | <x>\n * > | asd\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationBefore(code) {\n if (code === null || markdownLineEnding(code)) {\n return continuationStart(code);\n }\n effects.enter(\"htmlFlowData\");\n return continuation(code);\n }\n\n /**\n * In comment continuation, after one `-`, expecting another.\n *\n * ```markdown\n * > | <!--xxx-->\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationCommentInside(code) {\n if (code === 45) {\n effects.consume(code);\n return continuationDeclarationInside;\n }\n return continuation(code);\n }\n\n /**\n * In raw continuation, after `<`, at `/`.\n *\n * ```markdown\n * > | <script>console.log(1)</script>\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationRawTagOpen(code) {\n if (code === 47) {\n effects.consume(code);\n buffer = '';\n return continuationRawEndTag;\n }\n return continuation(code);\n }\n\n /**\n * In raw continuation, after `</`, in a raw tag name.\n *\n * ```markdown\n * > | <script>console.log(1)</script>\n * ^^^^^^\n * ```\n *\n * @type {State}\n */\n function continuationRawEndTag(code) {\n if (code === 62) {\n const name = buffer.toLowerCase();\n if (htmlRawNames.includes(name)) {\n effects.consume(code);\n return continuationClose;\n }\n return continuation(code);\n }\n if (asciiAlpha(code) && buffer.length < 8) {\n effects.consume(code);\n // @ts-expect-error: not null.\n buffer += String.fromCharCode(code);\n return continuationRawEndTag;\n }\n return continuation(code);\n }\n\n /**\n * In cdata continuation, after `]`, expecting `]>`.\n *\n * ```markdown\n * > | <![CDATA[>&<]]>\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationCdataInside(code) {\n if (code === 93) {\n effects.consume(code);\n return continuationDeclarationInside;\n }\n return continuation(code);\n }\n\n /**\n * In declaration or instruction continuation, at `>`.\n *\n * ```markdown\n * > | <!-->\n * ^\n * > | <?>\n * ^\n * > | <!q>\n * ^\n * > | <!--ab-->\n * ^\n * > | <![CDATA[>&<]]>\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationDeclarationInside(code) {\n if (code === 62) {\n effects.consume(code);\n return continuationClose;\n }\n\n // More dashes.\n if (code === 45 && marker === 2) {\n effects.consume(code);\n return continuationDeclarationInside;\n }\n return continuation(code);\n }\n\n /**\n * In closed continuation: everything we get until the eol/eof is part of it.\n *\n * ```markdown\n * > | <!doctype>\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationClose(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"htmlFlowData\");\n return continuationAfter(code);\n }\n effects.consume(code);\n return continuationClose;\n }\n\n /**\n * Done.\n *\n * ```markdown\n * > | <!doctype>\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationAfter(code) {\n effects.exit(\"htmlFlow\");\n // // Feel free to interrupt.\n // tokenizer.interrupt = false\n // // No longer concrete.\n // tokenizer.concrete = false\n return ok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeNonLazyContinuationStart(effects, ok, nok) {\n const self = this;\n return start;\n\n /**\n * At eol, before continuation.\n *\n * ```markdown\n * > | * ```js\n * ^\n * | b\n * ```\n *\n * @type {State}\n */\n function start(code) {\n if (markdownLineEnding(code)) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return after;\n }\n return nok(code);\n }\n\n /**\n * A continuation.\n *\n * ```markdown\n * | * ```js\n * > | b\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n return self.parser.lazy[self.now().line] ? nok(code) : ok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLineBefore(effects, ok, nok) {\n return start;\n\n /**\n * Before eol, expecting blank line.\n *\n * ```markdown\n * > | <div>\n * ^\n * |\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return effects.attempt(blankLine, ok, nok);\n }\n}","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { asciiAlpha, asciiAlphanumeric, markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const htmlText = {\n name: 'htmlText',\n tokenize: tokenizeHtmlText\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeHtmlText(effects, ok, nok) {\n const self = this;\n /** @type {NonNullable<Code> | undefined} */\n let marker;\n /** @type {number} */\n let index;\n /** @type {State} */\n let returnState;\n return start;\n\n /**\n * Start of HTML (text).\n *\n * ```markdown\n * > | a <b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"htmlText\");\n effects.enter(\"htmlTextData\");\n effects.consume(code);\n return open;\n }\n\n /**\n * After `<`, at tag name or other stuff.\n *\n * ```markdown\n * > | a <b> c\n * ^\n * > | a <!doctype> c\n * ^\n * > | a <!--b--> c\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (code === 33) {\n effects.consume(code);\n return declarationOpen;\n }\n if (code === 47) {\n effects.consume(code);\n return tagCloseStart;\n }\n if (code === 63) {\n effects.consume(code);\n return instruction;\n }\n\n // ASCII alphabetical.\n if (asciiAlpha(code)) {\n effects.consume(code);\n return tagOpen;\n }\n return nok(code);\n }\n\n /**\n * After `<!`, at declaration, comment, or CDATA.\n *\n * ```markdown\n * > | a <!doctype> c\n * ^\n * > | a <!--b--> c\n * ^\n * > | a <![CDATA[>&<]]> c\n * ^\n * ```\n *\n * @type {State}\n */\n function declarationOpen(code) {\n if (code === 45) {\n effects.consume(code);\n return commentOpenInside;\n }\n if (code === 91) {\n effects.consume(code);\n index = 0;\n return cdataOpenInside;\n }\n if (asciiAlpha(code)) {\n effects.consume(code);\n return declaration;\n }\n return nok(code);\n }\n\n /**\n * In a comment, after `<!-`, at another `-`.\n *\n * ```markdown\n * > | a <!--b--> c\n * ^\n * ```\n *\n * @type {State}\n */\n function commentOpenInside(code) {\n if (code === 45) {\n effects.consume(code);\n return commentEnd;\n }\n return nok(code);\n }\n\n /**\n * In comment.\n *\n * ```markdown\n * > | a <!--b--> c\n * ^\n * ```\n *\n * @type {State}\n */\n function comment(code) {\n if (code === null) {\n return nok(code);\n }\n if (code === 45) {\n effects.consume(code);\n return commentClose;\n }\n if (markdownLineEnding(code)) {\n returnState = comment;\n return lineEndingBefore(code);\n }\n effects.consume(code);\n return comment;\n }\n\n /**\n * In comment, after `-`.\n *\n * ```markdown\n * > | a <!--b--> c\n * ^\n * ```\n *\n * @type {State}\n */\n function commentClose(code) {\n if (code === 45) {\n effects.consume(code);\n return commentEnd;\n }\n return comment(code);\n }\n\n /**\n * In comment, after `--`.\n *\n * ```markdown\n * > | a <!--b--> c\n * ^\n * ```\n *\n * @type {State}\n */\n function commentEnd(code) {\n return code === 62 ? end(code) : code === 45 ? commentClose(code) : comment(code);\n }\n\n /**\n * After `<![`, in CDATA, expecting `CDATA[`.\n *\n * ```markdown\n * > | a <![CDATA[>&<]]> b\n * ^^^^^^\n * ```\n *\n * @type {State}\n */\n function cdataOpenInside(code) {\n const value = \"CDATA[\";\n if (code === value.charCodeAt(index++)) {\n effects.consume(code);\n return index === value.length ? cdata : cdataOpenInside;\n }\n return nok(code);\n }\n\n /**\n * In CDATA.\n *\n * ```markdown\n * > | a <![CDATA[>&<]]> b\n * ^^^\n * ```\n *\n * @type {State}\n */\n function cdata(code) {\n if (code === null) {\n return nok(code);\n }\n if (code === 93) {\n effects.consume(code);\n return cdataClose;\n }\n if (markdownLineEnding(code)) {\n returnState = cdata;\n return lineEndingBefore(code);\n }\n effects.consume(code);\n return cdata;\n }\n\n /**\n * In CDATA, after `]`, at another `]`.\n *\n * ```markdown\n * > | a <![CDATA[>&<]]> b\n * ^\n * ```\n *\n * @type {State}\n */\n function cdataClose(code) {\n if (code === 93) {\n effects.consume(code);\n return cdataEnd;\n }\n return cdata(code);\n }\n\n /**\n * In CDATA, after `]]`, at `>`.\n *\n * ```markdown\n * > | a <![CDATA[>&<]]> b\n * ^\n * ```\n *\n * @type {State}\n */\n function cdataEnd(code) {\n if (code === 62) {\n return end(code);\n }\n if (code === 93) {\n effects.consume(code);\n return cdataEnd;\n }\n return cdata(code);\n }\n\n /**\n * In declaration.\n *\n * ```markdown\n * > | a <!b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function declaration(code) {\n if (code === null || code === 62) {\n return end(code);\n }\n if (markdownLineEnding(code)) {\n returnState = declaration;\n return lineEndingBefore(code);\n }\n effects.consume(code);\n return declaration;\n }\n\n /**\n * In instruction.\n *\n * ```markdown\n * > | a <?b?> c\n * ^\n * ```\n *\n * @type {State}\n */\n function instruction(code) {\n if (code === null) {\n return nok(code);\n }\n if (code === 63) {\n effects.consume(code);\n return instructionClose;\n }\n if (markdownLineEnding(code)) {\n returnState = instruction;\n return lineEndingBefore(code);\n }\n effects.consume(code);\n return instruction;\n }\n\n /**\n * In instruction, after `?`, at `>`.\n *\n * ```markdown\n * > | a <?b?> c\n * ^\n * ```\n *\n * @type {State}\n */\n function instructionClose(code) {\n return code === 62 ? end(code) : instruction(code);\n }\n\n /**\n * After `</`, in closing tag, at tag name.\n *\n * ```markdown\n * > | a </b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function tagCloseStart(code) {\n // ASCII alphabetical.\n if (asciiAlpha(code)) {\n effects.consume(code);\n return tagClose;\n }\n return nok(code);\n }\n\n /**\n * After `</x`, in a tag name.\n *\n * ```markdown\n * > | a </b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function tagClose(code) {\n // ASCII alphanumerical and `-`.\n if (code === 45 || asciiAlphanumeric(code)) {\n effects.consume(code);\n return tagClose;\n }\n return tagCloseBetween(code);\n }\n\n /**\n * In closing tag, after tag name.\n *\n * ```markdown\n * > | a </b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function tagCloseBetween(code) {\n if (markdownLineEnding(code)) {\n returnState = tagCloseBetween;\n return lineEndingBefore(code);\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return tagCloseBetween;\n }\n return end(code);\n }\n\n /**\n * After `<x`, in opening tag name.\n *\n * ```markdown\n * > | a <b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpen(code) {\n // ASCII alphanumerical and `-`.\n if (code === 45 || asciiAlphanumeric(code)) {\n effects.consume(code);\n return tagOpen;\n }\n if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {\n return tagOpenBetween(code);\n }\n return nok(code);\n }\n\n /**\n * In opening tag, after tag name.\n *\n * ```markdown\n * > | a <b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenBetween(code) {\n if (code === 47) {\n effects.consume(code);\n return end;\n }\n\n // ASCII alphabetical and `:` and `_`.\n if (code === 58 || code === 95 || asciiAlpha(code)) {\n effects.consume(code);\n return tagOpenAttributeName;\n }\n if (markdownLineEnding(code)) {\n returnState = tagOpenBetween;\n return lineEndingBefore(code);\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return tagOpenBetween;\n }\n return end(code);\n }\n\n /**\n * In attribute name.\n *\n * ```markdown\n * > | a <b c> d\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenAttributeName(code) {\n // ASCII alphabetical and `-`, `.`, `:`, and `_`.\n if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) {\n effects.consume(code);\n return tagOpenAttributeName;\n }\n return tagOpenAttributeNameAfter(code);\n }\n\n /**\n * After attribute name, before initializer, the end of the tag, or\n * whitespace.\n *\n * ```markdown\n * > | a <b c> d\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenAttributeNameAfter(code) {\n if (code === 61) {\n effects.consume(code);\n return tagOpenAttributeValueBefore;\n }\n if (markdownLineEnding(code)) {\n returnState = tagOpenAttributeNameAfter;\n return lineEndingBefore(code);\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return tagOpenAttributeNameAfter;\n }\n return tagOpenBetween(code);\n }\n\n /**\n * Before unquoted, double quoted, or single quoted attribute value, allowing\n * whitespace.\n *\n * ```markdown\n * > | a <b c=d> e\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenAttributeValueBefore(code) {\n if (code === null || code === 60 || code === 61 || code === 62 || code === 96) {\n return nok(code);\n }\n if (code === 34 || code === 39) {\n effects.consume(code);\n marker = code;\n return tagOpenAttributeValueQuoted;\n }\n if (markdownLineEnding(code)) {\n returnState = tagOpenAttributeValueBefore;\n return lineEndingBefore(code);\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return tagOpenAttributeValueBefore;\n }\n effects.consume(code);\n return tagOpenAttributeValueUnquoted;\n }\n\n /**\n * In double or single quoted attribute value.\n *\n * ```markdown\n * > | a <b c=\"d\"> e\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenAttributeValueQuoted(code) {\n if (code === marker) {\n effects.consume(code);\n marker = undefined;\n return tagOpenAttributeValueQuotedAfter;\n }\n if (code === null) {\n return nok(code);\n }\n if (markdownLineEnding(code)) {\n returnState = tagOpenAttributeValueQuoted;\n return lineEndingBefore(code);\n }\n effects.consume(code);\n return tagOpenAttributeValueQuoted;\n }\n\n /**\n * In unquoted attribute value.\n *\n * ```markdown\n * > | a <b c=d> e\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenAttributeValueUnquoted(code) {\n if (code === null || code === 34 || code === 39 || code === 60 || code === 61 || code === 96) {\n return nok(code);\n }\n if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {\n return tagOpenBetween(code);\n }\n effects.consume(code);\n return tagOpenAttributeValueUnquoted;\n }\n\n /**\n * After double or single quoted attribute value, before whitespace or the end\n * of the tag.\n *\n * ```markdown\n * > | a <b c=\"d\"> e\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenAttributeValueQuotedAfter(code) {\n if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {\n return tagOpenBetween(code);\n }\n return nok(code);\n }\n\n /**\n * In certain circumstances of a tag where only an `>` is allowed.\n *\n * ```markdown\n * > | a <b c=\"d\"> e\n * ^\n * ```\n *\n * @type {State}\n */\n function end(code) {\n if (code === 62) {\n effects.consume(code);\n effects.exit(\"htmlTextData\");\n effects.exit(\"htmlText\");\n return ok;\n }\n return nok(code);\n }\n\n /**\n * At eol.\n *\n * > 👉 **Note**: we can’t have blank lines in text, so no need to worry about\n * > empty tokens.\n *\n * ```markdown\n * > | a <!--a\n * ^\n * | b-->\n * ```\n *\n * @type {State}\n */\n function lineEndingBefore(code) {\n effects.exit(\"htmlTextData\");\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return lineEndingAfter;\n }\n\n /**\n * After eol, at optional whitespace.\n *\n * > 👉 **Note**: we can’t have blank lines in text, so no need to worry about\n * > empty tokens.\n *\n * ```markdown\n * | a <!--a\n * > | b-->\n * ^\n * ```\n *\n * @type {State}\n */\n function lineEndingAfter(code) {\n // Always populated by defaults.\n\n return markdownSpace(code) ? factorySpace(effects, lineEndingAfterPrefix, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code) : lineEndingAfterPrefix(code);\n }\n\n /**\n * After eol, after optional whitespace.\n *\n * > 👉 **Note**: we can’t have blank lines in text, so no need to worry about\n * > empty tokens.\n *\n * ```markdown\n * | a <!--a\n * > | b-->\n * ^\n * ```\n *\n * @type {State}\n */\n function lineEndingAfterPrefix(code) {\n effects.enter(\"htmlTextData\");\n return returnState(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Event} Event\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factoryDestination } from 'micromark-factory-destination';\nimport { factoryLabel } from 'micromark-factory-label';\nimport { factoryTitle } from 'micromark-factory-title';\nimport { factoryWhitespace } from 'micromark-factory-whitespace';\nimport { markdownLineEndingOrSpace } from 'micromark-util-character';\nimport { push, splice } from 'micromark-util-chunked';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/** @type {Construct} */\nexport const labelEnd = {\n name: 'labelEnd',\n tokenize: tokenizeLabelEnd,\n resolveTo: resolveToLabelEnd,\n resolveAll: resolveAllLabelEnd\n};\n\n/** @type {Construct} */\nconst resourceConstruct = {\n tokenize: tokenizeResource\n};\n/** @type {Construct} */\nconst referenceFullConstruct = {\n tokenize: tokenizeReferenceFull\n};\n/** @type {Construct} */\nconst referenceCollapsedConstruct = {\n tokenize: tokenizeReferenceCollapsed\n};\n\n/** @type {Resolver} */\nfunction resolveAllLabelEnd(events) {\n let index = -1;\n while (++index < events.length) {\n const token = events[index][1];\n if (token.type === \"labelImage\" || token.type === \"labelLink\" || token.type === \"labelEnd\") {\n // Remove the marker.\n events.splice(index + 1, token.type === \"labelImage\" ? 4 : 2);\n token.type = \"data\";\n index++;\n }\n }\n return events;\n}\n\n/** @type {Resolver} */\nfunction resolveToLabelEnd(events, context) {\n let index = events.length;\n let offset = 0;\n /** @type {Token} */\n let token;\n /** @type {number | undefined} */\n let open;\n /** @type {number | undefined} */\n let close;\n /** @type {Array<Event>} */\n let media;\n\n // Find an opening.\n while (index--) {\n token = events[index][1];\n if (open) {\n // If we see another link, or inactive link label, we’ve been here before.\n if (token.type === \"link\" || token.type === \"labelLink\" && token._inactive) {\n break;\n }\n\n // Mark other link openings as inactive, as we can’t have links in\n // links.\n if (events[index][0] === 'enter' && token.type === \"labelLink\") {\n token._inactive = true;\n }\n } else if (close) {\n if (events[index][0] === 'enter' && (token.type === \"labelImage\" || token.type === \"labelLink\") && !token._balanced) {\n open = index;\n if (token.type !== \"labelLink\") {\n offset = 2;\n break;\n }\n }\n } else if (token.type === \"labelEnd\") {\n close = index;\n }\n }\n const group = {\n type: events[open][1].type === \"labelLink\" ? \"link\" : \"image\",\n start: Object.assign({}, events[open][1].start),\n end: Object.assign({}, events[events.length - 1][1].end)\n };\n const label = {\n type: \"label\",\n start: Object.assign({}, events[open][1].start),\n end: Object.assign({}, events[close][1].end)\n };\n const text = {\n type: \"labelText\",\n start: Object.assign({}, events[open + offset + 2][1].end),\n end: Object.assign({}, events[close - 2][1].start)\n };\n media = [['enter', group, context], ['enter', label, context]];\n\n // Opening marker.\n media = push(media, events.slice(open + 1, open + offset + 3));\n\n // Text open.\n media = push(media, [['enter', text, context]]);\n\n // Always populated by defaults.\n\n // Between.\n media = push(media, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + offset + 4, close - 3), context));\n\n // Text close, marker close, label close.\n media = push(media, [['exit', text, context], events[close - 2], events[close - 1], ['exit', label, context]]);\n\n // Reference, resource, or so.\n media = push(media, events.slice(close + 1));\n\n // Media close.\n media = push(media, [['exit', group, context]]);\n splice(events, open, events.length, media);\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeLabelEnd(effects, ok, nok) {\n const self = this;\n let index = self.events.length;\n /** @type {Token} */\n let labelStart;\n /** @type {boolean} */\n let defined;\n\n // Find an opening.\n while (index--) {\n if ((self.events[index][1].type === \"labelImage\" || self.events[index][1].type === \"labelLink\") && !self.events[index][1]._balanced) {\n labelStart = self.events[index][1];\n break;\n }\n }\n return start;\n\n /**\n * Start of label end.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * > | [a][b] c\n * ^\n * > | [a][] b\n * ^\n * > | [a] b\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // If there is not an okay opening.\n if (!labelStart) {\n return nok(code);\n }\n\n // If the corresponding label (link) start is marked as inactive,\n // it means we’d be wrapping a link, like this:\n //\n // ```markdown\n // > | a [b [c](d) e](f) g.\n // ^\n // ```\n //\n // We can’t have that, so it’s just balanced brackets.\n if (labelStart._inactive) {\n return labelEndNok(code);\n }\n defined = self.parser.defined.includes(normalizeIdentifier(self.sliceSerialize({\n start: labelStart.end,\n end: self.now()\n })));\n effects.enter(\"labelEnd\");\n effects.enter(\"labelMarker\");\n effects.consume(code);\n effects.exit(\"labelMarker\");\n effects.exit(\"labelEnd\");\n return after;\n }\n\n /**\n * After `]`.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * > | [a][b] c\n * ^\n * > | [a][] b\n * ^\n * > | [a] b\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n // Note: `markdown-rs` also parses GFM footnotes here, which for us is in\n // an extension.\n\n // Resource (`[asd](fgh)`)?\n if (code === 40) {\n return effects.attempt(resourceConstruct, labelEndOk, defined ? labelEndOk : labelEndNok)(code);\n }\n\n // Full (`[asd][fgh]`) or collapsed (`[asd][]`) reference?\n if (code === 91) {\n return effects.attempt(referenceFullConstruct, labelEndOk, defined ? referenceNotFull : labelEndNok)(code);\n }\n\n // Shortcut (`[asd]`) reference?\n return defined ? labelEndOk(code) : labelEndNok(code);\n }\n\n /**\n * After `]`, at `[`, but not at a full reference.\n *\n * > 👉 **Note**: we only get here if the label is defined.\n *\n * ```markdown\n * > | [a][] b\n * ^\n * > | [a] b\n * ^\n * ```\n *\n * @type {State}\n */\n function referenceNotFull(code) {\n return effects.attempt(referenceCollapsedConstruct, labelEndOk, labelEndNok)(code);\n }\n\n /**\n * Done, we found something.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * > | [a][b] c\n * ^\n * > | [a][] b\n * ^\n * > | [a] b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelEndOk(code) {\n // Note: `markdown-rs` does a bunch of stuff here.\n return ok(code);\n }\n\n /**\n * Done, it’s nothing.\n *\n * There was an okay opening, but we didn’t match anything.\n *\n * ```markdown\n * > | [a](b c\n * ^\n * > | [a][b c\n * ^\n * > | [a] b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelEndNok(code) {\n labelStart._balanced = true;\n return nok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeResource(effects, ok, nok) {\n return resourceStart;\n\n /**\n * At a resource.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceStart(code) {\n effects.enter(\"resource\");\n effects.enter(\"resourceMarker\");\n effects.consume(code);\n effects.exit(\"resourceMarker\");\n return resourceBefore;\n }\n\n /**\n * In resource, after `(`, at optional whitespace.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceBefore(code) {\n return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, resourceOpen)(code) : resourceOpen(code);\n }\n\n /**\n * In resource, after optional whitespace, at `)` or a destination.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceOpen(code) {\n if (code === 41) {\n return resourceEnd(code);\n }\n return factoryDestination(effects, resourceDestinationAfter, resourceDestinationMissing, \"resourceDestination\", \"resourceDestinationLiteral\", \"resourceDestinationLiteralMarker\", \"resourceDestinationRaw\", \"resourceDestinationString\", 32)(code);\n }\n\n /**\n * In resource, after destination, at optional whitespace.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceDestinationAfter(code) {\n return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, resourceBetween)(code) : resourceEnd(code);\n }\n\n /**\n * At invalid destination.\n *\n * ```markdown\n * > | [a](<<) b\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceDestinationMissing(code) {\n return nok(code);\n }\n\n /**\n * In resource, after destination and whitespace, at `(` or title.\n *\n * ```markdown\n * > | [a](b ) c\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceBetween(code) {\n if (code === 34 || code === 39 || code === 40) {\n return factoryTitle(effects, resourceTitleAfter, nok, \"resourceTitle\", \"resourceTitleMarker\", \"resourceTitleString\")(code);\n }\n return resourceEnd(code);\n }\n\n /**\n * In resource, after title, at optional whitespace.\n *\n * ```markdown\n * > | [a](b \"c\") d\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceTitleAfter(code) {\n return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, resourceEnd)(code) : resourceEnd(code);\n }\n\n /**\n * In resource, at `)`.\n *\n * ```markdown\n * > | [a](b) d\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceEnd(code) {\n if (code === 41) {\n effects.enter(\"resourceMarker\");\n effects.consume(code);\n effects.exit(\"resourceMarker\");\n effects.exit(\"resource\");\n return ok;\n }\n return nok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeReferenceFull(effects, ok, nok) {\n const self = this;\n return referenceFull;\n\n /**\n * In a reference (full), at the `[`.\n *\n * ```markdown\n * > | [a][b] d\n * ^\n * ```\n *\n * @type {State}\n */\n function referenceFull(code) {\n return factoryLabel.call(self, effects, referenceFullAfter, referenceFullMissing, \"reference\", \"referenceMarker\", \"referenceString\")(code);\n }\n\n /**\n * In a reference (full), after `]`.\n *\n * ```markdown\n * > | [a][b] d\n * ^\n * ```\n *\n * @type {State}\n */\n function referenceFullAfter(code) {\n return self.parser.defined.includes(normalizeIdentifier(self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1))) ? ok(code) : nok(code);\n }\n\n /**\n * In reference (full) that was missing.\n *\n * ```markdown\n * > | [a][b d\n * ^\n * ```\n *\n * @type {State}\n */\n function referenceFullMissing(code) {\n return nok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeReferenceCollapsed(effects, ok, nok) {\n return referenceCollapsedStart;\n\n /**\n * In reference (collapsed), at `[`.\n *\n * > 👉 **Note**: we only get here if the label is defined.\n *\n * ```markdown\n * > | [a][] d\n * ^\n * ```\n *\n * @type {State}\n */\n function referenceCollapsedStart(code) {\n // We only attempt a collapsed label if there’s a `[`.\n\n effects.enter(\"reference\");\n effects.enter(\"referenceMarker\");\n effects.consume(code);\n effects.exit(\"referenceMarker\");\n return referenceCollapsedOpen;\n }\n\n /**\n * In reference (collapsed), at `]`.\n *\n * > 👉 **Note**: we only get here if the label is defined.\n *\n * ```markdown\n * > | [a][] d\n * ^\n * ```\n *\n * @type {State}\n */\n function referenceCollapsedOpen(code) {\n if (code === 93) {\n effects.enter(\"referenceMarker\");\n effects.consume(code);\n effects.exit(\"referenceMarker\");\n effects.exit(\"reference\");\n return ok;\n }\n return nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { labelEnd } from './label-end.js';\n\n/** @type {Construct} */\nexport const labelStartImage = {\n name: 'labelStartImage',\n tokenize: tokenizeLabelStartImage,\n resolveAll: labelEnd.resolveAll\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeLabelStartImage(effects, ok, nok) {\n const self = this;\n return start;\n\n /**\n * Start of label (image) start.\n *\n * ```markdown\n * > | a ![b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"labelImage\");\n effects.enter(\"labelImageMarker\");\n effects.consume(code);\n effects.exit(\"labelImageMarker\");\n return open;\n }\n\n /**\n * After `!`, at `[`.\n *\n * ```markdown\n * > | a ![b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (code === 91) {\n effects.enter(\"labelMarker\");\n effects.consume(code);\n effects.exit(\"labelMarker\");\n effects.exit(\"labelImage\");\n return after;\n }\n return nok(code);\n }\n\n /**\n * After `![`.\n *\n * ```markdown\n * > | a ![b] c\n * ^\n * ```\n *\n * This is needed in because, when GFM footnotes are enabled, images never\n * form when started with a `^`.\n * Instead, links form:\n *\n * ```markdown\n * \n *\n * ![^a][b]\n *\n * [b]: c\n * ```\n *\n * ```html\n * <p>!<a href=\\\"b\\\">^a</a></p>\n * <p>!<a href=\\\"c\\\">^a</a></p>\n * ```\n *\n * @type {State}\n */\n function after(code) {\n // To do: use a new field to do this, this is still needed for\n // `micromark-extension-gfm-footnote`, but the `label-start-link`\n // behavior isn’t.\n // Hidden footnotes hook.\n /* c8 ignore next 3 */\n return code === 94 && '_hiddenFootnoteSupport' in self.parser.constructs ? nok(code) : ok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { labelEnd } from './label-end.js';\n\n/** @type {Construct} */\nexport const labelStartLink = {\n name: 'labelStartLink',\n tokenize: tokenizeLabelStartLink,\n resolveAll: labelEnd.resolveAll\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeLabelStartLink(effects, ok, nok) {\n const self = this;\n return start;\n\n /**\n * Start of label (link) start.\n *\n * ```markdown\n * > | a [b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"labelLink\");\n effects.enter(\"labelMarker\");\n effects.consume(code);\n effects.exit(\"labelMarker\");\n effects.exit(\"labelLink\");\n return after;\n }\n\n /** @type {State} */\n function after(code) {\n // To do: this isn’t needed in `micromark-extension-gfm-footnote`,\n // remove.\n // Hidden footnotes hook.\n /* c8 ignore next 3 */\n return code === 94 && '_hiddenFootnoteSupport' in self.parser.constructs ? nok(code) : ok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding } from 'micromark-util-character';\n/** @type {Construct} */\nexport const lineEnding = {\n name: 'lineEnding',\n tokenize: tokenizeLineEnding\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeLineEnding(effects, ok) {\n return start;\n\n /** @type {State} */\n function start(code) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return factorySpace(effects, ok, \"linePrefix\");\n }\n}","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const thematicBreak = {\n name: 'thematicBreak',\n tokenize: tokenizeThematicBreak\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeThematicBreak(effects, ok, nok) {\n let size = 0;\n /** @type {NonNullable<Code>} */\n let marker;\n return start;\n\n /**\n * Start of thematic break.\n *\n * ```markdown\n * > | ***\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"thematicBreak\");\n // To do: parse indent like `markdown-rs`.\n return before(code);\n }\n\n /**\n * After optional whitespace, at marker.\n *\n * ```markdown\n * > | ***\n * ^\n * ```\n *\n * @type {State}\n */\n function before(code) {\n marker = code;\n return atBreak(code);\n }\n\n /**\n * After something, before something else.\n *\n * ```markdown\n * > | ***\n * ^\n * ```\n *\n * @type {State}\n */\n function atBreak(code) {\n if (code === marker) {\n effects.enter(\"thematicBreakSequence\");\n return sequence(code);\n }\n if (size >= 3 && (code === null || markdownLineEnding(code))) {\n effects.exit(\"thematicBreak\");\n return ok(code);\n }\n return nok(code);\n }\n\n /**\n * In sequence.\n *\n * ```markdown\n * > | ***\n * ^\n * ```\n *\n * @type {State}\n */\n function sequence(code) {\n if (code === marker) {\n effects.consume(code);\n size++;\n return sequence;\n }\n effects.exit(\"thematicBreakSequence\");\n return markdownSpace(code) ? factorySpace(effects, atBreak, \"whitespace\")(code) : atBreak(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').ContainerState} ContainerState\n * @typedef {import('micromark-util-types').Exiter} Exiter\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { asciiDigit, markdownSpace } from 'micromark-util-character';\nimport { blankLine } from './blank-line.js';\nimport { thematicBreak } from './thematic-break.js';\n\n/** @type {Construct} */\nexport const list = {\n name: 'list',\n tokenize: tokenizeListStart,\n continuation: {\n tokenize: tokenizeListContinuation\n },\n exit: tokenizeListEnd\n};\n\n/** @type {Construct} */\nconst listItemPrefixWhitespaceConstruct = {\n tokenize: tokenizeListItemPrefixWhitespace,\n partial: true\n};\n\n/** @type {Construct} */\nconst indentConstruct = {\n tokenize: tokenizeIndent,\n partial: true\n};\n\n// To do: `markdown-rs` parses list items on their own and later stitches them\n// together.\n\n/**\n * @type {Tokenizer}\n * @this {TokenizeContext}\n */\nfunction tokenizeListStart(effects, ok, nok) {\n const self = this;\n const tail = self.events[self.events.length - 1];\n let initialSize = tail && tail[1].type === \"linePrefix\" ? tail[2].sliceSerialize(tail[1], true).length : 0;\n let size = 0;\n return start;\n\n /** @type {State} */\n function start(code) {\n const kind = self.containerState.type || (code === 42 || code === 43 || code === 45 ? \"listUnordered\" : \"listOrdered\");\n if (kind === \"listUnordered\" ? !self.containerState.marker || code === self.containerState.marker : asciiDigit(code)) {\n if (!self.containerState.type) {\n self.containerState.type = kind;\n effects.enter(kind, {\n _container: true\n });\n }\n if (kind === \"listUnordered\") {\n effects.enter(\"listItemPrefix\");\n return code === 42 || code === 45 ? effects.check(thematicBreak, nok, atMarker)(code) : atMarker(code);\n }\n if (!self.interrupt || code === 49) {\n effects.enter(\"listItemPrefix\");\n effects.enter(\"listItemValue\");\n return inside(code);\n }\n }\n return nok(code);\n }\n\n /** @type {State} */\n function inside(code) {\n if (asciiDigit(code) && ++size < 10) {\n effects.consume(code);\n return inside;\n }\n if ((!self.interrupt || size < 2) && (self.containerState.marker ? code === self.containerState.marker : code === 41 || code === 46)) {\n effects.exit(\"listItemValue\");\n return atMarker(code);\n }\n return nok(code);\n }\n\n /**\n * @type {State}\n **/\n function atMarker(code) {\n effects.enter(\"listItemMarker\");\n effects.consume(code);\n effects.exit(\"listItemMarker\");\n self.containerState.marker = self.containerState.marker || code;\n return effects.check(blankLine,\n // Can’t be empty when interrupting.\n self.interrupt ? nok : onBlank, effects.attempt(listItemPrefixWhitespaceConstruct, endOfPrefix, otherPrefix));\n }\n\n /** @type {State} */\n function onBlank(code) {\n self.containerState.initialBlankLine = true;\n initialSize++;\n return endOfPrefix(code);\n }\n\n /** @type {State} */\n function otherPrefix(code) {\n if (markdownSpace(code)) {\n effects.enter(\"listItemPrefixWhitespace\");\n effects.consume(code);\n effects.exit(\"listItemPrefixWhitespace\");\n return endOfPrefix;\n }\n return nok(code);\n }\n\n /** @type {State} */\n function endOfPrefix(code) {\n self.containerState.size = initialSize + self.sliceSerialize(effects.exit(\"listItemPrefix\"), true).length;\n return ok(code);\n }\n}\n\n/**\n * @type {Tokenizer}\n * @this {TokenizeContext}\n */\nfunction tokenizeListContinuation(effects, ok, nok) {\n const self = this;\n self.containerState._closeFlow = undefined;\n return effects.check(blankLine, onBlank, notBlank);\n\n /** @type {State} */\n function onBlank(code) {\n self.containerState.furtherBlankLines = self.containerState.furtherBlankLines || self.containerState.initialBlankLine;\n\n // We have a blank line.\n // Still, try to consume at most the items size.\n return factorySpace(effects, ok, \"listItemIndent\", self.containerState.size + 1)(code);\n }\n\n /** @type {State} */\n function notBlank(code) {\n if (self.containerState.furtherBlankLines || !markdownSpace(code)) {\n self.containerState.furtherBlankLines = undefined;\n self.containerState.initialBlankLine = undefined;\n return notInCurrentItem(code);\n }\n self.containerState.furtherBlankLines = undefined;\n self.containerState.initialBlankLine = undefined;\n return effects.attempt(indentConstruct, ok, notInCurrentItem)(code);\n }\n\n /** @type {State} */\n function notInCurrentItem(code) {\n // While we do continue, we signal that the flow should be closed.\n self.containerState._closeFlow = true;\n // As we’re closing flow, we’re no longer interrupting.\n self.interrupt = undefined;\n // Always populated by defaults.\n\n return factorySpace(effects, effects.attempt(list, ok, nok), \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code);\n }\n}\n\n/**\n * @type {Tokenizer}\n * @this {TokenizeContext}\n */\nfunction tokenizeIndent(effects, ok, nok) {\n const self = this;\n return factorySpace(effects, afterPrefix, \"listItemIndent\", self.containerState.size + 1);\n\n /** @type {State} */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return tail && tail[1].type === \"listItemIndent\" && tail[2].sliceSerialize(tail[1], true).length === self.containerState.size ? ok(code) : nok(code);\n }\n}\n\n/**\n * @type {Exiter}\n * @this {TokenizeContext}\n */\nfunction tokenizeListEnd(effects) {\n effects.exit(this.containerState.type);\n}\n\n/**\n * @type {Tokenizer}\n * @this {TokenizeContext}\n */\nfunction tokenizeListItemPrefixWhitespace(effects, ok, nok) {\n const self = this;\n\n // Always populated by defaults.\n\n return factorySpace(effects, afterPrefix, \"listItemPrefixWhitespace\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4 + 1);\n\n /** @type {State} */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return !markdownSpace(code) && tail && tail[1].type === \"listItemPrefixWhitespace\" ? ok(code) : nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const setextUnderline = {\n name: 'setextUnderline',\n tokenize: tokenizeSetextUnderline,\n resolveTo: resolveToSetextUnderline\n};\n\n/** @type {Resolver} */\nfunction resolveToSetextUnderline(events, context) {\n // To do: resolve like `markdown-rs`.\n let index = events.length;\n /** @type {number | undefined} */\n let content;\n /** @type {number | undefined} */\n let text;\n /** @type {number | undefined} */\n let definition;\n\n // Find the opening of the content.\n // It’ll always exist: we don’t tokenize if it isn’t there.\n while (index--) {\n if (events[index][0] === 'enter') {\n if (events[index][1].type === \"content\") {\n content = index;\n break;\n }\n if (events[index][1].type === \"paragraph\") {\n text = index;\n }\n }\n // Exit\n else {\n if (events[index][1].type === \"content\") {\n // Remove the content end (if needed we’ll add it later)\n events.splice(index, 1);\n }\n if (!definition && events[index][1].type === \"definition\") {\n definition = index;\n }\n }\n }\n const heading = {\n type: \"setextHeading\",\n start: Object.assign({}, events[text][1].start),\n end: Object.assign({}, events[events.length - 1][1].end)\n };\n\n // Change the paragraph to setext heading text.\n events[text][1].type = \"setextHeadingText\";\n\n // If we have definitions in the content, we’ll keep on having content,\n // but we need move it.\n if (definition) {\n events.splice(text, 0, ['enter', heading, context]);\n events.splice(definition + 1, 0, ['exit', events[content][1], context]);\n events[content][1].end = Object.assign({}, events[definition][1].end);\n } else {\n events[content][1] = heading;\n }\n\n // Add the heading exit at the end.\n events.push(['exit', heading, context]);\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeSetextUnderline(effects, ok, nok) {\n const self = this;\n /** @type {NonNullable<Code>} */\n let marker;\n return start;\n\n /**\n * At start of heading (setext) underline.\n *\n * ```markdown\n * | aa\n * > | ==\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n let index = self.events.length;\n /** @type {boolean | undefined} */\n let paragraph;\n // Find an opening.\n while (index--) {\n // Skip enter/exit of line ending, line prefix, and content.\n // We can now either have a definition or a paragraph.\n if (self.events[index][1].type !== \"lineEnding\" && self.events[index][1].type !== \"linePrefix\" && self.events[index][1].type !== \"content\") {\n paragraph = self.events[index][1].type === \"paragraph\";\n break;\n }\n }\n\n // To do: handle lazy/pierce like `markdown-rs`.\n // To do: parse indent like `markdown-rs`.\n if (!self.parser.lazy[self.now().line] && (self.interrupt || paragraph)) {\n effects.enter(\"setextHeadingLine\");\n marker = code;\n return before(code);\n }\n return nok(code);\n }\n\n /**\n * After optional whitespace, at `-` or `=`.\n *\n * ```markdown\n * | aa\n * > | ==\n * ^\n * ```\n *\n * @type {State}\n */\n function before(code) {\n effects.enter(\"setextHeadingLineSequence\");\n return inside(code);\n }\n\n /**\n * In sequence.\n *\n * ```markdown\n * | aa\n * > | ==\n * ^\n * ```\n *\n * @type {State}\n */\n function inside(code) {\n if (code === marker) {\n effects.consume(code);\n return inside;\n }\n effects.exit(\"setextHeadingLineSequence\");\n return markdownSpace(code) ? factorySpace(effects, after, \"lineSuffix\")(code) : after(code);\n }\n\n /**\n * After sequence, after optional whitespace.\n *\n * ```markdown\n * | aa\n * > | ==\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"setextHeadingLine\");\n return ok(code);\n }\n return nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct\n * @typedef {import('micromark-util-types').Initializer} Initializer\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n */\n\nimport {blankLine, content} from 'micromark-core-commonmark'\nimport {factorySpace} from 'micromark-factory-space'\nimport {markdownLineEnding} from 'micromark-util-character'\n/** @type {InitialConstruct} */\nexport const flow = {\n tokenize: initializeFlow\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Initializer}\n */\nfunction initializeFlow(effects) {\n const self = this\n const initial = effects.attempt(\n // Try to parse a blank line.\n blankLine,\n atBlankEnding,\n // Try to parse initial flow (essentially, only code).\n effects.attempt(\n this.parser.constructs.flowInitial,\n afterConstruct,\n factorySpace(\n effects,\n effects.attempt(\n this.parser.constructs.flow,\n afterConstruct,\n effects.attempt(content, afterConstruct)\n ),\n 'linePrefix'\n )\n )\n )\n return initial\n\n /** @type {State} */\n function atBlankEnding(code) {\n if (code === null) {\n effects.consume(code)\n return\n }\n effects.enter('lineEndingBlank')\n effects.consume(code)\n effects.exit('lineEndingBlank')\n self.currentConstruct = undefined\n return initial\n }\n\n /** @type {State} */\n function afterConstruct(code) {\n if (code === null) {\n effects.consume(code)\n return\n }\n effects.enter('lineEnding')\n effects.consume(code)\n effects.exit('lineEnding')\n self.currentConstruct = undefined\n return initial\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct\n * @typedef {import('micromark-util-types').Initializer} Initializer\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n */\n\nexport const resolver = {\n resolveAll: createResolver()\n}\nexport const string = initializeFactory('string')\nexport const text = initializeFactory('text')\n\n/**\n * @param {'string' | 'text'} field\n * @returns {InitialConstruct}\n */\nfunction initializeFactory(field) {\n return {\n tokenize: initializeText,\n resolveAll: createResolver(\n field === 'text' ? resolveAllLineSuffixes : undefined\n )\n }\n\n /**\n * @this {TokenizeContext}\n * @type {Initializer}\n */\n function initializeText(effects) {\n const self = this\n const constructs = this.parser.constructs[field]\n const text = effects.attempt(constructs, start, notText)\n return start\n\n /** @type {State} */\n function start(code) {\n return atBreak(code) ? text(code) : notText(code)\n }\n\n /** @type {State} */\n function notText(code) {\n if (code === null) {\n effects.consume(code)\n return\n }\n effects.enter('data')\n effects.consume(code)\n return data\n }\n\n /** @type {State} */\n function data(code) {\n if (atBreak(code)) {\n effects.exit('data')\n return text(code)\n }\n\n // Data.\n effects.consume(code)\n return data\n }\n\n /**\n * @param {Code} code\n * @returns {boolean}\n */\n function atBreak(code) {\n if (code === null) {\n return true\n }\n const list = constructs[code]\n let index = -1\n if (list) {\n // Always populated by defaults.\n\n while (++index < list.length) {\n const item = list[index]\n if (!item.previous || item.previous.call(self, self.previous)) {\n return true\n }\n }\n }\n return false\n }\n }\n}\n\n/**\n * @param {Resolver | undefined} [extraResolver]\n * @returns {Resolver}\n */\nfunction createResolver(extraResolver) {\n return resolveAllText\n\n /** @type {Resolver} */\n function resolveAllText(events, context) {\n let index = -1\n /** @type {number | undefined} */\n let enter\n\n // A rather boring computation (to merge adjacent `data` events) which\n // improves mm performance by 29%.\n while (++index <= events.length) {\n if (enter === undefined) {\n if (events[index] && events[index][1].type === 'data') {\n enter = index\n index++\n }\n } else if (!events[index] || events[index][1].type !== 'data') {\n // Don’t do anything if there is one data token.\n if (index !== enter + 2) {\n events[enter][1].end = events[index - 1][1].end\n events.splice(enter + 2, index - enter - 2)\n index = enter + 2\n }\n enter = undefined\n }\n }\n return extraResolver ? extraResolver(events, context) : events\n }\n}\n\n/**\n * A rather ugly set of instructions which again looks at chunks in the input\n * stream.\n * The reason to do this here is that it is *much* faster to parse in reverse.\n * And that we can’t hook into `null` to split the line suffix before an EOF.\n * To do: figure out if we can make this into a clean utility, or even in core.\n * As it will be useful for GFMs literal autolink extension (and maybe even\n * tables?)\n *\n * @type {Resolver}\n */\nfunction resolveAllLineSuffixes(events, context) {\n let eventIndex = 0 // Skip first.\n\n while (++eventIndex <= events.length) {\n if (\n (eventIndex === events.length ||\n events[eventIndex][1].type === 'lineEnding') &&\n events[eventIndex - 1][1].type === 'data'\n ) {\n const data = events[eventIndex - 1][1]\n const chunks = context.sliceStream(data)\n let index = chunks.length\n let bufferIndex = -1\n let size = 0\n /** @type {boolean | undefined} */\n let tabs\n while (index--) {\n const chunk = chunks[index]\n if (typeof chunk === 'string') {\n bufferIndex = chunk.length\n while (chunk.charCodeAt(bufferIndex - 1) === 32) {\n size++\n bufferIndex--\n }\n if (bufferIndex) break\n bufferIndex = -1\n }\n // Number\n else if (chunk === -2) {\n tabs = true\n size++\n } else if (chunk === -1) {\n // Empty\n } else {\n // Replacement character, exit.\n index++\n break\n }\n }\n if (size) {\n const token = {\n type:\n eventIndex === events.length || tabs || size < 2\n ? 'lineSuffix'\n : 'hardBreakTrailing',\n start: {\n line: data.end.line,\n column: data.end.column - size,\n offset: data.end.offset - size,\n _index: data.start._index + index,\n _bufferIndex: index\n ? bufferIndex\n : data.start._bufferIndex + bufferIndex\n },\n end: Object.assign({}, data.end)\n }\n data.end = Object.assign({}, token.start)\n if (data.start.offset === data.end.offset) {\n Object.assign(data, token)\n } else {\n events.splice(\n eventIndex,\n 0,\n ['enter', token, context],\n ['exit', token, context]\n )\n eventIndex += 2\n }\n }\n eventIndex++\n }\n }\n return events\n}\n","/**\n * @typedef {import('micromark-util-types').Chunk} Chunk\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').ConstructRecord} ConstructRecord\n * @typedef {import('micromark-util-types').Effects} Effects\n * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct\n * @typedef {import('micromark-util-types').ParseContext} ParseContext\n * @typedef {import('micromark-util-types').Point} Point\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenType} TokenType\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n */\n\n/**\n * @callback Restore\n * @returns {undefined}\n *\n * @typedef Info\n * @property {Restore} restore\n * @property {number} from\n *\n * @callback ReturnHandle\n * Handle a successful run.\n * @param {Construct} construct\n * @param {Info} info\n * @returns {undefined}\n */\n\nimport {markdownLineEnding} from 'micromark-util-character'\nimport {push, splice} from 'micromark-util-chunked'\nimport {resolveAll} from 'micromark-util-resolve-all'\n/**\n * Create a tokenizer.\n * Tokenizers deal with one type of data (e.g., containers, flow, text).\n * The parser is the object dealing with it all.\n * `initialize` works like other constructs, except that only its `tokenize`\n * function is used, in which case it doesn’t receive an `ok` or `nok`.\n * `from` can be given to set the point before the first character, although\n * when further lines are indented, they must be set with `defineSkip`.\n *\n * @param {ParseContext} parser\n * @param {InitialConstruct} initialize\n * @param {Omit<Point, '_bufferIndex' | '_index'> | undefined} [from]\n * @returns {TokenizeContext}\n */\nexport function createTokenizer(parser, initialize, from) {\n /** @type {Point} */\n let point = Object.assign(\n from\n ? Object.assign({}, from)\n : {\n line: 1,\n column: 1,\n offset: 0\n },\n {\n _index: 0,\n _bufferIndex: -1\n }\n )\n /** @type {Record<string, number>} */\n const columnStart = {}\n /** @type {Array<Construct>} */\n const resolveAllConstructs = []\n /** @type {Array<Chunk>} */\n let chunks = []\n /** @type {Array<Token>} */\n let stack = []\n /** @type {boolean | undefined} */\n let consumed = true\n\n /**\n * Tools used for tokenizing.\n *\n * @type {Effects}\n */\n const effects = {\n consume,\n enter,\n exit,\n attempt: constructFactory(onsuccessfulconstruct),\n check: constructFactory(onsuccessfulcheck),\n interrupt: constructFactory(onsuccessfulcheck, {\n interrupt: true\n })\n }\n\n /**\n * State and tools for resolving and serializing.\n *\n * @type {TokenizeContext}\n */\n const context = {\n previous: null,\n code: null,\n containerState: {},\n events: [],\n parser,\n sliceStream,\n sliceSerialize,\n now,\n defineSkip,\n write\n }\n\n /**\n * The state function.\n *\n * @type {State | undefined}\n */\n let state = initialize.tokenize.call(context, effects)\n\n /**\n * Track which character we expect to be consumed, to catch bugs.\n *\n * @type {Code}\n */\n let expectedCode\n if (initialize.resolveAll) {\n resolveAllConstructs.push(initialize)\n }\n return context\n\n /** @type {TokenizeContext['write']} */\n function write(slice) {\n chunks = push(chunks, slice)\n main()\n\n // Exit if we’re not done, resolve might change stuff.\n if (chunks[chunks.length - 1] !== null) {\n return []\n }\n addResult(initialize, 0)\n\n // Otherwise, resolve, and exit.\n context.events = resolveAll(resolveAllConstructs, context.events, context)\n return context.events\n }\n\n //\n // Tools.\n //\n\n /** @type {TokenizeContext['sliceSerialize']} */\n function sliceSerialize(token, expandTabs) {\n return serializeChunks(sliceStream(token), expandTabs)\n }\n\n /** @type {TokenizeContext['sliceStream']} */\n function sliceStream(token) {\n return sliceChunks(chunks, token)\n }\n\n /** @type {TokenizeContext['now']} */\n function now() {\n // This is a hot path, so we clone manually instead of `Object.assign({}, point)`\n const {line, column, offset, _index, _bufferIndex} = point\n return {\n line,\n column,\n offset,\n _index,\n _bufferIndex\n }\n }\n\n /** @type {TokenizeContext['defineSkip']} */\n function defineSkip(value) {\n columnStart[value.line] = value.column\n accountForPotentialSkip()\n }\n\n //\n // State management.\n //\n\n /**\n * Main loop (note that `_index` and `_bufferIndex` in `point` are modified by\n * `consume`).\n * Here is where we walk through the chunks, which either include strings of\n * several characters, or numerical character codes.\n * The reason to do this in a loop instead of a call is so the stack can\n * drain.\n *\n * @returns {undefined}\n */\n function main() {\n /** @type {number} */\n let chunkIndex\n while (point._index < chunks.length) {\n const chunk = chunks[point._index]\n\n // If we’re in a buffer chunk, loop through it.\n if (typeof chunk === 'string') {\n chunkIndex = point._index\n if (point._bufferIndex < 0) {\n point._bufferIndex = 0\n }\n while (\n point._index === chunkIndex &&\n point._bufferIndex < chunk.length\n ) {\n go(chunk.charCodeAt(point._bufferIndex))\n }\n } else {\n go(chunk)\n }\n }\n }\n\n /**\n * Deal with one code.\n *\n * @param {Code} code\n * @returns {undefined}\n */\n function go(code) {\n consumed = undefined\n expectedCode = code\n state = state(code)\n }\n\n /** @type {Effects['consume']} */\n function consume(code) {\n if (markdownLineEnding(code)) {\n point.line++\n point.column = 1\n point.offset += code === -3 ? 2 : 1\n accountForPotentialSkip()\n } else if (code !== -1) {\n point.column++\n point.offset++\n }\n\n // Not in a string chunk.\n if (point._bufferIndex < 0) {\n point._index++\n } else {\n point._bufferIndex++\n\n // At end of string chunk.\n // @ts-expect-error Points w/ non-negative `_bufferIndex` reference\n // strings.\n if (point._bufferIndex === chunks[point._index].length) {\n point._bufferIndex = -1\n point._index++\n }\n }\n\n // Expose the previous character.\n context.previous = code\n\n // Mark as consumed.\n consumed = true\n }\n\n /** @type {Effects['enter']} */\n function enter(type, fields) {\n /** @type {Token} */\n // @ts-expect-error Patch instead of assign required fields to help GC.\n const token = fields || {}\n token.type = type\n token.start = now()\n context.events.push(['enter', token, context])\n stack.push(token)\n return token\n }\n\n /** @type {Effects['exit']} */\n function exit(type) {\n const token = stack.pop()\n token.end = now()\n context.events.push(['exit', token, context])\n return token\n }\n\n /**\n * Use results.\n *\n * @type {ReturnHandle}\n */\n function onsuccessfulconstruct(construct, info) {\n addResult(construct, info.from)\n }\n\n /**\n * Discard results.\n *\n * @type {ReturnHandle}\n */\n function onsuccessfulcheck(_, info) {\n info.restore()\n }\n\n /**\n * Factory to attempt/check/interrupt.\n *\n * @param {ReturnHandle} onreturn\n * @param {{interrupt?: boolean | undefined} | undefined} [fields]\n */\n function constructFactory(onreturn, fields) {\n return hook\n\n /**\n * Handle either an object mapping codes to constructs, a list of\n * constructs, or a single construct.\n *\n * @param {Array<Construct> | Construct | ConstructRecord} constructs\n * @param {State} returnState\n * @param {State | undefined} [bogusState]\n * @returns {State}\n */\n function hook(constructs, returnState, bogusState) {\n /** @type {Array<Construct>} */\n let listOfConstructs\n /** @type {number} */\n let constructIndex\n /** @type {Construct} */\n let currentConstruct\n /** @type {Info} */\n let info\n return Array.isArray(constructs) /* c8 ignore next 1 */\n ? handleListOfConstructs(constructs)\n : 'tokenize' in constructs\n ? // @ts-expect-error Looks like a construct.\n handleListOfConstructs([constructs])\n : handleMapOfConstructs(constructs)\n\n /**\n * Handle a list of construct.\n *\n * @param {ConstructRecord} map\n * @returns {State}\n */\n function handleMapOfConstructs(map) {\n return start\n\n /** @type {State} */\n function start(code) {\n const def = code !== null && map[code]\n const all = code !== null && map.null\n const list = [\n // To do: add more extension tests.\n /* c8 ignore next 2 */\n ...(Array.isArray(def) ? def : def ? [def] : []),\n ...(Array.isArray(all) ? all : all ? [all] : [])\n ]\n return handleListOfConstructs(list)(code)\n }\n }\n\n /**\n * Handle a list of construct.\n *\n * @param {Array<Construct>} list\n * @returns {State}\n */\n function handleListOfConstructs(list) {\n listOfConstructs = list\n constructIndex = 0\n if (list.length === 0) {\n return bogusState\n }\n return handleConstruct(list[constructIndex])\n }\n\n /**\n * Handle a single construct.\n *\n * @param {Construct} construct\n * @returns {State}\n */\n function handleConstruct(construct) {\n return start\n\n /** @type {State} */\n function start(code) {\n // To do: not needed to store if there is no bogus state, probably?\n // Currently doesn’t work because `inspect` in document does a check\n // w/o a bogus, which doesn’t make sense. But it does seem to help perf\n // by not storing.\n info = store()\n currentConstruct = construct\n if (!construct.partial) {\n context.currentConstruct = construct\n }\n\n // Always populated by defaults.\n\n if (\n construct.name &&\n context.parser.constructs.disable.null.includes(construct.name)\n ) {\n return nok(code)\n }\n return construct.tokenize.call(\n // If we do have fields, create an object w/ `context` as its\n // prototype.\n // This allows a “live binding”, which is needed for `interrupt`.\n fields ? Object.assign(Object.create(context), fields) : context,\n effects,\n ok,\n nok\n )(code)\n }\n }\n\n /** @type {State} */\n function ok(code) {\n consumed = true\n onreturn(currentConstruct, info)\n return returnState\n }\n\n /** @type {State} */\n function nok(code) {\n consumed = true\n info.restore()\n if (++constructIndex < listOfConstructs.length) {\n return handleConstruct(listOfConstructs[constructIndex])\n }\n return bogusState\n }\n }\n }\n\n /**\n * @param {Construct} construct\n * @param {number} from\n * @returns {undefined}\n */\n function addResult(construct, from) {\n if (construct.resolveAll && !resolveAllConstructs.includes(construct)) {\n resolveAllConstructs.push(construct)\n }\n if (construct.resolve) {\n splice(\n context.events,\n from,\n context.events.length - from,\n construct.resolve(context.events.slice(from), context)\n )\n }\n if (construct.resolveTo) {\n context.events = construct.resolveTo(context.events, context)\n }\n }\n\n /**\n * Store state.\n *\n * @returns {Info}\n */\n function store() {\n const startPoint = now()\n const startPrevious = context.previous\n const startCurrentConstruct = context.currentConstruct\n const startEventsIndex = context.events.length\n const startStack = Array.from(stack)\n return {\n restore,\n from: startEventsIndex\n }\n\n /**\n * Restore state.\n *\n * @returns {undefined}\n */\n function restore() {\n point = startPoint\n context.previous = startPrevious\n context.currentConstruct = startCurrentConstruct\n context.events.length = startEventsIndex\n stack = startStack\n accountForPotentialSkip()\n }\n }\n\n /**\n * Move the current point a bit forward in the line when it’s on a column\n * skip.\n *\n * @returns {undefined}\n */\n function accountForPotentialSkip() {\n if (point.line in columnStart && point.column < 2) {\n point.column = columnStart[point.line]\n point.offset += columnStart[point.line] - 1\n }\n }\n}\n\n/**\n * Get the chunks from a slice of chunks in the range of a token.\n *\n * @param {Array<Chunk>} chunks\n * @param {Pick<Token, 'end' | 'start'>} token\n * @returns {Array<Chunk>}\n */\nfunction sliceChunks(chunks, token) {\n const startIndex = token.start._index\n const startBufferIndex = token.start._bufferIndex\n const endIndex = token.end._index\n const endBufferIndex = token.end._bufferIndex\n /** @type {Array<Chunk>} */\n let view\n if (startIndex === endIndex) {\n // @ts-expect-error `_bufferIndex` is used on string chunks.\n view = [chunks[startIndex].slice(startBufferIndex, endBufferIndex)]\n } else {\n view = chunks.slice(startIndex, endIndex)\n if (startBufferIndex > -1) {\n const head = view[0]\n if (typeof head === 'string') {\n view[0] = head.slice(startBufferIndex)\n } else {\n view.shift()\n }\n }\n if (endBufferIndex > 0) {\n // @ts-expect-error `_bufferIndex` is used on string chunks.\n view.push(chunks[endIndex].slice(0, endBufferIndex))\n }\n }\n return view\n}\n\n/**\n * Get the string value of a slice of chunks.\n *\n * @param {Array<Chunk>} chunks\n * @param {boolean | undefined} [expandTabs=false]\n * @returns {string}\n */\nfunction serializeChunks(chunks, expandTabs) {\n let index = -1\n /** @type {Array<string>} */\n const result = []\n /** @type {boolean | undefined} */\n let atTab\n while (++index < chunks.length) {\n const chunk = chunks[index]\n /** @type {string} */\n let value\n if (typeof chunk === 'string') {\n value = chunk\n } else\n switch (chunk) {\n case -5: {\n value = '\\r'\n break\n }\n case -4: {\n value = '\\n'\n break\n }\n case -3: {\n value = '\\r' + '\\n'\n break\n }\n case -2: {\n value = expandTabs ? ' ' : '\\t'\n break\n }\n case -1: {\n if (!expandTabs && atTab) continue\n value = ' '\n break\n }\n default: {\n // Currently only replacement character.\n value = String.fromCharCode(chunk)\n }\n }\n atTab = chunk === -2\n result.push(value)\n }\n return result.join('')\n}\n","/**\n * @typedef {import('micromark-util-types').Extension} Extension\n */\n\nimport {\n attention,\n autolink,\n blockQuote,\n characterEscape,\n characterReference,\n codeFenced,\n codeIndented,\n codeText,\n definition,\n hardBreakEscape,\n headingAtx,\n htmlFlow,\n htmlText,\n labelEnd,\n labelStartImage,\n labelStartLink,\n lineEnding,\n list,\n setextUnderline,\n thematicBreak\n} from 'micromark-core-commonmark'\nimport {resolver as resolveText} from './initialize/text.js'\n\n/** @satisfies {Extension['document']} */\nexport const document = {\n [42]: list,\n [43]: list,\n [45]: list,\n [48]: list,\n [49]: list,\n [50]: list,\n [51]: list,\n [52]: list,\n [53]: list,\n [54]: list,\n [55]: list,\n [56]: list,\n [57]: list,\n [62]: blockQuote\n}\n\n/** @satisfies {Extension['contentInitial']} */\nexport const contentInitial = {\n [91]: definition\n}\n\n/** @satisfies {Extension['flowInitial']} */\nexport const flowInitial = {\n [-2]: codeIndented,\n [-1]: codeIndented,\n [32]: codeIndented\n}\n\n/** @satisfies {Extension['flow']} */\nexport const flow = {\n [35]: headingAtx,\n [42]: thematicBreak,\n [45]: [setextUnderline, thematicBreak],\n [60]: htmlFlow,\n [61]: setextUnderline,\n [95]: thematicBreak,\n [96]: codeFenced,\n [126]: codeFenced\n}\n\n/** @satisfies {Extension['string']} */\nexport const string = {\n [38]: characterReference,\n [92]: characterEscape\n}\n\n/** @satisfies {Extension['text']} */\nexport const text = {\n [-5]: lineEnding,\n [-4]: lineEnding,\n [-3]: lineEnding,\n [33]: labelStartImage,\n [38]: characterReference,\n [42]: attention,\n [60]: [autolink, htmlText],\n [91]: labelStartLink,\n [92]: [hardBreakEscape, characterEscape],\n [93]: labelEnd,\n [95]: attention,\n [96]: codeText\n}\n\n/** @satisfies {Extension['insideSpan']} */\nexport const insideSpan = {\n null: [attention, resolveText]\n}\n\n/** @satisfies {Extension['attentionMarkers']} */\nexport const attentionMarkers = {\n null: [42, 95]\n}\n\n/** @satisfies {Extension['disable']} */\nexport const disable = {\n null: []\n}\n","/**\n * @typedef {import('micromark-util-types').Create} Create\n * @typedef {import('micromark-util-types').FullNormalizedExtension} FullNormalizedExtension\n * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct\n * @typedef {import('micromark-util-types').ParseContext} ParseContext\n * @typedef {import('micromark-util-types').ParseOptions} ParseOptions\n */\n\nimport {combineExtensions} from 'micromark-util-combine-extensions'\nimport {content} from './initialize/content.js'\nimport {document} from './initialize/document.js'\nimport {flow} from './initialize/flow.js'\nimport {string, text} from './initialize/text.js'\nimport {createTokenizer} from './create-tokenizer.js'\nimport * as defaultConstructs from './constructs.js'\n\n/**\n * @param {ParseOptions | null | undefined} [options]\n * @returns {ParseContext}\n */\nexport function parse(options) {\n const settings = options || {}\n const constructs =\n /** @type {FullNormalizedExtension} */\n combineExtensions([defaultConstructs, ...(settings.extensions || [])])\n\n /** @type {ParseContext} */\n const parser = {\n defined: [],\n lazy: {},\n constructs,\n content: create(content),\n document: create(document),\n flow: create(flow),\n string: create(string),\n text: create(text)\n }\n return parser\n\n /**\n * @param {InitialConstruct} initial\n */\n function create(initial) {\n return creator\n /** @type {Create} */\n function creator(from) {\n return createTokenizer(parser, initial, from)\n }\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Event} Event\n */\n\nimport {subtokenize} from 'micromark-util-subtokenize'\n\n/**\n * @param {Array<Event>} events\n * @returns {Array<Event>}\n */\nexport function postprocess(events) {\n while (!subtokenize(events)) {\n // Empty\n }\n return events\n}\n","/**\n * @typedef {import('micromark-util-types').Chunk} Chunk\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Encoding} Encoding\n * @typedef {import('micromark-util-types').Value} Value\n */\n\n/**\n * @callback Preprocessor\n * @param {Value} value\n * @param {Encoding | null | undefined} [encoding]\n * @param {boolean | null | undefined} [end=false]\n * @returns {Array<Chunk>}\n */\n\nconst search = /[\\0\\t\\n\\r]/g\n\n/**\n * @returns {Preprocessor}\n */\nexport function preprocess() {\n let column = 1\n let buffer = ''\n /** @type {boolean | undefined} */\n let start = true\n /** @type {boolean | undefined} */\n let atCarriageReturn\n return preprocessor\n\n /** @type {Preprocessor} */\n // eslint-disable-next-line complexity\n function preprocessor(value, encoding, end) {\n /** @type {Array<Chunk>} */\n const chunks = []\n /** @type {RegExpMatchArray | null} */\n let match\n /** @type {number} */\n let next\n /** @type {number} */\n let startPosition\n /** @type {number} */\n let endPosition\n /** @type {Code} */\n let code\n value =\n buffer +\n (typeof value === 'string'\n ? value.toString()\n : new TextDecoder(encoding || undefined).decode(value))\n startPosition = 0\n buffer = ''\n if (start) {\n // To do: `markdown-rs` actually parses BOMs (byte order mark).\n if (value.charCodeAt(0) === 65279) {\n startPosition++\n }\n start = undefined\n }\n while (startPosition < value.length) {\n search.lastIndex = startPosition\n match = search.exec(value)\n endPosition =\n match && match.index !== undefined ? match.index : value.length\n code = value.charCodeAt(endPosition)\n if (!match) {\n buffer = value.slice(startPosition)\n break\n }\n if (code === 10 && startPosition === endPosition && atCarriageReturn) {\n chunks.push(-3)\n atCarriageReturn = undefined\n } else {\n if (atCarriageReturn) {\n chunks.push(-5)\n atCarriageReturn = undefined\n }\n if (startPosition < endPosition) {\n chunks.push(value.slice(startPosition, endPosition))\n column += endPosition - startPosition\n }\n switch (code) {\n case 0: {\n chunks.push(65533)\n column++\n break\n }\n case 9: {\n next = Math.ceil(column / 4) * 4\n chunks.push(-2)\n while (column++ < next) chunks.push(-1)\n break\n }\n case 10: {\n chunks.push(-4)\n column = 1\n break\n }\n default: {\n atCarriageReturn = true\n column = 1\n }\n }\n }\n startPosition = endPosition + 1\n }\n if (end) {\n if (atCarriageReturn) chunks.push(-5)\n if (buffer) chunks.push(buffer)\n chunks.push(null)\n }\n return chunks\n }\n}\n","import {decodeNamedCharacterReference} from 'decode-named-character-reference'\nimport {decodeNumericCharacterReference} from 'micromark-util-decode-numeric-character-reference'\nconst characterEscapeOrReference =\n /\\\\([!-/:-@[-`{-~])|&(#(?:\\d{1,7}|x[\\da-f]{1,6})|[\\da-z]{1,31});/gi\n\n/**\n * Decode markdown strings (which occur in places such as fenced code info\n * strings, destinations, labels, and titles).\n *\n * The “string” content type allows character escapes and -references.\n * This decodes those.\n *\n * @param {string} value\n * Value to decode.\n * @returns {string}\n * Decoded value.\n */\nexport function decodeString(value) {\n return value.replace(characterEscapeOrReference, decode)\n}\n\n/**\n * @param {string} $0\n * @param {string} $1\n * @param {string} $2\n * @returns {string}\n */\nfunction decode($0, $1, $2) {\n if ($1) {\n // Escape.\n return $1\n }\n\n // Reference.\n const head = $2.charCodeAt(0)\n if (head === 35) {\n const head = $2.charCodeAt(1)\n const hex = head === 120 || head === 88\n return decodeNumericCharacterReference($2.slice(hex ? 2 : 1), hex ? 16 : 10)\n }\n return decodeNamedCharacterReference($2) || $0\n}\n","/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Point} Point\n * @typedef {import('unist').Position} Position\n */\n\n/**\n * @typedef NodeLike\n * @property {string} type\n * @property {PositionLike | null | undefined} [position]\n *\n * @typedef PointLike\n * @property {number | null | undefined} [line]\n * @property {number | null | undefined} [column]\n * @property {number | null | undefined} [offset]\n *\n * @typedef PositionLike\n * @property {PointLike | null | undefined} [start]\n * @property {PointLike | null | undefined} [end]\n */\n\n/**\n * Serialize the positional info of a point, position (start and end points),\n * or node.\n *\n * @param {Node | NodeLike | Point | PointLike | Position | PositionLike | null | undefined} [value]\n * Node, position, or point.\n * @returns {string}\n * Pretty printed positional info of a node (`string`).\n *\n * In the format of a range `ls:cs-le:ce` (when given `node` or `position`)\n * or a point `l:c` (when given `point`), where `l` stands for line, `c` for\n * column, `s` for `start`, and `e` for end.\n * An empty string (`''`) is returned if the given value is neither `node`,\n * `position`, nor `point`.\n */\nexport function stringifyPosition(value) {\n // Nothing.\n if (!value || typeof value !== 'object') {\n return ''\n }\n\n // Node.\n if ('position' in value || 'type' in value) {\n return position(value.position)\n }\n\n // Position.\n if ('start' in value || 'end' in value) {\n return position(value)\n }\n\n // Point.\n if ('line' in value || 'column' in value) {\n return point(value)\n }\n\n // ?\n return ''\n}\n\n/**\n * @param {Point | PointLike | null | undefined} point\n * @returns {string}\n */\nfunction point(point) {\n return index(point && point.line) + ':' + index(point && point.column)\n}\n\n/**\n * @param {Position | PositionLike | null | undefined} pos\n * @returns {string}\n */\nfunction position(pos) {\n return point(pos && pos.start) + '-' + point(pos && pos.end)\n}\n\n/**\n * @param {number | null | undefined} value\n * @returns {number}\n */\nfunction index(value) {\n return value && typeof value === 'number' ? value : 1\n}\n","/**\n * @typedef {import('mdast').Break} Break\n * @typedef {import('mdast').Blockquote} Blockquote\n * @typedef {import('mdast').Code} Code\n * @typedef {import('mdast').Definition} Definition\n * @typedef {import('mdast').Emphasis} Emphasis\n * @typedef {import('mdast').Heading} Heading\n * @typedef {import('mdast').Html} Html\n * @typedef {import('mdast').Image} Image\n * @typedef {import('mdast').InlineCode} InlineCode\n * @typedef {import('mdast').Link} Link\n * @typedef {import('mdast').List} List\n * @typedef {import('mdast').ListItem} ListItem\n * @typedef {import('mdast').Nodes} Nodes\n * @typedef {import('mdast').Paragraph} Paragraph\n * @typedef {import('mdast').Parent} Parent\n * @typedef {import('mdast').PhrasingContent} PhrasingContent\n * @typedef {import('mdast').ReferenceType} ReferenceType\n * @typedef {import('mdast').Root} Root\n * @typedef {import('mdast').Strong} Strong\n * @typedef {import('mdast').Text} Text\n * @typedef {import('mdast').ThematicBreak} ThematicBreak\n *\n * @typedef {import('micromark-util-types').Encoding} Encoding\n * @typedef {import('micromark-util-types').Event} Event\n * @typedef {import('micromark-util-types').ParseOptions} ParseOptions\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Value} Value\n *\n * @typedef {import('unist').Point} Point\n *\n * @typedef {import('../index.js').CompileData} CompileData\n */\n\n/**\n * @typedef {Omit<Parent, 'children' | 'type'> & {type: 'fragment', children: Array<PhrasingContent>}} Fragment\n */\n\n/**\n * @callback Transform\n * Extra transform, to change the AST afterwards.\n * @param {Root} tree\n * Tree to transform.\n * @returns {Root | null | undefined | void}\n * New tree or nothing (in which case the current tree is used).\n *\n * @callback Handle\n * Handle a token.\n * @param {CompileContext} this\n * Context.\n * @param {Token} token\n * Current token.\n * @returns {undefined | void}\n * Nothing.\n *\n * @typedef {Record<string, Handle>} Handles\n * Token types mapping to handles\n *\n * @callback OnEnterError\n * Handle the case where the `right` token is open, but it is closed (by the\n * `left` token) or because we reached the end of the document.\n * @param {Omit<CompileContext, 'sliceSerialize'>} this\n * Context.\n * @param {Token | undefined} left\n * Left token.\n * @param {Token} right\n * Right token.\n * @returns {undefined}\n * Nothing.\n *\n * @callback OnExitError\n * Handle the case where the `right` token is open but it is closed by\n * exiting the `left` token.\n * @param {Omit<CompileContext, 'sliceSerialize'>} this\n * Context.\n * @param {Token} left\n * Left token.\n * @param {Token} right\n * Right token.\n * @returns {undefined}\n * Nothing.\n *\n * @typedef {[Token, OnEnterError | undefined]} TokenTuple\n * Open token on the stack, with an optional error handler for when\n * that token isn’t closed properly.\n */\n\n/**\n * @typedef Config\n * Configuration.\n *\n * We have our defaults, but extensions will add more.\n * @property {Array<string>} canContainEols\n * Token types where line endings are used.\n * @property {Handles} enter\n * Opening handles.\n * @property {Handles} exit\n * Closing handles.\n * @property {Array<Transform>} transforms\n * Tree transforms.\n *\n * @typedef {Partial<Config>} Extension\n * Change how markdown tokens from micromark are turned into mdast.\n *\n * @typedef CompileContext\n * mdast compiler context.\n * @property {Array<Fragment | Nodes>} stack\n * Stack of nodes.\n * @property {Array<TokenTuple>} tokenStack\n * Stack of tokens.\n * @property {(this: CompileContext) => undefined} buffer\n * Capture some of the output data.\n * @property {(this: CompileContext) => string} resume\n * Stop capturing and access the output data.\n * @property {(this: CompileContext, node: Nodes, token: Token, onError?: OnEnterError) => undefined} enter\n * Enter a node.\n * @property {(this: CompileContext, token: Token, onError?: OnExitError) => undefined} exit\n * Exit a node.\n * @property {TokenizeContext['sliceSerialize']} sliceSerialize\n * Get the string value of a token.\n * @property {Config} config\n * Configuration.\n * @property {CompileData} data\n * Info passed around; key/value store.\n *\n * @typedef FromMarkdownOptions\n * Configuration for how to build mdast.\n * @property {Array<Extension | Array<Extension>> | null | undefined} [mdastExtensions]\n * Extensions for this utility to change how tokens are turned into a tree.\n *\n * @typedef {ParseOptions & FromMarkdownOptions} Options\n * Configuration.\n */\n\nimport {toString} from 'mdast-util-to-string'\nimport {parse, postprocess, preprocess} from 'micromark'\nimport {decodeNumericCharacterReference} from 'micromark-util-decode-numeric-character-reference'\nimport {decodeString} from 'micromark-util-decode-string'\nimport {normalizeIdentifier} from 'micromark-util-normalize-identifier'\nimport {decodeNamedCharacterReference} from 'decode-named-character-reference'\nimport {stringifyPosition} from 'unist-util-stringify-position'\nconst own = {}.hasOwnProperty\n\n/**\n * Turn markdown into a syntax tree.\n *\n * @overload\n * @param {Value} value\n * @param {Encoding | null | undefined} [encoding]\n * @param {Options | null | undefined} [options]\n * @returns {Root}\n *\n * @overload\n * @param {Value} value\n * @param {Options | null | undefined} [options]\n * @returns {Root}\n *\n * @param {Value} value\n * Markdown to parse.\n * @param {Encoding | Options | null | undefined} [encoding]\n * Character encoding for when `value` is `Buffer`.\n * @param {Options | null | undefined} [options]\n * Configuration.\n * @returns {Root}\n * mdast tree.\n */\nexport function fromMarkdown(value, encoding, options) {\n if (typeof encoding !== 'string') {\n options = encoding\n encoding = undefined\n }\n return compiler(options)(\n postprocess(\n parse(options).document().write(preprocess()(value, encoding, true))\n )\n )\n}\n\n/**\n * Note this compiler only understand complete buffering, not streaming.\n *\n * @param {Options | null | undefined} [options]\n */\nfunction compiler(options) {\n /** @type {Config} */\n const config = {\n transforms: [],\n canContainEols: ['emphasis', 'fragment', 'heading', 'paragraph', 'strong'],\n enter: {\n autolink: opener(link),\n autolinkProtocol: onenterdata,\n autolinkEmail: onenterdata,\n atxHeading: opener(heading),\n blockQuote: opener(blockQuote),\n characterEscape: onenterdata,\n characterReference: onenterdata,\n codeFenced: opener(codeFlow),\n codeFencedFenceInfo: buffer,\n codeFencedFenceMeta: buffer,\n codeIndented: opener(codeFlow, buffer),\n codeText: opener(codeText, buffer),\n codeTextData: onenterdata,\n data: onenterdata,\n codeFlowValue: onenterdata,\n definition: opener(definition),\n definitionDestinationString: buffer,\n definitionLabelString: buffer,\n definitionTitleString: buffer,\n emphasis: opener(emphasis),\n hardBreakEscape: opener(hardBreak),\n hardBreakTrailing: opener(hardBreak),\n htmlFlow: opener(html, buffer),\n htmlFlowData: onenterdata,\n htmlText: opener(html, buffer),\n htmlTextData: onenterdata,\n image: opener(image),\n label: buffer,\n link: opener(link),\n listItem: opener(listItem),\n listItemValue: onenterlistitemvalue,\n listOrdered: opener(list, onenterlistordered),\n listUnordered: opener(list),\n paragraph: opener(paragraph),\n reference: onenterreference,\n referenceString: buffer,\n resourceDestinationString: buffer,\n resourceTitleString: buffer,\n setextHeading: opener(heading),\n strong: opener(strong),\n thematicBreak: opener(thematicBreak)\n },\n exit: {\n atxHeading: closer(),\n atxHeadingSequence: onexitatxheadingsequence,\n autolink: closer(),\n autolinkEmail: onexitautolinkemail,\n autolinkProtocol: onexitautolinkprotocol,\n blockQuote: closer(),\n characterEscapeValue: onexitdata,\n characterReferenceMarkerHexadecimal: onexitcharacterreferencemarker,\n characterReferenceMarkerNumeric: onexitcharacterreferencemarker,\n characterReferenceValue: onexitcharacterreferencevalue,\n codeFenced: closer(onexitcodefenced),\n codeFencedFence: onexitcodefencedfence,\n codeFencedFenceInfo: onexitcodefencedfenceinfo,\n codeFencedFenceMeta: onexitcodefencedfencemeta,\n codeFlowValue: onexitdata,\n codeIndented: closer(onexitcodeindented),\n codeText: closer(onexitcodetext),\n codeTextData: onexitdata,\n data: onexitdata,\n definition: closer(),\n definitionDestinationString: onexitdefinitiondestinationstring,\n definitionLabelString: onexitdefinitionlabelstring,\n definitionTitleString: onexitdefinitiontitlestring,\n emphasis: closer(),\n hardBreakEscape: closer(onexithardbreak),\n hardBreakTrailing: closer(onexithardbreak),\n htmlFlow: closer(onexithtmlflow),\n htmlFlowData: onexitdata,\n htmlText: closer(onexithtmltext),\n htmlTextData: onexitdata,\n image: closer(onexitimage),\n label: onexitlabel,\n labelText: onexitlabeltext,\n lineEnding: onexitlineending,\n link: closer(onexitlink),\n listItem: closer(),\n listOrdered: closer(),\n listUnordered: closer(),\n paragraph: closer(),\n referenceString: onexitreferencestring,\n resourceDestinationString: onexitresourcedestinationstring,\n resourceTitleString: onexitresourcetitlestring,\n resource: onexitresource,\n setextHeading: closer(onexitsetextheading),\n setextHeadingLineSequence: onexitsetextheadinglinesequence,\n setextHeadingText: onexitsetextheadingtext,\n strong: closer(),\n thematicBreak: closer()\n }\n }\n configure(config, (options || {}).mdastExtensions || [])\n\n /** @type {CompileData} */\n const data = {}\n return compile\n\n /**\n * Turn micromark events into an mdast tree.\n *\n * @param {Array<Event>} events\n * Events.\n * @returns {Root}\n * mdast tree.\n */\n function compile(events) {\n /** @type {Root} */\n let tree = {\n type: 'root',\n children: []\n }\n /** @type {Omit<CompileContext, 'sliceSerialize'>} */\n const context = {\n stack: [tree],\n tokenStack: [],\n config,\n enter,\n exit,\n buffer,\n resume,\n data\n }\n /** @type {Array<number>} */\n const listStack = []\n let index = -1\n while (++index < events.length) {\n // We preprocess lists to add `listItem` tokens, and to infer whether\n // items the list itself are spread out.\n if (\n events[index][1].type === 'listOrdered' ||\n events[index][1].type === 'listUnordered'\n ) {\n if (events[index][0] === 'enter') {\n listStack.push(index)\n } else {\n const tail = listStack.pop()\n index = prepareList(events, tail, index)\n }\n }\n }\n index = -1\n while (++index < events.length) {\n const handler = config[events[index][0]]\n if (own.call(handler, events[index][1].type)) {\n handler[events[index][1].type].call(\n Object.assign(\n {\n sliceSerialize: events[index][2].sliceSerialize\n },\n context\n ),\n events[index][1]\n )\n }\n }\n\n // Handle tokens still being open.\n if (context.tokenStack.length > 0) {\n const tail = context.tokenStack[context.tokenStack.length - 1]\n const handler = tail[1] || defaultOnError\n handler.call(context, undefined, tail[0])\n }\n\n // Figure out `root` position.\n tree.position = {\n start: point(\n events.length > 0\n ? events[0][1].start\n : {\n line: 1,\n column: 1,\n offset: 0\n }\n ),\n end: point(\n events.length > 0\n ? events[events.length - 2][1].end\n : {\n line: 1,\n column: 1,\n offset: 0\n }\n )\n }\n\n // Call transforms.\n index = -1\n while (++index < config.transforms.length) {\n tree = config.transforms[index](tree) || tree\n }\n return tree\n }\n\n /**\n * @param {Array<Event>} events\n * @param {number} start\n * @param {number} length\n * @returns {number}\n */\n function prepareList(events, start, length) {\n let index = start - 1\n let containerBalance = -1\n let listSpread = false\n /** @type {Token | undefined} */\n let listItem\n /** @type {number | undefined} */\n let lineIndex\n /** @type {number | undefined} */\n let firstBlankLineIndex\n /** @type {boolean | undefined} */\n let atMarker\n while (++index <= length) {\n const event = events[index]\n switch (event[1].type) {\n case 'listUnordered':\n case 'listOrdered':\n case 'blockQuote': {\n if (event[0] === 'enter') {\n containerBalance++\n } else {\n containerBalance--\n }\n atMarker = undefined\n break\n }\n case 'lineEndingBlank': {\n if (event[0] === 'enter') {\n if (\n listItem &&\n !atMarker &&\n !containerBalance &&\n !firstBlankLineIndex\n ) {\n firstBlankLineIndex = index\n }\n atMarker = undefined\n }\n break\n }\n case 'linePrefix':\n case 'listItemValue':\n case 'listItemMarker':\n case 'listItemPrefix':\n case 'listItemPrefixWhitespace': {\n // Empty.\n\n break\n }\n default: {\n atMarker = undefined\n }\n }\n if (\n (!containerBalance &&\n event[0] === 'enter' &&\n event[1].type === 'listItemPrefix') ||\n (containerBalance === -1 &&\n event[0] === 'exit' &&\n (event[1].type === 'listUnordered' ||\n event[1].type === 'listOrdered'))\n ) {\n if (listItem) {\n let tailIndex = index\n lineIndex = undefined\n while (tailIndex--) {\n const tailEvent = events[tailIndex]\n if (\n tailEvent[1].type === 'lineEnding' ||\n tailEvent[1].type === 'lineEndingBlank'\n ) {\n if (tailEvent[0] === 'exit') continue\n if (lineIndex) {\n events[lineIndex][1].type = 'lineEndingBlank'\n listSpread = true\n }\n tailEvent[1].type = 'lineEnding'\n lineIndex = tailIndex\n } else if (\n tailEvent[1].type === 'linePrefix' ||\n tailEvent[1].type === 'blockQuotePrefix' ||\n tailEvent[1].type === 'blockQuotePrefixWhitespace' ||\n tailEvent[1].type === 'blockQuoteMarker' ||\n tailEvent[1].type === 'listItemIndent'\n ) {\n // Empty\n } else {\n break\n }\n }\n if (\n firstBlankLineIndex &&\n (!lineIndex || firstBlankLineIndex < lineIndex)\n ) {\n listItem._spread = true\n }\n\n // Fix position.\n listItem.end = Object.assign(\n {},\n lineIndex ? events[lineIndex][1].start : event[1].end\n )\n events.splice(lineIndex || index, 0, ['exit', listItem, event[2]])\n index++\n length++\n }\n\n // Create a new list item.\n if (event[1].type === 'listItemPrefix') {\n /** @type {Token} */\n const item = {\n type: 'listItem',\n _spread: false,\n start: Object.assign({}, event[1].start),\n // @ts-expect-error: we’ll add `end` in a second.\n end: undefined\n }\n listItem = item\n events.splice(index, 0, ['enter', item, event[2]])\n index++\n length++\n firstBlankLineIndex = undefined\n atMarker = true\n }\n }\n }\n events[start][1]._spread = listSpread\n return length\n }\n\n /**\n * Create an opener handle.\n *\n * @param {(token: Token) => Nodes} create\n * Create a node.\n * @param {Handle | undefined} [and]\n * Optional function to also run.\n * @returns {Handle}\n * Handle.\n */\n function opener(create, and) {\n return open\n\n /**\n * @this {CompileContext}\n * @param {Token} token\n * @returns {undefined}\n */\n function open(token) {\n enter.call(this, create(token), token)\n if (and) and.call(this, token)\n }\n }\n\n /**\n * @this {CompileContext}\n * @returns {undefined}\n */\n function buffer() {\n this.stack.push({\n type: 'fragment',\n children: []\n })\n }\n\n /**\n * @this {CompileContext}\n * Context.\n * @param {Nodes} node\n * Node to enter.\n * @param {Token} token\n * Corresponding token.\n * @param {OnEnterError | undefined} [errorHandler]\n * Handle the case where this token is open, but it is closed by something else.\n * @returns {undefined}\n * Nothing.\n */\n function enter(node, token, errorHandler) {\n const parent = this.stack[this.stack.length - 1]\n /** @type {Array<Nodes>} */\n const siblings = parent.children\n siblings.push(node)\n this.stack.push(node)\n this.tokenStack.push([token, errorHandler])\n node.position = {\n start: point(token.start),\n // @ts-expect-error: `end` will be patched later.\n end: undefined\n }\n }\n\n /**\n * Create a closer handle.\n *\n * @param {Handle | undefined} [and]\n * Optional function to also run.\n * @returns {Handle}\n * Handle.\n */\n function closer(and) {\n return close\n\n /**\n * @this {CompileContext}\n * @param {Token} token\n * @returns {undefined}\n */\n function close(token) {\n if (and) and.call(this, token)\n exit.call(this, token)\n }\n }\n\n /**\n * @this {CompileContext}\n * Context.\n * @param {Token} token\n * Corresponding token.\n * @param {OnExitError | undefined} [onExitError]\n * Handle the case where another token is open.\n * @returns {undefined}\n * Nothing.\n */\n function exit(token, onExitError) {\n const node = this.stack.pop()\n const open = this.tokenStack.pop()\n if (!open) {\n throw new Error(\n 'Cannot close `' +\n token.type +\n '` (' +\n stringifyPosition({\n start: token.start,\n end: token.end\n }) +\n '): it’s not open'\n )\n } else if (open[0].type !== token.type) {\n if (onExitError) {\n onExitError.call(this, token, open[0])\n } else {\n const handler = open[1] || defaultOnError\n handler.call(this, token, open[0])\n }\n }\n node.position.end = point(token.end)\n }\n\n /**\n * @this {CompileContext}\n * @returns {string}\n */\n function resume() {\n return toString(this.stack.pop())\n }\n\n //\n // Handlers.\n //\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onenterlistordered() {\n this.data.expectingFirstListItemValue = true\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onenterlistitemvalue(token) {\n if (this.data.expectingFirstListItemValue) {\n const ancestor = this.stack[this.stack.length - 2]\n ancestor.start = Number.parseInt(this.sliceSerialize(token), 10)\n this.data.expectingFirstListItemValue = undefined\n }\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitcodefencedfenceinfo() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.lang = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitcodefencedfencemeta() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.meta = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitcodefencedfence() {\n // Exit if this is the closing fence.\n if (this.data.flowCodeInside) return\n this.buffer()\n this.data.flowCodeInside = true\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitcodefenced() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.value = data.replace(/^(\\r?\\n|\\r)|(\\r?\\n|\\r)$/g, '')\n this.data.flowCodeInside = undefined\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitcodeindented() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.value = data.replace(/(\\r?\\n|\\r)$/g, '')\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitdefinitionlabelstring(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.label = label\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitdefinitiontitlestring() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.title = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitdefinitiondestinationstring() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.url = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitatxheadingsequence(token) {\n const node = this.stack[this.stack.length - 1]\n if (!node.depth) {\n const depth = this.sliceSerialize(token).length\n node.depth = depth\n }\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitsetextheadingtext() {\n this.data.setextHeadingSlurpLineEnding = true\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitsetextheadinglinesequence(token) {\n const node = this.stack[this.stack.length - 1]\n node.depth = this.sliceSerialize(token).codePointAt(0) === 61 ? 1 : 2\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitsetextheading() {\n this.data.setextHeadingSlurpLineEnding = undefined\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onenterdata(token) {\n const node = this.stack[this.stack.length - 1]\n /** @type {Array<Nodes>} */\n const siblings = node.children\n let tail = siblings[siblings.length - 1]\n if (!tail || tail.type !== 'text') {\n // Add a new text node.\n tail = text()\n tail.position = {\n start: point(token.start),\n // @ts-expect-error: we’ll add `end` later.\n end: undefined\n }\n siblings.push(tail)\n }\n this.stack.push(tail)\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitdata(token) {\n const tail = this.stack.pop()\n tail.value += this.sliceSerialize(token)\n tail.position.end = point(token.end)\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitlineending(token) {\n const context = this.stack[this.stack.length - 1]\n // If we’re at a hard break, include the line ending in there.\n if (this.data.atHardBreak) {\n const tail = context.children[context.children.length - 1]\n tail.position.end = point(token.end)\n this.data.atHardBreak = undefined\n return\n }\n if (\n !this.data.setextHeadingSlurpLineEnding &&\n config.canContainEols.includes(context.type)\n ) {\n onenterdata.call(this, token)\n onexitdata.call(this, token)\n }\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexithardbreak() {\n this.data.atHardBreak = true\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexithtmlflow() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.value = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexithtmltext() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.value = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitcodetext() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.value = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitlink() {\n const node = this.stack[this.stack.length - 1]\n // Note: there are also `identifier` and `label` fields on this link node!\n // These are used / cleaned here.\n // To do: clean.\n if (this.data.inReference) {\n /** @type {ReferenceType} */\n const referenceType = this.data.referenceType || 'shortcut'\n node.type += 'Reference'\n // @ts-expect-error: mutate.\n node.referenceType = referenceType\n // @ts-expect-error: mutate.\n delete node.url\n delete node.title\n } else {\n // @ts-expect-error: mutate.\n delete node.identifier\n // @ts-expect-error: mutate.\n delete node.label\n }\n this.data.referenceType = undefined\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitimage() {\n const node = this.stack[this.stack.length - 1]\n // Note: there are also `identifier` and `label` fields on this link node!\n // These are used / cleaned here.\n // To do: clean.\n if (this.data.inReference) {\n /** @type {ReferenceType} */\n const referenceType = this.data.referenceType || 'shortcut'\n node.type += 'Reference'\n // @ts-expect-error: mutate.\n node.referenceType = referenceType\n // @ts-expect-error: mutate.\n delete node.url\n delete node.title\n } else {\n // @ts-expect-error: mutate.\n delete node.identifier\n // @ts-expect-error: mutate.\n delete node.label\n }\n this.data.referenceType = undefined\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitlabeltext(token) {\n const string = this.sliceSerialize(token)\n const ancestor = this.stack[this.stack.length - 2]\n // @ts-expect-error: stash this on the node, as it might become a reference\n // later.\n ancestor.label = decodeString(string)\n // @ts-expect-error: same as above.\n ancestor.identifier = normalizeIdentifier(string).toLowerCase()\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitlabel() {\n const fragment = this.stack[this.stack.length - 1]\n const value = this.resume()\n const node = this.stack[this.stack.length - 1]\n // Assume a reference.\n this.data.inReference = true\n if (node.type === 'link') {\n /** @type {Array<PhrasingContent>} */\n const children = fragment.children\n node.children = children\n } else {\n node.alt = value\n }\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitresourcedestinationstring() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.url = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitresourcetitlestring() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.title = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitresource() {\n this.data.inReference = undefined\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onenterreference() {\n this.data.referenceType = 'collapsed'\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitreferencestring(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n // @ts-expect-error: stash this on the node, as it might become a reference\n // later.\n node.label = label\n // @ts-expect-error: same as above.\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n this.data.referenceType = 'full'\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitcharacterreferencemarker(token) {\n this.data.characterReferenceType = token.type\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitcharacterreferencevalue(token) {\n const data = this.sliceSerialize(token)\n const type = this.data.characterReferenceType\n /** @type {string} */\n let value\n if (type) {\n value = decodeNumericCharacterReference(\n data,\n type === 'characterReferenceMarkerNumeric' ? 10 : 16\n )\n this.data.characterReferenceType = undefined\n } else {\n const result = decodeNamedCharacterReference(data)\n value = result\n }\n const tail = this.stack.pop()\n tail.value += value\n tail.position.end = point(token.end)\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitautolinkprotocol(token) {\n onexitdata.call(this, token)\n const node = this.stack[this.stack.length - 1]\n node.url = this.sliceSerialize(token)\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitautolinkemail(token) {\n onexitdata.call(this, token)\n const node = this.stack[this.stack.length - 1]\n node.url = 'mailto:' + this.sliceSerialize(token)\n }\n\n //\n // Creaters.\n //\n\n /** @returns {Blockquote} */\n function blockQuote() {\n return {\n type: 'blockquote',\n children: []\n }\n }\n\n /** @returns {Code} */\n function codeFlow() {\n return {\n type: 'code',\n lang: null,\n meta: null,\n value: ''\n }\n }\n\n /** @returns {InlineCode} */\n function codeText() {\n return {\n type: 'inlineCode',\n value: ''\n }\n }\n\n /** @returns {Definition} */\n function definition() {\n return {\n type: 'definition',\n identifier: '',\n label: null,\n title: null,\n url: ''\n }\n }\n\n /** @returns {Emphasis} */\n function emphasis() {\n return {\n type: 'emphasis',\n children: []\n }\n }\n\n /** @returns {Heading} */\n function heading() {\n return {\n type: 'heading',\n // @ts-expect-error `depth` will be set later.\n depth: 0,\n children: []\n }\n }\n\n /** @returns {Break} */\n function hardBreak() {\n return {\n type: 'break'\n }\n }\n\n /** @returns {Html} */\n function html() {\n return {\n type: 'html',\n value: ''\n }\n }\n\n /** @returns {Image} */\n function image() {\n return {\n type: 'image',\n title: null,\n url: '',\n alt: null\n }\n }\n\n /** @returns {Link} */\n function link() {\n return {\n type: 'link',\n title: null,\n url: '',\n children: []\n }\n }\n\n /**\n * @param {Token} token\n * @returns {List}\n */\n function list(token) {\n return {\n type: 'list',\n ordered: token.type === 'listOrdered',\n start: null,\n spread: token._spread,\n children: []\n }\n }\n\n /**\n * @param {Token} token\n * @returns {ListItem}\n */\n function listItem(token) {\n return {\n type: 'listItem',\n spread: token._spread,\n checked: null,\n children: []\n }\n }\n\n /** @returns {Paragraph} */\n function paragraph() {\n return {\n type: 'paragraph',\n children: []\n }\n }\n\n /** @returns {Strong} */\n function strong() {\n return {\n type: 'strong',\n children: []\n }\n }\n\n /** @returns {Text} */\n function text() {\n return {\n type: 'text',\n value: ''\n }\n }\n\n /** @returns {ThematicBreak} */\n function thematicBreak() {\n return {\n type: 'thematicBreak'\n }\n }\n}\n\n/**\n * Copy a point-like value.\n *\n * @param {Point} d\n * Point-like value.\n * @returns {Point}\n * unist point.\n */\nfunction point(d) {\n return {\n line: d.line,\n column: d.column,\n offset: d.offset\n }\n}\n\n/**\n * @param {Config} combined\n * @param {Array<Array<Extension> | Extension>} extensions\n * @returns {undefined}\n */\nfunction configure(combined, extensions) {\n let index = -1\n while (++index < extensions.length) {\n const value = extensions[index]\n if (Array.isArray(value)) {\n configure(combined, value)\n } else {\n extension(combined, value)\n }\n }\n}\n\n/**\n * @param {Config} combined\n * @param {Extension} extension\n * @returns {undefined}\n */\nfunction extension(combined, extension) {\n /** @type {keyof Extension} */\n let key\n for (key in extension) {\n if (own.call(extension, key)) {\n switch (key) {\n case 'canContainEols': {\n const right = extension[key]\n if (right) {\n combined[key].push(...right)\n }\n break\n }\n case 'transforms': {\n const right = extension[key]\n if (right) {\n combined[key].push(...right)\n }\n break\n }\n case 'enter':\n case 'exit': {\n const right = extension[key]\n if (right) {\n Object.assign(combined[key], right)\n }\n break\n }\n // No default\n }\n }\n }\n}\n\n/** @type {OnEnterError} */\nfunction defaultOnError(left, right) {\n if (left) {\n throw new Error(\n 'Cannot close `' +\n left.type +\n '` (' +\n stringifyPosition({\n start: left.start,\n end: left.end\n }) +\n '): a different token (`' +\n right.type +\n '`, ' +\n stringifyPosition({\n start: right.start,\n end: right.end\n }) +\n ') is open'\n )\n } else {\n throw new Error(\n 'Cannot close document, a token (`' +\n right.type +\n '`, ' +\n stringifyPosition({\n start: right.start,\n end: right.end\n }) +\n ') is still open'\n )\n }\n}\n","import type { Asset } from \"@player-ui/types\";\nimport type {\n Blockquote,\n Code,\n Emphasis,\n Heading,\n Image,\n InlineCode,\n Link,\n List,\n ListItem,\n Paragraph,\n Strong,\n Text,\n ThematicBreak,\n} from \"mdast-util-from-markdown/lib\";\nimport type { Transformer } from \"../types\";\n\n/**\n * Swap markdown type to text\n */\nfunction swapMarkdownType(asset: Asset): Asset {\n return { ...asset, type: \"text\" };\n}\n\n/**\n * Transforms Text AST Node into Player Content\n */\nconst textTransformer: Transformer<Text> = ({ astNode, asset, mappers }) => {\n const { value } = astNode;\n\n return mappers.text({\n originalAsset: asset,\n value,\n });\n};\n\n/**\n * Transforms Emphasis AST Node into Player Content\n */\nconst emphasisTransformer: Transformer<Emphasis> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.emphasis) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.emphasis({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Strong AST Node into Player Content\n */\nconst strongTransformer: Transformer<Strong> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.strong) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.strong({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Paragraph AST Node into Player Content\n */\nconst paragraphTransformer: Transformer<Paragraph> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n const { children } = astNode;\n\n if (\n children.every(({ type }) => Boolean(mappers[type as keyof typeof mappers]))\n ) {\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.paragraph({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms List AST Node into Player Content\n */\nconst listTransformer: Transformer<List> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.list) {\n const { children, ordered, start } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.list({\n originalAsset: asset,\n value,\n ordered: Boolean(ordered),\n start: start || undefined,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms ListItem AST Node into Player Content\n */\nconst listItemTransformer: Transformer<ListItem> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n const mapper = mappers.listItem || mappers.paragraph;\n\n return mapper({\n originalAsset: asset,\n value,\n });\n};\n\n/**\n * Transforms Link AST Node into Player Content\n */\nconst linkTransformer: Transformer<Link> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.link) {\n const { children, url } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.link({\n originalAsset: asset,\n href: url,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Image AST Node into Player Content\n */\nconst imageTransformer: Transformer<Image> = ({ astNode, asset, mappers }) => {\n if (mappers.image) {\n const { title, url, alt } = astNode;\n\n return mappers.image({\n originalAsset: asset,\n src: url,\n value: title || alt || \"\",\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Blockquote AST Node into Player Content\n */\nconst blockquoteTransformer: Transformer<Blockquote> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.blockquote) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.blockquote({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms InlineCode AST Node into Player Content\n */\nconst inlineCodeTransformer: Transformer<InlineCode> = ({\n astNode,\n asset,\n mappers,\n}) => {\n if (mappers.inlineCode) {\n const { value } = astNode;\n\n return mappers.inlineCode({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Code block AST Node into Player Content\n */\nconst codeTransformer: Transformer<Code> = ({ astNode, asset, mappers }) => {\n if (mappers.code) {\n const { value, lang } = astNode;\n\n return mappers.code({\n originalAsset: asset,\n value,\n lang: lang || undefined,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Horizontal Rule (Thematic Break) AST Node into Player Content\n */\nconst horizontalRuleTransformer: Transformer<ThematicBreak> = ({\n asset,\n mappers,\n}) => {\n if (mappers.horizontalRule) {\n return mappers.horizontalRule({\n originalAsset: asset,\n value: \"---\",\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Heading AST Node into Player Content\n */\nconst headingTransformer: Transformer<Heading> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.heading) {\n const { children, depth } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.heading({\n originalAsset: asset,\n value,\n depth,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\nexport const transformers: Record<string, Transformer> = {\n horizontalRule: horizontalRuleTransformer,\n text: textTransformer,\n emphasis: emphasisTransformer,\n strong: strongTransformer,\n blockquote: blockquoteTransformer,\n list: listTransformer,\n listItem: listItemTransformer,\n link: linkTransformer,\n image: imageTransformer,\n paragraph: paragraphTransformer,\n code: codeTransformer,\n heading: headingTransformer,\n inlineCode: inlineCodeTransformer,\n};\n","import type { Node, ParseObjectOptions } from \"@player-ui/player\";\nimport { NodeType } from \"@player-ui/player\";\nimport type { Asset } from \"@player-ui/types\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport type { Mappers } from \"../types\";\nimport { transformers } from \"./transformers\";\n\n/**\n * Parses markdown content using a provided mappers record.\n */\nexport function parseAssetMarkdownContent({\n asset,\n mappers,\n parser,\n}: {\n /**\n * Asset to be parsed\n */\n asset: Asset;\n /**\n * Mappers record of AST Node to Player Content\n *\n * @see {@link Mappers}\n */\n mappers: Mappers;\n /**\n * Parser object to AST\n */\n parser?: (\n obj: object,\n type?: Node.ChildrenTypes,\n options?: ParseObjectOptions,\n ) => Node.Node | null;\n}): Node.Node | null {\n const { children } = fromMarkdown(asset.value as string);\n const isMultiParagraph = children.length > 1;\n\n if (isMultiParagraph) {\n const value = children.map((node) => {\n const transformer = transformers[node.type as keyof typeof transformers];\n return transformer({\n astNode: node as any,\n asset,\n mappers,\n transformers,\n });\n });\n\n const collection = mappers.collection({\n originalAsset: asset,\n value,\n });\n\n return parser?.(collection, NodeType.Asset) || null;\n }\n\n const transformer =\n transformers[children[0].type as keyof typeof transformers];\n const content = transformer({\n astNode: children[0] as any,\n asset,\n mappers,\n transformers,\n });\n\n return parser?.(content, NodeType.Asset) || null;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/ts-nested-error@1.2.1/node_modules/ts-nested-error/src/nested-error.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/timm@1.7.1/node_modules/timm/lib/timm.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/p-defer@3.0.0/node_modules/p-defer/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/queue-microtask@1.2.3/node_modules/queue-microtask/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/sorted-array@2.0.4/node_modules/sorted-array/sorted-array.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/index.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/tapable-ts@0.2.4/node_modules/tapable-ts/src/utils.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/tapable-ts@0.2.4/node_modules/tapable-ts/src/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/binding/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/binding/resolver.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/dlv@1.1.3/node_modules/dlv/index.js","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/data/local-model.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/expressions/evaluator.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/string-resolver/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/validator/validation-middleware.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/resolver/index.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/dequal@2.0.3/node_modules/dequal/dist/index.mjs","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/parser/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/string-resolver.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/applicability.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/player.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/flow/flow.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/validation/controller.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/view/controller.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/partial-match-registry/src/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/partial-match-registry/src/deep-partial-matcher.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/binding-grammar/ast.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/binding-grammar/custom/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/binding/utils.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/binding/binding.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/data/dependency-tracker.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/data/noop-model.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/data/model.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/expressions/types.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/expressions/parser.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/expressions/evaluator-functions.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/expressions/utils.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/logger/tapableLogger.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/logger/proxyLogger.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/schema/schema.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/validator/binding-map-splice.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/validator/registry.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/parser/types.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/parser/utils.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/resolver/utils.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/view.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/template.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/switch.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/multi-node.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/view/plugins/asset.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/flow/controller.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/utils/replaceParams.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/validation/binding-tracker.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/view/store.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/view/asset-transform.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/data/utils.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/data/controller.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/constants/utils.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/controllers/constants/index.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/plugins/flow-exp-plugin.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/plugins/default-exp-plugin.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/types.ts","../../../../../../../../../../../../execroot/execroot/_main/bazel-out/k8-fastbuild/bin/core/player/src/plugins/default-view-plugin.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/mdast-util-to-string@4.0.0/node_modules/mdast-util-to-string/lib/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/character-entities@2.0.2/node_modules/character-entities/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/decode-named-character-reference@1.0.2/node_modules/decode-named-character-reference/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-chunked@2.0.0/node_modules/micromark-util-chunked/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-combine-extensions@2.0.0/node_modules/micromark-util-combine-extensions/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-decode-numeric-character-reference@2.0.1/node_modules/micromark-util-decode-numeric-character-reference/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-normalize-identifier@2.0.0/node_modules/micromark-util-normalize-identifier/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-character@2.1.0/node_modules/micromark-util-character/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-factory-space@2.0.0/node_modules/micromark-factory-space/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/initialize/content.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/initialize/document.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-classify-character@2.0.0/node_modules/micromark-util-classify-character/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-resolve-all@2.0.0/node_modules/micromark-util-resolve-all/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/attention.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/autolink.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/blank-line.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/block-quote.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/character-escape.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/character-reference.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/code-fenced.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/code-indented.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/code-text.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-subtokenize@2.0.1/node_modules/micromark-util-subtokenize/lib/splice-buffer.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-subtokenize@2.0.1/node_modules/micromark-util-subtokenize/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/content.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-factory-destination@2.0.0/node_modules/micromark-factory-destination/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-factory-label@2.0.0/node_modules/micromark-factory-label/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-factory-title@2.0.0/node_modules/micromark-factory-title/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-factory-whitespace@2.0.0/node_modules/micromark-factory-whitespace/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/definition.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/hard-break-escape.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/heading-atx.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-html-tag-name@2.0.0/node_modules/micromark-util-html-tag-name/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/html-flow.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/html-text.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/label-end.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/label-start-image.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/label-start-link.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/line-ending.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/thematic-break.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/list.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-core-commonmark@2.0.1/node_modules/micromark-core-commonmark/lib/setext-underline.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/initialize/flow.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/initialize/text.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/create-tokenizer.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/constructs.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/parse.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/postprocess.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark@4.0.0/node_modules/micromark/lib/preprocess.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/micromark-util-decode-string@2.0.0/node_modules/micromark-util-decode-string/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/unist-util-stringify-position@4.0.0/node_modules/unist-util-stringify-position/lib/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/node_modules/.aspect_rules_js/mdast-util-from-markdown@2.0.0/node_modules/mdast-util-from-markdown/lib/index.js","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/utils/transformers.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/utils/markdownParser.ts"],"names":["NestedError","clone","addLast","removeAt","set","setIn","omit","hasOwnProperty","deferred","SortedArray","index","t","import_ts_nested_error","obj","key","def","p","undef","split","length","import_timm","import_p_defer","node","normalized","__export","SyncWaterfallHook","SyncBailHook","SyncHook","parse","NodeType","value","children","update","resolver","flow","defer","all","queueMicrotask","dequal","_Player","list","extension","previous","point","constructs","text","attentionMarkers","effects","ok","nok","start","furtherStart","content","titleBefore","definition","exit","from","document","string","head","own","blockQuote","codeText","thematicBreak","listItem","data","transformers","transformer"],"mappings":"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","sourcesContent":["/**\n * Subclass of standard `Error` that eagerly collects the callstack of the error\n * that caused it. This way you can investigate the core problem that happened\n * by looking at the callstack from up to bottom (from higher level errors to\n * lower level).\n */\nexport class NestedError extends Error {\n /**\n * Combined callstack of this error and the errors that it wraps.\n * If the JavaScript runtime doesn't support `Error::stack` property\n * this will contain only the concatenated messages.\n */\n readonly stack: string;\n\n /**\n * The list of lower-level errors wrapped by this error.\n */\n readonly innerErrors: Error[];\n\n /**\n * Provides the first `Error` of the `innerErrors` (if it exists);\n * otherwise, `null`.\n *\n * @deprecated Please shift to using the `innerErrors` (with an 's') property.\n */\n get innerError(): Error | null {\n return this.innerErrors.length === 0\n ? null\n : this.innerErrors[0];\n }\n\n private static readonly getErrorReport = typeof new Error().stack === 'string'\n ? (err: Error) => err.stack!\n : (err: Error) => `${err.name}: ${err.message}`;\n\n /**\n * Returns the function that accepts any value that was thrown as the first argument and\n * throws it wrapped into `NestedError` or class derived from `NestedError` (provided\n * this method was called directly in the context of that dervied class constructor)\n * with the given `message`.\n * Returned function will pass accepted `Error` object directly to `NestedError`\n * as `innerErrors` by invoking `toError(err)` on it.\n *\n * You'll most likely want to use this method with promises:\n *\n * ```ts\n * userService.getPage().then(\n * data => console.log(`Hooray! data: ${data}`),\n * NestedError.rethrow('failed to fetch users page')\n * );\n * ```\n *\n * @param message Message to attach `NestedError` created by the returned function.\n */\n static rethrow(message: string) {\n return (...errs: unknown[]) => { throw new this(message, ...errs); };\n }\n\n /**\n * Allocates an instance of `NestedError` with the given error `message` and\n * optional `innerError` (which will be automatically coerced using `toError()`).\n *\n * @param message Laconic error message to attach to the created `NestedError`.\n * @param innerErrors Optional errors that will be wrapped by this higher level\n * error. This value will be automatically coerced using `toError()`.\n */\n constructor(message?: string, ...innerErrors: unknown[]) {\n super(message);\n const thisErrorReport = NestedError.getErrorReport(this);\n if (innerErrors.length === 1) {\n const innerError = toError(innerErrors[0]);\n this.innerErrors = [innerError];\n const errReport = NestedError.getErrorReport(innerError);\n this.stack = `${thisErrorReport}\\n\\n======= INNER ERROR =======\\n\\n${errReport}`;\n return;\n }\n this.innerErrors = innerErrors.map(err => toError(err));\n const innerErrorReports = this.innerErrors\n .map((error, idx) => {\n const errReport = NestedError.getErrorReport(error);\n return `======= INNER ERROR (${idx + 1} of ${innerErrors.length}) =======\\n\\n${errReport}`;\n })\n .join(\"\\n\\n\");\n this.stack = `${thisErrorReport}\\n\\n${innerErrorReports}`;\n }\n}\n\nNestedError.prototype.name = nameof(NestedError);\n\n/**\n * @deprecated You should not call this function on an object of statically assumed `Error` type,\n * because it is intended to be used in a dynamic context where the type of thrown value\n * is not known ahead of time (during the compile time).\n */\nexport function toError(err: Error): Error;\n\n/**\n * Returns `err` itself if `err instanceof Error === true`, otherwise attemts to\n * stringify it and wrap into `Error` object to be returned.\n *\n * **This function is guaranteed never to throw.**\n *\n * @param err Possbile `instanceof Error` to return or value of any type that will\n * be wrapped into a fully-fledged `Error` object.\n */\nexport function toError(err: unknown): Error;\n\nexport function toError(err: unknown) {\n try {\n return err instanceof Error\n ? err\n : new Error(`Value that is not an instance of Error was thrown: ${err}`);\n } catch {\n return new Error(\n \"Failed to stringify non-instance of Error that was thrown.\" +\n \"This is possibly due to the fact that toString() method of the value\" +\n \"doesn't return a primitive value.\"\n );\n }\n}\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.clone = clone;\nexports.addLast = addLast;\nexports.addFirst = addFirst;\nexports.removeLast = removeLast;\nexports.removeFirst = removeFirst;\nexports.insert = insert;\nexports.removeAt = removeAt;\nexports.replaceAt = replaceAt;\nexports.getIn = getIn;\nexports.set = set;\nexports.setIn = setIn;\nexports.update = update;\nexports.updateIn = updateIn;\nexports.merge = merge;\nexports.mergeDeep = mergeDeep;\nexports.mergeIn = mergeIn;\nexports.omit = omit;\nexports.addDefaults = addDefaults;\nexports.default = void 0;\n\n/* eslint-disable @typescript-eslint/ban-types */\n\n/*!\n * Timm\n *\n * Immutability helpers with fast reads and acceptable writes.\n *\n * @copyright Guillermo Grau Panea 2016\n * @license MIT\n */\nconst INVALID_ARGS = 'INVALID_ARGS';\nconst IS_DEV = process.env.NODE_ENV !== 'production';\n\n// ===============================================\n// ### Helpers\n// ===============================================\nfunction throwStr(msg) {\n throw new Error(msg);\n}\n\nfunction getKeysAndSymbols(obj) {\n const keys = Object.keys(obj);\n\n if (Object.getOwnPropertySymbols) {\n // @ts-ignore\n return keys.concat(Object.getOwnPropertySymbols(obj));\n }\n\n return keys;\n}\n\nconst hasOwnProperty = {}.hasOwnProperty;\n\nfunction clone(obj0) {\n // As array\n if (Array.isArray(obj0)) return obj0.slice(); // As object\n\n const obj = obj0;\n const keys = getKeysAndSymbols(obj);\n const out = {};\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n out[key] = obj[key];\n } // @ts-ignore (see type tests)\n\n\n return out;\n} // Custom guard\n\n\nfunction isObject(o) {\n return o != null && typeof o === 'object';\n} // _deepFreeze = (obj) ->\n// Object.freeze obj\n// for key in Object.getOwnPropertyNames obj\n// val = obj[key]\n// if isObject(val) and not Object.isFrozen val\n// _deepFreeze val\n// obj\n// ===============================================\n// -- ### Arrays\n// ===============================================\n// -- #### addLast()\n// -- Returns a new array with an appended item or items.\n// --\n// -- Usage: `addLast(array, val)`\n// --\n// -- ```js\n// -- arr = ['a', 'b']\n// -- arr2 = addLast(arr, 'c')\n// -- // ['a', 'b', 'c']\n// -- arr2 === arr\n// -- // false\n// -- arr3 = addLast(arr, ['c', 'd'])\n// -- // ['a', 'b', 'c', 'd']\n// -- ```\n// `array.concat(val)` also handles the scalar case,\n// but is apparently very slow\n\n\nfunction addLast(array, val) {\n if (Array.isArray(val)) return array.concat(val);\n return array.concat([val]);\n} // -- #### addFirst()\n// -- Returns a new array with a prepended item or items.\n// --\n// -- Usage: `addFirst(array, val)`\n// --\n// -- ```js\n// -- arr = ['a', 'b']\n// -- arr2 = addFirst(arr, 'c')\n// -- // ['c', 'a', 'b']\n// -- arr2 === arr\n// -- // false\n// -- arr3 = addFirst(arr, ['c', 'd'])\n// -- // ['c', 'd', 'a', 'b']\n// -- ```\n\n\nfunction addFirst(array, val) {\n if (Array.isArray(val)) return val.concat(array);\n return [val].concat(array);\n} // -- #### removeLast()\n// -- Returns a new array removing the last item.\n// --\n// -- Usage: `removeLast(array)`\n// --\n// -- ```js\n// -- arr = ['a', 'b']\n// -- arr2 = removeLast(arr)\n// -- // ['a']\n// -- arr2 === arr\n// -- // false\n// --\n// -- // The same array is returned if there are no changes:\n// -- arr3 = []\n// -- removeLast(arr3) === arr3\n// -- // true\n// -- ```\n\n\nfunction removeLast(array) {\n if (!array.length) return array;\n return array.slice(0, array.length - 1);\n} // -- #### removeFirst()\n// -- Returns a new array removing the first item.\n// --\n// -- Usage: `removeFirst(array)`\n// --\n// -- ```js\n// -- arr = ['a', 'b']\n// -- arr2 = removeFirst(arr)\n// -- // ['b']\n// -- arr2 === arr\n// -- // false\n// --\n// -- // The same array is returned if there are no changes:\n// -- arr3 = []\n// -- removeFirst(arr3) === arr3\n// -- // true\n// -- ```\n\n\nfunction removeFirst(array) {\n if (!array.length) return array;\n return array.slice(1);\n} // -- #### insert()\n// -- Returns a new array obtained by inserting an item or items\n// -- at a specified index.\n// --\n// -- Usage: `insert(array, idx, val)`\n// --\n// -- ```js\n// -- arr = ['a', 'b', 'c']\n// -- arr2 = insert(arr, 1, 'd')\n// -- // ['a', 'd', 'b', 'c']\n// -- arr2 === arr\n// -- // false\n// -- insert(arr, 1, ['d', 'e'])\n// -- // ['a', 'd', 'e', 'b', 'c']\n// -- ```\n\n\nfunction insert(array, idx, val) {\n return array.slice(0, idx).concat(Array.isArray(val) ? val : [val]).concat(array.slice(idx));\n} // -- #### removeAt()\n// -- Returns a new array obtained by removing an item at\n// -- a specified index.\n// --\n// -- Usage: `removeAt(array, idx)`\n// --\n// -- ```js\n// -- arr = ['a', 'b', 'c']\n// -- arr2 = removeAt(arr, 1)\n// -- // ['a', 'c']\n// -- arr2 === arr\n// -- // false\n// --\n// -- // The same array is returned if there are no changes:\n// -- removeAt(arr, 4) === arr\n// -- // true\n// -- ```\n\n\nfunction removeAt(array, idx) {\n if (idx >= array.length || idx < 0) return array;\n return array.slice(0, idx).concat(array.slice(idx + 1));\n} // -- #### replaceAt()\n// -- Returns a new array obtained by replacing an item at\n// -- a specified index. If the provided item is the same as\n// -- (*referentially equal to*) the previous item at that position,\n// -- the original array is returned.\n// --\n// -- Usage: `replaceAt(array, idx, newItem)`\n// --\n// -- ```js\n// -- arr = ['a', 'b', 'c']\n// -- arr2 = replaceAt(arr, 1, 'd')\n// -- // ['a', 'd', 'c']\n// -- arr2 === arr\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- replaceAt(arr, 1, 'b') === arr\n// -- // true\n// -- ```\n\n\nfunction replaceAt(array, idx, newItem) {\n if (array[idx] === newItem) return array;\n const len = array.length;\n const result = Array(len);\n\n for (let i = 0; i < len; i++) {\n result[i] = array[i];\n }\n\n result[idx] = newItem;\n return result;\n} // ===============================================\n// -- ### Collections (objects and arrays)\n// ===============================================\n// -- #### getIn()\n// -- Returns a value from an object at a given path. Works with\n// -- nested arrays and objects. If the path does not exist, it returns\n// -- `undefined`.\n// --\n// -- Usage: `getIn(obj, path)`\n// --\n// -- ```js\n// -- obj = { a: 1, b: 2, d: { d1: 3, d2: 4 }, e: ['a', 'b', 'c'] }\n// -- getIn(obj, ['d', 'd1'])\n// -- // 3\n// -- getIn(obj, ['e', 1])\n// -- // 'b'\n// -- ```\n\n\nfunction getIn(obj, path) {\n if (!Array.isArray(path)) {\n throwStr(IS_DEV ? 'A path array should be provided when calling getIn()' : INVALID_ARGS);\n }\n\n if (obj == null) return undefined;\n let ptr = obj;\n\n for (let i = 0; i < path.length; i++) {\n const key = path[i];\n ptr = ptr != null ? ptr[key] : undefined;\n if (ptr === undefined) return ptr;\n }\n\n return ptr;\n} // -- #### set()\n// -- Returns a new object with a modified attribute.\n// -- If the provided value is the same as (*referentially equal to*)\n// -- the previous value, the original object is returned.\n// --\n// -- Usage: `set(obj, key, val)`\n// --\n// -- ```js\n// -- obj = { a: 1, b: 2, c: 3 }\n// -- obj2 = set(obj, 'b', 5)\n// -- // { a: 1, b: 5, c: 3 }\n// -- obj2 === obj\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- set(obj, 'b', 2) === obj\n// -- // true\n// -- ```\n// When called with an undefined/null `obj`, `set()` returns either\n// a single-element array, or a single-key object\n\n\n// Implementation\nfunction set(obj0, key, val) {\n let obj = obj0;\n if (obj == null) obj = typeof key === 'number' ? [] : {};\n if (obj[key] === val) return obj;\n const obj2 = clone(obj);\n obj2[key] = val;\n return obj2;\n} // -- #### setIn()\n// -- Returns a new object with a modified **nested** attribute.\n// --\n// -- Notes:\n// --\n// -- * If the provided value is the same as (*referentially equal to*)\n// -- the previous value, the original object is returned.\n// -- * If the path does not exist, it will be created before setting\n// -- the new value.\n// --\n// -- Usage: `setIn(obj, path, val)`\n// --\n// -- ```js\n// -- obj = { a: 1, b: 2, d: { d1: 3, d2: 4 }, e: { e1: 'foo', e2: 'bar' } }\n// -- obj2 = setIn(obj, ['d', 'd1'], 4)\n// -- // { a: 1, b: 2, d: { d1: 4, d2: 4 }, e: { e1: 'foo', e2: 'bar' } }\n// -- obj2 === obj\n// -- // false\n// -- obj2.d === obj.d\n// -- // false\n// -- obj2.e === obj.e\n// -- // true\n// --\n// -- // The same object is returned if there are no changes:\n// -- obj3 = setIn(obj, ['d', 'd1'], 3)\n// -- // { a: 1, b: 2, d: { d1: 3, d2: 4 }, e: { e1: 'foo', e2: 'bar' } }\n// -- obj3 === obj\n// -- // true\n// -- obj3.d === obj.d\n// -- // true\n// -- obj3.e === obj.e\n// -- // true\n// --\n// -- // ... unknown paths create intermediate keys. Numeric segments are treated as array indices:\n// -- setIn({ a: 3 }, ['unknown', 0, 'path'], 4)\n// -- // { a: 3, unknown: [{ path: 4 }] }\n// -- ```\n\n\nfunction setIn(obj, path, val) {\n if (!path.length) return val;\n return doSetIn(obj, path, val, 0);\n}\n\nfunction doSetIn(obj, path, val, idx) {\n let newValue;\n const key = path[idx];\n\n if (idx === path.length - 1) {\n newValue = val;\n } else {\n const nestedObj = isObject(obj) && isObject(obj[key]) ? obj[key] : typeof path[idx + 1] === 'number' ? [] : {};\n newValue = doSetIn(nestedObj, path, val, idx + 1);\n }\n\n return set(obj, key, newValue);\n} // -- #### update()\n// -- Returns a new object with a modified attribute,\n// -- calculated via a user-provided callback based on the current value.\n// -- If the calculated value is the same as (*referentially equal to*)\n// -- the previous value, the original object is returned.\n// --\n// -- Usage: `update(obj, key, fnUpdate)`\n// --\n// -- ```js\n// -- obj = { a: 1, b: 2, c: 3 }\n// -- obj2 = update(obj, 'b', (val) => val + 1)\n// -- // { a: 1, b: 3, c: 3 }\n// -- obj2 === obj\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- update(obj, 'b', (val) => val) === obj\n// -- // true\n// -- ```\n\n\nfunction update(obj, key, fnUpdate) {\n const prevVal = obj == null ? undefined : obj[key];\n const nextVal = fnUpdate(prevVal);\n return set(obj, key, nextVal);\n} // -- #### updateIn()\n// -- Returns a new object with a modified **nested** attribute,\n// -- calculated via a user-provided callback based on the current value.\n// -- If the calculated value is the same as (*referentially equal to*)\n// -- the previous value, the original object is returned.\n// --\n// -- Usage: `updateIn<T: ArrayOrObject>(obj: T, path: Array<Key>,\n// -- fnUpdate: (prevValue: any) => any): T`\n// --\n// -- ```js\n// -- obj = { a: 1, d: { d1: 3, d2: 4 } }\n// -- obj2 = updateIn(obj, ['d', 'd1'], (val) => val + 1)\n// -- // { a: 1, d: { d1: 4, d2: 4 } }\n// -- obj2 === obj\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- obj3 = updateIn(obj, ['d', 'd1'], (val) => val)\n// -- // { a: 1, d: { d1: 3, d2: 4 } }\n// -- obj3 === obj\n// -- // true\n// -- ```\n\n\nfunction updateIn(obj, path, fnUpdate) {\n const prevVal = getIn(obj, path);\n const nextVal = fnUpdate(prevVal);\n return setIn(obj, path, nextVal);\n} // -- #### merge()\n// -- Returns a new object built as follows: the overlapping keys from the\n// -- second one overwrite the corresponding entries from the first one.\n// -- Similar to `Object.assign()`, but immutable.\n// --\n// -- Usage:\n// --\n// -- * `merge(obj1, obj2)`\n// -- * `merge(obj1, ...objects)`\n// --\n// -- The unmodified `obj1` is returned if `obj2` does not *provide something\n// -- new to* `obj1`, i.e. if either of the following\n// -- conditions are true:\n// --\n// -- * `obj2` is `null` or `undefined`\n// -- * `obj2` is an object, but it is empty\n// -- * All attributes of `obj2` are `undefined`\n// -- * All attributes of `obj2` are referentially equal to the\n// -- corresponding attributes of `obj1`\n// --\n// -- Note that `undefined` attributes in `obj2` do not modify the\n// -- corresponding attributes in `obj1`.\n// --\n// -- ```js\n// -- obj1 = { a: 1, b: 2, c: 3 }\n// -- obj2 = { c: 4, d: 5 }\n// -- obj3 = merge(obj1, obj2)\n// -- // { a: 1, b: 2, c: 4, d: 5 }\n// -- obj3 === obj1\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- merge(obj1, { c: 3 }) === obj1\n// -- // true\n// -- ```\n// Signatures:\n// - 1 arg\n\n\n// Implementation\nfunction merge(a, b, c, d, e, f, ...rest) {\n return rest.length ? doMerge.call(null, false, false, a, b, c, d, e, f, ...rest) : doMerge(false, false, a, b, c, d, e, f);\n} // -- #### mergeDeep()\n// -- Returns a new object built as follows: the overlapping keys from the\n// -- second one overwrite the corresponding entries from the first one.\n// -- If both the first and second entries are objects they are merged recursively.\n// -- Similar to `Object.assign()`, but immutable, and deeply merging.\n// --\n// -- Usage:\n// --\n// -- * `mergeDeep(obj1, obj2)`\n// -- * `mergeDeep(obj1, ...objects)`\n// --\n// -- The unmodified `obj1` is returned if `obj2` does not *provide something\n// -- new to* `obj1`, i.e. if either of the following\n// -- conditions are true:\n// --\n// -- * `obj2` is `null` or `undefined`\n// -- * `obj2` is an object, but it is empty\n// -- * All attributes of `obj2` are `undefined`\n// -- * All attributes of `obj2` are referentially equal to the\n// -- corresponding attributes of `obj1`\n// --\n// -- Note that `undefined` attributes in `obj2` do not modify the\n// -- corresponding attributes in `obj1`.\n// --\n// -- ```js\n// -- obj1 = { a: 1, b: 2, c: { a: 1 } }\n// -- obj2 = { b: 3, c: { b: 2 } }\n// -- obj3 = mergeDeep(obj1, obj2)\n// -- // { a: 1, b: 3, c: { a: 1, b: 2 } }\n// -- obj3 === obj1\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- mergeDeep(obj1, { c: { a: 1 } }) === obj1\n// -- // true\n// -- ```\n\n\nfunction mergeDeep(a, b, c, d, e, f, ...rest) {\n return rest.length ? doMerge.call(null, false, true, a, b, c, d, e, f, ...rest) : doMerge(false, true, a, b, c, d, e, f);\n} // -- #### mergeIn()\n// -- Similar to `merge()`, but merging the value at a given nested path.\n// --\n// -- Usage examples:\n// --\n// -- * `mergeIn(obj1, path, obj2)`\n// -- * `mergeIn(obj1, path, ...objects)`\n// --\n// -- ```js\n// -- obj1 = { a: 1, d: { b: { d1: 3, d2: 4 } } }\n// -- obj2 = { d3: 5 }\n// -- obj3 = mergeIn(obj1, ['d', 'b'], obj2)\n// -- // { a: 1, d: { b: { d1: 3, d2: 4, d3: 5 } } }\n// -- obj3 === obj1\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- mergeIn(obj1, ['d', 'b'], { d2: 4 }) === obj1\n// -- // true\n// -- ```\n\n\nfunction mergeIn(a, path, b, c, d, e, f, ...rest) {\n let prevVal = getIn(a, path);\n if (prevVal == null) prevVal = {};\n let nextVal;\n\n if (rest.length) {\n nextVal = doMerge.call(null, false, false, prevVal, b, c, d, e, f, ...rest);\n } else {\n nextVal = doMerge(false, false, prevVal, b, c, d, e, f);\n }\n\n return setIn(a, path, nextVal);\n} // -- #### omit()\n// -- Returns an object excluding one or several attributes.\n// --\n// -- Usage: `omit(obj, attrs)`\n//\n// -- ```js\n// -- obj = { a: 1, b: 2, c: 3, d: 4 }\n// -- omit(obj, 'a')\n// -- // { b: 2, c: 3, d: 4 }\n// -- omit(obj, ['b', 'c'])\n// -- // { a: 1, d: 4 }\n// --\n// -- // The same object is returned if there are no changes:\n// -- omit(obj, 'z') === obj1\n// -- // true\n// -- ```\n\n\nfunction omit(obj, attrs) {\n const omitList = Array.isArray(attrs) ? attrs : [attrs];\n let fDoSomething = false;\n\n for (let i = 0; i < omitList.length; i++) {\n if (hasOwnProperty.call(obj, omitList[i])) {\n fDoSomething = true;\n break;\n }\n }\n\n if (!fDoSomething) return obj;\n const out = {};\n const keys = getKeysAndSymbols(obj);\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (omitList.indexOf(key) >= 0) continue;\n out[key] = obj[key];\n }\n\n return out;\n} // -- #### addDefaults()\n// -- Returns a new object built as follows: `undefined` keys in the first one\n// -- are filled in with the corresponding values from the second one\n// -- (even if they are `null`).\n// --\n// -- Usage:\n// --\n// -- * `addDefaults(obj, defaults)`\n// -- * `addDefaults(obj, ...defaultObjects)`\n// --\n// -- ```js\n// -- obj1 = { a: 1, b: 2, c: 3 }\n// -- obj2 = { c: 4, d: 5, e: null }\n// -- obj3 = addDefaults(obj1, obj2)\n// -- // { a: 1, b: 2, c: 3, d: 5, e: null }\n// -- obj3 === obj1\n// -- // false\n// --\n// -- // The same object is returned if there are no changes:\n// -- addDefaults(obj1, { c: 4 }) === obj1\n// -- // true\n// -- ```\n// Signatures:\n// - 2 args\n\n\n// Implementation and catch-all\nfunction addDefaults(a, b, c, d, e, f, ...rest) {\n return rest.length ? doMerge.call(null, true, false, a, b, c, d, e, f, ...rest) : doMerge(true, false, a, b, c, d, e, f);\n}\n\nfunction doMerge(fAddDefaults, fDeep, first, ...rest) {\n let out = first;\n\n if (!(out != null)) {\n throwStr(IS_DEV ? 'At least one object should be provided to merge()' : INVALID_ARGS);\n }\n\n let fChanged = false;\n\n for (let idx = 0; idx < rest.length; idx++) {\n const obj = rest[idx];\n if (obj == null) continue;\n const keys = getKeysAndSymbols(obj);\n if (!keys.length) continue;\n\n for (let j = 0; j <= keys.length; j++) {\n const key = keys[j];\n if (fAddDefaults && out[key] !== undefined) continue;\n let nextVal = obj[key];\n\n if (fDeep && isObject(out[key]) && isObject(nextVal)) {\n nextVal = doMerge(fAddDefaults, fDeep, out[key], nextVal);\n }\n\n if (nextVal === undefined || nextVal === out[key]) continue;\n\n if (!fChanged) {\n fChanged = true;\n out = clone(out);\n }\n\n out[key] = nextVal;\n }\n }\n\n return out;\n} // ===============================================\n// ### Public API\n// ===============================================\n\n\nconst timm = {\n clone,\n addLast,\n addFirst,\n removeLast,\n removeFirst,\n insert,\n removeAt,\n replaceAt,\n getIn,\n set,\n setIn,\n update,\n updateIn,\n merge,\n mergeDeep,\n mergeIn,\n omit,\n addDefaults\n};\nvar _default = timm;\nexports.default = _default;","'use strict';\n\nconst pDefer = () => {\n\tconst deferred = {};\n\n\tdeferred.promise = new Promise((resolve, reject) => {\n\t\tdeferred.resolve = resolve;\n\t\tdeferred.reject = reject;\n\t});\n\n\treturn deferred;\n};\n\nmodule.exports = pDefer;\n","/*! queue-microtask. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\nlet promise\n\nmodule.exports = typeof queueMicrotask === 'function'\n ? queueMicrotask.bind(typeof window !== 'undefined' ? window : global)\n // reuse resolved promise, and allocate it lazily\n : cb => (promise || (promise = Promise.resolve()))\n .then(cb)\n .catch(err => setTimeout(() => { throw err }, 0))\n","var SortedArray = (function () {\n var SortedArray = defclass({\n\n constructor: function (array, compare) {\n this.array = [];\n this.compare = compare || compareDefault;\n var length = array.length,\n index = 0;\n while (index < length) this.insert(array[index++]);\n },\n insert: function (element) {\n var array = this.array,\n compare = this.compare,\n high = array.length-1,\n low = 0,\n pos = -1,\n index,\n ordering;\n\n // The array is sorted. You must find the position of new element in O(log(n)), not O(n).\n while (high >= low) {\n index = (high + low) / 2 >>> 0;\n ordering = compare(array[index], element); \n if (ordering < 0) low = index + 1;\n else if (ordering > 0) high = index - 1;\n else {\n pos = index;\n break;\n };\n }\n\n if (pos === -1) {\n // if element was not found, high < low.\n pos = high;\n }\n // This assures that equal elements inserted after will be in a higher position in array.\n // They can be equal for comparison purposes, but different objects with different data.\n // Respecting the chronological order can be important for many applications.\n pos++;\n high = array.length-1;\n while ((pos < high) && (compare(element, array[pos]) === 0)){\n pos++;\n }\n index = array.length;\n // Just to increase array size.\n array.push(element); \n // Much faster. No need to elements swap.\n while (index > pos) {\n array[index] = array[--index];\n }\n // Set the new element on its correct position.\n array[pos] = element;\n\n return this;\n },\n search: function (element) {\n var array = this.array,\n compare = this.compare,\n high = array.length-1,\n low = 0,\n // In most languages, inner variable declaration makes the code slower.\n index,\n ordering;\n\n while (high >= low) {\n index = (high + low) / 2 >>> 0;\n ordering = compare(array[index], element);\n\n if (ordering < 0) low = index + 1;\n else if (ordering > 0) high = index - 1;\n else return index;\n }\n\n return -1;\n },\n remove: function (element) {\n var index = this.search(element);\n if (index >= 0) this.array.splice(index, 1);\n return this;\n }\n });\n\n SortedArray.comparing = function (property, array) {\n return new SortedArray(array, function (a, b) {\n // This should be faster than calling functions.\n // Besides, this way it is not needed to create useless function to return property value.\n return compareDefault(a[property], b[property]);\n });\n };\n\n return SortedArray;\n\n function defclass(prototype) {\n var constructor = prototype.constructor;\n constructor.prototype = prototype;\n return constructor;\n }\n\n function compareDefault(a, b) {\n // Equality has a very low chance to happen. It should be the last option.\n if (a < b)\n return -1;\n else if (a > b)\n return 1;\n else\n return 0;\n }\n}());\n\nif (typeof module === \"object\") module.exports = SortedArray;\nif (typeof define === \"function\" && define.amd)\n define(function () { return SortedArray; });\n","import type { Player, PlayerPlugin } from \"@player-ui/player\";\nimport { resolveDataRefsInString, NodeType } from \"@player-ui/player\";\nimport type { Mappers } from \"./types\";\nimport { parseAssetMarkdownContent } from \"./utils\";\n\nexport * from \"./types\";\n\n/**\n * A plugin that parses markdown written into text assets using the given converters for markdown features into existing assets.\n */\nexport class MarkdownPlugin implements PlayerPlugin {\n name = \"MarkdownPlugin\";\n\n private mappers: Mappers;\n\n constructor(mappers: Mappers) {\n this.mappers = mappers;\n }\n\n apply(player: Player) {\n player.hooks.view.tap(this.name, (view) => {\n view.hooks.resolver.tap(this.name, (resolver) => {\n resolver.hooks.beforeResolve.tap(this.name, (node, options) => {\n if (node?.type === NodeType.Asset && node.value.type === \"markdown\") {\n const resolvedContent = resolveDataRefsInString(\n node.value.value as string,\n {\n evaluate: options.evaluate,\n model: options.data.model,\n },\n );\n\n const parsed = parseAssetMarkdownContent({\n asset: {\n ...node.value,\n value: resolvedContent,\n },\n mappers: this.mappers,\n parser: options.parseNode,\n });\n\n return parsed;\n }\n\n return node;\n });\n });\n });\n }\n}\n","/**\n * Checks if `value` is equal to `check` if `check` is a string or in `check` if check is an Array\n *\n * @param value - the value being searched for\n * @param check - the values to check against\n * @returns `boolean`\n */\nexport function equalToOrIn(value: string, check: string | Array<string>) {\n if (Array.isArray(check)) {\n return check.includes(value);\n }\n\n return check === value;\n}\n","import { equalToOrIn } from \"./utils\";\n\nexport type Interceptor<Args extends any[], ReturnType, ContextType> = {\n /** An optional name for the interceptor */\n name?: string;\n /** Callback for each loop when used by the hook */\n loop?: (...args: Args) => void;\n /** Callback when an error occurs during the hook's call */\n error?: (err: Error) => void;\n /** Callback when a result is found for a hook's invocation */\n result?: (\n r: ReturnType extends Promise<infer AwaitedValue>\n ? AwaitedValue\n : ReturnType\n ) => void;\n /** Callback when a hook's call is complete */\n done?: () => void;\n /** Callback when a hook is tapped */\n tap?: (tap: Tap<Args, ReturnType, ContextType>) => void;\n} & (\n | {\n /** If context should be omitted from the 'call'. This is the default */\n context?: false;\n /** Callback when the hook is tapped without context */\n call?: (...args: Args) => void;\n }\n | {\n /** If context should be included in the 'call' */\n context: true;\n /** Callback when the hook is tapped with context */\n call?: (context: ContextType, ...args: Args) => void;\n }\n);\n\nexport type Tap<Args extends any[], ReturnType, ContextType = unknown> = {\n key: symbol;\n name: string;\n before?: string | Array<string>;\n} & (\n | {\n context: false;\n callback: (...args: Args) => ReturnType;\n }\n | {\n context: true;\n callback: (context: ContextType, ...args: Args) => ReturnType;\n }\n);\n\ntype BasicTap<Args extends any[], ReturnType, ContextType> = (\n name: string,\n callback: (...args: Args) => ReturnType,\n before?: string | Array<string>\n) => Tap<Args, ReturnType, ContextType>;\n\ntype TapWithContext<Args extends any[], ReturnType, ContextType> =\n | ((\n options: {\n name: string;\n context?: false;\n before?: string | Array<string>;\n },\n callback: (...args: Args) => ReturnType\n ) => Tap<Args, ReturnType>)\n | ((\n options: {\n name: string;\n context: true;\n before?: string | Array<string>;\n },\n callback: (context: ContextType, ...args: Args) => ReturnType\n ) => Tap<Args, ReturnType>);\n\ninterface SyncBaseHookType<Args extends any[], ReturnType, ContextType> {\n tap:\n | BasicTap<Args, ReturnType, ContextType>\n | TapWithContext<Args, ReturnType, ContextType>;\n call(...args: Args): void;\n untap(key: Tap<Args, ReturnType>): void;\n isUsed(): boolean;\n intercept(int: Interceptor<Args, ReturnType, ContextType>): void;\n}\n\nfunction callTap<Args extends any[], ReturnType, ContextType>(\n tap: Tap<Args, ReturnType, ContextType>,\n args: Args,\n ctx: ContextType\n) {\n if (tap.context) {\n return tap.callback(ctx, ...args);\n }\n\n return tap.callback(...args);\n}\n\n/** A manager for all intercepts inside of a tap */\nclass InterceptionManager<\n Args extends any[],\n ReturnType,\n ContextType = Record<string, any>\n> {\n protected interceptions: Array<Interceptor<Args, ReturnType, ContextType>>;\n private interceptionKeySet: Set<\n keyof Interceptor<Args, ReturnType, ContextType>\n >;\n\n constructor() {\n this.interceptions = [];\n this.interceptionKeySet = new Set();\n }\n\n isUsed() {\n return this.interceptions.length > 0;\n }\n\n intercept(int: Interceptor<Args, ReturnType, ContextType>): void {\n this.interceptions.push(int);\n Object.keys(int).forEach((s) => {\n this.interceptionKeySet.add(s as any);\n });\n }\n\n tap(tap: Tap<Args, ReturnType, ContextType>): void {\n if (this.interceptionKeySet.has(\"tap\")) {\n this.interceptions.forEach((i) => {\n i.tap?.(tap);\n });\n }\n }\n\n call(ctx: ContextType, ...args: Args): void {\n if (this.interceptionKeySet.has(\"call\")) {\n this.interceptions.forEach((i) => {\n if (i.context) {\n i.call?.(ctx, ...args);\n } else {\n i.call?.(...args);\n }\n });\n }\n }\n\n loop(...args: Args): void {\n if (this.interceptionKeySet.has(\"loop\")) {\n this.interceptions.forEach((i) => {\n i.loop?.(...args);\n });\n }\n }\n\n error(err: unknown): void {\n if (this.interceptionKeySet.has(\"error\")) {\n if (err instanceof Error) {\n const asError: Error = err;\n this.interceptions.forEach((i) => {\n i.error?.(asError);\n });\n }\n }\n }\n\n result(\n r: ReturnType extends Promise<infer AwaitedValue>\n ? AwaitedValue\n : ReturnType\n ): void {\n if (this.interceptionKeySet.has(\"result\")) {\n this.interceptions.forEach((i) => {\n i.result?.(r);\n });\n }\n }\n\n done(): void {\n if (this.interceptionKeySet.has(\"done\")) {\n this.interceptions.forEach((i) => {\n i.done?.();\n });\n }\n }\n}\n\nabstract class Hook<\n Args extends any[],\n ReturnType,\n ContextType = Record<string, any>\n> implements SyncBaseHookType<Args, ReturnType, ContextType>\n{\n protected taps: Array<Tap<Args, ReturnType, ContextType>>;\n protected interceptions: InterceptionManager<Args, ReturnType, ContextType>;\n\n constructor() {\n this.taps = [];\n this.interceptions = new InterceptionManager<\n Args,\n ReturnType,\n ContextType\n >();\n }\n\n public tap(\n options: { name: string; context?: false; before?: string | Array<string> },\n callback: (...args: Args) => ReturnType\n ): Tap<Args, ReturnType, ContextType>;\n\n public tap(\n options: { name: string; context: true; before?: string | Array<string> },\n callback: (ctx: ContextType, ...args: Args) => ReturnType\n ): Tap<Args, ReturnType, ContextType>;\n\n public tap(\n name: string,\n callback: (...args: Args) => ReturnType\n ): Tap<Args, ReturnType, ContextType>;\n\n public tap(options: any, callback: any): Tap<Args, ReturnType, ContextType> {\n const resolvedOptions =\n typeof options === \"string\"\n ? {\n name: options,\n context: false,\n }\n : {\n context: false,\n ...options,\n };\n\n const key = Symbol(resolvedOptions.name);\n const tap: Tap<Args, ReturnType, ContextType> = {\n key,\n ...resolvedOptions,\n callback,\n };\n\n if (tap.before) {\n let insertionIndex = this.taps.length;\n const beforeSet = new Set(\n Array.isArray(tap.before) ? tap.before : [tap.before]\n );\n for (\n insertionIndex;\n insertionIndex > 0 && beforeSet.size > 0;\n insertionIndex--\n ) {\n const t = this.taps[insertionIndex - 1];\n if (beforeSet.has(t.name)) {\n beforeSet.delete(t.name);\n }\n\n if (t.before && equalToOrIn(tap.name, t.before)) {\n break;\n }\n }\n\n this.taps.splice(insertionIndex, 0, tap);\n } else {\n this.taps.push(tap);\n }\n\n this.interceptions.tap(tap);\n\n return tap;\n }\n\n abstract call(...args: Args): ReturnType;\n\n public untap(tap: Tap<Args, ReturnType, ContextType>) {\n this.taps = this.taps.filter((t) => t.key !== tap.key);\n }\n\n public isUsed() {\n return this.taps.length > 0 || this.interceptions.isUsed();\n }\n\n public intercept(int: Interceptor<Args, ReturnType, ContextType>): void {\n this.interceptions.intercept(int);\n }\n}\n\nexport class SyncHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, void, ContextType> {\n public call(...args: Args) {\n if (!this.isUsed()) {\n return;\n }\n\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n this.taps.forEach((t) => {\n callTap(t, args, ctx);\n });\n } catch (err: unknown) {\n this.interceptions.error(err);\n\n throw err;\n }\n\n this.interceptions.done();\n }\n}\n\nexport class SyncBailHook<\n Args extends any[],\n ReturnType,\n ContextType = Record<string, any>\n> extends Hook<Args, ReturnType | undefined | null, ContextType> {\n public call(...args: Args): ReturnType | undefined | null {\n if (!this.isUsed()) {\n return;\n }\n\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n const rtn = callTap(this.taps[tapIndex], args, ctx);\n if (rtn !== undefined) {\n this.interceptions.result(rtn as any);\n return rtn;\n }\n }\n\n this.interceptions.done();\n }\n}\n\nexport class SyncWaterfallHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, Args[0], ContextType> {\n public call(...args: Args): Args[0] {\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n // eslint-disable-next-line prefer-const\n let [rtn, ...rest] = args;\n\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n const tapValue = callTap(this.taps[tapIndex], [rtn, ...rest] as any, ctx);\n if (tapValue !== undefined) {\n rtn = tapValue;\n }\n }\n\n this.interceptions.result(rtn);\n\n return rtn;\n }\n}\n\nexport class SyncLoopHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, void, ContextType> {\n public call(...args: Args) {\n let finished = false;\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n while (finished !== true) {\n finished = true;\n this.interceptions.loop(...args);\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n const rtn = callTap(this.taps[tapIndex], args, ctx);\n\n if (rtn !== undefined) {\n finished = false;\n break;\n }\n }\n }\n } catch (e: unknown) {\n this.interceptions.error(e);\n throw e;\n }\n\n this.interceptions.done();\n }\n}\n\nexport class AsyncParallelHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, Promise<void>, ContextType> {\n public async call(...args: Args): Promise<void> {\n const ctx: ContextType = {} as any;\n this.interceptions.call(ctx, ...args);\n\n await Promise.allSettled(this.taps.map((tap) => callTap(tap, args, ctx)));\n this.interceptions.done();\n }\n}\n\nexport class AsyncParallelBailHook<\n Args extends any[],\n ReturnType,\n ContextType = Record<string, any>\n> extends Hook<Args, Promise<ReturnType>, ContextType> {\n public async call(...args: Args): Promise<ReturnType> {\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n const rtn = await Promise.race(\n this.taps.map((tap) => callTap(tap, args, ctx))\n );\n\n this.interceptions.result(rtn as any);\n return rtn;\n } catch (e: unknown) {\n this.interceptions.error(e);\n throw e;\n }\n }\n}\n\nexport class AsyncSeriesHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, Promise<void>, ContextType> {\n public async call(...args: Args): Promise<void> {\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n await callTap(this.taps[tapIndex], args, ctx);\n }\n } catch (e: unknown) {\n this.interceptions.error(e);\n throw e;\n }\n\n this.interceptions.done();\n }\n}\n\nexport class AsyncSeriesBailHook<\n Args extends any[],\n ReturnType,\n ContextType = Record<string, any>\n> extends Hook<Args, Promise<ReturnType | undefined | null>, ContextType> {\n public async call(...args: Args): Promise<ReturnType | undefined | null> {\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n const rtn = await callTap(this.taps[tapIndex], args, ctx);\n if (rtn !== undefined) {\n this.interceptions.result(rtn);\n return rtn;\n }\n }\n } catch (e: unknown) {\n this.interceptions.error(e);\n throw e;\n }\n\n this.interceptions.done();\n }\n}\n\nexport class AsyncSeriesWaterfallHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, Promise<Args[0]>, ContextType> {\n public async call(...args: Args): Promise<Args[0]> {\n // eslint-disable-next-line prefer-const\n let [rtn, ...rest] = args;\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n const tapValue = await callTap(\n this.taps[tapIndex],\n [rtn, ...rest] as any,\n ctx\n );\n if (tapValue !== undefined) {\n rtn = tapValue;\n }\n }\n } catch (e: unknown) {\n this.interceptions.error(e);\n throw e;\n }\n\n this.interceptions.result(rtn);\n\n return rtn;\n }\n}\n\nexport class AsyncSeriesLoopHook<\n Args extends any[],\n ContextType = Record<string, any>\n> extends Hook<Args, Promise<void>, ContextType> {\n public async call(...args: Args): Promise<void> {\n let finished = false;\n const ctx: ContextType = {} as any;\n\n this.interceptions.call(ctx, ...args);\n\n try {\n while (finished !== true) {\n finished = true;\n this.interceptions.loop(...args);\n for (let tapIndex = 0; tapIndex < this.taps.length; tapIndex += 1) {\n const rtn = await callTap(this.taps[tapIndex], args, ctx);\n\n if (rtn !== undefined) {\n finished = false;\n break;\n }\n }\n }\n } catch (e: unknown) {\n this.interceptions.error(e);\n throw e;\n }\n\n this.interceptions.done();\n }\n}\n","import { SyncBailHook, SyncWaterfallHook } from \"tapable-ts\";\nimport { NestedError } from \"ts-nested-error\";\nimport type { ParserResult, AnyNode } from \"../binding-grammar/index\";\nimport {\n // We can swap this with whichever parser we want to use\n parseCustom as parseBinding,\n} from \"../binding-grammar\";\nimport type { BindingParserOptions, BindingLike } from \"./binding\";\nimport { BindingInstance } from \"./binding\";\nimport { isBinding } from \"./utils\";\nimport type { NormalizedResult, ResolveBindingASTOptions } from \"./resolver\";\nimport { resolveBindingAST } from \"./resolver\";\n\nexport * from \"./utils\";\nexport * from \"./binding\";\n\nexport const SIMPLE_BINDING_REGEX = /^[\\w\\-@]+(\\.[\\w\\-@]+)*$/;\nexport const BINDING_BRACKETS_REGEX = /[\\s()*=`{}'\"[\\]]/;\nconst LAZY_BINDING_REGEX = /^[^.]+(\\..+)*$/;\n\nconst DEFAULT_OPTIONS: BindingParserOptions = {\n get: () => {\n throw new Error(\"Not Implemented\");\n },\n set: () => {\n throw new Error(\"Not Implemented\");\n },\n evaluate: () => {\n throw new Error(\"Not Implemented\");\n },\n};\n\ntype BeforeResolveNodeContext = Required<NormalizedResult> &\n ResolveBindingASTOptions;\n\n/** A parser for creating bindings from a string */\nexport class BindingParser {\n private cache: Record<string, BindingInstance>;\n private parseCache: Record<string, ParserResult>;\n private parserOptions: BindingParserOptions;\n\n public hooks = {\n skipOptimization: new SyncBailHook<[string], boolean>(),\n beforeResolveNode: new SyncWaterfallHook<\n [AnyNode, BeforeResolveNodeContext]\n >(),\n };\n\n constructor(options?: Partial<BindingParserOptions>) {\n this.parserOptions = { ...DEFAULT_OPTIONS, ...options };\n this.cache = {};\n this.parseCache = {};\n this.parse = this.parse.bind(this);\n }\n\n /**\n * Takes a binding path, parses it, and returns an equivalent, normalized\n * representation of that path.\n */\n private normalizePath(\n path: string,\n resolveOptions: ResolveBindingASTOptions,\n ) {\n /**\n * Ensure no binding characters exist in path and the characters remaining\n * look like a binding format.\n */\n if (\n !BINDING_BRACKETS_REGEX.test(path) &&\n LAZY_BINDING_REGEX.test(path) &&\n this.hooks.skipOptimization.call(path) !== true\n ) {\n return { path: path.split(\".\"), updates: undefined } as NormalizedResult;\n }\n\n const ast = this.parseCache[path] ?? parseBinding(path);\n this.parseCache[path] = ast;\n\n if (typeof ast !== \"object\" || !ast?.status) {\n throw new TypeError(\n `Cannot normalize path \"${path}\": ${ast?.error ?? \"Unknown Error.\"}`,\n );\n }\n\n try {\n return resolveBindingAST(ast.path, resolveOptions, this.hooks);\n } catch (e: any) {\n throw new NestedError(`Cannot resolve binding: ${path}`, e);\n }\n }\n\n private getBindingForNormalizedResult(\n normalized: NormalizedResult,\n ): BindingInstance {\n const normalizedStr = normalized.path.join(\".\");\n\n if (this.cache[normalizedStr]) {\n return this.cache[normalizedStr];\n }\n\n const created = new BindingInstance(\n normalizedStr === \"\" ? [] : normalized.path,\n this.parse,\n );\n this.cache[normalizedStr] = created;\n\n return created;\n }\n\n public parse(\n rawBinding: BindingLike,\n overrides: Partial<BindingParserOptions> = {},\n ): BindingInstance {\n if (isBinding(rawBinding)) {\n return rawBinding;\n }\n\n const options = {\n ...this.parserOptions,\n ...overrides,\n };\n\n let updates: Record<string, any> = {};\n\n const joined = Array.isArray(rawBinding)\n ? rawBinding.join(\".\")\n : String(rawBinding);\n\n const normalizeConfig: ResolveBindingASTOptions = {\n getValue: (path: Array<string | number>) => {\n const normalized = this.normalizePath(path.join(\".\"), normalizeConfig);\n\n return options.get(this.getBindingForNormalizedResult(normalized));\n },\n evaluate: (exp) => {\n return options.evaluate(exp);\n },\n convertToPath: (path: any) => {\n if (path === undefined) {\n throw new Error(\n \"Attempted to convert undefined value to binding path\",\n );\n }\n\n if (\n typeof path !== \"string\" &&\n typeof path !== \"number\" &&\n typeof path !== \"boolean\"\n ) {\n throw new Error(\n `Attempting to convert ${typeof path} to a binding path.`,\n );\n }\n\n const normalized = this.normalizePath(String(path), normalizeConfig);\n\n if (normalized.updates) {\n updates = {\n ...updates,\n ...normalized.updates,\n };\n }\n\n const joinedNormalizedPath = normalized.path.join(\".\");\n\n if (joinedNormalizedPath === \"\") {\n throw new Error(\"Nested path resolved to an empty path\");\n }\n\n return joinedNormalizedPath;\n },\n };\n\n const normalized = this.normalizePath(joined, normalizeConfig);\n\n if (normalized.updates) {\n updates = {\n ...updates,\n ...normalized.updates,\n };\n }\n\n const updateKeys = Object.keys(updates);\n\n if (!options.readOnly && updateKeys.length > 0) {\n const updateTransaction = updateKeys.map<[BindingInstance, any]>(\n (updatedBinding) => [\n this.parse(updatedBinding),\n updates[updatedBinding],\n ],\n );\n\n options.set(updateTransaction);\n }\n\n return this.getBindingForNormalizedResult(normalized);\n }\n}\n","import { NestedError } from \"ts-nested-error\";\nimport type { SyncWaterfallHook } from \"tapable-ts\";\nimport type { PathNode, AnyNode } from \"../binding-grammar\";\nimport { findInArray, maybeConvertToNum } from \"./utils\";\n\nexport interface NormalizedResult {\n /** The normalized path */\n path: Array<string | number>;\n\n /** Any new updates that need to happen for this binding to be resolved */\n updates?: Record<string, any>;\n}\n\nexport interface ResolveBindingASTOptions {\n /** Get the value of the model at the given path */\n getValue: (path: Array<string | number>) => any;\n\n /** Convert the value into valid path segments */\n convertToPath: (value: any) => string;\n\n /** Convert the value into valid path segments */\n evaluate: (exp: string) => any;\n}\n\nexport interface ResolveBindingASTHooks {\n /** A hook for transforming a node before fully resolving it */\n beforeResolveNode: SyncWaterfallHook<\n [AnyNode, Required<NormalizedResult> & ResolveBindingASTOptions]\n >;\n}\n\n/** Given a binding AST, resolve it */\nexport function resolveBindingAST(\n bindingPathNode: PathNode,\n options: ResolveBindingASTOptions,\n hooks?: ResolveBindingASTHooks,\n): NormalizedResult {\n const context: Required<NormalizedResult> = {\n updates: {},\n path: [],\n };\n\n // let updates: Record<string, any> = {};\n // const path: Array<string | number> = [];\n\n /** Get the value for any child node */\n function getValueForNode(node: AnyNode): any {\n if (node.name === \"Value\") {\n return node.value;\n }\n\n if (node.name === \"PathNode\") {\n const nestedResolvedValue = resolveBindingAST(node, options);\n\n if (nestedResolvedValue.updates) {\n context.updates = {\n ...context.updates,\n ...nestedResolvedValue.updates,\n };\n }\n\n try {\n return options.convertToPath(\n options.getValue(nestedResolvedValue.path),\n );\n } catch (e: any) {\n throw new NestedError(\n `Unable to resolve path segment: ${nestedResolvedValue.path}`,\n e,\n );\n }\n }\n\n if (node.name === \"Expression\") {\n try {\n const actualValue = options.evaluate(node.value);\n\n return options.convertToPath(actualValue);\n } catch (e: any) {\n throw new NestedError(`Unable to resolve path: ${node.value}`, e);\n }\n }\n\n throw new Error(`Unable to resolve value for node: ${node.name}`);\n }\n\n /** Handle when path segments are binding paths (foo.bar) or single segments (foo) */\n function appendPathSegments(segment: string | number) {\n if (typeof segment === \"string\" && segment.indexOf(\".\") > -1) {\n segment.split(\".\").forEach((i) => {\n context.path.push(maybeConvertToNum(i));\n });\n } else {\n context.path.push(segment);\n }\n }\n\n /** Compute the _actual_ binding val from the AST */\n function resolveNode(_node: AnyNode) {\n const resolvedNode =\n hooks?.beforeResolveNode.call(_node, { ...context, ...options }) ?? _node;\n\n switch (resolvedNode.name) {\n case \"Expression\":\n case \"PathNode\":\n appendPathSegments(getValueForNode(resolvedNode));\n break;\n\n case \"Value\":\n appendPathSegments(resolvedNode.value);\n break;\n\n case \"Query\": {\n // Look for an object at the path with the given key/val criteria\n const objToQuery: Record<string, any>[] =\n options.getValue(context.path) ?? [];\n\n const { key, value } = resolvedNode;\n\n const resolvedKey = getValueForNode(key);\n const resolvedValue = value && getValueForNode(value);\n\n const index = findInArray(objToQuery, resolvedKey, resolvedValue);\n\n if (index === undefined || index === -1) {\n context.updates[\n [...context.path, objToQuery.length, resolvedKey].join(\".\")\n ] = resolvedValue;\n context.path.push(objToQuery.length);\n } else {\n context.path.push(index);\n }\n\n break;\n }\n\n case \"Concatenated\":\n context.path.push(resolvedNode.value.map(getValueForNode).join(\"\"));\n break;\n\n default:\n throw new Error(`Unsupported node type: ${(resolvedNode as any).name}`);\n }\n }\n\n bindingPathNode.path.forEach(resolveNode);\n\n return {\n path: context.path,\n updates:\n Object.keys(context.updates ?? {}).length > 0\n ? context.updates\n : undefined,\n };\n}\n","export default function dlv(obj, key, def, p, undef) {\n\tkey = key.split ? key.split('.') : key;\n\tfor (p = 0; p < key.length; p++) {\n\t\tobj = obj ? obj[key[p]] : undef;\n\t}\n\treturn obj === undef ? def : obj;\n}\n","import get from \"dlv\";\nimport { setIn, omit, removeAt } from \"timm\";\nimport type { BindingInstance } from \"../binding\";\nimport type { BatchSetTransaction, DataModelImpl, Updates } from \"./model\";\n\n/**\n * A data model that stores data in an in-memory JS object\n */\nexport class LocalModel implements DataModelImpl {\n public model: {\n [key: string]: any;\n };\n\n constructor(model = {}) {\n this.model = model;\n this.get = this.get.bind(this);\n this.set = this.set.bind(this);\n }\n\n public reset(model = {}) {\n this.model = model;\n }\n\n public get(binding?: BindingInstance) {\n if (!binding || !binding.asString()) {\n return this.model;\n }\n\n return get(this.model, binding.asArray() as string[]);\n }\n\n public set(transaction: BatchSetTransaction) {\n const effectiveOperations: Updates = [];\n transaction.forEach(([binding, value]) => {\n const oldValue = this.get(binding);\n this.model = setIn(this.model, binding.asArray(), value) as any;\n effectiveOperations.push({ binding, oldValue, newValue: value });\n });\n return effectiveOperations;\n }\n\n public delete(binding: BindingInstance) {\n const parentBinding = binding.parent();\n\n if (parentBinding) {\n const parentValue = this.get(parentBinding);\n\n if (parentValue !== undefined) {\n if (Array.isArray(parentValue)) {\n this.model = setIn(\n this.model,\n parentBinding.asArray(),\n removeAt(parentValue, binding.key() as number),\n ) as any;\n } else {\n this.model = setIn(\n this.model,\n parentBinding.asArray(),\n omit(parentValue, binding.key() as string),\n ) as any;\n }\n }\n }\n }\n}\n","import { SyncWaterfallHook, SyncBailHook } from \"tapable-ts\";\nimport { NestedError } from \"ts-nested-error\";\nimport { parseExpression } from \"./parser\";\nimport * as DEFAULT_EXPRESSION_HANDLERS from \"./evaluator-functions\";\nimport { isExpressionNode } from \"./types\";\nimport { isObjectExpression } from \"./utils\";\nimport type {\n ExpressionNode,\n BinaryOperator,\n UnaryOperator,\n ExpressionType,\n ExpressionContext,\n ExpressionHandler,\n} from \"./types\";\n\n/** a && b -- but handles short cutting if the first value is false */\nconst andandOperator: BinaryOperator = (ctx, a, b) => {\n return ctx.evaluate(a) && ctx.evaluate(b);\n};\n\nandandOperator.resolveParams = false;\n\n/** a || b -- but with short cutting if first value is true */\nconst ororOperator: BinaryOperator = (ctx, a, b) => {\n return ctx.evaluate(a) || ctx.evaluate(b);\n};\n\nororOperator.resolveParams = false;\n\nconst DEFAULT_BINARY_OPERATORS: Record<string, BinaryOperator> = {\n // TODO: A lot of these functions used to do type coercion. Not sure if we want to keep that behavior or not.\n \"+\": (a: any, b: any) => a + b,\n \"-\": (a: any, b: any) => a - b,\n \"*\": (a: any, b: any) => a * b,\n \"/\": (a: any, b: any) => a / b,\n \"%\": (a: any, b: any) => a % b,\n\n // eslint-disable-next-line\n \"==\": (a: any, b: any) => a == b,\n\n // eslint-disable-next-line\n \"!=\": (a: any, b: any) => a != b,\n \">\": (a: any, b: any) => a > b,\n \">=\": (a: any, b: any) => a >= b,\n \"<\": (a: any, b: any) => a < b,\n \"<=\": (a: any, b: any) => a <= b,\n \"&&\": andandOperator,\n \"||\": ororOperator,\n \"!==\": (a: any, b: any) => a !== b,\n \"===\": (a: any, b: any) => a === b,\n\n // eslint-disable-next-line\n \"|\": (a: any, b: any) => a | b,\n\n // eslint-disable-next-line\n \"&\": (a: any, b: any) => a & b,\n \"+=\": (a: any, b: any) => a + b,\n \"-=\": (a: any, b: any) => a - b,\n\n // eslint-disable-next-line\n \"&=\": (a: any, b: any) => a & b,\n\n // eslint-disable-next-line\n \"|=\": (a: any, b: any) => a | b,\n};\n\nconst DEFAULT_UNARY_OPERATORS: Record<string, UnaryOperator> = {\n \"-\": (a: any) => -a,\n \"+\": (a: any) => Number(a),\n \"!\": (a: any) => !a,\n};\n\nexport interface HookOptions extends ExpressionContext {\n /** Given an expression node */\n resolveNode: (node: ExpressionNode) => any;\n\n /** Enabling this flag skips calling the onError hook, and just throws errors back to the caller.\n * The caller is responsible for handling the error.\n */\n throwErrors?: boolean;\n\n /** Whether expressions should be parsed strictly or not */\n strict?: boolean;\n}\n\nexport type ExpressionEvaluatorOptions = Omit<\n HookOptions,\n \"resolveNode\" | \"evaluate\"\n>;\n\nexport type ExpressionEvaluatorFunction = (\n exp: ExpressionType,\n options?: ExpressionEvaluatorOptions,\n) => any;\n\n/**\n * The expression evaluator is responsible for parsing and executing anything in the custom expression language\n * */\nexport class ExpressionEvaluator {\n private readonly vars: Record<string, any> = {};\n public readonly hooks = {\n /** Resolve an AST node for an expression to a value */\n resolve: new SyncWaterfallHook<[any, ExpressionNode, HookOptions]>(),\n\n /** Gets the options that will be passed in calls to the resolve hook */\n resolveOptions: new SyncWaterfallHook<[HookOptions]>(),\n\n /** Allows users to change the expression to be evaluated before processing */\n beforeEvaluate: new SyncWaterfallHook<[ExpressionType, HookOptions]>(),\n\n /**\n * An optional means of handling an error in the expression execution\n * Return true if handled, to stop propagation of the error\n */\n onError: new SyncBailHook<[Error], true>(),\n };\n\n private readonly expressionsCache: Map<string, ExpressionNode> = new Map();\n\n private readonly defaultHookOptions: HookOptions;\n\n public readonly operators = {\n binary: new Map(Object.entries(DEFAULT_BINARY_OPERATORS)),\n unary: new Map(Object.entries(DEFAULT_UNARY_OPERATORS)),\n expressions: new Map<string, ExpressionHandler<any, any>>(\n Object.entries(DEFAULT_EXPRESSION_HANDLERS),\n ),\n };\n\n public reset(): void {\n this.expressionsCache.clear();\n }\n\n constructor(defaultOptions: ExpressionEvaluatorOptions) {\n this.defaultHookOptions = {\n ...defaultOptions,\n evaluate: (expr) => this.evaluate(expr, this.defaultHookOptions),\n resolveNode: (node: ExpressionNode) =>\n this._execAST(node, this.defaultHookOptions),\n };\n\n this.hooks.resolve.tap(\"ExpressionEvaluator\", this._resolveNode.bind(this));\n this.evaluate = this.evaluate.bind(this);\n }\n\n public evaluate(\n expr: ExpressionType,\n options?: ExpressionEvaluatorOptions,\n ): any {\n const resolvedOpts = this.hooks.resolveOptions.call({\n ...this.defaultHookOptions,\n ...options,\n resolveNode: (node: ExpressionNode) => this._execAST(node, resolvedOpts),\n });\n\n let expression = this.hooks.beforeEvaluate.call(expr, resolvedOpts) ?? expr;\n\n // Unwrap any returned expression type\n // Since this could also be an object type, we need to recurse through it until we find the end\n while (isObjectExpression(expression)) {\n expression = expression.value;\n }\n\n // Check for literals\n if (\n typeof expression === \"number\" ||\n typeof expression === \"boolean\" ||\n expression === undefined ||\n expression === null\n ) {\n return expression;\n }\n\n // Skip doing anything with objects that are _actually_ just parsed expression nodes\n if (isExpressionNode(expression)) {\n return this._execAST(expression, resolvedOpts);\n }\n\n if (Array.isArray(expression)) {\n return expression.reduce(\n (_nothing, exp) => this.evaluate(exp, options),\n null,\n );\n }\n\n return this._execString(String(expression), resolvedOpts);\n }\n\n public addExpressionFunction<T extends readonly unknown[], R>(\n name: string,\n handler: ExpressionHandler<T, R>,\n ): void {\n this.operators.expressions.set(name, handler);\n }\n\n public addBinaryOperator(operator: string, handler: BinaryOperator) {\n this.operators.binary.set(operator, handler);\n }\n\n public addUnaryOperator(operator: string, handler: UnaryOperator) {\n this.operators.unary.set(operator, handler);\n }\n\n public setExpressionVariable(name: string, value: unknown) {\n this.vars[name] = value;\n }\n\n public getExpressionVariable(name: string): unknown {\n return this.vars[name];\n }\n\n private _execAST(node: ExpressionNode, options: HookOptions): any {\n return this.hooks.resolve.call(undefined, node, options);\n }\n\n private _execString(exp: string, options: HookOptions) {\n if (exp === \"\") {\n return exp;\n }\n\n const matches = exp.match(/^@\\[(.*)\\]@$/);\n let matchedExp = exp;\n\n if (matches) {\n [, matchedExp] = Array.from(matches); // In case the expression was surrounded by @[ ]@\n }\n\n let storedAST: ExpressionNode;\n\n try {\n storedAST =\n this.expressionsCache.get(matchedExp) ??\n parseExpression(matchedExp, { strict: options.strict });\n this.expressionsCache.set(matchedExp, storedAST);\n } catch (e: any) {\n if (options.throwErrors || !this.hooks.onError.call(e)) {\n // Only throw the error if it's not handled by the hook, or throwErrors is true\n throw new NestedError(`Error parsing expression: ${exp}`, e);\n }\n\n return;\n }\n\n try {\n return this._execAST(storedAST, options);\n } catch (e: any) {\n if (options.throwErrors || !this.hooks.onError.call(e)) {\n // Only throw the error if it's not handled by the hook, or throwErrors is true\n throw new NestedError(`Error evaluating expression: ${exp}`, e);\n }\n }\n }\n\n private _resolveNode(\n _currentValue: any,\n node: ExpressionNode,\n options: HookOptions,\n ) {\n const { resolveNode, model } = options;\n\n const expressionContext: ExpressionContext = {\n ...options,\n evaluate: (expr) => this.evaluate(expr, options),\n };\n\n if (node.type === \"Literal\") {\n return node.value;\n }\n\n if (node.type === \"Identifier\") {\n return this.vars[node.name];\n }\n\n if (node.type === \"Compound\" || node.type === \"ThisExpression\") {\n throw new Error(`Expression type: ${node.type} is not supported`);\n }\n\n if (node.type === \"BinaryExpression\" || node.type === \"LogicalExpression\") {\n const operator = this.operators.binary.get(node.operator);\n\n if (operator) {\n if (\"resolveParams\" in operator) {\n if (operator.resolveParams === false) {\n return operator(expressionContext, node.left, node.right);\n }\n\n return operator(\n expressionContext,\n resolveNode(node.left),\n resolveNode(node.right),\n );\n }\n\n return operator(resolveNode(node.left), resolveNode(node.right));\n }\n\n return;\n }\n\n if (node.type === \"UnaryExpression\") {\n const operator = this.operators.unary.get(node.operator);\n\n if (operator) {\n if (\"resolveParams\" in operator) {\n return operator(\n expressionContext,\n operator.resolveParams === false\n ? node.argument\n : resolveNode(node.argument),\n );\n }\n\n return operator(resolveNode(node.argument));\n }\n\n return;\n }\n\n if (node.type === \"Object\") {\n const { attributes } = node;\n const resolvedAttributes: any = {};\n\n attributes.forEach((attr) => {\n const key = resolveNode(attr.key);\n const value = resolveNode(attr.value);\n resolvedAttributes[key] = value;\n });\n\n return resolvedAttributes;\n }\n\n if (node.type === \"CallExpression\") {\n const expressionName = node.callTarget.name;\n\n const operator = this.operators.expressions.get(expressionName);\n\n if (!operator) {\n throw new Error(`Unknown expression function: ${expressionName}`);\n }\n\n if (\"resolveParams\" in operator && operator.resolveParams === false) {\n return operator(expressionContext, ...node.args);\n }\n\n const args = node.args.map((n) => resolveNode(n));\n\n return operator(expressionContext, ...args);\n }\n\n if (node.type === \"ModelRef\") {\n return model.get(node.ref, { context: { model: options.model } });\n }\n\n if (node.type === \"MemberExpression\") {\n const obj = resolveNode(node.object);\n const prop = resolveNode(node.property);\n\n return obj[prop];\n }\n\n if (node.type === \"Assignment\") {\n if (node.left.type === \"ModelRef\") {\n const value = resolveNode(node.right);\n model.set([[node.left.ref, value]]);\n\n return value;\n }\n\n if (node.left.type === \"Identifier\") {\n const value = resolveNode(node.right);\n this.vars[node.left.name] = value;\n return value;\n }\n\n return;\n }\n\n if (node.type === \"ConditionalExpression\") {\n const result = resolveNode(node.test) ? node.consequent : node.alternate;\n\n return resolveNode(result);\n }\n\n if (node.type === \"ArrayExpression\") {\n return node.elements.map((ele) => resolveNode(ele));\n }\n\n if (node.type === \"Modification\") {\n const operation = this.operators.binary.get(node.operator);\n\n if (operation) {\n let newValue;\n\n if (\"resolveParams\" in operation) {\n if (operation.resolveParams === false) {\n newValue = operation(expressionContext, node.left, node.right);\n } else {\n newValue = operation(\n expressionContext,\n resolveNode(node.left),\n resolveNode(node.right),\n );\n }\n } else {\n newValue = operation(resolveNode(node.left), resolveNode(node.right));\n }\n\n if (node.left.type === \"ModelRef\") {\n model.set([[node.left.ref, newValue]]);\n } else if (node.left.type === \"Identifier\") {\n this.vars[node.left.name] = newValue;\n }\n\n return newValue;\n }\n\n return resolveNode(node.left);\n }\n }\n}\n","import { setIn } from \"timm\";\nimport type { Expression } from \"@player-ui/types\";\nimport type { DataModelWithParser } from \"../data\";\n\nconst DOUBLE_OPEN_CURLY = \"{{\";\nconst DOUBLE_CLOSE_CURLY = \"}}\";\n\nexport interface Options {\n /**\n * The model to use when resolving refs\n * Passing `false` will skip trying to resolve any direct model refs ({{foo}})\n */\n model: false | DataModelWithParser;\n\n /**\n * A function to evaluate an expression\n * Passing `false` will skip trying to evaluate any expressions (@[ foo() ]@)\n */\n evaluate: false | ((exp: Expression) => any);\n\n /**\n * Optionaly resolve binding without formatting in case Type format applies\n */\n formatted?: boolean;\n}\n\n/** Search the given string for the coordinates of the next expression to resolve */\nexport function findNextExp(str: string) {\n const expStart = str.indexOf(DOUBLE_OPEN_CURLY);\n\n if (expStart === -1) {\n return undefined;\n }\n\n let count = 1;\n let offset = expStart + DOUBLE_OPEN_CURLY.length;\n let workingString = str.substring(expStart + DOUBLE_OPEN_CURLY.length);\n\n while (count > 0 && workingString.length > 0) {\n // Find the next open or close curly\n const nextCloseCurly = workingString.indexOf(DOUBLE_CLOSE_CURLY);\n\n // We can't close anything, so there's no point in going on with life.\n if (nextCloseCurly === -1) {\n break;\n }\n\n const nextOpenCurly = workingString.indexOf(DOUBLE_OPEN_CURLY);\n\n if (nextOpenCurly !== -1 && nextOpenCurly < nextCloseCurly) {\n // We've hit another open bracket before closing out the one we want\n // Move everything over and bump our close count by 1\n count++;\n workingString = workingString.substring(\n nextOpenCurly + DOUBLE_OPEN_CURLY.length,\n );\n offset += nextOpenCurly + DOUBLE_OPEN_CURLY.length;\n } else {\n // We've hit another closing bracket\n // Decrement our count and updates offsets\n count--;\n workingString = workingString.substring(\n nextCloseCurly + DOUBLE_CLOSE_CURLY.length,\n );\n offset += nextCloseCurly + DOUBLE_CLOSE_CURLY.length;\n }\n }\n\n if (count !== 0) {\n throw new Error(`Unbalanced {{ and }} in exp: ${str}`);\n }\n\n return {\n start: expStart,\n end: offset,\n };\n}\n\n/** Finds any subset of the string wrapped in @[]@ and evaluates it as an expression */\nexport function resolveExpressionsInString(\n val: string,\n { evaluate }: Options,\n): string {\n if (!evaluate) {\n return val;\n }\n\n const expMatch = /@\\[.*?\\]@/;\n let newVal = val;\n let match = newVal.match(expMatch);\n\n while (match !== null) {\n const expStrWithBrackets = match[0];\n const matchStart = newVal.indexOf(expStrWithBrackets);\n\n const expString = expStrWithBrackets.substr(\n \"@[\".length,\n expStrWithBrackets.length - \"@[\".length - \"]@\".length,\n );\n const expValue = evaluate(expString);\n\n // The string is only the expression, return the raw value.\n if (\n matchStart === 0 &&\n expStrWithBrackets === val &&\n typeof expValue !== \"string\"\n ) {\n return expValue;\n }\n\n newVal =\n newVal.substr(0, matchStart) +\n expValue +\n newVal.substr(matchStart + expStrWithBrackets.length);\n // remove the surrounding @[]@ to get the expression\n match = newVal.match(expMatch);\n }\n\n return newVal;\n}\n\n/** Return a string with all data model references resolved */\nexport function resolveDataRefsInString(val: string, options: Options): string {\n const { model, formatted = true } = options;\n let workingString = resolveExpressionsInString(val, options);\n\n if (\n !model ||\n typeof workingString !== \"string\" ||\n workingString.indexOf(DOUBLE_OPEN_CURLY) === -1\n ) {\n return workingString;\n }\n\n while (workingString.indexOf(DOUBLE_OPEN_CURLY) !== -1) {\n const expLocation = findNextExp(workingString);\n\n if (!expLocation) {\n return workingString;\n }\n\n const { start, end } = expLocation;\n\n // Strip out the wrapping curlies from {{binding}} before passing to the model\n const binding = workingString\n .substring(\n start + DOUBLE_OPEN_CURLY.length,\n end - DOUBLE_OPEN_CURLY.length,\n )\n .trim();\n\n const evaledVal = model.get(binding, { formatted });\n\n // Exit early if the string is _just_ a model lookup\n // If the result is a string, we may need further processing for nested bindings\n if (\n start === 0 &&\n end === workingString.length &&\n typeof evaledVal !== \"string\"\n ) {\n return evaledVal;\n }\n\n workingString =\n workingString.substr(0, start) + evaledVal + workingString.substr(end);\n }\n\n return workingString;\n}\n\n/** Traverse the thing and replace any model refs */\nfunction traverseObject<T>(val: T, options: Options): T {\n switch (typeof val) {\n case \"string\": {\n return resolveDataRefsInString(val as string, options) as unknown as T;\n }\n\n case \"object\": {\n if (!val) return val;\n // TODO: Do we care refs in keys?\n const keys = Object.keys(val);\n let newVal = val;\n\n if (keys.length > 0) {\n keys.forEach((key) => {\n newVal = setIn(\n newVal as any,\n [key],\n traverseObject((val as any)[key], options),\n ) as any;\n });\n }\n\n return newVal;\n }\n\n default:\n return val;\n }\n}\n\n/** Recursively resolve all model refs in whatever you pass in */\nexport function resolveDataRefs<T>(val: T, options: Options): T {\n return traverseObject(val, options);\n}\n","import { setIn } from \"timm\";\nimport type { BindingInstance } from \"../binding\";\nimport type {\n BatchSetTransaction,\n DataModelImpl,\n DataModelOptions,\n DataModelMiddleware,\n Updates,\n} from \"../data\";\nimport { toModel } from \"../data\";\nimport type { Logger } from \"../logger\";\n\nimport type { ValidationResponse } from \"./types\";\nimport { removeBindingAndChildrenFromMap } from \"./binding-map-splice\";\n\n/**\n * A BindingInstance with an indicator of whether or not it's a strong binding\n */\nexport type StrongOrWeakBinding = {\n /** BindingInstance in question */\n binding: BindingInstance;\n /** Boolean indicating whether the relevant BindingInstance is a strong binding */\n isStrong: boolean;\n};\n\n/**\n * Returns a validation object if the data is invalid or an set of BindingsInstances if the binding itself is a weak ref of another invalid validation\n */\nexport type MiddlewareChecker = (\n binding: BindingInstance,\n model: DataModelImpl,\n) => ValidationResponse | Set<StrongOrWeakBinding> | undefined;\n\n/**\n * Middleware for the data-model that caches the results of invalid data\n */\nexport class ValidationMiddleware implements DataModelMiddleware {\n public validator: MiddlewareChecker;\n public shadowModelPaths: Map<BindingInstance, any>;\n private logger?: Logger;\n private shouldIncludeInvalid?: (options?: DataModelOptions) => boolean;\n\n constructor(\n validator: MiddlewareChecker,\n options?: {\n /** A logger instance */\n logger?: Logger;\n /** Optional function to include data staged in shadowModel */\n shouldIncludeInvalid?: (options?: DataModelOptions) => boolean;\n },\n ) {\n this.validator = validator;\n this.shadowModelPaths = new Map();\n this.logger = options?.logger;\n this.shouldIncludeInvalid = options?.shouldIncludeInvalid;\n }\n\n public set(\n transaction: BatchSetTransaction,\n options?: DataModelOptions,\n next?: DataModelImpl,\n ): Updates {\n const asModel = toModel(this, { ...options, includeInvalid: true }, next);\n const nextTransaction: BatchSetTransaction = [];\n\n const includedBindings = new Set<BindingInstance>();\n\n transaction.forEach(([binding, value]) => {\n this.shadowModelPaths.set(binding, value);\n includedBindings.add(binding);\n });\n\n const invalidBindings: Array<BindingInstance> = [];\n\n this.shadowModelPaths.forEach((value, binding) => {\n const validations = this.validator(binding, asModel);\n\n if (validations === undefined) {\n nextTransaction.push([binding, value]);\n } else if (validations instanceof Set) {\n validations.forEach((validation) => {\n invalidBindings.push(validation.binding);\n if (\n !validation.isStrong &&\n validation.binding.asString() === binding.asString()\n ) {\n nextTransaction.push([validation.binding, value]);\n }\n });\n } else if (includedBindings.has(binding)) {\n invalidBindings.push(binding);\n this.logger?.debug(\n `Invalid value for path: ${binding.asString()} - ${\n validations.severity\n } - ${validations.message}`,\n );\n }\n });\n\n let validResults: Updates = [];\n\n if (next && nextTransaction.length > 0) {\n // defer clearing the shadow model to prevent validations that are run twice due to weak binding refs still needing the data\n nextTransaction.forEach(([binding]) =>\n this.shadowModelPaths.delete(binding),\n );\n const result = next.set(nextTransaction, options);\n if (invalidBindings.length === 0) {\n return result;\n }\n\n validResults = result;\n }\n\n const invalidResults = invalidBindings.map((binding) => {\n return {\n binding,\n oldValue: asModel.get(binding),\n newValue: asModel.get(binding),\n force: true,\n };\n });\n\n return [...validResults, ...invalidResults];\n }\n\n public get(\n binding: BindingInstance,\n options?: DataModelOptions,\n next?: DataModelImpl,\n ) {\n let val = next?.get(binding, options);\n\n if (\n this.shouldIncludeInvalid?.(options) ??\n options?.includeInvalid === true\n ) {\n this.shadowModelPaths.forEach((shadowValue, shadowBinding) => {\n if (shadowBinding === binding) {\n val = shadowValue;\n\n return;\n }\n\n if (binding.contains(shadowBinding)) {\n val = setIn(val, shadowBinding.relative(binding), shadowValue);\n }\n });\n }\n\n return val;\n }\n\n public delete(\n binding: BindingInstance,\n options?: DataModelOptions,\n next?: DataModelImpl,\n ) {\n this.shadowModelPaths = removeBindingAndChildrenFromMap(\n this.shadowModelPaths,\n binding,\n );\n\n return next?.delete(binding, options);\n }\n}\n","import { SyncWaterfallHook, SyncHook } from \"tapable-ts\";\nimport { setIn, addLast, clone } from \"timm\";\nimport dlv from \"dlv\";\nimport { dequal } from \"dequal\";\nimport type { BindingInstance, BindingLike } from \"../../binding\";\nimport type {\n DataModelOptions,\n DataModelWithParser,\n Updates,\n} from \"../../data\";\nimport { DependencyModel, withParser } from \"../../data\";\nimport type { Logger } from \"../../logger\";\nimport type { Node } from \"../parser\";\nimport { NodeType } from \"../parser\";\nimport { caresAboutDataChanges, toNodeResolveOptions } from \"./utils\";\nimport type { Resolve } from \"./types\";\nimport { getNodeID } from \"../parser/utils\";\n\nexport * from \"./types\";\nexport * from \"./utils\";\n\ninterface NodeUpdate extends Resolve.ResolvedNode {\n /** A flag to track if a node has changed since the last resolution */\n updated: boolean;\n}\n\n/** Add model context to the data model */\nconst withContext = (model: DataModelWithParser): DataModelWithParser => {\n return {\n get: (binding: BindingLike, options?: DataModelOptions): any => {\n return model.get(binding, {\n context: { model },\n ...options,\n });\n },\n\n set: (\n transaction: [BindingLike, any][],\n options?: DataModelOptions,\n ): Updates => {\n return model.set(transaction, {\n context: { model },\n ...options,\n });\n },\n\n delete: (binding: BindingLike, options?: DataModelOptions): void => {\n return model.delete(binding, {\n context: { model },\n ...options,\n });\n },\n };\n};\n\n/**\n * The Resolver is the way to take a parsed AST graph of a view and resolve it to a concrete representation of the current user state\n * It combines the ability to mutate ast nodes before resolving, as well as the mutating the resolved objects while parsing\n */\nexport class Resolver {\n public readonly hooks = {\n /** A hook to allow skipping of the resolution tree for a specific node */\n skipResolve: new SyncWaterfallHook<\n [boolean, Node.Node, Resolve.NodeResolveOptions]\n >(),\n\n /** An event emitted before calculating the next update */\n beforeUpdate: new SyncHook<[Set<BindingInstance> | undefined]>(),\n\n /** An event emitted after calculating the next update */\n afterUpdate: new SyncHook<[any]>(),\n\n /** The options passed to a node to resolve it to an object */\n resolveOptions: new SyncWaterfallHook<\n [Resolve.NodeResolveOptions, Node.Node]\n >(),\n\n /** A hook to transform the AST node into a new AST node before resolving it */\n beforeResolve: new SyncWaterfallHook<\n [Node.Node | null, Resolve.NodeResolveOptions]\n >(),\n\n /**\n * A hook to transform an AST node into it's resolved value.\n * This runs _before_ any children are resolved\n */\n resolve: new SyncWaterfallHook<\n [any, Node.Node, Resolve.NodeResolveOptions]\n >(),\n\n /**\n * A hook to transform the resolved value of an AST node.\n * This runs _after_ all children nodes are resolved\n */\n afterResolve: new SyncWaterfallHook<\n [any, Node.Node, Resolve.NodeResolveOptions]\n >(),\n\n /** Called at the very end of a node's tree being updated */\n afterNodeUpdate: new SyncHook<\n [Node.Node, Node.Node | undefined, NodeUpdate]\n >(),\n };\n\n /**\n * The AST tree after beforeResolve is ran mapped to the AST before beforeResolve is ran\n */\n private readonly ASTMap: Map<Node.Node, Node.Node>;\n /**\n * The root node in the AST tree we want to resolve\n */\n public readonly root: Node.Node;\n\n /**\n * The cache of the last resolved values when walking the tree.\n * This gets recycled every update to avoid stale data if a node is unused in an update\n */\n private resolveCache: Map<Node.Node, Resolve.ResolvedNode>;\n\n /**\n * Cache of node IDs that have been processed to track if nodes have duplicate IDs\n */\n private idCache: Set<string>;\n\n /**\n * The parameters required to resolve AST nodes\n */\n private readonly options: Resolve.ResolverOptions;\n\n /**\n * Tapable logger for logging errors encountered during view resolution\n */\n private logger?: Logger;\n\n constructor(root: Node.Node, options: Resolve.ResolverOptions) {\n this.root = root;\n this.options = options;\n this.resolveCache = new Map();\n this.ASTMap = new Map();\n this.logger = options.logger;\n this.idCache = new Set();\n }\n\n public getSourceNode(convertedAST: Node.Node) {\n return this.ASTMap.get(convertedAST);\n }\n\n public update(changes?: Set<BindingInstance>): any {\n this.hooks.beforeUpdate.call(changes);\n const resolveCache = new Map<Node.Node, Resolve.ResolvedNode>();\n this.idCache.clear();\n const prevASTMap = new Map(this.ASTMap);\n this.ASTMap.clear();\n\n const updated = this.computeTree(\n this.root,\n undefined,\n changes,\n resolveCache,\n toNodeResolveOptions(this.options),\n undefined,\n prevASTMap,\n );\n this.resolveCache = resolveCache;\n this.hooks.afterUpdate.call(updated.value);\n\n return updated.value;\n }\n\n public getResolveCache() {\n return new Map(this.resolveCache);\n }\n\n private getPreviousResult(node: Node.Node): Resolve.ResolvedNode | undefined {\n if (!node) {\n return;\n }\n\n const isFirstUpdate = this.resolveCache.size === 0;\n const id = getNodeID(node);\n\n if (id) {\n if (this.idCache.has(id)) {\n // Only log this conflict once to cut down on noise\n // May want to swap this to logging when we first see the id -- which may not be the first render\n if (isFirstUpdate) {\n if (node.type === NodeType.Asset || node.type === NodeType.View) {\n this.logger?.error(\n `Cache conflict: Found Asset/View nodes that have conflicting ids: ${id}, may cause cache issues.`,\n );\n } else if (node.type === NodeType.Value) {\n this.logger?.info(\n `Cache conflict: Found Value nodes that have conflicting ids: ${id}, may cause cache issues. To improve performance make value node IDs globally unique.`,\n );\n }\n }\n\n // Don't use anything from a prev result if there's a duplicate id detected\n return;\n }\n\n this.idCache.add(id);\n }\n\n return this.resolveCache.get(node);\n }\n\n private cloneNode(node: any) {\n const clonedNode = clone(node);\n\n Object.keys(clonedNode).forEach((key) => {\n if (key === \"parent\") return;\n\n const value = clonedNode[key];\n if (typeof value === \"object\" && value !== null) {\n clonedNode[key] = Array.isArray(value) ? [...value] : { ...value };\n }\n });\n\n return clonedNode;\n }\n\n private computeTree(\n node: Node.Node,\n rawParent: Node.Node | undefined,\n dataChanges: Set<BindingInstance> | undefined,\n cacheUpdate: Map<Node.Node, Resolve.ResolvedNode>,\n options: Resolve.NodeResolveOptions,\n partiallyResolvedParent: Node.Node | undefined,\n prevASTMap: Map<Node.Node, Node.Node>,\n ): NodeUpdate {\n const dependencyModel = new DependencyModel(options.data.model);\n\n dependencyModel.trackSubset(\"core\");\n const depModelWithParser = withContext(\n withParser(dependencyModel, this.options.parseBinding),\n );\n\n const resolveOptions = this.hooks.resolveOptions.call(\n {\n ...options,\n data: {\n ...options.data,\n model: depModelWithParser,\n },\n evaluate: (exp) =>\n this.options.evaluator.evaluate(exp, { model: depModelWithParser }),\n node,\n },\n node,\n );\n\n const previousResult = this.getPreviousResult(node);\n const previousDeps = previousResult?.dependencies;\n\n const dataChanged = caresAboutDataChanges(dataChanges, previousDeps);\n const shouldUseLastValue = this.hooks.skipResolve.call(\n !dataChanged,\n node,\n resolveOptions,\n );\n\n // Shallow clone the node so that changes to it during the resolve steps don't impact the original.\n // We are trusting that this becomes a deep clone once the whole node tree has been traversed.\n const clonedNode = {\n ...this.cloneNode(node),\n parent: partiallyResolvedParent,\n };\n const resolvedAST = this.hooks.beforeResolve.call(\n clonedNode,\n resolveOptions,\n ) ?? {\n type: NodeType.Empty,\n };\n\n const isNestedMultiNode =\n resolvedAST.type === NodeType.MultiNode &&\n partiallyResolvedParent?.parent?.type === NodeType.MultiNode &&\n partiallyResolvedParent.type === NodeType.Value;\n\n if (previousResult && shouldUseLastValue) {\n const update = {\n ...previousResult,\n updated: false,\n };\n\n /** Recursively repopulate the AST map given some AST Node and it's resolved AST representation */\n const repopulateASTMapFromCache = (\n resolvedNode: Resolve.ResolvedNode,\n AST: Node.Node,\n ASTParent: Node.Node | undefined,\n ) => {\n const { node: resolvedASTLocal } = resolvedNode;\n this.ASTMap.set(resolvedASTLocal, AST);\n const resolvedUpdate = {\n ...resolvedNode,\n updated: false,\n };\n cacheUpdate.set(AST, resolvedUpdate);\n\n /** Helper function for recursing over child node */\n const handleChildNode = (childNode: Node.Node) => {\n // In order to get the correct results, we need to use the node references from the last update.\n const originalChildNode = prevASTMap.get(childNode) ?? childNode;\n const previousChildResult = this.getPreviousResult(originalChildNode);\n if (!previousChildResult) return;\n\n repopulateASTMapFromCache(\n previousChildResult,\n originalChildNode,\n AST,\n );\n };\n\n if (\"children\" in resolvedASTLocal) {\n resolvedASTLocal.children?.forEach(({ value: childAST }) =>\n handleChildNode(childAST),\n );\n } else if (resolvedASTLocal.type === NodeType.MultiNode) {\n resolvedASTLocal.values.forEach(handleChildNode);\n }\n\n this.hooks.afterNodeUpdate.call(AST, ASTParent, resolvedUpdate);\n };\n\n // Point the root of the cached node to the new resolved node.\n previousResult.node.parent = partiallyResolvedParent;\n\n repopulateASTMapFromCache(previousResult, node, rawParent);\n\n return update;\n }\n\n resolvedAST.parent = partiallyResolvedParent;\n\n resolveOptions.node = resolvedAST;\n\n this.ASTMap.set(resolvedAST, node);\n\n let resolved = this.hooks.resolve.call(\n undefined,\n resolvedAST,\n resolveOptions,\n );\n\n let updated = !dequal(previousResult?.value, resolved);\n\n if (previousResult && !updated) {\n resolved = previousResult?.value;\n }\n\n const childDependencies = new Set<BindingInstance>();\n dependencyModel.trackSubset(\"children\");\n\n if (\"children\" in resolvedAST) {\n const newChildren = resolvedAST.children?.map((child) => {\n const computedChildTree = this.computeTree(\n child.value,\n node,\n dataChanges,\n cacheUpdate,\n resolveOptions,\n resolvedAST,\n prevASTMap,\n );\n const {\n dependencies: childTreeDeps,\n node: childNode,\n updated: childUpdated,\n value: childValue,\n } = computedChildTree;\n\n childTreeDeps.forEach((binding) => childDependencies.add(binding));\n\n if (childValue) {\n if (childNode.type === NodeType.MultiNode && !childNode.override) {\n const arr = addLast(\n dlv(resolved, child.path as any[], []),\n childValue,\n );\n resolved = setIn(resolved, child.path, arr);\n } else {\n resolved = setIn(resolved, child.path, childValue);\n }\n }\n\n updated = updated || childUpdated;\n\n return { ...child, value: childNode };\n });\n\n resolvedAST.children = newChildren;\n } else if (resolvedAST.type === NodeType.MultiNode) {\n const childValue: any = [];\n const rawParentToPassIn = isNestedMultiNode\n ? partiallyResolvedParent?.parent\n : node;\n\n const newValues = resolvedAST.values.map((mValue) => {\n const mTree = this.computeTree(\n mValue,\n rawParentToPassIn,\n dataChanges,\n cacheUpdate,\n resolveOptions,\n resolvedAST,\n prevASTMap,\n );\n\n if (mTree.value !== undefined && mTree.value !== null) {\n childValue.push(mTree.value);\n }\n\n mTree.dependencies.forEach((bindingDep) =>\n childDependencies.add(bindingDep),\n );\n\n updated = updated || mTree.updated;\n\n return mTree.node;\n });\n\n resolvedAST.values = newValues;\n resolved = childValue;\n }\n\n childDependencies.forEach((bindingDep) =>\n dependencyModel.addChildReadDep(bindingDep),\n );\n\n dependencyModel.trackSubset(\"core\");\n if (previousResult && !updated) {\n resolved = previousResult?.value;\n }\n\n resolved = this.hooks.afterResolve.call(resolved, resolvedAST, {\n ...resolveOptions,\n getDependencies: (scope?: \"core\" | \"children\") =>\n dependencyModel.getDependencies(scope),\n });\n\n const update: NodeUpdate = {\n node: resolvedAST,\n updated,\n value: resolved,\n dependencies: new Set([\n ...dependencyModel.getDependencies(),\n ...childDependencies,\n ]),\n };\n\n this.hooks.afterNodeUpdate.call(\n node,\n isNestedMultiNode ? partiallyResolvedParent?.parent : rawParent,\n update,\n );\n cacheUpdate.set(node, update);\n\n return update;\n }\n}\n","var has = Object.prototype.hasOwnProperty;\n\nfunction find(iter, tar, key) {\n\tfor (key of iter.keys()) {\n\t\tif (dequal(key, tar)) return key;\n\t}\n}\n\nexport function dequal(foo, bar) {\n\tvar ctor, len, tmp;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (ctor === Set) {\n\t\t\tif (foo.size !== bar.size) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (len of foo) {\n\t\t\t\ttmp = len;\n\t\t\t\tif (tmp && typeof tmp === 'object') {\n\t\t\t\t\ttmp = find(bar, tmp);\n\t\t\t\t\tif (!tmp) return false;\n\t\t\t\t}\n\t\t\t\tif (!bar.has(tmp)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ctor === Map) {\n\t\t\tif (foo.size !== bar.size) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (len of foo) {\n\t\t\t\ttmp = len[0];\n\t\t\t\tif (tmp && typeof tmp === 'object') {\n\t\t\t\t\ttmp = find(bar, tmp);\n\t\t\t\t\tif (!tmp) return false;\n\t\t\t\t}\n\t\t\t\tif (!dequal(len[1], bar.get(tmp))) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ctor === ArrayBuffer) {\n\t\t\tfoo = new Uint8Array(foo);\n\t\t\tbar = new Uint8Array(bar);\n\t\t} else if (ctor === DataView) {\n\t\t\tif ((len=foo.byteLength) === bar.byteLength) {\n\t\t\t\twhile (len-- && foo.getInt8(len) === bar.getInt8(len));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (ArrayBuffer.isView(foo)) {\n\t\t\tif ((len=foo.byteLength) === bar.byteLength) {\n\t\t\t\twhile (len-- && foo[len] === bar[len]);\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import { setIn } from \"timm\";\nimport { SyncBailHook, SyncWaterfallHook } from \"tapable-ts\";\nimport type { AnyAssetType, Node } from \"./types\";\nimport { NodeType } from \"./types\";\n\nexport * from \"./types\";\nexport * from \"./utils\";\n\nexport const EMPTY_NODE: Node.Empty = {\n type: NodeType.Empty,\n};\n\nexport interface ParseObjectOptions {\n /** how nested the templated is */\n templateDepth?: number;\n}\n\nexport interface ParseObjectChildOptions {\n key: string;\n path: Node.PathSegment[];\n parentObj: object;\n}\n\ninterface NestedObj {\n /** The values of a nested local object */\n children: Node.Child[];\n\n value: any;\n}\n/**\n * The Parser is the way to take an incoming view from the user and parse it into an AST.\n * It provides a few ways to interact with the parsing, including mutating an object before and after creation of an AST node\n */\nexport class Parser {\n public readonly hooks = {\n /**\n * A hook to interact with an object _before_ parsing it into an AST\n *\n * @param value - The object we're are about to parse\n * @returns - A new value to parse.\n * If undefined, the original value is used.\n * If null, we stop parsing this node.\n */\n onParseObject: new SyncWaterfallHook<[object, NodeType]>(),\n\n /**\n * A callback to interact with an AST _after_ we parse it into the AST\n *\n * @param value - The object we parsed\n * @param node - The AST node we generated\n * @returns - A new AST node to use\n * If undefined, the original value is used.\n * If null, we ignore this node all together\n */\n onCreateASTNode: new SyncWaterfallHook<\n [Node.Node | undefined | null, object]\n >(),\n\n parseNode: new SyncBailHook<\n [\n obj: object,\n nodeType: Node.ChildrenTypes,\n parseOptions: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ],\n Node.Node | Node.Child[]\n >(),\n };\n\n public parseView(value: AnyAssetType): Node.View {\n const viewNode = this.parseObject(value, NodeType.View);\n\n if (!viewNode) {\n throw new Error(\"Unable to parse object into a view\");\n }\n\n return viewNode as Node.View;\n }\n\n public createASTNode(node: Node.Node | null, value: any): Node.Node | null {\n const tapped = this.hooks.onCreateASTNode.call(node, value);\n\n if (tapped === undefined) {\n return node;\n }\n\n return tapped;\n }\n\n public parseObject(\n obj: object,\n type: Node.ChildrenTypes = NodeType.Value,\n options: ParseObjectOptions = { templateDepth: 0 },\n ): Node.Node | null {\n const parsedNode = this.hooks.parseNode.call(\n obj,\n type,\n options,\n ) as Node.Node | null;\n\n if (parsedNode || parsedNode === null) {\n return parsedNode;\n }\n\n const parseLocalObject = (\n currentValue: any,\n objToParse: unknown,\n path: string[] = [],\n ): NestedObj => {\n if (typeof objToParse !== \"object\" || objToParse === null) {\n return { value: objToParse, children: [] };\n }\n\n const localObj = this.hooks.onParseObject.call(objToParse, type);\n\n if (!localObj) {\n return currentValue;\n }\n\n const objEntries = Array.isArray(localObj)\n ? localObj.map((v, i) => [i, v])\n : [\n ...Object.entries(localObj),\n ...Object.getOwnPropertySymbols(localObj).map((s) => [\n s,\n (localObj as any)[s],\n ]),\n ];\n\n const defaultValue: NestedObj = {\n children: [],\n value: currentValue,\n };\n\n const newValue = objEntries.reduce((accumulation, current): NestedObj => {\n let { value } = accumulation;\n const { children } = accumulation;\n const [localKey, localValue] = current;\n\n const newChildren = this.hooks.parseNode.call(\n localValue,\n NodeType.Value,\n options,\n {\n path,\n key: localKey,\n parentObj: localObj,\n },\n ) as Node.Child[];\n\n if (newChildren) {\n children.push(...newChildren);\n } else if (localValue && typeof localValue === \"object\") {\n const result = parseLocalObject(accumulation.value, localValue, [\n ...path,\n localKey,\n ]);\n\n value = result.value;\n children.push(...result.children);\n } else {\n value = setIn(accumulation.value, [...path, localKey], localValue);\n }\n\n return {\n value,\n children,\n };\n }, defaultValue);\n\n return newValue;\n };\n\n const { value, children } = parseLocalObject(undefined, obj);\n\n const baseAst =\n value === undefined && !children.length\n ? undefined\n : {\n type,\n value,\n };\n\n if (baseAst && children.length) {\n const parent: Node.BaseWithChildren<any> = baseAst;\n parent.children = children;\n children.forEach((child) => {\n child.value.parent = parent;\n });\n }\n\n return this.hooks.onCreateASTNode.call(baseAst, obj) ?? null;\n }\n}\n","import { set } from \"timm\";\nimport { resolveDataRefs } from \"../../string-resolver\";\nimport type { Options } from \"./options\";\nimport type { Node } from \"../parser\";\nimport { NodeType } from \"../parser\";\nimport type { Resolver } from \"../resolver\";\nimport { ViewInstance, ViewPlugin } from \"../view\";\n\n/** Create a function that checks for a start/end sequence in a string */\nconst createPatternMatcher = (start: string, end: string) => {\n return (testStr: string) => {\n const startLocation = testStr.indexOf(start);\n\n if (startLocation === -1) {\n return false;\n }\n\n const endLocation = testStr.indexOf(end);\n\n if (endLocation === -1) {\n return false;\n }\n\n return startLocation < endLocation;\n };\n};\n\nconst bindingResolveLookup = createPatternMatcher(\"{{\", \"}}\");\nconst expressionResolveLookup = createPatternMatcher(\"@[\", \"]@\");\n\n/** Check to see if a string contains a reference to dynamic content */\nfunction hasSomethingToResolve(str: string) {\n return bindingResolveLookup(str) || expressionResolveLookup(str);\n}\n\n/** Resolve data refs in a string if necessary. */\nfunction resolveString(str: string, resolveOptions: Options) {\n return hasSomethingToResolve(str)\n ? resolveDataRefs(str, {\n model: resolveOptions.data.model,\n evaluate: resolveOptions.evaluate,\n })\n : str;\n}\n\n/** Recursively resolve all string references in an object or array */\nexport function resolveAllRefs(\n node: any,\n resolveOptions: Options,\n propertiesToSkip: Set<string | number>,\n): any {\n if (\n node === null ||\n node === undefined ||\n (typeof node !== \"object\" && typeof node !== \"string\")\n ) {\n return node;\n }\n\n if (typeof node === \"string\") {\n return resolveString(node, resolveOptions);\n }\n\n let newNode = node;\n\n Object.keys(node).forEach((key: string | number) => {\n if (propertiesToSkip.has(key)) {\n return;\n }\n\n const val = node[key];\n\n let newVal = val;\n\n if (typeof val === \"object\") {\n newVal = resolveAllRefs(val, resolveOptions, propertiesToSkip);\n } else if (typeof val === \"string\") {\n newVal = resolveString(val, resolveOptions);\n }\n\n if (newVal !== val) {\n newNode = set(newNode, key as any, newVal);\n }\n });\n\n return newNode;\n}\n\n/** Traverse up the node tree finding the first available 'path' */\nconst findBasePath = (\n node: Node.Node,\n resolver: Resolver,\n): Node.PathSegment[] => {\n const parentNode = node.parent;\n if (!parentNode) {\n return [];\n }\n\n if (\"children\" in parentNode) {\n const original = resolver.getSourceNode(node);\n return (\n parentNode.children?.find((child) => child.value === original)?.path ?? []\n );\n }\n\n if (parentNode.type !== NodeType.MultiNode) {\n return [];\n }\n\n return findBasePath(parentNode, resolver);\n};\n\n/** A plugin that resolves all string references for each node */\nexport default class StringResolverPlugin implements ViewPlugin {\n private propertiesToSkipCache: Map<string, Set<string>>;\n\n constructor() {\n this.propertiesToSkipCache = new Map();\n }\n\n applyResolver(resolver: Resolver) {\n resolver.hooks.resolve.tap(\"string-resolver\", (value, node, options) => {\n if (node.type === NodeType.Empty || node.type === NodeType.Unknown) {\n return null;\n }\n\n if (\n node.type === NodeType.Value ||\n node.type === NodeType.Asset ||\n node.type === NodeType.View\n ) {\n /** Use specified properties to skip during string resolution, or default */\n let propsToSkip: Set<string>;\n if (node.type === NodeType.Asset || node.type === NodeType.View) {\n propsToSkip = new Set(\n node.plugins?.stringResolver?.propertiesToSkip ?? [\"exp\"],\n );\n if (node.value?.id) {\n this.propertiesToSkipCache.set(node.value.id, propsToSkip);\n }\n } else if (\n node.parent?.type === NodeType.MultiNode &&\n (node.parent?.parent?.type === NodeType.Asset ||\n node.parent?.parent?.type === NodeType.View) &&\n node.parent.parent.value?.id &&\n this.propertiesToSkipCache.has(node.parent.parent.value.id)\n ) {\n propsToSkip = this.propertiesToSkipCache.get(\n node.parent.parent.value.id,\n ) as Set<string>;\n } else {\n propsToSkip = new Set([\"exp\"]);\n }\n\n const nodePath = findBasePath(node, resolver);\n\n /** If the path includes something that is supposed to be skipped, this node should be skipped too. */\n if (\n nodePath.length > 0 &&\n nodePath.some((segment) => propsToSkip.has(segment.toString()))\n ) {\n return node.value;\n }\n\n return resolveAllRefs(node.value, options, propsToSkip);\n }\n\n return value;\n });\n }\n\n apply(view: ViewInstance) {\n view.hooks.resolver.tap(\"string-resolver\", this.applyResolver.bind(this));\n }\n}\n","import { omit } from \"timm\";\nimport type { Options } from \"./options\";\nimport type { Resolver } from \"../resolver\";\nimport type {\n Node,\n ParseObjectOptions,\n ParseObjectChildOptions,\n Parser,\n} from \"../parser\";\nimport { NodeType } from \"../parser\";\nimport { ViewInstance, ViewPlugin } from \"../view\";\n\n/** A view plugin to remove inapplicable assets from the tree */\nexport default class ApplicabilityPlugin implements ViewPlugin {\n private isApplicability(obj: any) {\n return obj && Object.prototype.hasOwnProperty.call(obj, \"applicability\");\n }\n\n applyResolver(resolver: Resolver) {\n resolver.hooks.beforeResolve.tap(\n \"applicability\",\n (node: Node.Node | null, options: Options) => {\n let newNode = node;\n\n if (node?.type === NodeType.Applicability) {\n const isApplicable = options.evaluate(node.expression);\n\n if (isApplicable === false) {\n return null;\n }\n\n newNode = node.value;\n }\n\n return newNode;\n },\n );\n }\n\n applyParser(parser: Parser) {\n parser.hooks.parseNode.tap(\n \"applicability\",\n (\n obj: any,\n nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ) => {\n if (this.isApplicability(obj)) {\n const parsedApplicability = parser.parseObject(\n omit(obj, \"applicability\"),\n nodeType,\n options,\n );\n\n if (!parsedApplicability) {\n return childOptions ? [] : null;\n }\n\n const applicabilityNode = parser.createASTNode(\n {\n type: NodeType.Applicability,\n expression: (obj as any).applicability,\n value: parsedApplicability,\n },\n obj,\n );\n\n if (!applicabilityNode) {\n return childOptions ? [] : null;\n }\n\n if (applicabilityNode.type === NodeType.Applicability) {\n applicabilityNode.value.parent = applicabilityNode;\n }\n\n return childOptions\n ? [\n {\n path: [...childOptions.path, childOptions.key],\n value: applicabilityNode,\n },\n ]\n : applicabilityNode;\n }\n },\n );\n }\n\n apply(view: ViewInstance) {\n view.hooks.resolver.tap(\"applicability\", this.applyResolver.bind(this));\n view.hooks.parser.tap(\"applicability\", this.applyParser.bind(this));\n }\n}\n","import { setIn } from \"timm\";\nimport deferred from \"p-defer\";\nimport type { Flow as FlowType, FlowResult } from \"@player-ui/types\";\n\nimport { SyncHook, SyncWaterfallHook } from \"tapable-ts\";\nimport type { Logger } from \"./logger\";\nimport { TapableLogger } from \"./logger\";\nimport type { ExpressionType } from \"./expressions\";\nimport { ExpressionEvaluator } from \"./expressions\";\nimport { SchemaController } from \"./schema\";\nimport { BindingParser } from \"./binding\";\nimport type { ViewInstance } from \"./view\";\nimport { resolveDataRefs } from \"./string-resolver\";\nimport type { FlowInstance } from \"./controllers\";\nimport {\n ConstantsController,\n ViewController,\n DataController,\n ValidationController,\n FlowController,\n} from \"./controllers\";\nimport { FlowExpPlugin } from \"./plugins/flow-exp-plugin\";\nimport { DefaultExpPlugin } from \"./plugins/default-exp-plugin\";\nimport type {\n PlayerFlowState,\n InProgressState,\n CompletedState,\n ErrorState,\n} from \"./types\";\nimport { NOT_STARTED_STATE } from \"./types\";\nimport { DefaultViewPlugin } from \"./plugins/default-view-plugin\";\n\n// Variables injected at build time\nconst PLAYER_VERSION = \"__VERSION__\";\nconst COMMIT = \"__GIT_COMMIT__\";\n\nexport interface PlayerPlugin {\n /**\n * Unique identifier of the plugin.\n * Enables the plugin to be retrievable from Player.\n */\n symbol?: symbol;\n\n /** The name of the plugin */\n name: string;\n\n /**\n * Use this to tap into Player hooks\n */\n apply: (player: Player) => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ExtendedPlayerPlugin<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Assets = void,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Views = void,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Expressions = void,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n DataTypes = void,\n> {}\n\nexport interface PlayerConfigOptions {\n /** A set of plugins to load */\n plugins?: PlayerPlugin[];\n\n /** A logger to use */\n logger?: Logger;\n}\n\nexport interface PlayerInfo {\n /** Version of the running player */\n version: string;\n\n /** Hash of the HEAD commit used to build the current version */\n commit: string;\n}\n\n/**\n * This is it.\n */\nexport class Player {\n public static readonly info: PlayerInfo = {\n version: PLAYER_VERSION,\n commit: COMMIT,\n };\n\n public readonly logger = new TapableLogger();\n public readonly constantsController = new ConstantsController();\n private config: PlayerConfigOptions;\n private state: PlayerFlowState = NOT_STARTED_STATE;\n\n public readonly hooks = {\n /** The hook that fires every time we create a new flowController (a new Content blob is passed in) */\n flowController: new SyncHook<[FlowController]>(),\n\n /** The hook that updates/handles views */\n viewController: new SyncHook<[ViewController]>(),\n\n /** A hook called every-time there's a new view. This is equivalent to the view hook on the view-controller */\n view: new SyncHook<[ViewInstance]>(),\n\n /** Called when an expression evaluator was created */\n expressionEvaluator: new SyncHook<[ExpressionEvaluator]>(),\n\n /** The hook that creates and manages data */\n dataController: new SyncHook<[DataController]>(),\n\n /** Called after the schema is created for a flow */\n schema: new SyncHook<[SchemaController]>(),\n\n /** Manages validations (schema and x-field ) */\n validationController: new SyncHook<[ValidationController]>(),\n\n /** Manages parsing binding */\n bindingParser: new SyncHook<[BindingParser]>(),\n\n /** A that's called for state changes in the flow execution */\n state: new SyncHook<[PlayerFlowState]>(),\n\n /** A hook to access the current flow */\n onStart: new SyncHook<[FlowType]>(),\n\n /** A hook for when the flow ends either in success or failure */\n onEnd: new SyncHook<[]>(),\n /** Mutate the Content flow before starting */\n resolveFlowContent: new SyncWaterfallHook<[FlowType]>(),\n };\n\n constructor(config?: PlayerConfigOptions) {\n if (config?.logger) {\n this.logger.addHandler(config.logger);\n }\n\n this.config = config || {};\n this.config.plugins = [\n new DefaultExpPlugin(),\n new DefaultViewPlugin(),\n ...(this.config.plugins || []),\n new FlowExpPlugin(),\n ];\n this.config.plugins?.forEach((plugin) => {\n plugin.apply(this);\n });\n }\n\n /** Returns currently registered plugins */\n public getPlugins(): PlayerPlugin[] {\n return this.config.plugins ?? [];\n }\n\n /** Find instance of [Plugin] that has been registered to Player */\n public findPlugin<Plugin extends PlayerPlugin>(\n symbol: symbol,\n ): Plugin | undefined {\n return this.config.plugins?.find((el) => el.symbol === symbol) as Plugin;\n }\n\n /** Retrieve an instance of [Plugin] and conditionally invoke [apply] if it exists */\n public applyTo<Plugin extends PlayerPlugin>(\n symbol: symbol,\n apply: (plugin: Plugin) => void,\n ): void {\n const plugin = this.findPlugin<Plugin>(symbol);\n\n if (plugin) {\n apply(plugin);\n }\n }\n\n /** Register and apply [Plugin] if one with the same symbol is not already registered. */\n public registerPlugin(plugin: PlayerPlugin) {\n plugin.apply(this);\n this.config.plugins?.push(plugin);\n }\n\n /** Returns the current version of the running player */\n public getVersion(): string {\n return Player.info.version;\n }\n\n /** Returns the git commit used to build Player version */\n public getCommit(): string {\n return Player.info.commit;\n }\n\n /**\n * Fetch the current state of Player.\n * It will return either `not-started`, `in-progress`, `completed`\n * with some extra data in each\n */\n public getState(): PlayerFlowState {\n return this.state;\n }\n\n /**\n * A private means of setting the state of Player\n * Calls the hooks for subscribers to listen for this event\n */\n private setState(state: PlayerFlowState) {\n this.state = state;\n this.hooks.state.call(state);\n }\n\n /** Start Player with the given flow */\n private setupFlow(userContent: FlowType): {\n /** a callback to _actually_ start the flow */\n start: () => void;\n\n /** the state object to kick if off */\n state: Omit<InProgressState, \"ref\">;\n } {\n const userFlow = this.hooks.resolveFlowContent.call(userContent);\n\n const flowController = new FlowController(userFlow.navigation, {\n logger: this.logger,\n });\n\n this.hooks.onStart.call(userFlow);\n\n this.hooks.flowController.call(flowController);\n\n // eslint-disable-next-line prefer-const\n let expressionEvaluator: ExpressionEvaluator;\n // eslint-disable-next-line prefer-const\n let dataController: DataController;\n\n const pathResolver = new BindingParser({\n get: (binding) => {\n return dataController.get(binding);\n },\n set: (transaction) => {\n return dataController.set(transaction);\n },\n evaluate: (expression) => {\n return expressionEvaluator.evaluate(expression);\n },\n });\n\n this.hooks.bindingParser.call(pathResolver);\n const parseBinding = pathResolver.parse;\n const flowResultDeferred = deferred<FlowResult>();\n\n const schema = new SchemaController(userFlow.schema);\n this.hooks.schema.call(schema);\n\n const validationController = new ValidationController(schema);\n\n this.hooks.validationController.call(validationController);\n\n dataController = new DataController(userFlow.data, {\n pathResolver,\n middleware: validationController.getDataMiddleware(),\n logger: this.logger,\n });\n\n dataController.hooks.format.tap(\"player\", (value, binding) => {\n const formatter = schema.getFormatter(binding);\n\n return formatter ? formatter.format(value) : value;\n });\n\n dataController.hooks.deformat.tap(\"player\", (value, binding) => {\n const formatter = schema.getFormatter(binding);\n\n return formatter ? formatter.deformat(value) : value;\n });\n\n dataController.hooks.resolveDefaultValue.tap(\n \"player\",\n (binding) => schema.getApparentType(binding)?.default,\n );\n\n // eslint-disable-next-line prefer-const\n let viewController: ViewController;\n\n expressionEvaluator = new ExpressionEvaluator({\n model: dataController,\n logger: this.logger,\n });\n\n this.hooks.expressionEvaluator.call(expressionEvaluator);\n\n expressionEvaluator.hooks.onError.tap(\"player\", (e) => {\n flowResultDeferred.reject(e);\n\n return true;\n });\n\n /** Resolve any data references in a string */\n function resolveStrings<T>(val: T, formatted?: boolean) {\n return resolveDataRefs(val, {\n model: dataController,\n evaluate: expressionEvaluator.evaluate,\n formatted,\n });\n }\n\n flowController.hooks.flow.tap(\"player\", (flow: FlowInstance) => {\n flow.hooks.beforeTransition.tap(\"player\", (state, transitionVal) => {\n /** Checks to see if there are any transitions for a specific transition state (i.e. next, back). If not, it will default to * */\n const computedTransitionVal = state.transitions[transitionVal]\n ? transitionVal\n : \"*\";\n if (state.onEnd && state.transitions[computedTransitionVal]) {\n if (typeof state.onEnd === \"object\" && \"exp\" in state.onEnd) {\n expressionEvaluator?.evaluate(state.onEnd.exp);\n } else {\n expressionEvaluator?.evaluate(state.onEnd as ExpressionType);\n }\n }\n\n /** If the transition does not exist, then do not resolve any expressions */\n if (\n !(\"transitions\" in state) ||\n !state.transitions[computedTransitionVal]\n ) {\n return state;\n }\n\n /** resolves and sets the transition to the computed exp */\n return setIn(\n state,\n [\"transitions\", computedTransitionVal],\n resolveStrings(state.transitions[computedTransitionVal]),\n ) as any;\n });\n\n flow.hooks.skipTransition.tap(\"validation\", (currentState) => {\n if (currentState?.value.state_type === \"VIEW\") {\n const { canTransition, validations } =\n validationController.validateView(\"navigation\");\n\n if (!canTransition && validations) {\n const bindings = new Set(validations.keys());\n viewController?.currentView?.update(bindings);\n\n return true;\n }\n }\n\n return undefined;\n });\n\n flow.hooks.resolveTransitionNode.tap(\"player\", (state) => {\n let newState = state;\n\n if (\"ref\" in state) {\n newState = setIn(state, [\"ref\"], resolveStrings(state.ref)) as any;\n }\n\n if (\"param\" in state) {\n newState = setIn(\n state,\n [\"param\"],\n resolveStrings(state.param, false),\n ) as any;\n }\n\n return newState;\n });\n\n flow.hooks.transition.tap(\"player\", (_oldState, newState) => {\n if (newState.value.state_type !== \"VIEW\") {\n validationController.reset();\n }\n });\n\n flow.hooks.afterTransition.tap(\"player\", (flowInstance) => {\n const value = flowInstance.currentState?.value;\n if (value && value.state_type === \"ACTION\") {\n const { exp } = value;\n flowController?.transition(\n String(expressionEvaluator?.evaluate(exp)),\n );\n }\n\n expressionEvaluator.reset();\n });\n });\n\n this.hooks.dataController.call(dataController);\n\n validationController.setOptions({\n parseBinding,\n model: dataController,\n logger: this.logger,\n evaluate: expressionEvaluator.evaluate,\n constants: this.constantsController,\n });\n\n viewController = new ViewController(userFlow.views || [], {\n evaluator: expressionEvaluator,\n parseBinding,\n transition: flowController.transition,\n model: dataController,\n utils: {\n findPlugin: <Plugin = unknown>(pluginSymbol: symbol) => {\n return this.findPlugin(pluginSymbol) as unknown as Plugin;\n },\n },\n logger: this.logger,\n flowController,\n schema,\n format: (binding, value) => {\n const formatter = schema.getFormatter(binding);\n\n return formatter?.format ? formatter.format(value) : value;\n },\n formatValue: (ref, value) => {\n const formatter = schema.getFormatterForType(ref);\n\n return formatter?.format ? formatter.format(value) : value;\n },\n validation: {\n ...validationController.forView(parseBinding),\n type: (b) => schema.getType(parseBinding(b)),\n },\n constants: this.constantsController,\n });\n viewController.hooks.view.tap(\"player\", (view) => {\n validationController.onView(view);\n this.hooks.view.call(view);\n });\n this.hooks.viewController.call(viewController);\n\n return {\n start: () => {\n flowController\n .start()\n .then((endState) => {\n const flowResult: FlowResult = {\n endState: resolveStrings(endState, false),\n data: dataController.serialize(),\n };\n\n return flowResult;\n })\n .then(flowResultDeferred.resolve)\n .catch((e) => {\n this.logger.error(`Something went wrong: ${e.message}`);\n throw e;\n })\n .catch(flowResultDeferred.reject)\n .finally(() => this.hooks.onEnd.call());\n },\n state: {\n status: \"in-progress\",\n flowResult: flowResultDeferred.promise,\n controllers: {\n data: dataController,\n view: viewController,\n flow: flowController,\n schema,\n expression: expressionEvaluator,\n binding: pathResolver,\n validation: validationController,\n },\n fail: flowResultDeferred.reject,\n flow: userFlow,\n logger: this.logger,\n },\n };\n }\n\n public async start(payload: FlowType): Promise<CompletedState> {\n const ref = Symbol(payload?.id ?? \"payload\");\n\n /** A check to avoid updating the state for a flow that's not the current one */\n const maybeUpdateState = <T extends PlayerFlowState>(newState: T) => {\n if (this.state.ref !== ref) {\n this.logger.warn(\n `Received update for a flow that's not the current one`,\n );\n\n return newState;\n }\n\n this.setState(newState);\n\n return newState;\n };\n\n this.setState({\n status: \"not-started\",\n ref,\n });\n\n try {\n const { state, start } = this.setupFlow(payload);\n this.setState({\n ref,\n ...state,\n });\n\n start();\n\n // common data for the end state\n // make sure to use the same ref as the starting one\n const endProps = {\n ref,\n status: \"completed\",\n flow: state.flow,\n controllers: {\n data: state.controllers.data.makeReadOnly(),\n },\n } as const;\n\n return maybeUpdateState({\n ...(await state.flowResult),\n ...endProps,\n });\n } catch (error: any) {\n const errorState: ErrorState = {\n status: \"error\",\n ref,\n flow: payload,\n error,\n };\n\n maybeUpdateState(errorState);\n\n throw error;\n }\n }\n}\n","import { SyncBailHook, SyncHook, SyncWaterfallHook } from \"tapable-ts\";\nimport type { DeferredPromise } from \"p-defer\";\nimport defer from \"p-defer\";\nimport type {\n NavigationFlow,\n NavigationFlowState,\n NavigationFlowEndState,\n} from \"@player-ui/types\";\nimport type { Logger } from \"../../logger\";\n\nexport interface NamedState {\n /** The name of the navigation node */\n name: string;\n\n /** The nav node */\n value: NavigationFlowState;\n}\n\nexport interface TransitionOptions {\n /** Ignore any validations or other signals preventing the transition from taking place */\n force?: boolean;\n}\nexport type TransitionFunction = (\n name: string,\n options?: TransitionOptions,\n) => void;\n\n/** The Content navigation state machine */\nexport class FlowInstance {\n private flow: NavigationFlow;\n private log?: Logger;\n private history: string[];\n private isTransitioning = false;\n private flowPromise?: DeferredPromise<NavigationFlowEndState>;\n public readonly id: string;\n public currentState?: NamedState;\n public readonly hooks = {\n beforeStart: new SyncBailHook<[NavigationFlow], NavigationFlow>(),\n\n /** A callback when the onStart node was present */\n onStart: new SyncHook<[any]>(),\n\n /** A callback when the onEnd node was present */\n onEnd: new SyncHook<[any]>(),\n\n /** A hook to intercept and block a transition */\n skipTransition: new SyncBailHook<\n [NamedState | undefined],\n boolean | undefined\n >(),\n\n /** A chance to manipulate the flow-node used to calculate the given transition used */\n beforeTransition: new SyncWaterfallHook<\n [Exclude<NavigationFlowState, NavigationFlowEndState>, string]\n >(),\n\n /** A chance to manipulate the flow-node calculated after a transition */\n resolveTransitionNode: new SyncWaterfallHook<[NavigationFlowState]>(),\n\n /** A callback when a transition from 1 state to another was made */\n transition: new SyncHook<[NamedState | undefined, NamedState]>(),\n\n /** A callback to run actions after a transition occurs */\n afterTransition: new SyncHook<[FlowInstance]>(),\n };\n\n constructor(\n id: string,\n flow: NavigationFlow,\n options?: {\n /** Logger instance to use */\n logger?: Logger;\n },\n ) {\n this.id = id;\n this.flow = flow;\n this.log = options?.logger;\n this.history = [];\n\n this.hooks.transition.tap(\n \"startPromise\",\n async (_oldState, nextState: NamedState) => {\n const newState = nextState.value;\n\n if (this.flowPromise && newState.state_type === \"END\") {\n this.flowPromise.resolve(newState);\n }\n },\n );\n }\n\n /** Start the state machine */\n public async start(): Promise<NavigationFlowEndState> {\n if (this.flowPromise) {\n this.log?.warn(\"Already called start for flow\");\n\n return this.flowPromise.promise;\n }\n\n this.flow = this.hooks.beforeStart.call(this.flow) || this.flow;\n\n if (this.flow.onStart) {\n this.hooks.onStart.call(this.flow.onStart);\n }\n\n const initialState = this.flow.startState;\n\n if (!initialState) {\n return Promise.reject(new Error(\"No 'startState' defined for flow\"));\n }\n\n this.flowPromise = defer();\n this.pushHistory(initialState);\n\n return this.flowPromise.promise;\n }\n\n public transition(transitionValue: string, options?: TransitionOptions) {\n if (this.isTransitioning) {\n throw new Error(\n `Transitioning while ongoing transition from ${this.currentState?.name} is in progress is not supported`,\n );\n }\n\n if (this.currentState?.value.state_type === \"END\") {\n this.log?.warn(\n `Skipping transition using ${transitionValue}. Already at and END state`,\n );\n\n return;\n }\n\n if (this.currentState === undefined) {\n throw new Error(\"Cannot transition when there's no current state\");\n }\n\n if (options?.force) {\n this.log?.debug(`Forced transition. Skipping validation checks`);\n } else {\n const skipTransition = this.hooks.skipTransition.call(this.currentState);\n\n if (skipTransition) {\n this.log?.debug(\n `Skipping transition from ${this.currentState.name} b/c hook told us to`,\n );\n return;\n }\n }\n\n const state = this.hooks.beforeTransition.call(\n this.currentState.value,\n transitionValue,\n );\n\n if (!(\"transitions\" in state)) {\n throw new Error(`No transitions defined for ${this.currentState.value}`);\n }\n\n const { transitions } = state;\n const nextState = transitions[transitionValue] || transitions[\"*\"];\n\n if (nextState === undefined) {\n this.log?.warn(\n `No transition from ${this.currentState.name} using ${transitionValue} or *`,\n );\n\n return;\n }\n\n this.log?.debug(\n `Transitioning from ${this.currentState.name} to ${nextState} using ${transitionValue} `,\n );\n\n return this.pushHistory(nextState, options);\n }\n\n private pushHistory(stateName: string, options?: TransitionOptions) {\n if (!Object.prototype.hasOwnProperty.call(this.flow, stateName)) {\n throw new Error(`No flow definition for: ${stateName} was found.`);\n }\n\n let nextState = this.flow[stateName];\n\n if (\n !this.flow[stateName] ||\n typeof nextState !== \"object\" ||\n !(\"state_type\" in nextState)\n ) {\n this.log?.error(`Flow doesn't contain any states named: ${stateName}`);\n\n return;\n }\n\n const prevState = this.currentState;\n\n this.isTransitioning = true;\n nextState = this.hooks.resolveTransitionNode.call(nextState);\n\n const newCurrentState = {\n name: stateName,\n value: nextState,\n } as NamedState;\n this.currentState = newCurrentState;\n this.history.push(stateName);\n\n // If the new state is an END state call the `onEnd` if it exists\n\n if (newCurrentState.value.state_type === \"END\" && this.flow.onEnd) {\n this.hooks.onEnd.call(this.flow.onEnd);\n }\n\n this.hooks.transition.call(prevState, {\n ...newCurrentState,\n });\n\n this.isTransitioning = false;\n\n this.hooks.afterTransition.call(this);\n }\n}\n","import type { Validation } from \"@player-ui/types\";\nimport { SyncHook, SyncWaterfallHook } from \"tapable-ts\";\nimport { setIn } from \"timm\";\n\nimport type { BindingInstance, BindingFactory } from \"../../binding\";\nimport { isBinding } from \"../../binding\";\nimport type { DataModelWithParser, DataModelMiddleware } from \"../../data\";\nimport type { SchemaController } from \"../../schema\";\nimport type {\n ErrorValidationResponse,\n ValidationObject,\n ValidationObjectWithHandler,\n ValidatorContext,\n ValidationProvider,\n ValidationResponse,\n WarningValidationResponse,\n StrongOrWeakBinding,\n} from \"../../validator\";\nimport {\n ValidationMiddleware,\n ValidatorRegistry,\n removeBindingAndChildrenFromMap,\n} from \"../../validator\";\nimport type { Logger } from \"../../logger\";\nimport { ProxyLogger } from \"../../logger\";\nimport type { Resolve, ViewInstance } from \"../../view\";\nimport { caresAboutDataChanges } from \"../../view\";\nimport { replaceParams } from \"../../utils\";\nimport { resolveDataRefs } from \"../../string-resolver\";\nimport type {\n ExpressionEvaluatorOptions,\n ExpressionType,\n} from \"../../expressions\";\nimport type { BindingTracker } from \"./binding-tracker\";\nimport { ValidationBindingTrackerViewPlugin } from \"./binding-tracker\";\n\nexport const SCHEMA_VALIDATION_PROVIDER_NAME = \"schema\";\nexport const VIEW_VALIDATION_PROVIDER_NAME = \"view\";\n\nexport const VALIDATION_PROVIDER_NAME_SYMBOL: unique symbol = Symbol.for(\n \"validation-provider-name\",\n);\n\nexport type ValidationObjectWithSource = ValidationObjectWithHandler & {\n /** The name of the validation */\n [VALIDATION_PROVIDER_NAME_SYMBOL]: string;\n};\n\ntype SimpleValidatorContext = Omit<\n ValidatorContext,\n \"validation\" | \"schemaType\"\n>;\n\ninterface BaseActiveValidation<T> {\n /** The validation is being actively shown */\n state: \"active\";\n\n /** The validation response */\n response: T;\n}\n\ntype ActiveWarning = BaseActiveValidation<WarningValidationResponse> & {\n /** Warnings track if they can be dismissed automatically (by navigating) */\n dismissable: boolean;\n};\ntype ActiveError = BaseActiveValidation<ErrorValidationResponse>;\n\n/**\n * warnings that keep track of their active state\n */\ntype StatefulWarning = {\n /** A common key to differentiate between errors and warnings */\n type: \"warning\";\n\n /** The underlying validation this tracks */\n value: ValidationObjectWithSource;\n\n /** If this is currently preventing navigation from continuing */\n isBlockingNavigation: boolean;\n} & (\n | {\n /** warnings start with no state, but can active or dismissed */\n state: \"none\" | \"dismissed\";\n }\n | ActiveWarning\n);\n\n/** Errors that keep track of their state */\ntype StatefulError = {\n /** A common key to differentiate between errors and warnings */\n type: \"error\";\n\n /** The underlying validation this tracks */\n value: ValidationObjectWithSource;\n\n /** If this is currently preventing navigation from continuing */\n isBlockingNavigation: boolean;\n} & (\n | {\n /** Errors start with no state an can be activated */\n state: \"none\";\n }\n | ActiveError\n);\n\nexport type StatefulValidationObject = StatefulWarning | StatefulError;\n\n/** Helper function to determin if the subset is within the containingSet */\nfunction isSubset<T>(subset: Set<T>, containingSet: Set<T>): boolean {\n if (subset.size > containingSet.size) return false;\n for (const entry of subset) if (!containingSet.has(entry)) return false;\n return true;\n}\n\n/** Helper for initializing a validation object that tracks state */\nfunction createStatefulValidationObject(\n obj: ValidationObjectWithSource,\n): StatefulValidationObject {\n return {\n value: obj,\n type: obj.severity,\n state: \"none\",\n isBlockingNavigation: false,\n };\n}\n\ntype ValidationRunner = (obj: ValidationObjectWithHandler) =>\n | {\n /** A validation message */\n message: string;\n }\n | undefined;\n\n/** A class that manages validating bindings across phases */\nclass ValidatedBinding {\n public currentPhase?: Validation.Trigger;\n private applicableValidations: Array<StatefulValidationObject> = [];\n private validationsByState: Record<\n Validation.Trigger,\n Array<StatefulValidationObject>\n > = {\n load: [],\n change: [],\n navigation: [],\n };\n\n public get allValidations(): Array<StatefulValidationObject> {\n return Object.values(this.validationsByState).flat();\n }\n\n public weakBindings: Set<BindingInstance>;\n\n private onDismiss?: () => void;\n\n constructor(\n possibleValidations: Array<ValidationObjectWithSource>,\n onDismiss?: () => void,\n log?: Logger,\n weakBindings?: Set<BindingInstance>,\n ) {\n this.onDismiss = onDismiss;\n possibleValidations.forEach((vObj) => {\n const { trigger } = vObj;\n\n if (this.validationsByState[trigger]) {\n const statefulValidationObject = createStatefulValidationObject(vObj);\n this.validationsByState[trigger].push(statefulValidationObject);\n } else {\n log?.warn(`Unknown validation trigger: ${trigger}`);\n }\n });\n this.weakBindings = weakBindings ?? new Set();\n }\n\n private checkIfBlocking(statefulObj: StatefulValidationObject) {\n if (statefulObj.state === \"active\") {\n const { isBlockingNavigation } = statefulObj;\n return isBlockingNavigation;\n }\n\n return false;\n }\n\n public getAll(): Array<ValidationResponse> {\n return this.applicableValidations.reduce((all, statefulObj) => {\n if (statefulObj.state === \"active\" && statefulObj.response) {\n all.push({\n ...statefulObj.response,\n blocking: this.checkIfBlocking(statefulObj),\n });\n }\n\n return all;\n }, [] as Array<ValidationResponse>);\n }\n\n public get(): ValidationResponse | undefined {\n const firstInvalid = this.applicableValidations.find((statefulObj) => {\n return statefulObj.state === \"active\" && statefulObj.response;\n });\n\n if (firstInvalid?.state === \"active\") {\n return {\n ...firstInvalid.response,\n blocking: this.checkIfBlocking(firstInvalid),\n };\n }\n }\n\n private runApplicableValidations(\n runner: ValidationRunner,\n canDismiss: boolean,\n phase: Validation.Trigger,\n ) {\n // If the currentState is not load, skip those\n this.applicableValidations = this.applicableValidations.map(\n (originalValue) => {\n if (originalValue.state === \"dismissed\") {\n // Don't rerun any dismissed warnings\n return originalValue;\n }\n\n // treat all warnings the same and block it once (unless blocking is true)\n const blocking =\n originalValue.value.blocking ??\n ((originalValue.value.severity === \"warning\" && \"once\") || true);\n\n const obj = setIn(\n originalValue,\n [\"value\", \"blocking\"],\n blocking,\n ) as StatefulValidationObject;\n\n const isBlockingNavigation =\n blocking === true || (blocking === \"once\" && !canDismiss);\n\n if (\n phase === \"navigation\" &&\n obj.state === \"active\" &&\n obj.value.blocking !== true\n ) {\n if (obj.value.severity === \"warning\") {\n const warn = obj as ActiveWarning;\n if (\n warn.dismissable &&\n warn.response.dismiss &&\n (warn.response.blocking !== \"once\" || !warn.response.blocking)\n ) {\n warn.response.dismiss();\n } else {\n if (warn?.response.blocking === \"once\") {\n warn.response.blocking = false;\n }\n\n warn.dismissable = true;\n }\n\n return warn as StatefulValidationObject;\n }\n }\n\n const response = runner(obj.value);\n\n const newState = {\n type: obj.type,\n value: obj.value,\n state: response ? \"active\" : \"none\",\n isBlockingNavigation,\n dismissable:\n obj.value.severity === \"warning\" && phase === \"navigation\",\n response: response\n ? {\n ...obj.value,\n message: response.message ?? \"Something is broken\",\n severity: obj.value.severity,\n displayTarget: obj.value.displayTarget ?? \"field\",\n }\n : undefined,\n } as StatefulValidationObject;\n\n if (newState.state === \"active\" && obj.value.severity === \"warning\") {\n (newState.response as WarningValidationResponse).dismiss = () => {\n (newState as StatefulWarning).state = \"dismissed\";\n this.onDismiss?.();\n };\n }\n\n return newState;\n },\n );\n }\n\n public update(\n phase: Validation.Trigger,\n canDismiss: boolean,\n runner: ValidationRunner,\n ) {\n const newApplicableValidations: StatefulValidationObject[] = [];\n\n if (phase === \"load\" && this.currentPhase !== undefined) {\n // Tried to run the 'load' phase twice. Aborting\n return;\n }\n\n if (this.currentPhase === \"navigation\" || phase === this.currentPhase) {\n // Already added all the types. No need to continue adding new validations\n this.runApplicableValidations(runner, canDismiss, phase);\n return;\n }\n\n if (phase === \"load\") {\n this.currentPhase = \"load\";\n this.applicableValidations = [...this.validationsByState.load];\n } else if (phase === \"change\" && this.currentPhase === \"load\") {\n this.currentPhase = \"change\";\n // The transition to the 'change' type can only come from a 'load' type\n this.applicableValidations = [\n ...this.applicableValidations,\n ...this.validationsByState.change,\n ];\n } else if (\n phase === \"navigation\" &&\n (this.currentPhase === \"load\" || this.currentPhase === \"change\")\n ) {\n // Can transition to a nav state from a change or load\n\n // if there is an non-blocking error that is active then remove the error from applicable validations so it can no longer be shown\n // which is needed if there are additional warnings to become active for that binding after the error is shown\n this.applicableValidations.forEach((element) => {\n if (\n !(\n element.type === \"error\" &&\n element.state === \"active\" &&\n element.isBlockingNavigation === false\n )\n ) {\n newApplicableValidations.push(element);\n }\n });\n\n this.applicableValidations = [\n ...newApplicableValidations,\n ...this.validationsByState.navigation,\n ...(this.currentPhase === \"load\" ? this.validationsByState.change : []),\n ];\n this.currentPhase = \"navigation\";\n }\n\n this.runApplicableValidations(runner, canDismiss, phase);\n }\n}\n\n/**\n * A controller for orchestrating validation within a running player\n *\n * The current validation flow is as follows:\n *\n * - When a binding is first seen, gather all of the possible validations for it from the providers\n * - Schema and Crossfield (view) are both providers of possible validations\n * - Run all of the applicable validations for that binding for the `load` trigger\n *\n * - When a change occurs, set the phase of the binding to `change`.\n * - Run all of the `change` triggered validations for that binding.\n *\n * - When a navigation event occurs, set the phase of the binding to `navigate`.\n * - Run all `change` and `navigate` validations for each tracked binding.\n * - For any warnings, also keep a state of `shown` or `dismissed`.\n * - Set all non-dismissed warnings to `shown`.\n * - Set all `shown` warnings to `dismissed`.\n * - Allow navigation forward if there are no non-dismissed warnings and no valid errors.\n */\nexport class ValidationController implements BindingTracker {\n public readonly hooks = {\n /** A hook called to tap into the validator registry for adding more validators */\n createValidatorRegistry: new SyncHook<[ValidatorRegistry]>(),\n\n /** A callback/event when a new validation is added to the view */\n onAddValidation: new SyncWaterfallHook<\n [ValidationResponse, BindingInstance]\n >(),\n\n /** The inverse of onAddValidation, this is called when a validation is removed from the list */\n onRemoveValidation: new SyncWaterfallHook<\n [ValidationResponse, BindingInstance]\n >(),\n\n resolveValidationProviders: new SyncWaterfallHook<\n [\n Array<{\n /** The name of the provider */\n source: string;\n /** The provider itself */\n provider: ValidationProvider;\n }>,\n ],\n {\n /** The view this is triggered for */\n view?: ViewInstance;\n }\n >(),\n\n /** A hook called when a binding is added to the tracker */\n onTrackBinding: new SyncHook<[BindingInstance]>(),\n };\n\n private tracker: BindingTracker | undefined;\n private validations = new Map<BindingInstance, ValidatedBinding>();\n private validatorRegistry?: ValidatorRegistry;\n private schema: SchemaController;\n\n private providers:\n | Array<{\n /** The name of the provider */\n source: string;\n /** The provider itself */\n provider: ValidationProvider;\n }>\n | undefined;\n\n private viewValidationProvider?: ValidationProvider;\n private options?: SimpleValidatorContext;\n private weakBindingTracker = new Set<BindingInstance>();\n\n constructor(schema: SchemaController, options?: SimpleValidatorContext) {\n this.schema = schema;\n this.options = options;\n this.reset();\n }\n\n setOptions(options: SimpleValidatorContext) {\n this.options = options;\n }\n\n /** Return the middleware for the data-model to stop propagation of invalid data */\n public getDataMiddleware(): Array<DataModelMiddleware> {\n return [\n {\n set: (transaction, options, next) => {\n return next?.set(transaction, options) ?? [];\n },\n get: (binding, options, next) => {\n return next?.get(binding, options);\n },\n delete: (binding, options, next) => {\n this.validations = removeBindingAndChildrenFromMap(\n this.validations,\n binding,\n );\n\n return next?.delete(binding, options);\n },\n },\n new ValidationMiddleware(\n (binding) => {\n if (!this.options) {\n return;\n }\n\n this.updateValidationsForBinding(binding, \"change\", this.options);\n const strongValidation = this.getValidationForBinding(binding);\n\n // return validation issues directly on bindings first\n if (strongValidation?.get()?.severity === \"error\") {\n return strongValidation.get();\n }\n\n // if none, check to see any validations this binding may be a weak ref of and return\n const newInvalidBindings: Set<StrongOrWeakBinding> = new Set();\n this.validations.forEach((weakValidation, strongBinding) => {\n if (\n caresAboutDataChanges(\n new Set([binding]),\n weakValidation.weakBindings,\n ) &&\n weakValidation?.get()?.severity === \"error\"\n ) {\n weakValidation?.weakBindings.forEach((weakBinding) => {\n if (weakBinding === strongBinding) {\n newInvalidBindings.add({\n binding: weakBinding,\n isStrong: true,\n });\n } else {\n newInvalidBindings.add({\n binding: weakBinding,\n isStrong: false,\n });\n }\n });\n }\n });\n\n if (newInvalidBindings.size > 0) {\n return newInvalidBindings;\n }\n },\n { logger: new ProxyLogger(() => this.options?.logger) },\n ),\n ];\n }\n\n private getValidationProviders() {\n if (this.providers) {\n return this.providers;\n }\n\n this.providers = this.hooks.resolveValidationProviders.call([\n {\n source: SCHEMA_VALIDATION_PROVIDER_NAME,\n provider: this.schema,\n },\n {\n source: VIEW_VALIDATION_PROVIDER_NAME,\n provider: {\n getValidationsForBinding: (\n binding: BindingInstance,\n ): Array<ValidationObject> | undefined => {\n return this.viewValidationProvider?.getValidationsForBinding?.(\n binding,\n );\n },\n\n getValidationsForView: (): Array<ValidationObject> | undefined => {\n return this.viewValidationProvider?.getValidationsForView?.();\n },\n },\n },\n ]);\n\n return this.providers;\n }\n\n public reset() {\n this.validations.clear();\n this.tracker = undefined;\n }\n\n public onView(view: ViewInstance): void {\n this.validations.clear();\n if (!this.options) {\n return;\n }\n\n const bindingTrackerPlugin = new ValidationBindingTrackerViewPlugin({\n ...this.options,\n callbacks: {\n onAdd: (binding) => {\n if (\n !this.options ||\n this.getValidationForBinding(binding) !== undefined\n ) {\n return;\n }\n\n // Set the default value for the binding if we need to\n const originalValue = this.options.model.get(binding);\n const withoutDefault = this.options.model.get(binding, {\n ignoreDefaultValue: true,\n });\n\n if (originalValue !== withoutDefault) {\n // Don't trigger updates when setting the default value\n this.options.model.set([[binding, originalValue]], {\n silent: true,\n });\n }\n\n this.updateValidationsForBinding(\n binding,\n \"load\",\n this.options,\n () => {\n view.update(new Set([binding]));\n },\n );\n\n this.hooks.onTrackBinding.call(binding);\n },\n },\n });\n\n this.tracker = bindingTrackerPlugin;\n this.viewValidationProvider = view;\n\n bindingTrackerPlugin.apply(view);\n }\n\n updateValidationsForBinding(\n binding: BindingInstance,\n trigger: Validation.Trigger,\n validationContext?: SimpleValidatorContext,\n onDismiss?: () => void,\n ): void {\n const context = validationContext ?? this.options;\n\n if (!context) {\n throw new Error(`Context is required for executing validations`);\n }\n\n if (trigger === \"load\") {\n // Get all of the validations from each provider\n const possibleValidations = this.getValidationProviders().reduce<\n Array<ValidationObjectWithSource>\n >((vals, provider) => {\n vals.push(\n ...(provider.provider\n .getValidationsForBinding?.(binding)\n ?.map((valObj) => ({\n ...valObj,\n [VALIDATION_PROVIDER_NAME_SYMBOL]: provider.source,\n })) ?? []),\n );\n\n return vals;\n }, []);\n\n if (possibleValidations.length === 0) {\n return;\n }\n\n this.validations.set(\n binding,\n new ValidatedBinding(\n possibleValidations,\n onDismiss,\n this.options?.logger,\n ),\n );\n }\n\n const trackedValidations = this.validations.get(binding);\n trackedValidations?.update(trigger, true, (validationObj) => {\n const response = this.validationRunner(validationObj, binding, context);\n\n if (this.weakBindingTracker.size > 0) {\n const t = this.validations.get(binding) as ValidatedBinding;\n this.weakBindingTracker.forEach((b) => t.weakBindings.add(b));\n }\n\n return response ? { message: response.message } : undefined;\n });\n\n // Also run any validations that binding or sub-binding is a weak binding of\n if (trigger !== \"load\") {\n this.validations.forEach((validation, vBinding) => {\n if (\n vBinding !== binding &&\n caresAboutDataChanges(new Set([binding]), validation.weakBindings)\n ) {\n validation.update(trigger, true, (validationObj) => {\n const response = this.validationRunner(\n validationObj,\n vBinding,\n context,\n );\n return response ? { message: response.message } : undefined;\n });\n }\n });\n }\n }\n\n validationRunner(\n validationObj: ValidationObjectWithHandler,\n binding: BindingInstance,\n context: SimpleValidatorContext | undefined = this.options,\n ) {\n if (!context) {\n throw new Error(\"No context provided to validation runner\");\n }\n\n const handler =\n validationObj.handler ?? this.getValidator(validationObj.type);\n\n const weakBindings = new Set<BindingInstance>();\n\n // For any data-gets in the validation runner, default to using the _invalid_ value (since that's what we're testing against)\n const model: DataModelWithParser = {\n get(b, options) {\n weakBindings.add(isBinding(b) ? binding : context.parseBinding(b));\n return context.model.get(b, { ...options, includeInvalid: true });\n },\n set: context.model.set,\n delete: context.model.delete,\n };\n\n const result = handler?.(\n {\n ...context,\n evaluate: (\n exp: ExpressionType,\n options: ExpressionEvaluatorOptions = { model },\n ) => context.evaluate(exp, options),\n model,\n validation: validationObj,\n schemaType: this.schema.getType(binding),\n },\n context.model.get(binding, {\n includeInvalid: true,\n formatted: validationObj.dataTarget === \"formatted\",\n }),\n validationObj,\n );\n\n this.weakBindingTracker = weakBindings;\n\n if (result) {\n let { message } = result;\n const { parameters } = result;\n\n if (validationObj.message) {\n message = resolveDataRefs(validationObj.message, {\n model,\n evaluate: context.evaluate,\n });\n if (parameters) {\n message = replaceParams(message, parameters);\n }\n }\n\n return {\n message,\n };\n }\n }\n\n private updateValidationsForView(trigger: Validation.Trigger): void {\n const isNavigationTrigger = trigger === \"navigation\";\n const lastActiveBindings = this.activeBindings;\n\n /** Run validations for all bindings in view */\n const updateValidations = (dismissValidations: boolean) => {\n this.getBindings().forEach((binding) => {\n this.validations\n .get(binding)\n ?.update(trigger, dismissValidations, (obj) => {\n if (!this.options) {\n return;\n }\n\n return this.validationRunner(obj, binding, this.options);\n });\n });\n };\n\n // Should dismiss for non-navigation triggers.\n updateValidations(!isNavigationTrigger);\n\n if (isNavigationTrigger) {\n // If validations didn't change since last update, dismiss all dismissible validations.\n const { activeBindings } = this;\n if (isSubset(activeBindings, lastActiveBindings)) {\n updateValidations(true);\n }\n }\n }\n\n private get activeBindings(): Set<BindingInstance> {\n return new Set(\n Array.from(this.getBindings()).filter(\n (b) => this.validations.get(b)?.get() !== undefined,\n ),\n );\n }\n\n public getValidator(type: string) {\n if (this.validatorRegistry) {\n return this.validatorRegistry.get(type);\n }\n\n const registry = new ValidatorRegistry();\n this.hooks.createValidatorRegistry.call(registry);\n this.validatorRegistry = registry;\n\n return registry.get(type);\n }\n\n getBindings(): Set<BindingInstance> {\n return this.tracker?.getBindings() ?? new Set();\n }\n\n trackBinding(binding: BindingInstance): void {\n this.tracker?.trackBinding(binding);\n }\n\n /** Executes all known validations for the tracked bindings using the given model */\n validateView(trigger: Validation.Trigger = \"navigation\"): {\n /** Indicating if the view can proceed without error */\n canTransition: boolean;\n\n /** the validations that are preventing the view from continuing */\n validations?: Map<BindingInstance, ValidationResponse>;\n } {\n this.updateValidationsForView(trigger);\n\n const validations = new Map<BindingInstance, ValidationResponse>();\n\n let canTransition = true;\n\n this.getBindings().forEach((b) => {\n const allValidations = this.getValidationForBinding(b)?.getAll();\n\n allValidations?.forEach((v) => {\n if (trigger === \"navigation\" && v.blocking) {\n this.options?.logger.debug(\n `Validation on binding: ${b.asString()} is preventing navigation. ${JSON.stringify(\n v,\n )}`,\n );\n\n canTransition = false;\n }\n\n if (!validations.has(b)) {\n validations.set(b, v);\n }\n });\n });\n\n return {\n canTransition,\n validations: validations.size ? validations : undefined,\n };\n }\n\n /** Get the current tracked validation for the given binding */\n public getValidationForBinding(\n binding: BindingInstance,\n ): ValidatedBinding | undefined {\n return this.validations.get(binding);\n }\n\n forView(parser: BindingFactory): Resolve.Validation {\n return {\n _getValidationForBinding: (binding) => {\n return this.getValidationForBinding(\n isBinding(binding) ? binding : parser(binding),\n );\n },\n getAll: () => {\n const bindings = this.getBindings();\n if (bindings.size === 0) {\n return undefined;\n }\n\n const validationMapping = new Map<\n BindingInstance,\n ValidationResponse\n >();\n\n bindings.forEach((b) => {\n const validation = this.getValidationForBinding(b)?.get();\n\n if (validation) {\n validationMapping.set(b, validation);\n }\n });\n\n return validationMapping.size === 0 ? undefined : validationMapping;\n },\n get() {\n throw new Error(\"Error Access be provided by the view plugin\");\n },\n getValidationsForBinding() {\n throw new Error(\"Error rollup should be provided by the view plugin\");\n },\n getChildren() {\n throw new Error(\"Error rollup should be provided by the view plugin\");\n },\n getValidationsForSection() {\n throw new Error(\"Error rollup should be provided by the view plugin\");\n },\n track: () => {\n throw new Error(\"Tracking should be provided by the view plugin\");\n },\n register: () => {\n throw new Error(\n \"Section functionality should be provided by the view plugin\",\n );\n },\n type: (binding) =>\n this.schema.getType(isBinding(binding) ? binding : parser(binding)),\n };\n }\n}\n","import { SyncHook, SyncWaterfallHook } from \"tapable-ts\";\nimport queueMicrotask from \"queue-microtask\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type { View, NavigationFlowViewState } from \"@player-ui/types\";\n\nimport { resolveDataRefsInString } from \"../../string-resolver\";\nimport type { Resolve } from \"../../view\";\nimport { ViewInstance } from \"../../view\";\nimport type { Logger } from \"../../logger\";\nimport type { FlowInstance, FlowController } from \"../flow\";\nimport type { DataController } from \"../data/controller\";\nimport { AssetTransformCorePlugin } from \"./asset-transform\";\nimport type { TransformRegistry } from \"./types\";\nimport type { BindingInstance } from \"../../binding\";\n\nexport interface ViewControllerOptions {\n /** Where to get data from */\n model: DataController;\n\n /** Where to log data */\n logger?: Logger;\n\n /** A flow-controller instance to listen for view changes */\n flowController: FlowController;\n}\n\n/** A controller to manage updating/switching views */\nexport class ViewController {\n public readonly hooks = {\n /** Do any processing before the `View` instance is created */\n resolveView: new SyncWaterfallHook<\n [View | undefined, string, NavigationFlowViewState]\n >(),\n\n // The hook right before the View starts resolving. Attach anything custom here\n view: new SyncHook<[ViewInstance]>(),\n };\n\n private readonly viewMap: Record<string, View>;\n private readonly viewOptions: Resolve.ResolverOptions & ViewControllerOptions;\n private pendingUpdate?: {\n /** pending data binding changes */\n changedBindings?: Set<BindingInstance>;\n /** Whether we have a microtask queued to handle this pending update */\n scheduled?: boolean;\n };\n\n public currentView?: ViewInstance;\n public transformRegistry: TransformRegistry = new Registry();\n public optimizeUpdates = true;\n\n constructor(\n initialViews: View[],\n options: Resolve.ResolverOptions & ViewControllerOptions,\n ) {\n this.viewOptions = options;\n this.viewMap = initialViews.reduce<Record<string, View>>(\n (viewMap, view) => {\n // eslint-disable-next-line no-param-reassign\n viewMap[view.id] = view;\n return viewMap;\n },\n {},\n );\n\n new AssetTransformCorePlugin(this.transformRegistry).apply(this);\n\n options.flowController.hooks.flow.tap(\n \"viewController\",\n (flow: FlowInstance) => {\n flow.hooks.transition.tap(\"viewController\", (_oldState, newState) => {\n if (newState.value.state_type === \"VIEW\") {\n this.onView(newState.value);\n } else {\n this.currentView = undefined;\n }\n });\n },\n );\n\n /** Trigger a view update */\n const update = (updates: Set<BindingInstance>, silent = false) => {\n if (this.currentView) {\n if (this.optimizeUpdates) {\n this.queueUpdate(updates, silent);\n } else {\n this.currentView.update();\n }\n }\n };\n\n options.model.hooks.onUpdate.tap(\n \"viewController\",\n (updates, updateOptions) => {\n update(\n new Set(updates.map((t) => t.binding)),\n updateOptions?.silent ?? false,\n );\n },\n );\n\n options.model.hooks.onDelete.tap(\"viewController\", (binding) => {\n const parentBinding = binding.parent();\n const property = binding.key();\n\n // Deleting an array item will trigger an update for the entire array\n if (typeof property === \"number\" && parentBinding) {\n update(new Set([parentBinding]));\n } else {\n update(new Set([binding]));\n }\n });\n }\n\n private queueUpdate(bindings: Set<BindingInstance>, silent = false) {\n if (this.pendingUpdate?.changedBindings) {\n // If there's already a pending update, just add to it don't worry about silent updates here yet\n this.pendingUpdate.changedBindings = new Set([\n ...this.pendingUpdate.changedBindings,\n ...bindings,\n ]);\n } else {\n this.pendingUpdate = { changedBindings: bindings, scheduled: false };\n }\n\n // If there's no pending update, schedule one only if this one isn't silent\n // otherwise if this is silent, we'll just wait for the next non-silent update and make sure our bindings are included\n if (!this.pendingUpdate.scheduled && !silent) {\n this.pendingUpdate.scheduled = true;\n queueMicrotask(() => {\n const updates = this.pendingUpdate?.changedBindings;\n this.pendingUpdate = undefined;\n this.currentView?.update(updates);\n });\n }\n }\n\n private getViewForRef(viewRef: string): View | undefined {\n // First look for a 1:1 viewRef -> id mapping (this is most common)\n if (this.viewMap[viewRef]) {\n return this.viewMap[viewRef];\n }\n\n // The view ids saved may also contain model refs, resolve those and try again\n const matchingViewId = Object.keys(this.viewMap).find(\n (possibleViewIdMatch) =>\n viewRef ===\n resolveDataRefsInString(possibleViewIdMatch, {\n model: this.viewOptions.model,\n evaluate: this.viewOptions.evaluator.evaluate,\n }),\n );\n\n if (matchingViewId && this.viewMap[matchingViewId]) {\n return this.viewMap[matchingViewId];\n }\n }\n\n public onView(state: NavigationFlowViewState) {\n const viewId = state.ref;\n\n const source = this.hooks.resolveView.call(\n this.getViewForRef(viewId),\n viewId,\n state,\n );\n\n if (!source) {\n throw new Error(`No view with id ${viewId}`);\n }\n\n const view = new ViewInstance(source, this.viewOptions);\n this.currentView = view;\n\n // Give people a chance to attach their\n // own listeners to the view before we resolve it\n this.hooks.view.call(view);\n view.update();\n }\n}\n","import SortedArray from \"sorted-array\";\nimport type { Matcher } from \"./deep-partial-matcher\";\nimport createObjectMatcher from \"./deep-partial-matcher\";\n\nexport { default as createObjectMatcher } from \"./deep-partial-matcher\";\n\n/** create a matcher function that matches exactly */\nfunction createBasicMatcher(seed: any): Matcher {\n /** a simple matcher function that only matches itself */\n const matcher = (match: any) => seed === match;\n matcher.count = 1;\n\n return matcher;\n}\n\ninterface RegistryIndex<V> {\n /** The original object we wanted to match on */\n key: object;\n\n /** The value to return */\n value: V;\n\n /** The matcher function for this entry */\n matcher: Matcher;\n}\n\n/** create an empty sorted array using the matcher count */\nconst createSortedArray = <V>() =>\n new SortedArray<RegistryIndex<V>>([], (c) => c.matcher.count);\n\n/**\n * A partial match registry is a map that uses an object to \"match\" against keys.\n * More specific matches take precedence over less specific ones.\n */\nexport class Registry<V> {\n private store = createSortedArray<V>();\n\n constructor(initialSet?: Array<[any, V]>) {\n initialSet?.forEach(([match, value]) => {\n this.set(match, value);\n });\n }\n\n /** Add match -> value mapping to the registry */\n set(match: any, value: V) {\n const matcher =\n typeof match === \"object\"\n ? createObjectMatcher(match)\n : createBasicMatcher(match);\n\n this.store.insert({\n key: match,\n value,\n matcher,\n });\n }\n\n /** Fetch the best match in the registry */\n get(query: any): V | undefined {\n for (const entry of this.store.array) {\n if (entry.matcher(query)) {\n return entry.value;\n }\n }\n }\n\n /** Loop over all entries and run callback */\n forEach(callbackfn: (value: RegistryIndex<V>) => void): void {\n for (const entry of this.store.array) {\n callbackfn(entry);\n }\n }\n\n /** Reset the items in the registry */\n clear() {\n this.store = createSortedArray<V>();\n }\n\n /** Check if the registry is empty*/\n isRegistryEmpty() {\n return this.store.array.length === 0;\n }\n}\n","import dlv from \"dlv\";\n\n/** A function that checks overlapping properties against a reference value */\nexport type Matcher = ((searchObj: object) => boolean) & {\n /** The count represents the specificity of this matcher */\n count: number;\n};\n\n/** Traverse an object and collect any key/value pairs including nested keys */\nfunction traverseObj(\n object: Record<any, any>,\n path: string[] = [],\n pairs: Map<string[], any> = new Map(),\n): Map<string[], any> {\n for (const key of Object.keys(object)) {\n const val: any = object[key];\n const nestedPath = [...path, key];\n (\"\");\n\n if (typeof val === \"object\") {\n traverseObj(val, nestedPath, pairs);\n } else {\n pairs.set(nestedPath, val);\n }\n }\n\n return pairs;\n}\n\n/** Given an object, create a function that compares any set key/value pairs in the given object against a new value */\nexport default function createMatcher(partialObj: object): Matcher {\n // Convert the partial object into a list of [key, value] pairs;\n const pairs = traverseObj(partialObj);\n\n /** Generate a function to match against all of the properties we care about */\n const matchFunction = (searchObj: object) => {\n for (const entry of Array.from(pairs)) {\n const [path, value] = entry;\n\n if (dlv(searchObj, path) !== value) {\n return false;\n }\n }\n\n return true;\n };\n\n // Keep track of the specificity of the comparator\n matchFunction.count = pairs.size;\n\n return matchFunction;\n}\n","export interface Node<T extends string> {\n /** The basic node type */\n name: T;\n}\n\n/**\n * An AST node that represents a nested path in the model\n * foo.{{bar}}.baz (this is {{bar}})\n */\nexport interface PathNode extends Node<\"PathNode\"> {\n /** The path in the model that this node represents */\n path: Array<AnyNode>;\n}\n\n/**\n * A segment representing a query\n * [foo=bar]\n */\nexport interface QueryNode extends Node<\"Query\"> {\n /** The key to query */\n key: AnyNode;\n\n /** The target value */\n value?: AnyNode;\n}\n\n/** A simple segment */\nexport interface ValueNode extends Node<\"Value\"> {\n /** The segment value */\n value: string | number;\n}\n\n/** A nested expression */\nexport interface ExpressionNode extends Node<\"Expression\"> {\n /** The expression */\n value: string;\n}\n\n/** Helper to create a value node */\nexport const toValue = (value: string | number): ValueNode => ({\n name: \"Value\",\n value,\n});\n\n/** Helper to create an expression node */\nexport const toExpression = (value: string): ExpressionNode => ({\n name: \"Expression\",\n value,\n});\n\n/** Helper to create a nested path node */\nexport const toPath = (path: Array<AnyNode>): PathNode => ({\n name: \"PathNode\",\n path,\n});\n\n/** Helper to create a query node */\nexport const toQuery = (key: AnyNode, value?: AnyNode): QueryNode => ({\n name: \"Query\",\n key,\n value,\n});\n\n/** Create a concat node */\nexport const toConcatenatedNode = (\n values: Array<PathNode | ValueNode | ExpressionNode>,\n): PathNode | ValueNode | ConcatenatedNode | ExpressionNode => {\n if (values.length === 1) {\n return values[0];\n }\n\n return {\n name: \"Concatenated\",\n value: values,\n };\n};\n\n/**\n * A binding segment that's multiple smaller ones\n * {{foo}}_bar_{{baz}}\n */\nexport interface ConcatenatedNode extends Node<\"Concatenated\"> {\n /** A list of nested paths, or value nodes to concat together to form a segment */\n value: Array<PathNode | ValueNode | ExpressionNode>;\n}\n\nexport type AnyNode =\n | PathNode\n | QueryNode\n | ValueNode\n | ConcatenatedNode\n | ExpressionNode;\nexport type Path = Array<AnyNode>;\n\nexport interface ParserSuccessResult {\n /** A successful parse result */\n status: true;\n\n /** The path the binding represents */\n path: PathNode;\n}\n\nexport interface ParserFailureResult {\n /** A failed parse result */\n status: false;\n\n /** The message representing the reason the parse result failed */\n error: string;\n}\n\nexport type ParserResult = ParserSuccessResult | ParserFailureResult;\n\nexport type Parser = (raw: string) => ParserResult;\n","import type {\n Parser,\n AnyNode,\n PathNode,\n ConcatenatedNode,\n ValueNode,\n QueryNode,\n ExpressionNode,\n} from \"../ast\";\nimport {\n toValue,\n toPath,\n toConcatenatedNode,\n toQuery,\n toExpression,\n} from \"../ast\";\n\nconst SEGMENT_SEPARATOR = \".\";\nconst OPEN_CURL = \"{\";\nconst CLOSE_CURL = \"}\";\nconst OPEN_BRACKET = \"[\";\nconst CLOSE_BRACKET = \"]\";\nconst EQUALS = \"=\";\nconst SINGLE_QUOTE = \"'\";\nconst DOUBLE_QUOTE = '\"';\nconst BACK_TICK = \"`\";\n// const IDENTIFIER_REGEX = /[\\w\\-@]+/;\n\n/** A _faster_ way to match chars instead of a regex. */\nconst isIdentifierChar = (char?: string): boolean => {\n if (!char) {\n return false;\n }\n\n const charCode = char.charCodeAt(0);\n\n const matches =\n charCode === 32 || // ' '\n charCode === 34 || // \"\n charCode === 39 || // '\n charCode === 40 || // (\n charCode === 41 || // )\n charCode === 42 || // *\n charCode === 46 || // .\n charCode === 61 || // =\n charCode === 91 || // [\n charCode === 93 || // ]\n charCode === 96 || // `\n charCode === 123 || // {\n charCode === 125; // }\n\n return !matches;\n};\n\n/** Parse out a binding AST from a path */\nexport const parse: Parser = (path) => {\n let index = 1;\n let ch = path.charAt(0);\n\n /** get the next char in the string */\n const next = (expected?: string) => {\n if (expected && ch !== expected) {\n throw new Error(`Expected char: ${expected} but got: ${ch}`);\n }\n\n ch = path.charAt(index);\n index += 1;\n return ch;\n };\n\n /** gobble all whitespace */\n const whitespace = () => {\n /* eslint-disable no-unmodified-loop-condition */\n while (ch === \" \") {\n next();\n }\n };\n\n /** get an identifier if you can */\n const identifier = (): ValueNode | undefined => {\n if (!isIdentifierChar(ch)) {\n return;\n }\n\n let value: string | number = ch;\n\n while (next()) {\n if (!isIdentifierChar(ch)) {\n break;\n }\n\n value += ch;\n }\n\n if (value) {\n const maybeNumber = Number(value);\n value = isNaN(maybeNumber) ? value : maybeNumber;\n return toValue(value);\n }\n };\n\n /** get an expression node if you can */\n const expression = (): ExpressionNode | undefined => {\n if (ch === BACK_TICK) {\n next(BACK_TICK);\n\n let exp = ch;\n\n while (next()) {\n if (ch === BACK_TICK) {\n break;\n }\n\n exp += ch;\n }\n\n next(BACK_TICK);\n\n if (exp) {\n return toExpression(exp);\n }\n }\n };\n\n /** Grab a value using a regex */\n const regex = (match: RegExp): ValueNode | undefined => {\n if (!ch?.match(match)) {\n return;\n }\n\n let value = ch;\n\n while (next()) {\n if (!ch?.match(match)) {\n break;\n }\n\n value += ch;\n }\n\n if (value) {\n return toValue(value);\n }\n };\n\n /** parse out a nestedPath if you can */\n const nestedPath = (): PathNode | undefined => {\n if (ch === OPEN_CURL) {\n next(OPEN_CURL);\n next(OPEN_CURL);\n\n /* eslint-disable-next-line @typescript-eslint/no-use-before-define */\n const modelRef = parsePath();\n next(CLOSE_CURL);\n next(CLOSE_CURL);\n return modelRef;\n }\n };\n\n /** get a simple segment node */\n const simpleSegment = () => nestedPath() ?? expression() ?? identifier();\n\n /** Parse a segment */\n const segment = ():\n | ConcatenatedNode\n | PathNode\n | ValueNode\n | ExpressionNode\n | undefined => {\n // Either a string, modelRef, or concatenated version (both)\n const segments: Array<ValueNode | PathNode | ExpressionNode> = [];\n let nextSegment = simpleSegment();\n\n while (nextSegment !== undefined) {\n segments.push(nextSegment);\n nextSegment = simpleSegment();\n }\n\n if (segments.length === 0) {\n return undefined;\n }\n\n return toConcatenatedNode(segments);\n };\n\n /** get an optionally quoted block */\n const optionallyQuotedSegment = ():\n | ValueNode\n | PathNode\n | ExpressionNode\n | undefined => {\n whitespace();\n\n // see if we have a quote\n\n if (ch === SINGLE_QUOTE || ch === DOUBLE_QUOTE) {\n const singleQuote = ch === SINGLE_QUOTE;\n next(singleQuote ? SINGLE_QUOTE : DOUBLE_QUOTE);\n const id = regex(/[^'\"]+/);\n next(singleQuote ? SINGLE_QUOTE : DOUBLE_QUOTE);\n return id;\n }\n\n return simpleSegment();\n };\n\n /** eat equals signs */\n const equals = (): boolean => {\n if (ch !== EQUALS) {\n return false;\n }\n\n while (ch === EQUALS) {\n next();\n }\n\n return true;\n };\n\n /** Parse out a bracket */\n const parseBracket = ():\n | ValueNode\n | QueryNode\n | PathNode\n | ExpressionNode\n | undefined => {\n if (ch === OPEN_BRACKET) {\n next(OPEN_BRACKET);\n whitespace();\n let value: ValueNode | QueryNode | PathNode | ExpressionNode | undefined =\n optionallyQuotedSegment();\n if (value) {\n whitespace();\n if (equals()) {\n whitespace();\n const second = optionallyQuotedSegment();\n value = toQuery(value, second);\n whitespace();\n }\n } else {\n throw new Error(`Expected identifier`);\n }\n\n if (value) {\n next(CLOSE_BRACKET);\n }\n\n return value;\n }\n };\n\n /** Parse a segment and any number of brackets following it */\n const parseSegmentAndBrackets = (): Array<AnyNode> => {\n // try to parse a segment first\n\n const parsed: Array<AnyNode> = [];\n\n const firstSegment = segment();\n\n if (firstSegment) {\n parsed.push(firstSegment);\n\n let bracketSegment = parseBracket();\n\n if (bracketSegment?.name === \"Value\") {\n const maybeNumber = Number(bracketSegment.value);\n bracketSegment.value =\n isNaN(maybeNumber) || String(maybeNumber) !== bracketSegment.value\n ? bracketSegment.value\n : maybeNumber;\n }\n\n while (bracketSegment !== undefined) {\n parsed.push(bracketSegment);\n bracketSegment = parseBracket();\n }\n }\n\n return parsed;\n };\n\n /** Parse out a path segment */\n const parsePath = (): PathNode => {\n const parts: AnyNode[] = [];\n\n let nextSegment = parseSegmentAndBrackets();\n\n while (nextSegment !== undefined) {\n parts.push(...nextSegment);\n\n if (!ch || ch === CLOSE_CURL) {\n break;\n }\n\n if (nextSegment.length === 0 && ch) {\n throw new Error(`Unexpected character: ${ch}`);\n }\n\n next(SEGMENT_SEPARATOR);\n nextSegment = parseSegmentAndBrackets();\n }\n\n return toPath(parts);\n };\n\n try {\n const result = parsePath();\n\n return {\n status: true,\n path: result,\n };\n } catch (e: any) {\n return {\n status: false,\n error: e.message,\n };\n }\n};\n","import type { BindingLike, BindingInstance } from \"./binding\";\n\n/** Check if the parameter representing a binding is already of the Binding class */\nexport function isBinding(binding: BindingLike): binding is BindingInstance {\n return !(typeof binding === \"string\" || Array.isArray(binding));\n}\n\n/** Convert the string to an int if you can, otherwise just return the original string */\nexport function maybeConvertToNum(i: string): string | number {\n const asInt = parseInt(i, 10);\n\n if (isNaN(asInt)) {\n return i;\n }\n\n return asInt;\n}\n\n/**\n * utility to convert binding into binding segments.\n */\nexport function getBindingSegments(\n binding: BindingLike,\n): Array<string | number> {\n if (Array.isArray(binding)) {\n return binding;\n }\n\n if (typeof binding === \"string\") {\n return binding.split(\".\");\n }\n\n return binding.asArray();\n}\n\n/** Like _.findIndex, but ignores types */\nexport function findInArray<T extends Record<string | number, object>>(\n array: Array<T>,\n key: string | number,\n value: T,\n): number | undefined {\n return array.findIndex((obj) => {\n if (obj && typeof obj === \"object\") {\n // Intentional double-equals because we want '4' to be coerced to 4\n // eslint-disable-next-line eqeqeq\n return obj[key] == value;\n }\n\n return false;\n });\n}\n","import { getBindingSegments } from \"./utils\";\n\nexport interface BindingParserOptions {\n /** Get the value for a specific binding */\n get: (binding: BindingInstance) => any;\n\n /**\n * Set the values for bindings.\n * This is used when the query syntax needs to modify an object\n */\n set: (transaction: Array<[BindingInstance, any]>) => void;\n\n /**\n * Get the result of evaluating an expression\n */\n evaluate: (exp: string) => any;\n\n /**\n * Without readOnly, if a binding such as this is used: arr[key='does not exist'],\n * then an object with that key will be created.\n * This is done to make assignment such as arr[key='abc'].val = 'foo' work smoothly.\n * Setting readOnly to true will prevent this behavior, avoiding unintended data changes.\n */\n readOnly?: boolean;\n}\n\nexport type Getter = (path: BindingInstance) => any;\n\nexport type RawBindingSegment = number | string;\nexport type RawBinding = string | RawBindingSegment[];\nexport type BindingLike = RawBinding | BindingInstance;\nexport type BindingFactory = (\n raw: RawBinding,\n options?: Partial<BindingParserOptions>,\n) => BindingInstance;\n\n/**\n * A path in the data model\n */\nexport class BindingInstance {\n private split: RawBindingSegment[];\n private joined: string;\n private factory: BindingFactory;\n\n constructor(\n raw: RawBinding,\n factory = (rawBinding: RawBinding) => new BindingInstance(rawBinding),\n ) {\n const split = Array.isArray(raw) ? raw : raw.split(\".\");\n this.split = split.map((segment) => {\n if (typeof segment === \"number\") {\n return segment;\n }\n\n const tryNum = Number(segment);\n return isNaN(tryNum) ? segment : tryNum;\n });\n Object.freeze(this.split);\n this.joined = this.split.join(\".\");\n this.factory = factory;\n }\n\n asArray(): RawBindingSegment[] {\n return this.split;\n }\n\n asString(): string {\n return this.joined;\n }\n\n /**\n * Check to see if the given binding is a sub-path of the current one\n */\n contains(binding: BindingInstance): boolean {\n // need to account for partial key matches\n // [foo, bar] !== [foo, ba]\n const bindingAsArray = binding.asArray();\n\n if (bindingAsArray.length < this.split.length) {\n return false;\n }\n\n // Check every overlapping index to make sure they're the same\n // Intentionally use a for loop for speeeed\n for (let i = 0; i < this.split.length; i++) {\n if (this.split[i] !== bindingAsArray[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n relative(binding: BindingInstance): RawBindingSegment[] {\n return this.asArray().slice(binding.asArray().length);\n }\n\n parent(): BindingInstance {\n return this.factory(this.split.slice(0, -1));\n }\n\n key(): RawBindingSegment {\n return this.split[this.split.length - 1];\n }\n\n /**\n * This is a utility method to get a binding that is a descendent of this binding\n *\n * @param relative - The relative path to descend to\n */\n descendent(relative: BindingLike): BindingInstance {\n const descendentSegments = getBindingSegments(relative);\n\n return this.factory(this.split.concat(descendentSegments));\n }\n}\n","import type { BindingInstance } from \"../binding\";\nimport type {\n BatchSetTransaction,\n DataModelImpl,\n DataModelMiddleware,\n DataModelOptions,\n Updates,\n} from \"./model\";\n\nexport type DependencySets = \"core\" | \"children\";\n\n/** A class to track usage of read/writes to/from a data model */\nexport class DependencyTracker {\n protected readDeps: Set<BindingInstance>;\n protected writeDeps: Set<BindingInstance>;\n protected namedSet: DependencySets;\n\n private namedDependencySets: Partial<\n Record<\n DependencySets,\n {\n /** readDeps */\n readDeps: Set<BindingInstance>;\n /** writeDeps */\n writeDeps: Set<BindingInstance>;\n }\n >\n >;\n\n constructor() {\n this.readDeps = new Set();\n this.writeDeps = new Set();\n this.namedDependencySets = {};\n this.namedSet = \"core\";\n\n this.createSubset(\"core\");\n this.createSubset(\"children\");\n }\n\n protected createSubset(name: DependencySets, force = false): void {\n if (force || !this.namedDependencySets[name]) {\n this.namedDependencySets[name] = {\n readDeps: new Set(),\n writeDeps: new Set(),\n };\n }\n }\n\n /** Grab all of the bindings that this depended on */\n public getDependencies(name?: DependencySets): Set<BindingInstance> {\n if (name !== undefined) {\n return this.namedDependencySets?.[name]?.readDeps ?? new Set();\n }\n\n return this.readDeps;\n }\n\n public trackSubset(name: DependencySets) {\n this.createSubset(name);\n this.namedSet = name;\n }\n\n public trackDefault() {\n this.namedSet = \"core\";\n }\n\n /** Grab all of the bindings this wrote to */\n public getModified(name?: DependencySets): Set<BindingInstance> {\n if (name !== undefined) {\n return this.namedDependencySets?.[name]?.writeDeps ?? new Set();\n }\n\n return this.writeDeps;\n }\n\n /**\n * Check to see if the dataModel has read the value at the given binding\n *\n * @param binding - The binding you want to check for\n */\n public readsBinding(binding: BindingInstance): boolean {\n return this.readDeps.has(binding);\n }\n\n /**\n * Check to see if the dataModel has written to the binding\n */\n public writesBinding(binding: BindingInstance): boolean {\n return this.writeDeps.has(binding);\n }\n\n /** Reset all tracking of dependencies */\n public reset() {\n this.readDeps = new Set();\n this.writeDeps = new Set();\n this.namedDependencySets = {};\n this.namedSet = \"core\";\n\n this.createSubset(\"core\", true);\n this.createSubset(\"children\", true);\n }\n\n protected addReadDep(\n binding: BindingInstance,\n namedSet = this.namedSet,\n ): void {\n if (namedSet) {\n this.namedDependencySets?.[namedSet]?.readDeps.add(binding);\n }\n\n this.readDeps.add(binding);\n }\n\n protected addWriteDep(\n binding: BindingInstance,\n namedSet = this.namedSet,\n ): void {\n if (namedSet) {\n this.namedDependencySets?.[namedSet]?.writeDeps.add(binding);\n }\n\n this.writeDeps.add(binding);\n }\n\n public addChildReadDep(binding: BindingInstance): void {\n this.addReadDep(binding, \"children\");\n }\n}\n\n/** Middleware that tracks dependencies of read/written data */\nexport class DependencyMiddleware\n extends DependencyTracker\n implements DataModelMiddleware\n{\n constructor() {\n super();\n this.get = this.get.bind(this);\n this.set = this.set.bind(this);\n }\n\n public set(\n transaction: BatchSetTransaction,\n options?: DataModelOptions,\n next?: DataModelImpl | undefined,\n ): Updates {\n transaction.forEach(([binding]) => this.addWriteDep(binding));\n\n return next?.set(transaction, options) ?? [];\n }\n\n public get(\n binding: BindingInstance,\n options?: DataModelOptions,\n next?: DataModelImpl | undefined,\n ) {\n this.addReadDep(binding);\n\n return next?.get(binding, options);\n }\n\n public delete(\n binding: BindingInstance,\n options?: DataModelOptions,\n next?: DataModelImpl | undefined,\n ) {\n this.addWriteDep(binding);\n return next?.delete(binding, options);\n }\n}\n\n/** A data-model that tracks dependencies of read/written data */\nexport class DependencyModel<Options = DataModelOptions>\n extends DependencyTracker\n implements DataModelImpl<Options>\n{\n private readonly rootModel: DataModelImpl<Options>;\n\n constructor(rootModel: DataModelImpl<Options>) {\n super();\n this.rootModel = rootModel;\n this.set = this.set.bind(this);\n this.get = this.get.bind(this);\n }\n\n public set(transaction: BatchSetTransaction, options?: Options): Updates {\n transaction.forEach(([binding]) => this.addWriteDep(binding));\n\n return this.rootModel.set(transaction, options);\n }\n\n public get(binding: BindingInstance, options?: Options) {\n this.addReadDep(binding);\n\n return this.rootModel.get(binding, options);\n }\n\n public delete(binding: BindingInstance, options?: Options) {\n this.addWriteDep(binding);\n return this.rootModel.delete(binding, options);\n }\n}\n","import type { DataModelImpl } from \"./model\";\n\n/**\n * A model that does nothing\n * Helpful for testing and other default DataModel applications\n */\nexport class NOOPDataModel implements DataModelImpl {\n get() {\n return undefined;\n }\n\n set() {\n return [];\n }\n\n delete() {}\n}\n\n/** You only really need 1 instance of the NOOP model */\nexport const NOOP_MODEL = new NOOPDataModel();\n","import { SyncHook } from \"tapable-ts\";\nimport type { BindingLike, BindingFactory } from \"../binding\";\nimport { BindingInstance, isBinding } from \"../binding\";\nimport { NOOP_MODEL } from \"./noop-model\";\n\nexport const ROOT_BINDING = new BindingInstance([]);\nexport type BatchSetTransaction = [BindingInstance, any][];\n\nexport type Updates = Array<{\n /** The updated binding */\n binding: BindingInstance;\n\n /** The old value */\n oldValue: any;\n\n /** The new value */\n newValue: any;\n\n /** Force the Update to be included even if no data changed */\n force?: boolean;\n}>;\n\n/** Options to use when getting or setting data */\nexport interface DataModelOptions {\n /**\n * The data (either to set or get) should represent a formatted value\n * For setting data, the data will be de-formatted before continuing in the pipeline\n * For getting data, the data will be formatted before returning\n */\n formatted?: boolean;\n\n /**\n * By default, fetching data will ignore any invalid data.\n * You can choose to grab the queued invalid data if you'd like\n * This is usually the case for user-inputs\n */\n includeInvalid?: boolean;\n\n /**\n * A flag to set to ignore any default value in the schema, and just use the raw value\n */\n ignoreDefaultValue?: boolean;\n\n /**\n * A flag to indicate that this update should happen silently\n */\n silent?: boolean;\n\n /** Other context associated with this request */\n context?: {\n /** The data model to use when getting other data from the context of this request */\n model: DataModelWithParser;\n };\n}\n\nexport interface DataModelWithParser<Options = DataModelOptions> {\n get(binding: BindingLike, options?: Options): any;\n set(transaction: [BindingLike, any][], options?: Options): Updates;\n delete(binding: BindingLike, options?: Options): void;\n}\n\nexport interface DataModelImpl<Options = DataModelOptions> {\n get(binding: BindingInstance, options?: Options): any;\n set(transaction: BatchSetTransaction, options?: Options): Updates;\n delete(binding: BindingInstance, options?: Options): void;\n}\n\nexport interface DataModelMiddleware {\n /** The name of the middleware */\n name?: string;\n\n set(\n transaction: BatchSetTransaction,\n options?: DataModelOptions,\n next?: DataModelImpl,\n ): Updates;\n\n get(\n binding: BindingInstance,\n options?: DataModelOptions,\n next?: DataModelImpl,\n ): any;\n\n delete?(\n binding: BindingInstance,\n options?: DataModelOptions,\n next?: DataModelImpl,\n ): void;\n\n reset?(): void;\n}\n\n/** Wrap the inputs of the DataModel with calls to parse raw binding inputs */\nexport function withParser<Options = unknown>(\n model: DataModelImpl<Options>,\n parseBinding: BindingFactory,\n): DataModelWithParser<Options> {\n /** Parse something into a binding if it requires it */\n function maybeParse(\n binding: BindingLike,\n readOnly: boolean,\n ): BindingInstance {\n const parsed = isBinding(binding)\n ? binding\n : parseBinding(binding, {\n get: model.get,\n set: model.set,\n readOnly,\n });\n\n if (!parsed) {\n throw new Error(\"Unable to parse binding\");\n }\n\n return parsed;\n }\n\n return {\n get(binding, options?: Options) {\n return model.get(maybeParse(binding, true), options);\n },\n set(transaction, options?: Options) {\n return model.set(\n transaction.map(([key, val]) => [maybeParse(key, false), val]),\n options,\n );\n },\n delete(binding, options?: Options) {\n return model.delete(maybeParse(binding, false), options);\n },\n };\n}\n\n/** Wrap a middleware instance in a DataModel compliant API */\nexport function toModel(\n middleware: DataModelMiddleware,\n defaultOptions?: DataModelOptions,\n next?: DataModelImpl,\n): DataModelImpl {\n if (!next) {\n return middleware as DataModelImpl;\n }\n\n return {\n get: (binding: BindingInstance, options?: DataModelOptions) => {\n const resolvedOptions = options ?? defaultOptions;\n\n if (middleware.get) {\n return middleware.get(binding, resolvedOptions, next);\n }\n\n return next?.get(binding, resolvedOptions);\n },\n set: (transaction: BatchSetTransaction, options?: DataModelOptions) => {\n const resolvedOptions = options ?? defaultOptions;\n\n if (middleware.set) {\n return middleware.set(transaction, resolvedOptions, next);\n }\n\n return next?.set(transaction, resolvedOptions);\n },\n delete: (binding: BindingInstance, options?: DataModelOptions) => {\n const resolvedOptions = options ?? defaultOptions;\n\n if (middleware.delete) {\n return middleware.delete(binding, resolvedOptions, next);\n }\n\n return next?.delete(binding, resolvedOptions);\n },\n };\n}\n\nexport type DataPipeline = Array<DataModelMiddleware | DataModelImpl>;\n\n/**\n * Given a set of steps in a pipeline, create the effective data-model\n */\nexport function constructModelForPipeline(\n pipeline: DataPipeline,\n): DataModelImpl {\n if (pipeline.length === 0) {\n return NOOP_MODEL;\n }\n\n if (pipeline.length === 1) {\n return toModel(pipeline[0]);\n }\n\n /** Default and propagate the options into the nested calls */\n function createModelWithOptions(options?: DataModelOptions) {\n const model: DataModelImpl =\n pipeline.reduce<DataModelImpl | undefined>(\n (nextModel, middleware) => toModel(middleware, options, nextModel),\n undefined,\n ) ?? NOOP_MODEL;\n\n return model;\n }\n\n return {\n get: (binding: BindingInstance, options?: DataModelOptions) => {\n return createModelWithOptions(options)?.get(binding, options);\n },\n set: (transaction, options) => {\n return createModelWithOptions(options)?.set(transaction, options);\n },\n delete: (binding, options) => {\n return createModelWithOptions(options)?.delete(binding, options);\n },\n };\n}\n\n/** A DataModel that manages middleware data handlers */\nexport class PipelinedDataModel implements DataModelImpl {\n private pipeline: DataPipeline;\n private effectiveDataModel: DataModelImpl;\n\n public readonly hooks = {\n onSet: new SyncHook<[BatchSetTransaction]>(),\n };\n\n constructor(pipeline: DataPipeline = []) {\n this.pipeline = pipeline;\n this.effectiveDataModel = constructModelForPipeline(this.pipeline);\n }\n\n public setMiddleware(handlers: DataPipeline) {\n this.pipeline = handlers;\n this.effectiveDataModel = constructModelForPipeline(handlers);\n }\n\n public addMiddleware(handler: DataModelMiddleware) {\n this.pipeline = [...this.pipeline, handler];\n this.effectiveDataModel = constructModelForPipeline(this.pipeline);\n }\n\n public reset(model = {}) {\n this.pipeline.forEach((middleware) => {\n if (\"reset\" in middleware) {\n middleware.reset?.();\n }\n });\n\n this.set([[ROOT_BINDING, model]]);\n }\n\n public set(\n transaction: BatchSetTransaction,\n options?: DataModelOptions,\n ): Updates {\n const appliedTransaction = this.effectiveDataModel.set(\n transaction,\n options,\n );\n this.hooks.onSet.call(transaction);\n return appliedTransaction;\n }\n\n public get(binding: BindingInstance, options?: DataModelOptions): any {\n return this.effectiveDataModel.get(binding, options);\n }\n\n public delete(binding: BindingInstance, options?: DataModelOptions): void {\n return this.effectiveDataModel.delete(binding, options);\n }\n}\n","import type { DataModelWithParser } from \"../data\";\nimport type { Logger } from \"../logger\";\n\nexport type ExpressionObjectType = {\n /** The expression to eval */\n value: BasicExpressionTypes;\n};\n\nexport type ExpressionLiteralType =\n | string\n | number\n | boolean\n | undefined\n | null;\n\nexport type BasicExpressionTypes =\n | ExpressionLiteralType\n | ExpressionObjectType\n | Array<ExpressionLiteralType | ExpressionObjectType>;\n\nexport type ExpressionType = BasicExpressionTypes | ExpressionNode;\n\nexport interface OperatorProcessingOptions {\n /**\n * When set to a falsy value, the arguments passed to the handler will be raw AST Nodes\n * This enables lazy evaluation of arguments\n */\n resolveParams: boolean;\n}\n\nexport type BinaryOperatorBasic = (left: any, right: any) => unknown;\nexport type BinaryOperatorAdvanced = OperatorProcessingOptions &\n ((ctx: ExpressionContext, left: any, right: any) => unknown);\n\nexport type BinaryOperator = BinaryOperatorAdvanced | BinaryOperatorBasic;\n\nexport type UnaryOperator =\n | ((arg: any) => unknown)\n | (((ctx: ExpressionContext, arg: any) => unknown) &\n OperatorProcessingOptions);\n\nexport interface ExpressionContext {\n /** A means of executing an expression */\n evaluate: (expr: ExpressionType) => unknown;\n\n /** The data model that expression handlers can use when fetching data */\n model: DataModelWithParser;\n\n /** A logger to use */\n logger?: Logger;\n}\n\nexport type ExpressionHandler<\n T extends readonly unknown[] = unknown[],\n R = void,\n> = ((context: ExpressionContext, ...args: T) => R) &\n Partial<OperatorProcessingOptions>;\n\nexport const ExpNodeOpaqueIdentifier = Symbol(\"Expression Node ID\");\n\n/** Checks if the input is an already processed Expression node */\nexport function isExpressionNode(x: any): x is ExpressionNode {\n return (\n typeof x === \"object\" &&\n x !== null &&\n !Array.isArray(x) &&\n x.__id === ExpNodeOpaqueIdentifier\n );\n}\n\nexport interface NodePosition {\n /** The character location */\n character: number;\n}\n\nexport interface NodeLocation {\n // We only care about the character offset, not the line/column for now\n // But making these objects allows us to add more (like line number) later\n\n /** The start of the node */\n start: NodePosition;\n\n /** The end of the node */\n end: NodePosition;\n}\n\nexport interface BaseNode<T> {\n /** The thing to discriminate the AST type on */\n type: T;\n\n /** How to tell this apart from other objects */\n __id: typeof ExpNodeOpaqueIdentifier;\n\n /** The location of the node in the source expression string */\n location?: NodeLocation;\n\n /**\n * The error that occurred while parsing this node\n * This is only set if the parsing mode is set to non-strict\n */\n error?: Error;\n}\n\n/** A helper interface for nodes that container left and right children */\nexport interface DirectionalNode {\n /** The left node. Often for the left hand side of an expression */\n left: ExpressionNode;\n\n /** The right child. Often for the right hand side of an expression */\n right: ExpressionNode;\n}\n\nexport interface LiteralNode extends BaseNode<\"Literal\"> {\n /** A node that holds a literal value */\n value: string | number;\n\n /** The unprocessed value */\n raw?: any;\n}\n\nexport interface BinaryNode\n extends BaseNode<\"BinaryExpression\">,\n DirectionalNode {\n /** The operation to perform on the nodes */\n operator: string;\n}\n\nexport interface LogicalNode\n extends BaseNode<\"LogicalExpression\">,\n DirectionalNode {\n /** The logical operation to perform on the nodes */\n operator: string;\n}\n\nexport interface UnaryNode extends BaseNode<\"UnaryExpression\"> {\n /** The operation to perform on the node */\n operator: string;\n\n /** The single argument that the operation should be performed on */\n argument: ExpressionNode;\n}\n\nexport type ThisNode = BaseNode<\"ThisExpression\">;\n\nexport interface ModelRefNode extends BaseNode<\"ModelRef\"> {\n /** The binding that the model reference points to */\n ref: string;\n}\n\nexport interface ObjectNode extends BaseNode<\"Object\"> {\n /** */\n attributes: Array<{\n /** The property name of the object */\n key: ExpressionNode;\n\n /** the associated value */\n value: ExpressionNode;\n }>;\n}\n\nexport interface MemberExpressionNode extends BaseNode<\"MemberExpression\"> {\n /** The object to be introspected */\n object: ExpressionNode;\n\n /** If the property uses . or open-bracket */\n computed: boolean;\n\n /** The property to access on the object */\n property: ExpressionNode;\n}\n\nexport interface ConditionalExpressionNode\n extends BaseNode<\"ConditionalExpression\"> {\n /** The test for the ternary */\n test: ExpressionNode;\n\n /** The truthy case for the ternary */\n consequent: ExpressionNode;\n\n /** The falsy case for the ternary */\n alternate: ExpressionNode;\n}\n\nexport interface CompoundNode extends BaseNode<\"Compound\"> {\n /** The contents of the compound expression */\n body: ExpressionNode[];\n}\n\nexport interface CallExpressionNode extends BaseNode<\"CallExpression\"> {\n /** The arguments to the function */\n args: ExpressionNode[];\n\n /** The function name */\n callTarget: IdentifierNode;\n}\n\nexport interface ArrayExpressionNode extends BaseNode<\"ArrayExpression\"> {\n /** The items in an array */\n elements: ExpressionNode[];\n}\n\nexport interface IdentifierNode extends BaseNode<\"Identifier\"> {\n /** The variable name */\n name: string;\n}\n\nexport type AssignmentNode = BaseNode<\"Assignment\"> & DirectionalNode;\n\nexport interface ModificationNode\n extends BaseNode<\"Modification\">,\n DirectionalNode {\n /** The operator for the modification */\n operator: string;\n}\n\nexport type ExpressionNode =\n | LiteralNode\n | BinaryNode\n | LogicalNode\n | UnaryNode\n | ThisNode\n | ModelRefNode\n | MemberExpressionNode\n | ConditionalExpressionNode\n | CompoundNode\n | CallExpressionNode\n | ArrayExpressionNode\n | IdentifierNode\n | AssignmentNode\n | ModificationNode\n | ObjectNode;\n\nexport type ExpressionNodeType = ExpressionNode[\"type\"];\n\nexport interface ErrorWithLocation extends Error {\n /** The place in the string where the error occurs */\n index: number;\n\n /** a helpful description */\n description: string;\n}\n","/* eslint @typescript-eslint/no-use-before-define: 0 */\n/**\n * An expression to AST parser based on JSEP: http://jsep.from.so/\n */\nimport type {\n ErrorWithLocation,\n ExpressionNode,\n ExpressionNodeType,\n NodeLocation,\n} from \"./types\";\nimport { ExpNodeOpaqueIdentifier } from \"./types\";\n\nconst PERIOD_CODE = 46; // '.'\nconst COMMA_CODE = 44; // ','\nconst SQUOTE_CODE = 39; // Single quote\nconst DQUOTE_CODE = 34; // Double quotes\nconst OPAREN_CODE = 40; // (\nconst CPAREN_CODE = 41; // )\nconst OBRACK_CODE = 91; // [\nconst CBRACK_CODE = 93; // ]\nconst QUMARK_CODE = 63; // ?\nconst SEMCOL_CODE = 59; // ;\nconst COLON_CODE = 58; // :\nconst OCURL_CODE = 123; // {\nconst CCURL_CODE = 125; // }\n\n// Operations\n// ----------\n\n// Set `t` to `true` to save space (when minified, not gzipped)\nconst t = true;\n\n// Use a quickly-accessible map to store all of the unary operators\n// Values are set to `true` (it really doesn't matter)\nconst unaryOps = { \"-\": t, \"!\": t, \"~\": t, \"+\": t };\n\n// Also use a map for the binary operations but set their values to their\n// binary precedence for quick reference:\n// see [Operator precedence](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)\nconst binaryOps: Record<string, number> = {\n \"=\": 3,\n \"+=\": 3,\n \"-=\": 3,\n \"&=\": 3,\n \"|=\": 3,\n // Conditional: 4,\n \"||\": 5,\n \"&&\": 6,\n \"|\": 7,\n \"^\": 8,\n \"&\": 9,\n \"==\": 10,\n \"!=\": 10,\n \"===\": 10,\n \"!==\": 10,\n \"<\": 11,\n \">\": 11,\n \"<=\": 11,\n \">=\": 11,\n \"<<\": 12,\n \">>\": 12,\n \">>>\": 12,\n \"+\": 13,\n \"-\": 13,\n \"*\": 14,\n \"/\": 14,\n \"%\": 14,\n};\n\n/** Wrap the message and index in an error and throw it */\nfunction throwError(message: string, index: number): ErrorWithLocation {\n const err = new Error(`${message} at character ${index}`);\n\n (err as ErrorWithLocation).index = index;\n (err as ErrorWithLocation).description = message;\n\n throw err;\n}\n\n/** Create a new location marker that spans both nodes */\nfunction createSpanningLocation(start?: NodeLocation, end?: NodeLocation) {\n if (!start || !end) {\n return;\n }\n\n return {\n start: start.start,\n end: end.end,\n };\n}\n\n/** Get return the longest key length of any object */\nfunction getMaxKeyLen(obj: object): number {\n let maxLen = 0;\n\n Object.keys(obj).forEach((key) => {\n if (key.length > maxLen && Object.prototype.hasOwnProperty.call(obj, key)) {\n maxLen = key.length;\n }\n });\n\n return maxLen;\n}\n\nconst maxUnopLen = getMaxKeyLen(unaryOps);\nconst maxBinopLen = getMaxKeyLen(binaryOps);\n\n// Literals\n// ----------\n// Store the values to return for the various literals we may encounter\nconst literals = {\n true: true,\n false: false,\n null: null,\n undefined,\n} as const;\n\n// Except for `this`, which is special. This could be changed to something like `'self'` as well\nconst thisStr = \"this\";\n\n/** Returns the precedence of a binary operator or `0` if it isn't a binary operator */\nfunction binaryPrecedence(opVal: string): number {\n return binaryOps[opVal] || 0;\n}\n\n/**\n * Utility function (gets called from multiple places)\n * Also note that `a && b` and `a || b` are *logical* expressions, not binary expressions\n */\nfunction createBinaryExpression(\n operator: string | boolean,\n left: string,\n right: string,\n location?: NodeLocation,\n) {\n let type: ExpressionNodeType;\n\n if (operator === \"||\" || operator === \"&&\") {\n type = \"LogicalExpression\";\n } else if (operator === \"=\") {\n type = \"Assignment\";\n } else if (\n operator === \"+=\" ||\n operator === \"-=\" ||\n operator === \"&=\" ||\n operator === \"|=\"\n ) {\n type = \"Modification\";\n } else {\n type = \"BinaryExpression\";\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type,\n operator,\n left,\n right,\n location,\n };\n}\n\n/** `ch` is a character code in the next three functions */\nfunction isDecimalDigit(ch: number) {\n return ch >= 48 && ch <= 57; // 0...9\n}\n\n/** Check if the char is the character code for the start of an identifier */\nfunction isIdentifierStart(ch: number) {\n return (\n ch === 36 ||\n ch === 95 || // `$` and `_`\n (ch >= 65 && ch <= 90) || // A...Z\n (ch >= 97 && ch <= 122)\n ); // A...z\n}\n\n/** Check if the char code is still a valid identifier portion */\nfunction isIdentifierPart(ch: number) {\n return (\n ch === 36 ||\n ch === 95 || // `$` and `_`\n (ch >= 65 && ch <= 90) || // A...Z\n (ch >= 97 && ch <= 122) || // A...z\n (ch >= 48 && ch <= 57)\n ); // 0...9\n}\n\n/** Check if the 2 chars are the start of a model reference */\nfunction isModelRefStart(ch0: number, ch1: number) {\n return ch0 === OCURL_CODE && ch1 === OCURL_CODE; // '{{'\n}\n\n/** Parse out an expression from the string */\nexport function parseExpression(\n expr: string,\n options?: {\n /** If true (the default), will throw on invalid expressions */\n strict?: boolean;\n },\n): ExpressionNode {\n const strictMode = options?.strict ?? true;\n\n // `index` stores the character number we are currently at while `length` is a constant\n // All of the gobbles below will modify `index` as we move along\n const charAtFunc = expr.charAt;\n const charCodeAtFunc = expr.charCodeAt;\n const { length } = expr;\n\n let index = 0;\n\n /** Create a location object */\n const getLocation = (startChar: number) => {\n return {\n start: {\n character: startChar,\n },\n end: {\n character: index,\n },\n };\n };\n\n /** Grab the char at the index from the expression */\n function exprI(i: number) {\n return charAtFunc.call(expr, i);\n }\n\n /** Grab the unicode char at the index in the expression */\n function exprICode(i: number) {\n return charCodeAtFunc.call(expr, i);\n }\n\n /**\n * Gobble an object and store the object in an attributes array\n */\n function gobbleObjects() {\n const attributes: Array<{\n /** The property name of the object */\n key: any;\n\n /** the associated value */\n value: any;\n }> = [];\n let closed = false;\n\n let shouldDefineKey = true;\n let key;\n let value;\n let chCode;\n const startCharIndex = index;\n\n // get rid of OCURL_CODE\n ++index;\n\n while (index < length) {\n gobbleSpaces();\n chCode = exprICode(index);\n // check for end\n if (chCode === CCURL_CODE) {\n // if we are at the end but a key was defined\n if (key) {\n throwError(\"A key was defined but a value was not\", index);\n }\n\n index++;\n closed = true;\n break;\n } else if (shouldDefineKey) {\n // check for key\n if (chCode !== SQUOTE_CODE && chCode !== DQUOTE_CODE) {\n throwError(\"An object must start wtih a key\", index);\n }\n\n // get key\n key = gobbleStringLiteral();\n // remove spaces\n gobbleSpaces();\n // remove colon\n if (exprICode(index) === COLON_CODE) {\n index++;\n shouldDefineKey = false;\n } else {\n throwError(\"A colon must follow an object key\", index);\n }\n } else {\n value = gobbleExpression();\n\n attributes.push({ key, value });\n gobbleSpaces();\n chCode = exprICode(index);\n if (chCode === COMMA_CODE) {\n index++;\n } else if (chCode !== CCURL_CODE) {\n throwError(\"Please add a comma to add another key\", index);\n }\n\n shouldDefineKey = true;\n key = undefined;\n value = undefined;\n }\n\n chCode = exprICode(index);\n }\n\n // throw error if object is not closed\n if (!closed) {\n throwError(`Unclosed brace in object`, index);\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Object\",\n attributes,\n location: getLocation(startCharIndex),\n };\n }\n\n /**\n * Push `index` up to the next non-space character\n */\n function gobbleSpaces() {\n let ch = exprICode(index);\n // Space or tab\n while (ch === 32 || ch === 9) {\n ch = exprICode(++index);\n }\n }\n\n /**\n * The main parsing function. Much of this code is dedicated to ternary expressions\n */\n function gobbleExpression(): ExpressionNode {\n const test = gobbleBinaryExpression();\n gobbleSpaces();\n const startCharIndex = index;\n\n if (index < length && exprICode(index) === QUMARK_CODE) {\n // Ternary expression: test ? consequent : alternate\n index++;\n const consequent = gobbleExpression();\n\n if (!consequent) {\n throwError(\"Expected expression\", index);\n }\n\n gobbleSpaces();\n\n if (exprICode(index) === COLON_CODE) {\n index++;\n const alternate = gobbleExpression();\n\n if (!alternate) {\n throwError(\"Expected expression\", index);\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"ConditionalExpression\",\n test,\n consequent,\n alternate,\n location: getLocation(startCharIndex),\n };\n }\n\n throwError(\"Expected :\", index);\n }\n\n return test;\n }\n\n /**\n * Search for the operation portion of the string (e.g. `+`, `===`)\n * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)\n * and move down from 3 to 2 to 1 character until a matching binary operation is found\n * then, return that binary operation\n */\n function gobbleBinaryOp() {\n gobbleSpaces();\n\n let toCheck = expr.substr(index, maxBinopLen);\n let tcLen = toCheck.length;\n\n while (tcLen > 0) {\n if (Object.prototype.hasOwnProperty.call(binaryOps, toCheck)) {\n index += tcLen;\n return toCheck;\n }\n\n toCheck = toCheck.substr(0, --tcLen);\n }\n\n return false;\n }\n\n /**\n * This function is responsible for gobbling an individual expression,\n * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`\n */\n function gobbleBinaryExpression() {\n let node;\n let prec;\n let i;\n\n // First, try to get the leftmost thing\n // Then, check to see if there's a binary operator operating on that leftmost thing\n let left = gobbleToken();\n let biop = gobbleBinaryOp();\n\n // If there wasn't a binary operator, just return the leftmost node\n if (!biop) {\n return left;\n }\n\n // Otherwise, we need to start a stack to properly place the binary operations in their\n // precedence structure\n let biopInfo = { value: biop, prec: binaryPrecedence(biop) };\n let right = gobbleToken();\n\n if (!right) {\n throwError(`Expected expression after ${biop}`, index);\n }\n\n const stack = [left, biopInfo, right];\n\n // Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)\n biop = gobbleBinaryOp();\n while (biop) {\n prec = binaryPrecedence(biop);\n\n if (prec === 0) {\n break;\n }\n\n biopInfo = { value: biop, prec };\n\n // Reduce: make a binary expression from the three topmost entries.\n while (stack.length > 2 && prec <= stack[stack.length - 2].prec) {\n right = stack.pop();\n biop = stack.pop().value;\n left = stack.pop();\n node = createBinaryExpression(\n biop,\n left,\n right,\n createSpanningLocation(left.location, right.location),\n );\n stack.push(node);\n }\n\n node = gobbleToken();\n\n if (!node) {\n throwError(`Expected expression after ${biop}`, index);\n }\n\n stack.push(biopInfo, node);\n biop = gobbleBinaryOp();\n }\n\n i = stack.length - 1;\n node = stack[i];\n\n while (i > 1) {\n node = createBinaryExpression(\n stack[i - 1].value,\n stack[i - 2],\n node,\n createSpanningLocation(stack[i - 2].location, node.location),\n );\n i -= 2;\n }\n\n return node;\n }\n\n /**\n * An individual part of a binary expression:\n * e.g. `foo.bar(baz)`, `1`, `\"abc\"`, `(a % 2)` (because it's in parenthesis)\n */\n function gobbleToken(): any {\n gobbleSpaces();\n const ch = exprICode(index);\n const startCharIndex = index;\n\n if (isDecimalDigit(ch) || ch === PERIOD_CODE) {\n // Char code 46 is a dot `.` which can start off a numeric literal\n return gobbleNumericLiteral();\n }\n\n if (ch === SQUOTE_CODE || ch === DQUOTE_CODE) {\n // Single or double quotes\n return gobbleStringLiteral();\n }\n\n if (isIdentifierStart(ch) || ch === OPAREN_CODE) {\n // Open parenthesis\n // `foo`, `bar.baz`\n return gobbleVariable();\n }\n\n if (ch === OBRACK_CODE) {\n return gobbleArray();\n }\n\n if (isModelRefStart(ch, exprICode(index + 1))) {\n return gobbleModelRef();\n }\n\n // not a double bracket: {{}} but if its a single {}\n if (ch === OCURL_CODE) {\n return gobbleObjects();\n }\n\n let toCheck = expr.substr(index, maxUnopLen);\n let tcLen = toCheck.length;\n\n while (tcLen > 0) {\n if (Object.prototype.hasOwnProperty.call(unaryOps, toCheck)) {\n index += tcLen;\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"UnaryExpression\",\n operator: toCheck,\n argument: gobbleToken(),\n prefix: true,\n location: getLocation(startCharIndex),\n };\n }\n\n toCheck = toCheck.substr(0, --tcLen);\n }\n\n return false;\n }\n\n /**\n * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to\n * keep track of everything in the numeric literal and then calling `parseFloat` on that string\n */\n function gobbleNumericLiteral() {\n let num = \"\";\n const startCharIndex = index;\n\n while (isDecimalDigit(exprICode(index))) {\n num += exprI(index++);\n }\n\n if (exprICode(index) === PERIOD_CODE) {\n // Can start with a decimal marker\n num += exprI(index++);\n\n while (isDecimalDigit(exprICode(index))) {\n num += exprI(index++);\n }\n }\n\n let ch = exprI(index);\n if (ch === \"e\" || ch === \"E\") {\n // Exponent marker\n num += exprI(index++);\n ch = exprI(index);\n\n if (ch === \"+\" || ch === \"-\") {\n // Exponent sign\n num += exprI(index++);\n }\n\n while (isDecimalDigit(exprICode(index))) {\n // Exponent itself\n num += exprI(index++);\n }\n\n if (!isDecimalDigit(exprICode(index - 1))) {\n throwError(`Expected exponent (${num}${exprI(index)})`, index);\n }\n }\n\n const chCode = exprICode(index);\n // Check to make sure this isn't a variable name that start with a number (123abc)\n if (isIdentifierStart(chCode)) {\n throwError(\n `Variable names cannot start with a number (${num}${exprI(index)})`,\n index,\n );\n } else if (chCode === PERIOD_CODE) {\n throwError(\"Unexpected period\", index);\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Literal\",\n value: parseFloat(num),\n raw: num,\n location: getLocation(startCharIndex),\n };\n }\n\n /**\n * Parses a string literal, staring with single or double quotes with basic support for escape codes\n * e.g. `\"hello world\"`, `'this is\\nJSEP'`\n */\n function gobbleStringLiteral() {\n const quote = exprI(index++);\n let str = \"\";\n let closed = false;\n const startCharIndex = index;\n\n while (index < length) {\n let ch = exprI(index++);\n\n if (ch === quote) {\n closed = true;\n break;\n }\n\n if (ch !== \"\\\\\") {\n str += ch;\n continue;\n }\n\n // Check for all of the common escape codes\n ch = exprI(index++);\n\n switch (ch) {\n case \"n\":\n str += \"\\n\";\n break;\n case \"r\":\n str += \"\\r\";\n break;\n case \"t\":\n str += \"\\t\";\n break;\n case \"b\":\n str += \"\\b\";\n break;\n case \"f\":\n str += \"\\f\";\n break;\n case \"v\":\n str += \"\\u000B\";\n break;\n default:\n }\n }\n\n if (!closed) {\n throwError(`Unclosed quote after \"${str}\"`, index);\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Literal\",\n value: str,\n raw: `${quote}${str}${quote}`,\n location: getLocation(startCharIndex),\n };\n }\n\n /**\n * Model refs are bindings wrapped in 2 sets of double curlys\n * e.g. {{foo.bar.ref}}\n */\n function gobbleModelRef() {\n let str = \"\";\n let closed = false;\n let openBraceCount = 1;\n const startCharIndex = index;\n\n index += 2; // Skip the {{\n while (index < length) {\n const ch = exprI(index++);\n\n if (ch === \"}\" && exprICode(index) === CCURL_CODE) {\n index++;\n openBraceCount--;\n\n if (openBraceCount === 0) {\n closed = true;\n break;\n }\n\n str += \"}}\";\n } else if (ch === \"{\" && exprICode(index) === OCURL_CODE) {\n openBraceCount++;\n str += \"{{\";\n index++;\n } else {\n str += ch;\n }\n }\n\n if (!closed) {\n throwError(`Unclosed brace after \"${str}\"`, index);\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"ModelRef\",\n ref: str,\n location: getLocation(startCharIndex),\n };\n }\n\n /**\n * Gobbles only identifiers\n * e.g.: `foo`, `_value`, `$x1`\n * Also, this function checks if that identifier is a literal:\n * (e.g. `true`, `false`, `null`) or `this`\n */\n function gobbleIdentifier() {\n const start = index;\n let ch = exprICode(start);\n\n if (isIdentifierStart(ch)) {\n index++;\n } else {\n throwError(`Unexpected ${exprI(index)}`, index);\n }\n\n while (index < length) {\n ch = exprICode(index);\n if (isIdentifierPart(ch)) {\n index++;\n } else {\n break;\n }\n }\n\n const identifier = expr.slice(start, index);\n\n if (Object.prototype.hasOwnProperty.call(literals, identifier)) {\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Literal\",\n value: (literals as any)[identifier],\n raw: identifier,\n location: getLocation(start),\n };\n }\n\n if (identifier === thisStr) {\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"ThisExpression\",\n location: getLocation(start),\n };\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Identifier\",\n name: identifier,\n location: getLocation(start),\n };\n }\n\n /**\n * Gobbles a list of arguments within the context of a function call\n * or array literal. This function also assumes that the opening character\n * `(` or `[` has already been gobbled, and gobbles expressions and commas\n * until the terminator character `)` or `]` is encountered.\n * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`\n */\n function gobbleArguments(termination: number) {\n const args = [];\n let charIndex;\n let node;\n\n while (index < length) {\n gobbleSpaces();\n charIndex = exprICode(index);\n\n if (charIndex === termination) {\n // Done parsing\n index++;\n break;\n }\n\n if (charIndex === COMMA_CODE) {\n // Between expressions\n index++;\n continue;\n }\n\n node = gobbleExpression();\n\n if (!node || node.type === \"Compound\") {\n throwError(\"Expected comma\", index);\n }\n\n args.push(node);\n }\n\n if (strictMode && charIndex !== termination) {\n throwError(`Expected ${String.fromCharCode(termination)}`, index);\n }\n\n return args;\n }\n\n /**\n * Gobble a non-literal variable name. This variable name may include properties\n * e.g. `foo`, `bar.baz`, `foo['bar'].baz`\n * It also gobbles function calls:\n * e.g. `Math.acos(obj.angle)`\n */\n function gobbleVariable(): ExpressionNode {\n let charIndex = exprICode(index);\n let node: any =\n charIndex === OPAREN_CODE ? gobbleGroup() : gobbleIdentifier();\n const startCharIndex = index;\n gobbleSpaces();\n charIndex = exprICode(index);\n\n while (\n charIndex === PERIOD_CODE ||\n charIndex === OBRACK_CODE ||\n charIndex === OPAREN_CODE\n ) {\n index++;\n\n if (charIndex === PERIOD_CODE) {\n gobbleSpaces();\n\n node = {\n __id: ExpNodeOpaqueIdentifier,\n type: \"MemberExpression\",\n computed: false,\n object: node,\n property: gobbleIdentifier(),\n location: getLocation(startCharIndex),\n };\n } else if (charIndex === OBRACK_CODE) {\n node = {\n __id: ExpNodeOpaqueIdentifier,\n type: \"MemberExpression\",\n computed: true,\n object: node,\n property: gobbleExpression(),\n location: getLocation(startCharIndex),\n };\n\n gobbleSpaces();\n charIndex = exprICode(index);\n\n if (charIndex !== CBRACK_CODE) {\n throwError(\"Unclosed [\", index);\n }\n\n index++;\n } else if (charIndex === OPAREN_CODE) {\n // A function call is being made; gobble all the arguments\n node = {\n __id: ExpNodeOpaqueIdentifier,\n type: \"CallExpression\",\n args: gobbleArguments(CPAREN_CODE),\n callTarget: node,\n location: getLocation(startCharIndex),\n };\n }\n\n gobbleSpaces();\n charIndex = exprICode(index);\n }\n\n return node;\n }\n\n /**\n * Responsible for parsing a group of things within parentheses `()`\n * This function assumes that it needs to gobble the opening parenthesis\n * and then tries to gobble everything within that parenthesis, assuming\n * that the next thing it should see is the close parenthesis. If not,\n * then the expression probably doesn't have a `)`\n */\n function gobbleGroup() {\n index++;\n const node = gobbleExpression();\n gobbleSpaces();\n\n if (exprICode(index) === CPAREN_CODE) {\n index++;\n return node;\n }\n\n throwError(\"Unclosed (\", index);\n }\n\n /**\n * Responsible for parsing Array literals `[1, 2, 3]`\n * This function assumes that it needs to gobble the opening bracket\n * and then tries to gobble the expressions as arguments.\n */\n function gobbleArray() {\n const startCharIndex = index;\n index++;\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"ArrayExpression\",\n elements: gobbleArguments(CBRACK_CODE),\n location: getLocation(startCharIndex),\n };\n }\n\n const nodes = [];\n\n try {\n while (index < length) {\n const chIndex = exprICode(index);\n\n // Expressions can be separated by semicolons, commas, or just inferred without any\n // separators\n if (chIndex === SEMCOL_CODE || chIndex === COMMA_CODE) {\n index++; // ignore separators\n continue;\n }\n\n const node = gobbleExpression();\n\n // Try to gobble each expression individually\n if (node) {\n nodes.push(node);\n // If we weren't able to find a binary expression and are out of room, then\n // the expression passed in probably has too much\n } else if (strictMode && index < length) {\n throwError(`Unexpected \"${exprI(index)}\"`, index);\n }\n }\n\n // If there's only one expression just try returning the expression\n if (nodes.length === 1) {\n return nodes[0];\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Compound\",\n body: nodes,\n location: getLocation(0),\n };\n } catch (e) {\n if (strictMode || !(e instanceof Error)) {\n throw e;\n }\n\n return {\n __id: ExpNodeOpaqueIdentifier,\n type: \"Compound\",\n body: nodes,\n location: getLocation(0),\n error: e,\n };\n }\n}\n","import type { Binding } from \"@player-ui/types\";\n\nimport type { BindingLike } from \"../binding\";\nimport type {\n ExpressionHandler,\n ExpressionContext,\n ExpressionNode,\n} from \"./types\";\n\n/** Sets a value to the data-model */\nexport const setDataVal: ExpressionHandler<[Binding, any], any> = (\n _context: ExpressionContext,\n binding,\n value,\n) => {\n _context.model.set([[binding as BindingLike, value]]);\n};\n\n/** Fetches a valid from the data-model */\nexport const getDataVal: ExpressionHandler<[Binding], unknown> = (\n _context: ExpressionContext,\n binding,\n) => {\n return _context.model.get(binding as BindingLike);\n};\n\n/** Deletes a value from the model */\nexport const deleteDataVal: ExpressionHandler<[Binding], void> = (\n _context: ExpressionContext,\n binding,\n) => {\n return _context.model.delete(binding);\n};\n\n/** Conditional expression handler */\nexport const conditional: ExpressionHandler<\n [ExpressionNode, ExpressionNode, ExpressionNode?]\n> = (ctx, condition, ifTrue, ifFalse) => {\n const resolution = ctx.evaluate(condition);\n if (resolution) {\n return ctx.evaluate(ifTrue);\n }\n\n if (ifFalse) {\n return ctx.evaluate(ifFalse);\n }\n\n return null;\n};\n\nconditional.resolveParams = false;\n","import { isExpressionNode } from \"./types\";\nimport type {\n ErrorWithLocation,\n ExpressionHandler,\n ExpressionNode,\n ExpressionObjectType,\n ExpressionType,\n NodeLocation,\n NodePosition,\n} from \"./types\";\n\n/** Generates a function by removing the first context argument */\nexport function withoutContext<T extends unknown[], Return>(\n fn: (...args: T) => Return,\n): ExpressionHandler<T, Return> {\n return (_context, ...args) => fn(...args);\n}\n\n/** Checks if the location includes the target position */\nfunction isInRange(position: NodePosition, location: NodeLocation) {\n return (\n position.character >= location.start.character &&\n position.character <= location.end.character\n );\n}\n\n/** Get the node in the expression that's closest to the desired position */\nexport function findClosestNodeAtPosition(\n node: ExpressionNode,\n position: NodePosition,\n): ExpressionNode | undefined {\n // This is just mapping recursively over nodes in the tree\n\n // eslint-disable-next-line default-case\n switch (node.type) {\n case \"Modification\":\n case \"Assignment\":\n case \"LogicalExpression\":\n case \"BinaryExpression\": {\n const check =\n findClosestNodeAtPosition(node.left, position) ??\n findClosestNodeAtPosition(node.right, position);\n if (check) {\n return check;\n }\n\n break;\n }\n\n case \"UnaryExpression\": {\n const checkArg = findClosestNodeAtPosition(node.argument, position);\n if (checkArg) {\n return checkArg;\n }\n\n break;\n }\n\n case \"MemberExpression\": {\n const checkObject =\n findClosestNodeAtPosition(node.object, position) ??\n findClosestNodeAtPosition(node.property, position);\n if (checkObject) {\n return checkObject;\n }\n\n break;\n }\n\n case \"ConditionalExpression\": {\n const checkObject =\n findClosestNodeAtPosition(node.test, position) ??\n findClosestNodeAtPosition(node.consequent, position) ??\n findClosestNodeAtPosition(node.alternate, position);\n if (checkObject) {\n return checkObject;\n }\n\n break;\n }\n\n case \"ArrayExpression\":\n case \"Compound\": {\n const elements =\n node.type === \"ArrayExpression\" ? node.elements : node.body;\n\n const anyElements = elements.find((e) =>\n findClosestNodeAtPosition(e, position),\n );\n\n if (anyElements) {\n return anyElements;\n }\n\n break;\n }\n\n case \"Object\": {\n const checkObject = node.attributes.reduce<ExpressionNode | undefined>(\n (found, next) => {\n return (\n found ??\n findClosestNodeAtPosition(next.key, position) ??\n findClosestNodeAtPosition(next.value, position)\n );\n },\n undefined,\n );\n\n if (checkObject) {\n return checkObject;\n }\n\n break;\n }\n\n case \"CallExpression\": {\n const anyArgs =\n node.args.find((arg) => {\n return findClosestNodeAtPosition(arg, position);\n }) ?? findClosestNodeAtPosition(node.callTarget, position);\n\n if (anyArgs) {\n return anyArgs;\n }\n\n break;\n }\n }\n\n // Lastly check for yourself\n if (node.location && isInRange(position, node.location)) {\n return node;\n }\n}\n\n/** Checks if the expression is a simple type */\nexport function isObjectExpression(\n expr: ExpressionType,\n): expr is ExpressionObjectType {\n if (isExpressionNode(expr)) {\n return false;\n }\n\n return (\n typeof expr === \"object\" &&\n expr !== null &&\n !Array.isArray(expr) &&\n \"value\" in expr\n );\n}\n\n/**\n * Type guard for ErrorWithLocation\n */\nexport function isErrorWithLocation(error: Error): error is ErrorWithLocation {\n return (\n (error as ErrorWithLocation).index !== undefined &&\n (error as ErrorWithLocation).description !== undefined\n );\n}\n","import { SyncHook } from \"tapable-ts\";\nimport type { Logger, Severity } from \"./types\";\n\n/** A logger that has a tapable subscriptions to callbacks */\nexport default class TapableLogger implements Logger {\n public readonly hooks = {\n trace: new SyncHook<[Array<any>]>(),\n debug: new SyncHook<[Array<any>]>(),\n info: new SyncHook<[Array<any>]>(),\n warn: new SyncHook<[Array<any>]>(),\n error: new SyncHook<[Array<any>]>(),\n log: new SyncHook<[Severity, Array<any>]>(),\n };\n\n private logHandlers: Set<Logger> = new Set();\n\n private createHandler(severity: Severity): (...args: any[]) => void {\n return (...args: any[]) => {\n this.hooks[severity].call(args);\n this.hooks.log.call(severity, args);\n this.logHandlers.forEach((logger) => logger[severity](...args));\n };\n }\n\n public addHandler(logHandler: Logger) {\n this.logHandlers.add(logHandler);\n }\n\n public removeHandler(logHandler: Logger) {\n this.logHandlers.delete(logHandler);\n }\n\n public readonly trace = this.createHandler(\"trace\");\n public readonly debug = this.createHandler(\"debug\");\n public readonly info = this.createHandler(\"info\");\n public readonly warn = this.createHandler(\"warn\");\n public readonly error = this.createHandler(\"error\");\n}\n","import type { Logger, Severity, LoggerProvider } from \"./types\";\n\n/**\n * The ProxyLogger allows a user to log to another Logger instance that may not exist yet\n */\nexport default class ProxyLogger implements Logger {\n private proxiedLoggerProvider: LoggerProvider;\n\n constructor(loggerProvider: LoggerProvider) {\n this.proxiedLoggerProvider = loggerProvider;\n }\n\n private createHandler(severity: Severity): (...args: any[]) => void {\n return (...args: any[]) => {\n const logger = this.proxiedLoggerProvider();\n logger?.[severity](...args);\n };\n }\n\n public readonly trace = this.createHandler(\"trace\");\n public readonly debug = this.createHandler(\"debug\");\n public readonly info = this.createHandler(\"info\");\n public readonly warn = this.createHandler(\"warn\");\n public readonly error = this.createHandler(\"error\");\n}\n","import { SyncWaterfallHook } from \"tapable-ts\";\nimport type { Schema as SchemaType, Formatting } from \"@player-ui/types\";\n\nimport type { BindingInstance } from \"../binding\";\nimport type { ValidationProvider, ValidationObject } from \"../validator\";\nimport type { FormatDefinition, FormatOptions, FormatType } from \"./types\";\n\n/** A function that returns itself */\nconst identify = (val: any) => val;\n\n/** Expand the authored schema into a set of paths -> DataTypes */\nexport function parse(\n schema: SchemaType.Schema,\n): Map<string, SchemaType.DataTypes> {\n const expandedPaths = new Map<string, SchemaType.DataTypes>();\n\n if (!schema.ROOT) {\n return expandedPaths;\n }\n\n const parseQueue: Array<{\n /** The node to process */\n node: SchemaType.Node;\n\n /** The path in the data-model this node represents */\n path: Array<string>;\n\n /** A set of visited DataTypes to prevent loops */\n visited: Set<string>;\n }> = [{ node: schema.ROOT, path: [], visited: new Set() }];\n\n while (parseQueue.length > 0) {\n const next = parseQueue.shift();\n\n if (!next) {\n break;\n }\n\n const { node, path, visited } = next;\n\n Object.entries(node).forEach(([prop, type]) => {\n const nestedPath = [...path, prop];\n\n const nestedPathStr = nestedPath.join(\".\");\n\n if (expandedPaths.has(nestedPathStr)) {\n // We've gone in a loop. Panic\n throw new Error(\n \"Path has already been processed. There's either a loop somewhere or a bug\",\n );\n }\n\n if (visited.has(type.type)) {\n throw new Error(\n `Path already contained type: ${type.type}. This likely indicates a loop in the schema`,\n );\n }\n\n expandedPaths.set(nestedPathStr, type);\n\n if (type.isArray) {\n nestedPath.push(\"[]\");\n }\n\n if (type.isRecord) {\n nestedPath.push(\"{}\");\n }\n\n if (type.type && schema[type.type]) {\n parseQueue.push({\n path: nestedPath,\n node: schema[type.type],\n visited: new Set([...visited, type.type]),\n });\n }\n });\n }\n\n return expandedPaths;\n}\n\n/**\n * The Schema is the central hub for all data invariants, and metaData associated with the data-model itself\n * Outside of the types defined in the JSON payload, it doesn't manage or keep any state.\n * It simply servers as an orchestrator for other modules to interface w/ the schema.\n */\nexport class SchemaController implements ValidationProvider {\n private formatters: Map<string, FormatType<any, any, FormatOptions>> =\n new Map();\n\n private types: Map<string, SchemaType.DataType<any>> = new Map();\n public readonly schema: Map<string, SchemaType.DataTypes> = new Map();\n\n private bindingSchemaNormalizedCache: Map<BindingInstance, string> =\n new Map();\n\n public readonly hooks = {\n resolveTypeForBinding: new SyncWaterfallHook<\n [SchemaType.DataTypes | undefined, BindingInstance]\n >(),\n };\n\n constructor(schema?: SchemaType.Schema) {\n this.schema = schema ? parse(schema) : new Map();\n }\n\n public addFormatters(fns: Array<FormatType<any, any, FormatOptions>>) {\n fns.forEach((def) => {\n this.formatters.set(def.name, def);\n });\n }\n\n public addDataTypes(types: Array<SchemaType.DataType<any>>) {\n types.forEach((t) => {\n this.types.set(t.type, t);\n });\n }\n\n getValidationsForBinding(\n binding: BindingInstance,\n ): Array<ValidationObject> | undefined {\n const typeDef = this.getApparentType(binding);\n\n if (!typeDef?.validation?.length) {\n return undefined;\n }\n\n // Set the defaults for schema-level validations\n return typeDef.validation.map((vRef) => ({\n severity: \"error\",\n trigger: \"change\",\n ...vRef,\n }));\n }\n\n private normalizeBinding(binding: BindingInstance): string {\n const cached = this.bindingSchemaNormalizedCache.get(binding);\n if (cached) {\n return cached;\n }\n\n let bindingArray = binding.asArray();\n let normalized = bindingArray\n .map((p) => (typeof p === \"number\" ? \"[]\" : p))\n .join(\".\");\n\n if (normalized) {\n this.bindingSchemaNormalizedCache.set(binding, normalized);\n bindingArray = normalized.split(\".\");\n }\n\n bindingArray.forEach((item) => {\n const recordBinding = bindingArray\n .map((p) => (p === item ? \"{}\" : p))\n .join(\".\");\n\n if (this.schema.get(recordBinding)) {\n this.bindingSchemaNormalizedCache.set(binding, recordBinding);\n bindingArray = recordBinding.split(\".\");\n normalized = recordBinding;\n }\n });\n\n return normalized;\n }\n\n public getType(binding: BindingInstance): SchemaType.DataTypes | undefined {\n return this.hooks.resolveTypeForBinding.call(\n this.schema.get(this.normalizeBinding(binding)),\n binding,\n );\n }\n\n public getApparentType(\n binding: BindingInstance,\n ): SchemaType.DataTypes | undefined {\n const schemaType = this.getType(binding);\n\n if (schemaType === undefined) {\n return undefined;\n }\n\n const baseType = this.getTypeDefinition(schemaType?.type);\n\n if (baseType === undefined) {\n return schemaType;\n }\n\n return {\n ...baseType,\n ...schemaType,\n validation: [\n ...(schemaType.validation ?? []),\n ...(baseType.validation ?? []),\n ],\n };\n }\n\n public getTypeDefinition(dataType: string) {\n return this.types.get(dataType);\n }\n\n public getFormatterForType(\n formatReference: Formatting.Reference,\n ): FormatDefinition<unknown, unknown> | undefined {\n const { type: formatType, ...options } = formatReference;\n\n const formatter = this.formatters.get(formatType);\n\n if (!formatter) {\n return;\n }\n\n return {\n format: formatter.format\n ? (val) => formatter.format?.(val, options)\n : identify,\n deformat: formatter.deformat\n ? (val) => formatter.deformat?.(val, options)\n : identify,\n };\n }\n\n /**\n * Given a binding, fetch a function that's responsible for formatting, and/or de-formatting the data\n * If no formatter is registered, it will return undefined\n */\n public getFormatter(\n binding: BindingInstance,\n ): FormatDefinition<unknown, unknown> | undefined {\n const type = this.getApparentType(binding);\n\n if (!type?.format) {\n return undefined;\n }\n\n return this.getFormatterForType(type.format);\n }\n}\n","import type { BindingInstance } from \"../binding\";\n\n/**\n * Remove a binding, and any children from from the map\n * If the binding is an array-item, then it will be spliced from the array and the others will be shifted down\n *\n * @param sourceMap - A map of bindings to values\n * @param binding - The binding to remove from the map\n */\nexport function removeBindingAndChildrenFromMap<T>(\n sourceMap: Map<BindingInstance, T>,\n binding: BindingInstance,\n): Map<BindingInstance, T> {\n const targetMap = new Map(sourceMap);\n\n const parentBinding = binding.parent();\n const property = binding.key();\n\n // Clear out any that are sub-bindings of this binding\n\n targetMap.forEach((_value, trackedBinding) => {\n if (binding === trackedBinding || binding.contains(trackedBinding)) {\n targetMap.delete(trackedBinding);\n }\n });\n\n if (typeof property === \"number\") {\n // Splice out this index from the rest\n\n // Order matters here b/c we are shifting items in the array\n // Start with the smallest index and work our way down\n const bindingsToRewrite = Array.from(sourceMap.keys())\n .filter((b) => {\n if (parentBinding.contains(b)) {\n const [childIndex] = b.relative(parentBinding);\n return typeof childIndex === \"number\" && childIndex > property;\n }\n\n return false;\n })\n .sort();\n\n bindingsToRewrite.forEach((trackedBinding) => {\n // If the tracked binding is a sub-binding of the parent binding, then we need to\n // update the path to reflect the new index\n\n const [childIndex, ...childPath] = trackedBinding.relative(parentBinding);\n\n if (typeof childIndex === \"number\") {\n const newSegments = [childIndex - 1, ...childPath];\n const newChildBinding = parentBinding.descendent(newSegments);\n targetMap.set(newChildBinding, targetMap.get(trackedBinding) as T);\n targetMap.delete(trackedBinding);\n }\n });\n }\n\n return targetMap;\n}\n","import type { ValidatorFunction } from \"./types\";\n\n/** A registry that tracks validators */\nexport class ValidatorRegistry {\n private registry: Map<string, ValidatorFunction<any>>;\n\n constructor() {\n this.registry = new Map();\n }\n\n /** Use the given validator name to fetch the handler */\n public get(name: string): ValidatorFunction | undefined {\n return this.registry.get(name);\n }\n\n /** Register a new validator */\n public register<T>(name: string, handler: ValidatorFunction<T>) {\n this.registry.set(name, handler);\n }\n}\n","import type { Asset as AssetType, Expression, Binding } from \"@player-ui/types\";\n\nexport type AnyAssetType = AssetType<string>;\nexport enum NodeType {\n Asset = \"asset\",\n View = \"view\",\n Applicability = \"applicability\",\n Template = \"template\",\n Value = \"value\",\n MultiNode = \"multi-node\",\n Switch = \"switch\",\n Async = \"async\",\n Unknown = \"unknown\",\n Empty = \"empty\",\n}\nexport declare namespace Node {\n export type ChildrenTypes = NodeType.Asset | NodeType.Value | NodeType.View;\n\n export interface Base<T extends NodeType> {\n /** Every node contains a type to distinguish it from other nodes */\n type: T;\n\n /** Every node (outside of the root) contains a reference to it's parent */\n parent?: Node;\n }\n\n export type PathSegment = string | number;\n\n export interface Child {\n /** The path of the child relative to the parent */\n path: PathSegment[];\n\n /** If true, the path points to an array, and the value will be appended to it result */\n array?: boolean;\n\n /** The child node */\n value: Node;\n }\n\n export interface BaseWithChildren<T extends NodeType> extends Base<T> {\n /** Any node that contains a list of children underneath it */\n children?: Child[];\n }\n\n export interface Asset<T extends AnyAssetType = AnyAssetType>\n extends BaseWithChildren<NodeType.Asset>,\n PluginOptions {\n /** Any asset nested within a view */\n value: T;\n }\n\n export interface View<T extends AnyAssetType = AnyAssetType>\n extends BaseWithChildren<NodeType.View>,\n PluginOptions {\n /** The root of the parsed view */\n value: T;\n }\n\n export interface Applicability extends Base<NodeType.Applicability> {\n /** The expression to execute that determines applicability of the target node */\n expression: Expression;\n\n /** The node to use if the expression is truthy */\n value: Node;\n }\n\n export interface Template extends Base<NodeType.Template> {\n /** The location of an array in the model */\n data: Binding;\n\n /** The template to use when mapping over the data */\n template: unknown;\n\n /** The number of nested templates so far */\n depth: number;\n\n /** should the template recomputed when data changes */\n dynamic?: boolean;\n }\n\n export interface Value\n extends BaseWithChildren<NodeType.Value>,\n PluginOptions {\n /** A simple node representing a value */\n value: any;\n }\n\n export interface MultiNode extends Base<NodeType.MultiNode> {\n /**\n * Should this list override the target node if they overlap?\n * If not amend the existing list\n */\n override?: boolean;\n\n /** A list of values that comprise this node */\n values: Array<Node>;\n }\n\n export interface Switch extends Base<NodeType.Switch> {\n /** Should this list be re-computed when data changes */\n dynamic?: boolean;\n\n /** A list of cases to evaluate in order */\n cases: SwitchCase[];\n }\n\n export interface SwitchCase {\n /** The expression to evaluate for a single case statement */\n case: Expression | true;\n /** The value to use if this case is true */\n value: Value;\n }\n\n export interface Async extends Base<NodeType.Async> {\n /** The unique id of the node */\n id: string;\n /** The value representing the node */\n value: Node;\n }\n\n export interface PluginOptions {\n /** A list of plugins */\n plugins?: {\n /** StringResolverPlugin options */\n stringResolver?: {\n /**\n * An optional array of node properties to skip during string resolution\n * Specified in the AssetTransformPlugin\n */\n propertiesToSkip?: string[];\n };\n };\n }\n\n export type Unknown = Base<NodeType.Unknown>;\n export type Empty = Base<NodeType.Empty>;\n export type ViewOrAsset = View | Asset;\n\n export type Node =\n | Asset\n | Applicability\n | Template\n | Value\n | View\n | MultiNode\n | Switch\n | Async\n | Unknown\n | Empty;\n}\n","import type { Node } from \"./types\";\n\n/**\n * Checks if there are templated values in the object\n *\n * @param obj - The Parsed Object to check to see if we have a template array type for\n * @param localKey - The key being checked\n */\nexport function hasTemplateValues(obj: any, localKey: string) {\n return (\n Object.hasOwnProperty.call(obj, \"template\") &&\n Array.isArray(obj?.template) &&\n obj.template.length &&\n obj.template.find((tmpl: any) => tmpl.output === localKey)\n );\n}\n\n/** Check to see if the string is a valid switch key */\nexport function hasSwitchKey(localKey: string) {\n return localKey === \"staticSwitch\" || localKey === \"dynamicSwitch\";\n}\n\n/** Check to see if the string is a valid template key */\nexport function hasTemplateKey(localKey: string) {\n return localKey === \"template\";\n}\n\n/** Get the ID of the Node if there is one */\nexport function getNodeID(node?: Node.Node | null): string | undefined {\n if (!node) {\n return;\n }\n\n if (\n \"value\" in node &&\n typeof node.value === \"object\" &&\n typeof node.value?.id === \"string\"\n ) {\n return node.value.id;\n }\n}\n","import type { BindingInstance, BindingLike } from \"../../binding\";\nimport { isBinding } from \"../../binding\";\nimport type { ExpressionType } from \"../../expressions\";\nimport type { Resolve } from \"./types\";\n\n/** Check to see if and of the data-changes affect the given dependencies */\nexport function caresAboutDataChanges(\n dataChanges?: Set<BindingInstance>,\n dependencies?: Set<BindingInstance>,\n) {\n if (!dataChanges || !dependencies) {\n return true;\n }\n\n const depArray = Array.from(dependencies.values());\n const dataChangeArray = Array.from(dataChanges.values());\n\n return (\n depArray.find(\n (dep) =>\n !!dataChangeArray.find(\n (change) =>\n change === dep || change.contains(dep) || dep.contains(change),\n ),\n ) !== undefined\n );\n}\n\n/** Convert the options object for a resolver to one for a node */\nexport function toNodeResolveOptions(\n resolverOptions: Resolve.ResolverOptions,\n): Resolve.NodeResolveOptions {\n return {\n ...resolverOptions,\n data: {\n model: resolverOptions.model,\n formatValue: (ref, value) => {\n if (resolverOptions.formatValue) {\n return resolverOptions.formatValue(ref, value);\n }\n\n return value;\n },\n format: (bindingLike: BindingLike, value: any) =>\n resolverOptions.format\n ? resolverOptions.format(\n isBinding(bindingLike)\n ? bindingLike\n : resolverOptions.parseBinding(bindingLike),\n value,\n )\n : value,\n },\n evaluate: (exp: ExpressionType) =>\n resolverOptions.evaluator.evaluate(exp, resolverOptions),\n };\n}\n\n/**\n * helper function to flatten a potential nested array and combine with initial array\n */\nexport function unpackAndPush(item: any | any[], initial: any[]) {\n if (Array.isArray(item)) {\n item.forEach((i) => {\n unpackAndPush(i, initial);\n });\n } else {\n initial.push(item);\n }\n}\n","import { SyncHook } from \"tapable-ts\";\nimport type { View as ViewType } from \"@player-ui/types\";\nimport type { BindingInstance, BindingFactory } from \"../binding\";\nimport type { ValidationProvider, ValidationObject } from \"../validator\";\nimport type { Logger } from \"../logger\";\nimport type { Resolve } from \"./resolver\";\nimport { Resolver } from \"./resolver\";\nimport type { Node } from \"./parser\";\nimport { Parser } from \"./parser\";\nimport { TemplatePlugin } from \"./plugins\";\n\n/**\n * Manages the view level validations\n */\nclass CrossfieldProvider implements ValidationProvider {\n private allValidations = new Set<ValidationObject>();\n private byBinding = new Map<BindingInstance, Array<ValidationObject>>();\n private logger?: Logger;\n\n constructor(initialView: ViewType, parser: BindingFactory, logger?: Logger) {\n this.logger = logger;\n this.parse(initialView, parser);\n }\n\n private parse(contentView: ViewType, parser: BindingFactory) {\n const xfieldRefs = contentView.validation;\n\n if (xfieldRefs === undefined) {\n return;\n }\n\n if (!Array.isArray(xfieldRefs)) {\n this.logger?.warn(\n `Unable to register view validations for id: ${contentView.id}. 'validation' property must be an Array.`,\n );\n\n return;\n }\n\n // Grab the validations from the view (as authored) and parse out the ones that have a _ref_ (to a binding)\n // Group them all by binding to make it easier to return than later\n\n xfieldRefs.forEach((vRef) => {\n // x-field validations by default are triggered by navigating away from the page\n // the reference can also override that _or_ the severity\n const withDefaults: ValidationObject = {\n trigger: \"navigation\",\n severity: \"error\",\n ...vRef,\n };\n\n this.allValidations.add(withDefaults);\n\n // The validation reference contains a _ref_ (a binding)\n const { ref } = vRef;\n\n if (ref) {\n /** Group together validations by binding */\n const parsed = parser(ref);\n\n if (this.byBinding.has(parsed)) {\n this.byBinding.get(parsed)?.push(withDefaults);\n } else {\n this.byBinding.set(parsed, [withDefaults]);\n }\n }\n });\n }\n\n getValidationsForBinding(binding: BindingInstance) {\n return this.byBinding.get(binding);\n }\n}\n\n/** A stateful view instance from an content */\nexport class ViewInstance implements ValidationProvider {\n public hooks = {\n onUpdate: new SyncHook<[ViewType]>(),\n parser: new SyncHook<[Parser]>(),\n resolver: new SyncHook<[Resolver]>(),\n onTemplatePluginCreated: new SyncHook<[TemplatePlugin]>(),\n templatePlugin: new SyncHook<[TemplatePlugin]>(),\n };\n\n private resolver?: Resolver;\n public readonly initialView: ViewType;\n public readonly resolverOptions: Resolve.ResolverOptions;\n private rootNode?: Node.Node;\n\n private validationProvider?: CrossfieldProvider;\n\n private templatePlugin: TemplatePlugin | undefined;\n\n // TODO might want to add a version/timestamp to this to compare updates\n public lastUpdate: Record<string, any> | undefined;\n\n constructor(initialView: ViewType, resolverOptions: Resolve.ResolverOptions) {\n this.initialView = initialView;\n this.resolverOptions = resolverOptions;\n this.hooks.onTemplatePluginCreated.tap(\"view\", (templatePlugin) => {\n this.templatePlugin = templatePlugin;\n });\n }\n\n public updateAsync() {\n const update = this.resolver?.update();\n this.lastUpdate = update;\n this.hooks.onUpdate.call(update);\n }\n\n public update(changes?: Set<BindingInstance>) {\n if (this.rootNode === undefined) {\n /** On initialization of the view, also create a validation parser */\n this.validationProvider = new CrossfieldProvider(\n this.initialView,\n this.resolverOptions.parseBinding,\n this.resolverOptions.logger,\n );\n\n if (this.templatePlugin) {\n this.hooks.templatePlugin.call(this.templatePlugin);\n } else {\n this.resolverOptions.logger?.warn(\n \"templatePlugin not set for View, legacy templates may not work\",\n );\n }\n\n const parser = new Parser();\n this.hooks.parser.call(parser);\n this.rootNode = parser.parseView(this.initialView);\n\n this.resolver = new Resolver(this.rootNode, {\n ...this.resolverOptions,\n parseNode: parser.parseObject.bind(parser),\n });\n this.hooks.resolver.call(this.resolver);\n }\n\n const update = this.resolver?.update(changes);\n\n if (this.lastUpdate === update) {\n return this.lastUpdate;\n }\n\n this.lastUpdate = update;\n this.hooks.onUpdate.call(update);\n\n return update;\n }\n\n getValidationsForBinding(binding: BindingInstance) {\n return this.validationProvider?.getValidationsForBinding(binding);\n }\n}\n\n/** A plugin for a view */\nexport interface ViewPlugin {\n /** Called with a view instance */\n apply(view: ViewInstance): void;\n}\n","import { SyncWaterfallHook } from \"tapable-ts\";\nimport type { Template } from \"@player-ui/types\";\nimport type {\n Node,\n ParseObjectOptions,\n ParseObjectChildOptions,\n Parser,\n} from \"../parser\";\nimport { NodeType } from \"../parser\";\nimport { ViewInstance, ViewPlugin } from \"../view\";\nimport type { Options } from \"./options\";\nimport type { Resolver } from \"../resolver\";\nimport { hasTemplateKey } from \"../parser/utils\";\n\nexport interface TemplateItemInfo {\n /** The index of the data for the current iteration of the template */\n index: number;\n /** The data for the current iteration of the template */\n data: any;\n /** The depth of the template node */\n depth: number;\n}\n\nexport interface TemplateSubstitution {\n /** Regular expression to find and replace. The global flag will be always be added to this expression. */\n expression: string | RegExp;\n /** The value to replace matches with. */\n value: string;\n}\n\nexport type TemplateSubstitutionsFunc = (\n baseSubstitutions: TemplateSubstitution[],\n templateItemInfo: TemplateItemInfo,\n) => TemplateSubstitution[];\n\n/** A view plugin to resolve/manage templates */\nexport default class TemplatePlugin implements ViewPlugin {\n private readonly options: Options;\n\n hooks = {\n resolveTemplateSubstitutions: new SyncWaterfallHook<\n [TemplateSubstitution[], TemplateItemInfo]\n >(),\n };\n\n constructor(options: Options) {\n this.options = options;\n }\n\n private parseTemplate(\n parseObject: any,\n node: Node.Template,\n options: Options,\n ): Node.Node | null {\n const { template, depth } = node;\n const data = options.data.model.get(node.data);\n\n if (!data) {\n return null;\n }\n\n if (!Array.isArray(data)) {\n throw new Error(`Template using '${node.data}' but is not an array`);\n }\n\n const values: Array<Node.Node> = [];\n\n data.forEach((dataItem, index) => {\n const templateSubstitutions =\n this.hooks.resolveTemplateSubstitutions.call(\n [\n {\n expression: new RegExp(`_index${depth || \"\"}_`),\n value: String(index),\n },\n ],\n {\n depth,\n data: dataItem,\n index,\n },\n );\n let templateStr = JSON.stringify(template);\n\n for (const { expression, value } of templateSubstitutions) {\n let flags = \"g\";\n if (typeof expression === \"object\") {\n flags = `${expression.flags}${expression.global ? \"\" : \"g\"}`;\n }\n\n templateStr = templateStr.replace(new RegExp(expression, flags), value);\n }\n\n const parsed = parseObject(JSON.parse(templateStr), NodeType.Value, {\n templateDepth: node.depth + 1,\n });\n\n if (parsed) {\n values.push(parsed);\n }\n });\n\n const result: Node.MultiNode = {\n type: NodeType.MultiNode,\n override: false,\n values,\n };\n\n return result;\n }\n\n applyParser(parser: Parser) {\n parser.hooks.onCreateASTNode.tap(\"template\", (node) => {\n if (node && node.type === NodeType.Template && !node.dynamic) {\n return this.parseTemplate(\n parser.parseObject.bind(parser),\n node,\n this.options,\n );\n }\n\n return node;\n });\n\n parser.hooks.parseNode.tap(\n \"template\",\n (\n obj: any,\n _nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ) => {\n if (childOptions && hasTemplateKey(childOptions.key)) {\n return obj\n .map((template: Template) => {\n const templateAST = parser.createASTNode(\n {\n type: NodeType.Template,\n depth: options.templateDepth ?? 0,\n data: template.data,\n template: template.value,\n dynamic: template.dynamic ?? false,\n },\n template,\n );\n\n if (!templateAST) return;\n\n if (templateAST.type === NodeType.MultiNode) {\n templateAST.values.forEach((v) => {\n v.parent = templateAST;\n });\n }\n\n return {\n path: [...childOptions.path, template.output],\n value: templateAST,\n };\n })\n .filter(Boolean);\n }\n },\n );\n }\n\n applyResolverHooks(resolver: Resolver) {\n resolver.hooks.beforeResolve.tap(\"template\", (node, options) => {\n if (node && node.type === NodeType.Template && node.dynamic) {\n return this.parseTemplate(options.parseNode, node, options);\n }\n\n return node;\n });\n }\n\n apply(view: ViewInstance) {\n view.hooks.parser.tap(\"template\", this.applyParser.bind(this));\n view.hooks.resolver.tap(\"template\", this.applyResolverHooks.bind(this));\n }\n}\n","import { ViewInstance, ViewPlugin } from \"../view\";\nimport type { Options } from \"./options\";\nimport type {\n Parser,\n Node,\n ParseObjectOptions,\n ParseObjectChildOptions,\n} from \"../parser\";\nimport { EMPTY_NODE, NodeType } from \"../parser\";\nimport type { Resolver } from \"../resolver\";\nimport { hasSwitchKey } from \"../parser/utils\";\n\n/** A view plugin to resolve switches */\nexport default class SwitchPlugin implements ViewPlugin {\n private readonly options: Options;\n\n constructor(options: Options) {\n this.options = options;\n }\n\n private resolveSwitch(node: Node.Switch, options: Options): Node.Node {\n for (const switchCase of node.cases) {\n const isApplicable = options.evaluate(switchCase.case);\n if (isApplicable) {\n return switchCase.value;\n }\n }\n\n return EMPTY_NODE;\n }\n\n private isSwitch(obj: any) {\n return (\n obj &&\n (Object.prototype.hasOwnProperty.call(obj, \"dynamicSwitch\") ||\n Object.prototype.hasOwnProperty.call(obj, \"staticSwitch\"))\n );\n }\n\n applyParser(parser: Parser) {\n /** Switches resolved during the parsing phase are static */\n parser.hooks.onCreateASTNode.tap(\"switch\", (node) => {\n if (node && node.type === NodeType.Switch && !node.dynamic) {\n return this.resolveSwitch(node, this.options);\n }\n\n return node;\n });\n\n parser.hooks.parseNode.tap(\n \"switch\",\n (\n obj: any,\n _nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ) => {\n if (\n this.isSwitch(obj) ||\n (childOptions && hasSwitchKey(childOptions.key))\n ) {\n const objToParse =\n childOptions && hasSwitchKey(childOptions.key)\n ? { [childOptions.key]: obj }\n : obj;\n const dynamic = \"dynamicSwitch\" in objToParse;\n const switchContent = dynamic\n ? objToParse.dynamicSwitch\n : objToParse.staticSwitch;\n\n const cases: Node.SwitchCase[] = switchContent\n .map(\n (switchCase: {\n [x: string]: any;\n /**\n *\n */\n case: any;\n }) => {\n const { case: switchCaseExpr, ...switchBody } = switchCase;\n const value = parser.parseObject(\n switchBody,\n NodeType.Value,\n options,\n );\n\n if (value) {\n return {\n case: switchCaseExpr,\n value: value as Node.Value,\n };\n }\n\n return;\n },\n )\n .filter(Boolean);\n\n const switchAST = parser.createASTNode(\n {\n type: NodeType.Switch,\n dynamic,\n cases,\n },\n objToParse,\n );\n\n if (!switchAST || switchAST.type === NodeType.Empty) {\n return childOptions ? [] : null;\n }\n\n if (switchAST.type === NodeType.Switch) {\n switchAST.cases.forEach((sCase) => {\n sCase.value.parent = switchAST;\n });\n }\n\n if (childOptions) {\n let path = [...childOptions.path, childOptions.key];\n let value: any = switchAST;\n\n if (\n switchAST.type === NodeType.Value &&\n switchAST.children?.length === 1 &&\n switchAST.value === undefined\n ) {\n const firstChild = switchAST.children[0];\n path = [...path, ...firstChild.path];\n value = firstChild.value;\n }\n\n return [{ path, value }];\n }\n\n return switchAST;\n }\n },\n );\n }\n\n applyResolver(resolver: Resolver) {\n /** Switches resolved during the parsing phase are dynamic */\n resolver.hooks.beforeResolve.tap(\"switch\", (node, options) => {\n if (node && node.type === NodeType.Switch && node.dynamic) {\n return this.resolveSwitch(node, options);\n }\n\n return node;\n });\n }\n\n apply(view: ViewInstance) {\n view.hooks.parser.tap(\"switch\", this.applyParser.bind(this));\n view.hooks.resolver.tap(\"switch\", this.applyResolver.bind(this));\n }\n}\n","import { ViewInstance, ViewPlugin } from \"../view\";\nimport type {\n Parser,\n Node,\n ParseObjectOptions,\n ParseObjectChildOptions,\n} from \"../parser\";\nimport { NodeType } from \"../parser\";\nimport { hasTemplateValues, hasTemplateKey } from \"../parser/utils\";\n\n/** A view plugin to resolve multi nodes */\nexport default class MultiNodePlugin implements ViewPlugin {\n applyParser(parser: Parser) {\n parser.hooks.parseNode.tap(\n \"multi-node\",\n (\n obj: any,\n nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ) => {\n if (\n childOptions &&\n !hasTemplateKey(childOptions.key) &&\n Array.isArray(obj)\n ) {\n const values = obj\n .map((childVal) =>\n parser.parseObject(childVal, NodeType.Value, options),\n )\n .filter((child): child is Node.Node => !!child);\n\n if (!values.length) {\n return [];\n }\n\n const multiNode = parser.createASTNode(\n {\n type: NodeType.MultiNode,\n override: !hasTemplateValues(\n childOptions.parentObj,\n childOptions.key,\n ),\n values,\n },\n obj,\n );\n\n if (!multiNode) {\n return [];\n }\n\n if (multiNode.type === NodeType.MultiNode) {\n multiNode.values.forEach((v) => {\n v.parent = multiNode;\n });\n }\n\n return [\n {\n path: [...childOptions.path, childOptions.key],\n value: multiNode,\n },\n ];\n }\n },\n );\n }\n\n apply(view: ViewInstance) {\n view.hooks.parser.tap(\"multi-node\", this.applyParser.bind(this));\n }\n}\n","import { ViewInstance, ViewPlugin } from \"../view\";\nimport type {\n Parser,\n Node,\n ParseObjectOptions,\n ParseObjectChildOptions,\n} from \"../parser\";\nimport { NodeType } from \"../parser\";\n\n/** A view plugin to resolve assets */\nexport default class AssetPlugin implements ViewPlugin {\n applyParser(parser: Parser) {\n parser.hooks.parseNode.tap(\n \"asset\",\n (\n obj: any,\n nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ) => {\n if (childOptions?.key === \"asset\" && typeof obj === \"object\") {\n const assetAST = parser.parseObject(obj, NodeType.Asset, options);\n\n if (!assetAST) {\n return [];\n }\n\n return [\n {\n path: [...childOptions.path, childOptions.key],\n value: assetAST,\n },\n ];\n }\n },\n );\n }\n\n apply(view: ViewInstance) {\n view.hooks.parser.tap(\"asset\", this.applyParser.bind(this));\n }\n}\n","import { SyncHook } from \"tapable-ts\";\nimport type { Navigation, NavigationFlowEndState } from \"@player-ui/types\";\nimport type { Logger } from \"../../logger\";\nimport type { TransitionOptions } from \"./flow\";\nimport { FlowInstance } from \"./flow\";\n\n/** A manager for the navigation section of a Content blob */\nexport class FlowController {\n public readonly hooks = {\n flow: new SyncHook<[FlowInstance]>(),\n };\n\n private readonly log?: Logger;\n private navigation: Navigation;\n private navStack: FlowInstance[];\n public current?: FlowInstance;\n\n constructor(\n navigation: Navigation,\n options?: {\n /** A logger instance to use */\n logger?: Logger;\n },\n ) {\n this.navigation = navigation;\n this.navStack = [];\n this.log = options?.logger;\n\n this.start = this.start.bind(this);\n this.run = this.run.bind(this);\n this.transition = this.transition.bind(this);\n this.addNewFlow = this.addNewFlow.bind(this);\n }\n\n /** Navigate to another state in the state-machine */\n public transition(stateTransition: string, options?: TransitionOptions) {\n if (this.current === undefined) {\n throw new Error(\"Not currently in a flow. Cannot transition.\");\n }\n\n this.current.transition(stateTransition, options);\n }\n\n private addNewFlow(flow: FlowInstance) {\n this.navStack.push(flow);\n this.current = flow;\n this.hooks.flow.call(flow);\n }\n\n private async run(startState: string): Promise<NavigationFlowEndState> {\n if (!Object.prototype.hasOwnProperty.call(this.navigation, startState)) {\n return Promise.reject(new Error(`No flow defined for: ${startState}`));\n }\n\n const startFlow = this.navigation[startState];\n\n if (startFlow === null || typeof startFlow !== \"object\") {\n return Promise.reject(\n new Error(`Flow: ${startState} needs to be an object`),\n );\n }\n\n this.log?.debug(`Starting flow: ${startState}`);\n\n const flow = new FlowInstance(startState, startFlow, { logger: this.log });\n this.addNewFlow(flow);\n\n flow.hooks.afterTransition.tap(\"flow-controller\", (flowInstance) => {\n if (flowInstance.currentState?.value.state_type === \"FLOW\") {\n const subflowId = flowInstance.currentState?.value.ref;\n this.log?.debug(`Loading subflow ${subflowId}`);\n this.run(subflowId).then((subFlowEndState) => {\n this.log?.debug(\n `Subflow ended. Using outcome: ${subFlowEndState.outcome}`,\n );\n flowInstance.transition(subFlowEndState?.outcome);\n });\n }\n });\n\n const end = await flow.start();\n this.navStack.pop();\n\n if (this.navStack.length > 0) {\n const firstItem = 0;\n this.current = this.navStack[firstItem];\n }\n\n return end;\n }\n\n public async start(): Promise<NavigationFlowEndState> {\n if (!this.navigation.BEGIN) {\n return Promise.reject(new Error(\"Must supply a BEGIN state\"));\n }\n\n return this.run(this.navigation.BEGIN);\n }\n}\n","const ANY_CHAR_REGEX = /%([a-zA-Z]+)/g;\n\n/**\n * Replaces %num in message with the provided parameters in order.\n *\n * @param message - Parameterized string like \"This is a %1\"\n * @param params - Parameters to replace in message E.g. ['tax2021.amount']\n * @returns A message with the parameters replaced.\n */\nexport function replaceParams(\n message: string,\n params: Record<string, any>,\n): string {\n return message\n .slice()\n .replace(ANY_CHAR_REGEX, (keyExpr) => params[keyExpr.slice(1)] || keyExpr);\n}\n","import type { Validation } from \"@player-ui/types\";\nimport type { ViewPlugin, Resolver, Node, ViewInstance } from \"../../view\";\nimport { NodeType } from \"../../view\";\nimport type {\n BindingInstance,\n BindingLike,\n BindingFactory,\n} from \"../../binding\";\nimport { isBinding } from \"../../binding\";\nimport type { ValidationResponse } from \"../../validator\";\n\nconst CONTEXT = \"validation-binding-tracker\";\n\nexport interface BindingTracker {\n /** Get the bindings currently being tracked for validation */\n getBindings(): Set<BindingInstance>;\n\n /** Add a binding to the tracked set */\n trackBinding(binding: BindingInstance): void;\n}\ninterface Options {\n /** Parse a binding from a view */\n parseBinding: BindingFactory;\n\n /** Callbacks when events happen */\n callbacks?: {\n /** Called when a binding is encountered for the first time in a view */\n onAdd?: (binding: BindingInstance) => void;\n };\n}\n\n/** A view plugin that manages bindings tracked across updates */\nexport class ValidationBindingTrackerViewPlugin\n implements ViewPlugin, BindingTracker\n{\n private options: Options;\n\n private trackedBindings = new Set<BindingInstance>();\n\n constructor(options: Options) {\n this.options = options;\n }\n\n /** Fetch the tracked bindings in the current view */\n getBindings(): Set<BindingInstance> {\n return this.trackedBindings;\n }\n\n /** Add a binding to the tracked set */\n trackBinding(binding: BindingInstance) {\n if (this.trackedBindings.has(binding)) {\n return;\n }\n\n this.trackedBindings.add(binding);\n this.options.callbacks?.onAdd?.(binding);\n }\n\n /** Attach hooks to the given resolver */\n applyResolver(resolver: Resolver) {\n this.trackedBindings.clear();\n\n /** Each node maps to a set of bindings that it directly tracks */\n const tracked = new Map<Node.Node, Set<BindingInstance>>();\n\n /** Each Node is a registered section or page that maps to a set of nodes in its section */\n const sections = new Map<Node.Node, Set<Node.Node>>();\n\n let lastViewUpdateChangeSet: Set<BindingInstance> | undefined;\n\n /** Map of node to all bindings in children */\n const lastComputedBindingTree = new Map<Node.Node, Set<BindingInstance>>();\n let currentBindingTree = new Map<Node.Node, Set<BindingInstance>>();\n\n /** Map of registered section nodes to bindings */\n const lastSectionBindingTree = new Map<Node.Node, Set<BindingInstance>>();\n\n /** Map of resolved nodes to their original nodes. */\n const resolvedNodeMap: Map<Node.Node, Node.Node> = new Map();\n\n resolver.hooks.beforeUpdate.tap(CONTEXT, (changes) => {\n lastViewUpdateChangeSet = changes;\n });\n\n resolver.hooks.skipResolve.tap(CONTEXT, (shouldSkip, node) => {\n const trackedBindingsForNode = lastComputedBindingTree.get(node);\n\n if (!shouldSkip || !lastViewUpdateChangeSet || !trackedBindingsForNode) {\n return shouldSkip;\n }\n\n const intersection = new Set(\n [...lastViewUpdateChangeSet].filter((b) =>\n trackedBindingsForNode.has(b),\n ),\n );\n\n return intersection.size === 0;\n });\n\n resolver.hooks.resolveOptions.tap(CONTEXT, (options, node) => {\n if (options.validation === undefined) {\n return options;\n }\n\n // Clear out any old tracked bindings for this node since we're re-compiling it\n tracked.delete(node);\n\n /** Validation callback to track a binding */\n const track = (binding: BindingLike) => {\n const parsed = isBinding(binding)\n ? binding\n : this.options.parseBinding(binding);\n\n if (tracked.has(node)) {\n tracked.get(node)?.add(parsed);\n } else {\n tracked.set(node, new Set([parsed]));\n }\n\n /** find first parent registered as section and add self to its list */\n let { parent } = node;\n\n while (parent) {\n if (sections.has(parent)) {\n sections.get(parent)?.add(node);\n break;\n } else {\n parent = parent.parent;\n }\n }\n\n this.trackedBindings.add(parsed);\n this.options.callbacks?.onAdd?.(parsed);\n };\n\n return {\n ...options,\n validation: {\n ...options.validation,\n get: (binding, getOptions) => {\n if (getOptions?.track) {\n track(binding);\n }\n\n const eows = options.validation\n ?._getValidationForBinding(binding)\n ?.getAll(getOptions);\n\n const firstFieldEOW = eows?.find(\n (eow) =>\n eow.displayTarget === \"field\" ||\n eow.displayTarget === undefined,\n );\n\n return firstFieldEOW;\n },\n getValidationsForBinding(binding, getOptions) {\n if (getOptions?.track) {\n track(binding);\n }\n\n return (\n options.validation\n ?._getValidationForBinding(binding)\n ?.getAll(getOptions) ?? []\n );\n },\n getChildren: (type?: Validation.DisplayTarget) => {\n const validations = new Array<ValidationResponse>();\n lastComputedBindingTree.get(node)?.forEach((binding) => {\n const eow = options.validation\n ?._getValidationForBinding(binding)\n ?.get();\n\n if (eow && (type === undefined || type === eow.displayTarget)) {\n validations.push(eow);\n }\n });\n\n return validations;\n },\n getValidationsForSection: () => {\n const validations = new Array<ValidationResponse>();\n lastSectionBindingTree.get(node)?.forEach((binding) => {\n const eow = options.validation\n ?._getValidationForBinding(binding)\n ?.get();\n\n if (eow && eow.displayTarget === \"section\") {\n validations.push(eow);\n }\n });\n\n return validations;\n },\n register: (registerOptions) => {\n if (registerOptions?.type === \"section\") {\n if (!sections.has(node)) {\n sections.set(node, new Set());\n }\n }\n },\n track,\n },\n };\n });\n\n resolver.hooks.afterNodeUpdate.tap(\n CONTEXT,\n (originalNode, parent, update) => {\n // Compute the new tree for this node\n // If it's not-updated, use the last known value\n\n const { updated, node: resolvedNode } = update;\n resolvedNodeMap.set(resolvedNode, originalNode);\n\n if (updated) {\n const newlyComputed = new Set(tracked.get(originalNode));\n if (resolvedNode.type === NodeType.MultiNode) {\n resolvedNode.values.forEach((value) =>\n currentBindingTree\n .get(value)\n ?.forEach((b) => newlyComputed.add(b)),\n );\n }\n\n if (\"children\" in resolvedNode && resolvedNode.children) {\n resolvedNode.children.forEach((child) => {\n currentBindingTree\n .get(child.value)\n ?.forEach((b) => newlyComputed.add(b));\n });\n }\n\n currentBindingTree.set(resolvedNode, newlyComputed);\n } else {\n currentBindingTree.set(\n resolvedNode,\n lastComputedBindingTree.get(originalNode) ?? new Set(),\n );\n }\n\n if (originalNode === resolver.root) {\n this.trackedBindings = new Set(currentBindingTree.get(resolvedNode));\n lastComputedBindingTree.clear();\n currentBindingTree.forEach((value, key) => {\n const node = resolvedNodeMap.get(key);\n if (node) {\n lastComputedBindingTree.set(node, value);\n }\n });\n\n lastSectionBindingTree.clear();\n sections.forEach((nodeSet, sectionNode) => {\n const temp = new Set<BindingInstance>();\n nodeSet.forEach((n) => {\n tracked.get(n)?.forEach(temp.add, temp);\n });\n lastSectionBindingTree.set(sectionNode, temp);\n });\n\n tracked.clear();\n sections.clear();\n currentBindingTree = new Map();\n }\n },\n );\n }\n\n apply(view: ViewInstance) {\n view.hooks.resolver.tap(CONTEXT, this.applyResolver.bind(this));\n }\n}\n","export interface Store {\n useLocalState<T>(initialState: T): readonly [T, (value: T) => void];\n useSharedState<T>(\n key: string | symbol,\n ): (initialState: T) => readonly [T, (value: T) => void];\n}\n\ninterface SharedStore {\n getLocalStateFunction<T>(\n key: string | symbol,\n countKey: symbol,\n ): (initialState: T) => readonly [T, (value: T) => void];\n useSharedState<T>(\n key: string | symbol,\n ): (initialState: T) => readonly [T, (value: T) => void];\n}\n\n/** A store that holds on to state for a transform */\nexport class LocalStateStore implements SharedStore {\n private state: Map<string | symbol, any>;\n\n private updateCallback?: () => void;\n\n constructor(onUpdate?: () => void) {\n this.updateCallback = onUpdate;\n\n this.state = new Map();\n }\n\n public removeKey(key: symbol | string) {\n this.state.delete(key);\n }\n\n public reset() {\n this.state.clear();\n }\n\n useSharedState<T>(key: string | symbol) {\n return (initialState: T) => {\n if (!this.state.has(key)) {\n this.state.set(key, initialState);\n }\n\n return [\n this.state.get(key) as T,\n (newState: T) => {\n const current = this.state.get(key) as T;\n\n this.state.set(key, newState);\n\n if (current !== newState) {\n this.updateCallback?.();\n }\n },\n ] as const;\n };\n }\n\n getLocalStateFunction<T>(key: symbol, countKey: symbol) {\n return (initialState: T) => {\n // initialize if not already created\n if (!this.state.has(key)) {\n this.state.set(key, []);\n }\n\n if (!this.state.has(countKey)) {\n this.state.set(countKey, 0);\n }\n\n const localState = this.state.get(key);\n const oldCount = this.state.get(countKey);\n\n this.state.set(countKey, oldCount + 1);\n\n if (localState.length <= oldCount) {\n localState.push(initialState);\n }\n\n const value = localState[oldCount] as T;\n\n return [\n value,\n (newState: T) => {\n const oldValue = localState[oldCount] as T;\n localState[oldCount] = newState;\n\n if (oldValue !== newState) {\n this.updateCallback?.();\n }\n },\n ] as const;\n };\n }\n}\n","import type { Node } from \"../../view\";\nimport { NodeType } from \"../../view\";\nimport { LocalStateStore } from \"./store\";\nimport type { TransformRegistry } from \"./types\";\nimport type { ViewController } from \"./controller\";\n\n/** Traverse up the nodes until the target is found */\nfunction findUp(node: Node.Node, target: Node.Node): boolean {\n if (node === target) {\n return true;\n }\n\n if (node.parent) {\n return findUp(node.parent, target);\n }\n\n return false;\n}\n\n/**\n * A plugin to register custom transforms on certain asset types\n * This allows users to embed stateful data into transforms.\n */\nexport class AssetTransformCorePlugin {\n public readonly stateStore: Map<Node.Node, LocalStateStore>;\n private readonly registry: TransformRegistry;\n private beforeResolveSymbol: symbol;\n private resolveSymbol: symbol;\n private beforeResolveCountSymbol: symbol;\n private resolveCountSymbol: symbol;\n\n constructor(registry: TransformRegistry) {\n this.registry = registry;\n this.stateStore = new Map();\n this.beforeResolveSymbol = Symbol(\"before resolve\");\n this.resolveSymbol = Symbol(\"resolve\");\n this.beforeResolveCountSymbol = Symbol(\"before resolve count\");\n this.resolveCountSymbol = Symbol(\"resolve count\");\n }\n\n apply(viewController: ViewController) {\n viewController.hooks.view.tap(\"asset-transform\", (view) => {\n // Clear out everything when we create a new view\n this.stateStore.clear();\n\n view.hooks.resolver.tap(\"asset-transform\", (resolver) => {\n let lastUpdatedNode: Node.Node | undefined;\n\n /** A function to update the state and trigger a view re-compute */\n const updateState = (node: Node.Node) => {\n lastUpdatedNode = node;\n view.update(new Set());\n };\n\n /** Given a node and a transform step, fetch a local store */\n const getStore = (node: Node.Node, stepKey: symbol) => {\n let store: LocalStateStore;\n const countKey =\n stepKey === this.resolveSymbol\n ? this.resolveCountSymbol\n : this.beforeResolveCountSymbol;\n\n const storedState = this.stateStore.get(node);\n\n if (storedState) {\n store = storedState;\n store.removeKey(countKey);\n } else {\n store = new LocalStateStore(() => {\n updateState(node);\n });\n this.stateStore.set(node, store);\n }\n\n return {\n useSharedState: (\n key: string | symbol,\n ): (<T>(initialState: T) => readonly [T, (value: T) => void]) => {\n return store.useSharedState(key);\n },\n useLocalState: <T>(initialState: T) => {\n return store.getLocalStateFunction<T>(\n stepKey,\n countKey,\n )(initialState);\n },\n };\n };\n\n resolver.hooks.beforeResolve.tap(\"asset-transform\", (node, options) => {\n if (node && (node.type === \"asset\" || node.type === \"view\")) {\n const transform = this.registry.get(node.value);\n\n if (transform?.beforeResolve) {\n const store = getStore(\n options.node ?? node,\n this.beforeResolveSymbol,\n );\n\n return transform.beforeResolve(node, options, store);\n }\n }\n\n return node;\n });\n\n resolver.hooks.afterUpdate.tap(\"asset-transform\", () => {\n lastUpdatedNode = undefined;\n });\n\n resolver.hooks.skipResolve.tap(\"asset-transform\", (skip, node) => {\n if (!skip || !lastUpdatedNode) {\n return skip;\n }\n\n const isParentOfUpdated = findUp(lastUpdatedNode, node);\n const isChildOfUpdated = findUp(node, lastUpdatedNode);\n\n return !isParentOfUpdated && !isChildOfUpdated;\n });\n\n resolver.hooks.afterResolve.tap(\n \"asset-transform\",\n (value, node, options) => {\n if (node.type !== NodeType.Asset && node.type !== NodeType.View) {\n return value;\n }\n\n const originalNode = resolver.getSourceNode(node);\n\n if (!originalNode) {\n return value;\n }\n\n const transform = this.registry.get(value);\n\n if (transform?.resolve) {\n const store = getStore(originalNode, this.resolveSymbol);\n\n return transform?.resolve(value, options, store);\n }\n\n return value;\n },\n );\n });\n });\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type { DataController } from \".\";\nimport type { Logger } from \"../../logger\";\nimport type { BindingLike } from \"../../binding\";\nimport type {\n DataModelWithParser,\n DataModelOptions,\n Updates,\n} from \"../../data\";\n\n/** Wrapper for the Data Controller Class that prevents writes */\nexport class ReadOnlyDataController\n implements DataModelWithParser<DataModelOptions>\n{\n private controller: DataController;\n private logger?: Logger;\n\n constructor(controller: DataController, logger?: Logger) {\n this.controller = controller;\n this.logger = logger;\n }\n\n get(binding: BindingLike, options?: DataModelOptions | undefined) {\n return this.controller.get(binding, options);\n }\n\n set(\n transaction: [BindingLike, any][],\n options?: DataModelOptions | undefined,\n ): Updates {\n this.logger?.error(\n \"Error: Tried to set in a read only instance of the DataController\",\n );\n return [];\n }\n\n delete(binding: BindingLike, options?: DataModelOptions | undefined): void {\n this.logger?.error(\n \"Error: Tried to delete in a read only instance of the DataController\",\n );\n }\n}\n","import { SyncHook, SyncWaterfallHook, SyncBailHook } from \"tapable-ts\";\nimport { dequal } from \"dequal\";\nimport type { Logger } from \"../../logger\";\nimport type { BindingParser, BindingLike } from \"../../binding\";\nimport { BindingInstance } from \"../../binding\";\nimport type {\n BatchSetTransaction,\n Updates,\n DataModelOptions,\n DataModelWithParser,\n DataPipeline,\n DataModelMiddleware,\n} from \"../../data\";\nimport { PipelinedDataModel, LocalModel } from \"../../data\";\nimport type { RawSetTransaction } from \"../../types\";\nimport { ReadOnlyDataController } from \"./utils\";\n\n/** The orchestrator for player data */\nexport class DataController implements DataModelWithParser<DataModelOptions> {\n public hooks = {\n resolve: new SyncWaterfallHook(),\n resolveDataStages: new SyncWaterfallHook<[DataPipeline]>(),\n\n // On any set or get of an undefined value, redirect the value to be the default\n resolveDefaultValue: new SyncBailHook<[BindingInstance], any>(),\n\n onDelete: new SyncHook<[any]>(),\n\n onSet: new SyncHook<[BatchSetTransaction]>(),\n\n onGet: new SyncHook<[any, any]>(),\n\n onUpdate: new SyncHook<[Updates, DataModelOptions | undefined]>(),\n\n format: new SyncWaterfallHook<[any, BindingInstance]>(),\n\n deformat: new SyncWaterfallHook<[any, BindingInstance]>(),\n\n serialize: new SyncWaterfallHook<[any]>(),\n };\n\n private model?: PipelinedDataModel;\n private trash: Set<BindingInstance>;\n private pathResolver: BindingParser;\n private baseMiddleware: Array<DataModelMiddleware>;\n private logger?: Logger;\n\n constructor(\n model: Record<any, unknown> | undefined,\n options: {\n /** A means of parsing a raw binding to a Binding object */\n pathResolver: BindingParser;\n\n /** middleware to use. typically for validation */\n middleware?: Array<DataModelMiddleware>;\n\n /** A logger to use */\n logger?: Logger;\n },\n ) {\n this.logger = options.logger;\n const middleware = options.middleware || [];\n this.baseMiddleware = [new LocalModel(model), ...middleware];\n\n this.trash = new Set();\n this.pathResolver = options.pathResolver;\n }\n\n public getModel(): PipelinedDataModel {\n if (!this.model) {\n const stages = this.hooks.resolveDataStages.call(this.baseMiddleware);\n const model = new PipelinedDataModel();\n model.setMiddleware(stages);\n this.model = model;\n }\n\n return this.model;\n }\n\n private resolveDataValue(\n binding: BindingInstance,\n value: any,\n deformat: boolean,\n ) {\n if (deformat) {\n return this.hooks.deformat.call(value, binding);\n }\n\n return value;\n }\n\n public set(\n transaction: RawSetTransaction,\n options?: DataModelOptions,\n ): Updates {\n let normalizedTransaction: BatchSetTransaction = [];\n\n if (Array.isArray(transaction)) {\n normalizedTransaction = transaction.map(([binding, value]) => {\n const parsed = this.pathResolver.parse(binding);\n\n return [\n parsed,\n this.resolveDataValue(parsed, value, Boolean(options?.formatted)),\n ];\n }) as BatchSetTransaction;\n } else {\n normalizedTransaction = Object.keys(transaction).map(\n (binding: string) => {\n const parsed = this.pathResolver.parse(binding);\n const val = transaction[binding];\n\n return [\n parsed,\n this.resolveDataValue(parsed, val, Boolean(options?.formatted)),\n ];\n },\n ) as BatchSetTransaction;\n }\n\n // Figure out what the base changes being applied are\n const setUpdates = normalizedTransaction.reduce<Updates>(\n (updates, [binding, newVal]) => {\n const oldVal = this.get(binding, { includeInvalid: true });\n\n const update = {\n binding,\n newValue: newVal,\n oldValue: oldVal,\n };\n\n if (dequal(oldVal, newVal)) {\n this.logger?.debug(\n `Skipping update for path: ${binding.asString()}. Value was unchanged: ${oldVal}`,\n );\n } else {\n updates.push(update);\n\n this.logger?.debug(\n `Setting path: ${binding.asString()} from: ${oldVal} to: ${newVal}`,\n );\n }\n\n return updates;\n },\n [],\n );\n\n // Get the applied update\n const result = this.getModel().set(normalizedTransaction, options);\n\n // Add any extra bindings that were effected\n const setUpdateBindings = new Set(setUpdates.map((su) => su.binding));\n result.forEach((tr) => {\n if (\n !setUpdateBindings.has(tr.binding) &&\n (tr.force === true || !dequal(tr.oldValue, tr.newValue))\n ) {\n this.logger?.debug(\n `Path: ${tr.binding.asString()} was changed from: ${\n tr.oldValue\n } to: ${tr.newValue}`,\n );\n setUpdates.push(tr);\n }\n });\n\n this.hooks.onSet.call(normalizedTransaction);\n\n if (setUpdates.length > 0) {\n this.hooks.onUpdate.call(setUpdates, options);\n }\n\n return result;\n }\n\n private resolve(binding: BindingLike, readOnly: boolean): BindingInstance {\n return Array.isArray(binding) || typeof binding === \"string\"\n ? this.pathResolver.parse(binding, { readOnly })\n : binding;\n }\n\n public get(binding: BindingLike, options?: DataModelOptions) {\n const resolved =\n binding instanceof BindingInstance\n ? binding\n : this.resolve(binding, true);\n let result = this.getModel().get(resolved, options);\n\n if (result === undefined && !options?.ignoreDefaultValue) {\n const defaultVal = this.hooks.resolveDefaultValue.call(resolved);\n\n if (defaultVal !== result) {\n result = defaultVal;\n }\n }\n\n if (options?.formatted) {\n result = this.hooks.format.call(result, resolved);\n } else if (options?.formatted === false) {\n result = this.hooks.deformat.call(result, resolved);\n }\n\n this.hooks.onGet.call(binding, result);\n\n return result;\n }\n\n public delete(binding: BindingLike, options?: DataModelOptions) {\n if (\n typeof binding !== \"string\" &&\n !Array.isArray(binding) &&\n !(binding instanceof BindingInstance)\n ) {\n throw new Error(\"Invalid arguments: delete expects a data path (string)\");\n }\n\n const resolved =\n binding instanceof BindingInstance\n ? binding\n : this.resolve(binding, false);\n\n const parentBinding = resolved.parent();\n const property = resolved.key();\n const parentValue = this.get(parentBinding);\n\n const existedBeforeDelete =\n typeof parentValue === \"object\" &&\n parentValue !== null &&\n Object.prototype.hasOwnProperty.call(parentValue, property);\n\n this.getModel().delete(resolved, options);\n\n if (existedBeforeDelete && !this.get(resolved)) {\n this.trash.add(resolved);\n }\n\n this.hooks.onDelete.call(resolved);\n }\n\n public serialize(): object {\n return this.hooks.serialize.call(this.get(\"\"));\n }\n\n public makeReadOnly(): ReadOnlyDataController {\n return new ReadOnlyDataController(this, this.logger);\n }\n}\n","import { BindingInstance } from \"../../binding\";\n\n/** Recursively flattens a nested object to be an object of depth 1 with keys being the full path in the orginal object */\nexport function flatten(obj: any, roots: [string][] = [], sep = \".\"): any {\n return (\n Object\n // find props of given object\n .keys(obj)\n // return an object by iterating props\n .reduce(\n (memo, prop) => ({\n // create a new object\n\n // include previously returned object\n ...memo,\n ...(Object.prototype.toString.call(obj[prop]) === \"[object Object]\"\n ? // keep working if value is an object\n flatten(obj[prop], roots.concat([prop]))\n : // include current prop and value and prefix prop with the roots\n { [roots.concat([prop]).join(sep)]: obj[prop] }),\n }),\n {},\n )\n );\n}\n\n/** Converts an object into a list of binding/value tuples to use with a LocalModel object */\nexport function objectToBatchSet(obj: any): [BindingInstance, any][] {\n const flattenedObj = flatten(obj);\n const batchTxn: [BindingInstance, any][] = [];\n\n Object.keys(flattenedObj).forEach((key) => {\n batchTxn.push([new BindingInstance(key), flattenedObj[key]]);\n });\n\n return batchTxn;\n}\n","import { LocalModel } from \"../../data\";\nimport { BindingInstance } from \"../../binding\";\nimport { objectToBatchSet } from \"./utils\";\n\nexport interface ConstantsProvider {\n /**\n * Function to add constants to the providers store\n * - @param data values to add to the constants store\n */\n addConstants(data: Record<string, any>, namespace: string): void;\n\n /**\n * Function to retrieve constants from the providers store\n * - @param key Key used for the store access\n * - @param namespace namespace values were loaded under (defined in the plugin)\n * - @param fallback Optional - if key doesn't exist in namespace what to return (will return unknown if not provided)\n */\n getConstants(key: any, namespace: string, fallback?: any): any;\n\n /**\n * Function to set values to temporarily override certain keys in the perminant store\n * - @param data values to override store with\n * - @param namespace namespace to override\n */\n setTemporaryValues(data: any, namespace: string): void;\n\n /**\n * Clears any temporary values that were previously set\n */\n clearTemporaryValues(): void;\n}\n\n/**\n * Key/Value store for constants and context for Player\n */\nexport class ConstantsController implements ConstantsProvider {\n /**\n * Data store is basically a map of namespaces to DataModels to provide some data isolation\n */\n private store: Map<string, LocalModel>;\n\n /**\n * Separate store for temporary flow specific overrides.\n * They are kept in a separate data model to make clearing it easier between flows\n * and so there is no confusion on what is static and what is temporary\n */\n private tempStore: Map<string, LocalModel>;\n\n constructor() {\n this.store = new Map();\n this.tempStore = new Map();\n }\n\n addConstants(data: any, namespace: string): void {\n if (this.store.has(namespace)) {\n this.store.get(namespace)?.set(objectToBatchSet(data));\n } else {\n this.store.set(namespace, new LocalModel(data));\n }\n }\n\n getConstants(key: string, namespace: string, fallback?: any): any {\n const path = new BindingInstance(key);\n\n return (\n this.tempStore.get(namespace)?.get(path) ??\n this.store.get(namespace)?.get(path) ??\n fallback\n );\n }\n\n setTemporaryValues(data: any, namespace: string): void {\n if (this.tempStore.has(namespace)) {\n this.tempStore.get(namespace)?.set(objectToBatchSet(data));\n } else {\n this.tempStore.set(namespace, new LocalModel(data));\n }\n }\n\n clearTemporaryValues(namespace?: string): void {\n if (namespace) {\n this.tempStore.get(namespace)?.reset();\n } else {\n this.tempStore.forEach((value: LocalModel) => {\n value.reset();\n });\n }\n }\n}\n","import type {\n Expression,\n ExpressionObject,\n NavigationFlowState,\n} from \"@player-ui/types\";\nimport type { ExpressionEvaluator, ExpressionType } from \"../expressions\";\nimport type { FlowInstance } from \"../controllers\";\nimport type { Player, PlayerPlugin } from \"../player\";\n\n/**\n * A plugin that taps into the flow controller to evaluate available expressions\n * Expressions can be exposed via lifecycle \"hooks\" in flow/state nodes\n * e.g: onStart, onEnd\n */\nexport class FlowExpPlugin implements PlayerPlugin {\n name = \"flow-exp-plugin\";\n\n apply(player: Player) {\n let expressionEvaluator: ExpressionEvaluator | undefined;\n\n /**\n * Eval Helper\n *\n * @param exp - an expression to be evaluated\n */\n const handleEval = (exp: Expression | ExpressionObject) => {\n if (exp) {\n if (typeof exp === \"object\" && \"exp\" in exp) {\n expressionEvaluator?.evaluate(exp.exp);\n } else {\n expressionEvaluator?.evaluate(exp as ExpressionType);\n }\n }\n };\n\n player.hooks.expressionEvaluator.tap(this.name, (evaluator) => {\n expressionEvaluator = evaluator;\n });\n\n player.hooks.flowController.tap(this.name, (fc) => {\n fc.hooks.flow.tap(this.name, (flow: FlowInstance) => {\n // Eval flow nodes\n flow.hooks.onStart.tap(this.name, (exp) => handleEval(exp));\n\n flow.hooks.onEnd.tap(this.name, (exp) => handleEval(exp));\n // Eval state nodes\n flow.hooks.resolveTransitionNode.intercept({\n call: (nextState: NavigationFlowState) => {\n if (nextState?.onStart) {\n handleEval(nextState.onStart);\n }\n },\n });\n });\n });\n }\n}\n","import type { ExpressionHandler, ExpressionType } from \"../expressions\";\nimport type { SchemaController } from \"../schema\";\nimport type { Player, PlayerPlugin } from \"../player\";\n\n/** Gets formatter for given formatName and formats value if found, returns value otherwise */\nconst createFormatFunction = (schema: SchemaController) => {\n /**\n * The generated handler for the given schema\n */\n const handler: ExpressionHandler<[unknown, string], any> = (\n ctx,\n value,\n formatName,\n ) => {\n return (\n schema.getFormatterForType({ type: formatName })?.format(value) ?? value\n );\n };\n\n return handler;\n};\n\n/**\n * A plugin that provides the out-of-the-box expressions for player\n */\nexport class DefaultExpPlugin implements PlayerPlugin {\n name = \"flow-exp-plugin\";\n\n apply(player: Player) {\n let formatFunction: ExpressionHandler<[unknown, string]> | undefined;\n\n player.hooks.schema.tap(this.name, (schemaController) => {\n formatFunction = createFormatFunction(schemaController);\n });\n\n player.hooks.expressionEvaluator.tap(this.name, (expEvaluator) => {\n if (formatFunction) {\n expEvaluator.addExpressionFunction(\"format\", formatFunction);\n }\n\n expEvaluator.addExpressionFunction(\"log\", (ctx, ...args) => {\n player.logger.info(...args);\n });\n\n expEvaluator.addExpressionFunction(\"debug\", (ctx, ...args) => {\n player.logger.debug(...args);\n });\n\n expEvaluator.addExpressionFunction(\n \"eval\",\n (ctx, ...args: [ExpressionType]) => {\n return ctx.evaluate(...args);\n },\n );\n });\n }\n}\n","import type { Flow, FlowResult } from \"@player-ui/types\";\nimport type { BindingParser, BindingLike } from \"./binding\";\nimport type { SchemaController } from \"./schema\";\nimport type { ExpressionEvaluator } from \"./expressions\";\nimport type { Logger } from \"./logger\";\nimport type {\n ViewController,\n DataController,\n ValidationController,\n FlowController,\n} from \"./controllers\";\nimport type { ReadOnlyDataController } from \"./controllers/data/utils\";\n\n/** The status for a flow's execution state */\nexport type PlayerFlowStatus =\n | \"not-started\"\n | \"in-progress\"\n | \"completed\"\n | \"error\";\n\n/** Common interface for the state of Player's flow execution */\nexport interface BaseFlowState<T extends PlayerFlowStatus> {\n /** A unique reference for the life-cycle of a flow */\n ref: symbol;\n\n /** The status of the given flow */\n status: T;\n}\n\n/** The beginning state of Player, before it's seen a flow */\nexport type NotStartedState = BaseFlowState<\"not-started\">;\n\nexport const NOT_STARTED_STATE: NotStartedState = {\n ref: Symbol(\"not-started\"),\n status: \"not-started\",\n};\n\n/** Shared properties for a flow in any state of execution (in-progress, completed successfully, or errored out) */\nexport interface PlayerFlowExecutionData {\n /** The currently executing flow */\n flow: Flow;\n}\n\nexport interface ControllerState {\n /** The manager for data for a flow */\n data: DataController;\n\n /** The view manager for a flow */\n view: ViewController;\n\n /** The schema manager for a flow */\n schema: SchemaController;\n\n /** The validation manager for a flow */\n validation: ValidationController;\n\n /** The expression evaluator for a flow */\n expression: ExpressionEvaluator;\n\n /** The manager for parsing and resolving bindings */\n binding: BindingParser;\n\n /** the manager for the flow state machine */\n flow: FlowController;\n}\n\n/** A flow is currently executing */\nexport type InProgressState = BaseFlowState<\"in-progress\"> &\n PlayerFlowExecutionData & {\n /** A promise that resolves when the flow is completed */\n flowResult: Promise<FlowResult>;\n\n /** The underlying state controllers for the current flow */\n controllers: ControllerState;\n\n /** Allow other platforms to abort the current flow with an error */\n fail: (error: Error) => void;\n\n /**\n * The Logger for the current player instance\n */\n logger: Logger;\n };\n\n/** The flow completed properly */\nexport type CompletedState = BaseFlowState<\"completed\"> &\n PlayerFlowExecutionData &\n FlowResult & {\n /** Readonly Player controllers to provide Player functionality after the flow has ended */\n controllers: {\n /** A read only instance of the Data Controller */\n data: ReadOnlyDataController;\n };\n };\n\n/** The flow finished but not successfully */\nexport type ErrorState = BaseFlowState<\"error\"> & {\n /** The currently executing flow */\n flow: Flow;\n\n /** The error associated with the failed flow */\n error: Error;\n};\n\n/** Any Player state */\nexport type PlayerFlowState =\n | NotStartedState\n | InProgressState\n | CompletedState\n | ErrorState;\n\n// Model\n\nexport type RawSetType = [BindingLike, any];\nexport type RawSetTransaction = Record<string, any> | RawSetType[];\n","import type { Player, PlayerPlugin } from \"../player\";\nimport {\n ApplicabilityPlugin,\n AssetPlugin,\n MultiNodePlugin,\n StringResolverPlugin,\n SwitchPlugin,\n TemplatePlugin,\n toNodeResolveOptions,\n} from \"../view\";\n\n/**\n * A plugin that provides the out-of-the-box expressions for player\n */\nexport class DefaultViewPlugin implements PlayerPlugin {\n name = \"default-view-plugin\";\n\n apply(player: Player) {\n player.hooks.viewController.tap(this.name, (viewController) => {\n viewController.hooks.view.tap(this.name, (view) => {\n const pluginOptions = toNodeResolveOptions(view.resolverOptions);\n new AssetPlugin().apply(view);\n new SwitchPlugin(pluginOptions).apply(view);\n new ApplicabilityPlugin().apply(view);\n new StringResolverPlugin().apply(view);\n const templatePlugin = new TemplatePlugin(pluginOptions);\n templatePlugin.apply(view);\n view.hooks.onTemplatePluginCreated.call(templatePlugin);\n new MultiNodePlugin().apply(view);\n });\n });\n }\n}\n","/**\n * @typedef {import('mdast').Nodes} Nodes\n *\n * @typedef Options\n * Configuration (optional).\n * @property {boolean | null | undefined} [includeImageAlt=true]\n * Whether to use `alt` for `image`s (default: `true`).\n * @property {boolean | null | undefined} [includeHtml=true]\n * Whether to use `value` of HTML (default: `true`).\n */\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Get the text content of a node or list of nodes.\n *\n * Prefers the node’s plain-text fields, otherwise serializes its children,\n * and if the given value is an array, serialize the nodes in it.\n *\n * @param {unknown} [value]\n * Thing to serialize, typically `Node`.\n * @param {Options | null | undefined} [options]\n * Configuration (optional).\n * @returns {string}\n * Serialized `value`.\n */\nexport function toString(value, options) {\n const settings = options || emptyOptions\n const includeImageAlt =\n typeof settings.includeImageAlt === 'boolean'\n ? settings.includeImageAlt\n : true\n const includeHtml =\n typeof settings.includeHtml === 'boolean' ? settings.includeHtml : true\n\n return one(value, includeImageAlt, includeHtml)\n}\n\n/**\n * One node or several nodes.\n *\n * @param {unknown} value\n * Thing to serialize.\n * @param {boolean} includeImageAlt\n * Include image `alt`s.\n * @param {boolean} includeHtml\n * Include HTML.\n * @returns {string}\n * Serialized node.\n */\nfunction one(value, includeImageAlt, includeHtml) {\n if (node(value)) {\n if ('value' in value) {\n return value.type === 'html' && !includeHtml ? '' : value.value\n }\n\n if (includeImageAlt && 'alt' in value && value.alt) {\n return value.alt\n }\n\n if ('children' in value) {\n return all(value.children, includeImageAlt, includeHtml)\n }\n }\n\n if (Array.isArray(value)) {\n return all(value, includeImageAlt, includeHtml)\n }\n\n return ''\n}\n\n/**\n * Serialize a list of nodes.\n *\n * @param {Array<unknown>} values\n * Thing to serialize.\n * @param {boolean} includeImageAlt\n * Include image `alt`s.\n * @param {boolean} includeHtml\n * Include HTML.\n * @returns {string}\n * Serialized nodes.\n */\nfunction all(values, includeImageAlt, includeHtml) {\n /** @type {Array<string>} */\n const result = []\n let index = -1\n\n while (++index < values.length) {\n result[index] = one(values[index], includeImageAlt, includeHtml)\n }\n\n return result.join('')\n}\n\n/**\n * Check if `value` looks like a node.\n *\n * @param {unknown} value\n * Thing.\n * @returns {value is Nodes}\n * Whether `value` is a node.\n */\nfunction node(value) {\n return Boolean(value && typeof value === 'object')\n}\n","/**\n * Map of named character references.\n *\n * @type {Record<string, string>}\n */\nexport const characterEntities = {\n AElig: 'Æ',\n AMP: '&',\n Aacute: 'Á',\n Abreve: 'Ă',\n Acirc: 'Â',\n Acy: 'А',\n Afr: '𝔄',\n Agrave: 'À',\n Alpha: 'Α',\n Amacr: 'Ā',\n And: '⩓',\n Aogon: 'Ą',\n Aopf: '𝔸',\n ApplyFunction: '',\n Aring: 'Å',\n Ascr: '𝒜',\n Assign: '≔',\n Atilde: 'Ã',\n Auml: 'Ä',\n Backslash: '∖',\n Barv: '⫧',\n Barwed: '⌆',\n Bcy: 'Б',\n Because: '∵',\n Bernoullis: 'ℬ',\n Beta: 'Β',\n Bfr: '𝔅',\n Bopf: '𝔹',\n Breve: '˘',\n Bscr: 'ℬ',\n Bumpeq: '≎',\n CHcy: 'Ч',\n COPY: '©',\n Cacute: 'Ć',\n Cap: '⋒',\n CapitalDifferentialD: 'ⅅ',\n Cayleys: 'ℭ',\n Ccaron: 'Č',\n Ccedil: 'Ç',\n Ccirc: 'Ĉ',\n Cconint: '∰',\n Cdot: 'Ċ',\n Cedilla: '¸',\n CenterDot: '·',\n Cfr: 'ℭ',\n Chi: 'Χ',\n CircleDot: '⊙',\n CircleMinus: '⊖',\n CirclePlus: '⊕',\n CircleTimes: '⊗',\n ClockwiseContourIntegral: '∲',\n CloseCurlyDoubleQuote: '”',\n CloseCurlyQuote: '’',\n Colon: '∷',\n Colone: '⩴',\n Congruent: '≡',\n Conint: '∯',\n ContourIntegral: '∮',\n Copf: 'ℂ',\n Coproduct: '∐',\n CounterClockwiseContourIntegral: '∳',\n Cross: '⨯',\n Cscr: '𝒞',\n Cup: '⋓',\n CupCap: '≍',\n DD: 'ⅅ',\n DDotrahd: '⤑',\n DJcy: 'Ђ',\n DScy: 'Ѕ',\n DZcy: 'Џ',\n Dagger: '‡',\n Darr: '↡',\n Dashv: '⫤',\n Dcaron: 'Ď',\n Dcy: 'Д',\n Del: '∇',\n Delta: 'Δ',\n Dfr: '𝔇',\n DiacriticalAcute: '´',\n DiacriticalDot: '˙',\n DiacriticalDoubleAcute: '˝',\n DiacriticalGrave: '`',\n DiacriticalTilde: '˜',\n Diamond: '⋄',\n DifferentialD: 'ⅆ',\n Dopf: '𝔻',\n Dot: '¨',\n DotDot: '⃜',\n DotEqual: '≐',\n DoubleContourIntegral: '∯',\n DoubleDot: '¨',\n DoubleDownArrow: '⇓',\n DoubleLeftArrow: '⇐',\n DoubleLeftRightArrow: '⇔',\n DoubleLeftTee: '⫤',\n DoubleLongLeftArrow: '⟸',\n DoubleLongLeftRightArrow: '⟺',\n DoubleLongRightArrow: '⟹',\n DoubleRightArrow: '⇒',\n DoubleRightTee: '⊨',\n DoubleUpArrow: '⇑',\n DoubleUpDownArrow: '⇕',\n DoubleVerticalBar: '∥',\n DownArrow: '↓',\n DownArrowBar: '⤓',\n DownArrowUpArrow: '⇵',\n DownBreve: '̑',\n DownLeftRightVector: '⥐',\n DownLeftTeeVector: '⥞',\n DownLeftVector: '↽',\n DownLeftVectorBar: '⥖',\n DownRightTeeVector: '⥟',\n DownRightVector: '⇁',\n DownRightVectorBar: '⥗',\n DownTee: '⊤',\n DownTeeArrow: '↧',\n Downarrow: '⇓',\n Dscr: '𝒟',\n Dstrok: 'Đ',\n ENG: 'Ŋ',\n ETH: 'Ð',\n Eacute: 'É',\n Ecaron: 'Ě',\n Ecirc: 'Ê',\n Ecy: 'Э',\n Edot: 'Ė',\n Efr: '𝔈',\n Egrave: 'È',\n Element: '∈',\n Emacr: 'Ē',\n EmptySmallSquare: '◻',\n EmptyVerySmallSquare: '▫',\n Eogon: 'Ę',\n Eopf: '𝔼',\n Epsilon: 'Ε',\n Equal: '⩵',\n EqualTilde: '≂',\n Equilibrium: '⇌',\n Escr: 'ℰ',\n Esim: '⩳',\n Eta: 'Η',\n Euml: 'Ë',\n Exists: '∃',\n ExponentialE: 'ⅇ',\n Fcy: 'Ф',\n Ffr: '𝔉',\n FilledSmallSquare: '◼',\n FilledVerySmallSquare: '▪',\n Fopf: '𝔽',\n ForAll: '∀',\n Fouriertrf: 'ℱ',\n Fscr: 'ℱ',\n GJcy: 'Ѓ',\n GT: '>',\n Gamma: 'Γ',\n Gammad: 'Ϝ',\n Gbreve: 'Ğ',\n Gcedil: 'Ģ',\n Gcirc: 'Ĝ',\n Gcy: 'Г',\n Gdot: 'Ġ',\n Gfr: '𝔊',\n Gg: '⋙',\n Gopf: '𝔾',\n GreaterEqual: '≥',\n GreaterEqualLess: '⋛',\n GreaterFullEqual: '≧',\n GreaterGreater: '⪢',\n GreaterLess: '≷',\n GreaterSlantEqual: '⩾',\n GreaterTilde: '≳',\n Gscr: '𝒢',\n Gt: '≫',\n HARDcy: 'Ъ',\n Hacek: 'ˇ',\n Hat: '^',\n Hcirc: 'Ĥ',\n Hfr: 'ℌ',\n HilbertSpace: 'ℋ',\n Hopf: 'ℍ',\n HorizontalLine: '─',\n Hscr: 'ℋ',\n Hstrok: 'Ħ',\n HumpDownHump: '≎',\n HumpEqual: '≏',\n IEcy: 'Е',\n IJlig: 'IJ',\n IOcy: 'Ё',\n Iacute: 'Í',\n Icirc: 'Î',\n Icy: 'И',\n Idot: 'İ',\n Ifr: 'ℑ',\n Igrave: 'Ì',\n Im: 'ℑ',\n Imacr: 'Ī',\n ImaginaryI: 'ⅈ',\n Implies: '⇒',\n Int: '∬',\n Integral: '∫',\n Intersection: '⋂',\n InvisibleComma: '',\n InvisibleTimes: '',\n Iogon: 'Į',\n Iopf: '𝕀',\n Iota: 'Ι',\n Iscr: 'ℐ',\n Itilde: 'Ĩ',\n Iukcy: 'І',\n Iuml: 'Ï',\n Jcirc: 'Ĵ',\n Jcy: 'Й',\n Jfr: '𝔍',\n Jopf: '𝕁',\n Jscr: '𝒥',\n Jsercy: 'Ј',\n Jukcy: 'Є',\n KHcy: 'Х',\n KJcy: 'Ќ',\n Kappa: 'Κ',\n Kcedil: 'Ķ',\n Kcy: 'К',\n Kfr: '𝔎',\n Kopf: '𝕂',\n Kscr: '𝒦',\n LJcy: 'Љ',\n LT: '<',\n Lacute: 'Ĺ',\n Lambda: 'Λ',\n Lang: '⟪',\n Laplacetrf: 'ℒ',\n Larr: '↞',\n Lcaron: 'Ľ',\n Lcedil: 'Ļ',\n Lcy: 'Л',\n LeftAngleBracket: '⟨',\n LeftArrow: '←',\n LeftArrowBar: '⇤',\n LeftArrowRightArrow: '⇆',\n LeftCeiling: '⌈',\n LeftDoubleBracket: '⟦',\n LeftDownTeeVector: '⥡',\n LeftDownVector: '⇃',\n LeftDownVectorBar: '⥙',\n LeftFloor: '⌊',\n LeftRightArrow: '↔',\n LeftRightVector: '⥎',\n LeftTee: '⊣',\n LeftTeeArrow: '↤',\n LeftTeeVector: '⥚',\n LeftTriangle: '⊲',\n LeftTriangleBar: '⧏',\n LeftTriangleEqual: '⊴',\n LeftUpDownVector: '⥑',\n LeftUpTeeVector: '⥠',\n LeftUpVector: '↿',\n LeftUpVectorBar: '⥘',\n LeftVector: '↼',\n LeftVectorBar: '⥒',\n Leftarrow: '⇐',\n Leftrightarrow: '⇔',\n LessEqualGreater: '⋚',\n LessFullEqual: '≦',\n LessGreater: '≶',\n LessLess: '⪡',\n LessSlantEqual: '⩽',\n LessTilde: '≲',\n Lfr: '𝔏',\n Ll: '⋘',\n Lleftarrow: '⇚',\n Lmidot: 'Ŀ',\n LongLeftArrow: '⟵',\n LongLeftRightArrow: '⟷',\n LongRightArrow: '⟶',\n Longleftarrow: '⟸',\n Longleftrightarrow: '⟺',\n Longrightarrow: '⟹',\n Lopf: '𝕃',\n LowerLeftArrow: '↙',\n LowerRightArrow: '↘',\n Lscr: 'ℒ',\n Lsh: '↰',\n Lstrok: 'Ł',\n Lt: '≪',\n Map: '⤅',\n Mcy: 'М',\n MediumSpace: ' ',\n Mellintrf: 'ℳ',\n Mfr: '𝔐',\n MinusPlus: '∓',\n Mopf: '𝕄',\n Mscr: 'ℳ',\n Mu: 'Μ',\n NJcy: 'Њ',\n Nacute: 'Ń',\n Ncaron: 'Ň',\n Ncedil: 'Ņ',\n Ncy: 'Н',\n NegativeMediumSpace: '',\n NegativeThickSpace: '',\n NegativeThinSpace: '',\n NegativeVeryThinSpace: '',\n NestedGreaterGreater: '≫',\n NestedLessLess: '≪',\n NewLine: '\\n',\n Nfr: '𝔑',\n NoBreak: '',\n NonBreakingSpace: ' ',\n Nopf: 'ℕ',\n Not: '⫬',\n NotCongruent: '≢',\n NotCupCap: '≭',\n NotDoubleVerticalBar: '∦',\n NotElement: '∉',\n NotEqual: '≠',\n NotEqualTilde: '≂̸',\n NotExists: '∄',\n NotGreater: '≯',\n NotGreaterEqual: '≱',\n NotGreaterFullEqual: '≧̸',\n NotGreaterGreater: '≫̸',\n NotGreaterLess: '≹',\n NotGreaterSlantEqual: '⩾̸',\n NotGreaterTilde: '≵',\n NotHumpDownHump: '≎̸',\n NotHumpEqual: '≏̸',\n NotLeftTriangle: '⋪',\n NotLeftTriangleBar: '⧏̸',\n NotLeftTriangleEqual: '⋬',\n NotLess: '≮',\n NotLessEqual: '≰',\n NotLessGreater: '≸',\n NotLessLess: '≪̸',\n NotLessSlantEqual: '⩽̸',\n NotLessTilde: '≴',\n NotNestedGreaterGreater: '⪢̸',\n NotNestedLessLess: '⪡̸',\n NotPrecedes: '⊀',\n NotPrecedesEqual: '⪯̸',\n NotPrecedesSlantEqual: '⋠',\n NotReverseElement: '∌',\n NotRightTriangle: '⋫',\n NotRightTriangleBar: '⧐̸',\n NotRightTriangleEqual: '⋭',\n NotSquareSubset: '⊏̸',\n NotSquareSubsetEqual: '⋢',\n NotSquareSuperset: '⊐̸',\n NotSquareSupersetEqual: '⋣',\n NotSubset: '⊂⃒',\n NotSubsetEqual: '⊈',\n NotSucceeds: '⊁',\n NotSucceedsEqual: '⪰̸',\n NotSucceedsSlantEqual: '⋡',\n NotSucceedsTilde: '≿̸',\n NotSuperset: '⊃⃒',\n NotSupersetEqual: '⊉',\n NotTilde: '≁',\n NotTildeEqual: '≄',\n NotTildeFullEqual: '≇',\n NotTildeTilde: '≉',\n NotVerticalBar: '∤',\n Nscr: '𝒩',\n Ntilde: 'Ñ',\n Nu: 'Ν',\n OElig: 'Œ',\n Oacute: 'Ó',\n Ocirc: 'Ô',\n Ocy: 'О',\n Odblac: 'Ő',\n Ofr: '𝔒',\n Ograve: 'Ò',\n Omacr: 'Ō',\n Omega: 'Ω',\n Omicron: 'Ο',\n Oopf: '𝕆',\n OpenCurlyDoubleQuote: '“',\n OpenCurlyQuote: '‘',\n Or: '⩔',\n Oscr: '𝒪',\n Oslash: 'Ø',\n Otilde: 'Õ',\n Otimes: '⨷',\n Ouml: 'Ö',\n OverBar: '‾',\n OverBrace: '⏞',\n OverBracket: '⎴',\n OverParenthesis: '⏜',\n PartialD: '∂',\n Pcy: 'П',\n Pfr: '𝔓',\n Phi: 'Φ',\n Pi: 'Π',\n PlusMinus: '±',\n Poincareplane: 'ℌ',\n Popf: 'ℙ',\n Pr: '⪻',\n Precedes: '≺',\n PrecedesEqual: '⪯',\n PrecedesSlantEqual: '≼',\n PrecedesTilde: '≾',\n Prime: '″',\n Product: '∏',\n Proportion: '∷',\n Proportional: '∝',\n Pscr: '𝒫',\n Psi: 'Ψ',\n QUOT: '\"',\n Qfr: '𝔔',\n Qopf: 'ℚ',\n Qscr: '𝒬',\n RBarr: '⤐',\n REG: '®',\n Racute: 'Ŕ',\n Rang: '⟫',\n Rarr: '↠',\n Rarrtl: '⤖',\n Rcaron: 'Ř',\n Rcedil: 'Ŗ',\n Rcy: 'Р',\n Re: 'ℜ',\n ReverseElement: '∋',\n ReverseEquilibrium: '⇋',\n ReverseUpEquilibrium: '⥯',\n Rfr: 'ℜ',\n Rho: 'Ρ',\n RightAngleBracket: '⟩',\n RightArrow: '→',\n RightArrowBar: '⇥',\n RightArrowLeftArrow: '⇄',\n RightCeiling: '⌉',\n RightDoubleBracket: '⟧',\n RightDownTeeVector: '⥝',\n RightDownVector: '⇂',\n RightDownVectorBar: '⥕',\n RightFloor: '⌋',\n RightTee: '⊢',\n RightTeeArrow: '↦',\n RightTeeVector: '⥛',\n RightTriangle: '⊳',\n RightTriangleBar: '⧐',\n RightTriangleEqual: '⊵',\n RightUpDownVector: '⥏',\n RightUpTeeVector: '⥜',\n RightUpVector: '↾',\n RightUpVectorBar: '⥔',\n RightVector: '⇀',\n RightVectorBar: '⥓',\n Rightarrow: '⇒',\n Ropf: 'ℝ',\n RoundImplies: '⥰',\n Rrightarrow: '⇛',\n Rscr: 'ℛ',\n Rsh: '↱',\n RuleDelayed: '⧴',\n SHCHcy: 'Щ',\n SHcy: 'Ш',\n SOFTcy: 'Ь',\n Sacute: 'Ś',\n Sc: '⪼',\n Scaron: 'Š',\n Scedil: 'Ş',\n Scirc: 'Ŝ',\n Scy: 'С',\n Sfr: '𝔖',\n ShortDownArrow: '↓',\n ShortLeftArrow: '←',\n ShortRightArrow: '→',\n ShortUpArrow: '↑',\n Sigma: 'Σ',\n SmallCircle: '∘',\n Sopf: '𝕊',\n Sqrt: '√',\n Square: '□',\n SquareIntersection: '⊓',\n SquareSubset: '⊏',\n SquareSubsetEqual: '⊑',\n SquareSuperset: '⊐',\n SquareSupersetEqual: '⊒',\n SquareUnion: '⊔',\n Sscr: '𝒮',\n Star: '⋆',\n Sub: '⋐',\n Subset: '⋐',\n SubsetEqual: '⊆',\n Succeeds: '≻',\n SucceedsEqual: '⪰',\n SucceedsSlantEqual: '≽',\n SucceedsTilde: '≿',\n SuchThat: '∋',\n Sum: '∑',\n Sup: '⋑',\n Superset: '⊃',\n SupersetEqual: '⊇',\n Supset: '⋑',\n THORN: 'Þ',\n TRADE: '™',\n TSHcy: 'Ћ',\n TScy: 'Ц',\n Tab: '\\t',\n Tau: 'Τ',\n Tcaron: 'Ť',\n Tcedil: 'Ţ',\n Tcy: 'Т',\n Tfr: '𝔗',\n Therefore: '∴',\n Theta: 'Θ',\n ThickSpace: ' ',\n ThinSpace: ' ',\n Tilde: '∼',\n TildeEqual: '≃',\n TildeFullEqual: '≅',\n TildeTilde: '≈',\n Topf: '𝕋',\n TripleDot: '⃛',\n Tscr: '𝒯',\n Tstrok: 'Ŧ',\n Uacute: 'Ú',\n Uarr: '↟',\n Uarrocir: '⥉',\n Ubrcy: 'Ў',\n Ubreve: 'Ŭ',\n Ucirc: 'Û',\n Ucy: 'У',\n Udblac: 'Ű',\n Ufr: '𝔘',\n Ugrave: 'Ù',\n Umacr: 'Ū',\n UnderBar: '_',\n UnderBrace: '⏟',\n UnderBracket: '⎵',\n UnderParenthesis: '⏝',\n Union: '⋃',\n UnionPlus: '⊎',\n Uogon: 'Ų',\n Uopf: '𝕌',\n UpArrow: '↑',\n UpArrowBar: '⤒',\n UpArrowDownArrow: '⇅',\n UpDownArrow: '↕',\n UpEquilibrium: '⥮',\n UpTee: '⊥',\n UpTeeArrow: '↥',\n Uparrow: '⇑',\n Updownarrow: '⇕',\n UpperLeftArrow: '↖',\n UpperRightArrow: '↗',\n Upsi: 'ϒ',\n Upsilon: 'Υ',\n Uring: 'Ů',\n Uscr: '𝒰',\n Utilde: 'Ũ',\n Uuml: 'Ü',\n VDash: '⊫',\n Vbar: '⫫',\n Vcy: 'В',\n Vdash: '⊩',\n Vdashl: '⫦',\n Vee: '⋁',\n Verbar: '‖',\n Vert: '‖',\n VerticalBar: '∣',\n VerticalLine: '|',\n VerticalSeparator: '❘',\n VerticalTilde: '≀',\n VeryThinSpace: ' ',\n Vfr: '𝔙',\n Vopf: '𝕍',\n Vscr: '𝒱',\n Vvdash: '⊪',\n Wcirc: 'Ŵ',\n Wedge: '⋀',\n Wfr: '𝔚',\n Wopf: '𝕎',\n Wscr: '𝒲',\n Xfr: '𝔛',\n Xi: 'Ξ',\n Xopf: '𝕏',\n Xscr: '𝒳',\n YAcy: 'Я',\n YIcy: 'Ї',\n YUcy: 'Ю',\n Yacute: 'Ý',\n Ycirc: 'Ŷ',\n Ycy: 'Ы',\n Yfr: '𝔜',\n Yopf: '𝕐',\n Yscr: '𝒴',\n Yuml: 'Ÿ',\n ZHcy: 'Ж',\n Zacute: 'Ź',\n Zcaron: 'Ž',\n Zcy: 'З',\n Zdot: 'Ż',\n ZeroWidthSpace: '',\n Zeta: 'Ζ',\n Zfr: 'ℨ',\n Zopf: 'ℤ',\n Zscr: '𝒵',\n aacute: 'á',\n abreve: 'ă',\n ac: '∾',\n acE: '∾̳',\n acd: '∿',\n acirc: 'â',\n acute: '´',\n acy: 'а',\n aelig: 'æ',\n af: '',\n afr: '𝔞',\n agrave: 'à',\n alefsym: 'ℵ',\n aleph: 'ℵ',\n alpha: 'α',\n amacr: 'ā',\n amalg: '⨿',\n amp: '&',\n and: '∧',\n andand: '⩕',\n andd: '⩜',\n andslope: '⩘',\n andv: '⩚',\n ang: '∠',\n ange: '⦤',\n angle: '∠',\n angmsd: '∡',\n angmsdaa: '⦨',\n angmsdab: '⦩',\n angmsdac: '⦪',\n angmsdad: '⦫',\n angmsdae: '⦬',\n angmsdaf: '⦭',\n angmsdag: '⦮',\n angmsdah: '⦯',\n angrt: '∟',\n angrtvb: '⊾',\n angrtvbd: '⦝',\n angsph: '∢',\n angst: 'Å',\n angzarr: '⍼',\n aogon: 'ą',\n aopf: '𝕒',\n ap: '≈',\n apE: '⩰',\n apacir: '⩯',\n ape: '≊',\n apid: '≋',\n apos: \"'\",\n approx: '≈',\n approxeq: '≊',\n aring: 'å',\n ascr: '𝒶',\n ast: '*',\n asymp: '≈',\n asympeq: '≍',\n atilde: 'ã',\n auml: 'ä',\n awconint: '∳',\n awint: '⨑',\n bNot: '⫭',\n backcong: '≌',\n backepsilon: '϶',\n backprime: '‵',\n backsim: '∽',\n backsimeq: '⋍',\n barvee: '⊽',\n barwed: '⌅',\n barwedge: '⌅',\n bbrk: '⎵',\n bbrktbrk: '⎶',\n bcong: '≌',\n bcy: 'б',\n bdquo: '„',\n becaus: '∵',\n because: '∵',\n bemptyv: '⦰',\n bepsi: '϶',\n bernou: 'ℬ',\n beta: 'β',\n beth: 'ℶ',\n between: '≬',\n bfr: '𝔟',\n bigcap: '⋂',\n bigcirc: '◯',\n bigcup: '⋃',\n bigodot: '⨀',\n bigoplus: '⨁',\n bigotimes: '⨂',\n bigsqcup: '⨆',\n bigstar: '★',\n bigtriangledown: '▽',\n bigtriangleup: '△',\n biguplus: '⨄',\n bigvee: '⋁',\n bigwedge: '⋀',\n bkarow: '⤍',\n blacklozenge: '⧫',\n blacksquare: '▪',\n blacktriangle: '▴',\n blacktriangledown: '▾',\n blacktriangleleft: '◂',\n blacktriangleright: '▸',\n blank: '␣',\n blk12: '▒',\n blk14: '░',\n blk34: '▓',\n block: '█',\n bne: '=⃥',\n bnequiv: '≡⃥',\n bnot: '⌐',\n bopf: '𝕓',\n bot: '⊥',\n bottom: '⊥',\n bowtie: '⋈',\n boxDL: '╗',\n boxDR: '╔',\n boxDl: '╖',\n boxDr: '╓',\n boxH: '═',\n boxHD: '╦',\n boxHU: '╩',\n boxHd: '╤',\n boxHu: '╧',\n boxUL: '╝',\n boxUR: '╚',\n boxUl: '╜',\n boxUr: '╙',\n boxV: '║',\n boxVH: '╬',\n boxVL: '╣',\n boxVR: '╠',\n boxVh: '╫',\n boxVl: '╢',\n boxVr: '╟',\n boxbox: '⧉',\n boxdL: '╕',\n boxdR: '╒',\n boxdl: '┐',\n boxdr: '┌',\n boxh: '─',\n boxhD: '╥',\n boxhU: '╨',\n boxhd: '┬',\n boxhu: '┴',\n boxminus: '⊟',\n boxplus: '⊞',\n boxtimes: '⊠',\n boxuL: '╛',\n boxuR: '╘',\n boxul: '┘',\n boxur: '└',\n boxv: '│',\n boxvH: '╪',\n boxvL: '╡',\n boxvR: '╞',\n boxvh: '┼',\n boxvl: '┤',\n boxvr: '├',\n bprime: '‵',\n breve: '˘',\n brvbar: '¦',\n bscr: '𝒷',\n bsemi: '⁏',\n bsim: '∽',\n bsime: '⋍',\n bsol: '\\\\',\n bsolb: '⧅',\n bsolhsub: '⟈',\n bull: '•',\n bullet: '•',\n bump: '≎',\n bumpE: '⪮',\n bumpe: '≏',\n bumpeq: '≏',\n cacute: 'ć',\n cap: '∩',\n capand: '⩄',\n capbrcup: '⩉',\n capcap: '⩋',\n capcup: '⩇',\n capdot: '⩀',\n caps: '∩︀',\n caret: '⁁',\n caron: 'ˇ',\n ccaps: '⩍',\n ccaron: 'č',\n ccedil: 'ç',\n ccirc: 'ĉ',\n ccups: '⩌',\n ccupssm: '⩐',\n cdot: 'ċ',\n cedil: '¸',\n cemptyv: '⦲',\n cent: '¢',\n centerdot: '·',\n cfr: '𝔠',\n chcy: 'ч',\n check: '✓',\n checkmark: '✓',\n chi: 'χ',\n cir: '○',\n cirE: '⧃',\n circ: 'ˆ',\n circeq: '≗',\n circlearrowleft: '↺',\n circlearrowright: '↻',\n circledR: '®',\n circledS: 'Ⓢ',\n circledast: '⊛',\n circledcirc: '⊚',\n circleddash: '⊝',\n cire: '≗',\n cirfnint: '⨐',\n cirmid: '⫯',\n cirscir: '⧂',\n clubs: '♣',\n clubsuit: '♣',\n colon: ':',\n colone: '≔',\n coloneq: '≔',\n comma: ',',\n commat: '@',\n comp: '∁',\n compfn: '∘',\n complement: '∁',\n complexes: 'ℂ',\n cong: '≅',\n congdot: '⩭',\n conint: '∮',\n copf: '𝕔',\n coprod: '∐',\n copy: '©',\n copysr: '℗',\n crarr: '↵',\n cross: '✗',\n cscr: '𝒸',\n csub: '⫏',\n csube: '⫑',\n csup: '⫐',\n csupe: '⫒',\n ctdot: '⋯',\n cudarrl: '⤸',\n cudarrr: '⤵',\n cuepr: '⋞',\n cuesc: '⋟',\n cularr: '↶',\n cularrp: '⤽',\n cup: '∪',\n cupbrcap: '⩈',\n cupcap: '⩆',\n cupcup: '⩊',\n cupdot: '⊍',\n cupor: '⩅',\n cups: '∪︀',\n curarr: '↷',\n curarrm: '⤼',\n curlyeqprec: '⋞',\n curlyeqsucc: '⋟',\n curlyvee: '⋎',\n curlywedge: '⋏',\n curren: '¤',\n curvearrowleft: '↶',\n curvearrowright: '↷',\n cuvee: '⋎',\n cuwed: '⋏',\n cwconint: '∲',\n cwint: '∱',\n cylcty: '⌭',\n dArr: '⇓',\n dHar: '⥥',\n dagger: '†',\n daleth: 'ℸ',\n darr: '↓',\n dash: '‐',\n dashv: '⊣',\n dbkarow: '⤏',\n dblac: '˝',\n dcaron: 'ď',\n dcy: 'д',\n dd: 'ⅆ',\n ddagger: '‡',\n ddarr: '⇊',\n ddotseq: '⩷',\n deg: '°',\n delta: 'δ',\n demptyv: '⦱',\n dfisht: '⥿',\n dfr: '𝔡',\n dharl: '⇃',\n dharr: '⇂',\n diam: '⋄',\n diamond: '⋄',\n diamondsuit: '♦',\n diams: '♦',\n die: '¨',\n digamma: 'ϝ',\n disin: '⋲',\n div: '÷',\n divide: '÷',\n divideontimes: '⋇',\n divonx: '⋇',\n djcy: 'ђ',\n dlcorn: '⌞',\n dlcrop: '⌍',\n dollar: '$',\n dopf: '𝕕',\n dot: '˙',\n doteq: '≐',\n doteqdot: '≑',\n dotminus: '∸',\n dotplus: '∔',\n dotsquare: '⊡',\n doublebarwedge: '⌆',\n downarrow: '↓',\n downdownarrows: '⇊',\n downharpoonleft: '⇃',\n downharpoonright: '⇂',\n drbkarow: '⤐',\n drcorn: '⌟',\n drcrop: '⌌',\n dscr: '𝒹',\n dscy: 'ѕ',\n dsol: '⧶',\n dstrok: 'đ',\n dtdot: '⋱',\n dtri: '▿',\n dtrif: '▾',\n duarr: '⇵',\n duhar: '⥯',\n dwangle: '⦦',\n dzcy: 'џ',\n dzigrarr: '⟿',\n eDDot: '⩷',\n eDot: '≑',\n eacute: 'é',\n easter: '⩮',\n ecaron: 'ě',\n ecir: '≖',\n ecirc: 'ê',\n ecolon: '≕',\n ecy: 'э',\n edot: 'ė',\n ee: 'ⅇ',\n efDot: '≒',\n efr: '𝔢',\n eg: '⪚',\n egrave: 'è',\n egs: '⪖',\n egsdot: '⪘',\n el: '⪙',\n elinters: '⏧',\n ell: 'ℓ',\n els: '⪕',\n elsdot: '⪗',\n emacr: 'ē',\n empty: '∅',\n emptyset: '∅',\n emptyv: '∅',\n emsp13: ' ',\n emsp14: ' ',\n emsp: ' ',\n eng: 'ŋ',\n ensp: ' ',\n eogon: 'ę',\n eopf: '𝕖',\n epar: '⋕',\n eparsl: '⧣',\n eplus: '⩱',\n epsi: 'ε',\n epsilon: 'ε',\n epsiv: 'ϵ',\n eqcirc: '≖',\n eqcolon: '≕',\n eqsim: '≂',\n eqslantgtr: '⪖',\n eqslantless: '⪕',\n equals: '=',\n equest: '≟',\n equiv: '≡',\n equivDD: '⩸',\n eqvparsl: '⧥',\n erDot: '≓',\n erarr: '⥱',\n escr: 'ℯ',\n esdot: '≐',\n esim: '≂',\n eta: 'η',\n eth: 'ð',\n euml: 'ë',\n euro: '€',\n excl: '!',\n exist: '∃',\n expectation: 'ℰ',\n exponentiale: 'ⅇ',\n fallingdotseq: '≒',\n fcy: 'ф',\n female: '♀',\n ffilig: 'ffi',\n fflig: 'ff',\n ffllig: 'ffl',\n ffr: '𝔣',\n filig: 'fi',\n fjlig: 'fj',\n flat: '♭',\n fllig: 'fl',\n fltns: '▱',\n fnof: 'ƒ',\n fopf: '𝕗',\n forall: '∀',\n fork: '⋔',\n forkv: '⫙',\n fpartint: '⨍',\n frac12: '½',\n frac13: '⅓',\n frac14: '¼',\n frac15: '⅕',\n frac16: '⅙',\n frac18: '⅛',\n frac23: '⅔',\n frac25: '⅖',\n frac34: '¾',\n frac35: '⅗',\n frac38: '⅜',\n frac45: '⅘',\n frac56: '⅚',\n frac58: '⅝',\n frac78: '⅞',\n frasl: '⁄',\n frown: '⌢',\n fscr: '𝒻',\n gE: '≧',\n gEl: '⪌',\n gacute: 'ǵ',\n gamma: 'γ',\n gammad: 'ϝ',\n gap: '⪆',\n gbreve: 'ğ',\n gcirc: 'ĝ',\n gcy: 'г',\n gdot: 'ġ',\n ge: '≥',\n gel: '⋛',\n geq: '≥',\n geqq: '≧',\n geqslant: '⩾',\n ges: '⩾',\n gescc: '⪩',\n gesdot: '⪀',\n gesdoto: '⪂',\n gesdotol: '⪄',\n gesl: '⋛︀',\n gesles: '⪔',\n gfr: '𝔤',\n gg: '≫',\n ggg: '⋙',\n gimel: 'ℷ',\n gjcy: 'ѓ',\n gl: '≷',\n glE: '⪒',\n gla: '⪥',\n glj: '⪤',\n gnE: '≩',\n gnap: '⪊',\n gnapprox: '⪊',\n gne: '⪈',\n gneq: '⪈',\n gneqq: '≩',\n gnsim: '⋧',\n gopf: '𝕘',\n grave: '`',\n gscr: 'ℊ',\n gsim: '≳',\n gsime: '⪎',\n gsiml: '⪐',\n gt: '>',\n gtcc: '⪧',\n gtcir: '⩺',\n gtdot: '⋗',\n gtlPar: '⦕',\n gtquest: '⩼',\n gtrapprox: '⪆',\n gtrarr: '⥸',\n gtrdot: '⋗',\n gtreqless: '⋛',\n gtreqqless: '⪌',\n gtrless: '≷',\n gtrsim: '≳',\n gvertneqq: '≩︀',\n gvnE: '≩︀',\n hArr: '⇔',\n hairsp: ' ',\n half: '½',\n hamilt: 'ℋ',\n hardcy: 'ъ',\n harr: '↔',\n harrcir: '⥈',\n harrw: '↭',\n hbar: 'ℏ',\n hcirc: 'ĥ',\n hearts: '♥',\n heartsuit: '♥',\n hellip: '…',\n hercon: '⊹',\n hfr: '𝔥',\n hksearow: '⤥',\n hkswarow: '⤦',\n hoarr: '⇿',\n homtht: '∻',\n hookleftarrow: '↩',\n hookrightarrow: '↪',\n hopf: '𝕙',\n horbar: '―',\n hscr: '𝒽',\n hslash: 'ℏ',\n hstrok: 'ħ',\n hybull: '⁃',\n hyphen: '‐',\n iacute: 'í',\n ic: '',\n icirc: 'î',\n icy: 'и',\n iecy: 'е',\n iexcl: '¡',\n iff: '⇔',\n ifr: '𝔦',\n igrave: 'ì',\n ii: 'ⅈ',\n iiiint: '⨌',\n iiint: '∭',\n iinfin: '⧜',\n iiota: '℩',\n ijlig: 'ij',\n imacr: 'ī',\n image: 'ℑ',\n imagline: 'ℐ',\n imagpart: 'ℑ',\n imath: 'ı',\n imof: '⊷',\n imped: 'Ƶ',\n in: '∈',\n incare: '℅',\n infin: '∞',\n infintie: '⧝',\n inodot: 'ı',\n int: '∫',\n intcal: '⊺',\n integers: 'ℤ',\n intercal: '⊺',\n intlarhk: '⨗',\n intprod: '⨼',\n iocy: 'ё',\n iogon: 'į',\n iopf: '𝕚',\n iota: 'ι',\n iprod: '⨼',\n iquest: '¿',\n iscr: '𝒾',\n isin: '∈',\n isinE: '⋹',\n isindot: '⋵',\n isins: '⋴',\n isinsv: '⋳',\n isinv: '∈',\n it: '',\n itilde: 'ĩ',\n iukcy: 'і',\n iuml: 'ï',\n jcirc: 'ĵ',\n jcy: 'й',\n jfr: '𝔧',\n jmath: 'ȷ',\n jopf: '𝕛',\n jscr: '𝒿',\n jsercy: 'ј',\n jukcy: 'є',\n kappa: 'κ',\n kappav: 'ϰ',\n kcedil: 'ķ',\n kcy: 'к',\n kfr: '𝔨',\n kgreen: 'ĸ',\n khcy: 'х',\n kjcy: 'ќ',\n kopf: '𝕜',\n kscr: '𝓀',\n lAarr: '⇚',\n lArr: '⇐',\n lAtail: '⤛',\n lBarr: '⤎',\n lE: '≦',\n lEg: '⪋',\n lHar: '⥢',\n lacute: 'ĺ',\n laemptyv: '⦴',\n lagran: 'ℒ',\n lambda: 'λ',\n lang: '⟨',\n langd: '⦑',\n langle: '⟨',\n lap: '⪅',\n laquo: '«',\n larr: '←',\n larrb: '⇤',\n larrbfs: '⤟',\n larrfs: '⤝',\n larrhk: '↩',\n larrlp: '↫',\n larrpl: '⤹',\n larrsim: '⥳',\n larrtl: '↢',\n lat: '⪫',\n latail: '⤙',\n late: '⪭',\n lates: '⪭︀',\n lbarr: '⤌',\n lbbrk: '❲',\n lbrace: '{',\n lbrack: '[',\n lbrke: '⦋',\n lbrksld: '⦏',\n lbrkslu: '⦍',\n lcaron: 'ľ',\n lcedil: 'ļ',\n lceil: '⌈',\n lcub: '{',\n lcy: 'л',\n ldca: '⤶',\n ldquo: '“',\n ldquor: '„',\n ldrdhar: '⥧',\n ldrushar: '⥋',\n ldsh: '↲',\n le: '≤',\n leftarrow: '←',\n leftarrowtail: '↢',\n leftharpoondown: '↽',\n leftharpoonup: '↼',\n leftleftarrows: '⇇',\n leftrightarrow: '↔',\n leftrightarrows: '⇆',\n leftrightharpoons: '⇋',\n leftrightsquigarrow: '↭',\n leftthreetimes: '⋋',\n leg: '⋚',\n leq: '≤',\n leqq: '≦',\n leqslant: '⩽',\n les: '⩽',\n lescc: '⪨',\n lesdot: '⩿',\n lesdoto: '⪁',\n lesdotor: '⪃',\n lesg: '⋚︀',\n lesges: '⪓',\n lessapprox: '⪅',\n lessdot: '⋖',\n lesseqgtr: '⋚',\n lesseqqgtr: '⪋',\n lessgtr: '≶',\n lesssim: '≲',\n lfisht: '⥼',\n lfloor: '⌊',\n lfr: '𝔩',\n lg: '≶',\n lgE: '⪑',\n lhard: '↽',\n lharu: '↼',\n lharul: '⥪',\n lhblk: '▄',\n ljcy: 'љ',\n ll: '≪',\n llarr: '⇇',\n llcorner: '⌞',\n llhard: '⥫',\n lltri: '◺',\n lmidot: 'ŀ',\n lmoust: '⎰',\n lmoustache: '⎰',\n lnE: '≨',\n lnap: '⪉',\n lnapprox: '⪉',\n lne: '⪇',\n lneq: '⪇',\n lneqq: '≨',\n lnsim: '⋦',\n loang: '⟬',\n loarr: '⇽',\n lobrk: '⟦',\n longleftarrow: '⟵',\n longleftrightarrow: '⟷',\n longmapsto: '⟼',\n longrightarrow: '⟶',\n looparrowleft: '↫',\n looparrowright: '↬',\n lopar: '⦅',\n lopf: '𝕝',\n loplus: '⨭',\n lotimes: '⨴',\n lowast: '∗',\n lowbar: '_',\n loz: '◊',\n lozenge: '◊',\n lozf: '⧫',\n lpar: '(',\n lparlt: '⦓',\n lrarr: '⇆',\n lrcorner: '⌟',\n lrhar: '⇋',\n lrhard: '⥭',\n lrm: '',\n lrtri: '⊿',\n lsaquo: '‹',\n lscr: '𝓁',\n lsh: '↰',\n lsim: '≲',\n lsime: '⪍',\n lsimg: '⪏',\n lsqb: '[',\n lsquo: '‘',\n lsquor: '‚',\n lstrok: 'ł',\n lt: '<',\n ltcc: '⪦',\n ltcir: '⩹',\n ltdot: '⋖',\n lthree: '⋋',\n ltimes: '⋉',\n ltlarr: '⥶',\n ltquest: '⩻',\n ltrPar: '⦖',\n ltri: '◃',\n ltrie: '⊴',\n ltrif: '◂',\n lurdshar: '⥊',\n luruhar: '⥦',\n lvertneqq: '≨︀',\n lvnE: '≨︀',\n mDDot: '∺',\n macr: '¯',\n male: '♂',\n malt: '✠',\n maltese: '✠',\n map: '↦',\n mapsto: '↦',\n mapstodown: '↧',\n mapstoleft: '↤',\n mapstoup: '↥',\n marker: '▮',\n mcomma: '⨩',\n mcy: 'м',\n mdash: '—',\n measuredangle: '∡',\n mfr: '𝔪',\n mho: '℧',\n micro: 'µ',\n mid: '∣',\n midast: '*',\n midcir: '⫰',\n middot: '·',\n minus: '−',\n minusb: '⊟',\n minusd: '∸',\n minusdu: '⨪',\n mlcp: '⫛',\n mldr: '…',\n mnplus: '∓',\n models: '⊧',\n mopf: '𝕞',\n mp: '∓',\n mscr: '𝓂',\n mstpos: '∾',\n mu: 'μ',\n multimap: '⊸',\n mumap: '⊸',\n nGg: '⋙̸',\n nGt: '≫⃒',\n nGtv: '≫̸',\n nLeftarrow: '⇍',\n nLeftrightarrow: '⇎',\n nLl: '⋘̸',\n nLt: '≪⃒',\n nLtv: '≪̸',\n nRightarrow: '⇏',\n nVDash: '⊯',\n nVdash: '⊮',\n nabla: '∇',\n nacute: 'ń',\n nang: '∠⃒',\n nap: '≉',\n napE: '⩰̸',\n napid: '≋̸',\n napos: 'ʼn',\n napprox: '≉',\n natur: '♮',\n natural: '♮',\n naturals: 'ℕ',\n nbsp: ' ',\n nbump: '≎̸',\n nbumpe: '≏̸',\n ncap: '⩃',\n ncaron: 'ň',\n ncedil: 'ņ',\n ncong: '≇',\n ncongdot: '⩭̸',\n ncup: '⩂',\n ncy: 'н',\n ndash: '–',\n ne: '≠',\n neArr: '⇗',\n nearhk: '⤤',\n nearr: '↗',\n nearrow: '↗',\n nedot: '≐̸',\n nequiv: '≢',\n nesear: '⤨',\n nesim: '≂̸',\n nexist: '∄',\n nexists: '∄',\n nfr: '𝔫',\n ngE: '≧̸',\n nge: '≱',\n ngeq: '≱',\n ngeqq: '≧̸',\n ngeqslant: '⩾̸',\n nges: '⩾̸',\n ngsim: '≵',\n ngt: '≯',\n ngtr: '≯',\n nhArr: '⇎',\n nharr: '↮',\n nhpar: '⫲',\n ni: '∋',\n nis: '⋼',\n nisd: '⋺',\n niv: '∋',\n njcy: 'њ',\n nlArr: '⇍',\n nlE: '≦̸',\n nlarr: '↚',\n nldr: '‥',\n nle: '≰',\n nleftarrow: '↚',\n nleftrightarrow: '↮',\n nleq: '≰',\n nleqq: '≦̸',\n nleqslant: '⩽̸',\n nles: '⩽̸',\n nless: '≮',\n nlsim: '≴',\n nlt: '≮',\n nltri: '⋪',\n nltrie: '⋬',\n nmid: '∤',\n nopf: '𝕟',\n not: '¬',\n notin: '∉',\n notinE: '⋹̸',\n notindot: '⋵̸',\n notinva: '∉',\n notinvb: '⋷',\n notinvc: '⋶',\n notni: '∌',\n notniva: '∌',\n notnivb: '⋾',\n notnivc: '⋽',\n npar: '∦',\n nparallel: '∦',\n nparsl: '⫽⃥',\n npart: '∂̸',\n npolint: '⨔',\n npr: '⊀',\n nprcue: '⋠',\n npre: '⪯̸',\n nprec: '⊀',\n npreceq: '⪯̸',\n nrArr: '⇏',\n nrarr: '↛',\n nrarrc: '⤳̸',\n nrarrw: '↝̸',\n nrightarrow: '↛',\n nrtri: '⋫',\n nrtrie: '⋭',\n nsc: '⊁',\n nsccue: '⋡',\n nsce: '⪰̸',\n nscr: '𝓃',\n nshortmid: '∤',\n nshortparallel: '∦',\n nsim: '≁',\n nsime: '≄',\n nsimeq: '≄',\n nsmid: '∤',\n nspar: '∦',\n nsqsube: '⋢',\n nsqsupe: '⋣',\n nsub: '⊄',\n nsubE: '⫅̸',\n nsube: '⊈',\n nsubset: '⊂⃒',\n nsubseteq: '⊈',\n nsubseteqq: '⫅̸',\n nsucc: '⊁',\n nsucceq: '⪰̸',\n nsup: '⊅',\n nsupE: '⫆̸',\n nsupe: '⊉',\n nsupset: '⊃⃒',\n nsupseteq: '⊉',\n nsupseteqq: '⫆̸',\n ntgl: '≹',\n ntilde: 'ñ',\n ntlg: '≸',\n ntriangleleft: '⋪',\n ntrianglelefteq: '⋬',\n ntriangleright: '⋫',\n ntrianglerighteq: '⋭',\n nu: 'ν',\n num: '#',\n numero: '№',\n numsp: ' ',\n nvDash: '⊭',\n nvHarr: '⤄',\n nvap: '≍⃒',\n nvdash: '⊬',\n nvge: '≥⃒',\n nvgt: '>⃒',\n nvinfin: '⧞',\n nvlArr: '⤂',\n nvle: '≤⃒',\n nvlt: '<⃒',\n nvltrie: '⊴⃒',\n nvrArr: '⤃',\n nvrtrie: '⊵⃒',\n nvsim: '∼⃒',\n nwArr: '⇖',\n nwarhk: '⤣',\n nwarr: '↖',\n nwarrow: '↖',\n nwnear: '⤧',\n oS: 'Ⓢ',\n oacute: 'ó',\n oast: '⊛',\n ocir: '⊚',\n ocirc: 'ô',\n ocy: 'о',\n odash: '⊝',\n odblac: 'ő',\n odiv: '⨸',\n odot: '⊙',\n odsold: '⦼',\n oelig: 'œ',\n ofcir: '⦿',\n ofr: '𝔬',\n ogon: '˛',\n ograve: 'ò',\n ogt: '⧁',\n ohbar: '⦵',\n ohm: 'Ω',\n oint: '∮',\n olarr: '↺',\n olcir: '⦾',\n olcross: '⦻',\n oline: '‾',\n olt: '⧀',\n omacr: 'ō',\n omega: 'ω',\n omicron: 'ο',\n omid: '⦶',\n ominus: '⊖',\n oopf: '𝕠',\n opar: '⦷',\n operp: '⦹',\n oplus: '⊕',\n or: '∨',\n orarr: '↻',\n ord: '⩝',\n order: 'ℴ',\n orderof: 'ℴ',\n ordf: 'ª',\n ordm: 'º',\n origof: '⊶',\n oror: '⩖',\n orslope: '⩗',\n orv: '⩛',\n oscr: 'ℴ',\n oslash: 'ø',\n osol: '⊘',\n otilde: 'õ',\n otimes: '⊗',\n otimesas: '⨶',\n ouml: 'ö',\n ovbar: '⌽',\n par: '∥',\n para: '¶',\n parallel: '∥',\n parsim: '⫳',\n parsl: '⫽',\n part: '∂',\n pcy: 'п',\n percnt: '%',\n period: '.',\n permil: '‰',\n perp: '⊥',\n pertenk: '‱',\n pfr: '𝔭',\n phi: 'φ',\n phiv: 'ϕ',\n phmmat: 'ℳ',\n phone: '☎',\n pi: 'π',\n pitchfork: '⋔',\n piv: 'ϖ',\n planck: 'ℏ',\n planckh: 'ℎ',\n plankv: 'ℏ',\n plus: '+',\n plusacir: '⨣',\n plusb: '⊞',\n pluscir: '⨢',\n plusdo: '∔',\n plusdu: '⨥',\n pluse: '⩲',\n plusmn: '±',\n plussim: '⨦',\n plustwo: '⨧',\n pm: '±',\n pointint: '⨕',\n popf: '𝕡',\n pound: '£',\n pr: '≺',\n prE: '⪳',\n prap: '⪷',\n prcue: '≼',\n pre: '⪯',\n prec: '≺',\n precapprox: '⪷',\n preccurlyeq: '≼',\n preceq: '⪯',\n precnapprox: '⪹',\n precneqq: '⪵',\n precnsim: '⋨',\n precsim: '≾',\n prime: '′',\n primes: 'ℙ',\n prnE: '⪵',\n prnap: '⪹',\n prnsim: '⋨',\n prod: '∏',\n profalar: '⌮',\n profline: '⌒',\n profsurf: '⌓',\n prop: '∝',\n propto: '∝',\n prsim: '≾',\n prurel: '⊰',\n pscr: '𝓅',\n psi: 'ψ',\n puncsp: ' ',\n qfr: '𝔮',\n qint: '⨌',\n qopf: '𝕢',\n qprime: '⁗',\n qscr: '𝓆',\n quaternions: 'ℍ',\n quatint: '⨖',\n quest: '?',\n questeq: '≟',\n quot: '\"',\n rAarr: '⇛',\n rArr: '⇒',\n rAtail: '⤜',\n rBarr: '⤏',\n rHar: '⥤',\n race: '∽̱',\n racute: 'ŕ',\n radic: '√',\n raemptyv: '⦳',\n rang: '⟩',\n rangd: '⦒',\n range: '⦥',\n rangle: '⟩',\n raquo: '»',\n rarr: '→',\n rarrap: '⥵',\n rarrb: '⇥',\n rarrbfs: '⤠',\n rarrc: '⤳',\n rarrfs: '⤞',\n rarrhk: '↪',\n rarrlp: '↬',\n rarrpl: '⥅',\n rarrsim: '⥴',\n rarrtl: '↣',\n rarrw: '↝',\n ratail: '⤚',\n ratio: '∶',\n rationals: 'ℚ',\n rbarr: '⤍',\n rbbrk: '❳',\n rbrace: '}',\n rbrack: ']',\n rbrke: '⦌',\n rbrksld: '⦎',\n rbrkslu: '⦐',\n rcaron: 'ř',\n rcedil: 'ŗ',\n rceil: '⌉',\n rcub: '}',\n rcy: 'р',\n rdca: '⤷',\n rdldhar: '⥩',\n rdquo: '”',\n rdquor: '”',\n rdsh: '↳',\n real: 'ℜ',\n realine: 'ℛ',\n realpart: 'ℜ',\n reals: 'ℝ',\n rect: '▭',\n reg: '®',\n rfisht: '⥽',\n rfloor: '⌋',\n rfr: '𝔯',\n rhard: '⇁',\n rharu: '⇀',\n rharul: '⥬',\n rho: 'ρ',\n rhov: 'ϱ',\n rightarrow: '→',\n rightarrowtail: '↣',\n rightharpoondown: '⇁',\n rightharpoonup: '⇀',\n rightleftarrows: '⇄',\n rightleftharpoons: '⇌',\n rightrightarrows: '⇉',\n rightsquigarrow: '↝',\n rightthreetimes: '⋌',\n ring: '˚',\n risingdotseq: '≓',\n rlarr: '⇄',\n rlhar: '⇌',\n rlm: '',\n rmoust: '⎱',\n rmoustache: '⎱',\n rnmid: '⫮',\n roang: '⟭',\n roarr: '⇾',\n robrk: '⟧',\n ropar: '⦆',\n ropf: '𝕣',\n roplus: '⨮',\n rotimes: '⨵',\n rpar: ')',\n rpargt: '⦔',\n rppolint: '⨒',\n rrarr: '⇉',\n rsaquo: '›',\n rscr: '𝓇',\n rsh: '↱',\n rsqb: ']',\n rsquo: '’',\n rsquor: '’',\n rthree: '⋌',\n rtimes: '⋊',\n rtri: '▹',\n rtrie: '⊵',\n rtrif: '▸',\n rtriltri: '⧎',\n ruluhar: '⥨',\n rx: '℞',\n sacute: 'ś',\n sbquo: '‚',\n sc: '≻',\n scE: '⪴',\n scap: '⪸',\n scaron: 'š',\n sccue: '≽',\n sce: '⪰',\n scedil: 'ş',\n scirc: 'ŝ',\n scnE: '⪶',\n scnap: '⪺',\n scnsim: '⋩',\n scpolint: '⨓',\n scsim: '≿',\n scy: 'с',\n sdot: '⋅',\n sdotb: '⊡',\n sdote: '⩦',\n seArr: '⇘',\n searhk: '⤥',\n searr: '↘',\n searrow: '↘',\n sect: '§',\n semi: ';',\n seswar: '⤩',\n setminus: '∖',\n setmn: '∖',\n sext: '✶',\n sfr: '𝔰',\n sfrown: '⌢',\n sharp: '♯',\n shchcy: 'щ',\n shcy: 'ш',\n shortmid: '∣',\n shortparallel: '∥',\n shy: '',\n sigma: 'σ',\n sigmaf: 'ς',\n sigmav: 'ς',\n sim: '∼',\n simdot: '⩪',\n sime: '≃',\n simeq: '≃',\n simg: '⪞',\n simgE: '⪠',\n siml: '⪝',\n simlE: '⪟',\n simne: '≆',\n simplus: '⨤',\n simrarr: '⥲',\n slarr: '←',\n smallsetminus: '∖',\n smashp: '⨳',\n smeparsl: '⧤',\n smid: '∣',\n smile: '⌣',\n smt: '⪪',\n smte: '⪬',\n smtes: '⪬︀',\n softcy: 'ь',\n sol: '/',\n solb: '⧄',\n solbar: '⌿',\n sopf: '𝕤',\n spades: '♠',\n spadesuit: '♠',\n spar: '∥',\n sqcap: '⊓',\n sqcaps: '⊓︀',\n sqcup: '⊔',\n sqcups: '⊔︀',\n sqsub: '⊏',\n sqsube: '⊑',\n sqsubset: '⊏',\n sqsubseteq: '⊑',\n sqsup: '⊐',\n sqsupe: '⊒',\n sqsupset: '⊐',\n sqsupseteq: '⊒',\n squ: '□',\n square: '□',\n squarf: '▪',\n squf: '▪',\n srarr: '→',\n sscr: '𝓈',\n ssetmn: '∖',\n ssmile: '⌣',\n sstarf: '⋆',\n star: '☆',\n starf: '★',\n straightepsilon: 'ϵ',\n straightphi: 'ϕ',\n strns: '¯',\n sub: '⊂',\n subE: '⫅',\n subdot: '⪽',\n sube: '⊆',\n subedot: '⫃',\n submult: '⫁',\n subnE: '⫋',\n subne: '⊊',\n subplus: '⪿',\n subrarr: '⥹',\n subset: '⊂',\n subseteq: '⊆',\n subseteqq: '⫅',\n subsetneq: '⊊',\n subsetneqq: '⫋',\n subsim: '⫇',\n subsub: '⫕',\n subsup: '⫓',\n succ: '≻',\n succapprox: '⪸',\n succcurlyeq: '≽',\n succeq: '⪰',\n succnapprox: '⪺',\n succneqq: '⪶',\n succnsim: '⋩',\n succsim: '≿',\n sum: '∑',\n sung: '♪',\n sup1: '¹',\n sup2: '²',\n sup3: '³',\n sup: '⊃',\n supE: '⫆',\n supdot: '⪾',\n supdsub: '⫘',\n supe: '⊇',\n supedot: '⫄',\n suphsol: '⟉',\n suphsub: '⫗',\n suplarr: '⥻',\n supmult: '⫂',\n supnE: '⫌',\n supne: '⊋',\n supplus: '⫀',\n supset: '⊃',\n supseteq: '⊇',\n supseteqq: '⫆',\n supsetneq: '⊋',\n supsetneqq: '⫌',\n supsim: '⫈',\n supsub: '⫔',\n supsup: '⫖',\n swArr: '⇙',\n swarhk: '⤦',\n swarr: '↙',\n swarrow: '↙',\n swnwar: '⤪',\n szlig: 'ß',\n target: '⌖',\n tau: 'τ',\n tbrk: '⎴',\n tcaron: 'ť',\n tcedil: 'ţ',\n tcy: 'т',\n tdot: '⃛',\n telrec: '⌕',\n tfr: '𝔱',\n there4: '∴',\n therefore: '∴',\n theta: 'θ',\n thetasym: 'ϑ',\n thetav: 'ϑ',\n thickapprox: '≈',\n thicksim: '∼',\n thinsp: ' ',\n thkap: '≈',\n thksim: '∼',\n thorn: 'þ',\n tilde: '˜',\n times: '×',\n timesb: '⊠',\n timesbar: '⨱',\n timesd: '⨰',\n tint: '∭',\n toea: '⤨',\n top: '⊤',\n topbot: '⌶',\n topcir: '⫱',\n topf: '𝕥',\n topfork: '⫚',\n tosa: '⤩',\n tprime: '‴',\n trade: '™',\n triangle: '▵',\n triangledown: '▿',\n triangleleft: '◃',\n trianglelefteq: '⊴',\n triangleq: '≜',\n triangleright: '▹',\n trianglerighteq: '⊵',\n tridot: '◬',\n trie: '≜',\n triminus: '⨺',\n triplus: '⨹',\n trisb: '⧍',\n tritime: '⨻',\n trpezium: '⏢',\n tscr: '𝓉',\n tscy: 'ц',\n tshcy: 'ћ',\n tstrok: 'ŧ',\n twixt: '≬',\n twoheadleftarrow: '↞',\n twoheadrightarrow: '↠',\n uArr: '⇑',\n uHar: '⥣',\n uacute: 'ú',\n uarr: '↑',\n ubrcy: 'ў',\n ubreve: 'ŭ',\n ucirc: 'û',\n ucy: 'у',\n udarr: '⇅',\n udblac: 'ű',\n udhar: '⥮',\n ufisht: '⥾',\n ufr: '𝔲',\n ugrave: 'ù',\n uharl: '↿',\n uharr: '↾',\n uhblk: '▀',\n ulcorn: '⌜',\n ulcorner: '⌜',\n ulcrop: '⌏',\n ultri: '◸',\n umacr: 'ū',\n uml: '¨',\n uogon: 'ų',\n uopf: '𝕦',\n uparrow: '↑',\n updownarrow: '↕',\n upharpoonleft: '↿',\n upharpoonright: '↾',\n uplus: '⊎',\n upsi: 'υ',\n upsih: 'ϒ',\n upsilon: 'υ',\n upuparrows: '⇈',\n urcorn: '⌝',\n urcorner: '⌝',\n urcrop: '⌎',\n uring: 'ů',\n urtri: '◹',\n uscr: '𝓊',\n utdot: '⋰',\n utilde: 'ũ',\n utri: '▵',\n utrif: '▴',\n uuarr: '⇈',\n uuml: 'ü',\n uwangle: '⦧',\n vArr: '⇕',\n vBar: '⫨',\n vBarv: '⫩',\n vDash: '⊨',\n vangrt: '⦜',\n varepsilon: 'ϵ',\n varkappa: 'ϰ',\n varnothing: '∅',\n varphi: 'ϕ',\n varpi: 'ϖ',\n varpropto: '∝',\n varr: '↕',\n varrho: 'ϱ',\n varsigma: 'ς',\n varsubsetneq: '⊊︀',\n varsubsetneqq: '⫋︀',\n varsupsetneq: '⊋︀',\n varsupsetneqq: '⫌︀',\n vartheta: 'ϑ',\n vartriangleleft: '⊲',\n vartriangleright: '⊳',\n vcy: 'в',\n vdash: '⊢',\n vee: '∨',\n veebar: '⊻',\n veeeq: '≚',\n vellip: '⋮',\n verbar: '|',\n vert: '|',\n vfr: '𝔳',\n vltri: '⊲',\n vnsub: '⊂⃒',\n vnsup: '⊃⃒',\n vopf: '𝕧',\n vprop: '∝',\n vrtri: '⊳',\n vscr: '𝓋',\n vsubnE: '⫋︀',\n vsubne: '⊊︀',\n vsupnE: '⫌︀',\n vsupne: '⊋︀',\n vzigzag: '⦚',\n wcirc: 'ŵ',\n wedbar: '⩟',\n wedge: '∧',\n wedgeq: '≙',\n weierp: '℘',\n wfr: '𝔴',\n wopf: '𝕨',\n wp: '℘',\n wr: '≀',\n wreath: '≀',\n wscr: '𝓌',\n xcap: '⋂',\n xcirc: '◯',\n xcup: '⋃',\n xdtri: '▽',\n xfr: '𝔵',\n xhArr: '⟺',\n xharr: '⟷',\n xi: 'ξ',\n xlArr: '⟸',\n xlarr: '⟵',\n xmap: '⟼',\n xnis: '⋻',\n xodot: '⨀',\n xopf: '𝕩',\n xoplus: '⨁',\n xotime: '⨂',\n xrArr: '⟹',\n xrarr: '⟶',\n xscr: '𝓍',\n xsqcup: '⨆',\n xuplus: '⨄',\n xutri: '△',\n xvee: '⋁',\n xwedge: '⋀',\n yacute: 'ý',\n yacy: 'я',\n ycirc: 'ŷ',\n ycy: 'ы',\n yen: '¥',\n yfr: '𝔶',\n yicy: 'ї',\n yopf: '𝕪',\n yscr: '𝓎',\n yucy: 'ю',\n yuml: 'ÿ',\n zacute: 'ź',\n zcaron: 'ž',\n zcy: 'з',\n zdot: 'ż',\n zeetrf: 'ℨ',\n zeta: 'ζ',\n zfr: '𝔷',\n zhcy: 'ж',\n zigrarr: '⇝',\n zopf: '𝕫',\n zscr: '𝓏',\n zwj: '',\n zwnj: ''\n}\n","import {characterEntities} from 'character-entities'\n\nconst own = {}.hasOwnProperty\n\n/**\n * Decode a single character reference (without the `&` or `;`).\n * You probably only need this when you’re building parsers yourself that follow\n * different rules compared to HTML.\n * This is optimized to be tiny in browsers.\n *\n * @param {string} value\n * `notin` (named), `#123` (deci), `#x123` (hexa).\n * @returns {string|false}\n * Decoded reference.\n */\nexport function decodeNamedCharacterReference(value) {\n return own.call(characterEntities, value) ? characterEntities[value] : false\n}\n","/**\n * Like `Array#splice`, but smarter for giant arrays.\n *\n * `Array#splice` takes all items to be inserted as individual argument which\n * causes a stack overflow in V8 when trying to insert 100k items for instance.\n *\n * Otherwise, this does not return the removed items, and takes `items` as an\n * array instead of rest parameters.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {number} start\n * Index to remove/insert at (can be negative).\n * @param {number} remove\n * Number of items to remove.\n * @param {Array<T>} items\n * Items to inject into `list`.\n * @returns {undefined}\n * Nothing.\n */\nexport function splice(list, start, remove, items) {\n const end = list.length\n let chunkStart = 0\n /** @type {Array<unknown>} */\n let parameters\n\n // Make start between zero and `end` (included).\n if (start < 0) {\n start = -start > end ? 0 : end + start\n } else {\n start = start > end ? end : start\n }\n remove = remove > 0 ? remove : 0\n\n // No need to chunk the items if there’s only a couple (10k) items.\n if (items.length < 10000) {\n parameters = Array.from(items)\n parameters.unshift(start, remove)\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters)\n } else {\n // Delete `remove` items starting from `start`\n if (remove) list.splice(start, remove)\n\n // Insert the items in chunks to not cause stack overflows.\n while (chunkStart < items.length) {\n parameters = items.slice(chunkStart, chunkStart + 10000)\n parameters.unshift(start, 0)\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters)\n chunkStart += 10000\n start += 10000\n }\n }\n}\n\n/**\n * Append `items` (an array) at the end of `list` (another array).\n * When `list` was empty, returns `items` instead.\n *\n * This prevents a potentially expensive operation when `list` is empty,\n * and adds items in batches to prevent V8 from hanging.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {Array<T>} items\n * Items to add to `list`.\n * @returns {Array<T>}\n * Either `list` or `items`.\n */\nexport function push(list, items) {\n if (list.length > 0) {\n splice(list, list.length, 0, items)\n return list\n }\n return items\n}\n","/**\n * @typedef {import('micromark-util-types').Extension} Extension\n * @typedef {import('micromark-util-types').Handles} Handles\n * @typedef {import('micromark-util-types').HtmlExtension} HtmlExtension\n * @typedef {import('micromark-util-types').NormalizedExtension} NormalizedExtension\n */\n\nimport {splice} from 'micromark-util-chunked'\n\nconst hasOwnProperty = {}.hasOwnProperty\n\n/**\n * Combine multiple syntax extensions into one.\n *\n * @param {Array<Extension>} extensions\n * List of syntax extensions.\n * @returns {NormalizedExtension}\n * A single combined extension.\n */\nexport function combineExtensions(extensions) {\n /** @type {NormalizedExtension} */\n const all = {}\n let index = -1\n\n while (++index < extensions.length) {\n syntaxExtension(all, extensions[index])\n }\n\n return all\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {NormalizedExtension} all\n * Extension to merge into.\n * @param {Extension} extension\n * Extension to merge.\n * @returns {undefined}\n */\nfunction syntaxExtension(all, extension) {\n /** @type {keyof Extension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n /** @type {Record<string, unknown>} */\n const left = maybe || (all[hook] = {})\n /** @type {Record<string, unknown> | undefined} */\n const right = extension[hook]\n /** @type {string} */\n let code\n\n if (right) {\n for (code in right) {\n if (!hasOwnProperty.call(left, code)) left[code] = []\n const value = right[code]\n constructs(\n // @ts-expect-error Looks like a list.\n left[code],\n Array.isArray(value) ? value : value ? [value] : []\n )\n }\n }\n }\n}\n\n/**\n * Merge `list` into `existing` (both lists of constructs).\n * Mutates `existing`.\n *\n * @param {Array<unknown>} existing\n * @param {Array<unknown>} list\n * @returns {undefined}\n */\nfunction constructs(existing, list) {\n let index = -1\n /** @type {Array<unknown>} */\n const before = []\n\n while (++index < list.length) {\n // @ts-expect-error Looks like an object.\n ;(list[index].add === 'after' ? existing : before).push(list[index])\n }\n\n splice(existing, 0, 0, before)\n}\n\n/**\n * Combine multiple HTML extensions into one.\n *\n * @param {Array<HtmlExtension>} htmlExtensions\n * List of HTML extensions.\n * @returns {HtmlExtension}\n * A single combined HTML extension.\n */\nexport function combineHtmlExtensions(htmlExtensions) {\n /** @type {HtmlExtension} */\n const handlers = {}\n let index = -1\n\n while (++index < htmlExtensions.length) {\n htmlExtension(handlers, htmlExtensions[index])\n }\n\n return handlers\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {HtmlExtension} all\n * Extension to merge into.\n * @param {HtmlExtension} extension\n * Extension to merge.\n * @returns {undefined}\n */\nfunction htmlExtension(all, extension) {\n /** @type {keyof HtmlExtension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n const left = maybe || (all[hook] = {})\n const right = extension[hook]\n /** @type {keyof Handles} */\n let type\n\n if (right) {\n for (type in right) {\n // @ts-expect-error assume document vs regular handler are managed correctly.\n left[type] = right[type]\n }\n }\n }\n}\n","/**\n * Turn the number (in string form as either hexa- or plain decimal) coming from\n * a numeric character reference into a character.\n *\n * Sort of like `String.fromCodePoint(Number.parseInt(value, base))`, but makes\n * non-characters and control characters safe.\n *\n * @param {string} value\n * Value to decode.\n * @param {number} base\n * Numeric base.\n * @returns {string}\n * Character.\n */\nexport function decodeNumericCharacterReference(value, base) {\n const code = Number.parseInt(value, base);\n if (\n // C0 except for HT, LF, FF, CR, space.\n code < 9 || code === 11 || code > 13 && code < 32 ||\n // Control character (DEL) of C0, and C1 controls.\n code > 126 && code < 160 ||\n // Lone high surrogates and low surrogates.\n code > 55_295 && code < 57_344 ||\n // Noncharacters.\n code > 64_975 && code < 65_008 || /* eslint-disable no-bitwise */\n (code & 65_535) === 65_535 || (code & 65_535) === 65_534 || /* eslint-enable no-bitwise */\n // Out of range\n code > 1_114_111) {\n return \"\\uFFFD\";\n }\n return String.fromCodePoint(code);\n}","/**\n * Normalize an identifier (as found in references, definitions).\n *\n * Collapses markdown whitespace, trim, and then lower- and uppercase.\n *\n * Some characters are considered “uppercase”, such as U+03F4 (`ϴ`), but if their\n * lowercase counterpart (U+03B8 (`θ`)) is uppercased will result in a different\n * uppercase character (U+0398 (`Θ`)).\n * So, to get a canonical form, we perform both lower- and uppercase.\n *\n * Using uppercase last makes sure keys will never interact with default\n * prototypal values (such as `constructor`): nothing in the prototype of\n * `Object` is uppercase.\n *\n * @param {string} value\n * Identifier to normalize.\n * @returns {string}\n * Normalized identifier.\n */\nexport function normalizeIdentifier(value) {\n return (\n value\n // Collapse markdown whitespace.\n .replace(/[\\t\\n\\r ]+/g, ' ')\n // Trim.\n .replace(/^ | $/g, '')\n // Some characters are considered “uppercase”, but if their lowercase\n // counterpart is uppercased will result in a different uppercase\n // character.\n // Hence, to get that form, we perform both lower- and uppercase.\n // Upper case makes sure keys will not interact with default prototypal\n // methods: no method is uppercase.\n .toLowerCase()\n .toUpperCase()\n )\n}\n","/**\n * @typedef {import('micromark-util-types').Code} Code\n */\n\n/**\n * Check whether the character code represents an ASCII alpha (`a` through `z`,\n * case insensitive).\n *\n * An **ASCII alpha** is an ASCII upper alpha or ASCII lower alpha.\n *\n * An **ASCII upper alpha** is a character in the inclusive range U+0041 (`A`)\n * to U+005A (`Z`).\n *\n * An **ASCII lower alpha** is a character in the inclusive range U+0061 (`a`)\n * to U+007A (`z`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiAlpha = regexCheck(/[A-Za-z]/);\n\n/**\n * Check whether the character code represents an ASCII alphanumeric (`a`\n * through `z`, case insensitive, or `0` through `9`).\n *\n * An **ASCII alphanumeric** is an ASCII digit (see `asciiDigit`) or ASCII alpha\n * (see `asciiAlpha`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiAlphanumeric = regexCheck(/[\\dA-Za-z]/);\n\n/**\n * Check whether the character code represents an ASCII atext.\n *\n * atext is an ASCII alphanumeric (see `asciiAlphanumeric`), or a character in\n * the inclusive ranges U+0023 NUMBER SIGN (`#`) to U+0027 APOSTROPHE (`'`),\n * U+002A ASTERISK (`*`), U+002B PLUS SIGN (`+`), U+002D DASH (`-`), U+002F\n * SLASH (`/`), U+003D EQUALS TO (`=`), U+003F QUESTION MARK (`?`), U+005E\n * CARET (`^`) to U+0060 GRAVE ACCENT (`` ` ``), or U+007B LEFT CURLY BRACE\n * (`{`) to U+007E TILDE (`~`).\n *\n * See:\n * **\\[RFC5322]**:\n * [Internet Message Format](https://tools.ietf.org/html/rfc5322).\n * P. Resnick.\n * IETF.\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiAtext = regexCheck(/[#-'*+\\--9=?A-Z^-~]/);\n\n/**\n * Check whether a character code is an ASCII control character.\n *\n * An **ASCII control** is a character in the inclusive range U+0000 NULL (NUL)\n * to U+001F (US), or U+007F (DEL).\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function asciiControl(code) {\n return (\n // Special whitespace codes (which have negative values), C0 and Control\n // character DEL\n code !== null && (code < 32 || code === 127)\n );\n}\n\n/**\n * Check whether the character code represents an ASCII digit (`0` through `9`).\n *\n * An **ASCII digit** is a character in the inclusive range U+0030 (`0`) to\n * U+0039 (`9`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiDigit = regexCheck(/\\d/);\n\n/**\n * Check whether the character code represents an ASCII hex digit (`a` through\n * `f`, case insensitive, or `0` through `9`).\n *\n * An **ASCII hex digit** is an ASCII digit (see `asciiDigit`), ASCII upper hex\n * digit, or an ASCII lower hex digit.\n *\n * An **ASCII upper hex digit** is a character in the inclusive range U+0041\n * (`A`) to U+0046 (`F`).\n *\n * An **ASCII lower hex digit** is a character in the inclusive range U+0061\n * (`a`) to U+0066 (`f`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiHexDigit = regexCheck(/[\\dA-Fa-f]/);\n\n/**\n * Check whether the character code represents ASCII punctuation.\n *\n * An **ASCII punctuation** is a character in the inclusive ranges U+0021\n * EXCLAMATION MARK (`!`) to U+002F SLASH (`/`), U+003A COLON (`:`) to U+0040 AT\n * SIGN (`@`), U+005B LEFT SQUARE BRACKET (`[`) to U+0060 GRAVE ACCENT\n * (`` ` ``), or U+007B LEFT CURLY BRACE (`{`) to U+007E TILDE (`~`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiPunctuation = regexCheck(/[!-/:-@[-`{-~]/);\n\n/**\n * Check whether a character code is a markdown line ending.\n *\n * A **markdown line ending** is the virtual characters M-0003 CARRIAGE RETURN\n * LINE FEED (CRLF), M-0004 LINE FEED (LF) and M-0005 CARRIAGE RETURN (CR).\n *\n * In micromark, the actual character U+000A LINE FEED (LF) and U+000D CARRIAGE\n * RETURN (CR) are replaced by these virtual characters depending on whether\n * they occurred together.\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function markdownLineEnding(code) {\n return code !== null && code < -2;\n}\n\n/**\n * Check whether a character code is a markdown line ending (see\n * `markdownLineEnding`) or markdown space (see `markdownSpace`).\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function markdownLineEndingOrSpace(code) {\n return code !== null && (code < 0 || code === 32);\n}\n\n/**\n * Check whether a character code is a markdown space.\n *\n * A **markdown space** is the concrete character U+0020 SPACE (SP) and the\n * virtual characters M-0001 VIRTUAL SPACE (VS) and M-0002 HORIZONTAL TAB (HT).\n *\n * In micromark, the actual character U+0009 CHARACTER TABULATION (HT) is\n * replaced by one M-0002 HORIZONTAL TAB (HT) and between 0 and 3 M-0001 VIRTUAL\n * SPACE (VS) characters, depending on the column at which the tab occurred.\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function markdownSpace(code) {\n return code === -2 || code === -1 || code === 32;\n}\n\n// Size note: removing ASCII from the regex and using `asciiPunctuation` here\n// In fact adds to the bundle size.\n/**\n * Check whether the character code represents Unicode punctuation.\n *\n * A **Unicode punctuation** is a character in the Unicode `Pc` (Punctuation,\n * Connector), `Pd` (Punctuation, Dash), `Pe` (Punctuation, Close), `Pf`\n * (Punctuation, Final quote), `Pi` (Punctuation, Initial quote), `Po`\n * (Punctuation, Other), or `Ps` (Punctuation, Open) categories, or an ASCII\n * punctuation (see `asciiPunctuation`).\n *\n * See:\n * **\\[UNICODE]**:\n * [The Unicode Standard](https://www.unicode.org/versions/).\n * Unicode Consortium.\n *\n * @param code\n * Code.\n * @returns\n * Whether it matches.\n */\nexport const unicodePunctuation = regexCheck(/\\p{P}|\\p{S}/u);\n\n/**\n * Check whether the character code represents Unicode whitespace.\n *\n * Note that this does handle micromark specific markdown whitespace characters.\n * See `markdownLineEndingOrSpace` to check that.\n *\n * A **Unicode whitespace** is a character in the Unicode `Zs` (Separator,\n * Space) category, or U+0009 CHARACTER TABULATION (HT), U+000A LINE FEED (LF),\n * U+000C (FF), or U+000D CARRIAGE RETURN (CR) (**\\[UNICODE]**).\n *\n * See:\n * **\\[UNICODE]**:\n * [The Unicode Standard](https://www.unicode.org/versions/).\n * Unicode Consortium.\n *\n * @param code\n * Code.\n * @returns\n * Whether it matches.\n */\nexport const unicodeWhitespace = regexCheck(/\\s/);\n\n/**\n * Create a code check from a regex.\n *\n * @param {RegExp} regex\n * @returns {(code: Code) => boolean}\n */\nfunction regexCheck(regex) {\n return check;\n\n /**\n * Check whether a code matches the bound regex.\n *\n * @param {Code} code\n * Character code.\n * @returns {boolean}\n * Whether the character code matches the bound regex.\n */\n function check(code) {\n return code !== null && code > -1 && regex.test(String.fromCharCode(code));\n }\n}","/**\n * @typedef {import('micromark-util-types').Effects} Effects\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenType} TokenType\n */\n\nimport {markdownSpace} from 'micromark-util-character'\n\n// To do: implement `spaceOrTab`, `spaceOrTabMinMax`, `spaceOrTabWithOptions`.\n\n/**\n * Parse spaces and tabs.\n *\n * There is no `nok` parameter:\n *\n * * spaces in markdown are often optional, in which case this factory can be\n * used and `ok` will be switched to whether spaces were found or not\n * * one line ending or space can be detected with `markdownSpace(code)` right\n * before using `factorySpace`\n *\n * ###### Examples\n *\n * Where `␉` represents a tab (plus how much it expands) and `␠` represents a\n * single space.\n *\n * ```markdown\n * ␉\n * ␠␠␠␠\n * ␉␠\n * ```\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {TokenType} type\n * Type (`' \\t'`).\n * @param {number | undefined} [max=Infinity]\n * Max (exclusive).\n * @returns {State}\n * Start state.\n */\nexport function factorySpace(effects, ok, type, max) {\n const limit = max ? max - 1 : Number.POSITIVE_INFINITY\n let size = 0\n return start\n\n /** @type {State} */\n function start(code) {\n if (markdownSpace(code)) {\n effects.enter(type)\n return prefix(code)\n }\n return ok(code)\n }\n\n /** @type {State} */\n function prefix(code) {\n if (markdownSpace(code) && size++ < limit) {\n effects.consume(code)\n return prefix\n }\n effects.exit(type)\n return ok(code)\n }\n}\n","/**\n * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct\n * @typedef {import('micromark-util-types').Initializer} Initializer\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n */\n\nimport {factorySpace} from 'micromark-factory-space'\nimport {markdownLineEnding} from 'micromark-util-character'\n/** @type {InitialConstruct} */\nexport const content = {\n tokenize: initializeContent\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Initializer}\n */\nfunction initializeContent(effects) {\n const contentStart = effects.attempt(\n this.parser.constructs.contentInitial,\n afterContentStartConstruct,\n paragraphInitial\n )\n /** @type {Token} */\n let previous\n return contentStart\n\n /** @type {State} */\n function afterContentStartConstruct(code) {\n if (code === null) {\n effects.consume(code)\n return\n }\n effects.enter('lineEnding')\n effects.consume(code)\n effects.exit('lineEnding')\n return factorySpace(effects, contentStart, 'linePrefix')\n }\n\n /** @type {State} */\n function paragraphInitial(code) {\n effects.enter('paragraph')\n return lineStart(code)\n }\n\n /** @type {State} */\n function lineStart(code) {\n const token = effects.enter('chunkText', {\n contentType: 'text',\n previous\n })\n if (previous) {\n previous.next = token\n }\n previous = token\n return data(code)\n }\n\n /** @type {State} */\n function data(code) {\n if (code === null) {\n effects.exit('chunkText')\n effects.exit('paragraph')\n effects.consume(code)\n return\n }\n if (markdownLineEnding(code)) {\n effects.consume(code)\n effects.exit('chunkText')\n return lineStart\n }\n\n // Data.\n effects.consume(code)\n return data\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').ContainerState} ContainerState\n * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct\n * @typedef {import('micromark-util-types').Initializer} Initializer\n * @typedef {import('micromark-util-types').Point} Point\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\n/**\n * @typedef {[Construct, ContainerState]} StackItem\n */\n\nimport {factorySpace} from 'micromark-factory-space'\nimport {markdownLineEnding} from 'micromark-util-character'\nimport {splice} from 'micromark-util-chunked'\n/** @type {InitialConstruct} */\nexport const document = {\n tokenize: initializeDocument\n}\n\n/** @type {Construct} */\nconst containerConstruct = {\n tokenize: tokenizeContainer\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Initializer}\n */\nfunction initializeDocument(effects) {\n const self = this\n /** @type {Array<StackItem>} */\n const stack = []\n let continued = 0\n /** @type {TokenizeContext | undefined} */\n let childFlow\n /** @type {Token | undefined} */\n let childToken\n /** @type {number} */\n let lineStartOffset\n return start\n\n /** @type {State} */\n function start(code) {\n // First we iterate through the open blocks, starting with the root\n // document, and descending through last children down to the last open\n // block.\n // Each block imposes a condition that the line must satisfy if the block is\n // to remain open.\n // For example, a block quote requires a `>` character.\n // A paragraph requires a non-blank line.\n // In this phase we may match all or just some of the open blocks.\n // But we cannot close unmatched blocks yet, because we may have a lazy\n // continuation line.\n if (continued < stack.length) {\n const item = stack[continued]\n self.containerState = item[1]\n return effects.attempt(\n item[0].continuation,\n documentContinue,\n checkNewContainers\n )(code)\n }\n\n // Done.\n return checkNewContainers(code)\n }\n\n /** @type {State} */\n function documentContinue(code) {\n continued++\n\n // Note: this field is called `_closeFlow` but it also closes containers.\n // Perhaps a good idea to rename it but it’s already used in the wild by\n // extensions.\n if (self.containerState._closeFlow) {\n self.containerState._closeFlow = undefined\n if (childFlow) {\n closeFlow()\n }\n\n // Note: this algorithm for moving events around is similar to the\n // algorithm when dealing with lazy lines in `writeToChild`.\n const indexBeforeExits = self.events.length\n let indexBeforeFlow = indexBeforeExits\n /** @type {Point | undefined} */\n let point\n\n // Find the flow chunk.\n while (indexBeforeFlow--) {\n if (\n self.events[indexBeforeFlow][0] === 'exit' &&\n self.events[indexBeforeFlow][1].type === 'chunkFlow'\n ) {\n point = self.events[indexBeforeFlow][1].end\n break\n }\n }\n exitContainers(continued)\n\n // Fix positions.\n let index = indexBeforeExits\n while (index < self.events.length) {\n self.events[index][1].end = Object.assign({}, point)\n index++\n }\n\n // Inject the exits earlier (they’re still also at the end).\n splice(\n self.events,\n indexBeforeFlow + 1,\n 0,\n self.events.slice(indexBeforeExits)\n )\n\n // Discard the duplicate exits.\n self.events.length = index\n return checkNewContainers(code)\n }\n return start(code)\n }\n\n /** @type {State} */\n function checkNewContainers(code) {\n // Next, after consuming the continuation markers for existing blocks, we\n // look for new block starts (e.g. `>` for a block quote).\n // If we encounter a new block start, we close any blocks unmatched in\n // step 1 before creating the new block as a child of the last matched\n // block.\n if (continued === stack.length) {\n // No need to `check` whether there’s a container, of `exitContainers`\n // would be moot.\n // We can instead immediately `attempt` to parse one.\n if (!childFlow) {\n return documentContinued(code)\n }\n\n // If we have concrete content, such as block HTML or fenced code,\n // we can’t have containers “pierce” into them, so we can immediately\n // start.\n if (childFlow.currentConstruct && childFlow.currentConstruct.concrete) {\n return flowStart(code)\n }\n\n // If we do have flow, it could still be a blank line,\n // but we’d be interrupting it w/ a new container if there’s a current\n // construct.\n // To do: next major: remove `_gfmTableDynamicInterruptHack` (no longer\n // needed in micromark-extension-gfm-table@1.0.6).\n self.interrupt = Boolean(\n childFlow.currentConstruct && !childFlow._gfmTableDynamicInterruptHack\n )\n }\n\n // Check if there is a new container.\n self.containerState = {}\n return effects.check(\n containerConstruct,\n thereIsANewContainer,\n thereIsNoNewContainer\n )(code)\n }\n\n /** @type {State} */\n function thereIsANewContainer(code) {\n if (childFlow) closeFlow()\n exitContainers(continued)\n return documentContinued(code)\n }\n\n /** @type {State} */\n function thereIsNoNewContainer(code) {\n self.parser.lazy[self.now().line] = continued !== stack.length\n lineStartOffset = self.now().offset\n return flowStart(code)\n }\n\n /** @type {State} */\n function documentContinued(code) {\n // Try new containers.\n self.containerState = {}\n return effects.attempt(\n containerConstruct,\n containerContinue,\n flowStart\n )(code)\n }\n\n /** @type {State} */\n function containerContinue(code) {\n continued++\n stack.push([self.currentConstruct, self.containerState])\n // Try another.\n return documentContinued(code)\n }\n\n /** @type {State} */\n function flowStart(code) {\n if (code === null) {\n if (childFlow) closeFlow()\n exitContainers(0)\n effects.consume(code)\n return\n }\n childFlow = childFlow || self.parser.flow(self.now())\n effects.enter('chunkFlow', {\n contentType: 'flow',\n previous: childToken,\n _tokenizer: childFlow\n })\n return flowContinue(code)\n }\n\n /** @type {State} */\n function flowContinue(code) {\n if (code === null) {\n writeToChild(effects.exit('chunkFlow'), true)\n exitContainers(0)\n effects.consume(code)\n return\n }\n if (markdownLineEnding(code)) {\n effects.consume(code)\n writeToChild(effects.exit('chunkFlow'))\n // Get ready for the next line.\n continued = 0\n self.interrupt = undefined\n return start\n }\n effects.consume(code)\n return flowContinue\n }\n\n /**\n * @param {Token} token\n * @param {boolean | undefined} [eof]\n * @returns {undefined}\n */\n function writeToChild(token, eof) {\n const stream = self.sliceStream(token)\n if (eof) stream.push(null)\n token.previous = childToken\n if (childToken) childToken.next = token\n childToken = token\n childFlow.defineSkip(token.start)\n childFlow.write(stream)\n\n // Alright, so we just added a lazy line:\n //\n // ```markdown\n // > a\n // b.\n //\n // Or:\n //\n // > ~~~c\n // d\n //\n // Or:\n //\n // > | e |\n // f\n // ```\n //\n // The construct in the second example (fenced code) does not accept lazy\n // lines, so it marked itself as done at the end of its first line, and\n // then the content construct parses `d`.\n // Most constructs in markdown match on the first line: if the first line\n // forms a construct, a non-lazy line can’t “unmake” it.\n //\n // The construct in the third example is potentially a GFM table, and\n // those are *weird*.\n // It *could* be a table, from the first line, if the following line\n // matches a condition.\n // In this case, that second line is lazy, which “unmakes” the first line\n // and turns the whole into one content block.\n //\n // We’ve now parsed the non-lazy and the lazy line, and can figure out\n // whether the lazy line started a new flow block.\n // If it did, we exit the current containers between the two flow blocks.\n if (self.parser.lazy[token.start.line]) {\n let index = childFlow.events.length\n while (index--) {\n if (\n // The token starts before the line ending…\n childFlow.events[index][1].start.offset < lineStartOffset &&\n // …and either is not ended yet…\n (!childFlow.events[index][1].end ||\n // …or ends after it.\n childFlow.events[index][1].end.offset > lineStartOffset)\n ) {\n // Exit: there’s still something open, which means it’s a lazy line\n // part of something.\n return\n }\n }\n\n // Note: this algorithm for moving events around is similar to the\n // algorithm when closing flow in `documentContinue`.\n const indexBeforeExits = self.events.length\n let indexBeforeFlow = indexBeforeExits\n /** @type {boolean | undefined} */\n let seen\n /** @type {Point | undefined} */\n let point\n\n // Find the previous chunk (the one before the lazy line).\n while (indexBeforeFlow--) {\n if (\n self.events[indexBeforeFlow][0] === 'exit' &&\n self.events[indexBeforeFlow][1].type === 'chunkFlow'\n ) {\n if (seen) {\n point = self.events[indexBeforeFlow][1].end\n break\n }\n seen = true\n }\n }\n exitContainers(continued)\n\n // Fix positions.\n index = indexBeforeExits\n while (index < self.events.length) {\n self.events[index][1].end = Object.assign({}, point)\n index++\n }\n\n // Inject the exits earlier (they’re still also at the end).\n splice(\n self.events,\n indexBeforeFlow + 1,\n 0,\n self.events.slice(indexBeforeExits)\n )\n\n // Discard the duplicate exits.\n self.events.length = index\n }\n }\n\n /**\n * @param {number} size\n * @returns {undefined}\n */\n function exitContainers(size) {\n let index = stack.length\n\n // Exit open containers.\n while (index-- > size) {\n const entry = stack[index]\n self.containerState = entry[1]\n entry[0].exit.call(self, effects)\n }\n stack.length = size\n }\n function closeFlow() {\n childFlow.write([null])\n childToken = undefined\n childFlow = undefined\n self.containerState._closeFlow = undefined\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeContainer(effects, ok, nok) {\n // Always populated by defaults.\n\n return factorySpace(\n effects,\n effects.attempt(this.parser.constructs.document, ok, nok),\n 'linePrefix',\n this.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4\n )\n}\n","/**\n * @typedef {import('micromark-util-types').Code} Code\n */\n\nimport {\n markdownLineEndingOrSpace,\n unicodePunctuation,\n unicodeWhitespace\n} from 'micromark-util-character'\n/**\n * Classify whether a code represents whitespace, punctuation, or something\n * else.\n *\n * Used for attention (emphasis, strong), whose sequences can open or close\n * based on the class of surrounding characters.\n *\n * > 👉 **Note**: eof (`null`) is seen as whitespace.\n *\n * @param {Code} code\n * Code.\n * @returns {typeof constants.characterGroupWhitespace | typeof constants.characterGroupPunctuation | undefined}\n * Group.\n */\nexport function classifyCharacter(code) {\n if (\n code === null ||\n markdownLineEndingOrSpace(code) ||\n unicodeWhitespace(code)\n ) {\n return 1\n }\n if (unicodePunctuation(code)) {\n return 2\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Event} Event\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n */\n\n/**\n * Call all `resolveAll`s.\n *\n * @param {Array<{resolveAll?: Resolver | undefined}>} constructs\n * List of constructs, optionally with `resolveAll`s.\n * @param {Array<Event>} events\n * List of events.\n * @param {TokenizeContext} context\n * Context used by `tokenize`.\n * @returns {Array<Event>}\n * Changed events.\n */\nexport function resolveAll(constructs, events, context) {\n /** @type {Array<Resolver>} */\n const called = []\n let index = -1\n\n while (++index < constructs.length) {\n const resolve = constructs[index].resolveAll\n\n if (resolve && !called.includes(resolve)) {\n events = resolve(events, context)\n called.push(resolve)\n }\n }\n\n return events\n}\n","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Event} Event\n * @typedef {import('micromark-util-types').Point} Point\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { push, splice } from 'micromark-util-chunked';\nimport { classifyCharacter } from 'micromark-util-classify-character';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/** @type {Construct} */\nexport const attention = {\n name: 'attention',\n tokenize: tokenizeAttention,\n resolveAll: resolveAllAttention\n};\n\n/**\n * Take all events and resolve attention to emphasis or strong.\n *\n * @type {Resolver}\n */\n// eslint-disable-next-line complexity\nfunction resolveAllAttention(events, context) {\n let index = -1;\n /** @type {number} */\n let open;\n /** @type {Token} */\n let group;\n /** @type {Token} */\n let text;\n /** @type {Token} */\n let openingSequence;\n /** @type {Token} */\n let closingSequence;\n /** @type {number} */\n let use;\n /** @type {Array<Event>} */\n let nextEvents;\n /** @type {number} */\n let offset;\n\n // Walk through all events.\n //\n // Note: performance of this is fine on an mb of normal markdown, but it’s\n // a bottleneck for malicious stuff.\n while (++index < events.length) {\n // Find a token that can close.\n if (events[index][0] === 'enter' && events[index][1].type === 'attentionSequence' && events[index][1]._close) {\n open = index;\n\n // Now walk back to find an opener.\n while (open--) {\n // Find a token that can open the closer.\n if (events[open][0] === 'exit' && events[open][1].type === 'attentionSequence' && events[open][1]._open &&\n // If the markers are the same:\n context.sliceSerialize(events[open][1]).charCodeAt(0) === context.sliceSerialize(events[index][1]).charCodeAt(0)) {\n // If the opening can close or the closing can open,\n // and the close size *is not* a multiple of three,\n // but the sum of the opening and closing size *is* multiple of three,\n // then don’t match.\n if ((events[open][1]._close || events[index][1]._open) && (events[index][1].end.offset - events[index][1].start.offset) % 3 && !((events[open][1].end.offset - events[open][1].start.offset + events[index][1].end.offset - events[index][1].start.offset) % 3)) {\n continue;\n }\n\n // Number of markers to use from the sequence.\n use = events[open][1].end.offset - events[open][1].start.offset > 1 && events[index][1].end.offset - events[index][1].start.offset > 1 ? 2 : 1;\n const start = Object.assign({}, events[open][1].end);\n const end = Object.assign({}, events[index][1].start);\n movePoint(start, -use);\n movePoint(end, use);\n openingSequence = {\n type: use > 1 ? \"strongSequence\" : \"emphasisSequence\",\n start,\n end: Object.assign({}, events[open][1].end)\n };\n closingSequence = {\n type: use > 1 ? \"strongSequence\" : \"emphasisSequence\",\n start: Object.assign({}, events[index][1].start),\n end\n };\n text = {\n type: use > 1 ? \"strongText\" : \"emphasisText\",\n start: Object.assign({}, events[open][1].end),\n end: Object.assign({}, events[index][1].start)\n };\n group = {\n type: use > 1 ? \"strong\" : \"emphasis\",\n start: Object.assign({}, openingSequence.start),\n end: Object.assign({}, closingSequence.end)\n };\n events[open][1].end = Object.assign({}, openingSequence.start);\n events[index][1].start = Object.assign({}, closingSequence.end);\n nextEvents = [];\n\n // If there are more markers in the opening, add them before.\n if (events[open][1].end.offset - events[open][1].start.offset) {\n nextEvents = push(nextEvents, [['enter', events[open][1], context], ['exit', events[open][1], context]]);\n }\n\n // Opening.\n nextEvents = push(nextEvents, [['enter', group, context], ['enter', openingSequence, context], ['exit', openingSequence, context], ['enter', text, context]]);\n\n // Always populated by defaults.\n\n // Between.\n nextEvents = push(nextEvents, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + 1, index), context));\n\n // Closing.\n nextEvents = push(nextEvents, [['exit', text, context], ['enter', closingSequence, context], ['exit', closingSequence, context], ['exit', group, context]]);\n\n // If there are more markers in the closing, add them after.\n if (events[index][1].end.offset - events[index][1].start.offset) {\n offset = 2;\n nextEvents = push(nextEvents, [['enter', events[index][1], context], ['exit', events[index][1], context]]);\n } else {\n offset = 0;\n }\n splice(events, open - 1, index - open + 3, nextEvents);\n index = open + nextEvents.length - offset - 2;\n break;\n }\n }\n }\n }\n\n // Remove remaining sequences.\n index = -1;\n while (++index < events.length) {\n if (events[index][1].type === 'attentionSequence') {\n events[index][1].type = 'data';\n }\n }\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeAttention(effects, ok) {\n const attentionMarkers = this.parser.constructs.attentionMarkers.null;\n const previous = this.previous;\n const before = classifyCharacter(previous);\n\n /** @type {NonNullable<Code>} */\n let marker;\n return start;\n\n /**\n * Before a sequence.\n *\n * ```markdown\n * > | **\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n marker = code;\n effects.enter('attentionSequence');\n return inside(code);\n }\n\n /**\n * In a sequence.\n *\n * ```markdown\n * > | **\n * ^^\n * ```\n *\n * @type {State}\n */\n function inside(code) {\n if (code === marker) {\n effects.consume(code);\n return inside;\n }\n const token = effects.exit('attentionSequence');\n\n // To do: next major: move this to resolver, just like `markdown-rs`.\n const after = classifyCharacter(code);\n\n // Always populated by defaults.\n\n const open = !after || after === 2 && before || attentionMarkers.includes(code);\n const close = !before || before === 2 && after || attentionMarkers.includes(previous);\n token._open = Boolean(marker === 42 ? open : open && (before || !close));\n token._close = Boolean(marker === 42 ? close : close && (after || !open));\n return ok(code);\n }\n}\n\n/**\n * Move a point a bit.\n *\n * Note: `move` only works inside lines! It’s not possible to move past other\n * chunks (replacement characters, tabs, or line endings).\n *\n * @param {Point} point\n * @param {number} offset\n * @returns {undefined}\n */\nfunction movePoint(point, offset) {\n point.column += offset;\n point.offset += offset;\n point._bufferIndex += offset;\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { asciiAlpha, asciiAlphanumeric, asciiAtext, asciiControl } from 'micromark-util-character';\n/** @type {Construct} */\nexport const autolink = {\n name: 'autolink',\n tokenize: tokenizeAutolink\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeAutolink(effects, ok, nok) {\n let size = 0;\n return start;\n\n /**\n * Start of an autolink.\n *\n * ```markdown\n * > | a<https://example.com>b\n * ^\n * > | a<user@example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"autolink\");\n effects.enter(\"autolinkMarker\");\n effects.consume(code);\n effects.exit(\"autolinkMarker\");\n effects.enter(\"autolinkProtocol\");\n return open;\n }\n\n /**\n * After `<`, at protocol or atext.\n *\n * ```markdown\n * > | a<https://example.com>b\n * ^\n * > | a<user@example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (asciiAlpha(code)) {\n effects.consume(code);\n return schemeOrEmailAtext;\n }\n if (code === 64) {\n return nok(code);\n }\n return emailAtext(code);\n }\n\n /**\n * At second byte of protocol or atext.\n *\n * ```markdown\n * > | a<https://example.com>b\n * ^\n * > | a<user@example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function schemeOrEmailAtext(code) {\n // ASCII alphanumeric and `+`, `-`, and `.`.\n if (code === 43 || code === 45 || code === 46 || asciiAlphanumeric(code)) {\n // Count the previous alphabetical from `open` too.\n size = 1;\n return schemeInsideOrEmailAtext(code);\n }\n return emailAtext(code);\n }\n\n /**\n * In ambiguous protocol or atext.\n *\n * ```markdown\n * > | a<https://example.com>b\n * ^\n * > | a<user@example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function schemeInsideOrEmailAtext(code) {\n if (code === 58) {\n effects.consume(code);\n size = 0;\n return urlInside;\n }\n\n // ASCII alphanumeric and `+`, `-`, and `.`.\n if ((code === 43 || code === 45 || code === 46 || asciiAlphanumeric(code)) && size++ < 32) {\n effects.consume(code);\n return schemeInsideOrEmailAtext;\n }\n size = 0;\n return emailAtext(code);\n }\n\n /**\n * After protocol, in URL.\n *\n * ```markdown\n * > | a<https://example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function urlInside(code) {\n if (code === 62) {\n effects.exit(\"autolinkProtocol\");\n effects.enter(\"autolinkMarker\");\n effects.consume(code);\n effects.exit(\"autolinkMarker\");\n effects.exit(\"autolink\");\n return ok;\n }\n\n // ASCII control, space, or `<`.\n if (code === null || code === 32 || code === 60 || asciiControl(code)) {\n return nok(code);\n }\n effects.consume(code);\n return urlInside;\n }\n\n /**\n * In email atext.\n *\n * ```markdown\n * > | a<user.name@example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function emailAtext(code) {\n if (code === 64) {\n effects.consume(code);\n return emailAtSignOrDot;\n }\n if (asciiAtext(code)) {\n effects.consume(code);\n return emailAtext;\n }\n return nok(code);\n }\n\n /**\n * In label, after at-sign or dot.\n *\n * ```markdown\n * > | a<user.name@example.com>b\n * ^ ^\n * ```\n *\n * @type {State}\n */\n function emailAtSignOrDot(code) {\n return asciiAlphanumeric(code) ? emailLabel(code) : nok(code);\n }\n\n /**\n * In label, where `.` and `>` are allowed.\n *\n * ```markdown\n * > | a<user.name@example.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function emailLabel(code) {\n if (code === 46) {\n effects.consume(code);\n size = 0;\n return emailAtSignOrDot;\n }\n if (code === 62) {\n // Exit, then change the token type.\n effects.exit(\"autolinkProtocol\").type = \"autolinkEmail\";\n effects.enter(\"autolinkMarker\");\n effects.consume(code);\n effects.exit(\"autolinkMarker\");\n effects.exit(\"autolink\");\n return ok;\n }\n return emailValue(code);\n }\n\n /**\n * In label, where `.` and `>` are *not* allowed.\n *\n * Though, this is also used in `emailLabel` to parse other values.\n *\n * ```markdown\n * > | a<user.name@ex-ample.com>b\n * ^\n * ```\n *\n * @type {State}\n */\n function emailValue(code) {\n // ASCII alphanumeric or `-`.\n if ((code === 45 || asciiAlphanumeric(code)) && size++ < 63) {\n const next = code === 45 ? emailValue : emailLabel;\n effects.consume(code);\n return next;\n }\n return nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blankLine = {\n tokenize: tokenizeBlankLine,\n partial: true\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLine(effects, ok, nok) {\n return start;\n\n /**\n * Start of blank line.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n return markdownSpace(code) ? factorySpace(effects, after, \"linePrefix\")(code) : after(code);\n }\n\n /**\n * At eof/eol, after optional whitespace.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Exiter} Exiter\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blockQuote = {\n name: 'blockQuote',\n tokenize: tokenizeBlockQuoteStart,\n continuation: {\n tokenize: tokenizeBlockQuoteContinuation\n },\n exit\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeBlockQuoteStart(effects, ok, nok) {\n const self = this;\n return start;\n\n /**\n * Start of block quote.\n *\n * ```markdown\n * > | > a\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n if (code === 62) {\n const state = self.containerState;\n if (!state.open) {\n effects.enter(\"blockQuote\", {\n _container: true\n });\n state.open = true;\n }\n effects.enter(\"blockQuotePrefix\");\n effects.enter(\"blockQuoteMarker\");\n effects.consume(code);\n effects.exit(\"blockQuoteMarker\");\n return after;\n }\n return nok(code);\n }\n\n /**\n * After `>`, before optional whitespace.\n *\n * ```markdown\n * > | > a\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n if (markdownSpace(code)) {\n effects.enter(\"blockQuotePrefixWhitespace\");\n effects.consume(code);\n effects.exit(\"blockQuotePrefixWhitespace\");\n effects.exit(\"blockQuotePrefix\");\n return ok;\n }\n effects.exit(\"blockQuotePrefix\");\n return ok(code);\n }\n}\n\n/**\n * Start of block quote continuation.\n *\n * ```markdown\n * | > a\n * > | > b\n * ^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeBlockQuoteContinuation(effects, ok, nok) {\n const self = this;\n return contStart;\n\n /**\n * Start of block quote continuation.\n *\n * Also used to parse the first block quote opening.\n *\n * ```markdown\n * | > a\n * > | > b\n * ^\n * ```\n *\n * @type {State}\n */\n function contStart(code) {\n if (markdownSpace(code)) {\n // Always populated by defaults.\n\n return factorySpace(effects, contBefore, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code);\n }\n return contBefore(code);\n }\n\n /**\n * At `>`, after optional whitespace.\n *\n * Also used to parse the first block quote opening.\n *\n * ```markdown\n * | > a\n * > | > b\n * ^\n * ```\n *\n * @type {State}\n */\n function contBefore(code) {\n return effects.attempt(blockQuote, ok, nok)(code);\n }\n}\n\n/** @type {Exiter} */\nfunction exit(effects) {\n effects.exit(\"blockQuote\");\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { asciiPunctuation } from 'micromark-util-character';\n/** @type {Construct} */\nexport const characterEscape = {\n name: 'characterEscape',\n tokenize: tokenizeCharacterEscape\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeCharacterEscape(effects, ok, nok) {\n return start;\n\n /**\n * Start of character escape.\n *\n * ```markdown\n * > | a\\*b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"characterEscape\");\n effects.enter(\"escapeMarker\");\n effects.consume(code);\n effects.exit(\"escapeMarker\");\n return inside;\n }\n\n /**\n * After `\\`, at punctuation.\n *\n * ```markdown\n * > | a\\*b\n * ^\n * ```\n *\n * @type {State}\n */\n function inside(code) {\n // ASCII punctuation.\n if (asciiPunctuation(code)) {\n effects.enter(\"characterEscapeValue\");\n effects.consume(code);\n effects.exit(\"characterEscapeValue\");\n effects.exit(\"characterEscape\");\n return ok;\n }\n return nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { decodeNamedCharacterReference } from 'decode-named-character-reference';\nimport { asciiAlphanumeric, asciiDigit, asciiHexDigit } from 'micromark-util-character';\n/** @type {Construct} */\nexport const characterReference = {\n name: 'characterReference',\n tokenize: tokenizeCharacterReference\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeCharacterReference(effects, ok, nok) {\n const self = this;\n let size = 0;\n /** @type {number} */\n let max;\n /** @type {(code: Code) => boolean} */\n let test;\n return start;\n\n /**\n * Start of character reference.\n *\n * ```markdown\n * > | a&b\n * ^\n * > | a{b\n * ^\n * > | a	b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"characterReference\");\n effects.enter(\"characterReferenceMarker\");\n effects.consume(code);\n effects.exit(\"characterReferenceMarker\");\n return open;\n }\n\n /**\n * After `&`, at `#` for numeric references or alphanumeric for named\n * references.\n *\n * ```markdown\n * > | a&b\n * ^\n * > | a{b\n * ^\n * > | a	b\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (code === 35) {\n effects.enter(\"characterReferenceMarkerNumeric\");\n effects.consume(code);\n effects.exit(\"characterReferenceMarkerNumeric\");\n return numeric;\n }\n effects.enter(\"characterReferenceValue\");\n max = 31;\n test = asciiAlphanumeric;\n return value(code);\n }\n\n /**\n * After `#`, at `x` for hexadecimals or digit for decimals.\n *\n * ```markdown\n * > | a{b\n * ^\n * > | a	b\n * ^\n * ```\n *\n * @type {State}\n */\n function numeric(code) {\n if (code === 88 || code === 120) {\n effects.enter(\"characterReferenceMarkerHexadecimal\");\n effects.consume(code);\n effects.exit(\"characterReferenceMarkerHexadecimal\");\n effects.enter(\"characterReferenceValue\");\n max = 6;\n test = asciiHexDigit;\n return value;\n }\n effects.enter(\"characterReferenceValue\");\n max = 7;\n test = asciiDigit;\n return value(code);\n }\n\n /**\n * After markers (`&#x`, `&#`, or `&`), in value, before `;`.\n *\n * The character reference kind defines what and how many characters are\n * allowed.\n *\n * ```markdown\n * > | a&b\n * ^^^\n * > | a{b\n * ^^^\n * > | a	b\n * ^\n * ```\n *\n * @type {State}\n */\n function value(code) {\n if (code === 59 && size) {\n const token = effects.exit(\"characterReferenceValue\");\n if (test === asciiAlphanumeric && !decodeNamedCharacterReference(self.sliceSerialize(token))) {\n return nok(code);\n }\n\n // To do: `markdown-rs` uses a different name:\n // `CharacterReferenceMarkerSemi`.\n effects.enter(\"characterReferenceMarker\");\n effects.consume(code);\n effects.exit(\"characterReferenceMarker\");\n effects.exit(\"characterReference\");\n return ok;\n }\n if (test(code) && size++ < max) {\n effects.consume(code);\n return value;\n }\n return nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nconst nonLazyContinuation = {\n tokenize: tokenizeNonLazyContinuation,\n partial: true\n};\n\n/** @type {Construct} */\nexport const codeFenced = {\n name: 'codeFenced',\n tokenize: tokenizeCodeFenced,\n concrete: true\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeCodeFenced(effects, ok, nok) {\n const self = this;\n /** @type {Construct} */\n const closeStart = {\n tokenize: tokenizeCloseStart,\n partial: true\n };\n let initialPrefix = 0;\n let sizeOpen = 0;\n /** @type {NonNullable<Code>} */\n let marker;\n return start;\n\n /**\n * Start of code.\n *\n * ```markdown\n * > | ~~~js\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // To do: parse whitespace like `markdown-rs`.\n return beforeSequenceOpen(code);\n }\n\n /**\n * In opening fence, after prefix, at sequence.\n *\n * ```markdown\n * > | ~~~js\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function beforeSequenceOpen(code) {\n const tail = self.events[self.events.length - 1];\n initialPrefix = tail && tail[1].type === \"linePrefix\" ? tail[2].sliceSerialize(tail[1], true).length : 0;\n marker = code;\n effects.enter(\"codeFenced\");\n effects.enter(\"codeFencedFence\");\n effects.enter(\"codeFencedFenceSequence\");\n return sequenceOpen(code);\n }\n\n /**\n * In opening fence sequence.\n *\n * ```markdown\n * > | ~~~js\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function sequenceOpen(code) {\n if (code === marker) {\n sizeOpen++;\n effects.consume(code);\n return sequenceOpen;\n }\n if (sizeOpen < 3) {\n return nok(code);\n }\n effects.exit(\"codeFencedFenceSequence\");\n return markdownSpace(code) ? factorySpace(effects, infoBefore, \"whitespace\")(code) : infoBefore(code);\n }\n\n /**\n * In opening fence, after the sequence (and optional whitespace), before info.\n *\n * ```markdown\n * > | ~~~js\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function infoBefore(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"codeFencedFence\");\n return self.interrupt ? ok(code) : effects.check(nonLazyContinuation, atNonLazyBreak, after)(code);\n }\n effects.enter(\"codeFencedFenceInfo\");\n effects.enter(\"chunkString\", {\n contentType: \"string\"\n });\n return info(code);\n }\n\n /**\n * In info.\n *\n * ```markdown\n * > | ~~~js\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function info(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"chunkString\");\n effects.exit(\"codeFencedFenceInfo\");\n return infoBefore(code);\n }\n if (markdownSpace(code)) {\n effects.exit(\"chunkString\");\n effects.exit(\"codeFencedFenceInfo\");\n return factorySpace(effects, metaBefore, \"whitespace\")(code);\n }\n if (code === 96 && code === marker) {\n return nok(code);\n }\n effects.consume(code);\n return info;\n }\n\n /**\n * In opening fence, after info and whitespace, before meta.\n *\n * ```markdown\n * > | ~~~js eval\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function metaBefore(code) {\n if (code === null || markdownLineEnding(code)) {\n return infoBefore(code);\n }\n effects.enter(\"codeFencedFenceMeta\");\n effects.enter(\"chunkString\", {\n contentType: \"string\"\n });\n return meta(code);\n }\n\n /**\n * In meta.\n *\n * ```markdown\n * > | ~~~js eval\n * ^\n * | alert(1)\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function meta(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"chunkString\");\n effects.exit(\"codeFencedFenceMeta\");\n return infoBefore(code);\n }\n if (code === 96 && code === marker) {\n return nok(code);\n }\n effects.consume(code);\n return meta;\n }\n\n /**\n * At eol/eof in code, before a non-lazy closing fence or content.\n *\n * ```markdown\n * > | ~~~js\n * ^\n * > | alert(1)\n * ^\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function atNonLazyBreak(code) {\n return effects.attempt(closeStart, after, contentBefore)(code);\n }\n\n /**\n * Before code content, not a closing fence, at eol.\n *\n * ```markdown\n * | ~~~js\n * > | alert(1)\n * ^\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function contentBefore(code) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return contentStart;\n }\n\n /**\n * Before code content, not a closing fence.\n *\n * ```markdown\n * | ~~~js\n * > | alert(1)\n * ^\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function contentStart(code) {\n return initialPrefix > 0 && markdownSpace(code) ? factorySpace(effects, beforeContentChunk, \"linePrefix\", initialPrefix + 1)(code) : beforeContentChunk(code);\n }\n\n /**\n * Before code content, after optional prefix.\n *\n * ```markdown\n * | ~~~js\n * > | alert(1)\n * ^\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function beforeContentChunk(code) {\n if (code === null || markdownLineEnding(code)) {\n return effects.check(nonLazyContinuation, atNonLazyBreak, after)(code);\n }\n effects.enter(\"codeFlowValue\");\n return contentChunk(code);\n }\n\n /**\n * In code content.\n *\n * ```markdown\n * | ~~~js\n * > | alert(1)\n * ^^^^^^^^\n * | ~~~\n * ```\n *\n * @type {State}\n */\n function contentChunk(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"codeFlowValue\");\n return beforeContentChunk(code);\n }\n effects.consume(code);\n return contentChunk;\n }\n\n /**\n * After code.\n *\n * ```markdown\n * | ~~~js\n * | alert(1)\n * > | ~~~\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n effects.exit(\"codeFenced\");\n return ok(code);\n }\n\n /**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\n function tokenizeCloseStart(effects, ok, nok) {\n let size = 0;\n return startBefore;\n\n /**\n *\n *\n * @type {State}\n */\n function startBefore(code) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return start;\n }\n\n /**\n * Before closing fence, at optional whitespace.\n *\n * ```markdown\n * | ~~~js\n * | alert(1)\n * > | ~~~\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // Always populated by defaults.\n\n // To do: `enter` here or in next state?\n effects.enter(\"codeFencedFence\");\n return markdownSpace(code) ? factorySpace(effects, beforeSequenceClose, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code) : beforeSequenceClose(code);\n }\n\n /**\n * In closing fence, after optional whitespace, at sequence.\n *\n * ```markdown\n * | ~~~js\n * | alert(1)\n * > | ~~~\n * ^\n * ```\n *\n * @type {State}\n */\n function beforeSequenceClose(code) {\n if (code === marker) {\n effects.enter(\"codeFencedFenceSequence\");\n return sequenceClose(code);\n }\n return nok(code);\n }\n\n /**\n * In closing fence sequence.\n *\n * ```markdown\n * | ~~~js\n * | alert(1)\n * > | ~~~\n * ^\n * ```\n *\n * @type {State}\n */\n function sequenceClose(code) {\n if (code === marker) {\n size++;\n effects.consume(code);\n return sequenceClose;\n }\n if (size >= sizeOpen) {\n effects.exit(\"codeFencedFenceSequence\");\n return markdownSpace(code) ? factorySpace(effects, sequenceCloseAfter, \"whitespace\")(code) : sequenceCloseAfter(code);\n }\n return nok(code);\n }\n\n /**\n * After closing fence sequence, after optional whitespace.\n *\n * ```markdown\n * | ~~~js\n * | alert(1)\n * > | ~~~\n * ^\n * ```\n *\n * @type {State}\n */\n function sequenceCloseAfter(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"codeFencedFence\");\n return ok(code);\n }\n return nok(code);\n }\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeNonLazyContinuation(effects, ok, nok) {\n const self = this;\n return start;\n\n /**\n *\n *\n * @type {State}\n */\n function start(code) {\n if (code === null) {\n return nok(code);\n }\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return lineStart;\n }\n\n /**\n *\n *\n * @type {State}\n */\n function lineStart(code) {\n return self.parser.lazy[self.now().line] ? nok(code) : ok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const codeIndented = {\n name: 'codeIndented',\n tokenize: tokenizeCodeIndented\n};\n\n/** @type {Construct} */\nconst furtherStart = {\n tokenize: tokenizeFurtherStart,\n partial: true\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeCodeIndented(effects, ok, nok) {\n const self = this;\n return start;\n\n /**\n * Start of code (indented).\n *\n * > **Parsing note**: it is not needed to check if this first line is a\n * > filled line (that it has a non-whitespace character), because blank lines\n * > are parsed already, so we never run into that.\n *\n * ```markdown\n * > | aaa\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // To do: manually check if interrupting like `markdown-rs`.\n\n effects.enter(\"codeIndented\");\n // To do: use an improved `space_or_tab` function like `markdown-rs`,\n // so that we can drop the next state.\n return factorySpace(effects, afterPrefix, \"linePrefix\", 4 + 1)(code);\n }\n\n /**\n * At start, after 1 or 4 spaces.\n *\n * ```markdown\n * > | aaa\n * ^\n * ```\n *\n * @type {State}\n */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return tail && tail[1].type === \"linePrefix\" && tail[2].sliceSerialize(tail[1], true).length >= 4 ? atBreak(code) : nok(code);\n }\n\n /**\n * At a break.\n *\n * ```markdown\n * > | aaa\n * ^ ^\n * ```\n *\n * @type {State}\n */\n function atBreak(code) {\n if (code === null) {\n return after(code);\n }\n if (markdownLineEnding(code)) {\n return effects.attempt(furtherStart, atBreak, after)(code);\n }\n effects.enter(\"codeFlowValue\");\n return inside(code);\n }\n\n /**\n * In code content.\n *\n * ```markdown\n * > | aaa\n * ^^^^\n * ```\n *\n * @type {State}\n */\n function inside(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"codeFlowValue\");\n return atBreak(code);\n }\n effects.consume(code);\n return inside;\n }\n\n /** @type {State} */\n function after(code) {\n effects.exit(\"codeIndented\");\n // To do: allow interrupting like `markdown-rs`.\n // Feel free to interrupt.\n // tokenizer.interrupt = false\n return ok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeFurtherStart(effects, ok, nok) {\n const self = this;\n return furtherStart;\n\n /**\n * At eol, trying to parse another indent.\n *\n * ```markdown\n * > | aaa\n * ^\n * | bbb\n * ```\n *\n * @type {State}\n */\n function furtherStart(code) {\n // To do: improve `lazy` / `pierce` handling.\n // If this is a lazy line, it can’t be code.\n if (self.parser.lazy[self.now().line]) {\n return nok(code);\n }\n if (markdownLineEnding(code)) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return furtherStart;\n }\n\n // To do: the code here in `micromark-js` is a bit different from\n // `markdown-rs` because there it can attempt spaces.\n // We can’t yet.\n //\n // To do: use an improved `space_or_tab` function like `markdown-rs`,\n // so that we can drop the next state.\n return factorySpace(effects, afterPrefix, \"linePrefix\", 4 + 1)(code);\n }\n\n /**\n * At start, after 1 or 4 spaces.\n *\n * ```markdown\n * > | aaa\n * ^\n * ```\n *\n * @type {State}\n */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return tail && tail[1].type === \"linePrefix\" && tail[2].sliceSerialize(tail[1], true).length >= 4 ? ok(code) : markdownLineEnding(code) ? furtherStart(code) : nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Previous} Previous\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { markdownLineEnding } from 'micromark-util-character';\n/** @type {Construct} */\nexport const codeText = {\n name: 'codeText',\n tokenize: tokenizeCodeText,\n resolve: resolveCodeText,\n previous\n};\n\n// To do: next major: don’t resolve, like `markdown-rs`.\n/** @type {Resolver} */\nfunction resolveCodeText(events) {\n let tailExitIndex = events.length - 4;\n let headEnterIndex = 3;\n /** @type {number} */\n let index;\n /** @type {number | undefined} */\n let enter;\n\n // If we start and end with an EOL or a space.\n if ((events[headEnterIndex][1].type === \"lineEnding\" || events[headEnterIndex][1].type === 'space') && (events[tailExitIndex][1].type === \"lineEnding\" || events[tailExitIndex][1].type === 'space')) {\n index = headEnterIndex;\n\n // And we have data.\n while (++index < tailExitIndex) {\n if (events[index][1].type === \"codeTextData\") {\n // Then we have padding.\n events[headEnterIndex][1].type = \"codeTextPadding\";\n events[tailExitIndex][1].type = \"codeTextPadding\";\n headEnterIndex += 2;\n tailExitIndex -= 2;\n break;\n }\n }\n }\n\n // Merge adjacent spaces and data.\n index = headEnterIndex - 1;\n tailExitIndex++;\n while (++index <= tailExitIndex) {\n if (enter === undefined) {\n if (index !== tailExitIndex && events[index][1].type !== \"lineEnding\") {\n enter = index;\n }\n } else if (index === tailExitIndex || events[index][1].type === \"lineEnding\") {\n events[enter][1].type = \"codeTextData\";\n if (index !== enter + 2) {\n events[enter][1].end = events[index - 1][1].end;\n events.splice(enter + 2, index - enter - 2);\n tailExitIndex -= index - enter - 2;\n index = enter + 2;\n }\n enter = undefined;\n }\n }\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Previous}\n */\nfunction previous(code) {\n // If there is a previous code, there will always be a tail.\n return code !== 96 || this.events[this.events.length - 1][1].type === \"characterEscape\";\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeCodeText(effects, ok, nok) {\n const self = this;\n let sizeOpen = 0;\n /** @type {number} */\n let size;\n /** @type {Token} */\n let token;\n return start;\n\n /**\n * Start of code (text).\n *\n * ```markdown\n * > | `a`\n * ^\n * > | \\`a`\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"codeText\");\n effects.enter(\"codeTextSequence\");\n return sequenceOpen(code);\n }\n\n /**\n * In opening sequence.\n *\n * ```markdown\n * > | `a`\n * ^\n * ```\n *\n * @type {State}\n */\n function sequenceOpen(code) {\n if (code === 96) {\n effects.consume(code);\n sizeOpen++;\n return sequenceOpen;\n }\n effects.exit(\"codeTextSequence\");\n return between(code);\n }\n\n /**\n * Between something and something else.\n *\n * ```markdown\n * > | `a`\n * ^^\n * ```\n *\n * @type {State}\n */\n function between(code) {\n // EOF.\n if (code === null) {\n return nok(code);\n }\n\n // To do: next major: don’t do spaces in resolve, but when compiling,\n // like `markdown-rs`.\n // Tabs don’t work, and virtual spaces don’t make sense.\n if (code === 32) {\n effects.enter('space');\n effects.consume(code);\n effects.exit('space');\n return between;\n }\n\n // Closing fence? Could also be data.\n if (code === 96) {\n token = effects.enter(\"codeTextSequence\");\n size = 0;\n return sequenceClose(code);\n }\n if (markdownLineEnding(code)) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return between;\n }\n\n // Data.\n effects.enter(\"codeTextData\");\n return data(code);\n }\n\n /**\n * In data.\n *\n * ```markdown\n * > | `a`\n * ^\n * ```\n *\n * @type {State}\n */\n function data(code) {\n if (code === null || code === 32 || code === 96 || markdownLineEnding(code)) {\n effects.exit(\"codeTextData\");\n return between(code);\n }\n effects.consume(code);\n return data;\n }\n\n /**\n * In closing sequence.\n *\n * ```markdown\n * > | `a`\n * ^\n * ```\n *\n * @type {State}\n */\n function sequenceClose(code) {\n // More.\n if (code === 96) {\n effects.consume(code);\n size++;\n return sequenceClose;\n }\n\n // Done!\n if (size === sizeOpen) {\n effects.exit(\"codeTextSequence\");\n effects.exit(\"codeText\");\n return ok(code);\n }\n\n // More or less accents: mark as data.\n token.type = \"codeTextData\";\n return data(code);\n }\n}","/**\n * Some of the internal operations of micromark do lots of editing\n * operations on very large arrays. This runs into problems with two\n * properties of most circa-2020 JavaScript interpreters:\n *\n * - Array-length modifications at the high end of an array (push/pop) are\n * expected to be common and are implemented in (amortized) time\n * proportional to the number of elements added or removed, whereas\n * other operations (shift/unshift and splice) are much less efficient.\n * - Function arguments are passed on the stack, so adding tens of thousands\n * of elements to an array with `arr.push[...newElements]` will frequently\n * cause stack overflows. (see <https://stackoverflow.com/questions/22123769/rangeerror-maximum-call-stack-size-exceeded-why>)\n *\n * SpliceBuffers are an implementation of gap buffers, which are a\n * generalization of the \"queue made of two stacks\" idea. The splice buffer\n * maintains a cursor, and moving the cursor has cost proportional to the\n * distance the cursor moves, but inserting, deleting, or splicing in\n * new information at the cursor is as efficient as the push/pop operation.\n * This allows for an efficient sequence of splices (or pushes, pops, shifts,\n * or unshifts) as long such edits happen at the same part of the array or\n * generally sweep through the array from the beginning to the end.\n *\n * The interface for splice buffers also supports large numbers of inputs by\n * passing a single array argument rather passing multiple arguments on the\n * function call stack.\n *\n * @template T\n * Item type.\n */\nexport class SpliceBuffer {\n /**\n * @param {ReadonlyArray<T> | null | undefined} [initial]\n * Initial items (optional).\n * @returns\n * Splice buffer.\n */\n constructor(initial) {\n /** @type {Array<T>} */\n this.left = initial ? [...initial] : [];\n /** @type {Array<T>} */\n this.right = [];\n }\n\n /**\n * Array access;\n * does not move the cursor.\n *\n * @param {number} index\n * Index.\n * @return {T}\n * Item.\n */\n get(index) {\n if (index < 0 || index >= this.left.length + this.right.length) {\n throw new RangeError('Cannot access index `' + index + '` in a splice buffer of size `' + (this.left.length + this.right.length) + '`');\n }\n if (index < this.left.length) return this.left[index];\n return this.right[this.right.length - index + this.left.length - 1];\n }\n\n /**\n * The length of the splice buffer, one greater than the largest index in the\n * array.\n */\n get length() {\n return this.left.length + this.right.length;\n }\n\n /**\n * Remove and return `list[0]`;\n * moves the cursor to `0`.\n *\n * @returns {T | undefined}\n * Item, optional.\n */\n shift() {\n this.setCursor(0);\n return this.right.pop();\n }\n\n /**\n * Slice the buffer to get an array;\n * does not move the cursor.\n *\n * @param {number} start\n * Start.\n * @param {number | null | undefined} [end]\n * End (optional).\n * @returns {Array<T>}\n * Array of items.\n */\n slice(start, end) {\n /** @type {number} */\n const stop = end === null || end === undefined ? Number.POSITIVE_INFINITY : end;\n if (stop < this.left.length) {\n return this.left.slice(start, stop);\n }\n if (start > this.left.length) {\n return this.right.slice(this.right.length - stop + this.left.length, this.right.length - start + this.left.length).reverse();\n }\n return this.left.slice(start).concat(this.right.slice(this.right.length - stop + this.left.length).reverse());\n }\n\n /**\n * Mimics the behavior of Array.prototype.splice() except for the change of\n * interface necessary to avoid segfaults when patching in very large arrays.\n *\n * This operation moves cursor is moved to `start` and results in the cursor\n * placed after any inserted items.\n *\n * @param {number} start\n * Start;\n * zero-based index at which to start changing the array;\n * negative numbers count backwards from the end of the array and values\n * that are out-of bounds are clamped to the appropriate end of the array.\n * @param {number | null | undefined} [deleteCount=0]\n * Delete count (default: `0`);\n * maximum number of elements to delete, starting from start.\n * @param {Array<T> | null | undefined} [items=[]]\n * Items to include in place of the deleted items (default: `[]`).\n * @return {Array<T>}\n * Any removed items.\n */\n splice(start, deleteCount, items) {\n /** @type {number} */\n const count = deleteCount || 0;\n this.setCursor(Math.trunc(start));\n const removed = this.right.splice(this.right.length - count, Number.POSITIVE_INFINITY);\n if (items) chunkedPush(this.left, items);\n return removed.reverse();\n }\n\n /**\n * Remove and return the highest-numbered item in the array, so\n * `list[list.length - 1]`;\n * Moves the cursor to `length`.\n *\n * @returns {T | undefined}\n * Item, optional.\n */\n pop() {\n this.setCursor(Number.POSITIVE_INFINITY);\n return this.left.pop();\n }\n\n /**\n * Inserts a single item to the high-numbered side of the array;\n * moves the cursor to `length`.\n *\n * @param {T} item\n * Item.\n * @returns {undefined}\n * Nothing.\n */\n push(item) {\n this.setCursor(Number.POSITIVE_INFINITY);\n this.left.push(item);\n }\n\n /**\n * Inserts many items to the high-numbered side of the array.\n * Moves the cursor to `length`.\n *\n * @param {Array<T>} items\n * Items.\n * @returns {undefined}\n * Nothing.\n */\n pushMany(items) {\n this.setCursor(Number.POSITIVE_INFINITY);\n chunkedPush(this.left, items);\n }\n\n /**\n * Inserts a single item to the low-numbered side of the array;\n * Moves the cursor to `0`.\n *\n * @param {T} item\n * Item.\n * @returns {undefined}\n * Nothing.\n */\n unshift(item) {\n this.setCursor(0);\n this.right.push(item);\n }\n\n /**\n * Inserts many items to the low-numbered side of the array;\n * moves the cursor to `0`.\n *\n * @param {Array<T>} items\n * Items.\n * @returns {undefined}\n * Nothing.\n */\n unshiftMany(items) {\n this.setCursor(0);\n chunkedPush(this.right, items.reverse());\n }\n\n /**\n * Move the cursor to a specific position in the array. Requires\n * time proportional to the distance moved.\n *\n * If `n < 0`, the cursor will end up at the beginning.\n * If `n > length`, the cursor will end up at the end.\n *\n * @param {number} n\n * Position.\n * @return {undefined}\n * Nothing.\n */\n setCursor(n) {\n if (n === this.left.length || n > this.left.length && this.right.length === 0 || n < 0 && this.left.length === 0) return;\n if (n < this.left.length) {\n // Move cursor to the this.left\n const removed = this.left.splice(n, Number.POSITIVE_INFINITY);\n chunkedPush(this.right, removed.reverse());\n } else {\n // Move cursor to the this.right\n const removed = this.right.splice(this.left.length + this.right.length - n, Number.POSITIVE_INFINITY);\n chunkedPush(this.left, removed.reverse());\n }\n }\n}\n\n/**\n * Avoid stack overflow by pushing items onto the stack in segments\n *\n * @template T\n * Item type.\n * @param {Array<T>} list\n * List to inject into.\n * @param {ReadonlyArray<T>} right\n * Items to inject.\n * @return {undefined}\n * Nothing.\n */\nfunction chunkedPush(list, right) {\n /** @type {number} */\n let chunkStart = 0;\n if (right.length < 10000) {\n list.push(...right);\n } else {\n while (chunkStart < right.length) {\n list.push(...right.slice(chunkStart, chunkStart + 10000));\n chunkStart += 10000;\n }\n }\n}","/**\n * @typedef {import('micromark-util-types').Chunk} Chunk\n * @typedef {import('micromark-util-types').Event} Event\n * @typedef {import('micromark-util-types').Token} Token\n */\n\nimport { splice } from 'micromark-util-chunked';\nimport { SpliceBuffer } from './lib/splice-buffer.js';\n\n// Hidden API exposed for testing.\nexport { SpliceBuffer } from './lib/splice-buffer.js';\n\n/**\n * Tokenize subcontent.\n *\n * @param {Array<Event>} eventsArray\n * List of events.\n * @returns {boolean}\n * Whether subtokens were found.\n */\n// eslint-disable-next-line complexity\nexport function subtokenize(eventsArray) {\n /** @type {Record<string, number>} */\n const jumps = {};\n let index = -1;\n /** @type {Event} */\n let event;\n /** @type {number | undefined} */\n let lineIndex;\n /** @type {number} */\n let otherIndex;\n /** @type {Event} */\n let otherEvent;\n /** @type {Array<Event>} */\n let parameters;\n /** @type {Array<Event>} */\n let subevents;\n /** @type {boolean | undefined} */\n let more;\n const events = new SpliceBuffer(eventsArray);\n while (++index < events.length) {\n while (index in jumps) {\n index = jumps[index];\n }\n event = events.get(index);\n\n // Add a hook for the GFM tasklist extension, which needs to know if text\n // is in the first content of a list item.\n if (index && event[1].type === \"chunkFlow\" && events.get(index - 1)[1].type === \"listItemPrefix\") {\n subevents = event[1]._tokenizer.events;\n otherIndex = 0;\n if (otherIndex < subevents.length && subevents[otherIndex][1].type === \"lineEndingBlank\") {\n otherIndex += 2;\n }\n if (otherIndex < subevents.length && subevents[otherIndex][1].type === \"content\") {\n while (++otherIndex < subevents.length) {\n if (subevents[otherIndex][1].type === \"content\") {\n break;\n }\n if (subevents[otherIndex][1].type === \"chunkText\") {\n subevents[otherIndex][1]._isInFirstContentOfListItem = true;\n otherIndex++;\n }\n }\n }\n }\n\n // Enter.\n if (event[0] === 'enter') {\n if (event[1].contentType) {\n Object.assign(jumps, subcontent(events, index));\n index = jumps[index];\n more = true;\n }\n }\n // Exit.\n else if (event[1]._container) {\n otherIndex = index;\n lineIndex = undefined;\n while (otherIndex--) {\n otherEvent = events.get(otherIndex);\n if (otherEvent[1].type === \"lineEnding\" || otherEvent[1].type === \"lineEndingBlank\") {\n if (otherEvent[0] === 'enter') {\n if (lineIndex) {\n events.get(lineIndex)[1].type = \"lineEndingBlank\";\n }\n otherEvent[1].type = \"lineEnding\";\n lineIndex = otherIndex;\n }\n } else {\n break;\n }\n }\n if (lineIndex) {\n // Fix position.\n event[1].end = Object.assign({}, events.get(lineIndex)[1].start);\n\n // Switch container exit w/ line endings.\n parameters = events.slice(lineIndex, index);\n parameters.unshift(event);\n events.splice(lineIndex, index - lineIndex + 1, parameters);\n }\n }\n }\n\n // The changes to the `events` buffer must be copied back into the eventsArray\n splice(eventsArray, 0, Number.POSITIVE_INFINITY, events.slice(0));\n return !more;\n}\n\n/**\n * Tokenize embedded tokens.\n *\n * @param {SpliceBuffer<Event>} events\n * @param {number} eventIndex\n * @returns {Record<string, number>}\n */\nfunction subcontent(events, eventIndex) {\n const token = events.get(eventIndex)[1];\n const context = events.get(eventIndex)[2];\n let startPosition = eventIndex - 1;\n /** @type {Array<number>} */\n const startPositions = [];\n const tokenizer = token._tokenizer || context.parser[token.contentType](token.start);\n const childEvents = tokenizer.events;\n /** @type {Array<[number, number]>} */\n const jumps = [];\n /** @type {Record<string, number>} */\n const gaps = {};\n /** @type {Array<Chunk>} */\n let stream;\n /** @type {Token | undefined} */\n let previous;\n let index = -1;\n /** @type {Token | undefined} */\n let current = token;\n let adjust = 0;\n let start = 0;\n const breaks = [start];\n\n // Loop forward through the linked tokens to pass them in order to the\n // subtokenizer.\n while (current) {\n // Find the position of the event for this token.\n while (events.get(++startPosition)[1] !== current) {\n // Empty.\n }\n startPositions.push(startPosition);\n if (!current._tokenizer) {\n stream = context.sliceStream(current);\n if (!current.next) {\n stream.push(null);\n }\n if (previous) {\n tokenizer.defineSkip(current.start);\n }\n if (current._isInFirstContentOfListItem) {\n tokenizer._gfmTasklistFirstContentOfListItem = true;\n }\n tokenizer.write(stream);\n if (current._isInFirstContentOfListItem) {\n tokenizer._gfmTasklistFirstContentOfListItem = undefined;\n }\n }\n\n // Unravel the next token.\n previous = current;\n current = current.next;\n }\n\n // Now, loop back through all events (and linked tokens), to figure out which\n // parts belong where.\n current = token;\n while (++index < childEvents.length) {\n if (\n // Find a void token that includes a break.\n childEvents[index][0] === 'exit' && childEvents[index - 1][0] === 'enter' && childEvents[index][1].type === childEvents[index - 1][1].type && childEvents[index][1].start.line !== childEvents[index][1].end.line) {\n start = index + 1;\n breaks.push(start);\n // Help GC.\n current._tokenizer = undefined;\n current.previous = undefined;\n current = current.next;\n }\n }\n\n // Help GC.\n tokenizer.events = [];\n\n // If there’s one more token (which is the cases for lines that end in an\n // EOF), that’s perfect: the last point we found starts it.\n // If there isn’t then make sure any remaining content is added to it.\n if (current) {\n // Help GC.\n current._tokenizer = undefined;\n current.previous = undefined;\n } else {\n breaks.pop();\n }\n\n // Now splice the events from the subtokenizer into the current events,\n // moving back to front so that splice indices aren’t affected.\n index = breaks.length;\n while (index--) {\n const slice = childEvents.slice(breaks[index], breaks[index + 1]);\n const start = startPositions.pop();\n jumps.push([start, start + slice.length - 1]);\n events.splice(start, 2, slice);\n }\n jumps.reverse();\n index = -1;\n while (++index < jumps.length) {\n gaps[adjust + jumps[index][0]] = adjust + jumps[index][1];\n adjust += jumps[index][1] - jumps[index][0] - 1;\n }\n return gaps;\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding } from 'micromark-util-character';\nimport { subtokenize } from 'micromark-util-subtokenize';\n/**\n * No name because it must not be turned off.\n * @type {Construct}\n */\nexport const content = {\n tokenize: tokenizeContent,\n resolve: resolveContent\n};\n\n/** @type {Construct} */\nconst continuationConstruct = {\n tokenize: tokenizeContinuation,\n partial: true\n};\n\n/**\n * Content is transparent: it’s parsed right now. That way, definitions are also\n * parsed right now: before text in paragraphs (specifically, media) are parsed.\n *\n * @type {Resolver}\n */\nfunction resolveContent(events) {\n subtokenize(events);\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeContent(effects, ok) {\n /** @type {Token | undefined} */\n let previous;\n return chunkStart;\n\n /**\n * Before a content chunk.\n *\n * ```markdown\n * > | abc\n * ^\n * ```\n *\n * @type {State}\n */\n function chunkStart(code) {\n effects.enter(\"content\");\n previous = effects.enter(\"chunkContent\", {\n contentType: \"content\"\n });\n return chunkInside(code);\n }\n\n /**\n * In a content chunk.\n *\n * ```markdown\n * > | abc\n * ^^^\n * ```\n *\n * @type {State}\n */\n function chunkInside(code) {\n if (code === null) {\n return contentEnd(code);\n }\n\n // To do: in `markdown-rs`, each line is parsed on its own, and everything\n // is stitched together resolving.\n if (markdownLineEnding(code)) {\n return effects.check(continuationConstruct, contentContinue, contentEnd)(code);\n }\n\n // Data.\n effects.consume(code);\n return chunkInside;\n }\n\n /**\n *\n *\n * @type {State}\n */\n function contentEnd(code) {\n effects.exit(\"chunkContent\");\n effects.exit(\"content\");\n return ok(code);\n }\n\n /**\n *\n *\n * @type {State}\n */\n function contentContinue(code) {\n effects.consume(code);\n effects.exit(\"chunkContent\");\n previous.next = effects.enter(\"chunkContent\", {\n contentType: \"content\",\n previous\n });\n previous = previous.next;\n return chunkInside;\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeContinuation(effects, ok, nok) {\n const self = this;\n return startLookahead;\n\n /**\n *\n *\n * @type {State}\n */\n function startLookahead(code) {\n effects.exit(\"chunkContent\");\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return factorySpace(effects, prefixed, \"linePrefix\");\n }\n\n /**\n *\n *\n * @type {State}\n */\n function prefixed(code) {\n if (code === null || markdownLineEnding(code)) {\n return nok(code);\n }\n\n // Always populated by defaults.\n\n const tail = self.events[self.events.length - 1];\n if (!self.parser.constructs.disable.null.includes('codeIndented') && tail && tail[1].type === \"linePrefix\" && tail[2].sliceSerialize(tail[1], true).length >= 4) {\n return ok(code);\n }\n return effects.interrupt(self.parser.constructs.flow, nok, ok)(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Effects} Effects\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenType} TokenType\n */\n\nimport {\n asciiControl,\n markdownLineEndingOrSpace,\n markdownLineEnding\n} from 'micromark-util-character'\n/**\n * Parse destinations.\n *\n * ###### Examples\n *\n * ```markdown\n * <a>\n * <a\\>b>\n * <a b>\n * <a)>\n * a\n * a\\)b\n * a(b)c\n * a(b)\n * ```\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {State} nok\n * State switched to when unsuccessful.\n * @param {TokenType} type\n * Type for whole (`<a>` or `b`).\n * @param {TokenType} literalType\n * Type when enclosed (`<a>`).\n * @param {TokenType} literalMarkerType\n * Type for enclosing (`<` and `>`).\n * @param {TokenType} rawType\n * Type when not enclosed (`b`).\n * @param {TokenType} stringType\n * Type for the value (`a` or `b`).\n * @param {number | undefined} [max=Infinity]\n * Depth of nested parens (inclusive).\n * @returns {State}\n * Start state.\n */ // eslint-disable-next-line max-params\nexport function factoryDestination(\n effects,\n ok,\n nok,\n type,\n literalType,\n literalMarkerType,\n rawType,\n stringType,\n max\n) {\n const limit = max || Number.POSITIVE_INFINITY\n let balance = 0\n return start\n\n /**\n * Start of destination.\n *\n * ```markdown\n * > | <aa>\n * ^\n * > | aa\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n if (code === 60) {\n effects.enter(type)\n effects.enter(literalType)\n effects.enter(literalMarkerType)\n effects.consume(code)\n effects.exit(literalMarkerType)\n return enclosedBefore\n }\n\n // ASCII control, space, closing paren.\n if (code === null || code === 32 || code === 41 || asciiControl(code)) {\n return nok(code)\n }\n effects.enter(type)\n effects.enter(rawType)\n effects.enter(stringType)\n effects.enter('chunkString', {\n contentType: 'string'\n })\n return raw(code)\n }\n\n /**\n * After `<`, at an enclosed destination.\n *\n * ```markdown\n * > | <aa>\n * ^\n * ```\n *\n * @type {State}\n */\n function enclosedBefore(code) {\n if (code === 62) {\n effects.enter(literalMarkerType)\n effects.consume(code)\n effects.exit(literalMarkerType)\n effects.exit(literalType)\n effects.exit(type)\n return ok\n }\n effects.enter(stringType)\n effects.enter('chunkString', {\n contentType: 'string'\n })\n return enclosed(code)\n }\n\n /**\n * In enclosed destination.\n *\n * ```markdown\n * > | <aa>\n * ^\n * ```\n *\n * @type {State}\n */\n function enclosed(code) {\n if (code === 62) {\n effects.exit('chunkString')\n effects.exit(stringType)\n return enclosedBefore(code)\n }\n if (code === null || code === 60 || markdownLineEnding(code)) {\n return nok(code)\n }\n effects.consume(code)\n return code === 92 ? enclosedEscape : enclosed\n }\n\n /**\n * After `\\`, at a special character.\n *\n * ```markdown\n * > | <a\\*a>\n * ^\n * ```\n *\n * @type {State}\n */\n function enclosedEscape(code) {\n if (code === 60 || code === 62 || code === 92) {\n effects.consume(code)\n return enclosed\n }\n return enclosed(code)\n }\n\n /**\n * In raw destination.\n *\n * ```markdown\n * > | aa\n * ^\n * ```\n *\n * @type {State}\n */\n function raw(code) {\n if (\n !balance &&\n (code === null || code === 41 || markdownLineEndingOrSpace(code))\n ) {\n effects.exit('chunkString')\n effects.exit(stringType)\n effects.exit(rawType)\n effects.exit(type)\n return ok(code)\n }\n if (balance < limit && code === 40) {\n effects.consume(code)\n balance++\n return raw\n }\n if (code === 41) {\n effects.consume(code)\n balance--\n return raw\n }\n\n // ASCII control (but *not* `\\0`) and space and `(`.\n // Note: in `markdown-rs`, `\\0` exists in codes, in `micromark-js` it\n // doesn’t.\n if (code === null || code === 32 || code === 40 || asciiControl(code)) {\n return nok(code)\n }\n effects.consume(code)\n return code === 92 ? rawEscape : raw\n }\n\n /**\n * After `\\`, at special character.\n *\n * ```markdown\n * > | a\\*a\n * ^\n * ```\n *\n * @type {State}\n */\n function rawEscape(code) {\n if (code === 40 || code === 41 || code === 92) {\n effects.consume(code)\n return raw\n }\n return raw(code)\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Effects} Effects\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').TokenType} TokenType\n */\n\nimport {markdownLineEnding, markdownSpace} from 'micromark-util-character'\n/**\n * Parse labels.\n *\n * > 👉 **Note**: labels in markdown are capped at 999 characters in the string.\n *\n * ###### Examples\n *\n * ```markdown\n * [a]\n * [a\n * b]\n * [a\\]b]\n * ```\n *\n * @this {TokenizeContext}\n * Tokenize context.\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {State} nok\n * State switched to when unsuccessful.\n * @param {TokenType} type\n * Type of the whole label (`[a]`).\n * @param {TokenType} markerType\n * Type for the markers (`[` and `]`).\n * @param {TokenType} stringType\n * Type for the identifier (`a`).\n * @returns {State}\n * Start state.\n */ // eslint-disable-next-line max-params\nexport function factoryLabel(effects, ok, nok, type, markerType, stringType) {\n const self = this\n let size = 0\n /** @type {boolean} */\n let seen\n return start\n\n /**\n * Start of label.\n *\n * ```markdown\n * > | [a]\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(type)\n effects.enter(markerType)\n effects.consume(code)\n effects.exit(markerType)\n effects.enter(stringType)\n return atBreak\n }\n\n /**\n * In label, at something, before something else.\n *\n * ```markdown\n * > | [a]\n * ^\n * ```\n *\n * @type {State}\n */\n function atBreak(code) {\n if (\n size > 999 ||\n code === null ||\n code === 91 ||\n (code === 93 && !seen) ||\n // To do: remove in the future once we’ve switched from\n // `micromark-extension-footnote` to `micromark-extension-gfm-footnote`,\n // which doesn’t need this.\n // Hidden footnotes hook.\n /* c8 ignore next 3 */\n (code === 94 &&\n !size &&\n '_hiddenFootnoteSupport' in self.parser.constructs)\n ) {\n return nok(code)\n }\n if (code === 93) {\n effects.exit(stringType)\n effects.enter(markerType)\n effects.consume(code)\n effects.exit(markerType)\n effects.exit(type)\n return ok\n }\n\n // To do: indent? Link chunks and EOLs together?\n if (markdownLineEnding(code)) {\n effects.enter('lineEnding')\n effects.consume(code)\n effects.exit('lineEnding')\n return atBreak\n }\n effects.enter('chunkString', {\n contentType: 'string'\n })\n return labelInside(code)\n }\n\n /**\n * In label, in text.\n *\n * ```markdown\n * > | [a]\n * ^\n * ```\n *\n * @type {State}\n */\n function labelInside(code) {\n if (\n code === null ||\n code === 91 ||\n code === 93 ||\n markdownLineEnding(code) ||\n size++ > 999\n ) {\n effects.exit('chunkString')\n return atBreak(code)\n }\n effects.consume(code)\n if (!seen) seen = !markdownSpace(code)\n return code === 92 ? labelEscape : labelInside\n }\n\n /**\n * After `\\`, at a special character.\n *\n * ```markdown\n * > | [a\\*a]\n * ^\n * ```\n *\n * @type {State}\n */\n function labelEscape(code) {\n if (code === 91 || code === 92 || code === 93) {\n effects.consume(code)\n size++\n return labelInside\n }\n return labelInside(code)\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Effects} Effects\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenType} TokenType\n */\n\nimport {factorySpace} from 'micromark-factory-space'\nimport {markdownLineEnding} from 'micromark-util-character'\n/**\n * Parse titles.\n *\n * ###### Examples\n *\n * ```markdown\n * \"a\"\n * 'b'\n * (c)\n * \"a\n * b\"\n * 'a\n * b'\n * (a\\)b)\n * ```\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {State} nok\n * State switched to when unsuccessful.\n * @param {TokenType} type\n * Type of the whole title (`\"a\"`, `'b'`, `(c)`).\n * @param {TokenType} markerType\n * Type for the markers (`\"`, `'`, `(`, and `)`).\n * @param {TokenType} stringType\n * Type for the value (`a`).\n * @returns {State}\n * Start state.\n */ // eslint-disable-next-line max-params\nexport function factoryTitle(effects, ok, nok, type, markerType, stringType) {\n /** @type {NonNullable<Code>} */\n let marker\n return start\n\n /**\n * Start of title.\n *\n * ```markdown\n * > | \"a\"\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n if (code === 34 || code === 39 || code === 40) {\n effects.enter(type)\n effects.enter(markerType)\n effects.consume(code)\n effects.exit(markerType)\n marker = code === 40 ? 41 : code\n return begin\n }\n return nok(code)\n }\n\n /**\n * After opening marker.\n *\n * This is also used at the closing marker.\n *\n * ```markdown\n * > | \"a\"\n * ^\n * ```\n *\n * @type {State}\n */\n function begin(code) {\n if (code === marker) {\n effects.enter(markerType)\n effects.consume(code)\n effects.exit(markerType)\n effects.exit(type)\n return ok\n }\n effects.enter(stringType)\n return atBreak(code)\n }\n\n /**\n * At something, before something else.\n *\n * ```markdown\n * > | \"a\"\n * ^\n * ```\n *\n * @type {State}\n */\n function atBreak(code) {\n if (code === marker) {\n effects.exit(stringType)\n return begin(marker)\n }\n if (code === null) {\n return nok(code)\n }\n\n // Note: blank lines can’t exist in content.\n if (markdownLineEnding(code)) {\n // To do: use `space_or_tab_eol_with_options`, connect.\n effects.enter('lineEnding')\n effects.consume(code)\n effects.exit('lineEnding')\n return factorySpace(effects, atBreak, 'linePrefix')\n }\n effects.enter('chunkString', {\n contentType: 'string'\n })\n return inside(code)\n }\n\n /**\n *\n *\n * @type {State}\n */\n function inside(code) {\n if (code === marker || code === null || markdownLineEnding(code)) {\n effects.exit('chunkString')\n return atBreak(code)\n }\n effects.consume(code)\n return code === 92 ? escape : inside\n }\n\n /**\n * After `\\`, at a special character.\n *\n * ```markdown\n * > | \"a\\*b\"\n * ^\n * ```\n *\n * @type {State}\n */\n function escape(code) {\n if (code === marker || code === 92) {\n effects.consume(code)\n return inside\n }\n return inside(code)\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Effects} Effects\n * @typedef {import('micromark-util-types').State} State\n */\n\nimport {factorySpace} from 'micromark-factory-space'\nimport {markdownLineEnding, markdownSpace} from 'micromark-util-character'\n/**\n * Parse spaces and tabs.\n *\n * There is no `nok` parameter:\n *\n * * line endings or spaces in markdown are often optional, in which case this\n * factory can be used and `ok` will be switched to whether spaces were found\n * or not\n * * one line ending or space can be detected with\n * `markdownLineEndingOrSpace(code)` right before using `factoryWhitespace`\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @returns {State}\n * Start state.\n */\nexport function factoryWhitespace(effects, ok) {\n /** @type {boolean} */\n let seen\n return start\n\n /** @type {State} */\n function start(code) {\n if (markdownLineEnding(code)) {\n effects.enter('lineEnding')\n effects.consume(code)\n effects.exit('lineEnding')\n seen = true\n return start\n }\n if (markdownSpace(code)) {\n return factorySpace(\n effects,\n start,\n seen ? 'linePrefix' : 'lineSuffix'\n )(code)\n }\n return ok(code)\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factoryDestination } from 'micromark-factory-destination';\nimport { factoryLabel } from 'micromark-factory-label';\nimport { factorySpace } from 'micromark-factory-space';\nimport { factoryTitle } from 'micromark-factory-title';\nimport { factoryWhitespace } from 'micromark-factory-whitespace';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\n/** @type {Construct} */\nexport const definition = {\n name: 'definition',\n tokenize: tokenizeDefinition\n};\n\n/** @type {Construct} */\nconst titleBefore = {\n tokenize: tokenizeTitleBefore,\n partial: true\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinition(effects, ok, nok) {\n const self = this;\n /** @type {string} */\n let identifier;\n return start;\n\n /**\n * At start of a definition.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // Do not interrupt paragraphs (but do follow definitions).\n // To do: do `interrupt` the way `markdown-rs` does.\n // To do: parse whitespace the way `markdown-rs` does.\n effects.enter(\"definition\");\n return before(code);\n }\n\n /**\n * After optional whitespace, at `[`.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function before(code) {\n // To do: parse whitespace the way `markdown-rs` does.\n\n return factoryLabel.call(self, effects, labelAfter,\n // Note: we don’t need to reset the way `markdown-rs` does.\n nok, \"definitionLabel\", \"definitionLabelMarker\", \"definitionLabelString\")(code);\n }\n\n /**\n * After label.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function labelAfter(code) {\n identifier = normalizeIdentifier(self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1));\n if (code === 58) {\n effects.enter(\"definitionMarker\");\n effects.consume(code);\n effects.exit(\"definitionMarker\");\n return markerAfter;\n }\n return nok(code);\n }\n\n /**\n * After marker.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function markerAfter(code) {\n // Note: whitespace is optional.\n return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, destinationBefore)(code) : destinationBefore(code);\n }\n\n /**\n * Before destination.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function destinationBefore(code) {\n return factoryDestination(effects, destinationAfter,\n // Note: we don’t need to reset the way `markdown-rs` does.\n nok, \"definitionDestination\", \"definitionDestinationLiteral\", \"definitionDestinationLiteralMarker\", \"definitionDestinationRaw\", \"definitionDestinationString\")(code);\n }\n\n /**\n * After destination.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function destinationAfter(code) {\n return effects.attempt(titleBefore, after, after)(code);\n }\n\n /**\n * After definition.\n *\n * ```markdown\n * > | [a]: b\n * ^\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n return markdownSpace(code) ? factorySpace(effects, afterWhitespace, \"whitespace\")(code) : afterWhitespace(code);\n }\n\n /**\n * After definition, after optional whitespace.\n *\n * ```markdown\n * > | [a]: b\n * ^\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function afterWhitespace(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"definition\");\n\n // Note: we don’t care about uniqueness.\n // It’s likely that that doesn’t happen very frequently.\n // It is more likely that it wastes precious time.\n self.parser.defined.push(identifier);\n\n // To do: `markdown-rs` interrupt.\n // // You’d be interrupting.\n // tokenizer.interrupt = true\n return ok(code);\n }\n return nok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTitleBefore(effects, ok, nok) {\n return titleBefore;\n\n /**\n * After destination, at whitespace.\n *\n * ```markdown\n * > | [a]: b\n * ^\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function titleBefore(code) {\n return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, beforeMarker)(code) : nok(code);\n }\n\n /**\n * At title.\n *\n * ```markdown\n * | [a]: b\n * > | \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function beforeMarker(code) {\n return factoryTitle(effects, titleAfter, nok, \"definitionTitle\", \"definitionTitleMarker\", \"definitionTitleString\")(code);\n }\n\n /**\n * After title.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function titleAfter(code) {\n return markdownSpace(code) ? factorySpace(effects, titleAfterOptionalWhitespace, \"whitespace\")(code) : titleAfterOptionalWhitespace(code);\n }\n\n /**\n * After title, after optional whitespace.\n *\n * ```markdown\n * > | [a]: b \"c\"\n * ^\n * ```\n *\n * @type {State}\n */\n function titleAfterOptionalWhitespace(code) {\n return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { markdownLineEnding } from 'micromark-util-character';\n/** @type {Construct} */\nexport const hardBreakEscape = {\n name: 'hardBreakEscape',\n tokenize: tokenizeHardBreakEscape\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeHardBreakEscape(effects, ok, nok) {\n return start;\n\n /**\n * Start of a hard break (escape).\n *\n * ```markdown\n * > | a\\\n * ^\n * | b\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"hardBreakEscape\");\n effects.consume(code);\n return after;\n }\n\n /**\n * After `\\`, at eol.\n *\n * ```markdown\n * > | a\\\n * ^\n * | b\n * ```\n *\n * @type {State}\n */\n function after(code) {\n if (markdownLineEnding(code)) {\n effects.exit(\"hardBreakEscape\");\n return ok(code);\n }\n return nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nimport { splice } from 'micromark-util-chunked';\n/** @type {Construct} */\nexport const headingAtx = {\n name: 'headingAtx',\n tokenize: tokenizeHeadingAtx,\n resolve: resolveHeadingAtx\n};\n\n/** @type {Resolver} */\nfunction resolveHeadingAtx(events, context) {\n let contentEnd = events.length - 2;\n let contentStart = 3;\n /** @type {Token} */\n let content;\n /** @type {Token} */\n let text;\n\n // Prefix whitespace, part of the opening.\n if (events[contentStart][1].type === \"whitespace\") {\n contentStart += 2;\n }\n\n // Suffix whitespace, part of the closing.\n if (contentEnd - 2 > contentStart && events[contentEnd][1].type === \"whitespace\") {\n contentEnd -= 2;\n }\n if (events[contentEnd][1].type === \"atxHeadingSequence\" && (contentStart === contentEnd - 1 || contentEnd - 4 > contentStart && events[contentEnd - 2][1].type === \"whitespace\")) {\n contentEnd -= contentStart + 1 === contentEnd ? 2 : 4;\n }\n if (contentEnd > contentStart) {\n content = {\n type: \"atxHeadingText\",\n start: events[contentStart][1].start,\n end: events[contentEnd][1].end\n };\n text = {\n type: \"chunkText\",\n start: events[contentStart][1].start,\n end: events[contentEnd][1].end,\n contentType: \"text\"\n };\n splice(events, contentStart, contentEnd - contentStart + 1, [['enter', content, context], ['enter', text, context], ['exit', text, context], ['exit', content, context]]);\n }\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeHeadingAtx(effects, ok, nok) {\n let size = 0;\n return start;\n\n /**\n * Start of a heading (atx).\n *\n * ```markdown\n * > | ## aa\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // To do: parse indent like `markdown-rs`.\n effects.enter(\"atxHeading\");\n return before(code);\n }\n\n /**\n * After optional whitespace, at `#`.\n *\n * ```markdown\n * > | ## aa\n * ^\n * ```\n *\n * @type {State}\n */\n function before(code) {\n effects.enter(\"atxHeadingSequence\");\n return sequenceOpen(code);\n }\n\n /**\n * In opening sequence.\n *\n * ```markdown\n * > | ## aa\n * ^\n * ```\n *\n * @type {State}\n */\n function sequenceOpen(code) {\n if (code === 35 && size++ < 6) {\n effects.consume(code);\n return sequenceOpen;\n }\n\n // Always at least one `#`.\n if (code === null || markdownLineEndingOrSpace(code)) {\n effects.exit(\"atxHeadingSequence\");\n return atBreak(code);\n }\n return nok(code);\n }\n\n /**\n * After something, before something else.\n *\n * ```markdown\n * > | ## aa\n * ^\n * ```\n *\n * @type {State}\n */\n function atBreak(code) {\n if (code === 35) {\n effects.enter(\"atxHeadingSequence\");\n return sequenceFurther(code);\n }\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"atxHeading\");\n // To do: interrupt like `markdown-rs`.\n // // Feel free to interrupt.\n // tokenizer.interrupt = false\n return ok(code);\n }\n if (markdownSpace(code)) {\n return factorySpace(effects, atBreak, \"whitespace\")(code);\n }\n\n // To do: generate `data` tokens, add the `text` token later.\n // Needs edit map, see: `markdown.rs`.\n effects.enter(\"atxHeadingText\");\n return data(code);\n }\n\n /**\n * In further sequence (after whitespace).\n *\n * Could be normal “visible” hashes in the heading or a final sequence.\n *\n * ```markdown\n * > | ## aa ##\n * ^\n * ```\n *\n * @type {State}\n */\n function sequenceFurther(code) {\n if (code === 35) {\n effects.consume(code);\n return sequenceFurther;\n }\n effects.exit(\"atxHeadingSequence\");\n return atBreak(code);\n }\n\n /**\n * In text.\n *\n * ```markdown\n * > | ## aa\n * ^\n * ```\n *\n * @type {State}\n */\n function data(code) {\n if (code === null || code === 35 || markdownLineEndingOrSpace(code)) {\n effects.exit(\"atxHeadingText\");\n return atBreak(code);\n }\n effects.consume(code);\n return data;\n }\n}","/**\n * List of lowercase HTML “block” tag names.\n *\n * The list, when parsing HTML (flow), results in more relaxed rules (condition\n * 6).\n * Because they are known blocks, the HTML-like syntax doesn’t have to be\n * strictly parsed.\n * For tag names not in this list, a more strict algorithm (condition 7) is used\n * to detect whether the HTML-like syntax is seen as HTML (flow) or not.\n *\n * This is copied from:\n * <https://spec.commonmark.org/0.30/#html-blocks>.\n *\n * > 👉 **Note**: `search` was added in `CommonMark@0.31`.\n */\nexport const htmlBlockNames = [\n 'address',\n 'article',\n 'aside',\n 'base',\n 'basefont',\n 'blockquote',\n 'body',\n 'caption',\n 'center',\n 'col',\n 'colgroup',\n 'dd',\n 'details',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'frame',\n 'frameset',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hr',\n 'html',\n 'iframe',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'menu',\n 'menuitem',\n 'nav',\n 'noframes',\n 'ol',\n 'optgroup',\n 'option',\n 'p',\n 'param',\n 'search',\n 'section',\n 'summary',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'title',\n 'tr',\n 'track',\n 'ul'\n]\n\n/**\n * List of lowercase HTML “raw” tag names.\n *\n * The list, when parsing HTML (flow), results in HTML that can include lines\n * without exiting, until a closing tag also in this list is found (condition\n * 1).\n *\n * This module is copied from:\n * <https://spec.commonmark.org/0.30/#html-blocks>.\n *\n * > 👉 **Note**: `textarea` was added in `CommonMark@0.30`.\n */\nexport const htmlRawNames = ['pre', 'script', 'style', 'textarea']\n","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { asciiAlpha, asciiAlphanumeric, markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nimport { htmlBlockNames, htmlRawNames } from 'micromark-util-html-tag-name';\nimport { blankLine } from './blank-line.js';\n\n/** @type {Construct} */\nexport const htmlFlow = {\n name: 'htmlFlow',\n tokenize: tokenizeHtmlFlow,\n resolveTo: resolveToHtmlFlow,\n concrete: true\n};\n\n/** @type {Construct} */\nconst blankLineBefore = {\n tokenize: tokenizeBlankLineBefore,\n partial: true\n};\nconst nonLazyContinuationStart = {\n tokenize: tokenizeNonLazyContinuationStart,\n partial: true\n};\n\n/** @type {Resolver} */\nfunction resolveToHtmlFlow(events) {\n let index = events.length;\n while (index--) {\n if (events[index][0] === 'enter' && events[index][1].type === \"htmlFlow\") {\n break;\n }\n }\n if (index > 1 && events[index - 2][1].type === \"linePrefix\") {\n // Add the prefix start to the HTML token.\n events[index][1].start = events[index - 2][1].start;\n // Add the prefix start to the HTML line token.\n events[index + 1][1].start = events[index - 2][1].start;\n // Remove the line prefix.\n events.splice(index - 2, 2);\n }\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeHtmlFlow(effects, ok, nok) {\n const self = this;\n /** @type {number} */\n let marker;\n /** @type {boolean} */\n let closingTag;\n /** @type {string} */\n let buffer;\n /** @type {number} */\n let index;\n /** @type {Code} */\n let markerB;\n return start;\n\n /**\n * Start of HTML (flow).\n *\n * ```markdown\n * > | <x />\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // To do: parse indent like `markdown-rs`.\n return before(code);\n }\n\n /**\n * At `<`, after optional whitespace.\n *\n * ```markdown\n * > | <x />\n * ^\n * ```\n *\n * @type {State}\n */\n function before(code) {\n effects.enter(\"htmlFlow\");\n effects.enter(\"htmlFlowData\");\n effects.consume(code);\n return open;\n }\n\n /**\n * After `<`, at tag name or other stuff.\n *\n * ```markdown\n * > | <x />\n * ^\n * > | <!doctype>\n * ^\n * > | <!--xxx-->\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (code === 33) {\n effects.consume(code);\n return declarationOpen;\n }\n if (code === 47) {\n effects.consume(code);\n closingTag = true;\n return tagCloseStart;\n }\n if (code === 63) {\n effects.consume(code);\n marker = 3;\n // To do:\n // tokenizer.concrete = true\n // To do: use `markdown-rs` style interrupt.\n // While we’re in an instruction instead of a declaration, we’re on a `?`\n // right now, so we do need to search for `>`, similar to declarations.\n return self.interrupt ? ok : continuationDeclarationInside;\n }\n\n // ASCII alphabetical.\n if (asciiAlpha(code)) {\n effects.consume(code);\n // @ts-expect-error: not null.\n buffer = String.fromCharCode(code);\n return tagName;\n }\n return nok(code);\n }\n\n /**\n * After `<!`, at declaration, comment, or CDATA.\n *\n * ```markdown\n * > | <!doctype>\n * ^\n * > | <!--xxx-->\n * ^\n * > | <![CDATA[>&<]]>\n * ^\n * ```\n *\n * @type {State}\n */\n function declarationOpen(code) {\n if (code === 45) {\n effects.consume(code);\n marker = 2;\n return commentOpenInside;\n }\n if (code === 91) {\n effects.consume(code);\n marker = 5;\n index = 0;\n return cdataOpenInside;\n }\n\n // ASCII alphabetical.\n if (asciiAlpha(code)) {\n effects.consume(code);\n marker = 4;\n // // Do not form containers.\n // tokenizer.concrete = true\n return self.interrupt ? ok : continuationDeclarationInside;\n }\n return nok(code);\n }\n\n /**\n * After `<!-`, inside a comment, at another `-`.\n *\n * ```markdown\n * > | <!--xxx-->\n * ^\n * ```\n *\n * @type {State}\n */\n function commentOpenInside(code) {\n if (code === 45) {\n effects.consume(code);\n // // Do not form containers.\n // tokenizer.concrete = true\n return self.interrupt ? ok : continuationDeclarationInside;\n }\n return nok(code);\n }\n\n /**\n * After `<![`, inside CDATA, expecting `CDATA[`.\n *\n * ```markdown\n * > | <![CDATA[>&<]]>\n * ^^^^^^\n * ```\n *\n * @type {State}\n */\n function cdataOpenInside(code) {\n const value = \"CDATA[\";\n if (code === value.charCodeAt(index++)) {\n effects.consume(code);\n if (index === value.length) {\n // // Do not form containers.\n // tokenizer.concrete = true\n return self.interrupt ? ok : continuation;\n }\n return cdataOpenInside;\n }\n return nok(code);\n }\n\n /**\n * After `</`, in closing tag, at tag name.\n *\n * ```markdown\n * > | </x>\n * ^\n * ```\n *\n * @type {State}\n */\n function tagCloseStart(code) {\n if (asciiAlpha(code)) {\n effects.consume(code);\n // @ts-expect-error: not null.\n buffer = String.fromCharCode(code);\n return tagName;\n }\n return nok(code);\n }\n\n /**\n * In tag name.\n *\n * ```markdown\n * > | <ab>\n * ^^\n * > | </ab>\n * ^^\n * ```\n *\n * @type {State}\n */\n function tagName(code) {\n if (code === null || code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {\n const slash = code === 47;\n const name = buffer.toLowerCase();\n if (!slash && !closingTag && htmlRawNames.includes(name)) {\n marker = 1;\n // // Do not form containers.\n // tokenizer.concrete = true\n return self.interrupt ? ok(code) : continuation(code);\n }\n if (htmlBlockNames.includes(buffer.toLowerCase())) {\n marker = 6;\n if (slash) {\n effects.consume(code);\n return basicSelfClosing;\n }\n\n // // Do not form containers.\n // tokenizer.concrete = true\n return self.interrupt ? ok(code) : continuation(code);\n }\n marker = 7;\n // Do not support complete HTML when interrupting.\n return self.interrupt && !self.parser.lazy[self.now().line] ? nok(code) : closingTag ? completeClosingTagAfter(code) : completeAttributeNameBefore(code);\n }\n\n // ASCII alphanumerical and `-`.\n if (code === 45 || asciiAlphanumeric(code)) {\n effects.consume(code);\n buffer += String.fromCharCode(code);\n return tagName;\n }\n return nok(code);\n }\n\n /**\n * After closing slash of a basic tag name.\n *\n * ```markdown\n * > | <div/>\n * ^\n * ```\n *\n * @type {State}\n */\n function basicSelfClosing(code) {\n if (code === 62) {\n effects.consume(code);\n // // Do not form containers.\n // tokenizer.concrete = true\n return self.interrupt ? ok : continuation;\n }\n return nok(code);\n }\n\n /**\n * After closing slash of a complete tag name.\n *\n * ```markdown\n * > | <x/>\n * ^\n * ```\n *\n * @type {State}\n */\n function completeClosingTagAfter(code) {\n if (markdownSpace(code)) {\n effects.consume(code);\n return completeClosingTagAfter;\n }\n return completeEnd(code);\n }\n\n /**\n * At an attribute name.\n *\n * At first, this state is used after a complete tag name, after whitespace,\n * where it expects optional attributes or the end of the tag.\n * It is also reused after attributes, when expecting more optional\n * attributes.\n *\n * ```markdown\n * > | <a />\n * ^\n * > | <a :b>\n * ^\n * > | <a _b>\n * ^\n * > | <a b>\n * ^\n * > | <a >\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeNameBefore(code) {\n if (code === 47) {\n effects.consume(code);\n return completeEnd;\n }\n\n // ASCII alphanumerical and `:` and `_`.\n if (code === 58 || code === 95 || asciiAlpha(code)) {\n effects.consume(code);\n return completeAttributeName;\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return completeAttributeNameBefore;\n }\n return completeEnd(code);\n }\n\n /**\n * In attribute name.\n *\n * ```markdown\n * > | <a :b>\n * ^\n * > | <a _b>\n * ^\n * > | <a b>\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeName(code) {\n // ASCII alphanumerical and `-`, `.`, `:`, and `_`.\n if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) {\n effects.consume(code);\n return completeAttributeName;\n }\n return completeAttributeNameAfter(code);\n }\n\n /**\n * After attribute name, at an optional initializer, the end of the tag, or\n * whitespace.\n *\n * ```markdown\n * > | <a b>\n * ^\n * > | <a b=c>\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeNameAfter(code) {\n if (code === 61) {\n effects.consume(code);\n return completeAttributeValueBefore;\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return completeAttributeNameAfter;\n }\n return completeAttributeNameBefore(code);\n }\n\n /**\n * Before unquoted, double quoted, or single quoted attribute value, allowing\n * whitespace.\n *\n * ```markdown\n * > | <a b=c>\n * ^\n * > | <a b=\"c\">\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeValueBefore(code) {\n if (code === null || code === 60 || code === 61 || code === 62 || code === 96) {\n return nok(code);\n }\n if (code === 34 || code === 39) {\n effects.consume(code);\n markerB = code;\n return completeAttributeValueQuoted;\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return completeAttributeValueBefore;\n }\n return completeAttributeValueUnquoted(code);\n }\n\n /**\n * In double or single quoted attribute value.\n *\n * ```markdown\n * > | <a b=\"c\">\n * ^\n * > | <a b='c'>\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeValueQuoted(code) {\n if (code === markerB) {\n effects.consume(code);\n markerB = null;\n return completeAttributeValueQuotedAfter;\n }\n if (code === null || markdownLineEnding(code)) {\n return nok(code);\n }\n effects.consume(code);\n return completeAttributeValueQuoted;\n }\n\n /**\n * In unquoted attribute value.\n *\n * ```markdown\n * > | <a b=c>\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeValueUnquoted(code) {\n if (code === null || code === 34 || code === 39 || code === 47 || code === 60 || code === 61 || code === 62 || code === 96 || markdownLineEndingOrSpace(code)) {\n return completeAttributeNameAfter(code);\n }\n effects.consume(code);\n return completeAttributeValueUnquoted;\n }\n\n /**\n * After double or single quoted attribute value, before whitespace or the\n * end of the tag.\n *\n * ```markdown\n * > | <a b=\"c\">\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAttributeValueQuotedAfter(code) {\n if (code === 47 || code === 62 || markdownSpace(code)) {\n return completeAttributeNameBefore(code);\n }\n return nok(code);\n }\n\n /**\n * In certain circumstances of a complete tag where only an `>` is allowed.\n *\n * ```markdown\n * > | <a b=\"c\">\n * ^\n * ```\n *\n * @type {State}\n */\n function completeEnd(code) {\n if (code === 62) {\n effects.consume(code);\n return completeAfter;\n }\n return nok(code);\n }\n\n /**\n * After `>` in a complete tag.\n *\n * ```markdown\n * > | <x>\n * ^\n * ```\n *\n * @type {State}\n */\n function completeAfter(code) {\n if (code === null || markdownLineEnding(code)) {\n // // Do not form containers.\n // tokenizer.concrete = true\n return continuation(code);\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return completeAfter;\n }\n return nok(code);\n }\n\n /**\n * In continuation of any HTML kind.\n *\n * ```markdown\n * > | <!--xxx-->\n * ^\n * ```\n *\n * @type {State}\n */\n function continuation(code) {\n if (code === 45 && marker === 2) {\n effects.consume(code);\n return continuationCommentInside;\n }\n if (code === 60 && marker === 1) {\n effects.consume(code);\n return continuationRawTagOpen;\n }\n if (code === 62 && marker === 4) {\n effects.consume(code);\n return continuationClose;\n }\n if (code === 63 && marker === 3) {\n effects.consume(code);\n return continuationDeclarationInside;\n }\n if (code === 93 && marker === 5) {\n effects.consume(code);\n return continuationCdataInside;\n }\n if (markdownLineEnding(code) && (marker === 6 || marker === 7)) {\n effects.exit(\"htmlFlowData\");\n return effects.check(blankLineBefore, continuationAfter, continuationStart)(code);\n }\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"htmlFlowData\");\n return continuationStart(code);\n }\n effects.consume(code);\n return continuation;\n }\n\n /**\n * In continuation, at eol.\n *\n * ```markdown\n * > | <x>\n * ^\n * | asd\n * ```\n *\n * @type {State}\n */\n function continuationStart(code) {\n return effects.check(nonLazyContinuationStart, continuationStartNonLazy, continuationAfter)(code);\n }\n\n /**\n * In continuation, at eol, before non-lazy content.\n *\n * ```markdown\n * > | <x>\n * ^\n * | asd\n * ```\n *\n * @type {State}\n */\n function continuationStartNonLazy(code) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return continuationBefore;\n }\n\n /**\n * In continuation, before non-lazy content.\n *\n * ```markdown\n * | <x>\n * > | asd\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationBefore(code) {\n if (code === null || markdownLineEnding(code)) {\n return continuationStart(code);\n }\n effects.enter(\"htmlFlowData\");\n return continuation(code);\n }\n\n /**\n * In comment continuation, after one `-`, expecting another.\n *\n * ```markdown\n * > | <!--xxx-->\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationCommentInside(code) {\n if (code === 45) {\n effects.consume(code);\n return continuationDeclarationInside;\n }\n return continuation(code);\n }\n\n /**\n * In raw continuation, after `<`, at `/`.\n *\n * ```markdown\n * > | <script>console.log(1)</script>\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationRawTagOpen(code) {\n if (code === 47) {\n effects.consume(code);\n buffer = '';\n return continuationRawEndTag;\n }\n return continuation(code);\n }\n\n /**\n * In raw continuation, after `</`, in a raw tag name.\n *\n * ```markdown\n * > | <script>console.log(1)</script>\n * ^^^^^^\n * ```\n *\n * @type {State}\n */\n function continuationRawEndTag(code) {\n if (code === 62) {\n const name = buffer.toLowerCase();\n if (htmlRawNames.includes(name)) {\n effects.consume(code);\n return continuationClose;\n }\n return continuation(code);\n }\n if (asciiAlpha(code) && buffer.length < 8) {\n effects.consume(code);\n // @ts-expect-error: not null.\n buffer += String.fromCharCode(code);\n return continuationRawEndTag;\n }\n return continuation(code);\n }\n\n /**\n * In cdata continuation, after `]`, expecting `]>`.\n *\n * ```markdown\n * > | <![CDATA[>&<]]>\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationCdataInside(code) {\n if (code === 93) {\n effects.consume(code);\n return continuationDeclarationInside;\n }\n return continuation(code);\n }\n\n /**\n * In declaration or instruction continuation, at `>`.\n *\n * ```markdown\n * > | <!-->\n * ^\n * > | <?>\n * ^\n * > | <!q>\n * ^\n * > | <!--ab-->\n * ^\n * > | <![CDATA[>&<]]>\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationDeclarationInside(code) {\n if (code === 62) {\n effects.consume(code);\n return continuationClose;\n }\n\n // More dashes.\n if (code === 45 && marker === 2) {\n effects.consume(code);\n return continuationDeclarationInside;\n }\n return continuation(code);\n }\n\n /**\n * In closed continuation: everything we get until the eol/eof is part of it.\n *\n * ```markdown\n * > | <!doctype>\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationClose(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"htmlFlowData\");\n return continuationAfter(code);\n }\n effects.consume(code);\n return continuationClose;\n }\n\n /**\n * Done.\n *\n * ```markdown\n * > | <!doctype>\n * ^\n * ```\n *\n * @type {State}\n */\n function continuationAfter(code) {\n effects.exit(\"htmlFlow\");\n // // Feel free to interrupt.\n // tokenizer.interrupt = false\n // // No longer concrete.\n // tokenizer.concrete = false\n return ok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeNonLazyContinuationStart(effects, ok, nok) {\n const self = this;\n return start;\n\n /**\n * At eol, before continuation.\n *\n * ```markdown\n * > | * ```js\n * ^\n * | b\n * ```\n *\n * @type {State}\n */\n function start(code) {\n if (markdownLineEnding(code)) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return after;\n }\n return nok(code);\n }\n\n /**\n * A continuation.\n *\n * ```markdown\n * | * ```js\n * > | b\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n return self.parser.lazy[self.now().line] ? nok(code) : ok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLineBefore(effects, ok, nok) {\n return start;\n\n /**\n * Before eol, expecting blank line.\n *\n * ```markdown\n * > | <div>\n * ^\n * |\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return effects.attempt(blankLine, ok, nok);\n }\n}","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { asciiAlpha, asciiAlphanumeric, markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const htmlText = {\n name: 'htmlText',\n tokenize: tokenizeHtmlText\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeHtmlText(effects, ok, nok) {\n const self = this;\n /** @type {NonNullable<Code> | undefined} */\n let marker;\n /** @type {number} */\n let index;\n /** @type {State} */\n let returnState;\n return start;\n\n /**\n * Start of HTML (text).\n *\n * ```markdown\n * > | a <b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"htmlText\");\n effects.enter(\"htmlTextData\");\n effects.consume(code);\n return open;\n }\n\n /**\n * After `<`, at tag name or other stuff.\n *\n * ```markdown\n * > | a <b> c\n * ^\n * > | a <!doctype> c\n * ^\n * > | a <!--b--> c\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (code === 33) {\n effects.consume(code);\n return declarationOpen;\n }\n if (code === 47) {\n effects.consume(code);\n return tagCloseStart;\n }\n if (code === 63) {\n effects.consume(code);\n return instruction;\n }\n\n // ASCII alphabetical.\n if (asciiAlpha(code)) {\n effects.consume(code);\n return tagOpen;\n }\n return nok(code);\n }\n\n /**\n * After `<!`, at declaration, comment, or CDATA.\n *\n * ```markdown\n * > | a <!doctype> c\n * ^\n * > | a <!--b--> c\n * ^\n * > | a <![CDATA[>&<]]> c\n * ^\n * ```\n *\n * @type {State}\n */\n function declarationOpen(code) {\n if (code === 45) {\n effects.consume(code);\n return commentOpenInside;\n }\n if (code === 91) {\n effects.consume(code);\n index = 0;\n return cdataOpenInside;\n }\n if (asciiAlpha(code)) {\n effects.consume(code);\n return declaration;\n }\n return nok(code);\n }\n\n /**\n * In a comment, after `<!-`, at another `-`.\n *\n * ```markdown\n * > | a <!--b--> c\n * ^\n * ```\n *\n * @type {State}\n */\n function commentOpenInside(code) {\n if (code === 45) {\n effects.consume(code);\n return commentEnd;\n }\n return nok(code);\n }\n\n /**\n * In comment.\n *\n * ```markdown\n * > | a <!--b--> c\n * ^\n * ```\n *\n * @type {State}\n */\n function comment(code) {\n if (code === null) {\n return nok(code);\n }\n if (code === 45) {\n effects.consume(code);\n return commentClose;\n }\n if (markdownLineEnding(code)) {\n returnState = comment;\n return lineEndingBefore(code);\n }\n effects.consume(code);\n return comment;\n }\n\n /**\n * In comment, after `-`.\n *\n * ```markdown\n * > | a <!--b--> c\n * ^\n * ```\n *\n * @type {State}\n */\n function commentClose(code) {\n if (code === 45) {\n effects.consume(code);\n return commentEnd;\n }\n return comment(code);\n }\n\n /**\n * In comment, after `--`.\n *\n * ```markdown\n * > | a <!--b--> c\n * ^\n * ```\n *\n * @type {State}\n */\n function commentEnd(code) {\n return code === 62 ? end(code) : code === 45 ? commentClose(code) : comment(code);\n }\n\n /**\n * After `<![`, in CDATA, expecting `CDATA[`.\n *\n * ```markdown\n * > | a <![CDATA[>&<]]> b\n * ^^^^^^\n * ```\n *\n * @type {State}\n */\n function cdataOpenInside(code) {\n const value = \"CDATA[\";\n if (code === value.charCodeAt(index++)) {\n effects.consume(code);\n return index === value.length ? cdata : cdataOpenInside;\n }\n return nok(code);\n }\n\n /**\n * In CDATA.\n *\n * ```markdown\n * > | a <![CDATA[>&<]]> b\n * ^^^\n * ```\n *\n * @type {State}\n */\n function cdata(code) {\n if (code === null) {\n return nok(code);\n }\n if (code === 93) {\n effects.consume(code);\n return cdataClose;\n }\n if (markdownLineEnding(code)) {\n returnState = cdata;\n return lineEndingBefore(code);\n }\n effects.consume(code);\n return cdata;\n }\n\n /**\n * In CDATA, after `]`, at another `]`.\n *\n * ```markdown\n * > | a <![CDATA[>&<]]> b\n * ^\n * ```\n *\n * @type {State}\n */\n function cdataClose(code) {\n if (code === 93) {\n effects.consume(code);\n return cdataEnd;\n }\n return cdata(code);\n }\n\n /**\n * In CDATA, after `]]`, at `>`.\n *\n * ```markdown\n * > | a <![CDATA[>&<]]> b\n * ^\n * ```\n *\n * @type {State}\n */\n function cdataEnd(code) {\n if (code === 62) {\n return end(code);\n }\n if (code === 93) {\n effects.consume(code);\n return cdataEnd;\n }\n return cdata(code);\n }\n\n /**\n * In declaration.\n *\n * ```markdown\n * > | a <!b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function declaration(code) {\n if (code === null || code === 62) {\n return end(code);\n }\n if (markdownLineEnding(code)) {\n returnState = declaration;\n return lineEndingBefore(code);\n }\n effects.consume(code);\n return declaration;\n }\n\n /**\n * In instruction.\n *\n * ```markdown\n * > | a <?b?> c\n * ^\n * ```\n *\n * @type {State}\n */\n function instruction(code) {\n if (code === null) {\n return nok(code);\n }\n if (code === 63) {\n effects.consume(code);\n return instructionClose;\n }\n if (markdownLineEnding(code)) {\n returnState = instruction;\n return lineEndingBefore(code);\n }\n effects.consume(code);\n return instruction;\n }\n\n /**\n * In instruction, after `?`, at `>`.\n *\n * ```markdown\n * > | a <?b?> c\n * ^\n * ```\n *\n * @type {State}\n */\n function instructionClose(code) {\n return code === 62 ? end(code) : instruction(code);\n }\n\n /**\n * After `</`, in closing tag, at tag name.\n *\n * ```markdown\n * > | a </b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function tagCloseStart(code) {\n // ASCII alphabetical.\n if (asciiAlpha(code)) {\n effects.consume(code);\n return tagClose;\n }\n return nok(code);\n }\n\n /**\n * After `</x`, in a tag name.\n *\n * ```markdown\n * > | a </b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function tagClose(code) {\n // ASCII alphanumerical and `-`.\n if (code === 45 || asciiAlphanumeric(code)) {\n effects.consume(code);\n return tagClose;\n }\n return tagCloseBetween(code);\n }\n\n /**\n * In closing tag, after tag name.\n *\n * ```markdown\n * > | a </b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function tagCloseBetween(code) {\n if (markdownLineEnding(code)) {\n returnState = tagCloseBetween;\n return lineEndingBefore(code);\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return tagCloseBetween;\n }\n return end(code);\n }\n\n /**\n * After `<x`, in opening tag name.\n *\n * ```markdown\n * > | a <b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpen(code) {\n // ASCII alphanumerical and `-`.\n if (code === 45 || asciiAlphanumeric(code)) {\n effects.consume(code);\n return tagOpen;\n }\n if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {\n return tagOpenBetween(code);\n }\n return nok(code);\n }\n\n /**\n * In opening tag, after tag name.\n *\n * ```markdown\n * > | a <b> c\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenBetween(code) {\n if (code === 47) {\n effects.consume(code);\n return end;\n }\n\n // ASCII alphabetical and `:` and `_`.\n if (code === 58 || code === 95 || asciiAlpha(code)) {\n effects.consume(code);\n return tagOpenAttributeName;\n }\n if (markdownLineEnding(code)) {\n returnState = tagOpenBetween;\n return lineEndingBefore(code);\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return tagOpenBetween;\n }\n return end(code);\n }\n\n /**\n * In attribute name.\n *\n * ```markdown\n * > | a <b c> d\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenAttributeName(code) {\n // ASCII alphabetical and `-`, `.`, `:`, and `_`.\n if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) {\n effects.consume(code);\n return tagOpenAttributeName;\n }\n return tagOpenAttributeNameAfter(code);\n }\n\n /**\n * After attribute name, before initializer, the end of the tag, or\n * whitespace.\n *\n * ```markdown\n * > | a <b c> d\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenAttributeNameAfter(code) {\n if (code === 61) {\n effects.consume(code);\n return tagOpenAttributeValueBefore;\n }\n if (markdownLineEnding(code)) {\n returnState = tagOpenAttributeNameAfter;\n return lineEndingBefore(code);\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return tagOpenAttributeNameAfter;\n }\n return tagOpenBetween(code);\n }\n\n /**\n * Before unquoted, double quoted, or single quoted attribute value, allowing\n * whitespace.\n *\n * ```markdown\n * > | a <b c=d> e\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenAttributeValueBefore(code) {\n if (code === null || code === 60 || code === 61 || code === 62 || code === 96) {\n return nok(code);\n }\n if (code === 34 || code === 39) {\n effects.consume(code);\n marker = code;\n return tagOpenAttributeValueQuoted;\n }\n if (markdownLineEnding(code)) {\n returnState = tagOpenAttributeValueBefore;\n return lineEndingBefore(code);\n }\n if (markdownSpace(code)) {\n effects.consume(code);\n return tagOpenAttributeValueBefore;\n }\n effects.consume(code);\n return tagOpenAttributeValueUnquoted;\n }\n\n /**\n * In double or single quoted attribute value.\n *\n * ```markdown\n * > | a <b c=\"d\"> e\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenAttributeValueQuoted(code) {\n if (code === marker) {\n effects.consume(code);\n marker = undefined;\n return tagOpenAttributeValueQuotedAfter;\n }\n if (code === null) {\n return nok(code);\n }\n if (markdownLineEnding(code)) {\n returnState = tagOpenAttributeValueQuoted;\n return lineEndingBefore(code);\n }\n effects.consume(code);\n return tagOpenAttributeValueQuoted;\n }\n\n /**\n * In unquoted attribute value.\n *\n * ```markdown\n * > | a <b c=d> e\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenAttributeValueUnquoted(code) {\n if (code === null || code === 34 || code === 39 || code === 60 || code === 61 || code === 96) {\n return nok(code);\n }\n if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {\n return tagOpenBetween(code);\n }\n effects.consume(code);\n return tagOpenAttributeValueUnquoted;\n }\n\n /**\n * After double or single quoted attribute value, before whitespace or the end\n * of the tag.\n *\n * ```markdown\n * > | a <b c=\"d\"> e\n * ^\n * ```\n *\n * @type {State}\n */\n function tagOpenAttributeValueQuotedAfter(code) {\n if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {\n return tagOpenBetween(code);\n }\n return nok(code);\n }\n\n /**\n * In certain circumstances of a tag where only an `>` is allowed.\n *\n * ```markdown\n * > | a <b c=\"d\"> e\n * ^\n * ```\n *\n * @type {State}\n */\n function end(code) {\n if (code === 62) {\n effects.consume(code);\n effects.exit(\"htmlTextData\");\n effects.exit(\"htmlText\");\n return ok;\n }\n return nok(code);\n }\n\n /**\n * At eol.\n *\n * > 👉 **Note**: we can’t have blank lines in text, so no need to worry about\n * > empty tokens.\n *\n * ```markdown\n * > | a <!--a\n * ^\n * | b-->\n * ```\n *\n * @type {State}\n */\n function lineEndingBefore(code) {\n effects.exit(\"htmlTextData\");\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return lineEndingAfter;\n }\n\n /**\n * After eol, at optional whitespace.\n *\n * > 👉 **Note**: we can’t have blank lines in text, so no need to worry about\n * > empty tokens.\n *\n * ```markdown\n * | a <!--a\n * > | b-->\n * ^\n * ```\n *\n * @type {State}\n */\n function lineEndingAfter(code) {\n // Always populated by defaults.\n\n return markdownSpace(code) ? factorySpace(effects, lineEndingAfterPrefix, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code) : lineEndingAfterPrefix(code);\n }\n\n /**\n * After eol, after optional whitespace.\n *\n * > 👉 **Note**: we can’t have blank lines in text, so no need to worry about\n * > empty tokens.\n *\n * ```markdown\n * | a <!--a\n * > | b-->\n * ^\n * ```\n *\n * @type {State}\n */\n function lineEndingAfterPrefix(code) {\n effects.enter(\"htmlTextData\");\n return returnState(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Event} Event\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factoryDestination } from 'micromark-factory-destination';\nimport { factoryLabel } from 'micromark-factory-label';\nimport { factoryTitle } from 'micromark-factory-title';\nimport { factoryWhitespace } from 'micromark-factory-whitespace';\nimport { markdownLineEndingOrSpace } from 'micromark-util-character';\nimport { push, splice } from 'micromark-util-chunked';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/** @type {Construct} */\nexport const labelEnd = {\n name: 'labelEnd',\n tokenize: tokenizeLabelEnd,\n resolveTo: resolveToLabelEnd,\n resolveAll: resolveAllLabelEnd\n};\n\n/** @type {Construct} */\nconst resourceConstruct = {\n tokenize: tokenizeResource\n};\n/** @type {Construct} */\nconst referenceFullConstruct = {\n tokenize: tokenizeReferenceFull\n};\n/** @type {Construct} */\nconst referenceCollapsedConstruct = {\n tokenize: tokenizeReferenceCollapsed\n};\n\n/** @type {Resolver} */\nfunction resolveAllLabelEnd(events) {\n let index = -1;\n while (++index < events.length) {\n const token = events[index][1];\n if (token.type === \"labelImage\" || token.type === \"labelLink\" || token.type === \"labelEnd\") {\n // Remove the marker.\n events.splice(index + 1, token.type === \"labelImage\" ? 4 : 2);\n token.type = \"data\";\n index++;\n }\n }\n return events;\n}\n\n/** @type {Resolver} */\nfunction resolveToLabelEnd(events, context) {\n let index = events.length;\n let offset = 0;\n /** @type {Token} */\n let token;\n /** @type {number | undefined} */\n let open;\n /** @type {number | undefined} */\n let close;\n /** @type {Array<Event>} */\n let media;\n\n // Find an opening.\n while (index--) {\n token = events[index][1];\n if (open) {\n // If we see another link, or inactive link label, we’ve been here before.\n if (token.type === \"link\" || token.type === \"labelLink\" && token._inactive) {\n break;\n }\n\n // Mark other link openings as inactive, as we can’t have links in\n // links.\n if (events[index][0] === 'enter' && token.type === \"labelLink\") {\n token._inactive = true;\n }\n } else if (close) {\n if (events[index][0] === 'enter' && (token.type === \"labelImage\" || token.type === \"labelLink\") && !token._balanced) {\n open = index;\n if (token.type !== \"labelLink\") {\n offset = 2;\n break;\n }\n }\n } else if (token.type === \"labelEnd\") {\n close = index;\n }\n }\n const group = {\n type: events[open][1].type === \"labelLink\" ? \"link\" : \"image\",\n start: Object.assign({}, events[open][1].start),\n end: Object.assign({}, events[events.length - 1][1].end)\n };\n const label = {\n type: \"label\",\n start: Object.assign({}, events[open][1].start),\n end: Object.assign({}, events[close][1].end)\n };\n const text = {\n type: \"labelText\",\n start: Object.assign({}, events[open + offset + 2][1].end),\n end: Object.assign({}, events[close - 2][1].start)\n };\n media = [['enter', group, context], ['enter', label, context]];\n\n // Opening marker.\n media = push(media, events.slice(open + 1, open + offset + 3));\n\n // Text open.\n media = push(media, [['enter', text, context]]);\n\n // Always populated by defaults.\n\n // Between.\n media = push(media, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + offset + 4, close - 3), context));\n\n // Text close, marker close, label close.\n media = push(media, [['exit', text, context], events[close - 2], events[close - 1], ['exit', label, context]]);\n\n // Reference, resource, or so.\n media = push(media, events.slice(close + 1));\n\n // Media close.\n media = push(media, [['exit', group, context]]);\n splice(events, open, events.length, media);\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeLabelEnd(effects, ok, nok) {\n const self = this;\n let index = self.events.length;\n /** @type {Token} */\n let labelStart;\n /** @type {boolean} */\n let defined;\n\n // Find an opening.\n while (index--) {\n if ((self.events[index][1].type === \"labelImage\" || self.events[index][1].type === \"labelLink\") && !self.events[index][1]._balanced) {\n labelStart = self.events[index][1];\n break;\n }\n }\n return start;\n\n /**\n * Start of label end.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * > | [a][b] c\n * ^\n * > | [a][] b\n * ^\n * > | [a] b\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // If there is not an okay opening.\n if (!labelStart) {\n return nok(code);\n }\n\n // If the corresponding label (link) start is marked as inactive,\n // it means we’d be wrapping a link, like this:\n //\n // ```markdown\n // > | a [b [c](d) e](f) g.\n // ^\n // ```\n //\n // We can’t have that, so it’s just balanced brackets.\n if (labelStart._inactive) {\n return labelEndNok(code);\n }\n defined = self.parser.defined.includes(normalizeIdentifier(self.sliceSerialize({\n start: labelStart.end,\n end: self.now()\n })));\n effects.enter(\"labelEnd\");\n effects.enter(\"labelMarker\");\n effects.consume(code);\n effects.exit(\"labelMarker\");\n effects.exit(\"labelEnd\");\n return after;\n }\n\n /**\n * After `]`.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * > | [a][b] c\n * ^\n * > | [a][] b\n * ^\n * > | [a] b\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n // Note: `markdown-rs` also parses GFM footnotes here, which for us is in\n // an extension.\n\n // Resource (`[asd](fgh)`)?\n if (code === 40) {\n return effects.attempt(resourceConstruct, labelEndOk, defined ? labelEndOk : labelEndNok)(code);\n }\n\n // Full (`[asd][fgh]`) or collapsed (`[asd][]`) reference?\n if (code === 91) {\n return effects.attempt(referenceFullConstruct, labelEndOk, defined ? referenceNotFull : labelEndNok)(code);\n }\n\n // Shortcut (`[asd]`) reference?\n return defined ? labelEndOk(code) : labelEndNok(code);\n }\n\n /**\n * After `]`, at `[`, but not at a full reference.\n *\n * > 👉 **Note**: we only get here if the label is defined.\n *\n * ```markdown\n * > | [a][] b\n * ^\n * > | [a] b\n * ^\n * ```\n *\n * @type {State}\n */\n function referenceNotFull(code) {\n return effects.attempt(referenceCollapsedConstruct, labelEndOk, labelEndNok)(code);\n }\n\n /**\n * Done, we found something.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * > | [a][b] c\n * ^\n * > | [a][] b\n * ^\n * > | [a] b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelEndOk(code) {\n // Note: `markdown-rs` does a bunch of stuff here.\n return ok(code);\n }\n\n /**\n * Done, it’s nothing.\n *\n * There was an okay opening, but we didn’t match anything.\n *\n * ```markdown\n * > | [a](b c\n * ^\n * > | [a][b c\n * ^\n * > | [a] b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelEndNok(code) {\n labelStart._balanced = true;\n return nok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeResource(effects, ok, nok) {\n return resourceStart;\n\n /**\n * At a resource.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceStart(code) {\n effects.enter(\"resource\");\n effects.enter(\"resourceMarker\");\n effects.consume(code);\n effects.exit(\"resourceMarker\");\n return resourceBefore;\n }\n\n /**\n * In resource, after `(`, at optional whitespace.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceBefore(code) {\n return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, resourceOpen)(code) : resourceOpen(code);\n }\n\n /**\n * In resource, after optional whitespace, at `)` or a destination.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceOpen(code) {\n if (code === 41) {\n return resourceEnd(code);\n }\n return factoryDestination(effects, resourceDestinationAfter, resourceDestinationMissing, \"resourceDestination\", \"resourceDestinationLiteral\", \"resourceDestinationLiteralMarker\", \"resourceDestinationRaw\", \"resourceDestinationString\", 32)(code);\n }\n\n /**\n * In resource, after destination, at optional whitespace.\n *\n * ```markdown\n * > | [a](b) c\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceDestinationAfter(code) {\n return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, resourceBetween)(code) : resourceEnd(code);\n }\n\n /**\n * At invalid destination.\n *\n * ```markdown\n * > | [a](<<) b\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceDestinationMissing(code) {\n return nok(code);\n }\n\n /**\n * In resource, after destination and whitespace, at `(` or title.\n *\n * ```markdown\n * > | [a](b ) c\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceBetween(code) {\n if (code === 34 || code === 39 || code === 40) {\n return factoryTitle(effects, resourceTitleAfter, nok, \"resourceTitle\", \"resourceTitleMarker\", \"resourceTitleString\")(code);\n }\n return resourceEnd(code);\n }\n\n /**\n * In resource, after title, at optional whitespace.\n *\n * ```markdown\n * > | [a](b \"c\") d\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceTitleAfter(code) {\n return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, resourceEnd)(code) : resourceEnd(code);\n }\n\n /**\n * In resource, at `)`.\n *\n * ```markdown\n * > | [a](b) d\n * ^\n * ```\n *\n * @type {State}\n */\n function resourceEnd(code) {\n if (code === 41) {\n effects.enter(\"resourceMarker\");\n effects.consume(code);\n effects.exit(\"resourceMarker\");\n effects.exit(\"resource\");\n return ok;\n }\n return nok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeReferenceFull(effects, ok, nok) {\n const self = this;\n return referenceFull;\n\n /**\n * In a reference (full), at the `[`.\n *\n * ```markdown\n * > | [a][b] d\n * ^\n * ```\n *\n * @type {State}\n */\n function referenceFull(code) {\n return factoryLabel.call(self, effects, referenceFullAfter, referenceFullMissing, \"reference\", \"referenceMarker\", \"referenceString\")(code);\n }\n\n /**\n * In a reference (full), after `]`.\n *\n * ```markdown\n * > | [a][b] d\n * ^\n * ```\n *\n * @type {State}\n */\n function referenceFullAfter(code) {\n return self.parser.defined.includes(normalizeIdentifier(self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1))) ? ok(code) : nok(code);\n }\n\n /**\n * In reference (full) that was missing.\n *\n * ```markdown\n * > | [a][b d\n * ^\n * ```\n *\n * @type {State}\n */\n function referenceFullMissing(code) {\n return nok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeReferenceCollapsed(effects, ok, nok) {\n return referenceCollapsedStart;\n\n /**\n * In reference (collapsed), at `[`.\n *\n * > 👉 **Note**: we only get here if the label is defined.\n *\n * ```markdown\n * > | [a][] d\n * ^\n * ```\n *\n * @type {State}\n */\n function referenceCollapsedStart(code) {\n // We only attempt a collapsed label if there’s a `[`.\n\n effects.enter(\"reference\");\n effects.enter(\"referenceMarker\");\n effects.consume(code);\n effects.exit(\"referenceMarker\");\n return referenceCollapsedOpen;\n }\n\n /**\n * In reference (collapsed), at `]`.\n *\n * > 👉 **Note**: we only get here if the label is defined.\n *\n * ```markdown\n * > | [a][] d\n * ^\n * ```\n *\n * @type {State}\n */\n function referenceCollapsedOpen(code) {\n if (code === 93) {\n effects.enter(\"referenceMarker\");\n effects.consume(code);\n effects.exit(\"referenceMarker\");\n effects.exit(\"reference\");\n return ok;\n }\n return nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { labelEnd } from './label-end.js';\n\n/** @type {Construct} */\nexport const labelStartImage = {\n name: 'labelStartImage',\n tokenize: tokenizeLabelStartImage,\n resolveAll: labelEnd.resolveAll\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeLabelStartImage(effects, ok, nok) {\n const self = this;\n return start;\n\n /**\n * Start of label (image) start.\n *\n * ```markdown\n * > | a ![b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"labelImage\");\n effects.enter(\"labelImageMarker\");\n effects.consume(code);\n effects.exit(\"labelImageMarker\");\n return open;\n }\n\n /**\n * After `!`, at `[`.\n *\n * ```markdown\n * > | a ![b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (code === 91) {\n effects.enter(\"labelMarker\");\n effects.consume(code);\n effects.exit(\"labelMarker\");\n effects.exit(\"labelImage\");\n return after;\n }\n return nok(code);\n }\n\n /**\n * After `![`.\n *\n * ```markdown\n * > | a ![b] c\n * ^\n * ```\n *\n * This is needed in because, when GFM footnotes are enabled, images never\n * form when started with a `^`.\n * Instead, links form:\n *\n * ```markdown\n * \n *\n * ![^a][b]\n *\n * [b]: c\n * ```\n *\n * ```html\n * <p>!<a href=\\\"b\\\">^a</a></p>\n * <p>!<a href=\\\"c\\\">^a</a></p>\n * ```\n *\n * @type {State}\n */\n function after(code) {\n // To do: use a new field to do this, this is still needed for\n // `micromark-extension-gfm-footnote`, but the `label-start-link`\n // behavior isn’t.\n // Hidden footnotes hook.\n /* c8 ignore next 3 */\n return code === 94 && '_hiddenFootnoteSupport' in self.parser.constructs ? nok(code) : ok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { labelEnd } from './label-end.js';\n\n/** @type {Construct} */\nexport const labelStartLink = {\n name: 'labelStartLink',\n tokenize: tokenizeLabelStartLink,\n resolveAll: labelEnd.resolveAll\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeLabelStartLink(effects, ok, nok) {\n const self = this;\n return start;\n\n /**\n * Start of label (link) start.\n *\n * ```markdown\n * > | a [b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"labelLink\");\n effects.enter(\"labelMarker\");\n effects.consume(code);\n effects.exit(\"labelMarker\");\n effects.exit(\"labelLink\");\n return after;\n }\n\n /** @type {State} */\n function after(code) {\n // To do: this isn’t needed in `micromark-extension-gfm-footnote`,\n // remove.\n // Hidden footnotes hook.\n /* c8 ignore next 3 */\n return code === 94 && '_hiddenFootnoteSupport' in self.parser.constructs ? nok(code) : ok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding } from 'micromark-util-character';\n/** @type {Construct} */\nexport const lineEnding = {\n name: 'lineEnding',\n tokenize: tokenizeLineEnding\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeLineEnding(effects, ok) {\n return start;\n\n /** @type {State} */\n function start(code) {\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return factorySpace(effects, ok, \"linePrefix\");\n }\n}","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const thematicBreak = {\n name: 'thematicBreak',\n tokenize: tokenizeThematicBreak\n};\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeThematicBreak(effects, ok, nok) {\n let size = 0;\n /** @type {NonNullable<Code>} */\n let marker;\n return start;\n\n /**\n * Start of thematic break.\n *\n * ```markdown\n * > | ***\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter(\"thematicBreak\");\n // To do: parse indent like `markdown-rs`.\n return before(code);\n }\n\n /**\n * After optional whitespace, at marker.\n *\n * ```markdown\n * > | ***\n * ^\n * ```\n *\n * @type {State}\n */\n function before(code) {\n marker = code;\n return atBreak(code);\n }\n\n /**\n * After something, before something else.\n *\n * ```markdown\n * > | ***\n * ^\n * ```\n *\n * @type {State}\n */\n function atBreak(code) {\n if (code === marker) {\n effects.enter(\"thematicBreakSequence\");\n return sequence(code);\n }\n if (size >= 3 && (code === null || markdownLineEnding(code))) {\n effects.exit(\"thematicBreak\");\n return ok(code);\n }\n return nok(code);\n }\n\n /**\n * In sequence.\n *\n * ```markdown\n * > | ***\n * ^\n * ```\n *\n * @type {State}\n */\n function sequence(code) {\n if (code === marker) {\n effects.consume(code);\n size++;\n return sequence;\n }\n effects.exit(\"thematicBreakSequence\");\n return markdownSpace(code) ? factorySpace(effects, atBreak, \"whitespace\")(code) : atBreak(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').ContainerState} ContainerState\n * @typedef {import('micromark-util-types').Exiter} Exiter\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { asciiDigit, markdownSpace } from 'micromark-util-character';\nimport { blankLine } from './blank-line.js';\nimport { thematicBreak } from './thematic-break.js';\n\n/** @type {Construct} */\nexport const list = {\n name: 'list',\n tokenize: tokenizeListStart,\n continuation: {\n tokenize: tokenizeListContinuation\n },\n exit: tokenizeListEnd\n};\n\n/** @type {Construct} */\nconst listItemPrefixWhitespaceConstruct = {\n tokenize: tokenizeListItemPrefixWhitespace,\n partial: true\n};\n\n/** @type {Construct} */\nconst indentConstruct = {\n tokenize: tokenizeIndent,\n partial: true\n};\n\n// To do: `markdown-rs` parses list items on their own and later stitches them\n// together.\n\n/**\n * @type {Tokenizer}\n * @this {TokenizeContext}\n */\nfunction tokenizeListStart(effects, ok, nok) {\n const self = this;\n const tail = self.events[self.events.length - 1];\n let initialSize = tail && tail[1].type === \"linePrefix\" ? tail[2].sliceSerialize(tail[1], true).length : 0;\n let size = 0;\n return start;\n\n /** @type {State} */\n function start(code) {\n const kind = self.containerState.type || (code === 42 || code === 43 || code === 45 ? \"listUnordered\" : \"listOrdered\");\n if (kind === \"listUnordered\" ? !self.containerState.marker || code === self.containerState.marker : asciiDigit(code)) {\n if (!self.containerState.type) {\n self.containerState.type = kind;\n effects.enter(kind, {\n _container: true\n });\n }\n if (kind === \"listUnordered\") {\n effects.enter(\"listItemPrefix\");\n return code === 42 || code === 45 ? effects.check(thematicBreak, nok, atMarker)(code) : atMarker(code);\n }\n if (!self.interrupt || code === 49) {\n effects.enter(\"listItemPrefix\");\n effects.enter(\"listItemValue\");\n return inside(code);\n }\n }\n return nok(code);\n }\n\n /** @type {State} */\n function inside(code) {\n if (asciiDigit(code) && ++size < 10) {\n effects.consume(code);\n return inside;\n }\n if ((!self.interrupt || size < 2) && (self.containerState.marker ? code === self.containerState.marker : code === 41 || code === 46)) {\n effects.exit(\"listItemValue\");\n return atMarker(code);\n }\n return nok(code);\n }\n\n /**\n * @type {State}\n **/\n function atMarker(code) {\n effects.enter(\"listItemMarker\");\n effects.consume(code);\n effects.exit(\"listItemMarker\");\n self.containerState.marker = self.containerState.marker || code;\n return effects.check(blankLine,\n // Can’t be empty when interrupting.\n self.interrupt ? nok : onBlank, effects.attempt(listItemPrefixWhitespaceConstruct, endOfPrefix, otherPrefix));\n }\n\n /** @type {State} */\n function onBlank(code) {\n self.containerState.initialBlankLine = true;\n initialSize++;\n return endOfPrefix(code);\n }\n\n /** @type {State} */\n function otherPrefix(code) {\n if (markdownSpace(code)) {\n effects.enter(\"listItemPrefixWhitespace\");\n effects.consume(code);\n effects.exit(\"listItemPrefixWhitespace\");\n return endOfPrefix;\n }\n return nok(code);\n }\n\n /** @type {State} */\n function endOfPrefix(code) {\n self.containerState.size = initialSize + self.sliceSerialize(effects.exit(\"listItemPrefix\"), true).length;\n return ok(code);\n }\n}\n\n/**\n * @type {Tokenizer}\n * @this {TokenizeContext}\n */\nfunction tokenizeListContinuation(effects, ok, nok) {\n const self = this;\n self.containerState._closeFlow = undefined;\n return effects.check(blankLine, onBlank, notBlank);\n\n /** @type {State} */\n function onBlank(code) {\n self.containerState.furtherBlankLines = self.containerState.furtherBlankLines || self.containerState.initialBlankLine;\n\n // We have a blank line.\n // Still, try to consume at most the items size.\n return factorySpace(effects, ok, \"listItemIndent\", self.containerState.size + 1)(code);\n }\n\n /** @type {State} */\n function notBlank(code) {\n if (self.containerState.furtherBlankLines || !markdownSpace(code)) {\n self.containerState.furtherBlankLines = undefined;\n self.containerState.initialBlankLine = undefined;\n return notInCurrentItem(code);\n }\n self.containerState.furtherBlankLines = undefined;\n self.containerState.initialBlankLine = undefined;\n return effects.attempt(indentConstruct, ok, notInCurrentItem)(code);\n }\n\n /** @type {State} */\n function notInCurrentItem(code) {\n // While we do continue, we signal that the flow should be closed.\n self.containerState._closeFlow = true;\n // As we’re closing flow, we’re no longer interrupting.\n self.interrupt = undefined;\n // Always populated by defaults.\n\n return factorySpace(effects, effects.attempt(list, ok, nok), \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code);\n }\n}\n\n/**\n * @type {Tokenizer}\n * @this {TokenizeContext}\n */\nfunction tokenizeIndent(effects, ok, nok) {\n const self = this;\n return factorySpace(effects, afterPrefix, \"listItemIndent\", self.containerState.size + 1);\n\n /** @type {State} */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return tail && tail[1].type === \"listItemIndent\" && tail[2].sliceSerialize(tail[1], true).length === self.containerState.size ? ok(code) : nok(code);\n }\n}\n\n/**\n * @type {Exiter}\n * @this {TokenizeContext}\n */\nfunction tokenizeListEnd(effects) {\n effects.exit(this.containerState.type);\n}\n\n/**\n * @type {Tokenizer}\n * @this {TokenizeContext}\n */\nfunction tokenizeListItemPrefixWhitespace(effects, ok, nok) {\n const self = this;\n\n // Always populated by defaults.\n\n return factorySpace(effects, afterPrefix, \"listItemPrefixWhitespace\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4 + 1);\n\n /** @type {State} */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return !markdownSpace(code) && tail && tail[1].type === \"listItemPrefixWhitespace\" ? ok(code) : nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Tokenizer} Tokenizer\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const setextUnderline = {\n name: 'setextUnderline',\n tokenize: tokenizeSetextUnderline,\n resolveTo: resolveToSetextUnderline\n};\n\n/** @type {Resolver} */\nfunction resolveToSetextUnderline(events, context) {\n // To do: resolve like `markdown-rs`.\n let index = events.length;\n /** @type {number | undefined} */\n let content;\n /** @type {number | undefined} */\n let text;\n /** @type {number | undefined} */\n let definition;\n\n // Find the opening of the content.\n // It’ll always exist: we don’t tokenize if it isn’t there.\n while (index--) {\n if (events[index][0] === 'enter') {\n if (events[index][1].type === \"content\") {\n content = index;\n break;\n }\n if (events[index][1].type === \"paragraph\") {\n text = index;\n }\n }\n // Exit\n else {\n if (events[index][1].type === \"content\") {\n // Remove the content end (if needed we’ll add it later)\n events.splice(index, 1);\n }\n if (!definition && events[index][1].type === \"definition\") {\n definition = index;\n }\n }\n }\n const heading = {\n type: \"setextHeading\",\n start: Object.assign({}, events[text][1].start),\n end: Object.assign({}, events[events.length - 1][1].end)\n };\n\n // Change the paragraph to setext heading text.\n events[text][1].type = \"setextHeadingText\";\n\n // If we have definitions in the content, we’ll keep on having content,\n // but we need move it.\n if (definition) {\n events.splice(text, 0, ['enter', heading, context]);\n events.splice(definition + 1, 0, ['exit', events[content][1], context]);\n events[content][1].end = Object.assign({}, events[definition][1].end);\n } else {\n events[content][1] = heading;\n }\n\n // Add the heading exit at the end.\n events.push(['exit', heading, context]);\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeSetextUnderline(effects, ok, nok) {\n const self = this;\n /** @type {NonNullable<Code>} */\n let marker;\n return start;\n\n /**\n * At start of heading (setext) underline.\n *\n * ```markdown\n * | aa\n * > | ==\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n let index = self.events.length;\n /** @type {boolean | undefined} */\n let paragraph;\n // Find an opening.\n while (index--) {\n // Skip enter/exit of line ending, line prefix, and content.\n // We can now either have a definition or a paragraph.\n if (self.events[index][1].type !== \"lineEnding\" && self.events[index][1].type !== \"linePrefix\" && self.events[index][1].type !== \"content\") {\n paragraph = self.events[index][1].type === \"paragraph\";\n break;\n }\n }\n\n // To do: handle lazy/pierce like `markdown-rs`.\n // To do: parse indent like `markdown-rs`.\n if (!self.parser.lazy[self.now().line] && (self.interrupt || paragraph)) {\n effects.enter(\"setextHeadingLine\");\n marker = code;\n return before(code);\n }\n return nok(code);\n }\n\n /**\n * After optional whitespace, at `-` or `=`.\n *\n * ```markdown\n * | aa\n * > | ==\n * ^\n * ```\n *\n * @type {State}\n */\n function before(code) {\n effects.enter(\"setextHeadingLineSequence\");\n return inside(code);\n }\n\n /**\n * In sequence.\n *\n * ```markdown\n * | aa\n * > | ==\n * ^\n * ```\n *\n * @type {State}\n */\n function inside(code) {\n if (code === marker) {\n effects.consume(code);\n return inside;\n }\n effects.exit(\"setextHeadingLineSequence\");\n return markdownSpace(code) ? factorySpace(effects, after, \"lineSuffix\")(code) : after(code);\n }\n\n /**\n * After sequence, after optional whitespace.\n *\n * ```markdown\n * | aa\n * > | ==\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n if (code === null || markdownLineEnding(code)) {\n effects.exit(\"setextHeadingLine\");\n return ok(code);\n }\n return nok(code);\n }\n}","/**\n * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct\n * @typedef {import('micromark-util-types').Initializer} Initializer\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n */\n\nimport {blankLine, content} from 'micromark-core-commonmark'\nimport {factorySpace} from 'micromark-factory-space'\nimport {markdownLineEnding} from 'micromark-util-character'\n/** @type {InitialConstruct} */\nexport const flow = {\n tokenize: initializeFlow\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Initializer}\n */\nfunction initializeFlow(effects) {\n const self = this\n const initial = effects.attempt(\n // Try to parse a blank line.\n blankLine,\n atBlankEnding,\n // Try to parse initial flow (essentially, only code).\n effects.attempt(\n this.parser.constructs.flowInitial,\n afterConstruct,\n factorySpace(\n effects,\n effects.attempt(\n this.parser.constructs.flow,\n afterConstruct,\n effects.attempt(content, afterConstruct)\n ),\n 'linePrefix'\n )\n )\n )\n return initial\n\n /** @type {State} */\n function atBlankEnding(code) {\n if (code === null) {\n effects.consume(code)\n return\n }\n effects.enter('lineEndingBlank')\n effects.consume(code)\n effects.exit('lineEndingBlank')\n self.currentConstruct = undefined\n return initial\n }\n\n /** @type {State} */\n function afterConstruct(code) {\n if (code === null) {\n effects.consume(code)\n return\n }\n effects.enter('lineEnding')\n effects.consume(code)\n effects.exit('lineEnding')\n self.currentConstruct = undefined\n return initial\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct\n * @typedef {import('micromark-util-types').Initializer} Initializer\n * @typedef {import('micromark-util-types').Resolver} Resolver\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n */\n\nexport const resolver = {\n resolveAll: createResolver()\n}\nexport const string = initializeFactory('string')\nexport const text = initializeFactory('text')\n\n/**\n * @param {'string' | 'text'} field\n * @returns {InitialConstruct}\n */\nfunction initializeFactory(field) {\n return {\n tokenize: initializeText,\n resolveAll: createResolver(\n field === 'text' ? resolveAllLineSuffixes : undefined\n )\n }\n\n /**\n * @this {TokenizeContext}\n * @type {Initializer}\n */\n function initializeText(effects) {\n const self = this\n const constructs = this.parser.constructs[field]\n const text = effects.attempt(constructs, start, notText)\n return start\n\n /** @type {State} */\n function start(code) {\n return atBreak(code) ? text(code) : notText(code)\n }\n\n /** @type {State} */\n function notText(code) {\n if (code === null) {\n effects.consume(code)\n return\n }\n effects.enter('data')\n effects.consume(code)\n return data\n }\n\n /** @type {State} */\n function data(code) {\n if (atBreak(code)) {\n effects.exit('data')\n return text(code)\n }\n\n // Data.\n effects.consume(code)\n return data\n }\n\n /**\n * @param {Code} code\n * @returns {boolean}\n */\n function atBreak(code) {\n if (code === null) {\n return true\n }\n const list = constructs[code]\n let index = -1\n if (list) {\n // Always populated by defaults.\n\n while (++index < list.length) {\n const item = list[index]\n if (!item.previous || item.previous.call(self, self.previous)) {\n return true\n }\n }\n }\n return false\n }\n }\n}\n\n/**\n * @param {Resolver | undefined} [extraResolver]\n * @returns {Resolver}\n */\nfunction createResolver(extraResolver) {\n return resolveAllText\n\n /** @type {Resolver} */\n function resolveAllText(events, context) {\n let index = -1\n /** @type {number | undefined} */\n let enter\n\n // A rather boring computation (to merge adjacent `data` events) which\n // improves mm performance by 29%.\n while (++index <= events.length) {\n if (enter === undefined) {\n if (events[index] && events[index][1].type === 'data') {\n enter = index\n index++\n }\n } else if (!events[index] || events[index][1].type !== 'data') {\n // Don’t do anything if there is one data token.\n if (index !== enter + 2) {\n events[enter][1].end = events[index - 1][1].end\n events.splice(enter + 2, index - enter - 2)\n index = enter + 2\n }\n enter = undefined\n }\n }\n return extraResolver ? extraResolver(events, context) : events\n }\n}\n\n/**\n * A rather ugly set of instructions which again looks at chunks in the input\n * stream.\n * The reason to do this here is that it is *much* faster to parse in reverse.\n * And that we can’t hook into `null` to split the line suffix before an EOF.\n * To do: figure out if we can make this into a clean utility, or even in core.\n * As it will be useful for GFMs literal autolink extension (and maybe even\n * tables?)\n *\n * @type {Resolver}\n */\nfunction resolveAllLineSuffixes(events, context) {\n let eventIndex = 0 // Skip first.\n\n while (++eventIndex <= events.length) {\n if (\n (eventIndex === events.length ||\n events[eventIndex][1].type === 'lineEnding') &&\n events[eventIndex - 1][1].type === 'data'\n ) {\n const data = events[eventIndex - 1][1]\n const chunks = context.sliceStream(data)\n let index = chunks.length\n let bufferIndex = -1\n let size = 0\n /** @type {boolean | undefined} */\n let tabs\n while (index--) {\n const chunk = chunks[index]\n if (typeof chunk === 'string') {\n bufferIndex = chunk.length\n while (chunk.charCodeAt(bufferIndex - 1) === 32) {\n size++\n bufferIndex--\n }\n if (bufferIndex) break\n bufferIndex = -1\n }\n // Number\n else if (chunk === -2) {\n tabs = true\n size++\n } else if (chunk === -1) {\n // Empty\n } else {\n // Replacement character, exit.\n index++\n break\n }\n }\n if (size) {\n const token = {\n type:\n eventIndex === events.length || tabs || size < 2\n ? 'lineSuffix'\n : 'hardBreakTrailing',\n start: {\n line: data.end.line,\n column: data.end.column - size,\n offset: data.end.offset - size,\n _index: data.start._index + index,\n _bufferIndex: index\n ? bufferIndex\n : data.start._bufferIndex + bufferIndex\n },\n end: Object.assign({}, data.end)\n }\n data.end = Object.assign({}, token.start)\n if (data.start.offset === data.end.offset) {\n Object.assign(data, token)\n } else {\n events.splice(\n eventIndex,\n 0,\n ['enter', token, context],\n ['exit', token, context]\n )\n eventIndex += 2\n }\n }\n eventIndex++\n }\n }\n return events\n}\n","/**\n * @typedef {import('micromark-util-types').Chunk} Chunk\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Construct} Construct\n * @typedef {import('micromark-util-types').ConstructRecord} ConstructRecord\n * @typedef {import('micromark-util-types').Effects} Effects\n * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct\n * @typedef {import('micromark-util-types').ParseContext} ParseContext\n * @typedef {import('micromark-util-types').Point} Point\n * @typedef {import('micromark-util-types').State} State\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenType} TokenType\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n */\n\n/**\n * @callback Restore\n * @returns {undefined}\n *\n * @typedef Info\n * @property {Restore} restore\n * @property {number} from\n *\n * @callback ReturnHandle\n * Handle a successful run.\n * @param {Construct} construct\n * @param {Info} info\n * @returns {undefined}\n */\n\nimport {markdownLineEnding} from 'micromark-util-character'\nimport {push, splice} from 'micromark-util-chunked'\nimport {resolveAll} from 'micromark-util-resolve-all'\n/**\n * Create a tokenizer.\n * Tokenizers deal with one type of data (e.g., containers, flow, text).\n * The parser is the object dealing with it all.\n * `initialize` works like other constructs, except that only its `tokenize`\n * function is used, in which case it doesn’t receive an `ok` or `nok`.\n * `from` can be given to set the point before the first character, although\n * when further lines are indented, they must be set with `defineSkip`.\n *\n * @param {ParseContext} parser\n * @param {InitialConstruct} initialize\n * @param {Omit<Point, '_bufferIndex' | '_index'> | undefined} [from]\n * @returns {TokenizeContext}\n */\nexport function createTokenizer(parser, initialize, from) {\n /** @type {Point} */\n let point = Object.assign(\n from\n ? Object.assign({}, from)\n : {\n line: 1,\n column: 1,\n offset: 0\n },\n {\n _index: 0,\n _bufferIndex: -1\n }\n )\n /** @type {Record<string, number>} */\n const columnStart = {}\n /** @type {Array<Construct>} */\n const resolveAllConstructs = []\n /** @type {Array<Chunk>} */\n let chunks = []\n /** @type {Array<Token>} */\n let stack = []\n /** @type {boolean | undefined} */\n let consumed = true\n\n /**\n * Tools used for tokenizing.\n *\n * @type {Effects}\n */\n const effects = {\n consume,\n enter,\n exit,\n attempt: constructFactory(onsuccessfulconstruct),\n check: constructFactory(onsuccessfulcheck),\n interrupt: constructFactory(onsuccessfulcheck, {\n interrupt: true\n })\n }\n\n /**\n * State and tools for resolving and serializing.\n *\n * @type {TokenizeContext}\n */\n const context = {\n previous: null,\n code: null,\n containerState: {},\n events: [],\n parser,\n sliceStream,\n sliceSerialize,\n now,\n defineSkip,\n write\n }\n\n /**\n * The state function.\n *\n * @type {State | undefined}\n */\n let state = initialize.tokenize.call(context, effects)\n\n /**\n * Track which character we expect to be consumed, to catch bugs.\n *\n * @type {Code}\n */\n let expectedCode\n if (initialize.resolveAll) {\n resolveAllConstructs.push(initialize)\n }\n return context\n\n /** @type {TokenizeContext['write']} */\n function write(slice) {\n chunks = push(chunks, slice)\n main()\n\n // Exit if we’re not done, resolve might change stuff.\n if (chunks[chunks.length - 1] !== null) {\n return []\n }\n addResult(initialize, 0)\n\n // Otherwise, resolve, and exit.\n context.events = resolveAll(resolveAllConstructs, context.events, context)\n return context.events\n }\n\n //\n // Tools.\n //\n\n /** @type {TokenizeContext['sliceSerialize']} */\n function sliceSerialize(token, expandTabs) {\n return serializeChunks(sliceStream(token), expandTabs)\n }\n\n /** @type {TokenizeContext['sliceStream']} */\n function sliceStream(token) {\n return sliceChunks(chunks, token)\n }\n\n /** @type {TokenizeContext['now']} */\n function now() {\n // This is a hot path, so we clone manually instead of `Object.assign({}, point)`\n const {line, column, offset, _index, _bufferIndex} = point\n return {\n line,\n column,\n offset,\n _index,\n _bufferIndex\n }\n }\n\n /** @type {TokenizeContext['defineSkip']} */\n function defineSkip(value) {\n columnStart[value.line] = value.column\n accountForPotentialSkip()\n }\n\n //\n // State management.\n //\n\n /**\n * Main loop (note that `_index` and `_bufferIndex` in `point` are modified by\n * `consume`).\n * Here is where we walk through the chunks, which either include strings of\n * several characters, or numerical character codes.\n * The reason to do this in a loop instead of a call is so the stack can\n * drain.\n *\n * @returns {undefined}\n */\n function main() {\n /** @type {number} */\n let chunkIndex\n while (point._index < chunks.length) {\n const chunk = chunks[point._index]\n\n // If we’re in a buffer chunk, loop through it.\n if (typeof chunk === 'string') {\n chunkIndex = point._index\n if (point._bufferIndex < 0) {\n point._bufferIndex = 0\n }\n while (\n point._index === chunkIndex &&\n point._bufferIndex < chunk.length\n ) {\n go(chunk.charCodeAt(point._bufferIndex))\n }\n } else {\n go(chunk)\n }\n }\n }\n\n /**\n * Deal with one code.\n *\n * @param {Code} code\n * @returns {undefined}\n */\n function go(code) {\n consumed = undefined\n expectedCode = code\n state = state(code)\n }\n\n /** @type {Effects['consume']} */\n function consume(code) {\n if (markdownLineEnding(code)) {\n point.line++\n point.column = 1\n point.offset += code === -3 ? 2 : 1\n accountForPotentialSkip()\n } else if (code !== -1) {\n point.column++\n point.offset++\n }\n\n // Not in a string chunk.\n if (point._bufferIndex < 0) {\n point._index++\n } else {\n point._bufferIndex++\n\n // At end of string chunk.\n // @ts-expect-error Points w/ non-negative `_bufferIndex` reference\n // strings.\n if (point._bufferIndex === chunks[point._index].length) {\n point._bufferIndex = -1\n point._index++\n }\n }\n\n // Expose the previous character.\n context.previous = code\n\n // Mark as consumed.\n consumed = true\n }\n\n /** @type {Effects['enter']} */\n function enter(type, fields) {\n /** @type {Token} */\n // @ts-expect-error Patch instead of assign required fields to help GC.\n const token = fields || {}\n token.type = type\n token.start = now()\n context.events.push(['enter', token, context])\n stack.push(token)\n return token\n }\n\n /** @type {Effects['exit']} */\n function exit(type) {\n const token = stack.pop()\n token.end = now()\n context.events.push(['exit', token, context])\n return token\n }\n\n /**\n * Use results.\n *\n * @type {ReturnHandle}\n */\n function onsuccessfulconstruct(construct, info) {\n addResult(construct, info.from)\n }\n\n /**\n * Discard results.\n *\n * @type {ReturnHandle}\n */\n function onsuccessfulcheck(_, info) {\n info.restore()\n }\n\n /**\n * Factory to attempt/check/interrupt.\n *\n * @param {ReturnHandle} onreturn\n * @param {{interrupt?: boolean | undefined} | undefined} [fields]\n */\n function constructFactory(onreturn, fields) {\n return hook\n\n /**\n * Handle either an object mapping codes to constructs, a list of\n * constructs, or a single construct.\n *\n * @param {Array<Construct> | Construct | ConstructRecord} constructs\n * @param {State} returnState\n * @param {State | undefined} [bogusState]\n * @returns {State}\n */\n function hook(constructs, returnState, bogusState) {\n /** @type {Array<Construct>} */\n let listOfConstructs\n /** @type {number} */\n let constructIndex\n /** @type {Construct} */\n let currentConstruct\n /** @type {Info} */\n let info\n return Array.isArray(constructs) /* c8 ignore next 1 */\n ? handleListOfConstructs(constructs)\n : 'tokenize' in constructs\n ? // @ts-expect-error Looks like a construct.\n handleListOfConstructs([constructs])\n : handleMapOfConstructs(constructs)\n\n /**\n * Handle a list of construct.\n *\n * @param {ConstructRecord} map\n * @returns {State}\n */\n function handleMapOfConstructs(map) {\n return start\n\n /** @type {State} */\n function start(code) {\n const def = code !== null && map[code]\n const all = code !== null && map.null\n const list = [\n // To do: add more extension tests.\n /* c8 ignore next 2 */\n ...(Array.isArray(def) ? def : def ? [def] : []),\n ...(Array.isArray(all) ? all : all ? [all] : [])\n ]\n return handleListOfConstructs(list)(code)\n }\n }\n\n /**\n * Handle a list of construct.\n *\n * @param {Array<Construct>} list\n * @returns {State}\n */\n function handleListOfConstructs(list) {\n listOfConstructs = list\n constructIndex = 0\n if (list.length === 0) {\n return bogusState\n }\n return handleConstruct(list[constructIndex])\n }\n\n /**\n * Handle a single construct.\n *\n * @param {Construct} construct\n * @returns {State}\n */\n function handleConstruct(construct) {\n return start\n\n /** @type {State} */\n function start(code) {\n // To do: not needed to store if there is no bogus state, probably?\n // Currently doesn’t work because `inspect` in document does a check\n // w/o a bogus, which doesn’t make sense. But it does seem to help perf\n // by not storing.\n info = store()\n currentConstruct = construct\n if (!construct.partial) {\n context.currentConstruct = construct\n }\n\n // Always populated by defaults.\n\n if (\n construct.name &&\n context.parser.constructs.disable.null.includes(construct.name)\n ) {\n return nok(code)\n }\n return construct.tokenize.call(\n // If we do have fields, create an object w/ `context` as its\n // prototype.\n // This allows a “live binding”, which is needed for `interrupt`.\n fields ? Object.assign(Object.create(context), fields) : context,\n effects,\n ok,\n nok\n )(code)\n }\n }\n\n /** @type {State} */\n function ok(code) {\n consumed = true\n onreturn(currentConstruct, info)\n return returnState\n }\n\n /** @type {State} */\n function nok(code) {\n consumed = true\n info.restore()\n if (++constructIndex < listOfConstructs.length) {\n return handleConstruct(listOfConstructs[constructIndex])\n }\n return bogusState\n }\n }\n }\n\n /**\n * @param {Construct} construct\n * @param {number} from\n * @returns {undefined}\n */\n function addResult(construct, from) {\n if (construct.resolveAll && !resolveAllConstructs.includes(construct)) {\n resolveAllConstructs.push(construct)\n }\n if (construct.resolve) {\n splice(\n context.events,\n from,\n context.events.length - from,\n construct.resolve(context.events.slice(from), context)\n )\n }\n if (construct.resolveTo) {\n context.events = construct.resolveTo(context.events, context)\n }\n }\n\n /**\n * Store state.\n *\n * @returns {Info}\n */\n function store() {\n const startPoint = now()\n const startPrevious = context.previous\n const startCurrentConstruct = context.currentConstruct\n const startEventsIndex = context.events.length\n const startStack = Array.from(stack)\n return {\n restore,\n from: startEventsIndex\n }\n\n /**\n * Restore state.\n *\n * @returns {undefined}\n */\n function restore() {\n point = startPoint\n context.previous = startPrevious\n context.currentConstruct = startCurrentConstruct\n context.events.length = startEventsIndex\n stack = startStack\n accountForPotentialSkip()\n }\n }\n\n /**\n * Move the current point a bit forward in the line when it’s on a column\n * skip.\n *\n * @returns {undefined}\n */\n function accountForPotentialSkip() {\n if (point.line in columnStart && point.column < 2) {\n point.column = columnStart[point.line]\n point.offset += columnStart[point.line] - 1\n }\n }\n}\n\n/**\n * Get the chunks from a slice of chunks in the range of a token.\n *\n * @param {Array<Chunk>} chunks\n * @param {Pick<Token, 'end' | 'start'>} token\n * @returns {Array<Chunk>}\n */\nfunction sliceChunks(chunks, token) {\n const startIndex = token.start._index\n const startBufferIndex = token.start._bufferIndex\n const endIndex = token.end._index\n const endBufferIndex = token.end._bufferIndex\n /** @type {Array<Chunk>} */\n let view\n if (startIndex === endIndex) {\n // @ts-expect-error `_bufferIndex` is used on string chunks.\n view = [chunks[startIndex].slice(startBufferIndex, endBufferIndex)]\n } else {\n view = chunks.slice(startIndex, endIndex)\n if (startBufferIndex > -1) {\n const head = view[0]\n if (typeof head === 'string') {\n view[0] = head.slice(startBufferIndex)\n } else {\n view.shift()\n }\n }\n if (endBufferIndex > 0) {\n // @ts-expect-error `_bufferIndex` is used on string chunks.\n view.push(chunks[endIndex].slice(0, endBufferIndex))\n }\n }\n return view\n}\n\n/**\n * Get the string value of a slice of chunks.\n *\n * @param {Array<Chunk>} chunks\n * @param {boolean | undefined} [expandTabs=false]\n * @returns {string}\n */\nfunction serializeChunks(chunks, expandTabs) {\n let index = -1\n /** @type {Array<string>} */\n const result = []\n /** @type {boolean | undefined} */\n let atTab\n while (++index < chunks.length) {\n const chunk = chunks[index]\n /** @type {string} */\n let value\n if (typeof chunk === 'string') {\n value = chunk\n } else\n switch (chunk) {\n case -5: {\n value = '\\r'\n break\n }\n case -4: {\n value = '\\n'\n break\n }\n case -3: {\n value = '\\r' + '\\n'\n break\n }\n case -2: {\n value = expandTabs ? ' ' : '\\t'\n break\n }\n case -1: {\n if (!expandTabs && atTab) continue\n value = ' '\n break\n }\n default: {\n // Currently only replacement character.\n value = String.fromCharCode(chunk)\n }\n }\n atTab = chunk === -2\n result.push(value)\n }\n return result.join('')\n}\n","/**\n * @typedef {import('micromark-util-types').Extension} Extension\n */\n\nimport {\n attention,\n autolink,\n blockQuote,\n characterEscape,\n characterReference,\n codeFenced,\n codeIndented,\n codeText,\n definition,\n hardBreakEscape,\n headingAtx,\n htmlFlow,\n htmlText,\n labelEnd,\n labelStartImage,\n labelStartLink,\n lineEnding,\n list,\n setextUnderline,\n thematicBreak\n} from 'micromark-core-commonmark'\nimport {resolver as resolveText} from './initialize/text.js'\n\n/** @satisfies {Extension['document']} */\nexport const document = {\n [42]: list,\n [43]: list,\n [45]: list,\n [48]: list,\n [49]: list,\n [50]: list,\n [51]: list,\n [52]: list,\n [53]: list,\n [54]: list,\n [55]: list,\n [56]: list,\n [57]: list,\n [62]: blockQuote\n}\n\n/** @satisfies {Extension['contentInitial']} */\nexport const contentInitial = {\n [91]: definition\n}\n\n/** @satisfies {Extension['flowInitial']} */\nexport const flowInitial = {\n [-2]: codeIndented,\n [-1]: codeIndented,\n [32]: codeIndented\n}\n\n/** @satisfies {Extension['flow']} */\nexport const flow = {\n [35]: headingAtx,\n [42]: thematicBreak,\n [45]: [setextUnderline, thematicBreak],\n [60]: htmlFlow,\n [61]: setextUnderline,\n [95]: thematicBreak,\n [96]: codeFenced,\n [126]: codeFenced\n}\n\n/** @satisfies {Extension['string']} */\nexport const string = {\n [38]: characterReference,\n [92]: characterEscape\n}\n\n/** @satisfies {Extension['text']} */\nexport const text = {\n [-5]: lineEnding,\n [-4]: lineEnding,\n [-3]: lineEnding,\n [33]: labelStartImage,\n [38]: characterReference,\n [42]: attention,\n [60]: [autolink, htmlText],\n [91]: labelStartLink,\n [92]: [hardBreakEscape, characterEscape],\n [93]: labelEnd,\n [95]: attention,\n [96]: codeText\n}\n\n/** @satisfies {Extension['insideSpan']} */\nexport const insideSpan = {\n null: [attention, resolveText]\n}\n\n/** @satisfies {Extension['attentionMarkers']} */\nexport const attentionMarkers = {\n null: [42, 95]\n}\n\n/** @satisfies {Extension['disable']} */\nexport const disable = {\n null: []\n}\n","/**\n * @typedef {import('micromark-util-types').Create} Create\n * @typedef {import('micromark-util-types').FullNormalizedExtension} FullNormalizedExtension\n * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct\n * @typedef {import('micromark-util-types').ParseContext} ParseContext\n * @typedef {import('micromark-util-types').ParseOptions} ParseOptions\n */\n\nimport {combineExtensions} from 'micromark-util-combine-extensions'\nimport {content} from './initialize/content.js'\nimport {document} from './initialize/document.js'\nimport {flow} from './initialize/flow.js'\nimport {string, text} from './initialize/text.js'\nimport {createTokenizer} from './create-tokenizer.js'\nimport * as defaultConstructs from './constructs.js'\n\n/**\n * @param {ParseOptions | null | undefined} [options]\n * @returns {ParseContext}\n */\nexport function parse(options) {\n const settings = options || {}\n const constructs =\n /** @type {FullNormalizedExtension} */\n combineExtensions([defaultConstructs, ...(settings.extensions || [])])\n\n /** @type {ParseContext} */\n const parser = {\n defined: [],\n lazy: {},\n constructs,\n content: create(content),\n document: create(document),\n flow: create(flow),\n string: create(string),\n text: create(text)\n }\n return parser\n\n /**\n * @param {InitialConstruct} initial\n */\n function create(initial) {\n return creator\n /** @type {Create} */\n function creator(from) {\n return createTokenizer(parser, initial, from)\n }\n }\n}\n","/**\n * @typedef {import('micromark-util-types').Event} Event\n */\n\nimport {subtokenize} from 'micromark-util-subtokenize'\n\n/**\n * @param {Array<Event>} events\n * @returns {Array<Event>}\n */\nexport function postprocess(events) {\n while (!subtokenize(events)) {\n // Empty\n }\n return events\n}\n","/**\n * @typedef {import('micromark-util-types').Chunk} Chunk\n * @typedef {import('micromark-util-types').Code} Code\n * @typedef {import('micromark-util-types').Encoding} Encoding\n * @typedef {import('micromark-util-types').Value} Value\n */\n\n/**\n * @callback Preprocessor\n * @param {Value} value\n * @param {Encoding | null | undefined} [encoding]\n * @param {boolean | null | undefined} [end=false]\n * @returns {Array<Chunk>}\n */\n\nconst search = /[\\0\\t\\n\\r]/g\n\n/**\n * @returns {Preprocessor}\n */\nexport function preprocess() {\n let column = 1\n let buffer = ''\n /** @type {boolean | undefined} */\n let start = true\n /** @type {boolean | undefined} */\n let atCarriageReturn\n return preprocessor\n\n /** @type {Preprocessor} */\n // eslint-disable-next-line complexity\n function preprocessor(value, encoding, end) {\n /** @type {Array<Chunk>} */\n const chunks = []\n /** @type {RegExpMatchArray | null} */\n let match\n /** @type {number} */\n let next\n /** @type {number} */\n let startPosition\n /** @type {number} */\n let endPosition\n /** @type {Code} */\n let code\n value =\n buffer +\n (typeof value === 'string'\n ? value.toString()\n : new TextDecoder(encoding || undefined).decode(value))\n startPosition = 0\n buffer = ''\n if (start) {\n // To do: `markdown-rs` actually parses BOMs (byte order mark).\n if (value.charCodeAt(0) === 65279) {\n startPosition++\n }\n start = undefined\n }\n while (startPosition < value.length) {\n search.lastIndex = startPosition\n match = search.exec(value)\n endPosition =\n match && match.index !== undefined ? match.index : value.length\n code = value.charCodeAt(endPosition)\n if (!match) {\n buffer = value.slice(startPosition)\n break\n }\n if (code === 10 && startPosition === endPosition && atCarriageReturn) {\n chunks.push(-3)\n atCarriageReturn = undefined\n } else {\n if (atCarriageReturn) {\n chunks.push(-5)\n atCarriageReturn = undefined\n }\n if (startPosition < endPosition) {\n chunks.push(value.slice(startPosition, endPosition))\n column += endPosition - startPosition\n }\n switch (code) {\n case 0: {\n chunks.push(65533)\n column++\n break\n }\n case 9: {\n next = Math.ceil(column / 4) * 4\n chunks.push(-2)\n while (column++ < next) chunks.push(-1)\n break\n }\n case 10: {\n chunks.push(-4)\n column = 1\n break\n }\n default: {\n atCarriageReturn = true\n column = 1\n }\n }\n }\n startPosition = endPosition + 1\n }\n if (end) {\n if (atCarriageReturn) chunks.push(-5)\n if (buffer) chunks.push(buffer)\n chunks.push(null)\n }\n return chunks\n }\n}\n","import {decodeNamedCharacterReference} from 'decode-named-character-reference'\nimport {decodeNumericCharacterReference} from 'micromark-util-decode-numeric-character-reference'\nconst characterEscapeOrReference =\n /\\\\([!-/:-@[-`{-~])|&(#(?:\\d{1,7}|x[\\da-f]{1,6})|[\\da-z]{1,31});/gi\n\n/**\n * Decode markdown strings (which occur in places such as fenced code info\n * strings, destinations, labels, and titles).\n *\n * The “string” content type allows character escapes and -references.\n * This decodes those.\n *\n * @param {string} value\n * Value to decode.\n * @returns {string}\n * Decoded value.\n */\nexport function decodeString(value) {\n return value.replace(characterEscapeOrReference, decode)\n}\n\n/**\n * @param {string} $0\n * @param {string} $1\n * @param {string} $2\n * @returns {string}\n */\nfunction decode($0, $1, $2) {\n if ($1) {\n // Escape.\n return $1\n }\n\n // Reference.\n const head = $2.charCodeAt(0)\n if (head === 35) {\n const head = $2.charCodeAt(1)\n const hex = head === 120 || head === 88\n return decodeNumericCharacterReference($2.slice(hex ? 2 : 1), hex ? 16 : 10)\n }\n return decodeNamedCharacterReference($2) || $0\n}\n","/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Point} Point\n * @typedef {import('unist').Position} Position\n */\n\n/**\n * @typedef NodeLike\n * @property {string} type\n * @property {PositionLike | null | undefined} [position]\n *\n * @typedef PointLike\n * @property {number | null | undefined} [line]\n * @property {number | null | undefined} [column]\n * @property {number | null | undefined} [offset]\n *\n * @typedef PositionLike\n * @property {PointLike | null | undefined} [start]\n * @property {PointLike | null | undefined} [end]\n */\n\n/**\n * Serialize the positional info of a point, position (start and end points),\n * or node.\n *\n * @param {Node | NodeLike | Point | PointLike | Position | PositionLike | null | undefined} [value]\n * Node, position, or point.\n * @returns {string}\n * Pretty printed positional info of a node (`string`).\n *\n * In the format of a range `ls:cs-le:ce` (when given `node` or `position`)\n * or a point `l:c` (when given `point`), where `l` stands for line, `c` for\n * column, `s` for `start`, and `e` for end.\n * An empty string (`''`) is returned if the given value is neither `node`,\n * `position`, nor `point`.\n */\nexport function stringifyPosition(value) {\n // Nothing.\n if (!value || typeof value !== 'object') {\n return ''\n }\n\n // Node.\n if ('position' in value || 'type' in value) {\n return position(value.position)\n }\n\n // Position.\n if ('start' in value || 'end' in value) {\n return position(value)\n }\n\n // Point.\n if ('line' in value || 'column' in value) {\n return point(value)\n }\n\n // ?\n return ''\n}\n\n/**\n * @param {Point | PointLike | null | undefined} point\n * @returns {string}\n */\nfunction point(point) {\n return index(point && point.line) + ':' + index(point && point.column)\n}\n\n/**\n * @param {Position | PositionLike | null | undefined} pos\n * @returns {string}\n */\nfunction position(pos) {\n return point(pos && pos.start) + '-' + point(pos && pos.end)\n}\n\n/**\n * @param {number | null | undefined} value\n * @returns {number}\n */\nfunction index(value) {\n return value && typeof value === 'number' ? value : 1\n}\n","/**\n * @typedef {import('mdast').Break} Break\n * @typedef {import('mdast').Blockquote} Blockquote\n * @typedef {import('mdast').Code} Code\n * @typedef {import('mdast').Definition} Definition\n * @typedef {import('mdast').Emphasis} Emphasis\n * @typedef {import('mdast').Heading} Heading\n * @typedef {import('mdast').Html} Html\n * @typedef {import('mdast').Image} Image\n * @typedef {import('mdast').InlineCode} InlineCode\n * @typedef {import('mdast').Link} Link\n * @typedef {import('mdast').List} List\n * @typedef {import('mdast').ListItem} ListItem\n * @typedef {import('mdast').Nodes} Nodes\n * @typedef {import('mdast').Paragraph} Paragraph\n * @typedef {import('mdast').Parent} Parent\n * @typedef {import('mdast').PhrasingContent} PhrasingContent\n * @typedef {import('mdast').ReferenceType} ReferenceType\n * @typedef {import('mdast').Root} Root\n * @typedef {import('mdast').Strong} Strong\n * @typedef {import('mdast').Text} Text\n * @typedef {import('mdast').ThematicBreak} ThematicBreak\n *\n * @typedef {import('micromark-util-types').Encoding} Encoding\n * @typedef {import('micromark-util-types').Event} Event\n * @typedef {import('micromark-util-types').ParseOptions} ParseOptions\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Value} Value\n *\n * @typedef {import('unist').Point} Point\n *\n * @typedef {import('../index.js').CompileData} CompileData\n */\n\n/**\n * @typedef {Omit<Parent, 'children' | 'type'> & {type: 'fragment', children: Array<PhrasingContent>}} Fragment\n */\n\n/**\n * @callback Transform\n * Extra transform, to change the AST afterwards.\n * @param {Root} tree\n * Tree to transform.\n * @returns {Root | null | undefined | void}\n * New tree or nothing (in which case the current tree is used).\n *\n * @callback Handle\n * Handle a token.\n * @param {CompileContext} this\n * Context.\n * @param {Token} token\n * Current token.\n * @returns {undefined | void}\n * Nothing.\n *\n * @typedef {Record<string, Handle>} Handles\n * Token types mapping to handles\n *\n * @callback OnEnterError\n * Handle the case where the `right` token is open, but it is closed (by the\n * `left` token) or because we reached the end of the document.\n * @param {Omit<CompileContext, 'sliceSerialize'>} this\n * Context.\n * @param {Token | undefined} left\n * Left token.\n * @param {Token} right\n * Right token.\n * @returns {undefined}\n * Nothing.\n *\n * @callback OnExitError\n * Handle the case where the `right` token is open but it is closed by\n * exiting the `left` token.\n * @param {Omit<CompileContext, 'sliceSerialize'>} this\n * Context.\n * @param {Token} left\n * Left token.\n * @param {Token} right\n * Right token.\n * @returns {undefined}\n * Nothing.\n *\n * @typedef {[Token, OnEnterError | undefined]} TokenTuple\n * Open token on the stack, with an optional error handler for when\n * that token isn’t closed properly.\n */\n\n/**\n * @typedef Config\n * Configuration.\n *\n * We have our defaults, but extensions will add more.\n * @property {Array<string>} canContainEols\n * Token types where line endings are used.\n * @property {Handles} enter\n * Opening handles.\n * @property {Handles} exit\n * Closing handles.\n * @property {Array<Transform>} transforms\n * Tree transforms.\n *\n * @typedef {Partial<Config>} Extension\n * Change how markdown tokens from micromark are turned into mdast.\n *\n * @typedef CompileContext\n * mdast compiler context.\n * @property {Array<Fragment | Nodes>} stack\n * Stack of nodes.\n * @property {Array<TokenTuple>} tokenStack\n * Stack of tokens.\n * @property {(this: CompileContext) => undefined} buffer\n * Capture some of the output data.\n * @property {(this: CompileContext) => string} resume\n * Stop capturing and access the output data.\n * @property {(this: CompileContext, node: Nodes, token: Token, onError?: OnEnterError) => undefined} enter\n * Enter a node.\n * @property {(this: CompileContext, token: Token, onError?: OnExitError) => undefined} exit\n * Exit a node.\n * @property {TokenizeContext['sliceSerialize']} sliceSerialize\n * Get the string value of a token.\n * @property {Config} config\n * Configuration.\n * @property {CompileData} data\n * Info passed around; key/value store.\n *\n * @typedef FromMarkdownOptions\n * Configuration for how to build mdast.\n * @property {Array<Extension | Array<Extension>> | null | undefined} [mdastExtensions]\n * Extensions for this utility to change how tokens are turned into a tree.\n *\n * @typedef {ParseOptions & FromMarkdownOptions} Options\n * Configuration.\n */\n\nimport {toString} from 'mdast-util-to-string'\nimport {parse, postprocess, preprocess} from 'micromark'\nimport {decodeNumericCharacterReference} from 'micromark-util-decode-numeric-character-reference'\nimport {decodeString} from 'micromark-util-decode-string'\nimport {normalizeIdentifier} from 'micromark-util-normalize-identifier'\nimport {decodeNamedCharacterReference} from 'decode-named-character-reference'\nimport {stringifyPosition} from 'unist-util-stringify-position'\nconst own = {}.hasOwnProperty\n\n/**\n * Turn markdown into a syntax tree.\n *\n * @overload\n * @param {Value} value\n * @param {Encoding | null | undefined} [encoding]\n * @param {Options | null | undefined} [options]\n * @returns {Root}\n *\n * @overload\n * @param {Value} value\n * @param {Options | null | undefined} [options]\n * @returns {Root}\n *\n * @param {Value} value\n * Markdown to parse.\n * @param {Encoding | Options | null | undefined} [encoding]\n * Character encoding for when `value` is `Buffer`.\n * @param {Options | null | undefined} [options]\n * Configuration.\n * @returns {Root}\n * mdast tree.\n */\nexport function fromMarkdown(value, encoding, options) {\n if (typeof encoding !== 'string') {\n options = encoding\n encoding = undefined\n }\n return compiler(options)(\n postprocess(\n parse(options).document().write(preprocess()(value, encoding, true))\n )\n )\n}\n\n/**\n * Note this compiler only understand complete buffering, not streaming.\n *\n * @param {Options | null | undefined} [options]\n */\nfunction compiler(options) {\n /** @type {Config} */\n const config = {\n transforms: [],\n canContainEols: ['emphasis', 'fragment', 'heading', 'paragraph', 'strong'],\n enter: {\n autolink: opener(link),\n autolinkProtocol: onenterdata,\n autolinkEmail: onenterdata,\n atxHeading: opener(heading),\n blockQuote: opener(blockQuote),\n characterEscape: onenterdata,\n characterReference: onenterdata,\n codeFenced: opener(codeFlow),\n codeFencedFenceInfo: buffer,\n codeFencedFenceMeta: buffer,\n codeIndented: opener(codeFlow, buffer),\n codeText: opener(codeText, buffer),\n codeTextData: onenterdata,\n data: onenterdata,\n codeFlowValue: onenterdata,\n definition: opener(definition),\n definitionDestinationString: buffer,\n definitionLabelString: buffer,\n definitionTitleString: buffer,\n emphasis: opener(emphasis),\n hardBreakEscape: opener(hardBreak),\n hardBreakTrailing: opener(hardBreak),\n htmlFlow: opener(html, buffer),\n htmlFlowData: onenterdata,\n htmlText: opener(html, buffer),\n htmlTextData: onenterdata,\n image: opener(image),\n label: buffer,\n link: opener(link),\n listItem: opener(listItem),\n listItemValue: onenterlistitemvalue,\n listOrdered: opener(list, onenterlistordered),\n listUnordered: opener(list),\n paragraph: opener(paragraph),\n reference: onenterreference,\n referenceString: buffer,\n resourceDestinationString: buffer,\n resourceTitleString: buffer,\n setextHeading: opener(heading),\n strong: opener(strong),\n thematicBreak: opener(thematicBreak)\n },\n exit: {\n atxHeading: closer(),\n atxHeadingSequence: onexitatxheadingsequence,\n autolink: closer(),\n autolinkEmail: onexitautolinkemail,\n autolinkProtocol: onexitautolinkprotocol,\n blockQuote: closer(),\n characterEscapeValue: onexitdata,\n characterReferenceMarkerHexadecimal: onexitcharacterreferencemarker,\n characterReferenceMarkerNumeric: onexitcharacterreferencemarker,\n characterReferenceValue: onexitcharacterreferencevalue,\n codeFenced: closer(onexitcodefenced),\n codeFencedFence: onexitcodefencedfence,\n codeFencedFenceInfo: onexitcodefencedfenceinfo,\n codeFencedFenceMeta: onexitcodefencedfencemeta,\n codeFlowValue: onexitdata,\n codeIndented: closer(onexitcodeindented),\n codeText: closer(onexitcodetext),\n codeTextData: onexitdata,\n data: onexitdata,\n definition: closer(),\n definitionDestinationString: onexitdefinitiondestinationstring,\n definitionLabelString: onexitdefinitionlabelstring,\n definitionTitleString: onexitdefinitiontitlestring,\n emphasis: closer(),\n hardBreakEscape: closer(onexithardbreak),\n hardBreakTrailing: closer(onexithardbreak),\n htmlFlow: closer(onexithtmlflow),\n htmlFlowData: onexitdata,\n htmlText: closer(onexithtmltext),\n htmlTextData: onexitdata,\n image: closer(onexitimage),\n label: onexitlabel,\n labelText: onexitlabeltext,\n lineEnding: onexitlineending,\n link: closer(onexitlink),\n listItem: closer(),\n listOrdered: closer(),\n listUnordered: closer(),\n paragraph: closer(),\n referenceString: onexitreferencestring,\n resourceDestinationString: onexitresourcedestinationstring,\n resourceTitleString: onexitresourcetitlestring,\n resource: onexitresource,\n setextHeading: closer(onexitsetextheading),\n setextHeadingLineSequence: onexitsetextheadinglinesequence,\n setextHeadingText: onexitsetextheadingtext,\n strong: closer(),\n thematicBreak: closer()\n }\n }\n configure(config, (options || {}).mdastExtensions || [])\n\n /** @type {CompileData} */\n const data = {}\n return compile\n\n /**\n * Turn micromark events into an mdast tree.\n *\n * @param {Array<Event>} events\n * Events.\n * @returns {Root}\n * mdast tree.\n */\n function compile(events) {\n /** @type {Root} */\n let tree = {\n type: 'root',\n children: []\n }\n /** @type {Omit<CompileContext, 'sliceSerialize'>} */\n const context = {\n stack: [tree],\n tokenStack: [],\n config,\n enter,\n exit,\n buffer,\n resume,\n data\n }\n /** @type {Array<number>} */\n const listStack = []\n let index = -1\n while (++index < events.length) {\n // We preprocess lists to add `listItem` tokens, and to infer whether\n // items the list itself are spread out.\n if (\n events[index][1].type === 'listOrdered' ||\n events[index][1].type === 'listUnordered'\n ) {\n if (events[index][0] === 'enter') {\n listStack.push(index)\n } else {\n const tail = listStack.pop()\n index = prepareList(events, tail, index)\n }\n }\n }\n index = -1\n while (++index < events.length) {\n const handler = config[events[index][0]]\n if (own.call(handler, events[index][1].type)) {\n handler[events[index][1].type].call(\n Object.assign(\n {\n sliceSerialize: events[index][2].sliceSerialize\n },\n context\n ),\n events[index][1]\n )\n }\n }\n\n // Handle tokens still being open.\n if (context.tokenStack.length > 0) {\n const tail = context.tokenStack[context.tokenStack.length - 1]\n const handler = tail[1] || defaultOnError\n handler.call(context, undefined, tail[0])\n }\n\n // Figure out `root` position.\n tree.position = {\n start: point(\n events.length > 0\n ? events[0][1].start\n : {\n line: 1,\n column: 1,\n offset: 0\n }\n ),\n end: point(\n events.length > 0\n ? events[events.length - 2][1].end\n : {\n line: 1,\n column: 1,\n offset: 0\n }\n )\n }\n\n // Call transforms.\n index = -1\n while (++index < config.transforms.length) {\n tree = config.transforms[index](tree) || tree\n }\n return tree\n }\n\n /**\n * @param {Array<Event>} events\n * @param {number} start\n * @param {number} length\n * @returns {number}\n */\n function prepareList(events, start, length) {\n let index = start - 1\n let containerBalance = -1\n let listSpread = false\n /** @type {Token | undefined} */\n let listItem\n /** @type {number | undefined} */\n let lineIndex\n /** @type {number | undefined} */\n let firstBlankLineIndex\n /** @type {boolean | undefined} */\n let atMarker\n while (++index <= length) {\n const event = events[index]\n switch (event[1].type) {\n case 'listUnordered':\n case 'listOrdered':\n case 'blockQuote': {\n if (event[0] === 'enter') {\n containerBalance++\n } else {\n containerBalance--\n }\n atMarker = undefined\n break\n }\n case 'lineEndingBlank': {\n if (event[0] === 'enter') {\n if (\n listItem &&\n !atMarker &&\n !containerBalance &&\n !firstBlankLineIndex\n ) {\n firstBlankLineIndex = index\n }\n atMarker = undefined\n }\n break\n }\n case 'linePrefix':\n case 'listItemValue':\n case 'listItemMarker':\n case 'listItemPrefix':\n case 'listItemPrefixWhitespace': {\n // Empty.\n\n break\n }\n default: {\n atMarker = undefined\n }\n }\n if (\n (!containerBalance &&\n event[0] === 'enter' &&\n event[1].type === 'listItemPrefix') ||\n (containerBalance === -1 &&\n event[0] === 'exit' &&\n (event[1].type === 'listUnordered' ||\n event[1].type === 'listOrdered'))\n ) {\n if (listItem) {\n let tailIndex = index\n lineIndex = undefined\n while (tailIndex--) {\n const tailEvent = events[tailIndex]\n if (\n tailEvent[1].type === 'lineEnding' ||\n tailEvent[1].type === 'lineEndingBlank'\n ) {\n if (tailEvent[0] === 'exit') continue\n if (lineIndex) {\n events[lineIndex][1].type = 'lineEndingBlank'\n listSpread = true\n }\n tailEvent[1].type = 'lineEnding'\n lineIndex = tailIndex\n } else if (\n tailEvent[1].type === 'linePrefix' ||\n tailEvent[1].type === 'blockQuotePrefix' ||\n tailEvent[1].type === 'blockQuotePrefixWhitespace' ||\n tailEvent[1].type === 'blockQuoteMarker' ||\n tailEvent[1].type === 'listItemIndent'\n ) {\n // Empty\n } else {\n break\n }\n }\n if (\n firstBlankLineIndex &&\n (!lineIndex || firstBlankLineIndex < lineIndex)\n ) {\n listItem._spread = true\n }\n\n // Fix position.\n listItem.end = Object.assign(\n {},\n lineIndex ? events[lineIndex][1].start : event[1].end\n )\n events.splice(lineIndex || index, 0, ['exit', listItem, event[2]])\n index++\n length++\n }\n\n // Create a new list item.\n if (event[1].type === 'listItemPrefix') {\n /** @type {Token} */\n const item = {\n type: 'listItem',\n _spread: false,\n start: Object.assign({}, event[1].start),\n // @ts-expect-error: we’ll add `end` in a second.\n end: undefined\n }\n listItem = item\n events.splice(index, 0, ['enter', item, event[2]])\n index++\n length++\n firstBlankLineIndex = undefined\n atMarker = true\n }\n }\n }\n events[start][1]._spread = listSpread\n return length\n }\n\n /**\n * Create an opener handle.\n *\n * @param {(token: Token) => Nodes} create\n * Create a node.\n * @param {Handle | undefined} [and]\n * Optional function to also run.\n * @returns {Handle}\n * Handle.\n */\n function opener(create, and) {\n return open\n\n /**\n * @this {CompileContext}\n * @param {Token} token\n * @returns {undefined}\n */\n function open(token) {\n enter.call(this, create(token), token)\n if (and) and.call(this, token)\n }\n }\n\n /**\n * @this {CompileContext}\n * @returns {undefined}\n */\n function buffer() {\n this.stack.push({\n type: 'fragment',\n children: []\n })\n }\n\n /**\n * @this {CompileContext}\n * Context.\n * @param {Nodes} node\n * Node to enter.\n * @param {Token} token\n * Corresponding token.\n * @param {OnEnterError | undefined} [errorHandler]\n * Handle the case where this token is open, but it is closed by something else.\n * @returns {undefined}\n * Nothing.\n */\n function enter(node, token, errorHandler) {\n const parent = this.stack[this.stack.length - 1]\n /** @type {Array<Nodes>} */\n const siblings = parent.children\n siblings.push(node)\n this.stack.push(node)\n this.tokenStack.push([token, errorHandler])\n node.position = {\n start: point(token.start),\n // @ts-expect-error: `end` will be patched later.\n end: undefined\n }\n }\n\n /**\n * Create a closer handle.\n *\n * @param {Handle | undefined} [and]\n * Optional function to also run.\n * @returns {Handle}\n * Handle.\n */\n function closer(and) {\n return close\n\n /**\n * @this {CompileContext}\n * @param {Token} token\n * @returns {undefined}\n */\n function close(token) {\n if (and) and.call(this, token)\n exit.call(this, token)\n }\n }\n\n /**\n * @this {CompileContext}\n * Context.\n * @param {Token} token\n * Corresponding token.\n * @param {OnExitError | undefined} [onExitError]\n * Handle the case where another token is open.\n * @returns {undefined}\n * Nothing.\n */\n function exit(token, onExitError) {\n const node = this.stack.pop()\n const open = this.tokenStack.pop()\n if (!open) {\n throw new Error(\n 'Cannot close `' +\n token.type +\n '` (' +\n stringifyPosition({\n start: token.start,\n end: token.end\n }) +\n '): it’s not open'\n )\n } else if (open[0].type !== token.type) {\n if (onExitError) {\n onExitError.call(this, token, open[0])\n } else {\n const handler = open[1] || defaultOnError\n handler.call(this, token, open[0])\n }\n }\n node.position.end = point(token.end)\n }\n\n /**\n * @this {CompileContext}\n * @returns {string}\n */\n function resume() {\n return toString(this.stack.pop())\n }\n\n //\n // Handlers.\n //\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onenterlistordered() {\n this.data.expectingFirstListItemValue = true\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onenterlistitemvalue(token) {\n if (this.data.expectingFirstListItemValue) {\n const ancestor = this.stack[this.stack.length - 2]\n ancestor.start = Number.parseInt(this.sliceSerialize(token), 10)\n this.data.expectingFirstListItemValue = undefined\n }\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitcodefencedfenceinfo() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.lang = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitcodefencedfencemeta() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.meta = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitcodefencedfence() {\n // Exit if this is the closing fence.\n if (this.data.flowCodeInside) return\n this.buffer()\n this.data.flowCodeInside = true\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitcodefenced() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.value = data.replace(/^(\\r?\\n|\\r)|(\\r?\\n|\\r)$/g, '')\n this.data.flowCodeInside = undefined\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitcodeindented() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.value = data.replace(/(\\r?\\n|\\r)$/g, '')\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitdefinitionlabelstring(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.label = label\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitdefinitiontitlestring() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.title = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitdefinitiondestinationstring() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.url = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitatxheadingsequence(token) {\n const node = this.stack[this.stack.length - 1]\n if (!node.depth) {\n const depth = this.sliceSerialize(token).length\n node.depth = depth\n }\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitsetextheadingtext() {\n this.data.setextHeadingSlurpLineEnding = true\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitsetextheadinglinesequence(token) {\n const node = this.stack[this.stack.length - 1]\n node.depth = this.sliceSerialize(token).codePointAt(0) === 61 ? 1 : 2\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitsetextheading() {\n this.data.setextHeadingSlurpLineEnding = undefined\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onenterdata(token) {\n const node = this.stack[this.stack.length - 1]\n /** @type {Array<Nodes>} */\n const siblings = node.children\n let tail = siblings[siblings.length - 1]\n if (!tail || tail.type !== 'text') {\n // Add a new text node.\n tail = text()\n tail.position = {\n start: point(token.start),\n // @ts-expect-error: we’ll add `end` later.\n end: undefined\n }\n siblings.push(tail)\n }\n this.stack.push(tail)\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitdata(token) {\n const tail = this.stack.pop()\n tail.value += this.sliceSerialize(token)\n tail.position.end = point(token.end)\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitlineending(token) {\n const context = this.stack[this.stack.length - 1]\n // If we’re at a hard break, include the line ending in there.\n if (this.data.atHardBreak) {\n const tail = context.children[context.children.length - 1]\n tail.position.end = point(token.end)\n this.data.atHardBreak = undefined\n return\n }\n if (\n !this.data.setextHeadingSlurpLineEnding &&\n config.canContainEols.includes(context.type)\n ) {\n onenterdata.call(this, token)\n onexitdata.call(this, token)\n }\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexithardbreak() {\n this.data.atHardBreak = true\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexithtmlflow() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.value = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexithtmltext() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.value = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitcodetext() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.value = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitlink() {\n const node = this.stack[this.stack.length - 1]\n // Note: there are also `identifier` and `label` fields on this link node!\n // These are used / cleaned here.\n // To do: clean.\n if (this.data.inReference) {\n /** @type {ReferenceType} */\n const referenceType = this.data.referenceType || 'shortcut'\n node.type += 'Reference'\n // @ts-expect-error: mutate.\n node.referenceType = referenceType\n // @ts-expect-error: mutate.\n delete node.url\n delete node.title\n } else {\n // @ts-expect-error: mutate.\n delete node.identifier\n // @ts-expect-error: mutate.\n delete node.label\n }\n this.data.referenceType = undefined\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitimage() {\n const node = this.stack[this.stack.length - 1]\n // Note: there are also `identifier` and `label` fields on this link node!\n // These are used / cleaned here.\n // To do: clean.\n if (this.data.inReference) {\n /** @type {ReferenceType} */\n const referenceType = this.data.referenceType || 'shortcut'\n node.type += 'Reference'\n // @ts-expect-error: mutate.\n node.referenceType = referenceType\n // @ts-expect-error: mutate.\n delete node.url\n delete node.title\n } else {\n // @ts-expect-error: mutate.\n delete node.identifier\n // @ts-expect-error: mutate.\n delete node.label\n }\n this.data.referenceType = undefined\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitlabeltext(token) {\n const string = this.sliceSerialize(token)\n const ancestor = this.stack[this.stack.length - 2]\n // @ts-expect-error: stash this on the node, as it might become a reference\n // later.\n ancestor.label = decodeString(string)\n // @ts-expect-error: same as above.\n ancestor.identifier = normalizeIdentifier(string).toLowerCase()\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitlabel() {\n const fragment = this.stack[this.stack.length - 1]\n const value = this.resume()\n const node = this.stack[this.stack.length - 1]\n // Assume a reference.\n this.data.inReference = true\n if (node.type === 'link') {\n /** @type {Array<PhrasingContent>} */\n const children = fragment.children\n node.children = children\n } else {\n node.alt = value\n }\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitresourcedestinationstring() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.url = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitresourcetitlestring() {\n const data = this.resume()\n const node = this.stack[this.stack.length - 1]\n node.title = data\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitresource() {\n this.data.inReference = undefined\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onenterreference() {\n this.data.referenceType = 'collapsed'\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitreferencestring(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n // @ts-expect-error: stash this on the node, as it might become a reference\n // later.\n node.label = label\n // @ts-expect-error: same as above.\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n this.data.referenceType = 'full'\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n\n function onexitcharacterreferencemarker(token) {\n this.data.characterReferenceType = token.type\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitcharacterreferencevalue(token) {\n const data = this.sliceSerialize(token)\n const type = this.data.characterReferenceType\n /** @type {string} */\n let value\n if (type) {\n value = decodeNumericCharacterReference(\n data,\n type === 'characterReferenceMarkerNumeric' ? 10 : 16\n )\n this.data.characterReferenceType = undefined\n } else {\n const result = decodeNamedCharacterReference(data)\n value = result\n }\n const tail = this.stack.pop()\n tail.value += value\n tail.position.end = point(token.end)\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitautolinkprotocol(token) {\n onexitdata.call(this, token)\n const node = this.stack[this.stack.length - 1]\n node.url = this.sliceSerialize(token)\n }\n\n /**\n * @this {CompileContext}\n * @type {Handle}\n */\n function onexitautolinkemail(token) {\n onexitdata.call(this, token)\n const node = this.stack[this.stack.length - 1]\n node.url = 'mailto:' + this.sliceSerialize(token)\n }\n\n //\n // Creaters.\n //\n\n /** @returns {Blockquote} */\n function blockQuote() {\n return {\n type: 'blockquote',\n children: []\n }\n }\n\n /** @returns {Code} */\n function codeFlow() {\n return {\n type: 'code',\n lang: null,\n meta: null,\n value: ''\n }\n }\n\n /** @returns {InlineCode} */\n function codeText() {\n return {\n type: 'inlineCode',\n value: ''\n }\n }\n\n /** @returns {Definition} */\n function definition() {\n return {\n type: 'definition',\n identifier: '',\n label: null,\n title: null,\n url: ''\n }\n }\n\n /** @returns {Emphasis} */\n function emphasis() {\n return {\n type: 'emphasis',\n children: []\n }\n }\n\n /** @returns {Heading} */\n function heading() {\n return {\n type: 'heading',\n // @ts-expect-error `depth` will be set later.\n depth: 0,\n children: []\n }\n }\n\n /** @returns {Break} */\n function hardBreak() {\n return {\n type: 'break'\n }\n }\n\n /** @returns {Html} */\n function html() {\n return {\n type: 'html',\n value: ''\n }\n }\n\n /** @returns {Image} */\n function image() {\n return {\n type: 'image',\n title: null,\n url: '',\n alt: null\n }\n }\n\n /** @returns {Link} */\n function link() {\n return {\n type: 'link',\n title: null,\n url: '',\n children: []\n }\n }\n\n /**\n * @param {Token} token\n * @returns {List}\n */\n function list(token) {\n return {\n type: 'list',\n ordered: token.type === 'listOrdered',\n start: null,\n spread: token._spread,\n children: []\n }\n }\n\n /**\n * @param {Token} token\n * @returns {ListItem}\n */\n function listItem(token) {\n return {\n type: 'listItem',\n spread: token._spread,\n checked: null,\n children: []\n }\n }\n\n /** @returns {Paragraph} */\n function paragraph() {\n return {\n type: 'paragraph',\n children: []\n }\n }\n\n /** @returns {Strong} */\n function strong() {\n return {\n type: 'strong',\n children: []\n }\n }\n\n /** @returns {Text} */\n function text() {\n return {\n type: 'text',\n value: ''\n }\n }\n\n /** @returns {ThematicBreak} */\n function thematicBreak() {\n return {\n type: 'thematicBreak'\n }\n }\n}\n\n/**\n * Copy a point-like value.\n *\n * @param {Point} d\n * Point-like value.\n * @returns {Point}\n * unist point.\n */\nfunction point(d) {\n return {\n line: d.line,\n column: d.column,\n offset: d.offset\n }\n}\n\n/**\n * @param {Config} combined\n * @param {Array<Array<Extension> | Extension>} extensions\n * @returns {undefined}\n */\nfunction configure(combined, extensions) {\n let index = -1\n while (++index < extensions.length) {\n const value = extensions[index]\n if (Array.isArray(value)) {\n configure(combined, value)\n } else {\n extension(combined, value)\n }\n }\n}\n\n/**\n * @param {Config} combined\n * @param {Extension} extension\n * @returns {undefined}\n */\nfunction extension(combined, extension) {\n /** @type {keyof Extension} */\n let key\n for (key in extension) {\n if (own.call(extension, key)) {\n switch (key) {\n case 'canContainEols': {\n const right = extension[key]\n if (right) {\n combined[key].push(...right)\n }\n break\n }\n case 'transforms': {\n const right = extension[key]\n if (right) {\n combined[key].push(...right)\n }\n break\n }\n case 'enter':\n case 'exit': {\n const right = extension[key]\n if (right) {\n Object.assign(combined[key], right)\n }\n break\n }\n // No default\n }\n }\n }\n}\n\n/** @type {OnEnterError} */\nfunction defaultOnError(left, right) {\n if (left) {\n throw new Error(\n 'Cannot close `' +\n left.type +\n '` (' +\n stringifyPosition({\n start: left.start,\n end: left.end\n }) +\n '): a different token (`' +\n right.type +\n '`, ' +\n stringifyPosition({\n start: right.start,\n end: right.end\n }) +\n ') is open'\n )\n } else {\n throw new Error(\n 'Cannot close document, a token (`' +\n right.type +\n '`, ' +\n stringifyPosition({\n start: right.start,\n end: right.end\n }) +\n ') is still open'\n )\n }\n}\n","import type { Asset } from \"@player-ui/types\";\nimport type {\n Blockquote,\n Code,\n Emphasis,\n Heading,\n Image,\n InlineCode,\n Link,\n List,\n ListItem,\n Paragraph,\n Strong,\n Text,\n ThematicBreak,\n} from \"mdast-util-from-markdown/lib\";\nimport type { Transformer } from \"../types\";\n\n/**\n * Swap markdown type to text\n */\nfunction swapMarkdownType(asset: Asset): Asset {\n return { ...asset, type: \"text\" };\n}\n\n/**\n * Transforms Text AST Node into Player Content\n */\nconst textTransformer: Transformer<Text> = ({ astNode, asset, mappers }) => {\n const { value } = astNode;\n\n return mappers.text({\n originalAsset: asset,\n value,\n });\n};\n\n/**\n * Transforms Emphasis AST Node into Player Content\n */\nconst emphasisTransformer: Transformer<Emphasis> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.emphasis) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.emphasis({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Strong AST Node into Player Content\n */\nconst strongTransformer: Transformer<Strong> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.strong) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.strong({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Paragraph AST Node into Player Content\n */\nconst paragraphTransformer: Transformer<Paragraph> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n const { children } = astNode;\n\n if (\n children.every(({ type }) => Boolean(mappers[type as keyof typeof mappers]))\n ) {\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.paragraph({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms List AST Node into Player Content\n */\nconst listTransformer: Transformer<List> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.list) {\n const { children, ordered, start } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.list({\n originalAsset: asset,\n value,\n ordered: Boolean(ordered),\n start: start || undefined,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms ListItem AST Node into Player Content\n */\nconst listItemTransformer: Transformer<ListItem> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n const mapper = mappers.listItem || mappers.paragraph;\n\n return mapper({\n originalAsset: asset,\n value,\n });\n};\n\n/**\n * Transforms Link AST Node into Player Content\n */\nconst linkTransformer: Transformer<Link> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.link) {\n const { children, url } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.link({\n originalAsset: asset,\n href: url,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Image AST Node into Player Content\n */\nconst imageTransformer: Transformer<Image> = ({ astNode, asset, mappers }) => {\n if (mappers.image) {\n const { title, url, alt } = astNode;\n\n return mappers.image({\n originalAsset: asset,\n src: url,\n value: title || alt || \"\",\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Blockquote AST Node into Player Content\n */\nconst blockquoteTransformer: Transformer<Blockquote> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.blockquote) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.blockquote({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms InlineCode AST Node into Player Content\n */\nconst inlineCodeTransformer: Transformer<InlineCode> = ({\n astNode,\n asset,\n mappers,\n}) => {\n if (mappers.inlineCode) {\n const { value } = astNode;\n\n return mappers.inlineCode({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Code block AST Node into Player Content\n */\nconst codeTransformer: Transformer<Code> = ({ astNode, asset, mappers }) => {\n if (mappers.code) {\n const { value, lang } = astNode;\n\n return mappers.code({\n originalAsset: asset,\n value,\n lang: lang || undefined,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Horizontal Rule (Thematic Break) AST Node into Player Content\n */\nconst horizontalRuleTransformer: Transformer<ThematicBreak> = ({\n asset,\n mappers,\n}) => {\n if (mappers.horizontalRule) {\n return mappers.horizontalRule({\n originalAsset: asset,\n value: \"---\",\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Heading AST Node into Player Content\n */\nconst headingTransformer: Transformer<Heading> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.heading) {\n const { children, depth } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.heading({\n originalAsset: asset,\n value,\n depth,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\nexport const transformers: Record<string, Transformer> = {\n horizontalRule: horizontalRuleTransformer,\n text: textTransformer,\n emphasis: emphasisTransformer,\n strong: strongTransformer,\n blockquote: blockquoteTransformer,\n list: listTransformer,\n listItem: listItemTransformer,\n link: linkTransformer,\n image: imageTransformer,\n paragraph: paragraphTransformer,\n code: codeTransformer,\n heading: headingTransformer,\n inlineCode: inlineCodeTransformer,\n};\n","import type { Node, ParseObjectOptions } from \"@player-ui/player\";\nimport { NodeType } from \"@player-ui/player\";\nimport type { Asset } from \"@player-ui/types\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport type { Mappers } from \"../types\";\nimport { transformers } from \"./transformers\";\n\n/**\n * Parses markdown content using a provided mappers record.\n */\nexport function parseAssetMarkdownContent({\n asset,\n mappers,\n parser,\n}: {\n /**\n * Asset to be parsed\n */\n asset: Asset;\n /**\n * Mappers record of AST Node to Player Content\n *\n * @see {@link Mappers}\n */\n mappers: Mappers;\n /**\n * Parser object to AST\n */\n parser?: (\n obj: object,\n type?: Node.ChildrenTypes,\n options?: ParseObjectOptions,\n ) => Node.Node | null;\n}): Node.Node | null {\n const { children } = fromMarkdown(asset.value as string);\n const isMultiParagraph = children.length > 1;\n\n if (isMultiParagraph) {\n const value = children.map((node) => {\n const transformer = transformers[node.type as keyof typeof transformers];\n return transformer({\n astNode: node as any,\n asset,\n mappers,\n transformers,\n });\n });\n\n const collection = mappers.collection({\n originalAsset: asset,\n value,\n });\n\n return parser?.(collection, NodeType.Asset) || null;\n }\n\n const transformer =\n transformers[children[0].type as keyof typeof transformers];\n const content = transformer({\n astNode: children[0] as any,\n asset,\n mappers,\n transformers,\n });\n\n return parser?.(content, NodeType.Asset) || null;\n}\n"]}
|